{"diffoscope-json-version": 1, "source1": "/input1", "source2": "/input2", "unified_diff": null, "details": [{"source1": "zipinfo {}", "source2": "zipinfo {}", "unified_diff": "@@ -1,8 +1,8 @@\n-Zip file size: 1032425 bytes, number of entries: 480\n+Zip file size: 1035610 bytes, number of entries: 480\n drwxr-xr-x  2.0 unx        0 b- stor 24-Jul-03 09:13 META-INF/\n -rw-r--r--  2.0 unx      319 b- defN 24-Jul-03 09:13 META-INF/MANIFEST.MF\n drwxr-xr-x  2.0 unx        0 b- stor 24-Jul-03 09:13 docs/\n drwxr-xr-x  2.0 unx        0 b- stor 24-Jul-03 09:13 docs/org.apache.nifi/\n drwxr-xr-x  2.0 unx        0 b- stor 24-Jul-03 09:13 docs/org.apache.nifi/nifi-airtable-nar/\n drwxr-xr-x  2.0 unx        0 b- stor 24-Jul-03 09:13 docs/org.apache.nifi/nifi-airtable-nar/1.27.0/\n drwxr-xr-x  2.0 unx        0 b- stor 24-Jul-03 09:13 docs/org.apache.nifi/nifi-airtable-nar/1.27.0/org.apache.nifi.processors.airtable.QueryAirtableTable/\n@@ -289,18 +289,18 @@\n drwxr-xr-x  2.0 unx        0 b- stor 24-Jul-03 09:13 docs/org.apache.nifi/nifi-zendesk-nar/1.27.0/org.apache.nifi.processors.zendesk.PutZendeskTicket/\n drwxr-xr-x  2.0 unx        0 b- stor 24-Jul-03 09:13 docs/org.apache.nifi/nifi-zendesk-services-nar/\n drwxr-xr-x  2.0 unx        0 b- stor 24-Jul-03 09:13 docs/org.apache.nifi/nifi-zendesk-services-nar/1.27.0/\n drwxr-xr-x  2.0 unx        0 b- stor 24-Jul-03 09:13 docs/org.apache.nifi/nifi-zendesk-services-nar/1.27.0/org.apache.nifi.services.zendesk.ZendeskRecordSink/\n drwxr-xr-x  2.0 unx        0 b- stor 24-Jul-03 09:13 META-INF/maven/\n drwxr-xr-x  2.0 unx        0 b- stor 24-Jul-03 09:13 META-INF/maven/org.apache.nifi/\n drwxr-xr-x  2.0 unx        0 b- stor 24-Jul-03 09:13 META-INF/maven/org.apache.nifi/nifi-runtime-manifest/\n--rw-r--r--  2.0 unx    76410 b- defN 24-Jul-03 09:13 META-INF/DEPENDENCIES\n+-rw-r--r--  2.0 unx    91262 b- defN 24-Jul-03 09:13 META-INF/DEPENDENCIES\n -rw-r--r--  2.0 unx    11358 b- defN 24-Jul-03 09:13 META-INF/LICENSE\n -rw-r--r--  2.0 unx      160 b- defN 24-Jul-03 09:13 META-INF/NOTICE\n--rw-r--r--  2.0 unx     1259 b- defN 24-Jul-03 09:13 build.properties\n+-rw-r--r--  2.0 unx     1199 b- defN 24-Jul-03 09:13 build.properties\n -rw-r--r--  2.0 unx     2722 b- defN 24-Jul-03 09:13 docs/org.apache.nifi/nifi-airtable-nar/1.27.0/org.apache.nifi.processors.airtable.QueryAirtableTable/additionalDetails.html\n -rw-r--r--  2.0 unx     2373 b- defN 24-Jul-03 09:13 docs/org.apache.nifi/nifi-ambari-nar/1.27.0/org.apache.nifi.reporting.ambari.AmbariReportingTask/additionalDetails.html\n -rw-r--r--  2.0 unx     4031 b- defN 24-Jul-03 09:13 docs/org.apache.nifi/nifi-amqp-nar/1.27.0/org.apache.nifi.amqp.processors.ConsumeAMQP/additionalDetails.html\n -rw-r--r--  2.0 unx     5854 b- defN 24-Jul-03 09:13 docs/org.apache.nifi/nifi-amqp-nar/1.27.0/org.apache.nifi.amqp.processors.PublishAMQP/additionalDetails.html\n -rw-r--r--  2.0 unx     5394 b- defN 24-Jul-03 09:13 docs/org.apache.nifi/nifi-asana-processors-nar/1.27.0/org.apache.nifi.processors.asana.GetAsanaObject/additionalDetails.html\n -rw-r--r--  2.0 unx    12176 b- defN 24-Jul-03 09:13 docs/org.apache.nifi/nifi-aws-nar/1.27.0/org.apache.nifi.processors.aws.dynamodb.PutDynamoDBRecord/additionalDetails.html\n -rw-r--r--  2.0 unx     2407 b- defN 24-Jul-03 09:13 docs/org.apache.nifi/nifi-aws-nar/1.27.0/org.apache.nifi.processors.aws.kinesis.stream.ConsumeKinesisStream/additionalDetails.html\n@@ -472,11 +472,11 @@\n -rw-r--r--  2.0 unx    21040 b- defN 24-Jul-03 09:13 docs/org.apache.nifi/nifi-update-attribute-nar/1.27.0/org.apache.nifi.processors.attributes.UpdateAttribute/additionalDetails.html\n -rw-r--r--  2.0 unx     2308 b- defN 24-Jul-03 09:13 docs/org.apache.nifi/nifi-websocket-processors-nar/1.27.0/org.apache.nifi.processors.websocket.ConnectWebSocket/additionalDetails.html\n -rw-r--r--  2.0 unx     4150 b- defN 24-Jul-03 09:13 docs/org.apache.nifi/nifi-windows-event-log-nar/1.27.0/org.apache.nifi.processors.windows.event.log.ConsumeWindowsEventLog/additionalDetails.html\n -rw-r--r--  2.0 unx     2772 b- defN 24-Jul-03 09:13 docs/org.apache.nifi/nifi-workday-processors-nar/1.27.0/org.apache.nifi.processors.workday.GetWorkdayReport/additionalDetails.html\n -rw-r--r--  2.0 unx     3375 b- defN 24-Jul-03 09:13 docs/org.apache.nifi/nifi-zendesk-nar/1.27.0/org.apache.nifi.processors.zendesk.GetZendesk/additionalDetails.html\n -rw-r--r--  2.0 unx     7289 b- defN 24-Jul-03 09:13 docs/org.apache.nifi/nifi-zendesk-nar/1.27.0/org.apache.nifi.processors.zendesk.PutZendeskTicket/additionalDetails.html\n -rw-r--r--  2.0 unx     7449 b- defN 24-Jul-03 09:13 docs/org.apache.nifi/nifi-zendesk-services-nar/1.27.0/org.apache.nifi.services.zendesk.ZendeskRecordSink/additionalDetails.html\n--rw-r--r--  2.0 unx  5304551 b- defN 24-Jul-03 09:13 nifi-runtime-manifest.json\n+-rw-r--r--  2.0 unx  5305156 b- defN 24-Jul-03 09:13 nifi-runtime-manifest.json\n -rw-r--r--  2.0 unx     7223 b- defN 24-Jul-03 09:13 META-INF/maven/org.apache.nifi/nifi-runtime-manifest/pom.xml\n -rw-r--r--  2.0 unx       72 b- defN 24-Jul-03 09:13 META-INF/maven/org.apache.nifi/nifi-runtime-manifest/pom.properties\n-480 files, 6528795 bytes uncompressed, 905481 bytes compressed:  86.1%\n+480 files, 6544192 bytes uncompressed, 908666 bytes compressed:  86.1%\n"}, {"source1": "zipdetails --redact --scan --utc {}", "source2": "zipdetails --redact --scan --utc {}", "unified_diff": "@@ -5301,19196 +5301,19196 @@\n 07D0E Extract Zip Spec      14 (20) '2.0'\n 07D0F Extract OS            00 (0) 'MS-DOS'\n 07D10 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n 07D12 Compression Method    0008 (8) 'Deflated'\n 07D14 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-07D18 CRC                   9DCF049A (2647590042)\n-07D1C Compressed Size       00001F13 (7955)\n-07D20 Uncompressed Size     00012A7A (76410)\n+07D18 CRC                   CCFF255F (3439273311)\n+07D1C Compressed Size       00002711 (10001)\n+07D20 Uncompressed Size     0001647E (91262)\n 07D24 Filename Length       0015 (21)\n 07D26 Extra Length          0000 (0)\n 07D28 Filename              'XXXXXXXXXXXXXXXXXXXXX'\n #\n # WARNING: Offset 0x7D28: Filename 'XXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n 07D3D PAYLOAD\n \n-09C50 LOCAL HEADER #296     04034B50 (67324752)\n-09C54 Extract Zip Spec      14 (20) '2.0'\n-09C55 Extract OS            00 (0) 'MS-DOS'\n-09C56 General Purpose Flag  0800 (2048)\n+0A44E LOCAL HEADER #296     04034B50 (67324752)\n+0A452 Extract Zip Spec      14 (20) '2.0'\n+0A453 Extract OS            00 (0) 'MS-DOS'\n+0A454 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-09C58 Compression Method    0008 (8) 'Deflated'\n-09C5A Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-09C5E CRC                   86E2B4B4 (2263004340)\n-09C62 Compressed Size       00000F6D (3949)\n-09C66 Uncompressed Size     00002C5E (11358)\n-09C6A Filename Length       0010 (16)\n-09C6C Extra Length          0000 (0)\n-09C6E Filename              'XXXXXXXXXXXXXXXX'\n+0A456 Compression Method    0008 (8) 'Deflated'\n+0A458 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+0A45C CRC                   86E2B4B4 (2263004340)\n+0A460 Compressed Size       00000F6D (3949)\n+0A464 Uncompressed Size     00002C5E (11358)\n+0A468 Filename Length       0010 (16)\n+0A46A Extra Length          0000 (0)\n+0A46C Filename              'XXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x9C6E: Filename 'XXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xA46C: Filename 'XXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-09C7E PAYLOAD\n+0A47C PAYLOAD\n \n-0ABEB LOCAL HEADER #297     04034B50 (67324752)\n-0ABEF Extract Zip Spec      14 (20) '2.0'\n-0ABF0 Extract OS            00 (0) 'MS-DOS'\n-0ABF1 General Purpose Flag  0800 (2048)\n+0B3E9 LOCAL HEADER #297     04034B50 (67324752)\n+0B3ED Extract Zip Spec      14 (20) '2.0'\n+0B3EE Extract OS            00 (0) 'MS-DOS'\n+0B3EF General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-0ABF3 Compression Method    0008 (8) 'Deflated'\n-0ABF5 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-0ABF9 CRC                   91A82808 (2443716616)\n-0ABFD Compressed Size       00000082 (130)\n-0AC01 Uncompressed Size     000000A0 (160)\n-0AC05 Filename Length       000F (15)\n-0AC07 Extra Length          0000 (0)\n-0AC09 Filename              'XXXXXXXXXXXXXXX'\n+0B3F1 Compression Method    0008 (8) 'Deflated'\n+0B3F3 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+0B3F7 CRC                   91A82808 (2443716616)\n+0B3FB Compressed Size       00000082 (130)\n+0B3FF Uncompressed Size     000000A0 (160)\n+0B403 Filename Length       000F (15)\n+0B405 Extra Length          0000 (0)\n+0B407 Filename              'XXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xAC09: Filename 'XXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xB407: Filename 'XXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-0AC18 PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+0B416 PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n \n-0AC9A LOCAL HEADER #298     04034B50 (67324752)\n-0AC9E Extract Zip Spec      14 (20) '2.0'\n-0AC9F Extract OS            00 (0) 'MS-DOS'\n-0ACA0 General Purpose Flag  0800 (2048)\n+0B498 LOCAL HEADER #298     04034B50 (67324752)\n+0B49C Extract Zip Spec      14 (20) '2.0'\n+0B49D Extract OS            00 (0) 'MS-DOS'\n+0B49E General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-0ACA2 Compression Method    0008 (8) 'Deflated'\n-0ACA4 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-0ACA8 CRC                   A0542DCB (2689871307)\n-0ACAC Compressed Size       000002EA (746)\n-0ACB0 Uncompressed Size     000004EB (1259)\n-0ACB4 Filename Length       0010 (16)\n-0ACB6 Extra Length          0000 (0)\n-0ACB8 Filename              'XXXXXXXXXXXXXXXX'\n+0B4A0 Compression Method    0008 (8) 'Deflated'\n+0B4A2 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+0B4A6 CRC                   ADF1FCE9 (2918317289)\n+0B4AA Compressed Size       000002C3 (707)\n+0B4AE Uncompressed Size     000004AF (1199)\n+0B4B2 Filename Length       0010 (16)\n+0B4B4 Extra Length          0000 (0)\n+0B4B6 Filename              'XXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xACB8: Filename 'XXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xB4B6: Filename 'XXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-0ACC8 PAYLOAD\n+0B4C6 PAYLOAD\n \n-0AFB2 LOCAL HEADER #299     04034B50 (67324752)\n-0AFB6 Extract Zip Spec      14 (20) '2.0'\n-0AFB7 Extract OS            00 (0) 'MS-DOS'\n-0AFB8 General Purpose Flag  0800 (2048)\n+0B789 LOCAL HEADER #299     04034B50 (67324752)\n+0B78D Extract Zip Spec      14 (20) '2.0'\n+0B78E Extract OS            00 (0) 'MS-DOS'\n+0B78F General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-0AFBA Compression Method    0008 (8) 'Deflated'\n-0AFBC Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-0AFC0 CRC                   9CB4EC6B (2629102699)\n-0AFC4 Compressed Size       00000546 (1350)\n-0AFC8 Uncompressed Size     00000AA2 (2722)\n-0AFCC Filename Length       007B (123)\n-0AFCE Extra Length          0000 (0)\n-0AFD0 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+0B791 Compression Method    0008 (8) 'Deflated'\n+0B793 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+0B797 CRC                   9CB4EC6B (2629102699)\n+0B79B Compressed Size       00000546 (1350)\n+0B79F Uncompressed Size     00000AA2 (2722)\n+0B7A3 Filename Length       007B (123)\n+0B7A5 Extra Length          0000 (0)\n+0B7A7 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xAFD0: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xB7A7: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-0B04B PAYLOAD\n+0B822 PAYLOAD\n \n-0B591 LOCAL HEADER #300     04034B50 (67324752)\n-0B595 Extract Zip Spec      14 (20) '2.0'\n-0B596 Extract OS            00 (0) 'MS-DOS'\n-0B597 General Purpose Flag  0800 (2048)\n+0BD68 LOCAL HEADER #300     04034B50 (67324752)\n+0BD6C Extract Zip Spec      14 (20) '2.0'\n+0BD6D Extract OS            00 (0) 'MS-DOS'\n+0BD6E General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-0B599 Compression Method    0008 (8) 'Deflated'\n-0B59B Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-0B59F CRC                   1401A9F3 (335653363)\n-0B5A3 Compressed Size       000003C5 (965)\n-0B5A7 Uncompressed Size     00000945 (2373)\n-0B5AB Filename Length       0077 (119)\n-0B5AD Extra Length          0000 (0)\n-0B5AF Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+0BD70 Compression Method    0008 (8) 'Deflated'\n+0BD72 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+0BD76 CRC                   1401A9F3 (335653363)\n+0BD7A Compressed Size       000003C5 (965)\n+0BD7E Uncompressed Size     00000945 (2373)\n+0BD82 Filename Length       0077 (119)\n+0BD84 Extra Length          0000 (0)\n+0BD86 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xB5AF: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xBD86: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-0B626 PAYLOAD\n+0BDFD PAYLOAD\n \n-0B9EB LOCAL HEADER #301     04034B50 (67324752)\n-0B9EF Extract Zip Spec      14 (20) '2.0'\n-0B9F0 Extract OS            00 (0) 'MS-DOS'\n-0B9F1 General Purpose Flag  0800 (2048)\n+0C1C2 LOCAL HEADER #301     04034B50 (67324752)\n+0C1C6 Extract Zip Spec      14 (20) '2.0'\n+0C1C7 Extract OS            00 (0) 'MS-DOS'\n+0C1C8 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-0B9F3 Compression Method    0008 (8) 'Deflated'\n-0B9F5 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-0B9F9 CRC                   445AD7B2 (1146804146)\n-0B9FD Compressed Size       000006D4 (1748)\n-0BA01 Uncompressed Size     00000FBF (4031)\n-0BA05 Filename Length       006C (108)\n-0BA07 Extra Length          0000 (0)\n-0BA09 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+0C1CA Compression Method    0008 (8) 'Deflated'\n+0C1CC Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+0C1D0 CRC                   445AD7B2 (1146804146)\n+0C1D4 Compressed Size       000006D4 (1748)\n+0C1D8 Uncompressed Size     00000FBF (4031)\n+0C1DC Filename Length       006C (108)\n+0C1DE Extra Length          0000 (0)\n+0C1E0 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xBA09: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC1E0: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-0BA75 PAYLOAD\n+0C24C PAYLOAD\n \n-0C149 LOCAL HEADER #302     04034B50 (67324752)\n-0C14D Extract Zip Spec      14 (20) '2.0'\n-0C14E Extract OS            00 (0) 'MS-DOS'\n-0C14F General Purpose Flag  0800 (2048)\n+0C920 LOCAL HEADER #302     04034B50 (67324752)\n+0C924 Extract Zip Spec      14 (20) '2.0'\n+0C925 Extract OS            00 (0) 'MS-DOS'\n+0C926 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-0C151 Compression Method    0008 (8) 'Deflated'\n-0C153 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-0C157 CRC                   A2A96EA2 (2729012898)\n-0C15B Compressed Size       0000092B (2347)\n-0C15F Uncompressed Size     000016DE (5854)\n-0C163 Filename Length       006C (108)\n-0C165 Extra Length          0000 (0)\n-0C167 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+0C928 Compression Method    0008 (8) 'Deflated'\n+0C92A Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+0C92E CRC                   A2A96EA2 (2729012898)\n+0C932 Compressed Size       0000092B (2347)\n+0C936 Uncompressed Size     000016DE (5854)\n+0C93A Filename Length       006C (108)\n+0C93C Extra Length          0000 (0)\n+0C93E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC167: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC93E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-0C1D3 PAYLOAD\n+0C9AA PAYLOAD\n \n-0CAFE LOCAL HEADER #303     04034B50 (67324752)\n-0CB02 Extract Zip Spec      14 (20) '2.0'\n-0CB03 Extract OS            00 (0) 'MS-DOS'\n-0CB04 General Purpose Flag  0800 (2048)\n+0D2D5 LOCAL HEADER #303     04034B50 (67324752)\n+0D2D9 Extract Zip Spec      14 (20) '2.0'\n+0D2DA Extract OS            00 (0) 'MS-DOS'\n+0D2DB General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-0CB06 Compression Method    0008 (8) 'Deflated'\n-0CB08 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-0CB0C CRC                   7416DF2A (1947655978)\n-0CB10 Compressed Size       0000091D (2333)\n-0CB14 Uncompressed Size     00001512 (5394)\n-0CB18 Filename Length       007C (124)\n-0CB1A Extra Length          0000 (0)\n-0CB1C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+0D2DD Compression Method    0008 (8) 'Deflated'\n+0D2DF Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+0D2E3 CRC                   7416DF2A (1947655978)\n+0D2E7 Compressed Size       0000091D (2333)\n+0D2EB Uncompressed Size     00001512 (5394)\n+0D2EF Filename Length       007C (124)\n+0D2F1 Extra Length          0000 (0)\n+0D2F3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCB1C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xD2F3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-0CB98 PAYLOAD\n+0D36F PAYLOAD\n \n-0D4B5 LOCAL HEADER #304     04034B50 (67324752)\n-0D4B9 Extract Zip Spec      14 (20) '2.0'\n-0D4BA Extract OS            00 (0) 'MS-DOS'\n-0D4BB General Purpose Flag  0800 (2048)\n+0DC8C LOCAL HEADER #304     04034B50 (67324752)\n+0DC90 Extract Zip Spec      14 (20) '2.0'\n+0DC91 Extract OS            00 (0) 'MS-DOS'\n+0DC92 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-0D4BD Compression Method    0008 (8) 'Deflated'\n-0D4BF Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-0D4C3 CRC                   826E1CC4 (2188254404)\n-0D4C7 Compressed Size       00000DE0 (3552)\n-0D4CB Uncompressed Size     00002F90 (12176)\n-0D4CF Filename Length       0079 (121)\n-0D4D1 Extra Length          0000 (0)\n-0D4D3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+0DC94 Compression Method    0008 (8) 'Deflated'\n+0DC96 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+0DC9A CRC                   826E1CC4 (2188254404)\n+0DC9E Compressed Size       00000DE0 (3552)\n+0DCA2 Uncompressed Size     00002F90 (12176)\n+0DCA6 Filename Length       0079 (121)\n+0DCA8 Extra Length          0000 (0)\n+0DCAA Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xD4D3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xDCAA: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-0D54C PAYLOAD\n+0DD23 PAYLOAD\n \n-0E32C LOCAL HEADER #305     04034B50 (67324752)\n-0E330 Extract Zip Spec      14 (20) '2.0'\n-0E331 Extract OS            00 (0) 'MS-DOS'\n-0E332 General Purpose Flag  0800 (2048)\n+0EB03 LOCAL HEADER #305     04034B50 (67324752)\n+0EB07 Extract Zip Spec      14 (20) '2.0'\n+0EB08 Extract OS            00 (0) 'MS-DOS'\n+0EB09 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-0E334 Compression Method    0008 (8) 'Deflated'\n-0E336 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-0E33A CRC                   1BE163AC (467755948)\n-0E33E Compressed Size       00000476 (1142)\n-0E342 Uncompressed Size     00000967 (2407)\n-0E346 Filename Length       0082 (130)\n-0E348 Extra Length          0000 (0)\n-0E34A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+0EB0B Compression Method    0008 (8) 'Deflated'\n+0EB0D Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+0EB11 CRC                   1BE163AC (467755948)\n+0EB15 Compressed Size       00000476 (1142)\n+0EB19 Uncompressed Size     00000967 (2407)\n+0EB1D Filename Length       0082 (130)\n+0EB1F Extra Length          0000 (0)\n+0EB21 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xE34A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEB21: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-0E3CC PAYLOAD\n+0EBA3 PAYLOAD\n \n-0E842 LOCAL HEADER #306     04034B50 (67324752)\n-0E846 Extract Zip Spec      14 (20) '2.0'\n-0E847 Extract OS            00 (0) 'MS-DOS'\n-0E848 General Purpose Flag  0800 (2048)\n+0F019 LOCAL HEADER #306     04034B50 (67324752)\n+0F01D Extract Zip Spec      14 (20) '2.0'\n+0F01E Extract OS            00 (0) 'MS-DOS'\n+0F01F General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-0E84A Compression Method    0008 (8) 'Deflated'\n-0E84C Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-0E850 CRC                   11DB1110 (299569424)\n-0E854 Compressed Size       00000428 (1064)\n-0E858 Uncompressed Size     0000080F (2063)\n-0E85C Filename Length       007C (124)\n-0E85E Extra Length          0000 (0)\n-0E860 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+0F021 Compression Method    0008 (8) 'Deflated'\n+0F023 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+0F027 CRC                   11DB1110 (299569424)\n+0F02B Compressed Size       00000428 (1064)\n+0F02F Uncompressed Size     0000080F (2063)\n+0F033 Filename Length       007C (124)\n+0F035 Extra Length          0000 (0)\n+0F037 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xE860: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF037: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-0E8DC PAYLOAD\n+0F0B3 PAYLOAD\n \n-0ED04 LOCAL HEADER #307     04034B50 (67324752)\n-0ED08 Extract Zip Spec      14 (20) '2.0'\n-0ED09 Extract OS            00 (0) 'MS-DOS'\n-0ED0A General Purpose Flag  0800 (2048)\n+0F4DB LOCAL HEADER #307     04034B50 (67324752)\n+0F4DF Extract Zip Spec      14 (20) '2.0'\n+0F4E0 Extract OS            00 (0) 'MS-DOS'\n+0F4E1 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-0ED0C Compression Method    0008 (8) 'Deflated'\n-0ED0E Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-0ED12 CRC                   30A69673 (816223859)\n-0ED16 Compressed Size       000005CE (1486)\n-0ED1A Uncompressed Size     00000C1C (3100)\n-0ED1E Filename Length       0078 (120)\n-0ED20 Extra Length          0000 (0)\n-0ED22 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+0F4E3 Compression Method    0008 (8) 'Deflated'\n+0F4E5 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+0F4E9 CRC                   30A69673 (816223859)\n+0F4ED Compressed Size       000005CE (1486)\n+0F4F1 Uncompressed Size     00000C1C (3100)\n+0F4F5 Filename Length       0078 (120)\n+0F4F7 Extra Length          0000 (0)\n+0F4F9 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xED22: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF4F9: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-0ED9A PAYLOAD\n+0F571 PAYLOAD\n \n-0F368 LOCAL HEADER #308     04034B50 (67324752)\n-0F36C Extract Zip Spec      14 (20) '2.0'\n-0F36D Extract OS            00 (0) 'MS-DOS'\n-0F36E General Purpose Flag  0800 (2048)\n+0FB3F LOCAL HEADER #308     04034B50 (67324752)\n+0FB43 Extract Zip Spec      14 (20) '2.0'\n+0FB44 Extract OS            00 (0) 'MS-DOS'\n+0FB45 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-0F370 Compression Method    0008 (8) 'Deflated'\n-0F372 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-0F376 CRC                   0C316B32 (204565298)\n-0F37A Compressed Size       000003A1 (929)\n-0F37E Uncompressed Size     000006D7 (1751)\n-0F382 Filename Length       0082 (130)\n-0F384 Extra Length          0000 (0)\n-0F386 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+0FB47 Compression Method    0008 (8) 'Deflated'\n+0FB49 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+0FB4D CRC                   0C316B32 (204565298)\n+0FB51 Compressed Size       000003A1 (929)\n+0FB55 Uncompressed Size     000006D7 (1751)\n+0FB59 Filename Length       0082 (130)\n+0FB5B Extra Length          0000 (0)\n+0FB5D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF386: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xFB5D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-0F408 PAYLOAD\n+0FBDF PAYLOAD\n \n-0F7A9 LOCAL HEADER #309     04034B50 (67324752)\n-0F7AD Extract Zip Spec      14 (20) '2.0'\n-0F7AE Extract OS            00 (0) 'MS-DOS'\n-0F7AF General Purpose Flag  0800 (2048)\n+0FF80 LOCAL HEADER #309     04034B50 (67324752)\n+0FF84 Extract Zip Spec      14 (20) '2.0'\n+0FF85 Extract OS            00 (0) 'MS-DOS'\n+0FF86 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-0F7B1 Compression Method    0008 (8) 'Deflated'\n-0F7B3 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-0F7B7 CRC                   37BEEC96 (935259286)\n-0F7BB Compressed Size       000006C9 (1737)\n-0F7BF Uncompressed Size     0000133B (4923)\n-0F7C3 Filename Length       007E (126)\n-0F7C5 Extra Length          0000 (0)\n-0F7C7 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+0FF88 Compression Method    0008 (8) 'Deflated'\n+0FF8A Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+0FF8E CRC                   37BEEC96 (935259286)\n+0FF92 Compressed Size       000006C9 (1737)\n+0FF96 Uncompressed Size     0000133B (4923)\n+0FF9A Filename Length       007E (126)\n+0FF9C Extra Length          0000 (0)\n+0FF9E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF7C7: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xFF9E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-0F845 PAYLOAD\n+1001C PAYLOAD\n \n-0FF0E LOCAL HEADER #310     04034B50 (67324752)\n-0FF12 Extract Zip Spec      14 (20) '2.0'\n-0FF13 Extract OS            00 (0) 'MS-DOS'\n-0FF14 General Purpose Flag  0800 (2048)\n+106E5 LOCAL HEADER #310     04034B50 (67324752)\n+106E9 Extract Zip Spec      14 (20) '2.0'\n+106EA Extract OS            00 (0) 'MS-DOS'\n+106EB General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-0FF16 Compression Method    0008 (8) 'Deflated'\n-0FF18 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-0FF1C CRC                   D0AE7BE4 (3501095908)\n-0FF20 Compressed Size       000003D9 (985)\n-0FF24 Uncompressed Size     0000074C (1868)\n-0FF28 Filename Length       0086 (134)\n-0FF2A Extra Length          0000 (0)\n-0FF2C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+106ED Compression Method    0008 (8) 'Deflated'\n+106EF Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+106F3 CRC                   D0AE7BE4 (3501095908)\n+106F7 Compressed Size       000003D9 (985)\n+106FB Uncompressed Size     0000074C (1868)\n+106FF Filename Length       0086 (134)\n+10701 Extra Length          0000 (0)\n+10703 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             XX'\n #\n-# WARNING: Offset 0xFF2C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x10703: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-0FFB2 PAYLOAD\n+10789 PAYLOAD\n \n-1038B LOCAL HEADER #311     04034B50 (67324752)\n-1038F Extract Zip Spec      14 (20) '2.0'\n-10390 Extract OS            00 (0) 'MS-DOS'\n-10391 General Purpose Flag  0800 (2048)\n+10B62 LOCAL HEADER #311     04034B50 (67324752)\n+10B66 Extract Zip Spec      14 (20) '2.0'\n+10B67 Extract OS            00 (0) 'MS-DOS'\n+10B68 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-10393 Compression Method    0008 (8) 'Deflated'\n-10395 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-10399 CRC                   4C134CE6 (1276333286)\n-1039D Compressed Size       000006D5 (1749)\n-103A1 Uncompressed Size     0000103C (4156)\n-103A5 Filename Length       0082 (130)\n-103A7 Extra Length          0000 (0)\n-103A9 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+10B6A Compression Method    0008 (8) 'Deflated'\n+10B6C Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+10B70 CRC                   4C134CE6 (1276333286)\n+10B74 Compressed Size       000006D5 (1749)\n+10B78 Uncompressed Size     0000103C (4156)\n+10B7C Filename Length       0082 (130)\n+10B7E Extra Length          0000 (0)\n+10B80 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x103A9: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x10B80: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-1042B PAYLOAD\n+10C02 PAYLOAD\n \n-10B00 LOCAL HEADER #312     04034B50 (67324752)\n-10B04 Extract Zip Spec      14 (20) '2.0'\n-10B05 Extract OS            00 (0) 'MS-DOS'\n-10B06 General Purpose Flag  0800 (2048)\n+112D7 LOCAL HEADER #312     04034B50 (67324752)\n+112DB Extract Zip Spec      14 (20) '2.0'\n+112DC Extract OS            00 (0) 'MS-DOS'\n+112DD General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-10B08 Compression Method    0008 (8) 'Deflated'\n-10B0A Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-10B0E CRC                   63086228 (1661493800)\n-10B12 Compressed Size       00000430 (1072)\n-10B16 Uncompressed Size     00000838 (2104)\n-10B1A Filename Length       0084 (132)\n-10B1C Extra Length          0000 (0)\n-10B1E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+112DF Compression Method    0008 (8) 'Deflated'\n+112E1 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+112E5 CRC                   63086228 (1661493800)\n+112E9 Compressed Size       00000430 (1072)\n+112ED Uncompressed Size     00000838 (2104)\n+112F1 Filename Length       0084 (132)\n+112F3 Extra Length          0000 (0)\n+112F5 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             '\n #\n-# WARNING: Offset 0x10B1E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x112F5: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-10BA2 PAYLOAD\n+11379 PAYLOAD\n \n-10FD2 LOCAL HEADER #313     04034B50 (67324752)\n-10FD6 Extract Zip Spec      14 (20) '2.0'\n-10FD7 Extract OS            00 (0) 'MS-DOS'\n-10FD8 General Purpose Flag  0800 (2048)\n+117A9 LOCAL HEADER #313     04034B50 (67324752)\n+117AD Extract Zip Spec      14 (20) '2.0'\n+117AE Extract OS            00 (0) 'MS-DOS'\n+117AF General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-10FDA Compression Method    0008 (8) 'Deflated'\n-10FDC Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-10FE0 CRC                   9EF621C1 (2666930625)\n-10FE4 Compressed Size       000005D9 (1497)\n-10FE8 Uncompressed Size     00000C90 (3216)\n-10FEC Filename Length       0080 (128)\n-10FEE Extra Length          0000 (0)\n-10FF0 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+117B1 Compression Method    0008 (8) 'Deflated'\n+117B3 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+117B7 CRC                   9EF621C1 (2666930625)\n+117BB Compressed Size       000005D9 (1497)\n+117BF Uncompressed Size     00000C90 (3216)\n+117C3 Filename Length       0080 (128)\n+117C5 Extra Length          0000 (0)\n+117C7 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x10FF0: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x117C7: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-11070 PAYLOAD\n+11847 PAYLOAD\n \n-11649 LOCAL HEADER #314     04034B50 (67324752)\n-1164D Extract Zip Spec      14 (20) '2.0'\n-1164E Extract OS            00 (0) 'MS-DOS'\n-1164F General Purpose Flag  0800 (2048)\n+11E20 LOCAL HEADER #314     04034B50 (67324752)\n+11E24 Extract Zip Spec      14 (20) '2.0'\n+11E25 Extract OS            00 (0) 'MS-DOS'\n+11E26 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-11651 Compression Method    0008 (8) 'Deflated'\n-11653 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-11657 CRC                   6BE0FFE8 (1809907688)\n-1165B Compressed Size       00000687 (1671)\n-1165F Uncompressed Size     00000EF6 (3830)\n-11663 Filename Length       0068 (104)\n-11665 Extra Length          0000 (0)\n-11667 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+11E28 Compression Method    0008 (8) 'Deflated'\n+11E2A Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+11E2E CRC                   6BE0FFE8 (1809907688)\n+11E32 Compressed Size       00000687 (1671)\n+11E36 Uncompressed Size     00000EF6 (3830)\n+11E3A Filename Length       0068 (104)\n+11E3C Extra Length          0000 (0)\n+11E3E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x11667: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x11E3E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-116CF PAYLOAD\n+11EA6 PAYLOAD\n \n-11D56 LOCAL HEADER #315     04034B50 (67324752)\n-11D5A Extract Zip Spec      14 (20) '2.0'\n-11D5B Extract OS            00 (0) 'MS-DOS'\n-11D5C General Purpose Flag  0800 (2048)\n+1252D LOCAL HEADER #315     04034B50 (67324752)\n+12531 Extract Zip Spec      14 (20) '2.0'\n+12532 Extract OS            00 (0) 'MS-DOS'\n+12533 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-11D5E Compression Method    0008 (8) 'Deflated'\n-11D60 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-11D64 CRC                   988DC4AD (2559427757)\n-11D68 Compressed Size       000003CA (970)\n-11D6C Uncompressed Size     0000071B (1819)\n-11D70 Filename Length       006D (109)\n-11D72 Extra Length          0000 (0)\n-11D74 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+12535 Compression Method    0008 (8) 'Deflated'\n+12537 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+1253B CRC                   988DC4AD (2559427757)\n+1253F Compressed Size       000003CA (970)\n+12543 Uncompressed Size     0000071B (1819)\n+12547 Filename Length       006D (109)\n+12549 Extra Length          0000 (0)\n+1254B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x11D74: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x1254B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-11DE1 PAYLOAD\n+125B8 PAYLOAD\n \n-121AB LOCAL HEADER #316     04034B50 (67324752)\n-121AF Extract Zip Spec      14 (20) '2.0'\n-121B0 Extract OS            00 (0) 'MS-DOS'\n-121B1 General Purpose Flag  0800 (2048)\n+12982 LOCAL HEADER #316     04034B50 (67324752)\n+12986 Extract Zip Spec      14 (20) '2.0'\n+12987 Extract OS            00 (0) 'MS-DOS'\n+12988 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-121B3 Compression Method    0008 (8) 'Deflated'\n-121B5 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-121B9 CRC                   07A59EC9 (128294601)\n-121BD Compressed Size       000004D1 (1233)\n-121C1 Uncompressed Size     00000C29 (3113)\n-121C5 Filename Length       0088 (136)\n-121C7 Extra Length          0000 (0)\n-121C9 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+1298A Compression Method    0008 (8) 'Deflated'\n+1298C Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+12990 CRC                   07A59EC9 (128294601)\n+12994 Compressed Size       000004D1 (1233)\n+12998 Uncompressed Size     00000C29 (3113)\n+1299C Filename Length       0088 (136)\n+1299E Extra Length          0000 (0)\n+129A0 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             XXXX'\n #\n-# WARNING: Offset 0x121C9: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x129A0: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-12251 PAYLOAD\n+12A28 PAYLOAD\n \n-12722 LOCAL HEADER #317     04034B50 (67324752)\n-12726 Extract Zip Spec      14 (20) '2.0'\n-12727 Extract OS            00 (0) 'MS-DOS'\n-12728 General Purpose Flag  0800 (2048)\n+12EF9 LOCAL HEADER #317     04034B50 (67324752)\n+12EFD Extract Zip Spec      14 (20) '2.0'\n+12EFE Extract OS            00 (0) 'MS-DOS'\n+12EFF General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-1272A Compression Method    0008 (8) 'Deflated'\n-1272C Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-12730 CRC                   63D24DDE (1674726878)\n-12734 Compressed Size       0000046A (1130)\n-12738 Uncompressed Size     00000E46 (3654)\n-1273C Filename Length       0082 (130)\n-1273E Extra Length          0000 (0)\n-12740 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+12F01 Compression Method    0008 (8) 'Deflated'\n+12F03 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+12F07 CRC                   63D24DDE (1674726878)\n+12F0B Compressed Size       0000046A (1130)\n+12F0F Uncompressed Size     00000E46 (3654)\n+12F13 Filename Length       0082 (130)\n+12F15 Extra Length          0000 (0)\n+12F17 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x12740: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x12F17: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-127C2 PAYLOAD\n+12F99 PAYLOAD\n \n-12C2C LOCAL HEADER #318     04034B50 (67324752)\n-12C30 Extract Zip Spec      14 (20) '2.0'\n-12C31 Extract OS            00 (0) 'MS-DOS'\n-12C32 General Purpose Flag  0800 (2048)\n+13403 LOCAL HEADER #318     04034B50 (67324752)\n+13407 Extract Zip Spec      14 (20) '2.0'\n+13408 Extract OS            00 (0) 'MS-DOS'\n+13409 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-12C34 Compression Method    0008 (8) 'Deflated'\n-12C36 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-12C3A CRC                   2E17013D (773259581)\n-12C3E Compressed Size       0000043F (1087)\n-12C42 Uncompressed Size     00000888 (2184)\n-12C46 Filename Length       0089 (137)\n-12C48 Extra Length          0000 (0)\n-12C4A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+1340B Compression Method    0008 (8) 'Deflated'\n+1340D Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+13411 CRC                   2E17013D (773259581)\n+13415 Compressed Size       0000043F (1087)\n+13419 Uncompressed Size     00000888 (2184)\n+1341D Filename Length       0089 (137)\n+1341F Extra Length          0000 (0)\n+13421 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             XXXXX'\n #\n-# WARNING: Offset 0x12C4A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x13421: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-12CD3 PAYLOAD\n+134AA PAYLOAD\n \n-13112 LOCAL HEADER #319     04034B50 (67324752)\n-13116 Extract Zip Spec      14 (20) '2.0'\n-13117 Extract OS            00 (0) 'MS-DOS'\n-13118 General Purpose Flag  0800 (2048)\n+138E9 LOCAL HEADER #319     04034B50 (67324752)\n+138ED Extract Zip Spec      14 (20) '2.0'\n+138EE Extract OS            00 (0) 'MS-DOS'\n+138EF General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-1311A Compression Method    0008 (8) 'Deflated'\n-1311C Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-13120 CRC                   C1E5A225 (3253051941)\n-13124 Compressed Size       000003A3 (931)\n-13128 Uncompressed Size     0000070B (1803)\n-1312C Filename Length       006B (107)\n-1312E Extra Length          0000 (0)\n-13130 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+138F1 Compression Method    0008 (8) 'Deflated'\n+138F3 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+138F7 CRC                   C1E5A225 (3253051941)\n+138FB Compressed Size       000003A3 (931)\n+138FF Uncompressed Size     0000070B (1803)\n+13903 Filename Length       006B (107)\n+13905 Extra Length          0000 (0)\n+13907 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x13130: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x13907: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-1319B PAYLOAD\n+13972 PAYLOAD\n \n-1353E LOCAL HEADER #320     04034B50 (67324752)\n-13542 Extract Zip Spec      14 (20) '2.0'\n-13543 Extract OS            00 (0) 'MS-DOS'\n-13544 General Purpose Flag  0800 (2048)\n+13D15 LOCAL HEADER #320     04034B50 (67324752)\n+13D19 Extract Zip Spec      14 (20) '2.0'\n+13D1A Extract OS            00 (0) 'MS-DOS'\n+13D1B General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-13546 Compression Method    0008 (8) 'Deflated'\n-13548 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-1354C CRC                   8950733E (2303750974)\n-13550 Compressed Size       00000350 (848)\n-13554 Uncompressed Size     0000064D (1613)\n-13558 Filename Length       006A (106)\n-1355A Extra Length          0000 (0)\n-1355C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+13D1D Compression Method    0008 (8) 'Deflated'\n+13D1F Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+13D23 CRC                   8950733E (2303750974)\n+13D27 Compressed Size       00000350 (848)\n+13D2B Uncompressed Size     0000064D (1613)\n+13D2F Filename Length       006A (106)\n+13D31 Extra Length          0000 (0)\n+13D33 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x1355C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x13D33: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-135C6 PAYLOAD\n+13D9D PAYLOAD\n \n-13916 LOCAL HEADER #321     04034B50 (67324752)\n-1391A Extract Zip Spec      14 (20) '2.0'\n-1391B Extract OS            00 (0) 'MS-DOS'\n-1391C General Purpose Flag  0800 (2048)\n+140ED LOCAL HEADER #321     04034B50 (67324752)\n+140F1 Extract Zip Spec      14 (20) '2.0'\n+140F2 Extract OS            00 (0) 'MS-DOS'\n+140F3 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-1391E Compression Method    0008 (8) 'Deflated'\n-13920 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-13924 CRC                   A0157ABE (2685762238)\n-13928 Compressed Size       0000034B (843)\n-1392C Uncompressed Size     00000643 (1603)\n-13930 Filename Length       0069 (105)\n-13932 Extra Length          0000 (0)\n-13934 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+140F5 Compression Method    0008 (8) 'Deflated'\n+140F7 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+140FB CRC                   A0157ABE (2685762238)\n+140FF Compressed Size       0000034B (843)\n+14103 Uncompressed Size     00000643 (1603)\n+14107 Filename Length       0069 (105)\n+14109 Extra Length          0000 (0)\n+1410B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x13934: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x1410B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-1399D PAYLOAD\n+14174 PAYLOAD\n \n-13CE8 LOCAL HEADER #322     04034B50 (67324752)\n-13CEC Extract Zip Spec      14 (20) '2.0'\n-13CED Extract OS            00 (0) 'MS-DOS'\n-13CEE General Purpose Flag  0800 (2048)\n+144BF LOCAL HEADER #322     04034B50 (67324752)\n+144C3 Extract Zip Spec      14 (20) '2.0'\n+144C4 Extract OS            00 (0) 'MS-DOS'\n+144C5 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-13CF0 Compression Method    0008 (8) 'Deflated'\n-13CF2 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-13CF6 CRC                   164EC61D (374261277)\n-13CFA Compressed Size       0000054E (1358)\n-13CFE Uncompressed Size     00000B15 (2837)\n-13D02 Filename Length       008F (143)\n-13D04 Extra Length          0000 (0)\n-13D06 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+144C7 Compression Method    0008 (8) 'Deflated'\n+144C9 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+144CD CRC                   164EC61D (374261277)\n+144D1 Compressed Size       0000054E (1358)\n+144D5 Uncompressed Size     00000B15 (2837)\n+144D9 Filename Length       008F (143)\n+144DB Extra Length          0000 (0)\n+144DD Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             XXXXXXXXXXX'\n #\n-# WARNING: Offset 0x13D06: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x144DD: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-13D95 PAYLOAD\n+1456C PAYLOAD\n \n-142E3 LOCAL HEADER #323     04034B50 (67324752)\n-142E7 Extract Zip Spec      14 (20) '2.0'\n-142E8 Extract OS            00 (0) 'MS-DOS'\n-142E9 General Purpose Flag  0800 (2048)\n+14ABA LOCAL HEADER #323     04034B50 (67324752)\n+14ABE Extract Zip Spec      14 (20) '2.0'\n+14ABF Extract OS            00 (0) 'MS-DOS'\n+14AC0 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-142EB Compression Method    0008 (8) 'Deflated'\n-142ED Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-142F1 CRC                   A42AA4FE (2754258174)\n-142F5 Compressed Size       00000510 (1296)\n-142F9 Uncompressed Size     00000C7F (3199)\n-142FD Filename Length       0076 (118)\n-142FF Extra Length          0000 (0)\n-14301 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+14AC2 Compression Method    0008 (8) 'Deflated'\n+14AC4 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+14AC8 CRC                   A42AA4FE (2754258174)\n+14ACC Compressed Size       00000510 (1296)\n+14AD0 Uncompressed Size     00000C7F (3199)\n+14AD4 Filename Length       0076 (118)\n+14AD6 Extra Length          0000 (0)\n+14AD8 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x14301: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x14AD8: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-14377 PAYLOAD\n+14B4E PAYLOAD\n \n-14887 LOCAL HEADER #324     04034B50 (67324752)\n-1488B Extract Zip Spec      14 (20) '2.0'\n-1488C Extract OS            00 (0) 'MS-DOS'\n-1488D General Purpose Flag  0800 (2048)\n+1505E LOCAL HEADER #324     04034B50 (67324752)\n+15062 Extract Zip Spec      14 (20) '2.0'\n+15063 Extract OS            00 (0) 'MS-DOS'\n+15064 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-1488F Compression Method    0008 (8) 'Deflated'\n-14891 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-14895 CRC                   4F9A1C4F (1335499855)\n-14899 Compressed Size       000003FB (1019)\n-1489D Uncompressed Size     000009AF (2479)\n-148A1 Filename Length       0073 (115)\n-148A3 Extra Length          0000 (0)\n-148A5 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+15066 Compression Method    0008 (8) 'Deflated'\n+15068 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+1506C CRC                   4F9A1C4F (1335499855)\n+15070 Compressed Size       000003FB (1019)\n+15074 Uncompressed Size     000009AF (2479)\n+15078 Filename Length       0073 (115)\n+1507A Extra Length          0000 (0)\n+1507C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x148A5: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x1507C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-14918 PAYLOAD\n+150EF PAYLOAD\n \n-14D13 LOCAL HEADER #325     04034B50 (67324752)\n-14D17 Extract Zip Spec      14 (20) '2.0'\n-14D18 Extract OS            00 (0) 'MS-DOS'\n-14D19 General Purpose Flag  0800 (2048)\n+154EA LOCAL HEADER #325     04034B50 (67324752)\n+154EE Extract Zip Spec      14 (20) '2.0'\n+154EF Extract OS            00 (0) 'MS-DOS'\n+154F0 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-14D1B Compression Method    0008 (8) 'Deflated'\n-14D1D Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-14D21 CRC                   754F4527 (1968129319)\n-14D25 Compressed Size       00000573 (1395)\n-14D29 Uncompressed Size     00001265 (4709)\n-14D2D Filename Length       0080 (128)\n-14D2F Extra Length          0000 (0)\n-14D31 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+154F2 Compression Method    0008 (8) 'Deflated'\n+154F4 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+154F8 CRC                   754F4527 (1968129319)\n+154FC Compressed Size       00000573 (1395)\n+15500 Uncompressed Size     00001265 (4709)\n+15504 Filename Length       0080 (128)\n+15506 Extra Length          0000 (0)\n+15508 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x14D31: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x15508: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-14DB1 PAYLOAD\n+15588 PAYLOAD\n \n-15324 LOCAL HEADER #326     04034B50 (67324752)\n-15328 Extract Zip Spec      14 (20) '2.0'\n-15329 Extract OS            00 (0) 'MS-DOS'\n-1532A General Purpose Flag  0800 (2048)\n+15AFB LOCAL HEADER #326     04034B50 (67324752)\n+15AFF Extract Zip Spec      14 (20) '2.0'\n+15B00 Extract OS            00 (0) 'MS-DOS'\n+15B01 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-1532C Compression Method    0008 (8) 'Deflated'\n-1532E Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-15332 CRC                   FAE26E3E (4209143358)\n-15336 Compressed Size       000003B7 (951)\n-1533A Uncompressed Size     00000715 (1813)\n-1533E Filename Length       0077 (119)\n-15340 Extra Length          0000 (0)\n-15342 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+15B03 Compression Method    0008 (8) 'Deflated'\n+15B05 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+15B09 CRC                   FAE26E3E (4209143358)\n+15B0D Compressed Size       000003B7 (951)\n+15B11 Uncompressed Size     00000715 (1813)\n+15B15 Filename Length       0077 (119)\n+15B17 Extra Length          0000 (0)\n+15B19 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x15342: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x15B19: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-153B9 PAYLOAD\n+15B90 PAYLOAD\n \n-15770 LOCAL HEADER #327     04034B50 (67324752)\n-15774 Extract Zip Spec      14 (20) '2.0'\n-15775 Extract OS            00 (0) 'MS-DOS'\n-15776 General Purpose Flag  0800 (2048)\n+15F47 LOCAL HEADER #327     04034B50 (67324752)\n+15F4B Extract Zip Spec      14 (20) '2.0'\n+15F4C Extract OS            00 (0) 'MS-DOS'\n+15F4D General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-15778 Compression Method    0008 (8) 'Deflated'\n-1577A Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-1577E CRC                   FFF8AD9F (4294487455)\n-15782 Compressed Size       0000035A (858)\n-15786 Uncompressed Size     00000868 (2152)\n-1578A Filename Length       007A (122)\n-1578C Extra Length          0000 (0)\n-1578E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+15F4F Compression Method    0008 (8) 'Deflated'\n+15F51 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+15F55 CRC                   FFF8AD9F (4294487455)\n+15F59 Compressed Size       0000035A (858)\n+15F5D Uncompressed Size     00000868 (2152)\n+15F61 Filename Length       007A (122)\n+15F63 Extra Length          0000 (0)\n+15F65 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x1578E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x15F65: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-15808 PAYLOAD\n+15FDF PAYLOAD\n \n-15B62 LOCAL HEADER #328     04034B50 (67324752)\n-15B66 Extract Zip Spec      14 (20) '2.0'\n-15B67 Extract OS            00 (0) 'MS-DOS'\n-15B68 General Purpose Flag  0800 (2048)\n+16339 LOCAL HEADER #328     04034B50 (67324752)\n+1633D Extract Zip Spec      14 (20) '2.0'\n+1633E Extract OS            00 (0) 'MS-DOS'\n+1633F General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-15B6A Compression Method    0008 (8) 'Deflated'\n-15B6C Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-15B70 CRC                   896578EC (2305128684)\n-15B74 Compressed Size       00000746 (1862)\n-15B78 Uncompressed Size     00001327 (4903)\n-15B7C Filename Length       008E (142)\n-15B7E Extra Length          0000 (0)\n-15B80 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+16341 Compression Method    0008 (8) 'Deflated'\n+16343 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+16347 CRC                   896578EC (2305128684)\n+1634B Compressed Size       00000746 (1862)\n+1634F Uncompressed Size     00001327 (4903)\n+16353 Filename Length       008E (142)\n+16355 Extra Length          0000 (0)\n+16357 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             XXXXXXXXXX'\n #\n-# WARNING: Offset 0x15B80: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x16357: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-15C0E PAYLOAD\n+163E5 PAYLOAD\n \n-16354 LOCAL HEADER #329     04034B50 (67324752)\n-16358 Extract Zip Spec      14 (20) '2.0'\n-16359 Extract OS            00 (0) 'MS-DOS'\n-1635A General Purpose Flag  0800 (2048)\n+16B2B LOCAL HEADER #329     04034B50 (67324752)\n+16B2F Extract Zip Spec      14 (20) '2.0'\n+16B30 Extract OS            00 (0) 'MS-DOS'\n+16B31 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-1635C Compression Method    0008 (8) 'Deflated'\n-1635E Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-16362 CRC                   64624734 (1684162356)\n-16366 Compressed Size       0000063D (1597)\n-1636A Uncompressed Size     00000D24 (3364)\n-1636E Filename Length       0095 (149)\n-16370 Extra Length          0000 (0)\n-16372 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+16B33 Compression Method    0008 (8) 'Deflated'\n+16B35 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+16B39 CRC                   64624734 (1684162356)\n+16B3D Compressed Size       0000063D (1597)\n+16B41 Uncompressed Size     00000D24 (3364)\n+16B45 Filename Length       0095 (149)\n+16B47 Extra Length          0000 (0)\n+16B49 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             XXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x16372: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x16B49: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-16407 PAYLOAD\n+16BDE PAYLOAD\n \n-16A44 LOCAL HEADER #330     04034B50 (67324752)\n-16A48 Extract Zip Spec      14 (20) '2.0'\n-16A49 Extract OS            00 (0) 'MS-DOS'\n-16A4A General Purpose Flag  0800 (2048)\n+1721B LOCAL HEADER #330     04034B50 (67324752)\n+1721F Extract Zip Spec      14 (20) '2.0'\n+17220 Extract OS            00 (0) 'MS-DOS'\n+17221 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-16A4C Compression Method    0008 (8) 'Deflated'\n-16A4E Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-16A52 CRC                   2B6EF697 (728692375)\n-16A56 Compressed Size       00000444 (1092)\n-16A5A Uncompressed Size     000008CD (2253)\n-16A5E Filename Length       0091 (145)\n-16A60 Extra Length          0000 (0)\n-16A62 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+17223 Compression Method    0008 (8) 'Deflated'\n+17225 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+17229 CRC                   2B6EF697 (728692375)\n+1722D Compressed Size       00000444 (1092)\n+17231 Uncompressed Size     000008CD (2253)\n+17235 Filename Length       0091 (145)\n+17237 Extra Length          0000 (0)\n+17239 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             XXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x16A62: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x17239: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-16AF3 PAYLOAD\n+172CA PAYLOAD\n \n-16F37 LOCAL HEADER #331     04034B50 (67324752)\n-16F3B Extract Zip Spec      14 (20) '2.0'\n-16F3C Extract OS            00 (0) 'MS-DOS'\n-16F3D General Purpose Flag  0800 (2048)\n+1770E LOCAL HEADER #331     04034B50 (67324752)\n+17712 Extract Zip Spec      14 (20) '2.0'\n+17713 Extract OS            00 (0) 'MS-DOS'\n+17714 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-16F3F Compression Method    0008 (8) 'Deflated'\n-16F41 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-16F45 CRC                   DBC79151 (3687289169)\n-16F49 Compressed Size       00000874 (2164)\n-16F4D Uncompressed Size     000013B1 (5041)\n-16F51 Filename Length       008F (143)\n-16F53 Extra Length          0000 (0)\n-16F55 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+17716 Compression Method    0008 (8) 'Deflated'\n+17718 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+1771C CRC                   DBC79151 (3687289169)\n+17720 Compressed Size       00000874 (2164)\n+17724 Uncompressed Size     000013B1 (5041)\n+17728 Filename Length       008F (143)\n+1772A Extra Length          0000 (0)\n+1772C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             XXXXXXXXXXX'\n #\n-# WARNING: Offset 0x16F55: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x1772C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-16FE4 PAYLOAD\n+177BB PAYLOAD\n \n-17858 LOCAL HEADER #332     04034B50 (67324752)\n-1785C Extract Zip Spec      14 (20) '2.0'\n-1785D Extract OS            00 (0) 'MS-DOS'\n-1785E General Purpose Flag  0800 (2048)\n+1802F LOCAL HEADER #332     04034B50 (67324752)\n+18033 Extract Zip Spec      14 (20) '2.0'\n+18034 Extract OS            00 (0) 'MS-DOS'\n+18035 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-17860 Compression Method    0008 (8) 'Deflated'\n-17862 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-17866 CRC                   9AFFB21B (2600448539)\n-1786A Compressed Size       0000033F (831)\n-1786E Uncompressed Size     0000064E (1614)\n-17872 Filename Length       0095 (149)\n-17874 Extra Length          0000 (0)\n-17876 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+18037 Compression Method    0008 (8) 'Deflated'\n+18039 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+1803D CRC                   9AFFB21B (2600448539)\n+18041 Compressed Size       0000033F (831)\n+18045 Uncompressed Size     0000064E (1614)\n+18049 Filename Length       0095 (149)\n+1804B Extra Length          0000 (0)\n+1804D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             XXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x17876: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x1804D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-1790B PAYLOAD\n+180E2 PAYLOAD\n \n-17C4A LOCAL HEADER #333     04034B50 (67324752)\n-17C4E Extract Zip Spec      14 (20) '2.0'\n-17C4F Extract OS            00 (0) 'MS-DOS'\n-17C50 General Purpose Flag  0800 (2048)\n+18421 LOCAL HEADER #333     04034B50 (67324752)\n+18425 Extract Zip Spec      14 (20) '2.0'\n+18426 Extract OS            00 (0) 'MS-DOS'\n+18427 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-17C52 Compression Method    0008 (8) 'Deflated'\n-17C54 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-17C58 CRC                   88CF36AA (2295281322)\n-17C5C Compressed Size       000004BC (1212)\n-17C60 Uncompressed Size     00000A4F (2639)\n-17C64 Filename Length       0091 (145)\n-17C66 Extra Length          0000 (0)\n-17C68 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+18429 Compression Method    0008 (8) 'Deflated'\n+1842B Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+1842F CRC                   88CF36AA (2295281322)\n+18433 Compressed Size       000004BC (1212)\n+18437 Uncompressed Size     00000A4F (2639)\n+1843B Filename Length       0091 (145)\n+1843D Extra Length          0000 (0)\n+1843F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             XXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x17C68: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x1843F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-17CF9 PAYLOAD\n+184D0 PAYLOAD\n \n-181B5 LOCAL HEADER #334     04034B50 (67324752)\n-181B9 Extract Zip Spec      14 (20) '2.0'\n-181BA Extract OS            00 (0) 'MS-DOS'\n-181BB General Purpose Flag  0800 (2048)\n+1898C LOCAL HEADER #334     04034B50 (67324752)\n+18990 Extract Zip Spec      14 (20) '2.0'\n+18991 Extract OS            00 (0) 'MS-DOS'\n+18992 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-181BD Compression Method    0008 (8) 'Deflated'\n-181BF Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-181C3 CRC                   9593555C (2509460828)\n-181C7 Compressed Size       000005DA (1498)\n-181CB Uncompressed Size     00000D05 (3333)\n-181CF Filename Length       009A (154)\n-181D1 Extra Length          0000 (0)\n-181D3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+18994 Compression Method    0008 (8) 'Deflated'\n+18996 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+1899A CRC                   9593555C (2509460828)\n+1899E Compressed Size       000005DA (1498)\n+189A2 Uncompressed Size     00000D05 (3333)\n+189A6 Filename Length       009A (154)\n+189A8 Extra Length          0000 (0)\n+189AA Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             XXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x181D3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x189AA: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-1826D PAYLOAD\n+18A44 PAYLOAD\n \n-18847 LOCAL HEADER #335     04034B50 (67324752)\n-1884B Extract Zip Spec      14 (20) '2.0'\n-1884C Extract OS            00 (0) 'MS-DOS'\n-1884D General Purpose Flag  0800 (2048)\n+1901E LOCAL HEADER #335     04034B50 (67324752)\n+19022 Extract Zip Spec      14 (20) '2.0'\n+19023 Extract OS            00 (0) 'MS-DOS'\n+19024 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-1884F Compression Method    0008 (8) 'Deflated'\n-18851 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-18855 CRC                   9640338D (2520789901)\n-18859 Compressed Size       00000785 (1925)\n-1885D Uncompressed Size     000013DD (5085)\n-18861 Filename Length       008F (143)\n-18863 Extra Length          0000 (0)\n-18865 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+19026 Compression Method    0008 (8) 'Deflated'\n+19028 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+1902C CRC                   9640338D (2520789901)\n+19030 Compressed Size       00000785 (1925)\n+19034 Uncompressed Size     000013DD (5085)\n+19038 Filename Length       008F (143)\n+1903A Extra Length          0000 (0)\n+1903C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             XXXXXXXXXXX'\n #\n-# WARNING: Offset 0x18865: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x1903C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-188F4 PAYLOAD\n+190CB PAYLOAD\n \n-19079 LOCAL HEADER #336     04034B50 (67324752)\n-1907D Extract Zip Spec      14 (20) '2.0'\n-1907E Extract OS            00 (0) 'MS-DOS'\n-1907F General Purpose Flag  0800 (2048)\n+19850 LOCAL HEADER #336     04034B50 (67324752)\n+19854 Extract Zip Spec      14 (20) '2.0'\n+19855 Extract OS            00 (0) 'MS-DOS'\n+19856 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-19081 Compression Method    0008 (8) 'Deflated'\n-19083 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-19087 CRC                   5232B519 (1379054873)\n-1908B Compressed Size       000009AF (2479)\n-1908F Uncompressed Size     00001C1F (7199)\n-19093 Filename Length       0091 (145)\n-19095 Extra Length          0000 (0)\n-19097 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+19858 Compression Method    0008 (8) 'Deflated'\n+1985A Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+1985E CRC                   5232B519 (1379054873)\n+19862 Compressed Size       000009AF (2479)\n+19866 Uncompressed Size     00001C1F (7199)\n+1986A Filename Length       0091 (145)\n+1986C Extra Length          0000 (0)\n+1986E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             XXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x19097: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x1986E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-19128 PAYLOAD\n+198FF PAYLOAD\n \n-19AD7 LOCAL HEADER #337     04034B50 (67324752)\n-19ADB Extract Zip Spec      14 (20) '2.0'\n-19ADC Extract OS            00 (0) 'MS-DOS'\n-19ADD General Purpose Flag  0800 (2048)\n+1A2AE LOCAL HEADER #337     04034B50 (67324752)\n+1A2B2 Extract Zip Spec      14 (20) '2.0'\n+1A2B3 Extract OS            00 (0) 'MS-DOS'\n+1A2B4 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-19ADF Compression Method    0008 (8) 'Deflated'\n-19AE1 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-19AE5 CRC                   57267C45 (1462139973)\n-19AE9 Compressed Size       0000083D (2109)\n-19AED Uncompressed Size     000013D6 (5078)\n-19AF1 Filename Length       008E (142)\n-19AF3 Extra Length          0000 (0)\n-19AF5 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+1A2B6 Compression Method    0008 (8) 'Deflated'\n+1A2B8 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+1A2BC CRC                   57267C45 (1462139973)\n+1A2C0 Compressed Size       0000083D (2109)\n+1A2C4 Uncompressed Size     000013D6 (5078)\n+1A2C8 Filename Length       008E (142)\n+1A2CA Extra Length          0000 (0)\n+1A2CC Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             XXXXXXXXXX'\n #\n-# WARNING: Offset 0x19AF5: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x1A2CC: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-19B83 PAYLOAD\n+1A35A PAYLOAD\n \n-1A3C0 LOCAL HEADER #338     04034B50 (67324752)\n-1A3C4 Extract Zip Spec      14 (20) '2.0'\n-1A3C5 Extract OS            00 (0) 'MS-DOS'\n-1A3C6 General Purpose Flag  0800 (2048)\n+1AB97 LOCAL HEADER #338     04034B50 (67324752)\n+1AB9B Extract Zip Spec      14 (20) '2.0'\n+1AB9C Extract OS            00 (0) 'MS-DOS'\n+1AB9D General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-1A3C8 Compression Method    0008 (8) 'Deflated'\n-1A3CA Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-1A3CE CRC                   333FC2BB (859816635)\n-1A3D2 Compressed Size       00000395 (917)\n-1A3D6 Uncompressed Size     00000736 (1846)\n-1A3DA Filename Length       0095 (149)\n-1A3DC Extra Length          0000 (0)\n-1A3DE Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+1AB9F Compression Method    0008 (8) 'Deflated'\n+1ABA1 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+1ABA5 CRC                   333FC2BB (859816635)\n+1ABA9 Compressed Size       00000395 (917)\n+1ABAD Uncompressed Size     00000736 (1846)\n+1ABB1 Filename Length       0095 (149)\n+1ABB3 Extra Length          0000 (0)\n+1ABB5 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             XXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x1A3DE: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x1ABB5: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-1A473 PAYLOAD\n+1AC4A PAYLOAD\n \n-1A808 LOCAL HEADER #339     04034B50 (67324752)\n-1A80C Extract Zip Spec      14 (20) '2.0'\n-1A80D Extract OS            00 (0) 'MS-DOS'\n-1A80E General Purpose Flag  0800 (2048)\n+1AFDF LOCAL HEADER #339     04034B50 (67324752)\n+1AFE3 Extract Zip Spec      14 (20) '2.0'\n+1AFE4 Extract OS            00 (0) 'MS-DOS'\n+1AFE5 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-1A810 Compression Method    0008 (8) 'Deflated'\n-1A812 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-1A816 CRC                   10CC5E74 (281828980)\n-1A81A Compressed Size       000004BC (1212)\n-1A81E Uncompressed Size     000009CD (2509)\n-1A822 Filename Length       006E (110)\n-1A824 Extra Length          0000 (0)\n-1A826 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+1AFE7 Compression Method    0008 (8) 'Deflated'\n+1AFE9 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+1AFED CRC                   10CC5E74 (281828980)\n+1AFF1 Compressed Size       000004BC (1212)\n+1AFF5 Uncompressed Size     000009CD (2509)\n+1AFF9 Filename Length       006E (110)\n+1AFFB Extra Length          0000 (0)\n+1AFFD Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x1A826: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x1AFFD: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-1A894 PAYLOAD\n+1B06B PAYLOAD\n \n-1AD50 LOCAL HEADER #340     04034B50 (67324752)\n-1AD54 Extract Zip Spec      14 (20) '2.0'\n-1AD55 Extract OS            00 (0) 'MS-DOS'\n-1AD56 General Purpose Flag  0800 (2048)\n+1B527 LOCAL HEADER #340     04034B50 (67324752)\n+1B52B Extract Zip Spec      14 (20) '2.0'\n+1B52C Extract OS            00 (0) 'MS-DOS'\n+1B52D General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-1AD58 Compression Method    0008 (8) 'Deflated'\n-1AD5A Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-1AD5E CRC                   5F6BF872 (1600911474)\n-1AD62 Compressed Size       000004BC (1212)\n-1AD66 Uncompressed Size     000009A0 (2464)\n-1AD6A Filename Length       006E (110)\n-1AD6C Extra Length          0000 (0)\n-1AD6E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+1B52F Compression Method    0008 (8) 'Deflated'\n+1B531 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+1B535 CRC                   5F6BF872 (1600911474)\n+1B539 Compressed Size       000004BC (1212)\n+1B53D Uncompressed Size     000009A0 (2464)\n+1B541 Filename Length       006E (110)\n+1B543 Extra Length          0000 (0)\n+1B545 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x1AD6E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x1B545: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-1ADDC PAYLOAD\n+1B5B3 PAYLOAD\n \n-1B298 LOCAL HEADER #341     04034B50 (67324752)\n-1B29C Extract Zip Spec      14 (20) '2.0'\n-1B29D Extract OS            00 (0) 'MS-DOS'\n-1B29E General Purpose Flag  0800 (2048)\n+1BA6F LOCAL HEADER #341     04034B50 (67324752)\n+1BA73 Extract Zip Spec      14 (20) '2.0'\n+1BA74 Extract OS            00 (0) 'MS-DOS'\n+1BA75 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-1B2A0 Compression Method    0008 (8) 'Deflated'\n-1B2A2 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-1B2A6 CRC                   456B0BC9 (1164643273)\n-1B2AA Compressed Size       000005BD (1469)\n-1B2AE Uncompressed Size     00001135 (4405)\n-1B2B2 Filename Length       006A (106)\n-1B2B4 Extra Length          0000 (0)\n-1B2B6 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+1BA77 Compression Method    0008 (8) 'Deflated'\n+1BA79 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+1BA7D CRC                   456B0BC9 (1164643273)\n+1BA81 Compressed Size       000005BD (1469)\n+1BA85 Uncompressed Size     00001135 (4405)\n+1BA89 Filename Length       006A (106)\n+1BA8B Extra Length          0000 (0)\n+1BA8D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x1B2B6: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x1BA8D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-1B320 PAYLOAD\n+1BAF7 PAYLOAD\n \n-1B8DD LOCAL HEADER #342     04034B50 (67324752)\n-1B8E1 Extract Zip Spec      14 (20) '2.0'\n-1B8E2 Extract OS            00 (0) 'MS-DOS'\n-1B8E3 General Purpose Flag  0800 (2048)\n+1C0B4 LOCAL HEADER #342     04034B50 (67324752)\n+1C0B8 Extract Zip Spec      14 (20) '2.0'\n+1C0B9 Extract OS            00 (0) 'MS-DOS'\n+1C0BA General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-1B8E5 Compression Method    0008 (8) 'Deflated'\n-1B8E7 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-1B8EB CRC                   6A45582D (1782929453)\n-1B8EF Compressed Size       000004E4 (1252)\n-1B8F3 Uncompressed Size     000009E0 (2528)\n-1B8F7 Filename Length       0073 (115)\n-1B8F9 Extra Length          0000 (0)\n-1B8FB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+1C0BC Compression Method    0008 (8) 'Deflated'\n+1C0BE Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+1C0C2 CRC                   6A45582D (1782929453)\n+1C0C6 Compressed Size       000004E4 (1252)\n+1C0CA Uncompressed Size     000009E0 (2528)\n+1C0CE Filename Length       0073 (115)\n+1C0D0 Extra Length          0000 (0)\n+1C0D2 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x1B8FB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x1C0D2: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-1B96E PAYLOAD\n+1C145 PAYLOAD\n \n-1BE52 LOCAL HEADER #343     04034B50 (67324752)\n-1BE56 Extract Zip Spec      14 (20) '2.0'\n-1BE57 Extract OS            00 (0) 'MS-DOS'\n-1BE58 General Purpose Flag  0800 (2048)\n+1C629 LOCAL HEADER #343     04034B50 (67324752)\n+1C62D Extract Zip Spec      14 (20) '2.0'\n+1C62E Extract OS            00 (0) 'MS-DOS'\n+1C62F General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-1BE5A Compression Method    0008 (8) 'Deflated'\n-1BE5C Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-1BE60 CRC                   4731534C (1194414924)\n-1BE64 Compressed Size       0000051E (1310)\n-1BE68 Uncompressed Size     00000B90 (2960)\n-1BE6C Filename Length       0075 (117)\n-1BE6E Extra Length          0000 (0)\n-1BE70 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+1C631 Compression Method    0008 (8) 'Deflated'\n+1C633 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+1C637 CRC                   4731534C (1194414924)\n+1C63B Compressed Size       0000051E (1310)\n+1C63F Uncompressed Size     00000B90 (2960)\n+1C643 Filename Length       0075 (117)\n+1C645 Extra Length          0000 (0)\n+1C647 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x1BE70: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x1C647: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-1BEE5 PAYLOAD\n+1C6BC PAYLOAD\n \n-1C403 LOCAL HEADER #344     04034B50 (67324752)\n-1C407 Extract Zip Spec      14 (20) '2.0'\n-1C408 Extract OS            00 (0) 'MS-DOS'\n-1C409 General Purpose Flag  0800 (2048)\n+1CBDA LOCAL HEADER #344     04034B50 (67324752)\n+1CBDE Extract Zip Spec      14 (20) '2.0'\n+1CBDF Extract OS            00 (0) 'MS-DOS'\n+1CBE0 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-1C40B Compression Method    0008 (8) 'Deflated'\n-1C40D Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-1C411 CRC                   CEBA8B64 (3468331876)\n-1C415 Compressed Size       000004A0 (1184)\n-1C419 Uncompressed Size     00000A7D (2685)\n-1C41D Filename Length       0074 (116)\n-1C41F Extra Length          0000 (0)\n-1C421 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+1CBE2 Compression Method    0008 (8) 'Deflated'\n+1CBE4 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+1CBE8 CRC                   CEBA8B64 (3468331876)\n+1CBEC Compressed Size       000004A0 (1184)\n+1CBF0 Uncompressed Size     00000A7D (2685)\n+1CBF4 Filename Length       0074 (116)\n+1CBF6 Extra Length          0000 (0)\n+1CBF8 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x1C421: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x1CBF8: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-1C495 PAYLOAD\n+1CC6C PAYLOAD\n \n-1C935 LOCAL HEADER #345     04034B50 (67324752)\n-1C939 Extract Zip Spec      14 (20) '2.0'\n-1C93A Extract OS            00 (0) 'MS-DOS'\n-1C93B General Purpose Flag  0800 (2048)\n+1D10C LOCAL HEADER #345     04034B50 (67324752)\n+1D110 Extract Zip Spec      14 (20) '2.0'\n+1D111 Extract OS            00 (0) 'MS-DOS'\n+1D112 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-1C93D Compression Method    0008 (8) 'Deflated'\n-1C93F Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-1C943 CRC                   0DACEA84 (229436036)\n-1C947 Compressed Size       000004B1 (1201)\n-1C94B Uncompressed Size     00000A95 (2709)\n-1C94F Filename Length       0073 (115)\n-1C951 Extra Length          0000 (0)\n-1C953 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+1D114 Compression Method    0008 (8) 'Deflated'\n+1D116 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+1D11A CRC                   0DACEA84 (229436036)\n+1D11E Compressed Size       000004B1 (1201)\n+1D122 Uncompressed Size     00000A95 (2709)\n+1D126 Filename Length       0073 (115)\n+1D128 Extra Length          0000 (0)\n+1D12A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x1C953: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x1D12A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-1C9C6 PAYLOAD\n+1D19D PAYLOAD\n \n-1CE77 LOCAL HEADER #346     04034B50 (67324752)\n-1CE7B Extract Zip Spec      14 (20) '2.0'\n-1CE7C Extract OS            00 (0) 'MS-DOS'\n-1CE7D General Purpose Flag  0800 (2048)\n+1D64E LOCAL HEADER #346     04034B50 (67324752)\n+1D652 Extract Zip Spec      14 (20) '2.0'\n+1D653 Extract OS            00 (0) 'MS-DOS'\n+1D654 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-1CE7F Compression Method    0008 (8) 'Deflated'\n-1CE81 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-1CE85 CRC                   2E84B239 (780448313)\n-1CE89 Compressed Size       000006DB (1755)\n-1CE8D Uncompressed Size     0000121D (4637)\n-1CE91 Filename Length       0074 (116)\n-1CE93 Extra Length          0000 (0)\n-1CE95 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+1D656 Compression Method    0008 (8) 'Deflated'\n+1D658 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+1D65C CRC                   2E84B239 (780448313)\n+1D660 Compressed Size       000006DB (1755)\n+1D664 Uncompressed Size     0000121D (4637)\n+1D668 Filename Length       0074 (116)\n+1D66A Extra Length          0000 (0)\n+1D66C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x1CE95: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x1D66C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-1CF09 PAYLOAD\n+1D6E0 PAYLOAD\n \n-1D5E4 LOCAL HEADER #347     04034B50 (67324752)\n-1D5E8 Extract Zip Spec      14 (20) '2.0'\n-1D5E9 Extract OS            00 (0) 'MS-DOS'\n-1D5EA General Purpose Flag  0800 (2048)\n+1DDBB LOCAL HEADER #347     04034B50 (67324752)\n+1DDBF Extract Zip Spec      14 (20) '2.0'\n+1DDC0 Extract OS            00 (0) 'MS-DOS'\n+1DDC1 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-1D5EC Compression Method    0008 (8) 'Deflated'\n-1D5EE Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-1D5F2 CRC                   10E7267F (283584127)\n-1D5F6 Compressed Size       000003B1 (945)\n-1D5FA Uncompressed Size     000006FB (1787)\n-1D5FE Filename Length       008E (142)\n-1D600 Extra Length          0000 (0)\n-1D602 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+1DDC3 Compression Method    0008 (8) 'Deflated'\n+1DDC5 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+1DDC9 CRC                   10E7267F (283584127)\n+1DDCD Compressed Size       000003B1 (945)\n+1DDD1 Uncompressed Size     000006FB (1787)\n+1DDD5 Filename Length       008E (142)\n+1DDD7 Extra Length          0000 (0)\n+1DDD9 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             XXXXXXXXXX'\n #\n-# WARNING: Offset 0x1D602: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x1DDD9: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-1D690 PAYLOAD\n+1DE67 PAYLOAD\n \n-1DA41 LOCAL HEADER #348     04034B50 (67324752)\n-1DA45 Extract Zip Spec      14 (20) '2.0'\n-1DA46 Extract OS            00 (0) 'MS-DOS'\n-1DA47 General Purpose Flag  0800 (2048)\n+1E218 LOCAL HEADER #348     04034B50 (67324752)\n+1E21C Extract Zip Spec      14 (20) '2.0'\n+1E21D Extract OS            00 (0) 'MS-DOS'\n+1E21E General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-1DA49 Compression Method    0008 (8) 'Deflated'\n-1DA4B Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-1DA4F CRC                   24E47A3B (618953275)\n-1DA53 Compressed Size       000003B4 (948)\n-1DA57 Uncompressed Size     000006FF (1791)\n-1DA5B Filename Length       008F (143)\n-1DA5D Extra Length          0000 (0)\n-1DA5F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+1E220 Compression Method    0008 (8) 'Deflated'\n+1E222 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+1E226 CRC                   24E47A3B (618953275)\n+1E22A Compressed Size       000003B4 (948)\n+1E22E Uncompressed Size     000006FF (1791)\n+1E232 Filename Length       008F (143)\n+1E234 Extra Length          0000 (0)\n+1E236 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             XXXXXXXXXXX'\n #\n-# WARNING: Offset 0x1DA5F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x1E236: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-1DAEE PAYLOAD\n+1E2C5 PAYLOAD\n \n-1DEA2 LOCAL HEADER #349     04034B50 (67324752)\n-1DEA6 Extract Zip Spec      14 (20) '2.0'\n-1DEA7 Extract OS            00 (0) 'MS-DOS'\n-1DEA8 General Purpose Flag  0800 (2048)\n+1E679 LOCAL HEADER #349     04034B50 (67324752)\n+1E67D Extract Zip Spec      14 (20) '2.0'\n+1E67E Extract OS            00 (0) 'MS-DOS'\n+1E67F General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-1DEAA Compression Method    0008 (8) 'Deflated'\n-1DEAC Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-1DEB0 CRC                   042BB565 (69973349)\n-1DEB4 Compressed Size       000007C6 (1990)\n-1DEB8 Uncompressed Size     00001364 (4964)\n-1DEBC Filename Length       008A (138)\n-1DEBE Extra Length          0000 (0)\n-1DEC0 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+1E681 Compression Method    0008 (8) 'Deflated'\n+1E683 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+1E687 CRC                   042BB565 (69973349)\n+1E68B Compressed Size       000007C6 (1990)\n+1E68F Uncompressed Size     00001364 (4964)\n+1E693 Filename Length       008A (138)\n+1E695 Extra Length          0000 (0)\n+1E697 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             XXXXXX'\n #\n-# WARNING: Offset 0x1DEC0: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x1E697: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-1DF4A PAYLOAD\n+1E721 PAYLOAD\n \n-1E710 LOCAL HEADER #350     04034B50 (67324752)\n-1E714 Extract Zip Spec      14 (20) '2.0'\n-1E715 Extract OS            00 (0) 'MS-DOS'\n-1E716 General Purpose Flag  0800 (2048)\n+1EEE7 LOCAL HEADER #350     04034B50 (67324752)\n+1EEEB Extract Zip Spec      14 (20) '2.0'\n+1EEEC Extract OS            00 (0) 'MS-DOS'\n+1EEED General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-1E718 Compression Method    0008 (8) 'Deflated'\n-1E71A Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-1E71E CRC                   7A63232B (2053317419)\n-1E722 Compressed Size       0000084C (2124)\n-1E726 Uncompressed Size     000013C0 (5056)\n-1E72A Filename Length       008B (139)\n-1E72C Extra Length          0000 (0)\n-1E72E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+1EEEF Compression Method    0008 (8) 'Deflated'\n+1EEF1 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+1EEF5 CRC                   7A63232B (2053317419)\n+1EEF9 Compressed Size       0000084C (2124)\n+1EEFD Uncompressed Size     000013C0 (5056)\n+1EF01 Filename Length       008B (139)\n+1EF03 Extra Length          0000 (0)\n+1EF05 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             XXXXXXX'\n #\n-# WARNING: Offset 0x1E72E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x1EF05: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-1E7B9 PAYLOAD\n+1EF90 PAYLOAD\n \n-1F005 LOCAL HEADER #351     04034B50 (67324752)\n-1F009 Extract Zip Spec      14 (20) '2.0'\n-1F00A Extract OS            00 (0) 'MS-DOS'\n-1F00B General Purpose Flag  0800 (2048)\n+1F7DC LOCAL HEADER #351     04034B50 (67324752)\n+1F7E0 Extract Zip Spec      14 (20) '2.0'\n+1F7E1 Extract OS            00 (0) 'MS-DOS'\n+1F7E2 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-1F00D Compression Method    0008 (8) 'Deflated'\n-1F00F Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-1F013 CRC                   19888393 (428376979)\n-1F017 Compressed Size       000004B8 (1208)\n-1F01B Uncompressed Size     0000092E (2350)\n-1F01F Filename Length       0074 (116)\n-1F021 Extra Length          0000 (0)\n-1F023 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+1F7E4 Compression Method    0008 (8) 'Deflated'\n+1F7E6 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+1F7EA CRC                   19888393 (428376979)\n+1F7EE Compressed Size       000004B8 (1208)\n+1F7F2 Uncompressed Size     0000092E (2350)\n+1F7F6 Filename Length       0074 (116)\n+1F7F8 Extra Length          0000 (0)\n+1F7FA Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x1F023: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x1F7FA: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-1F097 PAYLOAD\n+1F86E PAYLOAD\n \n-1F54F LOCAL HEADER #352     04034B50 (67324752)\n-1F553 Extract Zip Spec      14 (20) '2.0'\n-1F554 Extract OS            00 (0) 'MS-DOS'\n-1F555 General Purpose Flag  0800 (2048)\n+1FD26 LOCAL HEADER #352     04034B50 (67324752)\n+1FD2A Extract Zip Spec      14 (20) '2.0'\n+1FD2B Extract OS            00 (0) 'MS-DOS'\n+1FD2C General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-1F557 Compression Method    0008 (8) 'Deflated'\n-1F559 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-1F55D CRC                   8B1E3BB7 (2334014391)\n-1F561 Compressed Size       00000B79 (2937)\n-1F565 Uncompressed Size     00002091 (8337)\n-1F569 Filename Length       007A (122)\n-1F56B Extra Length          0000 (0)\n-1F56D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+1FD2E Compression Method    0008 (8) 'Deflated'\n+1FD30 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+1FD34 CRC                   8B1E3BB7 (2334014391)\n+1FD38 Compressed Size       00000B79 (2937)\n+1FD3C Uncompressed Size     00002091 (8337)\n+1FD40 Filename Length       007A (122)\n+1FD42 Extra Length          0000 (0)\n+1FD44 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x1F56D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x1FD44: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-1F5E7 PAYLOAD\n+1FDBE PAYLOAD\n \n-20160 LOCAL HEADER #353     04034B50 (67324752)\n-20164 Extract Zip Spec      14 (20) '2.0'\n-20165 Extract OS            00 (0) 'MS-DOS'\n-20166 General Purpose Flag  0800 (2048)\n+20937 LOCAL HEADER #353     04034B50 (67324752)\n+2093B Extract Zip Spec      14 (20) '2.0'\n+2093C Extract OS            00 (0) 'MS-DOS'\n+2093D General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-20168 Compression Method    0008 (8) 'Deflated'\n-2016A Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-2016E CRC                   EAE74E6F (3941027439)\n-20172 Compressed Size       0000075E (1886)\n-20176 Uncompressed Size     00001481 (5249)\n-2017A Filename Length       007D (125)\n-2017C Extra Length          0000 (0)\n-2017E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+2093F Compression Method    0008 (8) 'Deflated'\n+20941 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+20945 CRC                   EAE74E6F (3941027439)\n+20949 Compressed Size       0000075E (1886)\n+2094D Uncompressed Size     00001481 (5249)\n+20951 Filename Length       007D (125)\n+20953 Extra Length          0000 (0)\n+20955 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x2017E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x20955: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-201FB PAYLOAD\n+209D2 PAYLOAD\n \n-20959 LOCAL HEADER #354     04034B50 (67324752)\n-2095D Extract Zip Spec      14 (20) '2.0'\n-2095E Extract OS            00 (0) 'MS-DOS'\n-2095F General Purpose Flag  0800 (2048)\n+21130 LOCAL HEADER #354     04034B50 (67324752)\n+21134 Extract Zip Spec      14 (20) '2.0'\n+21135 Extract OS            00 (0) 'MS-DOS'\n+21136 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-20961 Compression Method    0008 (8) 'Deflated'\n-20963 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-20967 CRC                   49F8AFD7 (1241034711)\n-2096B Compressed Size       00000A90 (2704)\n-2096F Uncompressed Size     000025C9 (9673)\n-20973 Filename Length       006D (109)\n-20975 Extra Length          0000 (0)\n-20977 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+21138 Compression Method    0008 (8) 'Deflated'\n+2113A Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+2113E CRC                   49F8AFD7 (1241034711)\n+21142 Compressed Size       00000A90 (2704)\n+21146 Uncompressed Size     000025C9 (9673)\n+2114A Filename Length       006D (109)\n+2114C Extra Length          0000 (0)\n+2114E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x20977: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x2114E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-209E4 PAYLOAD\n+211BB PAYLOAD\n \n-21474 LOCAL HEADER #355     04034B50 (67324752)\n-21478 Extract Zip Spec      14 (20) '2.0'\n-21479 Extract OS            00 (0) 'MS-DOS'\n-2147A General Purpose Flag  0800 (2048)\n+21C4B LOCAL HEADER #355     04034B50 (67324752)\n+21C4F Extract Zip Spec      14 (20) '2.0'\n+21C50 Extract OS            00 (0) 'MS-DOS'\n+21C51 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-2147C Compression Method    0008 (8) 'Deflated'\n-2147E Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-21482 CRC                   332580F8 (858095864)\n-21486 Compressed Size       000004E7 (1255)\n-2148A Uncompressed Size     00000E10 (3600)\n-2148E Filename Length       006C (108)\n-21490 Extra Length          0000 (0)\n-21492 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+21C53 Compression Method    0008 (8) 'Deflated'\n+21C55 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+21C59 CRC                   332580F8 (858095864)\n+21C5D Compressed Size       000004E7 (1255)\n+21C61 Uncompressed Size     00000E10 (3600)\n+21C65 Filename Length       006C (108)\n+21C67 Extra Length          0000 (0)\n+21C69 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x21492: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x21C69: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-214FE PAYLOAD\n+21CD5 PAYLOAD\n \n-219E5 LOCAL HEADER #356     04034B50 (67324752)\n-219E9 Extract Zip Spec      14 (20) '2.0'\n-219EA Extract OS            00 (0) 'MS-DOS'\n-219EB General Purpose Flag  0800 (2048)\n+221BC LOCAL HEADER #356     04034B50 (67324752)\n+221C0 Extract Zip Spec      14 (20) '2.0'\n+221C1 Extract OS            00 (0) 'MS-DOS'\n+221C2 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-219ED Compression Method    0008 (8) 'Deflated'\n-219EF Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-219F3 CRC                   0D142FFC (219426812)\n-219F7 Compressed Size       000009EA (2538)\n-219FB Uncompressed Size     00001A7B (6779)\n-219FF Filename Length       008F (143)\n-21A01 Extra Length          0000 (0)\n-21A03 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+221C4 Compression Method    0008 (8) 'Deflated'\n+221C6 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+221CA CRC                   0D142FFC (219426812)\n+221CE Compressed Size       000009EA (2538)\n+221D2 Uncompressed Size     00001A7B (6779)\n+221D6 Filename Length       008F (143)\n+221D8 Extra Length          0000 (0)\n+221DA Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             XXXXXXXXXXX'\n #\n-# WARNING: Offset 0x21A03: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x221DA: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-21A92 PAYLOAD\n+22269 PAYLOAD\n \n-2247C LOCAL HEADER #357     04034B50 (67324752)\n-22480 Extract Zip Spec      14 (20) '2.0'\n-22481 Extract OS            00 (0) 'MS-DOS'\n-22482 General Purpose Flag  0800 (2048)\n+22C53 LOCAL HEADER #357     04034B50 (67324752)\n+22C57 Extract Zip Spec      14 (20) '2.0'\n+22C58 Extract OS            00 (0) 'MS-DOS'\n+22C59 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-22484 Compression Method    0008 (8) 'Deflated'\n-22486 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-2248A CRC                   726CFBF2 (1919745010)\n-2248E Compressed Size       00000434 (1076)\n-22492 Uncompressed Size     00000886 (2182)\n-22496 Filename Length       0095 (149)\n-22498 Extra Length          0000 (0)\n-2249A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+22C5B Compression Method    0008 (8) 'Deflated'\n+22C5D Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+22C61 CRC                   726CFBF2 (1919745010)\n+22C65 Compressed Size       00000434 (1076)\n+22C69 Uncompressed Size     00000886 (2182)\n+22C6D Filename Length       0095 (149)\n+22C6F Extra Length          0000 (0)\n+22C71 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             XXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x2249A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x22C71: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-2252F PAYLOAD\n+22D06 PAYLOAD\n \n-22963 LOCAL HEADER #358     04034B50 (67324752)\n-22967 Extract Zip Spec      14 (20) '2.0'\n-22968 Extract OS            00 (0) 'MS-DOS'\n-22969 General Purpose Flag  0800 (2048)\n+2313A LOCAL HEADER #358     04034B50 (67324752)\n+2313E Extract Zip Spec      14 (20) '2.0'\n+2313F Extract OS            00 (0) 'MS-DOS'\n+23140 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-2296B Compression Method    0008 (8) 'Deflated'\n-2296D Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-22971 CRC                   0124A640 (19179072)\n-22975 Compressed Size       0000070A (1802)\n-22979 Uncompressed Size     00001071 (4209)\n-2297D Filename Length       009C (156)\n-2297F Extra Length          0000 (0)\n-22981 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+23142 Compression Method    0008 (8) 'Deflated'\n+23144 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+23148 CRC                   0124A640 (19179072)\n+2314C Compressed Size       0000070A (1802)\n+23150 Uncompressed Size     00001071 (4209)\n+23154 Filename Length       009C (156)\n+23156 Extra Length          0000 (0)\n+23158 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             XXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x22981: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x23158: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-22A1D PAYLOAD\n+231F4 PAYLOAD\n \n-23127 LOCAL HEADER #359     04034B50 (67324752)\n-2312B Extract Zip Spec      14 (20) '2.0'\n-2312C Extract OS            00 (0) 'MS-DOS'\n-2312D General Purpose Flag  0800 (2048)\n+238FE LOCAL HEADER #359     04034B50 (67324752)\n+23902 Extract Zip Spec      14 (20) '2.0'\n+23903 Extract OS            00 (0) 'MS-DOS'\n+23904 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-2312F Compression Method    0008 (8) 'Deflated'\n-23131 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-23135 CRC                   7E793C9C (2121874588)\n-23139 Compressed Size       00000459 (1113)\n-2313D Uncompressed Size     000008CC (2252)\n-23141 Filename Length       009C (156)\n-23143 Extra Length          0000 (0)\n-23145 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+23906 Compression Method    0008 (8) 'Deflated'\n+23908 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+2390C CRC                   7E793C9C (2121874588)\n+23910 Compressed Size       00000459 (1113)\n+23914 Uncompressed Size     000008CC (2252)\n+23918 Filename Length       009C (156)\n+2391A Extra Length          0000 (0)\n+2391C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             XXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x23145: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x2391C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-231E1 PAYLOAD\n+239B8 PAYLOAD\n \n-2363A LOCAL HEADER #360     04034B50 (67324752)\n-2363E Extract Zip Spec      14 (20) '2.0'\n-2363F Extract OS            00 (0) 'MS-DOS'\n-23640 General Purpose Flag  0800 (2048)\n+23E11 LOCAL HEADER #360     04034B50 (67324752)\n+23E15 Extract Zip Spec      14 (20) '2.0'\n+23E16 Extract OS            00 (0) 'MS-DOS'\n+23E17 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-23642 Compression Method    0008 (8) 'Deflated'\n-23644 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-23648 CRC                   A8584B88 (2824358792)\n-2364C Compressed Size       000003BB (955)\n-23650 Uncompressed Size     0000070D (1805)\n-23654 Filename Length       0068 (104)\n-23656 Extra Length          0000 (0)\n-23658 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+23E19 Compression Method    0008 (8) 'Deflated'\n+23E1B Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+23E1F CRC                   A8584B88 (2824358792)\n+23E23 Compressed Size       000003BB (955)\n+23E27 Uncompressed Size     0000070D (1805)\n+23E2B Filename Length       0068 (104)\n+23E2D Extra Length          0000 (0)\n+23E2F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x23658: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x23E2F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-236C0 PAYLOAD\n+23E97 PAYLOAD\n \n-23A7B LOCAL HEADER #361     04034B50 (67324752)\n-23A7F Extract Zip Spec      14 (20) '2.0'\n-23A80 Extract OS            00 (0) 'MS-DOS'\n-23A81 General Purpose Flag  0800 (2048)\n+24252 LOCAL HEADER #361     04034B50 (67324752)\n+24256 Extract Zip Spec      14 (20) '2.0'\n+24257 Extract OS            00 (0) 'MS-DOS'\n+24258 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-23A83 Compression Method    0008 (8) 'Deflated'\n-23A85 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-23A89 CRC                   A8336B4A (2821942090)\n-23A8D Compressed Size       000003BA (954)\n-23A91 Uncompressed Size     00000760 (1888)\n-23A95 Filename Length       0064 (100)\n-23A97 Extra Length          0000 (0)\n-23A99 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+2425A Compression Method    0008 (8) 'Deflated'\n+2425C Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+24260 CRC                   A8336B4A (2821942090)\n+24264 Compressed Size       000003BA (954)\n+24268 Uncompressed Size     00000760 (1888)\n+2426C Filename Length       0064 (100)\n+2426E Extra Length          0000 (0)\n+24270 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x23A99: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x24270: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-23AFD PAYLOAD\n+242D4 PAYLOAD\n \n-23EB7 LOCAL HEADER #362     04034B50 (67324752)\n-23EBB Extract Zip Spec      14 (20) '2.0'\n-23EBC Extract OS            00 (0) 'MS-DOS'\n-23EBD General Purpose Flag  0800 (2048)\n+2468E LOCAL HEADER #362     04034B50 (67324752)\n+24692 Extract Zip Spec      14 (20) '2.0'\n+24693 Extract OS            00 (0) 'MS-DOS'\n+24694 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-23EBF Compression Method    0008 (8) 'Deflated'\n-23EC1 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-23EC5 CRC                   7559BE1A (1968815642)\n-23EC9 Compressed Size       000003BA (954)\n-23ECD Uncompressed Size     00000764 (1892)\n-23ED1 Filename Length       0064 (100)\n-23ED3 Extra Length          0000 (0)\n-23ED5 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+24696 Compression Method    0008 (8) 'Deflated'\n+24698 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+2469C CRC                   7559BE1A (1968815642)\n+246A0 Compressed Size       000003BA (954)\n+246A4 Uncompressed Size     00000764 (1892)\n+246A8 Filename Length       0064 (100)\n+246AA Extra Length          0000 (0)\n+246AC Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x23ED5: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x246AC: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-23F39 PAYLOAD\n+24710 PAYLOAD\n \n-242F3 LOCAL HEADER #363     04034B50 (67324752)\n-242F7 Extract Zip Spec      14 (20) '2.0'\n-242F8 Extract OS            00 (0) 'MS-DOS'\n-242F9 General Purpose Flag  0800 (2048)\n+24ACA LOCAL HEADER #363     04034B50 (67324752)\n+24ACE Extract Zip Spec      14 (20) '2.0'\n+24ACF Extract OS            00 (0) 'MS-DOS'\n+24AD0 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-242FB Compression Method    0008 (8) 'Deflated'\n-242FD Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-24301 CRC                   F2039839 (4060321849)\n-24305 Compressed Size       000005D5 (1493)\n-24309 Uncompressed Size     00000F35 (3893)\n-2430D Filename Length       0066 (102)\n-2430F Extra Length          0000 (0)\n-24311 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+24AD2 Compression Method    0008 (8) 'Deflated'\n+24AD4 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+24AD8 CRC                   F2039839 (4060321849)\n+24ADC Compressed Size       000005D5 (1493)\n+24AE0 Uncompressed Size     00000F35 (3893)\n+24AE4 Filename Length       0066 (102)\n+24AE6 Extra Length          0000 (0)\n+24AE8 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x24311: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x24AE8: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-24377 PAYLOAD\n+24B4E PAYLOAD\n \n-2494C LOCAL HEADER #364     04034B50 (67324752)\n-24950 Extract Zip Spec      14 (20) '2.0'\n-24951 Extract OS            00 (0) 'MS-DOS'\n-24952 General Purpose Flag  0800 (2048)\n+25123 LOCAL HEADER #364     04034B50 (67324752)\n+25127 Extract Zip Spec      14 (20) '2.0'\n+25128 Extract OS            00 (0) 'MS-DOS'\n+25129 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-24954 Compression Method    0008 (8) 'Deflated'\n-24956 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-2495A CRC                   4C048087 (1275363463)\n-2495E Compressed Size       00000445 (1093)\n-24962 Uncompressed Size     00000861 (2145)\n-24966 Filename Length       0071 (113)\n-24968 Extra Length          0000 (0)\n-2496A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+2512B Compression Method    0008 (8) 'Deflated'\n+2512D Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+25131 CRC                   4C048087 (1275363463)\n+25135 Compressed Size       00000445 (1093)\n+25139 Uncompressed Size     00000861 (2145)\n+2513D Filename Length       0071 (113)\n+2513F Extra Length          0000 (0)\n+25141 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x2496A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x25141: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-249DB PAYLOAD\n+251B2 PAYLOAD\n \n-24E20 LOCAL HEADER #365     04034B50 (67324752)\n-24E24 Extract Zip Spec      14 (20) '2.0'\n-24E25 Extract OS            00 (0) 'MS-DOS'\n-24E26 General Purpose Flag  0800 (2048)\n+255F7 LOCAL HEADER #365     04034B50 (67324752)\n+255FB Extract Zip Spec      14 (20) '2.0'\n+255FC Extract OS            00 (0) 'MS-DOS'\n+255FD General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-24E28 Compression Method    0008 (8) 'Deflated'\n-24E2A Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-24E2E CRC                   877B2EE8 (2272997096)\n-24E32 Compressed Size       00000AAF (2735)\n-24E36 Uncompressed Size     0000215E (8542)\n-24E3A Filename Length       007E (126)\n-24E3C Extra Length          0000 (0)\n-24E3E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+255FF Compression Method    0008 (8) 'Deflated'\n+25601 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+25605 CRC                   877B2EE8 (2272997096)\n+25609 Compressed Size       00000AAF (2735)\n+2560D Uncompressed Size     0000215E (8542)\n+25611 Filename Length       007E (126)\n+25613 Extra Length          0000 (0)\n+25615 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x24E3E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x25615: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-24EBC PAYLOAD\n+25693 PAYLOAD\n \n-2596B LOCAL HEADER #366     04034B50 (67324752)\n-2596F Extract Zip Spec      14 (20) '2.0'\n-25970 Extract OS            00 (0) 'MS-DOS'\n-25971 General Purpose Flag  0800 (2048)\n+26142 LOCAL HEADER #366     04034B50 (67324752)\n+26146 Extract Zip Spec      14 (20) '2.0'\n+26147 Extract OS            00 (0) 'MS-DOS'\n+26148 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-25973 Compression Method    0008 (8) 'Deflated'\n-25975 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-25979 CRC                   E43D22D5 (3829211861)\n-2597D Compressed Size       00000806 (2054)\n-25981 Uncompressed Size     0000147F (5247)\n-25985 Filename Length       0082 (130)\n-25987 Extra Length          0000 (0)\n-25989 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+2614A Compression Method    0008 (8) 'Deflated'\n+2614C Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+26150 CRC                   E43D22D5 (3829211861)\n+26154 Compressed Size       00000806 (2054)\n+26158 Uncompressed Size     0000147F (5247)\n+2615C Filename Length       0082 (130)\n+2615E Extra Length          0000 (0)\n+26160 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x25989: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x26160: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-25A0B PAYLOAD\n+261E2 PAYLOAD\n \n-26211 LOCAL HEADER #367     04034B50 (67324752)\n-26215 Extract Zip Spec      14 (20) '2.0'\n-26216 Extract OS            00 (0) 'MS-DOS'\n-26217 General Purpose Flag  0800 (2048)\n+269E8 LOCAL HEADER #367     04034B50 (67324752)\n+269EC Extract Zip Spec      14 (20) '2.0'\n+269ED Extract OS            00 (0) 'MS-DOS'\n+269EE General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-26219 Compression Method    0008 (8) 'Deflated'\n-2621B Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-2621F CRC                   D765846F (3613754479)\n-26223 Compressed Size       0000069E (1694)\n-26227 Uncompressed Size     00001060 (4192)\n-2622B Filename Length       0074 (116)\n-2622D Extra Length          0000 (0)\n-2622F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+269F0 Compression Method    0008 (8) 'Deflated'\n+269F2 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+269F6 CRC                   D765846F (3613754479)\n+269FA Compressed Size       0000069E (1694)\n+269FE Uncompressed Size     00001060 (4192)\n+26A02 Filename Length       0074 (116)\n+26A04 Extra Length          0000 (0)\n+26A06 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x2622F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x26A06: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-262A3 PAYLOAD\n+26A7A PAYLOAD\n \n-26941 LOCAL HEADER #368     04034B50 (67324752)\n-26945 Extract Zip Spec      14 (20) '2.0'\n-26946 Extract OS            00 (0) 'MS-DOS'\n-26947 General Purpose Flag  0800 (2048)\n+27118 LOCAL HEADER #368     04034B50 (67324752)\n+2711C Extract Zip Spec      14 (20) '2.0'\n+2711D Extract OS            00 (0) 'MS-DOS'\n+2711E General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-26949 Compression Method    0008 (8) 'Deflated'\n-2694B Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-2694F CRC                   57E394F3 (1474532595)\n-26953 Compressed Size       000006F4 (1780)\n-26957 Uncompressed Size     0000115C (4444)\n-2695B Filename Length       0074 (116)\n-2695D Extra Length          0000 (0)\n-2695F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+27120 Compression Method    0008 (8) 'Deflated'\n+27122 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+27126 CRC                   57E394F3 (1474532595)\n+2712A Compressed Size       000006F4 (1780)\n+2712E Uncompressed Size     0000115C (4444)\n+27132 Filename Length       0074 (116)\n+27134 Extra Length          0000 (0)\n+27136 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x2695F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x27136: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-269D3 PAYLOAD\n+271AA PAYLOAD\n \n-270C7 LOCAL HEADER #369     04034B50 (67324752)\n-270CB Extract Zip Spec      14 (20) '2.0'\n-270CC Extract OS            00 (0) 'MS-DOS'\n-270CD General Purpose Flag  0800 (2048)\n+2789E LOCAL HEADER #369     04034B50 (67324752)\n+278A2 Extract Zip Spec      14 (20) '2.0'\n+278A3 Extract OS            00 (0) 'MS-DOS'\n+278A4 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-270CF Compression Method    0008 (8) 'Deflated'\n-270D1 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-270D5 CRC                   4293EC30 (1116990512)\n-270D9 Compressed Size       00000889 (2185)\n-270DD Uncompressed Size     00001A2C (6700)\n-270E1 Filename Length       0084 (132)\n-270E3 Extra Length          0000 (0)\n-270E5 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+278A6 Compression Method    0008 (8) 'Deflated'\n+278A8 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+278AC CRC                   4293EC30 (1116990512)\n+278B0 Compressed Size       00000889 (2185)\n+278B4 Uncompressed Size     00001A2C (6700)\n+278B8 Filename Length       0084 (132)\n+278BA Extra Length          0000 (0)\n+278BC Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             '\n #\n-# WARNING: Offset 0x270E5: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x278BC: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-27169 PAYLOAD\n+27940 PAYLOAD\n \n-279F2 LOCAL HEADER #370     04034B50 (67324752)\n-279F6 Extract Zip Spec      14 (20) '2.0'\n-279F7 Extract OS            00 (0) 'MS-DOS'\n-279F8 General Purpose Flag  0800 (2048)\n+281C9 LOCAL HEADER #370     04034B50 (67324752)\n+281CD Extract Zip Spec      14 (20) '2.0'\n+281CE Extract OS            00 (0) 'MS-DOS'\n+281CF General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-279FA Compression Method    0008 (8) 'Deflated'\n-279FC Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-27A00 CRC                   83659368 (2204472168)\n-27A04 Compressed Size       0000086F (2159)\n-27A08 Uncompressed Size     000019EF (6639)\n-27A0C Filename Length       007E (126)\n-27A0E Extra Length          0000 (0)\n-27A10 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+281D1 Compression Method    0008 (8) 'Deflated'\n+281D3 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+281D7 CRC                   83659368 (2204472168)\n+281DB Compressed Size       0000086F (2159)\n+281DF Uncompressed Size     000019EF (6639)\n+281E3 Filename Length       007E (126)\n+281E5 Extra Length          0000 (0)\n+281E7 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x27A10: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x281E7: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-27A8E PAYLOAD\n+28265 PAYLOAD\n \n-282FD LOCAL HEADER #371     04034B50 (67324752)\n-28301 Extract Zip Spec      14 (20) '2.0'\n-28302 Extract OS            00 (0) 'MS-DOS'\n-28303 General Purpose Flag  0800 (2048)\n+28AD4 LOCAL HEADER #371     04034B50 (67324752)\n+28AD8 Extract Zip Spec      14 (20) '2.0'\n+28AD9 Extract OS            00 (0) 'MS-DOS'\n+28ADA General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-28305 Compression Method    0008 (8) 'Deflated'\n-28307 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-2830B CRC                   73F3DBE5 (1945361381)\n-2830F Compressed Size       000008C4 (2244)\n-28313 Uncompressed Size     00001AFA (6906)\n-28317 Filename Length       0084 (132)\n-28319 Extra Length          0000 (0)\n-2831B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+28ADC Compression Method    0008 (8) 'Deflated'\n+28ADE Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+28AE2 CRC                   73F3DBE5 (1945361381)\n+28AE6 Compressed Size       000008C4 (2244)\n+28AEA Uncompressed Size     00001AFA (6906)\n+28AEE Filename Length       0084 (132)\n+28AF0 Extra Length          0000 (0)\n+28AF2 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             '\n #\n-# WARNING: Offset 0x2831B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x28AF2: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-2839F PAYLOAD\n+28B76 PAYLOAD\n \n-28C63 LOCAL HEADER #372     04034B50 (67324752)\n-28C67 Extract Zip Spec      14 (20) '2.0'\n-28C68 Extract OS            00 (0) 'MS-DOS'\n-28C69 General Purpose Flag  0800 (2048)\n+2943A LOCAL HEADER #372     04034B50 (67324752)\n+2943E Extract Zip Spec      14 (20) '2.0'\n+2943F Extract OS            00 (0) 'MS-DOS'\n+29440 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-28C6B Compression Method    0008 (8) 'Deflated'\n-28C6D Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-28C71 CRC                   847E83D6 (2222883798)\n-28C75 Compressed Size       000009FD (2557)\n-28C79 Uncompressed Size     00001E83 (7811)\n-28C7D Filename Length       007E (126)\n-28C7F Extra Length          0000 (0)\n-28C81 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+29442 Compression Method    0008 (8) 'Deflated'\n+29444 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+29448 CRC                   847E83D6 (2222883798)\n+2944C Compressed Size       000009FD (2557)\n+29450 Uncompressed Size     00001E83 (7811)\n+29454 Filename Length       007E (126)\n+29456 Extra Length          0000 (0)\n+29458 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x28C81: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x29458: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-28CFF PAYLOAD\n+294D6 PAYLOAD\n \n-296FC LOCAL HEADER #373     04034B50 (67324752)\n-29700 Extract Zip Spec      14 (20) '2.0'\n-29701 Extract OS            00 (0) 'MS-DOS'\n-29702 General Purpose Flag  0800 (2048)\n+29ED3 LOCAL HEADER #373     04034B50 (67324752)\n+29ED7 Extract Zip Spec      14 (20) '2.0'\n+29ED8 Extract OS            00 (0) 'MS-DOS'\n+29ED9 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-29704 Compression Method    0008 (8) 'Deflated'\n-29706 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-2970A CRC                   8DCDE743 (2379081539)\n-2970E Compressed Size       000010D1 (4305)\n-29712 Uncompressed Size     00003DFB (15867)\n-29716 Filename Length       0084 (132)\n-29718 Extra Length          0000 (0)\n-2971A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+29EDB Compression Method    0008 (8) 'Deflated'\n+29EDD Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+29EE1 CRC                   8DCDE743 (2379081539)\n+29EE5 Compressed Size       000010D1 (4305)\n+29EE9 Uncompressed Size     00003DFB (15867)\n+29EED Filename Length       0084 (132)\n+29EEF Extra Length          0000 (0)\n+29EF1 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             '\n #\n-# WARNING: Offset 0x2971A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x29EF1: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-2979E PAYLOAD\n+29F75 PAYLOAD\n \n-2A86F LOCAL HEADER #374     04034B50 (67324752)\n-2A873 Extract Zip Spec      14 (20) '2.0'\n-2A874 Extract OS            00 (0) 'MS-DOS'\n-2A875 General Purpose Flag  0800 (2048)\n+2B046 LOCAL HEADER #374     04034B50 (67324752)\n+2B04A Extract Zip Spec      14 (20) '2.0'\n+2B04B Extract OS            00 (0) 'MS-DOS'\n+2B04C General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-2A877 Compression Method    0008 (8) 'Deflated'\n-2A879 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-2A87D CRC                   46F84C94 (1190677652)\n-2A881 Compressed Size       000010B3 (4275)\n-2A885 Uncompressed Size     00003DB7 (15799)\n-2A889 Filename Length       007E (126)\n-2A88B Extra Length          0000 (0)\n-2A88D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+2B04E Compression Method    0008 (8) 'Deflated'\n+2B050 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+2B054 CRC                   46F84C94 (1190677652)\n+2B058 Compressed Size       000010B3 (4275)\n+2B05C Uncompressed Size     00003DB7 (15799)\n+2B060 Filename Length       007E (126)\n+2B062 Extra Length          0000 (0)\n+2B064 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x2A88D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x2B064: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-2A90B PAYLOAD\n+2B0E2 PAYLOAD\n \n-2B9BE LOCAL HEADER #375     04034B50 (67324752)\n-2B9C2 Extract Zip Spec      14 (20) '2.0'\n-2B9C3 Extract OS            00 (0) 'MS-DOS'\n-2B9C4 General Purpose Flag  0800 (2048)\n+2C195 LOCAL HEADER #375     04034B50 (67324752)\n+2C199 Extract Zip Spec      14 (20) '2.0'\n+2C19A Extract OS            00 (0) 'MS-DOS'\n+2C19B General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-2B9C6 Compression Method    0008 (8) 'Deflated'\n-2B9C8 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-2B9CC CRC                   96FAF425 (2533028901)\n-2B9D0 Compressed Size       00000AE7 (2791)\n-2B9D4 Uncompressed Size     000028CF (10447)\n-2B9D8 Filename Length       0084 (132)\n-2B9DA Extra Length          0000 (0)\n-2B9DC Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+2C19D Compression Method    0008 (8) 'Deflated'\n+2C19F Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+2C1A3 CRC                   96FAF425 (2533028901)\n+2C1A7 Compressed Size       00000AE7 (2791)\n+2C1AB Uncompressed Size     000028CF (10447)\n+2C1AF Filename Length       0084 (132)\n+2C1B1 Extra Length          0000 (0)\n+2C1B3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             '\n #\n-# WARNING: Offset 0x2B9DC: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x2C1B3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-2BA60 PAYLOAD\n+2C237 PAYLOAD\n \n-2C547 LOCAL HEADER #376     04034B50 (67324752)\n-2C54B Extract Zip Spec      14 (20) '2.0'\n-2C54C Extract OS            00 (0) 'MS-DOS'\n-2C54D General Purpose Flag  0800 (2048)\n+2CD1E LOCAL HEADER #376     04034B50 (67324752)\n+2CD22 Extract Zip Spec      14 (20) '2.0'\n+2CD23 Extract OS            00 (0) 'MS-DOS'\n+2CD24 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-2C54F Compression Method    0008 (8) 'Deflated'\n-2C551 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-2C555 CRC                   77DFCD97 (2011155863)\n-2C559 Compressed Size       00000C16 (3094)\n-2C55D Uncompressed Size     00002C4A (11338)\n-2C561 Filename Length       007E (126)\n-2C563 Extra Length          0000 (0)\n-2C565 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+2CD26 Compression Method    0008 (8) 'Deflated'\n+2CD28 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+2CD2C CRC                   77DFCD97 (2011155863)\n+2CD30 Compressed Size       00000C16 (3094)\n+2CD34 Uncompressed Size     00002C4A (11338)\n+2CD38 Filename Length       007E (126)\n+2CD3A Extra Length          0000 (0)\n+2CD3C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x2C565: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x2CD3C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-2C5E3 PAYLOAD\n+2CDBA PAYLOAD\n \n-2D1F9 LOCAL HEADER #377     04034B50 (67324752)\n-2D1FD Extract Zip Spec      14 (20) '2.0'\n-2D1FE Extract OS            00 (0) 'MS-DOS'\n-2D1FF General Purpose Flag  0800 (2048)\n+2D9D0 LOCAL HEADER #377     04034B50 (67324752)\n+2D9D4 Extract Zip Spec      14 (20) '2.0'\n+2D9D5 Extract OS            00 (0) 'MS-DOS'\n+2D9D6 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-2D201 Compression Method    0008 (8) 'Deflated'\n-2D203 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-2D207 CRC                   249CCFCD (614256589)\n-2D20B Compressed Size       0000164B (5707)\n-2D20F Uncompressed Size     00005101 (20737)\n-2D213 Filename Length       0084 (132)\n-2D215 Extra Length          0000 (0)\n-2D217 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+2D9D8 Compression Method    0008 (8) 'Deflated'\n+2D9DA Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+2D9DE CRC                   249CCFCD (614256589)\n+2D9E2 Compressed Size       0000164B (5707)\n+2D9E6 Uncompressed Size     00005101 (20737)\n+2D9EA Filename Length       0084 (132)\n+2D9EC Extra Length          0000 (0)\n+2D9EE Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             '\n #\n-# WARNING: Offset 0x2D217: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x2D9EE: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-2D29B PAYLOAD\n+2DA72 PAYLOAD\n \n-2E8E6 LOCAL HEADER #378     04034B50 (67324752)\n-2E8EA Extract Zip Spec      14 (20) '2.0'\n-2E8EB Extract OS            00 (0) 'MS-DOS'\n-2E8EC General Purpose Flag  0800 (2048)\n+2F0BD LOCAL HEADER #378     04034B50 (67324752)\n+2F0C1 Extract Zip Spec      14 (20) '2.0'\n+2F0C2 Extract OS            00 (0) 'MS-DOS'\n+2F0C3 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-2E8EE Compression Method    0008 (8) 'Deflated'\n-2E8F0 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-2E8F4 CRC                   46DA6369 (1188717417)\n-2E8F8 Compressed Size       000010B4 (4276)\n-2E8FC Uncompressed Size     00003DB7 (15799)\n-2E900 Filename Length       007E (126)\n-2E902 Extra Length          0000 (0)\n-2E904 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+2F0C5 Compression Method    0008 (8) 'Deflated'\n+2F0C7 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+2F0CB CRC                   46DA6369 (1188717417)\n+2F0CF Compressed Size       000010B4 (4276)\n+2F0D3 Uncompressed Size     00003DB7 (15799)\n+2F0D7 Filename Length       007E (126)\n+2F0D9 Extra Length          0000 (0)\n+2F0DB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x2E904: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x2F0DB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-2E982 PAYLOAD\n+2F159 PAYLOAD\n \n-2FA36 LOCAL HEADER #379     04034B50 (67324752)\n-2FA3A Extract Zip Spec      14 (20) '2.0'\n-2FA3B Extract OS            00 (0) 'MS-DOS'\n-2FA3C General Purpose Flag  0800 (2048)\n+3020D LOCAL HEADER #379     04034B50 (67324752)\n+30211 Extract Zip Spec      14 (20) '2.0'\n+30212 Extract OS            00 (0) 'MS-DOS'\n+30213 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-2FA3E Compression Method    0008 (8) 'Deflated'\n-2FA40 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-2FA44 CRC                   6668C19E (1718141342)\n-2FA48 Compressed Size       00001899 (6297)\n-2FA4C Uncompressed Size     00009C3B (39995)\n-2FA50 Filename Length       0084 (132)\n-2FA52 Extra Length          0000 (0)\n-2FA54 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+30215 Compression Method    0008 (8) 'Deflated'\n+30217 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+3021B CRC                   6668C19E (1718141342)\n+3021F Compressed Size       00001899 (6297)\n+30223 Uncompressed Size     00009C3B (39995)\n+30227 Filename Length       0084 (132)\n+30229 Extra Length          0000 (0)\n+3022B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             '\n #\n-# WARNING: Offset 0x2FA54: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x3022B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-2FAD8 PAYLOAD\n+302AF PAYLOAD\n \n-31371 LOCAL HEADER #380     04034B50 (67324752)\n-31375 Extract Zip Spec      14 (20) '2.0'\n-31376 Extract OS            00 (0) 'MS-DOS'\n-31377 General Purpose Flag  0800 (2048)\n+31B48 LOCAL HEADER #380     04034B50 (67324752)\n+31B4C Extract Zip Spec      14 (20) '2.0'\n+31B4D Extract OS            00 (0) 'MS-DOS'\n+31B4E General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-31379 Compression Method    0008 (8) 'Deflated'\n-3137B Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-3137F CRC                   23E20FDA (602017754)\n-31383 Compressed Size       00000C17 (3095)\n-31387 Uncompressed Size     00002C4A (11338)\n-3138B Filename Length       007E (126)\n-3138D Extra Length          0000 (0)\n-3138F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+31B50 Compression Method    0008 (8) 'Deflated'\n+31B52 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+31B56 CRC                   23E20FDA (602017754)\n+31B5A Compressed Size       00000C17 (3095)\n+31B5E Uncompressed Size     00002C4A (11338)\n+31B62 Filename Length       007E (126)\n+31B64 Extra Length          0000 (0)\n+31B66 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x3138F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x31B66: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-3140D PAYLOAD\n+31BE4 PAYLOAD\n \n-32024 LOCAL HEADER #381     04034B50 (67324752)\n-32028 Extract Zip Spec      14 (20) '2.0'\n-32029 Extract OS            00 (0) 'MS-DOS'\n-3202A General Purpose Flag  0800 (2048)\n+327FB LOCAL HEADER #381     04034B50 (67324752)\n+327FF Extract Zip Spec      14 (20) '2.0'\n+32800 Extract OS            00 (0) 'MS-DOS'\n+32801 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-3202C Compression Method    0008 (8) 'Deflated'\n-3202E Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-32032 CRC                   90D14EC3 (2429636291)\n-32036 Compressed Size       0000085E (2142)\n-3203A Uncompressed Size     00001ABD (6845)\n-3203E Filename Length       0068 (104)\n-32040 Extra Length          0000 (0)\n-32042 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+32803 Compression Method    0008 (8) 'Deflated'\n+32805 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+32809 CRC                   90D14EC3 (2429636291)\n+3280D Compressed Size       0000085E (2142)\n+32811 Uncompressed Size     00001ABD (6845)\n+32815 Filename Length       0068 (104)\n+32817 Extra Length          0000 (0)\n+32819 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x32042: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x32819: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-320AA PAYLOAD\n+32881 PAYLOAD\n \n-32908 LOCAL HEADER #382     04034B50 (67324752)\n-3290C Extract Zip Spec      14 (20) '2.0'\n-3290D Extract OS            00 (0) 'MS-DOS'\n-3290E General Purpose Flag  0800 (2048)\n+330DF LOCAL HEADER #382     04034B50 (67324752)\n+330E3 Extract Zip Spec      14 (20) '2.0'\n+330E4 Extract OS            00 (0) 'MS-DOS'\n+330E5 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-32910 Compression Method    0008 (8) 'Deflated'\n-32912 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-32916 CRC                   F19E6303 (4053689091)\n-3291A Compressed Size       0000063F (1599)\n-3291E Uncompressed Size     00000ED8 (3800)\n-32922 Filename Length       0074 (116)\n-32924 Extra Length          0000 (0)\n-32926 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+330E7 Compression Method    0008 (8) 'Deflated'\n+330E9 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+330ED CRC                   F19E6303 (4053689091)\n+330F1 Compressed Size       0000063F (1599)\n+330F5 Uncompressed Size     00000ED8 (3800)\n+330F9 Filename Length       0074 (116)\n+330FB Extra Length          0000 (0)\n+330FD Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x32926: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x330FD: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-3299A PAYLOAD\n+33171 PAYLOAD\n \n-32FD9 LOCAL HEADER #383     04034B50 (67324752)\n-32FDD Extract Zip Spec      14 (20) '2.0'\n-32FDE Extract OS            00 (0) 'MS-DOS'\n-32FDF General Purpose Flag  0800 (2048)\n+337B0 LOCAL HEADER #383     04034B50 (67324752)\n+337B4 Extract Zip Spec      14 (20) '2.0'\n+337B5 Extract OS            00 (0) 'MS-DOS'\n+337B6 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-32FE1 Compression Method    0008 (8) 'Deflated'\n-32FE3 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-32FE7 CRC                   51B4F745 (1370814277)\n-32FEB Compressed Size       0000075A (1882)\n-32FEF Uncompressed Size     000016D7 (5847)\n-32FF3 Filename Length       007A (122)\n-32FF5 Extra Length          0000 (0)\n-32FF7 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+337B8 Compression Method    0008 (8) 'Deflated'\n+337BA Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+337BE CRC                   51B4F745 (1370814277)\n+337C2 Compressed Size       0000075A (1882)\n+337C6 Uncompressed Size     000016D7 (5847)\n+337CA Filename Length       007A (122)\n+337CC Extra Length          0000 (0)\n+337CE Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x32FF7: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x337CE: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-33071 PAYLOAD\n+33848 PAYLOAD\n \n-337CB LOCAL HEADER #384     04034B50 (67324752)\n-337CF Extract Zip Spec      14 (20) '2.0'\n-337D0 Extract OS            00 (0) 'MS-DOS'\n-337D1 General Purpose Flag  0800 (2048)\n+33FA2 LOCAL HEADER #384     04034B50 (67324752)\n+33FA6 Extract Zip Spec      14 (20) '2.0'\n+33FA7 Extract OS            00 (0) 'MS-DOS'\n+33FA8 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-337D3 Compression Method    0008 (8) 'Deflated'\n-337D5 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-337D9 CRC                   357DA477 (897426551)\n-337DD Compressed Size       0000039F (927)\n-337E1 Uncompressed Size     000006C6 (1734)\n-337E5 Filename Length       0072 (114)\n-337E7 Extra Length          0000 (0)\n-337E9 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+33FAA Compression Method    0008 (8) 'Deflated'\n+33FAC Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+33FB0 CRC                   357DA477 (897426551)\n+33FB4 Compressed Size       0000039F (927)\n+33FB8 Uncompressed Size     000006C6 (1734)\n+33FBC Filename Length       0072 (114)\n+33FBE Extra Length          0000 (0)\n+33FC0 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x337E9: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x33FC0: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-3385B PAYLOAD\n+34032 PAYLOAD\n \n-33BFA LOCAL HEADER #385     04034B50 (67324752)\n-33BFE Extract Zip Spec      14 (20) '2.0'\n-33BFF Extract OS            00 (0) 'MS-DOS'\n-33C00 General Purpose Flag  0800 (2048)\n+343D1 LOCAL HEADER #385     04034B50 (67324752)\n+343D5 Extract Zip Spec      14 (20) '2.0'\n+343D6 Extract OS            00 (0) 'MS-DOS'\n+343D7 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-33C02 Compression Method    0008 (8) 'Deflated'\n-33C04 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-33C08 CRC                   F9CAC97B (4190816635)\n-33C0C Compressed Size       000004CB (1227)\n-33C10 Uncompressed Size     000009BC (2492)\n-33C14 Filename Length       006F (111)\n-33C16 Extra Length          0000 (0)\n-33C18 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+343D9 Compression Method    0008 (8) 'Deflated'\n+343DB Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+343DF CRC                   F9CAC97B (4190816635)\n+343E3 Compressed Size       000004CB (1227)\n+343E7 Uncompressed Size     000009BC (2492)\n+343EB Filename Length       006F (111)\n+343ED Extra Length          0000 (0)\n+343EF Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x33C18: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x343EF: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-33C87 PAYLOAD\n+3445E PAYLOAD\n \n-34152 LOCAL HEADER #386     04034B50 (67324752)\n-34156 Extract Zip Spec      14 (20) '2.0'\n-34157 Extract OS            00 (0) 'MS-DOS'\n-34158 General Purpose Flag  0800 (2048)\n+34929 LOCAL HEADER #386     04034B50 (67324752)\n+3492D Extract Zip Spec      14 (20) '2.0'\n+3492E Extract OS            00 (0) 'MS-DOS'\n+3492F General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-3415A Compression Method    0008 (8) 'Deflated'\n-3415C Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-34160 CRC                   9DEB8C8B (2649459851)\n-34164 Compressed Size       000004E7 (1255)\n-34168 Uncompressed Size     00000A07 (2567)\n-3416C Filename Length       0075 (117)\n-3416E Extra Length          0000 (0)\n-34170 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+34931 Compression Method    0008 (8) 'Deflated'\n+34933 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+34937 CRC                   9DEB8C8B (2649459851)\n+3493B Compressed Size       000004E7 (1255)\n+3493F Uncompressed Size     00000A07 (2567)\n+34943 Filename Length       0075 (117)\n+34945 Extra Length          0000 (0)\n+34947 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x34170: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x34947: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-341E5 PAYLOAD\n+349BC PAYLOAD\n \n-346CC LOCAL HEADER #387     04034B50 (67324752)\n-346D0 Extract Zip Spec      14 (20) '2.0'\n-346D1 Extract OS            00 (0) 'MS-DOS'\n-346D2 General Purpose Flag  0800 (2048)\n+34EA3 LOCAL HEADER #387     04034B50 (67324752)\n+34EA7 Extract Zip Spec      14 (20) '2.0'\n+34EA8 Extract OS            00 (0) 'MS-DOS'\n+34EA9 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-346D4 Compression Method    0008 (8) 'Deflated'\n-346D6 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-346DA CRC                   85B17459 (2242999385)\n-346DE Compressed Size       0000060E (1550)\n-346E2 Uncompressed Size     00000DDE (3550)\n-346E6 Filename Length       006F (111)\n-346E8 Extra Length          0000 (0)\n-346EA Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+34EAB Compression Method    0008 (8) 'Deflated'\n+34EAD Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+34EB1 CRC                   85B17459 (2242999385)\n+34EB5 Compressed Size       0000060E (1550)\n+34EB9 Uncompressed Size     00000DDE (3550)\n+34EBD Filename Length       006F (111)\n+34EBF Extra Length          0000 (0)\n+34EC1 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x346EA: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x34EC1: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-34759 PAYLOAD\n+34F30 PAYLOAD\n \n-34D67 LOCAL HEADER #388     04034B50 (67324752)\n-34D6B Extract Zip Spec      14 (20) '2.0'\n-34D6C Extract OS            00 (0) 'MS-DOS'\n-34D6D General Purpose Flag  0800 (2048)\n+3553E LOCAL HEADER #388     04034B50 (67324752)\n+35542 Extract Zip Spec      14 (20) '2.0'\n+35543 Extract OS            00 (0) 'MS-DOS'\n+35544 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-34D6F Compression Method    0008 (8) 'Deflated'\n-34D71 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-34D75 CRC                   9C229073 (2619510899)\n-34D79 Compressed Size       00000330 (816)\n-34D7D Uncompressed Size     000005CF (1487)\n-34D81 Filename Length       007A (122)\n-34D83 Extra Length          0000 (0)\n-34D85 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+35546 Compression Method    0008 (8) 'Deflated'\n+35548 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+3554C CRC                   9C229073 (2619510899)\n+35550 Compressed Size       00000330 (816)\n+35554 Uncompressed Size     000005CF (1487)\n+35558 Filename Length       007A (122)\n+3555A Extra Length          0000 (0)\n+3555C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x34D85: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x3555C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-34DFF PAYLOAD\n+355D6 PAYLOAD\n \n-3512F LOCAL HEADER #389     04034B50 (67324752)\n-35133 Extract Zip Spec      14 (20) '2.0'\n-35134 Extract OS            00 (0) 'MS-DOS'\n-35135 General Purpose Flag  0800 (2048)\n+35906 LOCAL HEADER #389     04034B50 (67324752)\n+3590A Extract Zip Spec      14 (20) '2.0'\n+3590B Extract OS            00 (0) 'MS-DOS'\n+3590C General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-35137 Compression Method    0008 (8) 'Deflated'\n-35139 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-3513D CRC                   A57691CD (2776011213)\n-35141 Compressed Size       00000316 (790)\n-35145 Uncompressed Size     000005C2 (1474)\n-35149 Filename Length       007A (122)\n-3514B Extra Length          0000 (0)\n-3514D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+3590E Compression Method    0008 (8) 'Deflated'\n+35910 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+35914 CRC                   A57691CD (2776011213)\n+35918 Compressed Size       00000316 (790)\n+3591C Uncompressed Size     000005C2 (1474)\n+35920 Filename Length       007A (122)\n+35922 Extra Length          0000 (0)\n+35924 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x3514D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x35924: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-351C7 PAYLOAD\n+3599E PAYLOAD\n \n-354DD LOCAL HEADER #390     04034B50 (67324752)\n-354E1 Extract Zip Spec      14 (20) '2.0'\n-354E2 Extract OS            00 (0) 'MS-DOS'\n-354E3 General Purpose Flag  0800 (2048)\n+35CB4 LOCAL HEADER #390     04034B50 (67324752)\n+35CB8 Extract Zip Spec      14 (20) '2.0'\n+35CB9 Extract OS            00 (0) 'MS-DOS'\n+35CBA General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-354E5 Compression Method    0008 (8) 'Deflated'\n-354E7 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-354EB CRC                   6CD31445 (1825772613)\n-354EF Compressed Size       000003CA (970)\n-354F3 Uncompressed Size     0000073A (1850)\n-354F7 Filename Length       0079 (121)\n-354F9 Extra Length          0000 (0)\n-354FB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+35CBC Compression Method    0008 (8) 'Deflated'\n+35CBE Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+35CC2 CRC                   6CD31445 (1825772613)\n+35CC6 Compressed Size       000003CA (970)\n+35CCA Uncompressed Size     0000073A (1850)\n+35CCE Filename Length       0079 (121)\n+35CD0 Extra Length          0000 (0)\n+35CD2 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x354FB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x35CD2: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-35574 PAYLOAD\n+35D4B PAYLOAD\n \n-3593E LOCAL HEADER #391     04034B50 (67324752)\n-35942 Extract Zip Spec      14 (20) '2.0'\n-35943 Extract OS            00 (0) 'MS-DOS'\n-35944 General Purpose Flag  0800 (2048)\n+36115 LOCAL HEADER #391     04034B50 (67324752)\n+36119 Extract Zip Spec      14 (20) '2.0'\n+3611A Extract OS            00 (0) 'MS-DOS'\n+3611B General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-35946 Compression Method    0008 (8) 'Deflated'\n-35948 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-3594C CRC                   C97DF8D6 (3380476118)\n-35950 Compressed Size       00000522 (1314)\n-35954 Uncompressed Size     00000A92 (2706)\n-35958 Filename Length       0077 (119)\n-3595A Extra Length          0000 (0)\n-3595C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+3611D Compression Method    0008 (8) 'Deflated'\n+3611F Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+36123 CRC                   C97DF8D6 (3380476118)\n+36127 Compressed Size       00000522 (1314)\n+3612B Uncompressed Size     00000A92 (2706)\n+3612F Filename Length       0077 (119)\n+36131 Extra Length          0000 (0)\n+36133 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x3595C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x36133: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-359D3 PAYLOAD\n+361AA PAYLOAD\n \n-35EF5 LOCAL HEADER #392     04034B50 (67324752)\n-35EF9 Extract Zip Spec      14 (20) '2.0'\n-35EFA Extract OS            00 (0) 'MS-DOS'\n-35EFB General Purpose Flag  0800 (2048)\n+366CC LOCAL HEADER #392     04034B50 (67324752)\n+366D0 Extract Zip Spec      14 (20) '2.0'\n+366D1 Extract OS            00 (0) 'MS-DOS'\n+366D2 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-35EFD Compression Method    0008 (8) 'Deflated'\n-35EFF Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-35F03 CRC                   0B04A112 (184852754)\n-35F07 Compressed Size       000003C7 (967)\n-35F0B Uncompressed Size     00000795 (1941)\n-35F0F Filename Length       006C (108)\n-35F11 Extra Length          0000 (0)\n-35F13 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+366D4 Compression Method    0008 (8) 'Deflated'\n+366D6 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+366DA CRC                   0B04A112 (184852754)\n+366DE Compressed Size       000003C7 (967)\n+366E2 Uncompressed Size     00000795 (1941)\n+366E6 Filename Length       006C (108)\n+366E8 Extra Length          0000 (0)\n+366EA Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x35F13: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x366EA: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-35F7F PAYLOAD\n+36756 PAYLOAD\n \n-36346 LOCAL HEADER #393     04034B50 (67324752)\n-3634A Extract Zip Spec      14 (20) '2.0'\n-3634B Extract OS            00 (0) 'MS-DOS'\n-3634C General Purpose Flag  0800 (2048)\n+36B1D LOCAL HEADER #393     04034B50 (67324752)\n+36B21 Extract Zip Spec      14 (20) '2.0'\n+36B22 Extract OS            00 (0) 'MS-DOS'\n+36B23 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-3634E Compression Method    0008 (8) 'Deflated'\n-36350 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-36354 CRC                   9A51A289 (2589041289)\n-36358 Compressed Size       00000425 (1061)\n-3635C Uncompressed Size     000008AB (2219)\n-36360 Filename Length       0080 (128)\n-36362 Extra Length          0000 (0)\n-36364 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+36B25 Compression Method    0008 (8) 'Deflated'\n+36B27 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+36B2B CRC                   9A51A289 (2589041289)\n+36B2F Compressed Size       00000425 (1061)\n+36B33 Uncompressed Size     000008AB (2219)\n+36B37 Filename Length       0080 (128)\n+36B39 Extra Length          0000 (0)\n+36B3B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x36364: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x36B3B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-363E4 PAYLOAD\n+36BBB PAYLOAD\n \n-36809 LOCAL HEADER #394     04034B50 (67324752)\n-3680D Extract Zip Spec      14 (20) '2.0'\n-3680E Extract OS            00 (0) 'MS-DOS'\n-3680F General Purpose Flag  0800 (2048)\n+36FE0 LOCAL HEADER #394     04034B50 (67324752)\n+36FE4 Extract Zip Spec      14 (20) '2.0'\n+36FE5 Extract OS            00 (0) 'MS-DOS'\n+36FE6 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-36811 Compression Method    0008 (8) 'Deflated'\n-36813 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-36817 CRC                   BEAE3D9C (3199090076)\n-3681B Compressed Size       0000127D (4733)\n-3681F Uncompressed Size     0000396F (14703)\n-36823 Filename Length       0061 (97)\n-36825 Extra Length          0000 (0)\n-36827 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+36FE8 Compression Method    0008 (8) 'Deflated'\n+36FEA Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+36FEE CRC                   BEAE3D9C (3199090076)\n+36FF2 Compressed Size       0000127D (4733)\n+36FF6 Uncompressed Size     0000396F (14703)\n+36FFA Filename Length       0061 (97)\n+36FFC Extra Length          0000 (0)\n+36FFE Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x36827: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x36FFE: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-36888 PAYLOAD\n+3705F PAYLOAD\n \n-37B05 LOCAL HEADER #395     04034B50 (67324752)\n-37B09 Extract Zip Spec      14 (20) '2.0'\n-37B0A Extract OS            00 (0) 'MS-DOS'\n-37B0B General Purpose Flag  0800 (2048)\n+382DC LOCAL HEADER #395     04034B50 (67324752)\n+382E0 Extract Zip Spec      14 (20) '2.0'\n+382E1 Extract OS            00 (0) 'MS-DOS'\n+382E2 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-37B0D Compression Method    0008 (8) 'Deflated'\n-37B0F Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-37B13 CRC                   28034B81 (671304577)\n-37B17 Compressed Size       00000540 (1344)\n-37B1B Uncompressed Size     00000E44 (3652)\n-37B1F Filename Length       0079 (121)\n-37B21 Extra Length          0000 (0)\n-37B23 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+382E4 Compression Method    0008 (8) 'Deflated'\n+382E6 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+382EA CRC                   28034B81 (671304577)\n+382EE Compressed Size       00000540 (1344)\n+382F2 Uncompressed Size     00000E44 (3652)\n+382F6 Filename Length       0079 (121)\n+382F8 Extra Length          0000 (0)\n+382FA Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x37B23: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x382FA: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-37B9C PAYLOAD\n+38373 PAYLOAD\n \n-380DC LOCAL HEADER #396     04034B50 (67324752)\n-380E0 Extract Zip Spec      14 (20) '2.0'\n-380E1 Extract OS            00 (0) 'MS-DOS'\n-380E2 General Purpose Flag  0800 (2048)\n+388B3 LOCAL HEADER #396     04034B50 (67324752)\n+388B7 Extract Zip Spec      14 (20) '2.0'\n+388B8 Extract OS            00 (0) 'MS-DOS'\n+388B9 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-380E4 Compression Method    0008 (8) 'Deflated'\n-380E6 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-380EA CRC                   29D620BA (701898938)\n-380EE Compressed Size       00000BC2 (3010)\n-380F2 Uncompressed Size     00002421 (9249)\n-380F6 Filename Length       007E (126)\n-380F8 Extra Length          0000 (0)\n-380FA Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+388BB Compression Method    0008 (8) 'Deflated'\n+388BD Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+388C1 CRC                   29D620BA (701898938)\n+388C5 Compressed Size       00000BC2 (3010)\n+388C9 Uncompressed Size     00002421 (9249)\n+388CD Filename Length       007E (126)\n+388CF Extra Length          0000 (0)\n+388D1 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x380FA: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x388D1: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-38178 PAYLOAD\n+3894F PAYLOAD\n \n-38D3A LOCAL HEADER #397     04034B50 (67324752)\n-38D3E Extract Zip Spec      14 (20) '2.0'\n-38D3F Extract OS            00 (0) 'MS-DOS'\n-38D40 General Purpose Flag  0800 (2048)\n+39511 LOCAL HEADER #397     04034B50 (67324752)\n+39515 Extract Zip Spec      14 (20) '2.0'\n+39516 Extract OS            00 (0) 'MS-DOS'\n+39517 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-38D42 Compression Method    0008 (8) 'Deflated'\n-38D44 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-38D48 CRC                   9ED7BE90 (2664939152)\n-38D4C Compressed Size       00001217 (4631)\n-38D50 Uncompressed Size     000036E7 (14055)\n-38D54 Filename Length       0077 (119)\n-38D56 Extra Length          0000 (0)\n-38D58 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+39519 Compression Method    0008 (8) 'Deflated'\n+3951B Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+3951F CRC                   9ED7BE90 (2664939152)\n+39523 Compressed Size       00001217 (4631)\n+39527 Uncompressed Size     000036E7 (14055)\n+3952B Filename Length       0077 (119)\n+3952D Extra Length          0000 (0)\n+3952F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x38D58: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x3952F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-38DCF PAYLOAD\n+395A6 PAYLOAD\n \n-39FE6 LOCAL HEADER #398     04034B50 (67324752)\n-39FEA Extract Zip Spec      14 (20) '2.0'\n-39FEB Extract OS            00 (0) 'MS-DOS'\n-39FEC General Purpose Flag  0800 (2048)\n+3A7BD LOCAL HEADER #398     04034B50 (67324752)\n+3A7C1 Extract Zip Spec      14 (20) '2.0'\n+3A7C2 Extract OS            00 (0) 'MS-DOS'\n+3A7C3 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-39FEE Compression Method    0008 (8) 'Deflated'\n-39FF0 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-39FF4 CRC                   B51FDD91 (3038764433)\n-39FF8 Compressed Size       0000156C (5484)\n-39FFC Uncompressed Size     00004792 (18322)\n-3A000 Filename Length       0077 (119)\n-3A002 Extra Length          0000 (0)\n-3A004 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+3A7C5 Compression Method    0008 (8) 'Deflated'\n+3A7C7 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+3A7CB CRC                   B51FDD91 (3038764433)\n+3A7CF Compressed Size       0000156C (5484)\n+3A7D3 Uncompressed Size     00004792 (18322)\n+3A7D7 Filename Length       0077 (119)\n+3A7D9 Extra Length          0000 (0)\n+3A7DB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x3A004: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x3A7DB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-3A07B PAYLOAD\n+3A852 PAYLOAD\n \n-3B5E7 LOCAL HEADER #399     04034B50 (67324752)\n-3B5EB Extract Zip Spec      14 (20) '2.0'\n-3B5EC Extract OS            00 (0) 'MS-DOS'\n-3B5ED General Purpose Flag  0800 (2048)\n+3BDBE LOCAL HEADER #399     04034B50 (67324752)\n+3BDC2 Extract Zip Spec      14 (20) '2.0'\n+3BDC3 Extract OS            00 (0) 'MS-DOS'\n+3BDC4 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-3B5EF Compression Method    0008 (8) 'Deflated'\n-3B5F1 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-3B5F5 CRC                   27CFA48B (667919499)\n-3B5F9 Compressed Size       000018CC (6348)\n-3B5FD Uncompressed Size     00005DDC (24028)\n-3B601 Filename Length       0079 (121)\n-3B603 Extra Length          0000 (0)\n-3B605 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+3BDC6 Compression Method    0008 (8) 'Deflated'\n+3BDC8 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+3BDCC CRC                   27CFA48B (667919499)\n+3BDD0 Compressed Size       000018CC (6348)\n+3BDD4 Uncompressed Size     00005DDC (24028)\n+3BDD8 Filename Length       0079 (121)\n+3BDDA Extra Length          0000 (0)\n+3BDDC Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x3B605: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x3BDDC: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-3B67E PAYLOAD\n+3BE55 PAYLOAD\n \n-3CF4A LOCAL HEADER #400     04034B50 (67324752)\n-3CF4E Extract Zip Spec      14 (20) '2.0'\n-3CF4F Extract OS            00 (0) 'MS-DOS'\n-3CF50 General Purpose Flag  0800 (2048)\n+3D721 LOCAL HEADER #400     04034B50 (67324752)\n+3D725 Extract Zip Spec      14 (20) '2.0'\n+3D726 Extract OS            00 (0) 'MS-DOS'\n+3D727 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-3CF52 Compression Method    0008 (8) 'Deflated'\n-3CF54 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-3CF58 CRC                   620AB78F (1644869519)\n-3CF5C Compressed Size       000012CF (4815)\n-3CF60 Uncompressed Size     00003B3A (15162)\n-3CF64 Filename Length       007D (125)\n-3CF66 Extra Length          0000 (0)\n-3CF68 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+3D729 Compression Method    0008 (8) 'Deflated'\n+3D72B Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+3D72F CRC                   620AB78F (1644869519)\n+3D733 Compressed Size       000012CF (4815)\n+3D737 Uncompressed Size     00003B3A (15162)\n+3D73B Filename Length       007D (125)\n+3D73D Extra Length          0000 (0)\n+3D73F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x3CF68: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x3D73F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-3CFE5 PAYLOAD\n+3D7BC PAYLOAD\n \n-3E2B4 LOCAL HEADER #401     04034B50 (67324752)\n-3E2B8 Extract Zip Spec      14 (20) '2.0'\n-3E2B9 Extract OS            00 (0) 'MS-DOS'\n-3E2BA General Purpose Flag  0800 (2048)\n+3EA8B LOCAL HEADER #401     04034B50 (67324752)\n+3EA8F Extract Zip Spec      14 (20) '2.0'\n+3EA90 Extract OS            00 (0) 'MS-DOS'\n+3EA91 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-3E2BC Compression Method    0008 (8) 'Deflated'\n-3E2BE Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-3E2C2 CRC                   937A07E6 (2474248166)\n-3E2C6 Compressed Size       000013A9 (5033)\n-3E2CA Uncompressed Size     00004869 (18537)\n-3E2CE Filename Length       007D (125)\n-3E2D0 Extra Length          0000 (0)\n-3E2D2 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+3EA93 Compression Method    0008 (8) 'Deflated'\n+3EA95 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+3EA99 CRC                   937A07E6 (2474248166)\n+3EA9D Compressed Size       000013A9 (5033)\n+3EAA1 Uncompressed Size     00004869 (18537)\n+3EAA5 Filename Length       007D (125)\n+3EAA7 Extra Length          0000 (0)\n+3EAA9 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x3E2D2: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x3EAA9: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-3E34F PAYLOAD\n+3EB26 PAYLOAD\n \n-3F6F8 LOCAL HEADER #402     04034B50 (67324752)\n-3F6FC Extract Zip Spec      14 (20) '2.0'\n-3F6FD Extract OS            00 (0) 'MS-DOS'\n-3F6FE General Purpose Flag  0800 (2048)\n+3FECF LOCAL HEADER #402     04034B50 (67324752)\n+3FED3 Extract Zip Spec      14 (20) '2.0'\n+3FED4 Extract OS            00 (0) 'MS-DOS'\n+3FED5 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-3F700 Compression Method    0008 (8) 'Deflated'\n-3F702 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-3F706 CRC                   53DFF1D7 (1407185367)\n-3F70A Compressed Size       00000442 (1090)\n-3F70E Uncompressed Size     00000ADF (2783)\n-3F712 Filename Length       0081 (129)\n-3F714 Extra Length          0000 (0)\n-3F716 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+3FED7 Compression Method    0008 (8) 'Deflated'\n+3FED9 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+3FEDD CRC                   53DFF1D7 (1407185367)\n+3FEE1 Compressed Size       00000442 (1090)\n+3FEE5 Uncompressed Size     00000ADF (2783)\n+3FEE9 Filename Length       0081 (129)\n+3FEEB Extra Length          0000 (0)\n+3FEED Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x3F716: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x3FEED: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-3F797 PAYLOAD\n+3FF6E PAYLOAD\n \n-3FBD9 LOCAL HEADER #403     04034B50 (67324752)\n-3FBDD Extract Zip Spec      14 (20) '2.0'\n-3FBDE Extract OS            00 (0) 'MS-DOS'\n-3FBDF General Purpose Flag  0800 (2048)\n+403B0 LOCAL HEADER #403     04034B50 (67324752)\n+403B4 Extract Zip Spec      14 (20) '2.0'\n+403B5 Extract OS            00 (0) 'MS-DOS'\n+403B6 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-3FBE1 Compression Method    0008 (8) 'Deflated'\n-3FBE3 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-3FBE7 CRC                   6D3A5445 (1832539205)\n-3FBEB Compressed Size       000003FF (1023)\n-3FBEF Uncompressed Size     00000939 (2361)\n-3FBF3 Filename Length       007D (125)\n-3FBF5 Extra Length          0000 (0)\n-3FBF7 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+403B8 Compression Method    0008 (8) 'Deflated'\n+403BA Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+403BE CRC                   6D3A5445 (1832539205)\n+403C2 Compressed Size       000003FF (1023)\n+403C6 Uncompressed Size     00000939 (2361)\n+403CA Filename Length       007D (125)\n+403CC Extra Length          0000 (0)\n+403CE Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x3FBF7: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x403CE: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-3FC74 PAYLOAD\n+4044B PAYLOAD\n \n-40073 LOCAL HEADER #404     04034B50 (67324752)\n-40077 Extract Zip Spec      14 (20) '2.0'\n-40078 Extract OS            00 (0) 'MS-DOS'\n-40079 General Purpose Flag  0800 (2048)\n+4084A LOCAL HEADER #404     04034B50 (67324752)\n+4084E Extract Zip Spec      14 (20) '2.0'\n+4084F Extract OS            00 (0) 'MS-DOS'\n+40850 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-4007B Compression Method    0008 (8) 'Deflated'\n-4007D Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-40081 CRC                   5C6B1924 (1550522660)\n-40085 Compressed Size       000005D8 (1496)\n-40089 Uncompressed Size     00000DDD (3549)\n-4008D Filename Length       008C (140)\n-4008F Extra Length          0000 (0)\n-40091 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+40852 Compression Method    0008 (8) 'Deflated'\n+40854 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+40858 CRC                   5C6B1924 (1550522660)\n+4085C Compressed Size       000005D8 (1496)\n+40860 Uncompressed Size     00000DDD (3549)\n+40864 Filename Length       008C (140)\n+40866 Extra Length          0000 (0)\n+40868 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             XXXXXXXX'\n #\n-# WARNING: Offset 0x40091: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x40868: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-4011D PAYLOAD\n+408F4 PAYLOAD\n \n-406F5 LOCAL HEADER #405     04034B50 (67324752)\n-406F9 Extract Zip Spec      14 (20) '2.0'\n-406FA Extract OS            00 (0) 'MS-DOS'\n-406FB General Purpose Flag  0800 (2048)\n+40ECC LOCAL HEADER #405     04034B50 (67324752)\n+40ED0 Extract Zip Spec      14 (20) '2.0'\n+40ED1 Extract OS            00 (0) 'MS-DOS'\n+40ED2 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-406FD Compression Method    0008 (8) 'Deflated'\n-406FF Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-40703 CRC                   C7DF88BB (3353315515)\n-40707 Compressed Size       00001C38 (7224)\n-4070B Uncompressed Size     00009335 (37685)\n-4070F Filename Length       0077 (119)\n-40711 Extra Length          0000 (0)\n-40713 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+40ED4 Compression Method    0008 (8) 'Deflated'\n+40ED6 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+40EDA CRC                   C7DF88BB (3353315515)\n+40EDE Compressed Size       00001C38 (7224)\n+40EE2 Uncompressed Size     00009335 (37685)\n+40EE6 Filename Length       0077 (119)\n+40EE8 Extra Length          0000 (0)\n+40EEA Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x40713: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x40EEA: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-4078A PAYLOAD\n+40F61 PAYLOAD\n \n-423C2 LOCAL HEADER #406     04034B50 (67324752)\n-423C6 Extract Zip Spec      14 (20) '2.0'\n-423C7 Extract OS            00 (0) 'MS-DOS'\n-423C8 General Purpose Flag  0800 (2048)\n+42B99 LOCAL HEADER #406     04034B50 (67324752)\n+42B9D Extract Zip Spec      14 (20) '2.0'\n+42B9E Extract OS            00 (0) 'MS-DOS'\n+42B9F General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-423CA Compression Method    0008 (8) 'Deflated'\n-423CC Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-423D0 CRC                   217BBE0B (561757707)\n-423D4 Compressed Size       00000651 (1617)\n-423D8 Uncompressed Size     00001BB1 (7089)\n-423DC Filename Length       0080 (128)\n-423DE Extra Length          0000 (0)\n-423E0 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+42BA1 Compression Method    0008 (8) 'Deflated'\n+42BA3 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+42BA7 CRC                   217BBE0B (561757707)\n+42BAB Compressed Size       00000651 (1617)\n+42BAF Uncompressed Size     00001BB1 (7089)\n+42BB3 Filename Length       0080 (128)\n+42BB5 Extra Length          0000 (0)\n+42BB7 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x423E0: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x42BB7: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-42460 PAYLOAD\n+42C37 PAYLOAD\n \n-42AB1 LOCAL HEADER #407     04034B50 (67324752)\n-42AB5 Extract Zip Spec      14 (20) '2.0'\n-42AB6 Extract OS            00 (0) 'MS-DOS'\n-42AB7 General Purpose Flag  0800 (2048)\n+43288 LOCAL HEADER #407     04034B50 (67324752)\n+4328C Extract Zip Spec      14 (20) '2.0'\n+4328D Extract OS            00 (0) 'MS-DOS'\n+4328E General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-42AB9 Compression Method    0008 (8) 'Deflated'\n-42ABB Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-42ABF CRC                   CF72F6D0 (3480418000)\n-42AC3 Compressed Size       00001400 (5120)\n-42AC7 Uncompressed Size     00004A6A (19050)\n-42ACB Filename Length       007D (125)\n-42ACD Extra Length          0000 (0)\n-42ACF Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+43290 Compression Method    0008 (8) 'Deflated'\n+43292 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+43296 CRC                   CF72F6D0 (3480418000)\n+4329A Compressed Size       00001400 (5120)\n+4329E Uncompressed Size     00004A6A (19050)\n+432A2 Filename Length       007D (125)\n+432A4 Extra Length          0000 (0)\n+432A6 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x42ACF: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x432A6: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-42B4C PAYLOAD\n+43323 PAYLOAD\n \n-43F4C LOCAL HEADER #408     04034B50 (67324752)\n-43F50 Extract Zip Spec      14 (20) '2.0'\n-43F51 Extract OS            00 (0) 'MS-DOS'\n-43F52 General Purpose Flag  0800 (2048)\n+44723 LOCAL HEADER #408     04034B50 (67324752)\n+44727 Extract Zip Spec      14 (20) '2.0'\n+44728 Extract OS            00 (0) 'MS-DOS'\n+44729 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-43F54 Compression Method    0008 (8) 'Deflated'\n-43F56 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-43F5A CRC                   DCEFA272 (3706692210)\n-43F5E Compressed Size       0000049C (1180)\n-43F62 Uncompressed Size     000009D3 (2515)\n-43F66 Filename Length       0080 (128)\n-43F68 Extra Length          0000 (0)\n-43F6A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+4472B Compression Method    0008 (8) 'Deflated'\n+4472D Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+44731 CRC                   DCEFA272 (3706692210)\n+44735 Compressed Size       0000049C (1180)\n+44739 Uncompressed Size     000009D3 (2515)\n+4473D Filename Length       0080 (128)\n+4473F Extra Length          0000 (0)\n+44741 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x43F6A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x44741: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-43FEA PAYLOAD\n+447C1 PAYLOAD\n \n-44486 LOCAL HEADER #409     04034B50 (67324752)\n-4448A Extract Zip Spec      14 (20) '2.0'\n-4448B Extract OS            00 (0) 'MS-DOS'\n-4448C General Purpose Flag  0800 (2048)\n+44C5D LOCAL HEADER #409     04034B50 (67324752)\n+44C61 Extract Zip Spec      14 (20) '2.0'\n+44C62 Extract OS            00 (0) 'MS-DOS'\n+44C63 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-4448E Compression Method    0008 (8) 'Deflated'\n-44490 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-44494 CRC                   26E963FE (652829694)\n-44498 Compressed Size       0000080C (2060)\n-4449C Uncompressed Size     00001276 (4726)\n-444A0 Filename Length       0082 (130)\n-444A2 Extra Length          0000 (0)\n-444A4 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+44C65 Compression Method    0008 (8) 'Deflated'\n+44C67 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+44C6B CRC                   26E963FE (652829694)\n+44C6F Compressed Size       0000080C (2060)\n+44C73 Uncompressed Size     00001276 (4726)\n+44C77 Filename Length       0082 (130)\n+44C79 Extra Length          0000 (0)\n+44C7B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x444A4: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x44C7B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-44526 PAYLOAD\n+44CFD PAYLOAD\n \n-44D32 LOCAL HEADER #410     04034B50 (67324752)\n-44D36 Extract Zip Spec      14 (20) '2.0'\n-44D37 Extract OS            00 (0) 'MS-DOS'\n-44D38 General Purpose Flag  0800 (2048)\n+45509 LOCAL HEADER #410     04034B50 (67324752)\n+4550D Extract Zip Spec      14 (20) '2.0'\n+4550E Extract OS            00 (0) 'MS-DOS'\n+4550F General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-44D3A Compression Method    0008 (8) 'Deflated'\n-44D3C Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-44D40 CRC                   6B96B8CE (1805039822)\n-44D44 Compressed Size       00001EEB (7915)\n-44D48 Uncompressed Size     00008944 (35140)\n-44D4C Filename Length       0075 (117)\n-44D4E Extra Length          0000 (0)\n-44D50 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+45511 Compression Method    0008 (8) 'Deflated'\n+45513 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+45517 CRC                   6B96B8CE (1805039822)\n+4551B Compressed Size       00001EEB (7915)\n+4551F Uncompressed Size     00008944 (35140)\n+45523 Filename Length       0075 (117)\n+45525 Extra Length          0000 (0)\n+45527 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x44D50: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x45527: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-44DC5 PAYLOAD\n+4559C PAYLOAD\n \n-46CB0 LOCAL HEADER #411     04034B50 (67324752)\n-46CB4 Extract Zip Spec      14 (20) '2.0'\n-46CB5 Extract OS            00 (0) 'MS-DOS'\n-46CB6 General Purpose Flag  0800 (2048)\n+47487 LOCAL HEADER #411     04034B50 (67324752)\n+4748B Extract Zip Spec      14 (20) '2.0'\n+4748C Extract OS            00 (0) 'MS-DOS'\n+4748D General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-46CB8 Compression Method    0008 (8) 'Deflated'\n-46CBA Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-46CBE CRC                   DB2A8543 (3676996931)\n-46CC2 Compressed Size       000009EE (2542)\n-46CC6 Uncompressed Size     00001C3A (7226)\n-46CCA Filename Length       007C (124)\n-46CCC Extra Length          0000 (0)\n-46CCE Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+4748F Compression Method    0008 (8) 'Deflated'\n+47491 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+47495 CRC                   DB2A8543 (3676996931)\n+47499 Compressed Size       000009EE (2542)\n+4749D Uncompressed Size     00001C3A (7226)\n+474A1 Filename Length       007C (124)\n+474A3 Extra Length          0000 (0)\n+474A5 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x46CCE: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x474A5: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-46D4A PAYLOAD\n+47521 PAYLOAD\n \n-47738 LOCAL HEADER #412     04034B50 (67324752)\n-4773C Extract Zip Spec      14 (20) '2.0'\n-4773D Extract OS            00 (0) 'MS-DOS'\n-4773E General Purpose Flag  0800 (2048)\n+47F0F LOCAL HEADER #412     04034B50 (67324752)\n+47F13 Extract Zip Spec      14 (20) '2.0'\n+47F14 Extract OS            00 (0) 'MS-DOS'\n+47F15 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-47740 Compression Method    0008 (8) 'Deflated'\n-47742 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-47746 CRC                   FF5BC4DC (4284204252)\n-4774A Compressed Size       00000883 (2179)\n-4774E Uncompressed Size     00001552 (5458)\n-47752 Filename Length       007F (127)\n-47754 Extra Length          0000 (0)\n-47756 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+47F17 Compression Method    0008 (8) 'Deflated'\n+47F19 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+47F1D CRC                   FF5BC4DC (4284204252)\n+47F21 Compressed Size       00000883 (2179)\n+47F25 Uncompressed Size     00001552 (5458)\n+47F29 Filename Length       007F (127)\n+47F2B Extra Length          0000 (0)\n+47F2D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x47756: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x47F2D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-477D5 PAYLOAD\n+47FAC PAYLOAD\n \n-48058 LOCAL HEADER #413     04034B50 (67324752)\n-4805C Extract Zip Spec      14 (20) '2.0'\n-4805D Extract OS            00 (0) 'MS-DOS'\n-4805E General Purpose Flag  0800 (2048)\n+4882F LOCAL HEADER #413     04034B50 (67324752)\n+48833 Extract Zip Spec      14 (20) '2.0'\n+48834 Extract OS            00 (0) 'MS-DOS'\n+48835 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-48060 Compression Method    0008 (8) 'Deflated'\n-48062 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-48066 CRC                   D6140D51 (3591638353)\n-4806A Compressed Size       00001350 (4944)\n-4806E Uncompressed Size     00003C2C (15404)\n-48072 Filename Length       007F (127)\n-48074 Extra Length          0000 (0)\n-48076 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+48837 Compression Method    0008 (8) 'Deflated'\n+48839 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+4883D CRC                   D6140D51 (3591638353)\n+48841 Compressed Size       00001350 (4944)\n+48845 Uncompressed Size     00003C2C (15404)\n+48849 Filename Length       007F (127)\n+4884B Extra Length          0000 (0)\n+4884D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x48076: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x4884D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-480F5 PAYLOAD\n+488CC PAYLOAD\n \n-49445 LOCAL HEADER #414     04034B50 (67324752)\n-49449 Extract Zip Spec      14 (20) '2.0'\n-4944A Extract OS            00 (0) 'MS-DOS'\n-4944B General Purpose Flag  0800 (2048)\n+49C1C LOCAL HEADER #414     04034B50 (67324752)\n+49C20 Extract Zip Spec      14 (20) '2.0'\n+49C21 Extract OS            00 (0) 'MS-DOS'\n+49C22 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-4944D Compression Method    0008 (8) 'Deflated'\n-4944F Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-49453 CRC                   86CE2079 (2261655673)\n-49457 Compressed Size       00000AC2 (2754)\n-4945B Uncompressed Size     00002162 (8546)\n-4945F Filename Length       007E (126)\n-49461 Extra Length          0000 (0)\n-49463 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+49C24 Compression Method    0008 (8) 'Deflated'\n+49C26 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+49C2A CRC                   86CE2079 (2261655673)\n+49C2E Compressed Size       00000AC2 (2754)\n+49C32 Uncompressed Size     00002162 (8546)\n+49C36 Filename Length       007E (126)\n+49C38 Extra Length          0000 (0)\n+49C3A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x49463: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x49C3A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-494E1 PAYLOAD\n+49CB8 PAYLOAD\n \n-49FA3 LOCAL HEADER #415     04034B50 (67324752)\n-49FA7 Extract Zip Spec      14 (20) '2.0'\n-49FA8 Extract OS            00 (0) 'MS-DOS'\n-49FA9 General Purpose Flag  0800 (2048)\n+4A77A LOCAL HEADER #415     04034B50 (67324752)\n+4A77E Extract Zip Spec      14 (20) '2.0'\n+4A77F Extract OS            00 (0) 'MS-DOS'\n+4A780 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-49FAB Compression Method    0008 (8) 'Deflated'\n-49FAD Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-49FB1 CRC                   B12610E6 (2972061926)\n-49FB5 Compressed Size       00000441 (1089)\n-49FB9 Uncompressed Size     00000A5B (2651)\n-49FBD Filename Length       0071 (113)\n-49FBF Extra Length          0000 (0)\n-49FC1 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+4A782 Compression Method    0008 (8) 'Deflated'\n+4A784 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+4A788 CRC                   B12610E6 (2972061926)\n+4A78C Compressed Size       00000441 (1089)\n+4A790 Uncompressed Size     00000A5B (2651)\n+4A794 Filename Length       0071 (113)\n+4A796 Extra Length          0000 (0)\n+4A798 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x49FC1: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x4A798: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-4A032 PAYLOAD\n+4A809 PAYLOAD\n \n-4A473 LOCAL HEADER #416     04034B50 (67324752)\n-4A477 Extract Zip Spec      14 (20) '2.0'\n-4A478 Extract OS            00 (0) 'MS-DOS'\n-4A479 General Purpose Flag  0800 (2048)\n+4AC4A LOCAL HEADER #416     04034B50 (67324752)\n+4AC4E Extract Zip Spec      14 (20) '2.0'\n+4AC4F Extract OS            00 (0) 'MS-DOS'\n+4AC50 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-4A47B Compression Method    0008 (8) 'Deflated'\n-4A47D Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-4A481 CRC                   041CE92B (69003563)\n-4A485 Compressed Size       0000046E (1134)\n-4A489 Uncompressed Size     00000B22 (2850)\n-4A48D Filename Length       008C (140)\n-4A48F Extra Length          0000 (0)\n-4A491 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+4AC52 Compression Method    0008 (8) 'Deflated'\n+4AC54 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+4AC58 CRC                   041CE92B (69003563)\n+4AC5C Compressed Size       0000046E (1134)\n+4AC60 Uncompressed Size     00000B22 (2850)\n+4AC64 Filename Length       008C (140)\n+4AC66 Extra Length          0000 (0)\n+4AC68 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             XXXXXXXX'\n #\n-# WARNING: Offset 0x4A491: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x4AC68: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-4A51D PAYLOAD\n+4ACF4 PAYLOAD\n \n-4A98B LOCAL HEADER #417     04034B50 (67324752)\n-4A98F Extract Zip Spec      14 (20) '2.0'\n-4A990 Extract OS            00 (0) 'MS-DOS'\n-4A991 General Purpose Flag  0800 (2048)\n+4B162 LOCAL HEADER #417     04034B50 (67324752)\n+4B166 Extract Zip Spec      14 (20) '2.0'\n+4B167 Extract OS            00 (0) 'MS-DOS'\n+4B168 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-4A993 Compression Method    0008 (8) 'Deflated'\n-4A995 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-4A999 CRC                   16A4BA93 (379894419)\n-4A99D Compressed Size       000006D2 (1746)\n-4A9A1 Uncompressed Size     000016E4 (5860)\n-4A9A5 Filename Length       008B (139)\n-4A9A7 Extra Length          0000 (0)\n-4A9A9 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+4B16A Compression Method    0008 (8) 'Deflated'\n+4B16C Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+4B170 CRC                   16A4BA93 (379894419)\n+4B174 Compressed Size       000006D2 (1746)\n+4B178 Uncompressed Size     000016E4 (5860)\n+4B17C Filename Length       008B (139)\n+4B17E Extra Length          0000 (0)\n+4B180 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             XXXXXXX'\n #\n-# WARNING: Offset 0x4A9A9: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x4B180: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-4AA34 PAYLOAD\n+4B20B PAYLOAD\n \n-4B106 LOCAL HEADER #418     04034B50 (67324752)\n-4B10A Extract Zip Spec      14 (20) '2.0'\n-4B10B Extract OS            00 (0) 'MS-DOS'\n-4B10C General Purpose Flag  0800 (2048)\n+4B8DD LOCAL HEADER #418     04034B50 (67324752)\n+4B8E1 Extract Zip Spec      14 (20) '2.0'\n+4B8E2 Extract OS            00 (0) 'MS-DOS'\n+4B8E3 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-4B10E Compression Method    0008 (8) 'Deflated'\n-4B110 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-4B114 CRC                   390AB403 (957002755)\n-4B118 Compressed Size       000005D3 (1491)\n-4B11C Uncompressed Size     00001068 (4200)\n-4B120 Filename Length       008E (142)\n-4B122 Extra Length          0000 (0)\n-4B124 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+4B8E5 Compression Method    0008 (8) 'Deflated'\n+4B8E7 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+4B8EB CRC                   390AB403 (957002755)\n+4B8EF Compressed Size       000005D3 (1491)\n+4B8F3 Uncompressed Size     00001068 (4200)\n+4B8F7 Filename Length       008E (142)\n+4B8F9 Extra Length          0000 (0)\n+4B8FB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             XXXXXXXXXX'\n #\n-# WARNING: Offset 0x4B124: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x4B8FB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-4B1B2 PAYLOAD\n+4B989 PAYLOAD\n \n-4B785 LOCAL HEADER #419     04034B50 (67324752)\n-4B789 Extract Zip Spec      14 (20) '2.0'\n-4B78A Extract OS            00 (0) 'MS-DOS'\n-4B78B General Purpose Flag  0800 (2048)\n+4BF5C LOCAL HEADER #419     04034B50 (67324752)\n+4BF60 Extract Zip Spec      14 (20) '2.0'\n+4BF61 Extract OS            00 (0) 'MS-DOS'\n+4BF62 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-4B78D Compression Method    0008 (8) 'Deflated'\n-4B78F Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-4B793 CRC                   3DE98548 (1038714184)\n-4B797 Compressed Size       0000064F (1615)\n-4B79B Uncompressed Size     000016AA (5802)\n-4B79F Filename Length       008A (138)\n-4B7A1 Extra Length          0000 (0)\n-4B7A3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+4BF64 Compression Method    0008 (8) 'Deflated'\n+4BF66 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+4BF6A CRC                   3DE98548 (1038714184)\n+4BF6E Compressed Size       0000064F (1615)\n+4BF72 Uncompressed Size     000016AA (5802)\n+4BF76 Filename Length       008A (138)\n+4BF78 Extra Length          0000 (0)\n+4BF7A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             XXXXXX'\n #\n-# WARNING: Offset 0x4B7A3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x4BF7A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-4B82D PAYLOAD\n+4C004 PAYLOAD\n \n-4BE7C LOCAL HEADER #420     04034B50 (67324752)\n-4BE80 Extract Zip Spec      14 (20) '2.0'\n-4BE81 Extract OS            00 (0) 'MS-DOS'\n-4BE82 General Purpose Flag  0800 (2048)\n+4C653 LOCAL HEADER #420     04034B50 (67324752)\n+4C657 Extract Zip Spec      14 (20) '2.0'\n+4C658 Extract OS            00 (0) 'MS-DOS'\n+4C659 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-4BE84 Compression Method    0008 (8) 'Deflated'\n-4BE86 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-4BE8A CRC                   F32265E7 (4079117799)\n-4BE8E Compressed Size       00000776 (1910)\n-4BE92 Uncompressed Size     00001595 (5525)\n-4BE96 Filename Length       006C (108)\n-4BE98 Extra Length          0000 (0)\n-4BE9A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+4C65B Compression Method    0008 (8) 'Deflated'\n+4C65D Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+4C661 CRC                   F32265E7 (4079117799)\n+4C665 Compressed Size       00000776 (1910)\n+4C669 Uncompressed Size     00001595 (5525)\n+4C66D Filename Length       006C (108)\n+4C66F Extra Length          0000 (0)\n+4C671 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x4BE9A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x4C671: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-4BF06 PAYLOAD\n+4C6DD PAYLOAD\n \n-4C67C LOCAL HEADER #421     04034B50 (67324752)\n-4C680 Extract Zip Spec      14 (20) '2.0'\n-4C681 Extract OS            00 (0) 'MS-DOS'\n-4C682 General Purpose Flag  0800 (2048)\n+4CE53 LOCAL HEADER #421     04034B50 (67324752)\n+4CE57 Extract Zip Spec      14 (20) '2.0'\n+4CE58 Extract OS            00 (0) 'MS-DOS'\n+4CE59 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-4C684 Compression Method    0008 (8) 'Deflated'\n-4C686 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-4C68A CRC                   33231FD5 (857939925)\n-4C68E Compressed Size       0000082D (2093)\n-4C692 Uncompressed Size     00001399 (5017)\n-4C696 Filename Length       006F (111)\n-4C698 Extra Length          0000 (0)\n-4C69A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+4CE5B Compression Method    0008 (8) 'Deflated'\n+4CE5D Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+4CE61 CRC                   33231FD5 (857939925)\n+4CE65 Compressed Size       0000082D (2093)\n+4CE69 Uncompressed Size     00001399 (5017)\n+4CE6D Filename Length       006F (111)\n+4CE6F Extra Length          0000 (0)\n+4CE71 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x4C69A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x4CE71: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-4C709 PAYLOAD\n+4CEE0 PAYLOAD\n \n-4CF36 LOCAL HEADER #422     04034B50 (67324752)\n-4CF3A Extract Zip Spec      14 (20) '2.0'\n-4CF3B Extract OS            00 (0) 'MS-DOS'\n-4CF3C General Purpose Flag  0800 (2048)\n+4D70D LOCAL HEADER #422     04034B50 (67324752)\n+4D711 Extract Zip Spec      14 (20) '2.0'\n+4D712 Extract OS            00 (0) 'MS-DOS'\n+4D713 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-4CF3E Compression Method    0008 (8) 'Deflated'\n-4CF40 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-4CF44 CRC                   62A57B9F (1655012255)\n-4CF48 Compressed Size       000004A9 (1193)\n-4CF4C Uncompressed Size     00000AFB (2811)\n-4CF50 Filename Length       006B (107)\n-4CF52 Extra Length          0000 (0)\n-4CF54 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+4D715 Compression Method    0008 (8) 'Deflated'\n+4D717 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+4D71B CRC                   62A57B9F (1655012255)\n+4D71F Compressed Size       000004A9 (1193)\n+4D723 Uncompressed Size     00000AFB (2811)\n+4D727 Filename Length       006B (107)\n+4D729 Extra Length          0000 (0)\n+4D72B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x4CF54: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x4D72B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-4CFBF PAYLOAD\n+4D796 PAYLOAD\n \n-4D468 LOCAL HEADER #423     04034B50 (67324752)\n-4D46C Extract Zip Spec      14 (20) '2.0'\n-4D46D Extract OS            00 (0) 'MS-DOS'\n-4D46E General Purpose Flag  0800 (2048)\n+4DC3F LOCAL HEADER #423     04034B50 (67324752)\n+4DC43 Extract Zip Spec      14 (20) '2.0'\n+4DC44 Extract OS            00 (0) 'MS-DOS'\n+4DC45 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-4D470 Compression Method    0008 (8) 'Deflated'\n-4D472 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-4D476 CRC                   63C353AF (1673745327)\n-4D47A Compressed Size       000005DA (1498)\n-4D47E Uncompressed Size     00000CF8 (3320)\n-4D482 Filename Length       0068 (104)\n-4D484 Extra Length          0000 (0)\n-4D486 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+4DC47 Compression Method    0008 (8) 'Deflated'\n+4DC49 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+4DC4D CRC                   63C353AF (1673745327)\n+4DC51 Compressed Size       000005DA (1498)\n+4DC55 Uncompressed Size     00000CF8 (3320)\n+4DC59 Filename Length       0068 (104)\n+4DC5B Extra Length          0000 (0)\n+4DC5D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x4D486: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x4DC5D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-4D4EE PAYLOAD\n+4DCC5 PAYLOAD\n \n-4DAC8 LOCAL HEADER #424     04034B50 (67324752)\n-4DACC Extract Zip Spec      14 (20) '2.0'\n-4DACD Extract OS            00 (0) 'MS-DOS'\n-4DACE General Purpose Flag  0800 (2048)\n+4E29F LOCAL HEADER #424     04034B50 (67324752)\n+4E2A3 Extract Zip Spec      14 (20) '2.0'\n+4E2A4 Extract OS            00 (0) 'MS-DOS'\n+4E2A5 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-4DAD0 Compression Method    0008 (8) 'Deflated'\n-4DAD2 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-4DAD6 CRC                   C64481A5 (3326378405)\n-4DADA Compressed Size       000003AA (938)\n-4DADE Uncompressed Size     00000723 (1827)\n-4DAE2 Filename Length       006F (111)\n-4DAE4 Extra Length          0000 (0)\n-4DAE6 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+4E2A7 Compression Method    0008 (8) 'Deflated'\n+4E2A9 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+4E2AD CRC                   C64481A5 (3326378405)\n+4E2B1 Compressed Size       000003AA (938)\n+4E2B5 Uncompressed Size     00000723 (1827)\n+4E2B9 Filename Length       006F (111)\n+4E2BB Extra Length          0000 (0)\n+4E2BD Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x4DAE6: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x4E2BD: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-4DB55 PAYLOAD\n+4E32C PAYLOAD\n \n-4DEFF LOCAL HEADER #425     04034B50 (67324752)\n-4DF03 Extract Zip Spec      14 (20) '2.0'\n-4DF04 Extract OS            00 (0) 'MS-DOS'\n-4DF05 General Purpose Flag  0800 (2048)\n+4E6D6 LOCAL HEADER #425     04034B50 (67324752)\n+4E6DA Extract Zip Spec      14 (20) '2.0'\n+4E6DB Extract OS            00 (0) 'MS-DOS'\n+4E6DC General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-4DF07 Compression Method    0008 (8) 'Deflated'\n-4DF09 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-4DF0D CRC                   39649106 (962892038)\n-4DF11 Compressed Size       0000039E (926)\n-4DF15 Uncompressed Size     000006E2 (1762)\n-4DF19 Filename Length       006D (109)\n-4DF1B Extra Length          0000 (0)\n-4DF1D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+4E6DE Compression Method    0008 (8) 'Deflated'\n+4E6E0 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+4E6E4 CRC                   39649106 (962892038)\n+4E6E8 Compressed Size       0000039E (926)\n+4E6EC Uncompressed Size     000006E2 (1762)\n+4E6F0 Filename Length       006D (109)\n+4E6F2 Extra Length          0000 (0)\n+4E6F4 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x4DF1D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x4E6F4: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-4DF8A PAYLOAD\n+4E761 PAYLOAD\n \n-4E328 LOCAL HEADER #426     04034B50 (67324752)\n-4E32C Extract Zip Spec      14 (20) '2.0'\n-4E32D Extract OS            00 (0) 'MS-DOS'\n-4E32E General Purpose Flag  0800 (2048)\n+4EAFF LOCAL HEADER #426     04034B50 (67324752)\n+4EB03 Extract Zip Spec      14 (20) '2.0'\n+4EB04 Extract OS            00 (0) 'MS-DOS'\n+4EB05 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-4E330 Compression Method    0008 (8) 'Deflated'\n-4E332 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-4E336 CRC                   8DC8B44C (2378740812)\n-4E33A Compressed Size       000003E3 (995)\n-4E33E Uncompressed Size     00000782 (1922)\n-4E342 Filename Length       0068 (104)\n-4E344 Extra Length          0000 (0)\n-4E346 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+4EB07 Compression Method    0008 (8) 'Deflated'\n+4EB09 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+4EB0D CRC                   8DC8B44C (2378740812)\n+4EB11 Compressed Size       000003E3 (995)\n+4EB15 Uncompressed Size     00000782 (1922)\n+4EB19 Filename Length       0068 (104)\n+4EB1B Extra Length          0000 (0)\n+4EB1D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x4E346: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x4EB1D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-4E3AE PAYLOAD\n+4EB85 PAYLOAD\n \n-4E791 LOCAL HEADER #427     04034B50 (67324752)\n-4E795 Extract Zip Spec      14 (20) '2.0'\n-4E796 Extract OS            00 (0) 'MS-DOS'\n-4E797 General Purpose Flag  0800 (2048)\n+4EF68 LOCAL HEADER #427     04034B50 (67324752)\n+4EF6C Extract Zip Spec      14 (20) '2.0'\n+4EF6D Extract OS            00 (0) 'MS-DOS'\n+4EF6E General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-4E799 Compression Method    0008 (8) 'Deflated'\n-4E79B Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-4E79F CRC                   605D4301 (1616724737)\n-4E7A3 Compressed Size       0000049B (1179)\n-4E7A7 Uncompressed Size     00000914 (2324)\n-4E7AB Filename Length       0068 (104)\n-4E7AD Extra Length          0000 (0)\n-4E7AF Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+4EF70 Compression Method    0008 (8) 'Deflated'\n+4EF72 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+4EF76 CRC                   605D4301 (1616724737)\n+4EF7A Compressed Size       0000049B (1179)\n+4EF7E Uncompressed Size     00000914 (2324)\n+4EF82 Filename Length       0068 (104)\n+4EF84 Extra Length          0000 (0)\n+4EF86 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x4E7AF: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x4EF86: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-4E817 PAYLOAD\n+4EFEE PAYLOAD\n \n-4ECB2 LOCAL HEADER #428     04034B50 (67324752)\n-4ECB6 Extract Zip Spec      14 (20) '2.0'\n-4ECB7 Extract OS            00 (0) 'MS-DOS'\n-4ECB8 General Purpose Flag  0800 (2048)\n+4F489 LOCAL HEADER #428     04034B50 (67324752)\n+4F48D Extract Zip Spec      14 (20) '2.0'\n+4F48E Extract OS            00 (0) 'MS-DOS'\n+4F48F General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-4ECBA Compression Method    0008 (8) 'Deflated'\n-4ECBC Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-4ECC0 CRC                   A64E298E (2790140302)\n-4ECC4 Compressed Size       000003E2 (994)\n-4ECC8 Uncompressed Size     000007A5 (1957)\n-4ECCC Filename Length       0075 (117)\n-4ECCE Extra Length          0000 (0)\n-4ECD0 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+4F491 Compression Method    0008 (8) 'Deflated'\n+4F493 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+4F497 CRC                   A64E298E (2790140302)\n+4F49B Compressed Size       000003E2 (994)\n+4F49F Uncompressed Size     000007A5 (1957)\n+4F4A3 Filename Length       0075 (117)\n+4F4A5 Extra Length          0000 (0)\n+4F4A7 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x4ECD0: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x4F4A7: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-4ED45 PAYLOAD\n+4F51C PAYLOAD\n \n-4F127 LOCAL HEADER #429     04034B50 (67324752)\n-4F12B Extract Zip Spec      14 (20) '2.0'\n-4F12C Extract OS            00 (0) 'MS-DOS'\n-4F12D General Purpose Flag  0800 (2048)\n+4F8FE LOCAL HEADER #429     04034B50 (67324752)\n+4F902 Extract Zip Spec      14 (20) '2.0'\n+4F903 Extract OS            00 (0) 'MS-DOS'\n+4F904 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-4F12F Compression Method    0008 (8) 'Deflated'\n-4F131 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-4F135 CRC                   937D5C9D (2474466461)\n-4F139 Compressed Size       00000531 (1329)\n-4F13D Uncompressed Size     00000F43 (3907)\n-4F141 Filename Length       006E (110)\n-4F143 Extra Length          0000 (0)\n-4F145 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+4F906 Compression Method    0008 (8) 'Deflated'\n+4F908 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+4F90C CRC                   937D5C9D (2474466461)\n+4F910 Compressed Size       00000531 (1329)\n+4F914 Uncompressed Size     00000F43 (3907)\n+4F918 Filename Length       006E (110)\n+4F91A Extra Length          0000 (0)\n+4F91C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x4F145: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x4F91C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-4F1B3 PAYLOAD\n+4F98A PAYLOAD\n \n-4F6E4 LOCAL HEADER #430     04034B50 (67324752)\n-4F6E8 Extract Zip Spec      14 (20) '2.0'\n-4F6E9 Extract OS            00 (0) 'MS-DOS'\n-4F6EA General Purpose Flag  0800 (2048)\n+4FEBB LOCAL HEADER #430     04034B50 (67324752)\n+4FEBF Extract Zip Spec      14 (20) '2.0'\n+4FEC0 Extract OS            00 (0) 'MS-DOS'\n+4FEC1 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-4F6EC Compression Method    0008 (8) 'Deflated'\n-4F6EE Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-4F6F2 CRC                   335CA1CD (861708749)\n-4F6F6 Compressed Size       0000068B (1675)\n-4F6FA Uncompressed Size     00000E9A (3738)\n-4F6FE Filename Length       0072 (114)\n-4F700 Extra Length          0000 (0)\n-4F702 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+4FEC3 Compression Method    0008 (8) 'Deflated'\n+4FEC5 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+4FEC9 CRC                   335CA1CD (861708749)\n+4FECD Compressed Size       0000068B (1675)\n+4FED1 Uncompressed Size     00000E9A (3738)\n+4FED5 Filename Length       0072 (114)\n+4FED7 Extra Length          0000 (0)\n+4FED9 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x4F702: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x4FED9: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-4F774 PAYLOAD\n+4FF4B PAYLOAD\n \n-4FDFF LOCAL HEADER #431     04034B50 (67324752)\n-4FE03 Extract Zip Spec      14 (20) '2.0'\n-4FE04 Extract OS            00 (0) 'MS-DOS'\n-4FE05 General Purpose Flag  0800 (2048)\n+505D6 LOCAL HEADER #431     04034B50 (67324752)\n+505DA Extract Zip Spec      14 (20) '2.0'\n+505DB Extract OS            00 (0) 'MS-DOS'\n+505DC General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-4FE07 Compression Method    0008 (8) 'Deflated'\n-4FE09 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-4FE0D CRC                   3EE7FDDD (1055391197)\n-4FE11 Compressed Size       00000723 (1827)\n-4FE15 Uncompressed Size     00001059 (4185)\n-4FE19 Filename Length       007E (126)\n-4FE1B Extra Length          0000 (0)\n-4FE1D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+505DE Compression Method    0008 (8) 'Deflated'\n+505E0 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+505E4 CRC                   3EE7FDDD (1055391197)\n+505E8 Compressed Size       00000723 (1827)\n+505EC Uncompressed Size     00001059 (4185)\n+505F0 Filename Length       007E (126)\n+505F2 Extra Length          0000 (0)\n+505F4 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x4FE1D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x505F4: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-4FE9B PAYLOAD\n+50672 PAYLOAD\n \n-505BE LOCAL HEADER #432     04034B50 (67324752)\n-505C2 Extract Zip Spec      14 (20) '2.0'\n-505C3 Extract OS            00 (0) 'MS-DOS'\n-505C4 General Purpose Flag  0800 (2048)\n+50D95 LOCAL HEADER #432     04034B50 (67324752)\n+50D99 Extract Zip Spec      14 (20) '2.0'\n+50D9A Extract OS            00 (0) 'MS-DOS'\n+50D9B General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-505C6 Compression Method    0008 (8) 'Deflated'\n-505C8 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-505CC CRC                   0944969F (155489951)\n-505D0 Compressed Size       000008A8 (2216)\n-505D4 Uncompressed Size     000017C7 (6087)\n-505D8 Filename Length       0070 (112)\n-505DA Extra Length          0000 (0)\n-505DC Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+50D9D Compression Method    0008 (8) 'Deflated'\n+50D9F Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+50DA3 CRC                   0944969F (155489951)\n+50DA7 Compressed Size       000008A8 (2216)\n+50DAB Uncompressed Size     000017C7 (6087)\n+50DAF Filename Length       0070 (112)\n+50DB1 Extra Length          0000 (0)\n+50DB3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x505DC: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x50DB3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-5064C PAYLOAD\n+50E23 PAYLOAD\n \n-50EF4 LOCAL HEADER #433     04034B50 (67324752)\n-50EF8 Extract Zip Spec      14 (20) '2.0'\n-50EF9 Extract OS            00 (0) 'MS-DOS'\n-50EFA General Purpose Flag  0800 (2048)\n+516CB LOCAL HEADER #433     04034B50 (67324752)\n+516CF Extract Zip Spec      14 (20) '2.0'\n+516D0 Extract OS            00 (0) 'MS-DOS'\n+516D1 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-50EFC Compression Method    0008 (8) 'Deflated'\n-50EFE Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-50F02 CRC                   67FA3A91 (1744452241)\n-50F06 Compressed Size       000004A5 (1189)\n-50F0A Uncompressed Size     00000C5B (3163)\n-50F0E Filename Length       007D (125)\n-50F10 Extra Length          0000 (0)\n-50F12 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+516D3 Compression Method    0008 (8) 'Deflated'\n+516D5 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+516D9 CRC                   67FA3A91 (1744452241)\n+516DD Compressed Size       000004A5 (1189)\n+516E1 Uncompressed Size     00000C5B (3163)\n+516E5 Filename Length       007D (125)\n+516E7 Extra Length          0000 (0)\n+516E9 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x50F12: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x516E9: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-50F8F PAYLOAD\n+51766 PAYLOAD\n \n-51434 LOCAL HEADER #434     04034B50 (67324752)\n-51438 Extract Zip Spec      14 (20) '2.0'\n-51439 Extract OS            00 (0) 'MS-DOS'\n-5143A General Purpose Flag  0800 (2048)\n+51C0B LOCAL HEADER #434     04034B50 (67324752)\n+51C0F Extract Zip Spec      14 (20) '2.0'\n+51C10 Extract OS            00 (0) 'MS-DOS'\n+51C11 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-5143C Compression Method    0008 (8) 'Deflated'\n-5143E Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-51442 CRC                   63513D5C (1666268508)\n-51446 Compressed Size       000003E5 (997)\n-5144A Uncompressed Size     000007C0 (1984)\n-5144E Filename Length       007D (125)\n-51450 Extra Length          0000 (0)\n-51452 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+51C13 Compression Method    0008 (8) 'Deflated'\n+51C15 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+51C19 CRC                   63513D5C (1666268508)\n+51C1D Compressed Size       000003E5 (997)\n+51C21 Uncompressed Size     000007C0 (1984)\n+51C25 Filename Length       007D (125)\n+51C27 Extra Length          0000 (0)\n+51C29 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x51452: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x51C29: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-514CF PAYLOAD\n+51CA6 PAYLOAD\n \n-518B4 LOCAL HEADER #435     04034B50 (67324752)\n-518B8 Extract Zip Spec      14 (20) '2.0'\n-518B9 Extract OS            00 (0) 'MS-DOS'\n-518BA General Purpose Flag  0800 (2048)\n+5208B LOCAL HEADER #435     04034B50 (67324752)\n+5208F Extract Zip Spec      14 (20) '2.0'\n+52090 Extract OS            00 (0) 'MS-DOS'\n+52091 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-518BC Compression Method    0008 (8) 'Deflated'\n-518BE Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-518C2 CRC                   99929518 (2576520472)\n-518C6 Compressed Size       00000586 (1414)\n-518CA Uncompressed Size     00000EDA (3802)\n-518CE Filename Length       0074 (116)\n-518D0 Extra Length          0000 (0)\n-518D2 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+52093 Compression Method    0008 (8) 'Deflated'\n+52095 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+52099 CRC                   99929518 (2576520472)\n+5209D Compressed Size       00000586 (1414)\n+520A1 Uncompressed Size     00000EDA (3802)\n+520A5 Filename Length       0074 (116)\n+520A7 Extra Length          0000 (0)\n+520A9 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x518D2: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x520A9: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-51946 PAYLOAD\n+5211D PAYLOAD\n \n-51ECC LOCAL HEADER #436     04034B50 (67324752)\n-51ED0 Extract Zip Spec      14 (20) '2.0'\n-51ED1 Extract OS            00 (0) 'MS-DOS'\n-51ED2 General Purpose Flag  0800 (2048)\n+526A3 LOCAL HEADER #436     04034B50 (67324752)\n+526A7 Extract Zip Spec      14 (20) '2.0'\n+526A8 Extract OS            00 (0) 'MS-DOS'\n+526A9 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-51ED4 Compression Method    0008 (8) 'Deflated'\n-51ED6 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-51EDA CRC                   E6BF62E0 (3871302368)\n-51EDE Compressed Size       000003A3 (931)\n-51EE2 Uncompressed Size     000008F8 (2296)\n-51EE6 Filename Length       0072 (114)\n-51EE8 Extra Length          0000 (0)\n-51EEA Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+526AB Compression Method    0008 (8) 'Deflated'\n+526AD Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+526B1 CRC                   E6BF62E0 (3871302368)\n+526B5 Compressed Size       000003A3 (931)\n+526B9 Uncompressed Size     000008F8 (2296)\n+526BD Filename Length       0072 (114)\n+526BF Extra Length          0000 (0)\n+526C1 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x51EEA: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x526C1: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-51F5C PAYLOAD\n+52733 PAYLOAD\n \n-522FF LOCAL HEADER #437     04034B50 (67324752)\n-52303 Extract Zip Spec      14 (20) '2.0'\n-52304 Extract OS            00 (0) 'MS-DOS'\n-52305 General Purpose Flag  0800 (2048)\n+52AD6 LOCAL HEADER #437     04034B50 (67324752)\n+52ADA Extract Zip Spec      14 (20) '2.0'\n+52ADB Extract OS            00 (0) 'MS-DOS'\n+52ADC General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-52307 Compression Method    0008 (8) 'Deflated'\n-52309 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-5230D CRC                   01130591 (18023825)\n-52311 Compressed Size       000002F0 (752)\n-52315 Uncompressed Size     00000594 (1428)\n-52319 Filename Length       0077 (119)\n-5231B Extra Length          0000 (0)\n-5231D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+52ADE Compression Method    0008 (8) 'Deflated'\n+52AE0 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+52AE4 CRC                   01130591 (18023825)\n+52AE8 Compressed Size       000002F0 (752)\n+52AEC Uncompressed Size     00000594 (1428)\n+52AF0 Filename Length       0077 (119)\n+52AF2 Extra Length          0000 (0)\n+52AF4 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x5231D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x52AF4: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-52394 PAYLOAD\n+52B6B PAYLOAD\n \n-52684 LOCAL HEADER #438     04034B50 (67324752)\n-52688 Extract Zip Spec      14 (20) '2.0'\n-52689 Extract OS            00 (0) 'MS-DOS'\n-5268A General Purpose Flag  0800 (2048)\n+52E5B LOCAL HEADER #438     04034B50 (67324752)\n+52E5F Extract Zip Spec      14 (20) '2.0'\n+52E60 Extract OS            00 (0) 'MS-DOS'\n+52E61 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-5268C Compression Method    0008 (8) 'Deflated'\n-5268E Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-52692 CRC                   F05E2331 (4032701233)\n-52696 Compressed Size       00000408 (1032)\n-5269A Uncompressed Size     00000831 (2097)\n-5269E Filename Length       0079 (121)\n-526A0 Extra Length          0000 (0)\n-526A2 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+52E63 Compression Method    0008 (8) 'Deflated'\n+52E65 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+52E69 CRC                   F05E2331 (4032701233)\n+52E6D Compressed Size       00000408 (1032)\n+52E71 Uncompressed Size     00000831 (2097)\n+52E75 Filename Length       0079 (121)\n+52E77 Extra Length          0000 (0)\n+52E79 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x526A2: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x52E79: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-5271B PAYLOAD\n+52EF2 PAYLOAD\n \n-52B23 LOCAL HEADER #439     04034B50 (67324752)\n-52B27 Extract Zip Spec      14 (20) '2.0'\n-52B28 Extract OS            00 (0) 'MS-DOS'\n-52B29 General Purpose Flag  0800 (2048)\n+532FA LOCAL HEADER #439     04034B50 (67324752)\n+532FE Extract Zip Spec      14 (20) '2.0'\n+532FF Extract OS            00 (0) 'MS-DOS'\n+53300 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-52B2B Compression Method    0008 (8) 'Deflated'\n-52B2D Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-52B31 CRC                   80ED3BA4 (2163030948)\n-52B35 Compressed Size       0000055C (1372)\n-52B39 Uncompressed Size     000015D0 (5584)\n-52B3D Filename Length       0077 (119)\n-52B3F Extra Length          0000 (0)\n-52B41 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+53302 Compression Method    0008 (8) 'Deflated'\n+53304 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+53308 CRC                   80ED3BA4 (2163030948)\n+5330C Compressed Size       0000055C (1372)\n+53310 Uncompressed Size     000015D0 (5584)\n+53314 Filename Length       0077 (119)\n+53316 Extra Length          0000 (0)\n+53318 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x52B41: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x53318: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-52BB8 PAYLOAD\n+5338F PAYLOAD\n \n-53114 LOCAL HEADER #440     04034B50 (67324752)\n-53118 Extract Zip Spec      14 (20) '2.0'\n-53119 Extract OS            00 (0) 'MS-DOS'\n-5311A General Purpose Flag  0800 (2048)\n+538EB LOCAL HEADER #440     04034B50 (67324752)\n+538EF Extract Zip Spec      14 (20) '2.0'\n+538F0 Extract OS            00 (0) 'MS-DOS'\n+538F1 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-5311C Compression Method    0008 (8) 'Deflated'\n-5311E Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-53122 CRC                   7018E446 (1880679494)\n-53126 Compressed Size       000009A0 (2464)\n-5312A Uncompressed Size     00001FAE (8110)\n-5312E Filename Length       007D (125)\n-53130 Extra Length          0000 (0)\n-53132 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+538F3 Compression Method    0008 (8) 'Deflated'\n+538F5 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+538F9 CRC                   7018E446 (1880679494)\n+538FD Compressed Size       000009A0 (2464)\n+53901 Uncompressed Size     00001FAE (8110)\n+53905 Filename Length       007D (125)\n+53907 Extra Length          0000 (0)\n+53909 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x53132: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x53909: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-531AF PAYLOAD\n+53986 PAYLOAD\n \n-53B4F LOCAL HEADER #441     04034B50 (67324752)\n-53B53 Extract Zip Spec      14 (20) '2.0'\n-53B54 Extract OS            00 (0) 'MS-DOS'\n-53B55 General Purpose Flag  0800 (2048)\n+54326 LOCAL HEADER #441     04034B50 (67324752)\n+5432A Extract Zip Spec      14 (20) '2.0'\n+5432B Extract OS            00 (0) 'MS-DOS'\n+5432C General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-53B57 Compression Method    0008 (8) 'Deflated'\n-53B59 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-53B5D CRC                   61A0CE5A (1637928538)\n-53B61 Compressed Size       0000049F (1183)\n-53B65 Uncompressed Size     000012FA (4858)\n-53B69 Filename Length       0074 (116)\n-53B6B Extra Length          0000 (0)\n-53B6D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+5432E Compression Method    0008 (8) 'Deflated'\n+54330 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+54334 CRC                   61A0CE5A (1637928538)\n+54338 Compressed Size       0000049F (1183)\n+5433C Uncompressed Size     000012FA (4858)\n+54340 Filename Length       0074 (116)\n+54342 Extra Length          0000 (0)\n+54344 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x53B6D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x54344: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-53BE1 PAYLOAD\n+543B8 PAYLOAD\n \n-54080 LOCAL HEADER #442     04034B50 (67324752)\n-54084 Extract Zip Spec      14 (20) '2.0'\n-54085 Extract OS            00 (0) 'MS-DOS'\n-54086 General Purpose Flag  0800 (2048)\n+54857 LOCAL HEADER #442     04034B50 (67324752)\n+5485B Extract Zip Spec      14 (20) '2.0'\n+5485C Extract OS            00 (0) 'MS-DOS'\n+5485D General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-54088 Compression Method    0008 (8) 'Deflated'\n-5408A Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-5408E CRC                   624BE63E (1649141310)\n-54092 Compressed Size       0000075A (1882)\n-54096 Uncompressed Size     00001315 (4885)\n-5409A Filename Length       0077 (119)\n-5409C Extra Length          0000 (0)\n-5409E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+5485F Compression Method    0008 (8) 'Deflated'\n+54861 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+54865 CRC                   624BE63E (1649141310)\n+54869 Compressed Size       0000075A (1882)\n+5486D Uncompressed Size     00001315 (4885)\n+54871 Filename Length       0077 (119)\n+54873 Extra Length          0000 (0)\n+54875 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x5409E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x54875: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-54115 PAYLOAD\n+548EC PAYLOAD\n \n-5486F LOCAL HEADER #443     04034B50 (67324752)\n-54873 Extract Zip Spec      14 (20) '2.0'\n-54874 Extract OS            00 (0) 'MS-DOS'\n-54875 General Purpose Flag  0800 (2048)\n+55046 LOCAL HEADER #443     04034B50 (67324752)\n+5504A Extract Zip Spec      14 (20) '2.0'\n+5504B Extract OS            00 (0) 'MS-DOS'\n+5504C General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-54877 Compression Method    0008 (8) 'Deflated'\n-54879 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-5487D CRC                   F4A07CA3 (4104158371)\n-54881 Compressed Size       00000978 (2424)\n-54885 Uncompressed Size     000027E4 (10212)\n-54889 Filename Length       0073 (115)\n-5488B Extra Length          0000 (0)\n-5488D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+5504E Compression Method    0008 (8) 'Deflated'\n+55050 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+55054 CRC                   F4A07CA3 (4104158371)\n+55058 Compressed Size       00000978 (2424)\n+5505C Uncompressed Size     000027E4 (10212)\n+55060 Filename Length       0073 (115)\n+55062 Extra Length          0000 (0)\n+55064 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x5488D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x55064: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-54900 PAYLOAD\n+550D7 PAYLOAD\n \n-55278 LOCAL HEADER #444     04034B50 (67324752)\n-5527C Extract Zip Spec      14 (20) '2.0'\n-5527D Extract OS            00 (0) 'MS-DOS'\n-5527E General Purpose Flag  0800 (2048)\n+55A4F LOCAL HEADER #444     04034B50 (67324752)\n+55A53 Extract Zip Spec      14 (20) '2.0'\n+55A54 Extract OS            00 (0) 'MS-DOS'\n+55A55 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-55280 Compression Method    0008 (8) 'Deflated'\n-55282 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-55286 CRC                   6E031E40 (1845698112)\n-5528A Compressed Size       0000075F (1887)\n-5528E Uncompressed Size     00001276 (4726)\n-55292 Filename Length       007B (123)\n-55294 Extra Length          0000 (0)\n-55296 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+55A57 Compression Method    0008 (8) 'Deflated'\n+55A59 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+55A5D CRC                   6E031E40 (1845698112)\n+55A61 Compressed Size       0000075F (1887)\n+55A65 Uncompressed Size     00001276 (4726)\n+55A69 Filename Length       007B (123)\n+55A6B Extra Length          0000 (0)\n+55A6D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x55296: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x55A6D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-55311 PAYLOAD\n+55AE8 PAYLOAD\n \n-55A70 LOCAL HEADER #445     04034B50 (67324752)\n-55A74 Extract Zip Spec      14 (20) '2.0'\n-55A75 Extract OS            00 (0) 'MS-DOS'\n-55A76 General Purpose Flag  0800 (2048)\n+56247 LOCAL HEADER #445     04034B50 (67324752)\n+5624B Extract Zip Spec      14 (20) '2.0'\n+5624C Extract OS            00 (0) 'MS-DOS'\n+5624D General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-55A78 Compression Method    0008 (8) 'Deflated'\n-55A7A Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-55A7E CRC                   5987930A (1502057226)\n-55A82 Compressed Size       00000501 (1281)\n-55A86 Uncompressed Size     00000BDE (3038)\n-55A8A Filename Length       007A (122)\n-55A8C Extra Length          0000 (0)\n-55A8E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+5624F Compression Method    0008 (8) 'Deflated'\n+56251 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+56255 CRC                   5987930A (1502057226)\n+56259 Compressed Size       00000501 (1281)\n+5625D Uncompressed Size     00000BDE (3038)\n+56261 Filename Length       007A (122)\n+56263 Extra Length          0000 (0)\n+56265 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x55A8E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x56265: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-55B08 PAYLOAD\n+562DF PAYLOAD\n \n-56009 LOCAL HEADER #446     04034B50 (67324752)\n-5600D Extract Zip Spec      14 (20) '2.0'\n-5600E Extract OS            00 (0) 'MS-DOS'\n-5600F General Purpose Flag  0800 (2048)\n+567E0 LOCAL HEADER #446     04034B50 (67324752)\n+567E4 Extract Zip Spec      14 (20) '2.0'\n+567E5 Extract OS            00 (0) 'MS-DOS'\n+567E6 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-56011 Compression Method    0008 (8) 'Deflated'\n-56013 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-56017 CRC                   CA93F7B9 (3398694841)\n-5601B Compressed Size       000003F5 (1013)\n-5601F Uncompressed Size     000008CF (2255)\n-56023 Filename Length       007B (123)\n-56025 Extra Length          0000 (0)\n-56027 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+567E8 Compression Method    0008 (8) 'Deflated'\n+567EA Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+567EE CRC                   CA93F7B9 (3398694841)\n+567F2 Compressed Size       000003F5 (1013)\n+567F6 Uncompressed Size     000008CF (2255)\n+567FA Filename Length       007B (123)\n+567FC Extra Length          0000 (0)\n+567FE Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x56027: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x567FE: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-560A2 PAYLOAD\n+56879 PAYLOAD\n \n-56497 LOCAL HEADER #447     04034B50 (67324752)\n-5649B Extract Zip Spec      14 (20) '2.0'\n-5649C Extract OS            00 (0) 'MS-DOS'\n-5649D General Purpose Flag  0800 (2048)\n+56C6E LOCAL HEADER #447     04034B50 (67324752)\n+56C72 Extract Zip Spec      14 (20) '2.0'\n+56C73 Extract OS            00 (0) 'MS-DOS'\n+56C74 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-5649F Compression Method    0008 (8) 'Deflated'\n-564A1 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-564A5 CRC                   673E5975 (1732139381)\n-564A9 Compressed Size       00000507 (1287)\n-564AD Uncompressed Size     00000CA9 (3241)\n-564B1 Filename Length       0079 (121)\n-564B3 Extra Length          0000 (0)\n-564B5 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+56C76 Compression Method    0008 (8) 'Deflated'\n+56C78 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+56C7C CRC                   673E5975 (1732139381)\n+56C80 Compressed Size       00000507 (1287)\n+56C84 Uncompressed Size     00000CA9 (3241)\n+56C88 Filename Length       0079 (121)\n+56C8A Extra Length          0000 (0)\n+56C8C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x564B5: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x56C8C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-5652E PAYLOAD\n+56D05 PAYLOAD\n \n-56A35 LOCAL HEADER #448     04034B50 (67324752)\n-56A39 Extract Zip Spec      14 (20) '2.0'\n-56A3A Extract OS            00 (0) 'MS-DOS'\n-56A3B General Purpose Flag  0800 (2048)\n+5720C LOCAL HEADER #448     04034B50 (67324752)\n+57210 Extract Zip Spec      14 (20) '2.0'\n+57211 Extract OS            00 (0) 'MS-DOS'\n+57212 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-56A3D Compression Method    0008 (8) 'Deflated'\n-56A3F Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-56A43 CRC                   33033645 (855848517)\n-56A47 Compressed Size       00001774 (6004)\n-56A4B Uncompressed Size     0000503C (20540)\n-56A4F Filename Length       0077 (119)\n-56A51 Extra Length          0000 (0)\n-56A53 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+57214 Compression Method    0008 (8) 'Deflated'\n+57216 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+5721A CRC                   33033645 (855848517)\n+5721E Compressed Size       00001774 (6004)\n+57222 Uncompressed Size     0000503C (20540)\n+57226 Filename Length       0077 (119)\n+57228 Extra Length          0000 (0)\n+5722A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x56A53: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x5722A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-56ACA PAYLOAD\n+572A1 PAYLOAD\n \n-5823E LOCAL HEADER #449     04034B50 (67324752)\n-58242 Extract Zip Spec      14 (20) '2.0'\n-58243 Extract OS            00 (0) 'MS-DOS'\n-58244 General Purpose Flag  0800 (2048)\n+58A15 LOCAL HEADER #449     04034B50 (67324752)\n+58A19 Extract Zip Spec      14 (20) '2.0'\n+58A1A Extract OS            00 (0) 'MS-DOS'\n+58A1B General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-58246 Compression Method    0008 (8) 'Deflated'\n-58248 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-5824C CRC                   F5037A64 (4110645860)\n-58250 Compressed Size       0000042D (1069)\n-58254 Uncompressed Size     0000080E (2062)\n-58258 Filename Length       007A (122)\n-5825A Extra Length          0000 (0)\n-5825C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+58A1D Compression Method    0008 (8) 'Deflated'\n+58A1F Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+58A23 CRC                   F5037A64 (4110645860)\n+58A27 Compressed Size       0000042D (1069)\n+58A2B Uncompressed Size     0000080E (2062)\n+58A2F Filename Length       007A (122)\n+58A31 Extra Length          0000 (0)\n+58A33 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x5825C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x58A33: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-582D6 PAYLOAD\n+58AAD PAYLOAD\n \n-58703 LOCAL HEADER #450     04034B50 (67324752)\n-58707 Extract Zip Spec      14 (20) '2.0'\n-58708 Extract OS            00 (0) 'MS-DOS'\n-58709 General Purpose Flag  0800 (2048)\n+58EDA LOCAL HEADER #450     04034B50 (67324752)\n+58EDE Extract Zip Spec      14 (20) '2.0'\n+58EDF Extract OS            00 (0) 'MS-DOS'\n+58EE0 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-5870B Compression Method    0008 (8) 'Deflated'\n-5870D Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-58711 CRC                   DB187B38 (3675814712)\n-58715 Compressed Size       00000A58 (2648)\n-58719 Uncompressed Size     00001A85 (6789)\n-5871D Filename Length       0070 (112)\n-5871F Extra Length          0000 (0)\n-58721 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+58EE2 Compression Method    0008 (8) 'Deflated'\n+58EE4 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+58EE8 CRC                   DB187B38 (3675814712)\n+58EEC Compressed Size       00000A58 (2648)\n+58EF0 Uncompressed Size     00001A85 (6789)\n+58EF4 Filename Length       0070 (112)\n+58EF6 Extra Length          0000 (0)\n+58EF8 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x58721: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x58EF8: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-58791 PAYLOAD\n+58F68 PAYLOAD\n \n-591E9 LOCAL HEADER #451     04034B50 (67324752)\n-591ED Extract Zip Spec      14 (20) '2.0'\n-591EE Extract OS            00 (0) 'MS-DOS'\n-591EF General Purpose Flag  0800 (2048)\n+599C0 LOCAL HEADER #451     04034B50 (67324752)\n+599C4 Extract Zip Spec      14 (20) '2.0'\n+599C5 Extract OS            00 (0) 'MS-DOS'\n+599C6 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-591F1 Compression Method    0008 (8) 'Deflated'\n-591F3 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-591F7 CRC                   CD183667 (3440916071)\n-591FB Compressed Size       00000A45 (2629)\n-591FF Uncompressed Size     00001A6E (6766)\n-59203 Filename Length       0071 (113)\n-59205 Extra Length          0000 (0)\n-59207 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+599C8 Compression Method    0008 (8) 'Deflated'\n+599CA Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+599CE CRC                   CD183667 (3440916071)\n+599D2 Compressed Size       00000A45 (2629)\n+599D6 Uncompressed Size     00001A6E (6766)\n+599DA Filename Length       0071 (113)\n+599DC Extra Length          0000 (0)\n+599DE Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x59207: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x599DE: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-59278 PAYLOAD\n+59A4F PAYLOAD\n \n-59CBD LOCAL HEADER #452     04034B50 (67324752)\n-59CC1 Extract Zip Spec      14 (20) '2.0'\n-59CC2 Extract OS            00 (0) 'MS-DOS'\n-59CC3 General Purpose Flag  0800 (2048)\n+5A494 LOCAL HEADER #452     04034B50 (67324752)\n+5A498 Extract Zip Spec      14 (20) '2.0'\n+5A499 Extract OS            00 (0) 'MS-DOS'\n+5A49A General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-59CC5 Compression Method    0008 (8) 'Deflated'\n-59CC7 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-59CCB CRC                   0C7DD276 (209572470)\n-59CCF Compressed Size       00000A5A (2650)\n-59CD3 Uncompressed Size     00001A92 (6802)\n-59CD7 Filename Length       0071 (113)\n-59CD9 Extra Length          0000 (0)\n-59CDB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+5A49C Compression Method    0008 (8) 'Deflated'\n+5A49E Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+5A4A2 CRC                   0C7DD276 (209572470)\n+5A4A6 Compressed Size       00000A5A (2650)\n+5A4AA Uncompressed Size     00001A92 (6802)\n+5A4AE Filename Length       0071 (113)\n+5A4B0 Extra Length          0000 (0)\n+5A4B2 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x59CDB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x5A4B2: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-59D4C PAYLOAD\n+5A523 PAYLOAD\n \n-5A7A6 LOCAL HEADER #453     04034B50 (67324752)\n-5A7AA Extract Zip Spec      14 (20) '2.0'\n-5A7AB Extract OS            00 (0) 'MS-DOS'\n-5A7AC General Purpose Flag  0800 (2048)\n+5AF7D LOCAL HEADER #453     04034B50 (67324752)\n+5AF81 Extract Zip Spec      14 (20) '2.0'\n+5AF82 Extract OS            00 (0) 'MS-DOS'\n+5AF83 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-5A7AE Compression Method    0008 (8) 'Deflated'\n-5A7B0 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-5A7B4 CRC                   60EA12C2 (1625952962)\n-5A7B8 Compressed Size       000008AB (2219)\n-5A7BC Uncompressed Size     00001733 (5939)\n-5A7C0 Filename Length       0072 (114)\n-5A7C2 Extra Length          0000 (0)\n-5A7C4 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+5AF85 Compression Method    0008 (8) 'Deflated'\n+5AF87 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+5AF8B CRC                   60EA12C2 (1625952962)\n+5AF8F Compressed Size       000008AB (2219)\n+5AF93 Uncompressed Size     00001733 (5939)\n+5AF97 Filename Length       0072 (114)\n+5AF99 Extra Length          0000 (0)\n+5AF9B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x5A7C4: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x5AF9B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-5A836 PAYLOAD\n+5B00D PAYLOAD\n \n-5B0E1 LOCAL HEADER #454     04034B50 (67324752)\n-5B0E5 Extract Zip Spec      14 (20) '2.0'\n-5B0E6 Extract OS            00 (0) 'MS-DOS'\n-5B0E7 General Purpose Flag  0800 (2048)\n+5B8B8 LOCAL HEADER #454     04034B50 (67324752)\n+5B8BC Extract Zip Spec      14 (20) '2.0'\n+5B8BD Extract OS            00 (0) 'MS-DOS'\n+5B8BE General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-5B0E9 Compression Method    0008 (8) 'Deflated'\n-5B0EB Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-5B0EF CRC                   4BB1EABD (1269951165)\n-5B0F3 Compressed Size       00000764 (1892)\n-5B0F7 Uncompressed Size     0000167D (5757)\n-5B0FB Filename Length       0075 (117)\n-5B0FD Extra Length          0000 (0)\n-5B0FF Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+5B8C0 Compression Method    0008 (8) 'Deflated'\n+5B8C2 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+5B8C6 CRC                   4BB1EABD (1269951165)\n+5B8CA Compressed Size       00000764 (1892)\n+5B8CE Uncompressed Size     0000167D (5757)\n+5B8D2 Filename Length       0075 (117)\n+5B8D4 Extra Length          0000 (0)\n+5B8D6 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x5B0FF: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x5B8D6: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-5B174 PAYLOAD\n+5B94B PAYLOAD\n \n-5B8D8 LOCAL HEADER #455     04034B50 (67324752)\n-5B8DC Extract Zip Spec      14 (20) '2.0'\n-5B8DD Extract OS            00 (0) 'MS-DOS'\n-5B8DE General Purpose Flag  0800 (2048)\n+5C0AF LOCAL HEADER #455     04034B50 (67324752)\n+5C0B3 Extract Zip Spec      14 (20) '2.0'\n+5C0B4 Extract OS            00 (0) 'MS-DOS'\n+5C0B5 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-5B8E0 Compression Method    0008 (8) 'Deflated'\n-5B8E2 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-5B8E6 CRC                   A18A8EB9 (2710212281)\n-5B8EA Compressed Size       000011B4 (4532)\n-5B8EE Uncompressed Size     0000328A (12938)\n-5B8F2 Filename Length       0075 (117)\n-5B8F4 Extra Length          0000 (0)\n-5B8F6 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+5C0B7 Compression Method    0008 (8) 'Deflated'\n+5C0B9 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+5C0BD CRC                   A18A8EB9 (2710212281)\n+5C0C1 Compressed Size       000011B4 (4532)\n+5C0C5 Uncompressed Size     0000328A (12938)\n+5C0C9 Filename Length       0075 (117)\n+5C0CB Extra Length          0000 (0)\n+5C0CD Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x5B8F6: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x5C0CD: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-5B96B PAYLOAD\n+5C142 PAYLOAD\n \n-5CB1F LOCAL HEADER #456     04034B50 (67324752)\n-5CB23 Extract Zip Spec      14 (20) '2.0'\n-5CB24 Extract OS            00 (0) 'MS-DOS'\n-5CB25 General Purpose Flag  0800 (2048)\n+5D2F6 LOCAL HEADER #456     04034B50 (67324752)\n+5D2FA Extract Zip Spec      14 (20) '2.0'\n+5D2FB Extract OS            00 (0) 'MS-DOS'\n+5D2FC General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-5CB27 Compression Method    0008 (8) 'Deflated'\n-5CB29 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-5CB2D CRC                   B7B762D6 (3082248918)\n-5CB31 Compressed Size       0000132C (4908)\n-5CB35 Uncompressed Size     00003879 (14457)\n-5CB39 Filename Length       0074 (116)\n-5CB3B Extra Length          0000 (0)\n-5CB3D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+5D2FE Compression Method    0008 (8) 'Deflated'\n+5D300 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+5D304 CRC                   B7B762D6 (3082248918)\n+5D308 Compressed Size       0000132C (4908)\n+5D30C Uncompressed Size     00003879 (14457)\n+5D310 Filename Length       0074 (116)\n+5D312 Extra Length          0000 (0)\n+5D314 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x5CB3D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x5D314: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-5CBB1 PAYLOAD\n+5D388 PAYLOAD\n \n-5DEDD LOCAL HEADER #457     04034B50 (67324752)\n-5DEE1 Extract Zip Spec      14 (20) '2.0'\n-5DEE2 Extract OS            00 (0) 'MS-DOS'\n-5DEE3 General Purpose Flag  0800 (2048)\n+5E6B4 LOCAL HEADER #457     04034B50 (67324752)\n+5E6B8 Extract Zip Spec      14 (20) '2.0'\n+5E6B9 Extract OS            00 (0) 'MS-DOS'\n+5E6BA General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-5DEE5 Compression Method    0008 (8) 'Deflated'\n-5DEE7 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-5DEEB CRC                   A2B9D29A (2730087066)\n-5DEEF Compressed Size       00000B19 (2841)\n-5DEF3 Uncompressed Size     00002150 (8528)\n-5DEF7 Filename Length       0078 (120)\n-5DEF9 Extra Length          0000 (0)\n-5DEFB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+5E6BC Compression Method    0008 (8) 'Deflated'\n+5E6BE Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+5E6C2 CRC                   A2B9D29A (2730087066)\n+5E6C6 Compressed Size       00000B19 (2841)\n+5E6CA Uncompressed Size     00002150 (8528)\n+5E6CE Filename Length       0078 (120)\n+5E6D0 Extra Length          0000 (0)\n+5E6D2 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x5DEFB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x5E6D2: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-5DF73 PAYLOAD\n+5E74A PAYLOAD\n \n-5EA8C LOCAL HEADER #458     04034B50 (67324752)\n-5EA90 Extract Zip Spec      14 (20) '2.0'\n-5EA91 Extract OS            00 (0) 'MS-DOS'\n-5EA92 General Purpose Flag  0800 (2048)\n+5F263 LOCAL HEADER #458     04034B50 (67324752)\n+5F267 Extract Zip Spec      14 (20) '2.0'\n+5F268 Extract OS            00 (0) 'MS-DOS'\n+5F269 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-5EA94 Compression Method    0008 (8) 'Deflated'\n-5EA96 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-5EA9A CRC                   C4FC7EA2 (3304881826)\n-5EA9E Compressed Size       00000790 (1936)\n-5EAA2 Uncompressed Size     000011DC (4572)\n-5EAA6 Filename Length       0071 (113)\n-5EAA8 Extra Length          0000 (0)\n-5EAAA Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+5F26B Compression Method    0008 (8) 'Deflated'\n+5F26D Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+5F271 CRC                   C4FC7EA2 (3304881826)\n+5F275 Compressed Size       00000790 (1936)\n+5F279 Uncompressed Size     000011DC (4572)\n+5F27D Filename Length       0071 (113)\n+5F27F Extra Length          0000 (0)\n+5F281 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x5EAAA: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x5F281: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-5EB1B PAYLOAD\n+5F2F2 PAYLOAD\n \n-5F2AB LOCAL HEADER #459     04034B50 (67324752)\n-5F2AF Extract Zip Spec      14 (20) '2.0'\n-5F2B0 Extract OS            00 (0) 'MS-DOS'\n-5F2B1 General Purpose Flag  0800 (2048)\n+5FA82 LOCAL HEADER #459     04034B50 (67324752)\n+5FA86 Extract Zip Spec      14 (20) '2.0'\n+5FA87 Extract OS            00 (0) 'MS-DOS'\n+5FA88 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-5F2B3 Compression Method    0008 (8) 'Deflated'\n-5F2B5 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-5F2B9 CRC                   EE30A8D8 (3996166360)\n-5F2BD Compressed Size       00001911 (6417)\n-5F2C1 Uncompressed Size     000072FB (29435)\n-5F2C5 Filename Length       0074 (116)\n-5F2C7 Extra Length          0000 (0)\n-5F2C9 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+5FA8A Compression Method    0008 (8) 'Deflated'\n+5FA8C Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+5FA90 CRC                   EE30A8D8 (3996166360)\n+5FA94 Compressed Size       00001911 (6417)\n+5FA98 Uncompressed Size     000072FB (29435)\n+5FA9C Filename Length       0074 (116)\n+5FA9E Extra Length          0000 (0)\n+5FAA0 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x5F2C9: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x5FAA0: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-5F33D PAYLOAD\n+5FB14 PAYLOAD\n \n-60C4E LOCAL HEADER #460     04034B50 (67324752)\n-60C52 Extract Zip Spec      14 (20) '2.0'\n-60C53 Extract OS            00 (0) 'MS-DOS'\n-60C54 General Purpose Flag  0800 (2048)\n+61425 LOCAL HEADER #460     04034B50 (67324752)\n+61429 Extract Zip Spec      14 (20) '2.0'\n+6142A Extract OS            00 (0) 'MS-DOS'\n+6142B General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-60C56 Compression Method    0008 (8) 'Deflated'\n-60C58 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-60C5C CRC                   EA36353C (3929421116)\n-60C60 Compressed Size       0000104B (4171)\n-60C64 Uncompressed Size     0000480E (18446)\n-60C68 Filename Length       007A (122)\n-60C6A Extra Length          0000 (0)\n-60C6C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+6142D Compression Method    0008 (8) 'Deflated'\n+6142F Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+61433 CRC                   EA36353C (3929421116)\n+61437 Compressed Size       0000104B (4171)\n+6143B Uncompressed Size     0000480E (18446)\n+6143F Filename Length       007A (122)\n+61441 Extra Length          0000 (0)\n+61443 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x60C6C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x61443: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-60CE6 PAYLOAD\n+614BD PAYLOAD\n \n-61D31 LOCAL HEADER #461     04034B50 (67324752)\n-61D35 Extract Zip Spec      14 (20) '2.0'\n-61D36 Extract OS            00 (0) 'MS-DOS'\n-61D37 General Purpose Flag  0800 (2048)\n+62508 LOCAL HEADER #461     04034B50 (67324752)\n+6250C Extract Zip Spec      14 (20) '2.0'\n+6250D Extract OS            00 (0) 'MS-DOS'\n+6250E General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-61D39 Compression Method    0008 (8) 'Deflated'\n-61D3B Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-61D3F CRC                   CA474DE0 (3393670624)\n-61D43 Compressed Size       0000039D (925)\n-61D47 Uncompressed Size     000007B6 (1974)\n-61D4B Filename Length       0079 (121)\n-61D4D Extra Length          0000 (0)\n-61D4F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+62510 Compression Method    0008 (8) 'Deflated'\n+62512 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+62516 CRC                   CA474DE0 (3393670624)\n+6251A Compressed Size       0000039D (925)\n+6251E Uncompressed Size     000007B6 (1974)\n+62522 Filename Length       0079 (121)\n+62524 Extra Length          0000 (0)\n+62526 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x61D4F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x62526: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-61DC8 PAYLOAD\n+6259F PAYLOAD\n \n-62165 LOCAL HEADER #462     04034B50 (67324752)\n-62169 Extract Zip Spec      14 (20) '2.0'\n-6216A Extract OS            00 (0) 'MS-DOS'\n-6216B General Purpose Flag  0800 (2048)\n+6293C LOCAL HEADER #462     04034B50 (67324752)\n+62940 Extract Zip Spec      14 (20) '2.0'\n+62941 Extract OS            00 (0) 'MS-DOS'\n+62942 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-6216D Compression Method    0008 (8) 'Deflated'\n-6216F Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-62173 CRC                   A19F99D4 (2711591380)\n-62177 Compressed Size       0000065E (1630)\n-6217B Uncompressed Size     000011CB (4555)\n-6217F Filename Length       0075 (117)\n-62181 Extra Length          0000 (0)\n-62183 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+62944 Compression Method    0008 (8) 'Deflated'\n+62946 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+6294A CRC                   A19F99D4 (2711591380)\n+6294E Compressed Size       0000065E (1630)\n+62952 Uncompressed Size     000011CB (4555)\n+62956 Filename Length       0075 (117)\n+62958 Extra Length          0000 (0)\n+6295A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x62183: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x6295A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-621F8 PAYLOAD\n+629CF PAYLOAD\n \n-62856 LOCAL HEADER #463     04034B50 (67324752)\n-6285A Extract Zip Spec      14 (20) '2.0'\n-6285B Extract OS            00 (0) 'MS-DOS'\n-6285C General Purpose Flag  0800 (2048)\n+6302D LOCAL HEADER #463     04034B50 (67324752)\n+63031 Extract Zip Spec      14 (20) '2.0'\n+63032 Extract OS            00 (0) 'MS-DOS'\n+63033 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-6285E Compression Method    0008 (8) 'Deflated'\n-62860 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-62864 CRC                   7573E84B (1970530379)\n-62868 Compressed Size       00000ED9 (3801)\n-6286C Uncompressed Size     0000284F (10319)\n-62870 Filename Length       0071 (113)\n-62872 Extra Length          0000 (0)\n-62874 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+63035 Compression Method    0008 (8) 'Deflated'\n+63037 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+6303B CRC                   7573E84B (1970530379)\n+6303F Compressed Size       00000ED9 (3801)\n+63043 Uncompressed Size     0000284F (10319)\n+63047 Filename Length       0071 (113)\n+63049 Extra Length          0000 (0)\n+6304B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x62874: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x6304B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-628E5 PAYLOAD\n+630BC PAYLOAD\n \n-637BE LOCAL HEADER #464     04034B50 (67324752)\n-637C2 Extract Zip Spec      14 (20) '2.0'\n-637C3 Extract OS            00 (0) 'MS-DOS'\n-637C4 General Purpose Flag  0800 (2048)\n+63F95 LOCAL HEADER #464     04034B50 (67324752)\n+63F99 Extract Zip Spec      14 (20) '2.0'\n+63F9A Extract OS            00 (0) 'MS-DOS'\n+63F9B General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-637C6 Compression Method    0008 (8) 'Deflated'\n-637C8 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-637CC CRC                   131CB9D8 (320649688)\n-637D0 Compressed Size       00000B4D (2893)\n-637D4 Uncompressed Size     00002777 (10103)\n-637D8 Filename Length       0075 (117)\n-637DA Extra Length          0000 (0)\n-637DC Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+63F9D Compression Method    0008 (8) 'Deflated'\n+63F9F Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+63FA3 CRC                   131CB9D8 (320649688)\n+63FA7 Compressed Size       00000B4D (2893)\n+63FAB Uncompressed Size     00002777 (10103)\n+63FAF Filename Length       0075 (117)\n+63FB1 Extra Length          0000 (0)\n+63FB3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x637DC: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x63FB3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-63851 PAYLOAD\n+64028 PAYLOAD\n \n-6439E LOCAL HEADER #465     04034B50 (67324752)\n-643A2 Extract Zip Spec      14 (20) '2.0'\n-643A3 Extract OS            00 (0) 'MS-DOS'\n-643A4 General Purpose Flag  0800 (2048)\n+64B75 LOCAL HEADER #465     04034B50 (67324752)\n+64B79 Extract Zip Spec      14 (20) '2.0'\n+64B7A Extract OS            00 (0) 'MS-DOS'\n+64B7B General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-643A6 Compression Method    0008 (8) 'Deflated'\n-643A8 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-643AC CRC                   95FAB1DA (2516234714)\n-643B0 Compressed Size       00000678 (1656)\n-643B4 Uncompressed Size     0000110D (4365)\n-643B8 Filename Length       0074 (116)\n-643BA Extra Length          0000 (0)\n-643BC Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+64B7D Compression Method    0008 (8) 'Deflated'\n+64B7F Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+64B83 CRC                   95FAB1DA (2516234714)\n+64B87 Compressed Size       00000678 (1656)\n+64B8B Uncompressed Size     0000110D (4365)\n+64B8F Filename Length       0074 (116)\n+64B91 Extra Length          0000 (0)\n+64B93 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x643BC: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x64B93: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-64430 PAYLOAD\n+64C07 PAYLOAD\n \n-64AA8 LOCAL HEADER #466     04034B50 (67324752)\n-64AAC Extract Zip Spec      14 (20) '2.0'\n-64AAD Extract OS            00 (0) 'MS-DOS'\n-64AAE General Purpose Flag  0800 (2048)\n+6527F LOCAL HEADER #466     04034B50 (67324752)\n+65283 Extract Zip Spec      14 (20) '2.0'\n+65284 Extract OS            00 (0) 'MS-DOS'\n+65285 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-64AB0 Compression Method    0008 (8) 'Deflated'\n-64AB2 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-64AB6 CRC                   B1E82858 (2984781912)\n-64ABA Compressed Size       000007DE (2014)\n-64ABE Uncompressed Size     000019D6 (6614)\n-64AC2 Filename Length       0077 (119)\n-64AC4 Extra Length          0000 (0)\n-64AC6 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+65287 Compression Method    0008 (8) 'Deflated'\n+65289 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+6528D CRC                   B1E82858 (2984781912)\n+65291 Compressed Size       000007DE (2014)\n+65295 Uncompressed Size     000019D6 (6614)\n+65299 Filename Length       0077 (119)\n+6529B Extra Length          0000 (0)\n+6529D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x64AC6: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x6529D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-64B3D PAYLOAD\n+65314 PAYLOAD\n \n-6531B LOCAL HEADER #467     04034B50 (67324752)\n-6531F Extract Zip Spec      14 (20) '2.0'\n-65320 Extract OS            00 (0) 'MS-DOS'\n-65321 General Purpose Flag  0800 (2048)\n+65AF2 LOCAL HEADER #467     04034B50 (67324752)\n+65AF6 Extract Zip Spec      14 (20) '2.0'\n+65AF7 Extract OS            00 (0) 'MS-DOS'\n+65AF8 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-65323 Compression Method    0008 (8) 'Deflated'\n-65325 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-65329 CRC                   EA13965E (3927152222)\n-6532D Compressed Size       00000529 (1321)\n-65331 Uncompressed Size     00000F7E (3966)\n-65335 Filename Length       0074 (116)\n-65337 Extra Length          0000 (0)\n-65339 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+65AFA Compression Method    0008 (8) 'Deflated'\n+65AFC Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+65B00 CRC                   EA13965E (3927152222)\n+65B04 Compressed Size       00000529 (1321)\n+65B08 Uncompressed Size     00000F7E (3966)\n+65B0C Filename Length       0074 (116)\n+65B0E Extra Length          0000 (0)\n+65B10 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x65339: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x65B10: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-653AD PAYLOAD\n+65B84 PAYLOAD\n \n-658D6 LOCAL HEADER #468     04034B50 (67324752)\n-658DA Extract Zip Spec      14 (20) '2.0'\n-658DB Extract OS            00 (0) 'MS-DOS'\n-658DC General Purpose Flag  0800 (2048)\n+660AD LOCAL HEADER #468     04034B50 (67324752)\n+660B1 Extract Zip Spec      14 (20) '2.0'\n+660B2 Extract OS            00 (0) 'MS-DOS'\n+660B3 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-658DE Compression Method    0008 (8) 'Deflated'\n-658E0 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-658E4 CRC                   C8903588 (3364894088)\n-658E8 Compressed Size       00000D5E (3422)\n-658EC Uncompressed Size     00002CD6 (11478)\n-658F0 Filename Length       006D (109)\n-658F2 Extra Length          0000 (0)\n-658F4 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+660B5 Compression Method    0008 (8) 'Deflated'\n+660B7 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+660BB CRC                   C8903588 (3364894088)\n+660BF Compressed Size       00000D5E (3422)\n+660C3 Uncompressed Size     00002CD6 (11478)\n+660C7 Filename Length       006D (109)\n+660C9 Extra Length          0000 (0)\n+660CB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x658F4: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x660CB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-65961 PAYLOAD\n+66138 PAYLOAD\n \n-666BF LOCAL HEADER #469     04034B50 (67324752)\n-666C3 Extract Zip Spec      14 (20) '2.0'\n-666C4 Extract OS            00 (0) 'MS-DOS'\n-666C5 General Purpose Flag  0800 (2048)\n+66E96 LOCAL HEADER #469     04034B50 (67324752)\n+66E9A Extract Zip Spec      14 (20) '2.0'\n+66E9B Extract OS            00 (0) 'MS-DOS'\n+66E9C General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-666C7 Compression Method    0008 (8) 'Deflated'\n-666C9 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-666CD CRC                   D19560D0 (3516227792)\n-666D1 Compressed Size       000003BB (955)\n-666D5 Uncompressed Size     00000A2F (2607)\n-666D9 Filename Length       007E (126)\n-666DB Extra Length          0000 (0)\n-666DD Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+66E9E Compression Method    0008 (8) 'Deflated'\n+66EA0 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+66EA4 CRC                   D19560D0 (3516227792)\n+66EA8 Compressed Size       000003BB (955)\n+66EAC Uncompressed Size     00000A2F (2607)\n+66EB0 Filename Length       007E (126)\n+66EB2 Extra Length          0000 (0)\n+66EB4 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x666DD: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x66EB4: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-6675B PAYLOAD\n+66F32 PAYLOAD\n \n-66B16 LOCAL HEADER #470     04034B50 (67324752)\n-66B1A Extract Zip Spec      14 (20) '2.0'\n-66B1B Extract OS            00 (0) 'MS-DOS'\n-66B1C General Purpose Flag  0800 (2048)\n+672ED LOCAL HEADER #470     04034B50 (67324752)\n+672F1 Extract Zip Spec      14 (20) '2.0'\n+672F2 Extract OS            00 (0) 'MS-DOS'\n+672F3 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-66B1E Compression Method    0008 (8) 'Deflated'\n-66B20 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-66B24 CRC                   A1414F13 (2705411859)\n-66B28 Compressed Size       00001BE4 (7140)\n-66B2C Uncompressed Size     0000521D (21021)\n-66B30 Filename Length       0085 (133)\n-66B32 Extra Length          0000 (0)\n-66B34 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+672F5 Compression Method    0008 (8) 'Deflated'\n+672F7 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+672FB CRC                   A1414F13 (2705411859)\n+672FF Compressed Size       00001BE4 (7140)\n+67303 Uncompressed Size     0000521D (21021)\n+67307 Filename Length       0085 (133)\n+67309 Extra Length          0000 (0)\n+6730B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             X'\n #\n-# WARNING: Offset 0x66B34: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x6730B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-66BB9 PAYLOAD\n+67390 PAYLOAD\n \n-6879D LOCAL HEADER #471     04034B50 (67324752)\n-687A1 Extract Zip Spec      14 (20) '2.0'\n-687A2 Extract OS            00 (0) 'MS-DOS'\n-687A3 General Purpose Flag  0800 (2048)\n+68F74 LOCAL HEADER #471     04034B50 (67324752)\n+68F78 Extract Zip Spec      14 (20) '2.0'\n+68F79 Extract OS            00 (0) 'MS-DOS'\n+68F7A General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-687A5 Compression Method    0008 (8) 'Deflated'\n-687A7 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-687AB CRC                   CB05D09B (3406155931)\n-687AF Compressed Size       000017FC (6140)\n-687B3 Uncompressed Size     00005230 (21040)\n-687B7 Filename Length       0082 (130)\n-687B9 Extra Length          0000 (0)\n-687BB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+68F7C Compression Method    0008 (8) 'Deflated'\n+68F7E Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+68F82 CRC                   CB05D09B (3406155931)\n+68F86 Compressed Size       000017FC (6140)\n+68F8A Uncompressed Size     00005230 (21040)\n+68F8E Filename Length       0082 (130)\n+68F90 Extra Length          0000 (0)\n+68F92 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x687BB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x68F92: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-6883D PAYLOAD\n+69014 PAYLOAD\n \n-6A039 LOCAL HEADER #472     04034B50 (67324752)\n-6A03D Extract Zip Spec      14 (20) '2.0'\n-6A03E Extract OS            00 (0) 'MS-DOS'\n-6A03F General Purpose Flag  0800 (2048)\n+6A810 LOCAL HEADER #472     04034B50 (67324752)\n+6A814 Extract Zip Spec      14 (20) '2.0'\n+6A815 Extract OS            00 (0) 'MS-DOS'\n+6A816 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-6A041 Compression Method    0008 (8) 'Deflated'\n-6A043 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-6A047 CRC                   17E2323C (400699964)\n-6A04B Compressed Size       00000487 (1159)\n-6A04F Uncompressed Size     00000904 (2308)\n-6A053 Filename Length       0086 (134)\n-6A055 Extra Length          0000 (0)\n-6A057 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+6A818 Compression Method    0008 (8) 'Deflated'\n+6A81A Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+6A81E CRC                   17E2323C (400699964)\n+6A822 Compressed Size       00000487 (1159)\n+6A826 Uncompressed Size     00000904 (2308)\n+6A82A Filename Length       0086 (134)\n+6A82C Extra Length          0000 (0)\n+6A82E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             XX'\n #\n-# WARNING: Offset 0x6A057: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x6A82E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-6A0DD PAYLOAD\n+6A8B4 PAYLOAD\n \n-6A564 LOCAL HEADER #473     04034B50 (67324752)\n-6A568 Extract Zip Spec      14 (20) '2.0'\n-6A569 Extract OS            00 (0) 'MS-DOS'\n-6A56A General Purpose Flag  0800 (2048)\n+6AD3B LOCAL HEADER #473     04034B50 (67324752)\n+6AD3F Extract Zip Spec      14 (20) '2.0'\n+6AD40 Extract OS            00 (0) 'MS-DOS'\n+6AD41 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-6A56C Compression Method    0008 (8) 'Deflated'\n-6A56E Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-6A572 CRC                   CC28EBBC (3425233852)\n-6A576 Compressed Size       00000776 (1910)\n-6A57A Uncompressed Size     00001036 (4150)\n-6A57E Filename Length       0091 (145)\n-6A580 Extra Length          0000 (0)\n-6A582 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+6AD43 Compression Method    0008 (8) 'Deflated'\n+6AD45 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+6AD49 CRC                   CC28EBBC (3425233852)\n+6AD4D Compressed Size       00000776 (1910)\n+6AD51 Uncompressed Size     00001036 (4150)\n+6AD55 Filename Length       0091 (145)\n+6AD57 Extra Length          0000 (0)\n+6AD59 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             XXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x6A582: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x6AD59: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-6A613 PAYLOAD\n+6ADEA PAYLOAD\n \n-6AD89 LOCAL HEADER #474     04034B50 (67324752)\n-6AD8D Extract Zip Spec      14 (20) '2.0'\n-6AD8E Extract OS            00 (0) 'MS-DOS'\n-6AD8F General Purpose Flag  0800 (2048)\n+6B560 LOCAL HEADER #474     04034B50 (67324752)\n+6B564 Extract Zip Spec      14 (20) '2.0'\n+6B565 Extract OS            00 (0) 'MS-DOS'\n+6B566 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-6AD91 Compression Method    0008 (8) 'Deflated'\n-6AD93 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-6AD97 CRC                   3FC95820 (1070159904)\n-6AD9B Compressed Size       000004B8 (1208)\n-6AD9F Uncompressed Size     00000AD4 (2772)\n-6ADA3 Filename Length       0082 (130)\n-6ADA5 Extra Length          0000 (0)\n-6ADA7 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+6B568 Compression Method    0008 (8) 'Deflated'\n+6B56A Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+6B56E CRC                   3FC95820 (1070159904)\n+6B572 Compressed Size       000004B8 (1208)\n+6B576 Uncompressed Size     00000AD4 (2772)\n+6B57A Filename Length       0082 (130)\n+6B57C Extra Length          0000 (0)\n+6B57E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x6ADA7: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x6B57E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-6AE29 PAYLOAD\n+6B600 PAYLOAD\n \n-6B2E1 LOCAL HEADER #475     04034B50 (67324752)\n-6B2E5 Extract Zip Spec      14 (20) '2.0'\n-6B2E6 Extract OS            00 (0) 'MS-DOS'\n-6B2E7 General Purpose Flag  0800 (2048)\n+6BAB8 LOCAL HEADER #475     04034B50 (67324752)\n+6BABC Extract Zip Spec      14 (20) '2.0'\n+6BABD Extract OS            00 (0) 'MS-DOS'\n+6BABE General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-6B2E9 Compression Method    0008 (8) 'Deflated'\n-6B2EB Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-6B2EF CRC                   41CBDE11 (1103879697)\n-6B2F3 Compressed Size       000005EA (1514)\n-6B2F7 Uncompressed Size     00000D2F (3375)\n-6B2FB Filename Length       0071 (113)\n-6B2FD Extra Length          0000 (0)\n-6B2FF Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+6BAC0 Compression Method    0008 (8) 'Deflated'\n+6BAC2 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+6BAC6 CRC                   41CBDE11 (1103879697)\n+6BACA Compressed Size       000005EA (1514)\n+6BACE Uncompressed Size     00000D2F (3375)\n+6BAD2 Filename Length       0071 (113)\n+6BAD4 Extra Length          0000 (0)\n+6BAD6 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x6B2FF: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x6BAD6: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-6B370 PAYLOAD\n+6BB47 PAYLOAD\n \n-6B95A LOCAL HEADER #476     04034B50 (67324752)\n-6B95E Extract Zip Spec      14 (20) '2.0'\n-6B95F Extract OS            00 (0) 'MS-DOS'\n-6B960 General Purpose Flag  0800 (2048)\n+6C131 LOCAL HEADER #476     04034B50 (67324752)\n+6C135 Extract Zip Spec      14 (20) '2.0'\n+6C136 Extract OS            00 (0) 'MS-DOS'\n+6C137 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-6B962 Compression Method    0008 (8) 'Deflated'\n-6B964 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-6B968 CRC                   1D768ED5 (494309077)\n-6B96C Compressed Size       00000834 (2100)\n-6B970 Uncompressed Size     00001C79 (7289)\n-6B974 Filename Length       0077 (119)\n-6B976 Extra Length          0000 (0)\n-6B978 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+6C139 Compression Method    0008 (8) 'Deflated'\n+6C13B Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+6C13F CRC                   1D768ED5 (494309077)\n+6C143 Compressed Size       00000834 (2100)\n+6C147 Uncompressed Size     00001C79 (7289)\n+6C14B Filename Length       0077 (119)\n+6C14D Extra Length          0000 (0)\n+6C14F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x6B978: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x6C14F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-6B9EF PAYLOAD\n+6C1C6 PAYLOAD\n \n-6C223 LOCAL HEADER #477     04034B50 (67324752)\n-6C227 Extract Zip Spec      14 (20) '2.0'\n-6C228 Extract OS            00 (0) 'MS-DOS'\n-6C229 General Purpose Flag  0800 (2048)\n+6C9FA LOCAL HEADER #477     04034B50 (67324752)\n+6C9FE Extract Zip Spec      14 (20) '2.0'\n+6C9FF Extract OS            00 (0) 'MS-DOS'\n+6CA00 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-6C22B Compression Method    0008 (8) 'Deflated'\n-6C22D Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-6C231 CRC                   7A85C658 (2055587416)\n-6C235 Compressed Size       0000085F (2143)\n-6C239 Uncompressed Size     00001D19 (7449)\n-6C23D Filename Length       007F (127)\n-6C23F Extra Length          0000 (0)\n-6C241 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+6CA02 Compression Method    0008 (8) 'Deflated'\n+6CA04 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+6CA08 CRC                   7A85C658 (2055587416)\n+6CA0C Compressed Size       0000085F (2143)\n+6CA10 Uncompressed Size     00001D19 (7449)\n+6CA14 Filename Length       007F (127)\n+6CA16 Extra Length          0000 (0)\n+6CA18 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x6C241: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x6CA18: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-6C2C0 PAYLOAD\n+6CA97 PAYLOAD\n \n-6CB1F LOCAL HEADER #478     04034B50 (67324752)\n-6CB23 Extract Zip Spec      14 (20) '2.0'\n-6CB24 Extract OS            00 (0) 'MS-DOS'\n-6CB25 General Purpose Flag  0800 (2048)\n+6D2F6 LOCAL HEADER #478     04034B50 (67324752)\n+6D2FA Extract Zip Spec      14 (20) '2.0'\n+6D2FB Extract OS            00 (0) 'MS-DOS'\n+6D2FC General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-6CB27 Compression Method    0008 (8) 'Deflated'\n-6CB29 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-6CB2D CRC                   879A3E43 (2275032643)\n-6CB31 Compressed Size       0007E61F (517663)\n-6CB35 Uncompressed Size     0050F0E7 (5304551)\n-6CB39 Filename Length       001A (26)\n-6CB3B Extra Length          0000 (0)\n-6CB3D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXX'\n+6D2FE Compression Method    0008 (8) 'Deflated'\n+6D300 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+6D304 CRC                   788D733C (2022535996)\n+6D308 Compressed Size       0007EAB9 (518841)\n+6D30C Uncompressed Size     0050F344 (5305156)\n+6D310 Filename Length       001A (26)\n+6D312 Extra Length          0000 (0)\n+6D314 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x6CB3D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x6D314: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-6CB57 PAYLOAD\n+6D32E PAYLOAD\n \n-EB176 LOCAL HEADER #479     04034B50 (67324752)\n-EB17A Extract Zip Spec      14 (20) '2.0'\n-EB17B Extract OS            00 (0) 'MS-DOS'\n-EB17C General Purpose Flag  0800 (2048)\n+EBDE7 LOCAL HEADER #479     04034B50 (67324752)\n+EBDEB Extract Zip Spec      14 (20) '2.0'\n+EBDEC Extract OS            00 (0) 'MS-DOS'\n+EBDED General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-EB17E Compression Method    0008 (8) 'Deflated'\n-EB180 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-EB184 CRC                   71BCF1C4 (1908208068)\n-EB188 Compressed Size       00000778 (1912)\n-EB18C Uncompressed Size     00001C37 (7223)\n-EB190 Filename Length       003C (60)\n-EB192 Extra Length          0000 (0)\n-EB194 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+EBDEF Compression Method    0008 (8) 'Deflated'\n+EBDF1 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+EBDF5 CRC                   71BCF1C4 (1908208068)\n+EBDF9 Compressed Size       00000778 (1912)\n+EBDFD Uncompressed Size     00001C37 (7223)\n+EBE01 Filename Length       003C (60)\n+EBE03 Extra Length          0000 (0)\n+EBE05 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xEB194: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEBE05: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-EB1D0 PAYLOAD\n+EBE41 PAYLOAD\n \n-EB948 LOCAL HEADER #480     04034B50 (67324752)\n-EB94C Extract Zip Spec      14 (20) '2.0'\n-EB94D Extract OS            00 (0) 'MS-DOS'\n-EB94E General Purpose Flag  0800 (2048)\n+EC5B9 LOCAL HEADER #480     04034B50 (67324752)\n+EC5BD Extract Zip Spec      14 (20) '2.0'\n+EC5BE Extract OS            00 (0) 'MS-DOS'\n+EC5BF General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-EB950 Compression Method    0008 (8) 'Deflated'\n-EB952 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-EB956 CRC                   940CFA5E (2483878494)\n-EB95A Compressed Size       00000045 (69)\n-EB95E Uncompressed Size     00000048 (72)\n-EB962 Filename Length       0043 (67)\n-EB964 Extra Length          0000 (0)\n-EB966 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+EC5C1 Compression Method    0008 (8) 'Deflated'\n+EC5C3 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+EC5C7 CRC                   940CFA5E (2483878494)\n+EC5CB Compressed Size       00000045 (69)\n+EC5CF Uncompressed Size     00000048 (72)\n+EC5D3 Filename Length       0043 (67)\n+EC5D5 Extra Length          0000 (0)\n+EC5D7 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xEB966: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEC5D7: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-EB9A9 PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+EC61A PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n \n-EB9EE CENTRAL HEADER #1     02014B50 (33639248)\n-EB9F2 Created Zip Spec      14 (20) '2.0'\n-EB9F3 Created OS            03 (3) 'Unix'\n-EB9F4 Extract Zip Spec      0A (10) '1.0'\n-EB9F5 Extract OS            00 (0) 'MS-DOS'\n-EB9F6 General Purpose Flag  0800 (2048)\n+EC65F CENTRAL HEADER #1     02014B50 (33639248)\n+EC663 Created Zip Spec      14 (20) '2.0'\n+EC664 Created OS            03 (3) 'Unix'\n+EC665 Extract Zip Spec      0A (10) '1.0'\n+EC666 Extract OS            00 (0) 'MS-DOS'\n+EC667 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-EB9F8 Compression Method    0000 (0) 'Stored'\n-EB9FA Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-EB9FE CRC                   00000000 (0)\n-EBA02 Compressed Size       00000000 (0)\n-EBA06 Uncompressed Size     00000000 (0)\n-EBA0A Filename Length       0009 (9)\n-EBA0C Extra Length          0000 (0)\n-EBA0E Comment Length        0000 (0)\n-EBA10 Disk Start            0000 (0)\n-EBA12 Int File Attributes   0000 (0)\n+EC669 Compression Method    0000 (0) 'Stored'\n+EC66B Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+EC66F CRC                   00000000 (0)\n+EC673 Compressed Size       00000000 (0)\n+EC677 Uncompressed Size     00000000 (0)\n+EC67B Filename Length       0009 (9)\n+EC67D Extra Length          0000 (0)\n+EC67F Comment Length        0000 (0)\n+EC681 Disk Start            0000 (0)\n+EC683 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-EBA14 Ext File Attributes   41ED0010 (1106051088)\n+EC685 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-EBA18 Local Header Offset   00000000 (0)\n-EBA1C Filename              'XXXXXXXXX'\n+EC689 Local Header Offset   00000000 (0)\n+EC68D Filename              'XXXXXXXXX'\n #\n-# WARNING: Offset 0xEBA1C: Filename 'XXXXXXXXX'\n+# WARNING: Offset 0xEC68D: Filename 'XXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xEBA1C: Directory 'XXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xEC68D: Directory 'XXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xEB9F4: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXX'\n+# WARNING: Offset 0xEC665: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXX'\n #\n \n-EBA25 CENTRAL HEADER #2     02014B50 (33639248)\n-EBA29 Created Zip Spec      14 (20) '2.0'\n-EBA2A Created OS            03 (3) 'Unix'\n-EBA2B Extract Zip Spec      14 (20) '2.0'\n-EBA2C Extract OS            00 (0) 'MS-DOS'\n-EBA2D General Purpose Flag  0800 (2048)\n+EC696 CENTRAL HEADER #2     02014B50 (33639248)\n+EC69A Created Zip Spec      14 (20) '2.0'\n+EC69B Created OS            03 (3) 'Unix'\n+EC69C Extract Zip Spec      14 (20) '2.0'\n+EC69D Extract OS            00 (0) 'MS-DOS'\n+EC69E General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-EBA2F Compression Method    0008 (8) 'Deflated'\n-EBA31 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-EBA35 CRC                   1795241A (395650074)\n-EBA39 Compressed Size       000000A2 (162)\n-EBA3D Uncompressed Size     0000013F (319)\n-EBA41 Filename Length       0014 (20)\n-EBA43 Extra Length          0000 (0)\n-EBA45 Comment Length        0000 (0)\n-EBA47 Disk Start            0000 (0)\n-EBA49 Int File Attributes   0000 (0)\n+EC6A0 Compression Method    0008 (8) 'Deflated'\n+EC6A2 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+EC6A6 CRC                   1795241A (395650074)\n+EC6AA Compressed Size       000000A2 (162)\n+EC6AE Uncompressed Size     0000013F (319)\n+EC6B2 Filename Length       0014 (20)\n+EC6B4 Extra Length          0000 (0)\n+EC6B6 Comment Length        0000 (0)\n+EC6B8 Disk Start            0000 (0)\n+EC6BA Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-EBA4B Ext File Attributes   81A40000 (2175008768)\n+EC6BC Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-EBA4F Local Header Offset   00000027 (39)\n-EBA53 Filename              'XXXXXXXXXXXXXXXXXXXX'\n+EC6C0 Local Header Offset   00000027 (39)\n+EC6C4 Filename              'XXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xEBA53: Filename 'XXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEC6C4: Filename 'XXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-EBA67 CENTRAL HEADER #3     02014B50 (33639248)\n-EBA6B Created Zip Spec      14 (20) '2.0'\n-EBA6C Created OS            03 (3) 'Unix'\n-EBA6D Extract Zip Spec      0A (10) '1.0'\n-EBA6E Extract OS            00 (0) 'MS-DOS'\n-EBA6F General Purpose Flag  0800 (2048)\n+EC6D8 CENTRAL HEADER #3     02014B50 (33639248)\n+EC6DC Created Zip Spec      14 (20) '2.0'\n+EC6DD Created OS            03 (3) 'Unix'\n+EC6DE Extract Zip Spec      0A (10) '1.0'\n+EC6DF Extract OS            00 (0) 'MS-DOS'\n+EC6E0 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-EBA71 Compression Method    0000 (0) 'Stored'\n-EBA73 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-EBA77 CRC                   00000000 (0)\n-EBA7B Compressed Size       00000000 (0)\n-EBA7F Uncompressed Size     00000000 (0)\n-EBA83 Filename Length       0005 (5)\n-EBA85 Extra Length          0000 (0)\n-EBA87 Comment Length        0000 (0)\n-EBA89 Disk Start            0000 (0)\n-EBA8B Int File Attributes   0000 (0)\n+EC6E2 Compression Method    0000 (0) 'Stored'\n+EC6E4 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+EC6E8 CRC                   00000000 (0)\n+EC6EC Compressed Size       00000000 (0)\n+EC6F0 Uncompressed Size     00000000 (0)\n+EC6F4 Filename Length       0005 (5)\n+EC6F6 Extra Length          0000 (0)\n+EC6F8 Comment Length        0000 (0)\n+EC6FA Disk Start            0000 (0)\n+EC6FC Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-EBA8D Ext File Attributes   41ED0010 (1106051088)\n+EC6FE Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-EBA91 Local Header Offset   000000FB (251)\n-EBA95 Filename              'XXXXX'\n+EC702 Local Header Offset   000000FB (251)\n+EC706 Filename              'XXXXX'\n #\n-# WARNING: Offset 0xEBA95: Filename 'XXXXX'\n+# WARNING: Offset 0xEC706: Filename 'XXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xEBA95: Directory 'XXXXX' must end in a '/'\n+# ERROR: Offset 0xEC706: Directory 'XXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xEBA6D: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXX'\n+# WARNING: Offset 0xEC6DE: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXX'\n #\n \n-EBA9A CENTRAL HEADER #4     02014B50 (33639248)\n-EBA9E Created Zip Spec      14 (20) '2.0'\n-EBA9F Created OS            03 (3) 'Unix'\n-EBAA0 Extract Zip Spec      0A (10) '1.0'\n-EBAA1 Extract OS            00 (0) 'MS-DOS'\n-EBAA2 General Purpose Flag  0800 (2048)\n+EC70B CENTRAL HEADER #4     02014B50 (33639248)\n+EC70F Created Zip Spec      14 (20) '2.0'\n+EC710 Created OS            03 (3) 'Unix'\n+EC711 Extract Zip Spec      0A (10) '1.0'\n+EC712 Extract OS            00 (0) 'MS-DOS'\n+EC713 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-EBAA4 Compression Method    0000 (0) 'Stored'\n-EBAA6 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-EBAAA CRC                   00000000 (0)\n-EBAAE Compressed Size       00000000 (0)\n-EBAB2 Uncompressed Size     00000000 (0)\n-EBAB6 Filename Length       0015 (21)\n-EBAB8 Extra Length          0000 (0)\n-EBABA Comment Length        0000 (0)\n-EBABC Disk Start            0000 (0)\n-EBABE Int File Attributes   0000 (0)\n+EC715 Compression Method    0000 (0) 'Stored'\n+EC717 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+EC71B CRC                   00000000 (0)\n+EC71F Compressed Size       00000000 (0)\n+EC723 Uncompressed Size     00000000 (0)\n+EC727 Filename Length       0015 (21)\n+EC729 Extra Length          0000 (0)\n+EC72B Comment Length        0000 (0)\n+EC72D Disk Start            0000 (0)\n+EC72F Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-EBAC0 Ext File Attributes   41ED0010 (1106051088)\n+EC731 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-EBAC4 Local Header Offset   0000011E (286)\n-EBAC8 Filename              'XXXXXXXXXXXXXXXXXXXXX'\n+EC735 Local Header Offset   0000011E (286)\n+EC739 Filename              'XXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xEBAC8: Filename 'XXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEC739: Filename 'XXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xEBAC8: Directory 'XXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xEC739: Directory 'XXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xEBAA0: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEC711: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXX'\n #\n \n-EBADD CENTRAL HEADER #5     02014B50 (33639248)\n-EBAE1 Created Zip Spec      14 (20) '2.0'\n-EBAE2 Created OS            03 (3) 'Unix'\n-EBAE3 Extract Zip Spec      0A (10) '1.0'\n-EBAE4 Extract OS            00 (0) 'MS-DOS'\n-EBAE5 General Purpose Flag  0800 (2048)\n+EC74E CENTRAL HEADER #5     02014B50 (33639248)\n+EC752 Created Zip Spec      14 (20) '2.0'\n+EC753 Created OS            03 (3) 'Unix'\n+EC754 Extract Zip Spec      0A (10) '1.0'\n+EC755 Extract OS            00 (0) 'MS-DOS'\n+EC756 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-EBAE7 Compression Method    0000 (0) 'Stored'\n-EBAE9 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-EBAED CRC                   00000000 (0)\n-EBAF1 Compressed Size       00000000 (0)\n-EBAF5 Uncompressed Size     00000000 (0)\n-EBAF9 Filename Length       0027 (39)\n-EBAFB Extra Length          0000 (0)\n-EBAFD Comment Length        0000 (0)\n-EBAFF Disk Start            0000 (0)\n-EBB01 Int File Attributes   0000 (0)\n+EC758 Compression Method    0000 (0) 'Stored'\n+EC75A Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+EC75E CRC                   00000000 (0)\n+EC762 Compressed Size       00000000 (0)\n+EC766 Uncompressed Size     00000000 (0)\n+EC76A Filename Length       0027 (39)\n+EC76C Extra Length          0000 (0)\n+EC76E Comment Length        0000 (0)\n+EC770 Disk Start            0000 (0)\n+EC772 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-EBB03 Ext File Attributes   41ED0010 (1106051088)\n+EC774 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-EBB07 Local Header Offset   00000151 (337)\n-EBB0B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+EC778 Local Header Offset   00000151 (337)\n+EC77C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xEBB0B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEC77C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xEBB0B: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xEC77C: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xEBAE3: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEC754: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-EBB32 CENTRAL HEADER #6     02014B50 (33639248)\n-EBB36 Created Zip Spec      14 (20) '2.0'\n-EBB37 Created OS            03 (3) 'Unix'\n-EBB38 Extract Zip Spec      0A (10) '1.0'\n-EBB39 Extract OS            00 (0) 'MS-DOS'\n-EBB3A General Purpose Flag  0800 (2048)\n+EC7A3 CENTRAL HEADER #6     02014B50 (33639248)\n+EC7A7 Created Zip Spec      14 (20) '2.0'\n+EC7A8 Created OS            03 (3) 'Unix'\n+EC7A9 Extract Zip Spec      0A (10) '1.0'\n+EC7AA Extract OS            00 (0) 'MS-DOS'\n+EC7AB General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-EBB3C Compression Method    0000 (0) 'Stored'\n-EBB3E Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-EBB42 CRC                   00000000 (0)\n-EBB46 Compressed Size       00000000 (0)\n-EBB4A Uncompressed Size     00000000 (0)\n-EBB4E Filename Length       002E (46)\n-EBB50 Extra Length          0000 (0)\n-EBB52 Comment Length        0000 (0)\n-EBB54 Disk Start            0000 (0)\n-EBB56 Int File Attributes   0000 (0)\n+EC7AD Compression Method    0000 (0) 'Stored'\n+EC7AF Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+EC7B3 CRC                   00000000 (0)\n+EC7B7 Compressed Size       00000000 (0)\n+EC7BB Uncompressed Size     00000000 (0)\n+EC7BF Filename Length       002E (46)\n+EC7C1 Extra Length          0000 (0)\n+EC7C3 Comment Length        0000 (0)\n+EC7C5 Disk Start            0000 (0)\n+EC7C7 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-EBB58 Ext File Attributes   41ED0010 (1106051088)\n+EC7C9 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-EBB5C Local Header Offset   00000196 (406)\n-EBB60 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+EC7CD Local Header Offset   00000196 (406)\n+EC7D1 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xEBB60: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEC7D1: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xEBB60: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xEC7D1: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xEBB38: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEC7A9: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-EBB8E CENTRAL HEADER #7     02014B50 (33639248)\n-EBB92 Created Zip Spec      14 (20) '2.0'\n-EBB93 Created OS            03 (3) 'Unix'\n-EBB94 Extract Zip Spec      0A (10) '1.0'\n-EBB95 Extract OS            00 (0) 'MS-DOS'\n-EBB96 General Purpose Flag  0800 (2048)\n+EC7FF CENTRAL HEADER #7     02014B50 (33639248)\n+EC803 Created Zip Spec      14 (20) '2.0'\n+EC804 Created OS            03 (3) 'Unix'\n+EC805 Extract Zip Spec      0A (10) '1.0'\n+EC806 Extract OS            00 (0) 'MS-DOS'\n+EC807 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-EBB98 Compression Method    0000 (0) 'Stored'\n-EBB9A Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-EBB9E CRC                   00000000 (0)\n-EBBA2 Compressed Size       00000000 (0)\n-EBBA6 Uncompressed Size     00000000 (0)\n-EBBAA Filename Length       0065 (101)\n-EBBAC Extra Length          0000 (0)\n-EBBAE Comment Length        0000 (0)\n-EBBB0 Disk Start            0000 (0)\n-EBBB2 Int File Attributes   0000 (0)\n+EC809 Compression Method    0000 (0) 'Stored'\n+EC80B Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+EC80F CRC                   00000000 (0)\n+EC813 Compressed Size       00000000 (0)\n+EC817 Uncompressed Size     00000000 (0)\n+EC81B Filename Length       0065 (101)\n+EC81D Extra Length          0000 (0)\n+EC81F Comment Length        0000 (0)\n+EC821 Disk Start            0000 (0)\n+EC823 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-EBBB4 Ext File Attributes   41ED0010 (1106051088)\n+EC825 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-EBBB8 Local Header Offset   000001E2 (482)\n-EBBBC Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+EC829 Local Header Offset   000001E2 (482)\n+EC82D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xEBBBC: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEC82D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xEBBBC: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xEC82D: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xEBB94: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEC805: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-EBC21 CENTRAL HEADER #8     02014B50 (33639248)\n-EBC25 Created Zip Spec      14 (20) '2.0'\n-EBC26 Created OS            03 (3) 'Unix'\n-EBC27 Extract Zip Spec      0A (10) '1.0'\n-EBC28 Extract OS            00 (0) 'MS-DOS'\n-EBC29 General Purpose Flag  0800 (2048)\n+EC892 CENTRAL HEADER #8     02014B50 (33639248)\n+EC896 Created Zip Spec      14 (20) '2.0'\n+EC897 Created OS            03 (3) 'Unix'\n+EC898 Extract Zip Spec      0A (10) '1.0'\n+EC899 Extract OS            00 (0) 'MS-DOS'\n+EC89A General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-EBC2B Compression Method    0000 (0) 'Stored'\n-EBC2D Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-EBC31 CRC                   00000000 (0)\n-EBC35 Compressed Size       00000000 (0)\n-EBC39 Uncompressed Size     00000000 (0)\n-EBC3D Filename Length       0025 (37)\n-EBC3F Extra Length          0000 (0)\n-EBC41 Comment Length        0000 (0)\n-EBC43 Disk Start            0000 (0)\n-EBC45 Int File Attributes   0000 (0)\n+EC89C Compression Method    0000 (0) 'Stored'\n+EC89E Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+EC8A2 CRC                   00000000 (0)\n+EC8A6 Compressed Size       00000000 (0)\n+EC8AA Uncompressed Size     00000000 (0)\n+EC8AE Filename Length       0025 (37)\n+EC8B0 Extra Length          0000 (0)\n+EC8B2 Comment Length        0000 (0)\n+EC8B4 Disk Start            0000 (0)\n+EC8B6 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-EBC47 Ext File Attributes   41ED0010 (1106051088)\n+EC8B8 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-EBC4B Local Header Offset   00000265 (613)\n-EBC4F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+EC8BC Local Header Offset   00000265 (613)\n+EC8C0 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xEBC4F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEC8C0: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xEBC4F: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xEC8C0: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xEBC27: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEC898: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-EBC74 CENTRAL HEADER #9     02014B50 (33639248)\n-EBC78 Created Zip Spec      14 (20) '2.0'\n-EBC79 Created OS            03 (3) 'Unix'\n-EBC7A Extract Zip Spec      0A (10) '1.0'\n-EBC7B Extract OS            00 (0) 'MS-DOS'\n-EBC7C General Purpose Flag  0800 (2048)\n+EC8E5 CENTRAL HEADER #9     02014B50 (33639248)\n+EC8E9 Created Zip Spec      14 (20) '2.0'\n+EC8EA Created OS            03 (3) 'Unix'\n+EC8EB Extract Zip Spec      0A (10) '1.0'\n+EC8EC Extract OS            00 (0) 'MS-DOS'\n+EC8ED General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-EBC7E Compression Method    0000 (0) 'Stored'\n-EBC80 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-EBC84 CRC                   00000000 (0)\n-EBC88 Compressed Size       00000000 (0)\n-EBC8C Uncompressed Size     00000000 (0)\n-EBC90 Filename Length       002C (44)\n-EBC92 Extra Length          0000 (0)\n-EBC94 Comment Length        0000 (0)\n-EBC96 Disk Start            0000 (0)\n-EBC98 Int File Attributes   0000 (0)\n+EC8EF Compression Method    0000 (0) 'Stored'\n+EC8F1 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+EC8F5 CRC                   00000000 (0)\n+EC8F9 Compressed Size       00000000 (0)\n+EC8FD Uncompressed Size     00000000 (0)\n+EC901 Filename Length       002C (44)\n+EC903 Extra Length          0000 (0)\n+EC905 Comment Length        0000 (0)\n+EC907 Disk Start            0000 (0)\n+EC909 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-EBC9A Ext File Attributes   41ED0010 (1106051088)\n+EC90B Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-EBC9E Local Header Offset   000002A8 (680)\n-EBCA2 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+EC90F Local Header Offset   000002A8 (680)\n+EC913 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xEBCA2: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEC913: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xEBCA2: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xEC913: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xEBC7A: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEC8EB: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-EBCCE CENTRAL HEADER #10    02014B50 (33639248)\n-EBCD2 Created Zip Spec      14 (20) '2.0'\n-EBCD3 Created OS            03 (3) 'Unix'\n-EBCD4 Extract Zip Spec      0A (10) '1.0'\n-EBCD5 Extract OS            00 (0) 'MS-DOS'\n-EBCD6 General Purpose Flag  0800 (2048)\n+EC93F CENTRAL HEADER #10    02014B50 (33639248)\n+EC943 Created Zip Spec      14 (20) '2.0'\n+EC944 Created OS            03 (3) 'Unix'\n+EC945 Extract Zip Spec      0A (10) '1.0'\n+EC946 Extract OS            00 (0) 'MS-DOS'\n+EC947 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-EBCD8 Compression Method    0000 (0) 'Stored'\n-EBCDA Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-EBCDE CRC                   00000000 (0)\n-EBCE2 Compressed Size       00000000 (0)\n-EBCE6 Uncompressed Size     00000000 (0)\n-EBCEA Filename Length       0061 (97)\n-EBCEC Extra Length          0000 (0)\n-EBCEE Comment Length        0000 (0)\n-EBCF0 Disk Start            0000 (0)\n-EBCF2 Int File Attributes   0000 (0)\n+EC949 Compression Method    0000 (0) 'Stored'\n+EC94B Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+EC94F CRC                   00000000 (0)\n+EC953 Compressed Size       00000000 (0)\n+EC957 Uncompressed Size     00000000 (0)\n+EC95B Filename Length       0061 (97)\n+EC95D Extra Length          0000 (0)\n+EC95F Comment Length        0000 (0)\n+EC961 Disk Start            0000 (0)\n+EC963 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-EBCF4 Ext File Attributes   41ED0010 (1106051088)\n+EC965 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-EBCF8 Local Header Offset   000002F2 (754)\n-EBCFC Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+EC969 Local Header Offset   000002F2 (754)\n+EC96D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xEBCFC: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEC96D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xEBCFC: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xEC96D: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xEBCD4: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEC945: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-EBD5D CENTRAL HEADER #11    02014B50 (33639248)\n-EBD61 Created Zip Spec      14 (20) '2.0'\n-EBD62 Created OS            03 (3) 'Unix'\n-EBD63 Extract Zip Spec      0A (10) '1.0'\n-EBD64 Extract OS            00 (0) 'MS-DOS'\n-EBD65 General Purpose Flag  0800 (2048)\n+EC9CE CENTRAL HEADER #11    02014B50 (33639248)\n+EC9D2 Created Zip Spec      14 (20) '2.0'\n+EC9D3 Created OS            03 (3) 'Unix'\n+EC9D4 Extract Zip Spec      0A (10) '1.0'\n+EC9D5 Extract OS            00 (0) 'MS-DOS'\n+EC9D6 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-EBD67 Compression Method    0000 (0) 'Stored'\n-EBD69 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-EBD6D CRC                   00000000 (0)\n-EBD71 Compressed Size       00000000 (0)\n-EBD75 Uncompressed Size     00000000 (0)\n-EBD79 Filename Length       0023 (35)\n-EBD7B Extra Length          0000 (0)\n-EBD7D Comment Length        0000 (0)\n-EBD7F Disk Start            0000 (0)\n-EBD81 Int File Attributes   0000 (0)\n+EC9D8 Compression Method    0000 (0) 'Stored'\n+EC9DA Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+EC9DE CRC                   00000000 (0)\n+EC9E2 Compressed Size       00000000 (0)\n+EC9E6 Uncompressed Size     00000000 (0)\n+EC9EA Filename Length       0023 (35)\n+EC9EC Extra Length          0000 (0)\n+EC9EE Comment Length        0000 (0)\n+EC9F0 Disk Start            0000 (0)\n+EC9F2 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-EBD83 Ext File Attributes   41ED0010 (1106051088)\n+EC9F4 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-EBD87 Local Header Offset   00000371 (881)\n-EBD8B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+EC9F8 Local Header Offset   00000371 (881)\n+EC9FC Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xEBD8B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEC9FC: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xEBD8B: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xEC9FC: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xEBD63: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEC9D4: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-EBDAE CENTRAL HEADER #12    02014B50 (33639248)\n-EBDB2 Created Zip Spec      14 (20) '2.0'\n-EBDB3 Created OS            03 (3) 'Unix'\n-EBDB4 Extract Zip Spec      0A (10) '1.0'\n-EBDB5 Extract OS            00 (0) 'MS-DOS'\n-EBDB6 General Purpose Flag  0800 (2048)\n+ECA1F CENTRAL HEADER #12    02014B50 (33639248)\n+ECA23 Created Zip Spec      14 (20) '2.0'\n+ECA24 Created OS            03 (3) 'Unix'\n+ECA25 Extract Zip Spec      0A (10) '1.0'\n+ECA26 Extract OS            00 (0) 'MS-DOS'\n+ECA27 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-EBDB8 Compression Method    0000 (0) 'Stored'\n-EBDBA Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-EBDBE CRC                   00000000 (0)\n-EBDC2 Compressed Size       00000000 (0)\n-EBDC6 Uncompressed Size     00000000 (0)\n-EBDCA Filename Length       002A (42)\n-EBDCC Extra Length          0000 (0)\n-EBDCE Comment Length        0000 (0)\n-EBDD0 Disk Start            0000 (0)\n-EBDD2 Int File Attributes   0000 (0)\n+ECA29 Compression Method    0000 (0) 'Stored'\n+ECA2B Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+ECA2F CRC                   00000000 (0)\n+ECA33 Compressed Size       00000000 (0)\n+ECA37 Uncompressed Size     00000000 (0)\n+ECA3B Filename Length       002A (42)\n+ECA3D Extra Length          0000 (0)\n+ECA3F Comment Length        0000 (0)\n+ECA41 Disk Start            0000 (0)\n+ECA43 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-EBDD4 Ext File Attributes   41ED0010 (1106051088)\n+ECA45 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-EBDD8 Local Header Offset   000003B2 (946)\n-EBDDC Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+ECA49 Local Header Offset   000003B2 (946)\n+ECA4D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xEBDDC: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xECA4D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xEBDDC: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xECA4D: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xEBDB4: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xECA25: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-EBE06 CENTRAL HEADER #13    02014B50 (33639248)\n-EBE0A Created Zip Spec      14 (20) '2.0'\n-EBE0B Created OS            03 (3) 'Unix'\n-EBE0C Extract Zip Spec      0A (10) '1.0'\n-EBE0D Extract OS            00 (0) 'MS-DOS'\n-EBE0E General Purpose Flag  0800 (2048)\n+ECA77 CENTRAL HEADER #13    02014B50 (33639248)\n+ECA7B Created Zip Spec      14 (20) '2.0'\n+ECA7C Created OS            03 (3) 'Unix'\n+ECA7D Extract Zip Spec      0A (10) '1.0'\n+ECA7E Extract OS            00 (0) 'MS-DOS'\n+ECA7F General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-EBE10 Compression Method    0000 (0) 'Stored'\n-EBE12 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-EBE16 CRC                   00000000 (0)\n-EBE1A Compressed Size       00000000 (0)\n-EBE1E Uncompressed Size     00000000 (0)\n-EBE22 Filename Length       0056 (86)\n-EBE24 Extra Length          0000 (0)\n-EBE26 Comment Length        0000 (0)\n-EBE28 Disk Start            0000 (0)\n-EBE2A Int File Attributes   0000 (0)\n+ECA81 Compression Method    0000 (0) 'Stored'\n+ECA83 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+ECA87 CRC                   00000000 (0)\n+ECA8B Compressed Size       00000000 (0)\n+ECA8F Uncompressed Size     00000000 (0)\n+ECA93 Filename Length       0056 (86)\n+ECA95 Extra Length          0000 (0)\n+ECA97 Comment Length        0000 (0)\n+ECA99 Disk Start            0000 (0)\n+ECA9B Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-EBE2C Ext File Attributes   41ED0010 (1106051088)\n+ECA9D Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-EBE30 Local Header Offset   000003FA (1018)\n-EBE34 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+ECAA1 Local Header Offset   000003FA (1018)\n+ECAA5 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xEBE34: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xECAA5: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xEBE34: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xECAA5: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xEBE0C: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xECA7D: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-EBE8A CENTRAL HEADER #14    02014B50 (33639248)\n-EBE8E Created Zip Spec      14 (20) '2.0'\n-EBE8F Created OS            03 (3) 'Unix'\n-EBE90 Extract Zip Spec      0A (10) '1.0'\n-EBE91 Extract OS            00 (0) 'MS-DOS'\n-EBE92 General Purpose Flag  0800 (2048)\n+ECAFB CENTRAL HEADER #14    02014B50 (33639248)\n+ECAFF Created Zip Spec      14 (20) '2.0'\n+ECB00 Created OS            03 (3) 'Unix'\n+ECB01 Extract Zip Spec      0A (10) '1.0'\n+ECB02 Extract OS            00 (0) 'MS-DOS'\n+ECB03 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-EBE94 Compression Method    0000 (0) 'Stored'\n-EBE96 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-EBE9A CRC                   00000000 (0)\n-EBE9E Compressed Size       00000000 (0)\n-EBEA2 Uncompressed Size     00000000 (0)\n-EBEA6 Filename Length       0056 (86)\n-EBEA8 Extra Length          0000 (0)\n-EBEAA Comment Length        0000 (0)\n-EBEAC Disk Start            0000 (0)\n-EBEAE Int File Attributes   0000 (0)\n+ECB05 Compression Method    0000 (0) 'Stored'\n+ECB07 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+ECB0B CRC                   00000000 (0)\n+ECB0F Compressed Size       00000000 (0)\n+ECB13 Uncompressed Size     00000000 (0)\n+ECB17 Filename Length       0056 (86)\n+ECB19 Extra Length          0000 (0)\n+ECB1B Comment Length        0000 (0)\n+ECB1D Disk Start            0000 (0)\n+ECB1F Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-EBEB0 Ext File Attributes   41ED0010 (1106051088)\n+ECB21 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-EBEB4 Local Header Offset   0000046E (1134)\n-EBEB8 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+ECB25 Local Header Offset   0000046E (1134)\n+ECB29 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xEBEB8: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xECB29: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xEBEB8: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xECB29: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xEBE90: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xECB01: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-EBF0E CENTRAL HEADER #15    02014B50 (33639248)\n-EBF12 Created Zip Spec      14 (20) '2.0'\n-EBF13 Created OS            03 (3) 'Unix'\n-EBF14 Extract Zip Spec      0A (10) '1.0'\n-EBF15 Extract OS            00 (0) 'MS-DOS'\n-EBF16 General Purpose Flag  0800 (2048)\n+ECB7F CENTRAL HEADER #15    02014B50 (33639248)\n+ECB83 Created Zip Spec      14 (20) '2.0'\n+ECB84 Created OS            03 (3) 'Unix'\n+ECB85 Extract Zip Spec      0A (10) '1.0'\n+ECB86 Extract OS            00 (0) 'MS-DOS'\n+ECB87 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-EBF18 Compression Method    0000 (0) 'Stored'\n-EBF1A Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-EBF1E CRC                   00000000 (0)\n-EBF22 Compressed Size       00000000 (0)\n-EBF26 Uncompressed Size     00000000 (0)\n-EBF2A Filename Length       002F (47)\n-EBF2C Extra Length          0000 (0)\n-EBF2E Comment Length        0000 (0)\n-EBF30 Disk Start            0000 (0)\n-EBF32 Int File Attributes   0000 (0)\n+ECB89 Compression Method    0000 (0) 'Stored'\n+ECB8B Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+ECB8F CRC                   00000000 (0)\n+ECB93 Compressed Size       00000000 (0)\n+ECB97 Uncompressed Size     00000000 (0)\n+ECB9B Filename Length       002F (47)\n+ECB9D Extra Length          0000 (0)\n+ECB9F Comment Length        0000 (0)\n+ECBA1 Disk Start            0000 (0)\n+ECBA3 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-EBF34 Ext File Attributes   41ED0010 (1106051088)\n+ECBA5 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-EBF38 Local Header Offset   000004E2 (1250)\n-EBF3C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+ECBA9 Local Header Offset   000004E2 (1250)\n+ECBAD Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xEBF3C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xECBAD: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xEBF3C: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xECBAD: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xEBF14: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xECB85: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-EBF6B CENTRAL HEADER #16    02014B50 (33639248)\n-EBF6F Created Zip Spec      14 (20) '2.0'\n-EBF70 Created OS            03 (3) 'Unix'\n-EBF71 Extract Zip Spec      0A (10) '1.0'\n-EBF72 Extract OS            00 (0) 'MS-DOS'\n-EBF73 General Purpose Flag  0800 (2048)\n+ECBDC CENTRAL HEADER #16    02014B50 (33639248)\n+ECBE0 Created Zip Spec      14 (20) '2.0'\n+ECBE1 Created OS            03 (3) 'Unix'\n+ECBE2 Extract Zip Spec      0A (10) '1.0'\n+ECBE3 Extract OS            00 (0) 'MS-DOS'\n+ECBE4 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-EBF75 Compression Method    0000 (0) 'Stored'\n-EBF77 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-EBF7B CRC                   00000000 (0)\n-EBF7F Compressed Size       00000000 (0)\n-EBF83 Uncompressed Size     00000000 (0)\n-EBF87 Filename Length       0036 (54)\n-EBF89 Extra Length          0000 (0)\n-EBF8B Comment Length        0000 (0)\n-EBF8D Disk Start            0000 (0)\n-EBF8F Int File Attributes   0000 (0)\n+ECBE6 Compression Method    0000 (0) 'Stored'\n+ECBE8 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+ECBEC CRC                   00000000 (0)\n+ECBF0 Compressed Size       00000000 (0)\n+ECBF4 Uncompressed Size     00000000 (0)\n+ECBF8 Filename Length       0036 (54)\n+ECBFA Extra Length          0000 (0)\n+ECBFC Comment Length        0000 (0)\n+ECBFE Disk Start            0000 (0)\n+ECC00 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-EBF91 Ext File Attributes   41ED0010 (1106051088)\n+ECC02 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-EBF95 Local Header Offset   0000052F (1327)\n-EBF99 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+ECC06 Local Header Offset   0000052F (1327)\n+ECC0A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xEBF99: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xECC0A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xEBF99: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xECC0A: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xEBF71: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xECBE2: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-EBFCF CENTRAL HEADER #17    02014B50 (33639248)\n-EBFD3 Created Zip Spec      14 (20) '2.0'\n-EBFD4 Created OS            03 (3) 'Unix'\n-EBFD5 Extract Zip Spec      0A (10) '1.0'\n-EBFD6 Extract OS            00 (0) 'MS-DOS'\n-EBFD7 General Purpose Flag  0800 (2048)\n+ECC40 CENTRAL HEADER #17    02014B50 (33639248)\n+ECC44 Created Zip Spec      14 (20) '2.0'\n+ECC45 Created OS            03 (3) 'Unix'\n+ECC46 Extract Zip Spec      0A (10) '1.0'\n+ECC47 Extract OS            00 (0) 'MS-DOS'\n+ECC48 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-EBFD9 Compression Method    0000 (0) 'Stored'\n-EBFDB Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-EBFDF CRC                   00000000 (0)\n-EBFE3 Compressed Size       00000000 (0)\n-EBFE7 Uncompressed Size     00000000 (0)\n-EBFEB Filename Length       0066 (102)\n-EBFED Extra Length          0000 (0)\n-EBFEF Comment Length        0000 (0)\n-EBFF1 Disk Start            0000 (0)\n-EBFF3 Int File Attributes   0000 (0)\n+ECC4A Compression Method    0000 (0) 'Stored'\n+ECC4C Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+ECC50 CRC                   00000000 (0)\n+ECC54 Compressed Size       00000000 (0)\n+ECC58 Uncompressed Size     00000000 (0)\n+ECC5C Filename Length       0066 (102)\n+ECC5E Extra Length          0000 (0)\n+ECC60 Comment Length        0000 (0)\n+ECC62 Disk Start            0000 (0)\n+ECC64 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-EBFF5 Ext File Attributes   41ED0010 (1106051088)\n+ECC66 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-EBFF9 Local Header Offset   00000583 (1411)\n-EBFFD Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+ECC6A Local Header Offset   00000583 (1411)\n+ECC6E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xEBFFD: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xECC6E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xEBFFD: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xECC6E: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xEBFD5: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xECC46: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-EC063 CENTRAL HEADER #18    02014B50 (33639248)\n-EC067 Created Zip Spec      14 (20) '2.0'\n-EC068 Created OS            03 (3) 'Unix'\n-EC069 Extract Zip Spec      0A (10) '1.0'\n-EC06A Extract OS            00 (0) 'MS-DOS'\n-EC06B General Purpose Flag  0800 (2048)\n+ECCD4 CENTRAL HEADER #18    02014B50 (33639248)\n+ECCD8 Created Zip Spec      14 (20) '2.0'\n+ECCD9 Created OS            03 (3) 'Unix'\n+ECCDA Extract Zip Spec      0A (10) '1.0'\n+ECCDB Extract OS            00 (0) 'MS-DOS'\n+ECCDC General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-EC06D Compression Method    0000 (0) 'Stored'\n-EC06F Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-EC073 CRC                   00000000 (0)\n-EC077 Compressed Size       00000000 (0)\n-EC07B Uncompressed Size     00000000 (0)\n-EC07F Filename Length       0022 (34)\n-EC081 Extra Length          0000 (0)\n-EC083 Comment Length        0000 (0)\n-EC085 Disk Start            0000 (0)\n-EC087 Int File Attributes   0000 (0)\n+ECCDE Compression Method    0000 (0) 'Stored'\n+ECCE0 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+ECCE4 CRC                   00000000 (0)\n+ECCE8 Compressed Size       00000000 (0)\n+ECCEC Uncompressed Size     00000000 (0)\n+ECCF0 Filename Length       0022 (34)\n+ECCF2 Extra Length          0000 (0)\n+ECCF4 Comment Length        0000 (0)\n+ECCF6 Disk Start            0000 (0)\n+ECCF8 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-EC089 Ext File Attributes   41ED0010 (1106051088)\n+ECCFA Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-EC08D Local Header Offset   00000607 (1543)\n-EC091 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+ECCFE Local Header Offset   00000607 (1543)\n+ECD02 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xEC091: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xECD02: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xEC091: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xECD02: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xEC069: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xECCDA: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-EC0B3 CENTRAL HEADER #19    02014B50 (33639248)\n-EC0B7 Created Zip Spec      14 (20) '2.0'\n-EC0B8 Created OS            03 (3) 'Unix'\n-EC0B9 Extract Zip Spec      0A (10) '1.0'\n-EC0BA Extract OS            00 (0) 'MS-DOS'\n-EC0BB General Purpose Flag  0800 (2048)\n+ECD24 CENTRAL HEADER #19    02014B50 (33639248)\n+ECD28 Created Zip Spec      14 (20) '2.0'\n+ECD29 Created OS            03 (3) 'Unix'\n+ECD2A Extract Zip Spec      0A (10) '1.0'\n+ECD2B Extract OS            00 (0) 'MS-DOS'\n+ECD2C General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-EC0BD Compression Method    0000 (0) 'Stored'\n-EC0BF Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-EC0C3 CRC                   00000000 (0)\n-EC0C7 Compressed Size       00000000 (0)\n-EC0CB Uncompressed Size     00000000 (0)\n-EC0CF Filename Length       0029 (41)\n-EC0D1 Extra Length          0000 (0)\n-EC0D3 Comment Length        0000 (0)\n-EC0D5 Disk Start            0000 (0)\n-EC0D7 Int File Attributes   0000 (0)\n+ECD2E Compression Method    0000 (0) 'Stored'\n+ECD30 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+ECD34 CRC                   00000000 (0)\n+ECD38 Compressed Size       00000000 (0)\n+ECD3C Uncompressed Size     00000000 (0)\n+ECD40 Filename Length       0029 (41)\n+ECD42 Extra Length          0000 (0)\n+ECD44 Comment Length        0000 (0)\n+ECD46 Disk Start            0000 (0)\n+ECD48 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-EC0D9 Ext File Attributes   41ED0010 (1106051088)\n+ECD4A Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-EC0DD Local Header Offset   00000647 (1607)\n-EC0E1 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+ECD4E Local Header Offset   00000647 (1607)\n+ECD52 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xEC0E1: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xECD52: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xEC0E1: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xECD52: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xEC0B9: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xECD2A: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-EC10A CENTRAL HEADER #20    02014B50 (33639248)\n-EC10E Created Zip Spec      14 (20) '2.0'\n-EC10F Created OS            03 (3) 'Unix'\n-EC110 Extract Zip Spec      0A (10) '1.0'\n-EC111 Extract OS            00 (0) 'MS-DOS'\n-EC112 General Purpose Flag  0800 (2048)\n+ECD7B CENTRAL HEADER #20    02014B50 (33639248)\n+ECD7F Created Zip Spec      14 (20) '2.0'\n+ECD80 Created OS            03 (3) 'Unix'\n+ECD81 Extract Zip Spec      0A (10) '1.0'\n+ECD82 Extract OS            00 (0) 'MS-DOS'\n+ECD83 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-EC114 Compression Method    0000 (0) 'Stored'\n-EC116 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-EC11A CRC                   00000000 (0)\n-EC11E Compressed Size       00000000 (0)\n-EC122 Uncompressed Size     00000000 (0)\n-EC126 Filename Length       0063 (99)\n-EC128 Extra Length          0000 (0)\n-EC12A Comment Length        0000 (0)\n-EC12C Disk Start            0000 (0)\n-EC12E Int File Attributes   0000 (0)\n+ECD85 Compression Method    0000 (0) 'Stored'\n+ECD87 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+ECD8B CRC                   00000000 (0)\n+ECD8F Compressed Size       00000000 (0)\n+ECD93 Uncompressed Size     00000000 (0)\n+ECD97 Filename Length       0063 (99)\n+ECD99 Extra Length          0000 (0)\n+ECD9B Comment Length        0000 (0)\n+ECD9D Disk Start            0000 (0)\n+ECD9F Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-EC130 Ext File Attributes   41ED0010 (1106051088)\n+ECDA1 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-EC134 Local Header Offset   0000068E (1678)\n-EC138 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+ECDA5 Local Header Offset   0000068E (1678)\n+ECDA9 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xEC138: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xECDA9: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xEC138: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xECDA9: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xEC110: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xECD81: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-EC19B CENTRAL HEADER #21    02014B50 (33639248)\n-EC19F Created Zip Spec      14 (20) '2.0'\n-EC1A0 Created OS            03 (3) 'Unix'\n-EC1A1 Extract Zip Spec      0A (10) '1.0'\n-EC1A2 Extract OS            00 (0) 'MS-DOS'\n-EC1A3 General Purpose Flag  0800 (2048)\n+ECE0C CENTRAL HEADER #21    02014B50 (33639248)\n+ECE10 Created Zip Spec      14 (20) '2.0'\n+ECE11 Created OS            03 (3) 'Unix'\n+ECE12 Extract Zip Spec      0A (10) '1.0'\n+ECE13 Extract OS            00 (0) 'MS-DOS'\n+ECE14 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-EC1A5 Compression Method    0000 (0) 'Stored'\n-EC1A7 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-EC1AB CRC                   00000000 (0)\n-EC1AF Compressed Size       00000000 (0)\n-EC1B3 Uncompressed Size     00000000 (0)\n-EC1B7 Filename Length       006C (108)\n-EC1B9 Extra Length          0000 (0)\n-EC1BB Comment Length        0000 (0)\n-EC1BD Disk Start            0000 (0)\n-EC1BF Int File Attributes   0000 (0)\n+ECE16 Compression Method    0000 (0) 'Stored'\n+ECE18 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+ECE1C CRC                   00000000 (0)\n+ECE20 Compressed Size       00000000 (0)\n+ECE24 Uncompressed Size     00000000 (0)\n+ECE28 Filename Length       006C (108)\n+ECE2A Extra Length          0000 (0)\n+ECE2C Comment Length        0000 (0)\n+ECE2E Disk Start            0000 (0)\n+ECE30 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-EC1C1 Ext File Attributes   41ED0010 (1106051088)\n+ECE32 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-EC1C5 Local Header Offset   0000070F (1807)\n-EC1C9 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+ECE36 Local Header Offset   0000070F (1807)\n+ECE3A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xEC1C9: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xECE3A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xEC1C9: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xECE3A: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xEC1A1: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xECE12: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-EC235 CENTRAL HEADER #22    02014B50 (33639248)\n-EC239 Created Zip Spec      14 (20) '2.0'\n-EC23A Created OS            03 (3) 'Unix'\n-EC23B Extract Zip Spec      0A (10) '1.0'\n-EC23C Extract OS            00 (0) 'MS-DOS'\n-EC23D General Purpose Flag  0800 (2048)\n+ECEA6 CENTRAL HEADER #22    02014B50 (33639248)\n+ECEAA Created Zip Spec      14 (20) '2.0'\n+ECEAB Created OS            03 (3) 'Unix'\n+ECEAC Extract Zip Spec      0A (10) '1.0'\n+ECEAD Extract OS            00 (0) 'MS-DOS'\n+ECEAE General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-EC23F Compression Method    0000 (0) 'Stored'\n-EC241 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-EC245 CRC                   00000000 (0)\n-EC249 Compressed Size       00000000 (0)\n-EC24D Uncompressed Size     00000000 (0)\n-EC251 Filename Length       0066 (102)\n-EC253 Extra Length          0000 (0)\n-EC255 Comment Length        0000 (0)\n-EC257 Disk Start            0000 (0)\n-EC259 Int File Attributes   0000 (0)\n+ECEB0 Compression Method    0000 (0) 'Stored'\n+ECEB2 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+ECEB6 CRC                   00000000 (0)\n+ECEBA Compressed Size       00000000 (0)\n+ECEBE Uncompressed Size     00000000 (0)\n+ECEC2 Filename Length       0066 (102)\n+ECEC4 Extra Length          0000 (0)\n+ECEC6 Comment Length        0000 (0)\n+ECEC8 Disk Start            0000 (0)\n+ECECA Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-EC25B Ext File Attributes   41ED0010 (1106051088)\n+ECECC Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-EC25F Local Header Offset   00000799 (1945)\n-EC263 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+ECED0 Local Header Offset   00000799 (1945)\n+ECED4 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xEC263: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xECED4: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xEC263: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xECED4: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xEC23B: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xECEAC: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-EC2C9 CENTRAL HEADER #23    02014B50 (33639248)\n-EC2CD Created Zip Spec      14 (20) '2.0'\n-EC2CE Created OS            03 (3) 'Unix'\n-EC2CF Extract Zip Spec      0A (10) '1.0'\n-EC2D0 Extract OS            00 (0) 'MS-DOS'\n-EC2D1 General Purpose Flag  0800 (2048)\n+ECF3A CENTRAL HEADER #23    02014B50 (33639248)\n+ECF3E Created Zip Spec      14 (20) '2.0'\n+ECF3F Created OS            03 (3) 'Unix'\n+ECF40 Extract Zip Spec      0A (10) '1.0'\n+ECF41 Extract OS            00 (0) 'MS-DOS'\n+ECF42 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-EC2D3 Compression Method    0000 (0) 'Stored'\n-EC2D5 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-EC2D9 CRC                   00000000 (0)\n-EC2DD Compressed Size       00000000 (0)\n-EC2E1 Uncompressed Size     00000000 (0)\n-EC2E5 Filename Length       0062 (98)\n-EC2E7 Extra Length          0000 (0)\n-EC2E9 Comment Length        0000 (0)\n-EC2EB Disk Start            0000 (0)\n-EC2ED Int File Attributes   0000 (0)\n+ECF44 Compression Method    0000 (0) 'Stored'\n+ECF46 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+ECF4A CRC                   00000000 (0)\n+ECF4E Compressed Size       00000000 (0)\n+ECF52 Uncompressed Size     00000000 (0)\n+ECF56 Filename Length       0062 (98)\n+ECF58 Extra Length          0000 (0)\n+ECF5A Comment Length        0000 (0)\n+ECF5C Disk Start            0000 (0)\n+ECF5E Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-EC2EF Ext File Attributes   41ED0010 (1106051088)\n+ECF60 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-EC2F3 Local Header Offset   0000081D (2077)\n-EC2F7 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+ECF64 Local Header Offset   0000081D (2077)\n+ECF68 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xEC2F7: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xECF68: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xEC2F7: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xECF68: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xEC2CF: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xECF40: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-EC359 CENTRAL HEADER #24    02014B50 (33639248)\n-EC35D Created Zip Spec      14 (20) '2.0'\n-EC35E Created OS            03 (3) 'Unix'\n-EC35F Extract Zip Spec      0A (10) '1.0'\n-EC360 Extract OS            00 (0) 'MS-DOS'\n-EC361 General Purpose Flag  0800 (2048)\n+ECFCA CENTRAL HEADER #24    02014B50 (33639248)\n+ECFCE Created Zip Spec      14 (20) '2.0'\n+ECFCF Created OS            03 (3) 'Unix'\n+ECFD0 Extract Zip Spec      0A (10) '1.0'\n+ECFD1 Extract OS            00 (0) 'MS-DOS'\n+ECFD2 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-EC363 Compression Method    0000 (0) 'Stored'\n-EC365 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-EC369 CRC                   00000000 (0)\n-EC36D Compressed Size       00000000 (0)\n-EC371 Uncompressed Size     00000000 (0)\n-EC375 Filename Length       006C (108)\n-EC377 Extra Length          0000 (0)\n-EC379 Comment Length        0000 (0)\n-EC37B Disk Start            0000 (0)\n-EC37D Int File Attributes   0000 (0)\n+ECFD4 Compression Method    0000 (0) 'Stored'\n+ECFD6 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+ECFDA CRC                   00000000 (0)\n+ECFDE Compressed Size       00000000 (0)\n+ECFE2 Uncompressed Size     00000000 (0)\n+ECFE6 Filename Length       006C (108)\n+ECFE8 Extra Length          0000 (0)\n+ECFEA Comment Length        0000 (0)\n+ECFEC Disk Start            0000 (0)\n+ECFEE Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-EC37F Ext File Attributes   41ED0010 (1106051088)\n+ECFF0 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-EC383 Local Header Offset   0000089D (2205)\n-EC387 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+ECFF4 Local Header Offset   0000089D (2205)\n+ECFF8 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xEC387: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xECFF8: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xEC387: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xECFF8: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xEC35F: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xECFD0: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-EC3F3 CENTRAL HEADER #25    02014B50 (33639248)\n-EC3F7 Created Zip Spec      14 (20) '2.0'\n-EC3F8 Created OS            03 (3) 'Unix'\n-EC3F9 Extract Zip Spec      0A (10) '1.0'\n-EC3FA Extract OS            00 (0) 'MS-DOS'\n-EC3FB General Purpose Flag  0800 (2048)\n+ED064 CENTRAL HEADER #25    02014B50 (33639248)\n+ED068 Created Zip Spec      14 (20) '2.0'\n+ED069 Created OS            03 (3) 'Unix'\n+ED06A Extract Zip Spec      0A (10) '1.0'\n+ED06B Extract OS            00 (0) 'MS-DOS'\n+ED06C General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-EC3FD Compression Method    0000 (0) 'Stored'\n-EC3FF Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-EC403 CRC                   00000000 (0)\n-EC407 Compressed Size       00000000 (0)\n-EC40B Uncompressed Size     00000000 (0)\n-EC40F Filename Length       0068 (104)\n-EC411 Extra Length          0000 (0)\n-EC413 Comment Length        0000 (0)\n-EC415 Disk Start            0000 (0)\n-EC417 Int File Attributes   0000 (0)\n+ED06E Compression Method    0000 (0) 'Stored'\n+ED070 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+ED074 CRC                   00000000 (0)\n+ED078 Compressed Size       00000000 (0)\n+ED07C Uncompressed Size     00000000 (0)\n+ED080 Filename Length       0068 (104)\n+ED082 Extra Length          0000 (0)\n+ED084 Comment Length        0000 (0)\n+ED086 Disk Start            0000 (0)\n+ED088 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-EC419 Ext File Attributes   41ED0010 (1106051088)\n+ED08A Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-EC41D Local Header Offset   00000927 (2343)\n-EC421 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+ED08E Local Header Offset   00000927 (2343)\n+ED092 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xEC421: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xED092: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xEC421: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xED092: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xEC3F9: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xED06A: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-EC489 CENTRAL HEADER #26    02014B50 (33639248)\n-EC48D Created Zip Spec      14 (20) '2.0'\n-EC48E Created OS            03 (3) 'Unix'\n-EC48F Extract Zip Spec      0A (10) '1.0'\n-EC490 Extract OS            00 (0) 'MS-DOS'\n-EC491 General Purpose Flag  0800 (2048)\n+ED0FA CENTRAL HEADER #26    02014B50 (33639248)\n+ED0FE Created Zip Spec      14 (20) '2.0'\n+ED0FF Created OS            03 (3) 'Unix'\n+ED100 Extract Zip Spec      0A (10) '1.0'\n+ED101 Extract OS            00 (0) 'MS-DOS'\n+ED102 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-EC493 Compression Method    0000 (0) 'Stored'\n-EC495 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-EC499 CRC                   00000000 (0)\n-EC49D Compressed Size       00000000 (0)\n-EC4A1 Uncompressed Size     00000000 (0)\n-EC4A5 Filename Length       0070 (112)\n-EC4A7 Extra Length          0000 (0)\n-EC4A9 Comment Length        0000 (0)\n-EC4AB Disk Start            0000 (0)\n-EC4AD Int File Attributes   0000 (0)\n+ED104 Compression Method    0000 (0) 'Stored'\n+ED106 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+ED10A CRC                   00000000 (0)\n+ED10E Compressed Size       00000000 (0)\n+ED112 Uncompressed Size     00000000 (0)\n+ED116 Filename Length       0070 (112)\n+ED118 Extra Length          0000 (0)\n+ED11A Comment Length        0000 (0)\n+ED11C Disk Start            0000 (0)\n+ED11E Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-EC4AF Ext File Attributes   41ED0010 (1106051088)\n+ED120 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-EC4B3 Local Header Offset   000009AD (2477)\n-EC4B7 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+ED124 Local Header Offset   000009AD (2477)\n+ED128 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xEC4B7: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xED128: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xEC4B7: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xED128: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xEC48F: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xED100: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-EC527 CENTRAL HEADER #27    02014B50 (33639248)\n-EC52B Created Zip Spec      14 (20) '2.0'\n-EC52C Created OS            03 (3) 'Unix'\n-EC52D Extract Zip Spec      0A (10) '1.0'\n-EC52E Extract OS            00 (0) 'MS-DOS'\n-EC52F General Purpose Flag  0800 (2048)\n+ED198 CENTRAL HEADER #27    02014B50 (33639248)\n+ED19C Created Zip Spec      14 (20) '2.0'\n+ED19D Created OS            03 (3) 'Unix'\n+ED19E Extract Zip Spec      0A (10) '1.0'\n+ED19F Extract OS            00 (0) 'MS-DOS'\n+ED1A0 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-EC531 Compression Method    0000 (0) 'Stored'\n-EC533 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-EC537 CRC                   00000000 (0)\n-EC53B Compressed Size       00000000 (0)\n-EC53F Uncompressed Size     00000000 (0)\n-EC543 Filename Length       006C (108)\n-EC545 Extra Length          0000 (0)\n-EC547 Comment Length        0000 (0)\n-EC549 Disk Start            0000 (0)\n-EC54B Int File Attributes   0000 (0)\n+ED1A2 Compression Method    0000 (0) 'Stored'\n+ED1A4 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+ED1A8 CRC                   00000000 (0)\n+ED1AC Compressed Size       00000000 (0)\n+ED1B0 Uncompressed Size     00000000 (0)\n+ED1B4 Filename Length       006C (108)\n+ED1B6 Extra Length          0000 (0)\n+ED1B8 Comment Length        0000 (0)\n+ED1BA Disk Start            0000 (0)\n+ED1BC Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-EC54D Ext File Attributes   41ED0010 (1106051088)\n+ED1BE Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-EC551 Local Header Offset   00000A3B (2619)\n-EC555 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+ED1C2 Local Header Offset   00000A3B (2619)\n+ED1C6 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xEC555: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xED1C6: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xEC555: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xED1C6: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xEC52D: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xED19E: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-EC5C1 CENTRAL HEADER #28    02014B50 (33639248)\n-EC5C5 Created Zip Spec      14 (20) '2.0'\n-EC5C6 Created OS            03 (3) 'Unix'\n-EC5C7 Extract Zip Spec      0A (10) '1.0'\n-EC5C8 Extract OS            00 (0) 'MS-DOS'\n-EC5C9 General Purpose Flag  0800 (2048)\n+ED232 CENTRAL HEADER #28    02014B50 (33639248)\n+ED236 Created Zip Spec      14 (20) '2.0'\n+ED237 Created OS            03 (3) 'Unix'\n+ED238 Extract Zip Spec      0A (10) '1.0'\n+ED239 Extract OS            00 (0) 'MS-DOS'\n+ED23A General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-EC5CB Compression Method    0000 (0) 'Stored'\n-EC5CD Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-EC5D1 CRC                   00000000 (0)\n-EC5D5 Compressed Size       00000000 (0)\n-EC5D9 Uncompressed Size     00000000 (0)\n-EC5DD Filename Length       006E (110)\n-EC5DF Extra Length          0000 (0)\n-EC5E1 Comment Length        0000 (0)\n-EC5E3 Disk Start            0000 (0)\n-EC5E5 Int File Attributes   0000 (0)\n+ED23C Compression Method    0000 (0) 'Stored'\n+ED23E Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+ED242 CRC                   00000000 (0)\n+ED246 Compressed Size       00000000 (0)\n+ED24A Uncompressed Size     00000000 (0)\n+ED24E Filename Length       006E (110)\n+ED250 Extra Length          0000 (0)\n+ED252 Comment Length        0000 (0)\n+ED254 Disk Start            0000 (0)\n+ED256 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-EC5E7 Ext File Attributes   41ED0010 (1106051088)\n+ED258 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-EC5EB Local Header Offset   00000AC5 (2757)\n-EC5EF Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+ED25C Local Header Offset   00000AC5 (2757)\n+ED260 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xEC5EF: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xED260: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xEC5EF: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xED260: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xEC5C7: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xED238: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-EC65D CENTRAL HEADER #29    02014B50 (33639248)\n-EC661 Created Zip Spec      14 (20) '2.0'\n-EC662 Created OS            03 (3) 'Unix'\n-EC663 Extract Zip Spec      0A (10) '1.0'\n-EC664 Extract OS            00 (0) 'MS-DOS'\n-EC665 General Purpose Flag  0800 (2048)\n+ED2CE CENTRAL HEADER #29    02014B50 (33639248)\n+ED2D2 Created Zip Spec      14 (20) '2.0'\n+ED2D3 Created OS            03 (3) 'Unix'\n+ED2D4 Extract Zip Spec      0A (10) '1.0'\n+ED2D5 Extract OS            00 (0) 'MS-DOS'\n+ED2D6 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-EC667 Compression Method    0000 (0) 'Stored'\n-EC669 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-EC66D CRC                   00000000 (0)\n-EC671 Compressed Size       00000000 (0)\n-EC675 Uncompressed Size     00000000 (0)\n-EC679 Filename Length       006A (106)\n-EC67B Extra Length          0000 (0)\n-EC67D Comment Length        0000 (0)\n-EC67F Disk Start            0000 (0)\n-EC681 Int File Attributes   0000 (0)\n+ED2D8 Compression Method    0000 (0) 'Stored'\n+ED2DA Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+ED2DE CRC                   00000000 (0)\n+ED2E2 Compressed Size       00000000 (0)\n+ED2E6 Uncompressed Size     00000000 (0)\n+ED2EA Filename Length       006A (106)\n+ED2EC Extra Length          0000 (0)\n+ED2EE Comment Length        0000 (0)\n+ED2F0 Disk Start            0000 (0)\n+ED2F2 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-EC683 Ext File Attributes   41ED0010 (1106051088)\n+ED2F4 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-EC687 Local Header Offset   00000B51 (2897)\n-EC68B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+ED2F8 Local Header Offset   00000B51 (2897)\n+ED2FC Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xEC68B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xED2FC: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xEC68B: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xED2FC: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xEC663: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xED2D4: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-EC6F5 CENTRAL HEADER #30    02014B50 (33639248)\n-EC6F9 Created Zip Spec      14 (20) '2.0'\n-EC6FA Created OS            03 (3) 'Unix'\n-EC6FB Extract Zip Spec      0A (10) '1.0'\n-EC6FC Extract OS            00 (0) 'MS-DOS'\n-EC6FD General Purpose Flag  0800 (2048)\n+ED366 CENTRAL HEADER #30    02014B50 (33639248)\n+ED36A Created Zip Spec      14 (20) '2.0'\n+ED36B Created OS            03 (3) 'Unix'\n+ED36C Extract Zip Spec      0A (10) '1.0'\n+ED36D Extract OS            00 (0) 'MS-DOS'\n+ED36E General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-EC6FF Compression Method    0000 (0) 'Stored'\n-EC701 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-EC705 CRC                   00000000 (0)\n-EC709 Compressed Size       00000000 (0)\n-EC70D Uncompressed Size     00000000 (0)\n-EC711 Filename Length       0052 (82)\n-EC713 Extra Length          0000 (0)\n-EC715 Comment Length        0000 (0)\n-EC717 Disk Start            0000 (0)\n-EC719 Int File Attributes   0000 (0)\n+ED370 Compression Method    0000 (0) 'Stored'\n+ED372 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+ED376 CRC                   00000000 (0)\n+ED37A Compressed Size       00000000 (0)\n+ED37E Uncompressed Size     00000000 (0)\n+ED382 Filename Length       0052 (82)\n+ED384 Extra Length          0000 (0)\n+ED386 Comment Length        0000 (0)\n+ED388 Disk Start            0000 (0)\n+ED38A Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-EC71B Ext File Attributes   41ED0010 (1106051088)\n+ED38C Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-EC71F Local Header Offset   00000BD9 (3033)\n-EC723 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+ED390 Local Header Offset   00000BD9 (3033)\n+ED394 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xEC723: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xED394: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xEC723: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xED394: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xEC6FB: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xED36C: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-EC775 CENTRAL HEADER #31    02014B50 (33639248)\n-EC779 Created Zip Spec      14 (20) '2.0'\n-EC77A Created OS            03 (3) 'Unix'\n-EC77B Extract Zip Spec      0A (10) '1.0'\n-EC77C Extract OS            00 (0) 'MS-DOS'\n-EC77D General Purpose Flag  0800 (2048)\n+ED3E6 CENTRAL HEADER #31    02014B50 (33639248)\n+ED3EA Created Zip Spec      14 (20) '2.0'\n+ED3EB Created OS            03 (3) 'Unix'\n+ED3EC Extract Zip Spec      0A (10) '1.0'\n+ED3ED Extract OS            00 (0) 'MS-DOS'\n+ED3EE General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-EC77F Compression Method    0000 (0) 'Stored'\n-EC781 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-EC785 CRC                   00000000 (0)\n-EC789 Compressed Size       00000000 (0)\n-EC78D Uncompressed Size     00000000 (0)\n-EC791 Filename Length       0057 (87)\n-EC793 Extra Length          0000 (0)\n-EC795 Comment Length        0000 (0)\n-EC797 Disk Start            0000 (0)\n-EC799 Int File Attributes   0000 (0)\n+ED3F0 Compression Method    0000 (0) 'Stored'\n+ED3F2 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+ED3F6 CRC                   00000000 (0)\n+ED3FA Compressed Size       00000000 (0)\n+ED3FE Uncompressed Size     00000000 (0)\n+ED402 Filename Length       0057 (87)\n+ED404 Extra Length          0000 (0)\n+ED406 Comment Length        0000 (0)\n+ED408 Disk Start            0000 (0)\n+ED40A Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-EC79B Ext File Attributes   41ED0010 (1106051088)\n+ED40C Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-EC79F Local Header Offset   00000C49 (3145)\n-EC7A3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+ED410 Local Header Offset   00000C49 (3145)\n+ED414 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xEC7A3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xED414: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xEC7A3: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xED414: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xEC77B: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xED3EC: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-EC7FA CENTRAL HEADER #32    02014B50 (33639248)\n-EC7FE Created Zip Spec      14 (20) '2.0'\n-EC7FF Created OS            03 (3) 'Unix'\n-EC800 Extract Zip Spec      0A (10) '1.0'\n-EC801 Extract OS            00 (0) 'MS-DOS'\n-EC802 General Purpose Flag  0800 (2048)\n+ED46B CENTRAL HEADER #32    02014B50 (33639248)\n+ED46F Created Zip Spec      14 (20) '2.0'\n+ED470 Created OS            03 (3) 'Unix'\n+ED471 Extract Zip Spec      0A (10) '1.0'\n+ED472 Extract OS            00 (0) 'MS-DOS'\n+ED473 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-EC804 Compression Method    0000 (0) 'Stored'\n-EC806 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-EC80A CRC                   00000000 (0)\n-EC80E Compressed Size       00000000 (0)\n-EC812 Uncompressed Size     00000000 (0)\n-EC816 Filename Length       0072 (114)\n-EC818 Extra Length          0000 (0)\n-EC81A Comment Length        0000 (0)\n-EC81C Disk Start            0000 (0)\n-EC81E Int File Attributes   0000 (0)\n+ED475 Compression Method    0000 (0) 'Stored'\n+ED477 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+ED47B CRC                   00000000 (0)\n+ED47F Compressed Size       00000000 (0)\n+ED483 Uncompressed Size     00000000 (0)\n+ED487 Filename Length       0072 (114)\n+ED489 Extra Length          0000 (0)\n+ED48B Comment Length        0000 (0)\n+ED48D Disk Start            0000 (0)\n+ED48F Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-EC820 Ext File Attributes   41ED0010 (1106051088)\n+ED491 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-EC824 Local Header Offset   00000CBE (3262)\n-EC828 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+ED495 Local Header Offset   00000CBE (3262)\n+ED499 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xEC828: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xED499: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xEC828: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xED499: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xEC800: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xED471: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-EC89A CENTRAL HEADER #33    02014B50 (33639248)\n-EC89E Created Zip Spec      14 (20) '2.0'\n-EC89F Created OS            03 (3) 'Unix'\n-EC8A0 Extract Zip Spec      0A (10) '1.0'\n-EC8A1 Extract OS            00 (0) 'MS-DOS'\n-EC8A2 General Purpose Flag  0800 (2048)\n+ED50B CENTRAL HEADER #33    02014B50 (33639248)\n+ED50F Created Zip Spec      14 (20) '2.0'\n+ED510 Created OS            03 (3) 'Unix'\n+ED511 Extract Zip Spec      0A (10) '1.0'\n+ED512 Extract OS            00 (0) 'MS-DOS'\n+ED513 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-EC8A4 Compression Method    0000 (0) 'Stored'\n-EC8A6 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-EC8AA CRC                   00000000 (0)\n-EC8AE Compressed Size       00000000 (0)\n-EC8B2 Uncompressed Size     00000000 (0)\n-EC8B6 Filename Length       0024 (36)\n-EC8B8 Extra Length          0000 (0)\n-EC8BA Comment Length        0000 (0)\n-EC8BC Disk Start            0000 (0)\n-EC8BE Int File Attributes   0000 (0)\n+ED515 Compression Method    0000 (0) 'Stored'\n+ED517 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+ED51B CRC                   00000000 (0)\n+ED51F Compressed Size       00000000 (0)\n+ED523 Uncompressed Size     00000000 (0)\n+ED527 Filename Length       0024 (36)\n+ED529 Extra Length          0000 (0)\n+ED52B Comment Length        0000 (0)\n+ED52D Disk Start            0000 (0)\n+ED52F Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-EC8C0 Ext File Attributes   41ED0010 (1106051088)\n+ED531 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-EC8C4 Local Header Offset   00000D4E (3406)\n-EC8C8 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+ED535 Local Header Offset   00000D4E (3406)\n+ED539 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xEC8C8: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xED539: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xEC8C8: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xED539: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xEC8A0: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xED511: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-EC8EC CENTRAL HEADER #34    02014B50 (33639248)\n-EC8F0 Created Zip Spec      14 (20) '2.0'\n-EC8F1 Created OS            03 (3) 'Unix'\n-EC8F2 Extract Zip Spec      0A (10) '1.0'\n-EC8F3 Extract OS            00 (0) 'MS-DOS'\n-EC8F4 General Purpose Flag  0800 (2048)\n+ED55D CENTRAL HEADER #34    02014B50 (33639248)\n+ED561 Created Zip Spec      14 (20) '2.0'\n+ED562 Created OS            03 (3) 'Unix'\n+ED563 Extract Zip Spec      0A (10) '1.0'\n+ED564 Extract OS            00 (0) 'MS-DOS'\n+ED565 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-EC8F6 Compression Method    0000 (0) 'Stored'\n-EC8F8 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-EC8FC CRC                   00000000 (0)\n-EC900 Compressed Size       00000000 (0)\n-EC904 Uncompressed Size     00000000 (0)\n-EC908 Filename Length       002B (43)\n-EC90A Extra Length          0000 (0)\n-EC90C Comment Length        0000 (0)\n-EC90E Disk Start            0000 (0)\n-EC910 Int File Attributes   0000 (0)\n+ED567 Compression Method    0000 (0) 'Stored'\n+ED569 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+ED56D CRC                   00000000 (0)\n+ED571 Compressed Size       00000000 (0)\n+ED575 Uncompressed Size     00000000 (0)\n+ED579 Filename Length       002B (43)\n+ED57B Extra Length          0000 (0)\n+ED57D Comment Length        0000 (0)\n+ED57F Disk Start            0000 (0)\n+ED581 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-EC912 Ext File Attributes   41ED0010 (1106051088)\n+ED583 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-EC916 Local Header Offset   00000D90 (3472)\n-EC91A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+ED587 Local Header Offset   00000D90 (3472)\n+ED58B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xEC91A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xED58B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xEC91A: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xED58B: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xEC8F2: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xED563: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-EC945 CENTRAL HEADER #35    02014B50 (33639248)\n-EC949 Created Zip Spec      14 (20) '2.0'\n-EC94A Created OS            03 (3) 'Unix'\n-EC94B Extract Zip Spec      0A (10) '1.0'\n-EC94C Extract OS            00 (0) 'MS-DOS'\n-EC94D General Purpose Flag  0800 (2048)\n+ED5B6 CENTRAL HEADER #35    02014B50 (33639248)\n+ED5BA Created Zip Spec      14 (20) '2.0'\n+ED5BB Created OS            03 (3) 'Unix'\n+ED5BC Extract Zip Spec      0A (10) '1.0'\n+ED5BD Extract OS            00 (0) 'MS-DOS'\n+ED5BE General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-EC94F Compression Method    0000 (0) 'Stored'\n-EC951 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-EC955 CRC                   00000000 (0)\n-EC959 Compressed Size       00000000 (0)\n-EC95D Uncompressed Size     00000000 (0)\n-EC961 Filename Length       006C (108)\n-EC963 Extra Length          0000 (0)\n-EC965 Comment Length        0000 (0)\n-EC967 Disk Start            0000 (0)\n-EC969 Int File Attributes   0000 (0)\n+ED5C0 Compression Method    0000 (0) 'Stored'\n+ED5C2 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+ED5C6 CRC                   00000000 (0)\n+ED5CA Compressed Size       00000000 (0)\n+ED5CE Uncompressed Size     00000000 (0)\n+ED5D2 Filename Length       006C (108)\n+ED5D4 Extra Length          0000 (0)\n+ED5D6 Comment Length        0000 (0)\n+ED5D8 Disk Start            0000 (0)\n+ED5DA Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-EC96B Ext File Attributes   41ED0010 (1106051088)\n+ED5DC Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-EC96F Local Header Offset   00000DD9 (3545)\n-EC973 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+ED5E0 Local Header Offset   00000DD9 (3545)\n+ED5E4 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xEC973: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xED5E4: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xEC973: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xED5E4: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xEC94B: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xED5BC: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-EC9DF CENTRAL HEADER #36    02014B50 (33639248)\n-EC9E3 Created Zip Spec      14 (20) '2.0'\n-EC9E4 Created OS            03 (3) 'Unix'\n-EC9E5 Extract Zip Spec      0A (10) '1.0'\n-EC9E6 Extract OS            00 (0) 'MS-DOS'\n-EC9E7 General Purpose Flag  0800 (2048)\n+ED650 CENTRAL HEADER #36    02014B50 (33639248)\n+ED654 Created Zip Spec      14 (20) '2.0'\n+ED655 Created OS            03 (3) 'Unix'\n+ED656 Extract Zip Spec      0A (10) '1.0'\n+ED657 Extract OS            00 (0) 'MS-DOS'\n+ED658 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-EC9E9 Compression Method    0000 (0) 'Stored'\n-EC9EB Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-EC9EF CRC                   00000000 (0)\n-EC9F3 Compressed Size       00000000 (0)\n-EC9F7 Uncompressed Size     00000000 (0)\n-EC9FB Filename Length       0073 (115)\n-EC9FD Extra Length          0000 (0)\n-EC9FF Comment Length        0000 (0)\n-ECA01 Disk Start            0000 (0)\n-ECA03 Int File Attributes   0000 (0)\n+ED65A Compression Method    0000 (0) 'Stored'\n+ED65C Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+ED660 CRC                   00000000 (0)\n+ED664 Compressed Size       00000000 (0)\n+ED668 Uncompressed Size     00000000 (0)\n+ED66C Filename Length       0073 (115)\n+ED66E Extra Length          0000 (0)\n+ED670 Comment Length        0000 (0)\n+ED672 Disk Start            0000 (0)\n+ED674 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-ECA05 Ext File Attributes   41ED0010 (1106051088)\n+ED676 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-ECA09 Local Header Offset   00000E63 (3683)\n-ECA0D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+ED67A Local Header Offset   00000E63 (3683)\n+ED67E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xECA0D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xED67E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xECA0D: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xED67E: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xEC9E5: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xED656: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-ECA80 CENTRAL HEADER #37    02014B50 (33639248)\n-ECA84 Created Zip Spec      14 (20) '2.0'\n-ECA85 Created OS            03 (3) 'Unix'\n-ECA86 Extract Zip Spec      0A (10) '1.0'\n-ECA87 Extract OS            00 (0) 'MS-DOS'\n-ECA88 General Purpose Flag  0800 (2048)\n+ED6F1 CENTRAL HEADER #37    02014B50 (33639248)\n+ED6F5 Created Zip Spec      14 (20) '2.0'\n+ED6F6 Created OS            03 (3) 'Unix'\n+ED6F7 Extract Zip Spec      0A (10) '1.0'\n+ED6F8 Extract OS            00 (0) 'MS-DOS'\n+ED6F9 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-ECA8A Compression Method    0000 (0) 'Stored'\n-ECA8C Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-ECA90 CRC                   00000000 (0)\n-ECA94 Compressed Size       00000000 (0)\n-ECA98 Uncompressed Size     00000000 (0)\n-ECA9C Filename Length       0022 (34)\n-ECA9E Extra Length          0000 (0)\n-ECAA0 Comment Length        0000 (0)\n-ECAA2 Disk Start            0000 (0)\n-ECAA4 Int File Attributes   0000 (0)\n+ED6FB Compression Method    0000 (0) 'Stored'\n+ED6FD Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+ED701 CRC                   00000000 (0)\n+ED705 Compressed Size       00000000 (0)\n+ED709 Uncompressed Size     00000000 (0)\n+ED70D Filename Length       0022 (34)\n+ED70F Extra Length          0000 (0)\n+ED711 Comment Length        0000 (0)\n+ED713 Disk Start            0000 (0)\n+ED715 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-ECAA6 Ext File Attributes   41ED0010 (1106051088)\n+ED717 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-ECAAA Local Header Offset   00000EF4 (3828)\n-ECAAE Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+ED71B Local Header Offset   00000EF4 (3828)\n+ED71F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xECAAE: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xED71F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xECAAE: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xED71F: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xECA86: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xED6F7: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-ECAD0 CENTRAL HEADER #38    02014B50 (33639248)\n-ECAD4 Created Zip Spec      14 (20) '2.0'\n-ECAD5 Created OS            03 (3) 'Unix'\n-ECAD6 Extract Zip Spec      0A (10) '1.0'\n-ECAD7 Extract OS            00 (0) 'MS-DOS'\n-ECAD8 General Purpose Flag  0800 (2048)\n+ED741 CENTRAL HEADER #38    02014B50 (33639248)\n+ED745 Created Zip Spec      14 (20) '2.0'\n+ED746 Created OS            03 (3) 'Unix'\n+ED747 Extract Zip Spec      0A (10) '1.0'\n+ED748 Extract OS            00 (0) 'MS-DOS'\n+ED749 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-ECADA Compression Method    0000 (0) 'Stored'\n-ECADC Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-ECAE0 CRC                   00000000 (0)\n-ECAE4 Compressed Size       00000000 (0)\n-ECAE8 Uncompressed Size     00000000 (0)\n-ECAEC Filename Length       0029 (41)\n-ECAEE Extra Length          0000 (0)\n-ECAF0 Comment Length        0000 (0)\n-ECAF2 Disk Start            0000 (0)\n-ECAF4 Int File Attributes   0000 (0)\n+ED74B Compression Method    0000 (0) 'Stored'\n+ED74D Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+ED751 CRC                   00000000 (0)\n+ED755 Compressed Size       00000000 (0)\n+ED759 Uncompressed Size     00000000 (0)\n+ED75D Filename Length       0029 (41)\n+ED75F Extra Length          0000 (0)\n+ED761 Comment Length        0000 (0)\n+ED763 Disk Start            0000 (0)\n+ED765 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-ECAF6 Ext File Attributes   41ED0010 (1106051088)\n+ED767 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-ECAFA Local Header Offset   00000F34 (3892)\n-ECAFE Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+ED76B Local Header Offset   00000F34 (3892)\n+ED76F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xECAFE: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xED76F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xECAFE: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xED76F: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xECAD6: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xED747: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-ECB27 CENTRAL HEADER #39    02014B50 (33639248)\n-ECB2B Created Zip Spec      14 (20) '2.0'\n-ECB2C Created OS            03 (3) 'Unix'\n-ECB2D Extract Zip Spec      0A (10) '1.0'\n-ECB2E Extract OS            00 (0) 'MS-DOS'\n-ECB2F General Purpose Flag  0800 (2048)\n+ED798 CENTRAL HEADER #39    02014B50 (33639248)\n+ED79C Created Zip Spec      14 (20) '2.0'\n+ED79D Created OS            03 (3) 'Unix'\n+ED79E Extract Zip Spec      0A (10) '1.0'\n+ED79F Extract OS            00 (0) 'MS-DOS'\n+ED7A0 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-ECB31 Compression Method    0000 (0) 'Stored'\n-ECB33 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-ECB37 CRC                   00000000 (0)\n-ECB3B Compressed Size       00000000 (0)\n-ECB3F Uncompressed Size     00000000 (0)\n-ECB43 Filename Length       0055 (85)\n-ECB45 Extra Length          0000 (0)\n-ECB47 Comment Length        0000 (0)\n-ECB49 Disk Start            0000 (0)\n-ECB4B Int File Attributes   0000 (0)\n+ED7A2 Compression Method    0000 (0) 'Stored'\n+ED7A4 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+ED7A8 CRC                   00000000 (0)\n+ED7AC Compressed Size       00000000 (0)\n+ED7B0 Uncompressed Size     00000000 (0)\n+ED7B4 Filename Length       0055 (85)\n+ED7B6 Extra Length          0000 (0)\n+ED7B8 Comment Length        0000 (0)\n+ED7BA Disk Start            0000 (0)\n+ED7BC Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-ECB4D Ext File Attributes   41ED0010 (1106051088)\n+ED7BE Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-ECB51 Local Header Offset   00000F7B (3963)\n-ECB55 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+ED7C2 Local Header Offset   00000F7B (3963)\n+ED7C6 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xECB55: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xED7C6: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xECB55: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xED7C6: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xECB2D: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xED79E: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-ECBAA CENTRAL HEADER #40    02014B50 (33639248)\n-ECBAE Created Zip Spec      14 (20) '2.0'\n-ECBAF Created OS            03 (3) 'Unix'\n-ECBB0 Extract Zip Spec      0A (10) '1.0'\n-ECBB1 Extract OS            00 (0) 'MS-DOS'\n-ECBB2 General Purpose Flag  0800 (2048)\n+ED81B CENTRAL HEADER #40    02014B50 (33639248)\n+ED81F Created Zip Spec      14 (20) '2.0'\n+ED820 Created OS            03 (3) 'Unix'\n+ED821 Extract Zip Spec      0A (10) '1.0'\n+ED822 Extract OS            00 (0) 'MS-DOS'\n+ED823 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-ECBB4 Compression Method    0000 (0) 'Stored'\n-ECBB6 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-ECBBA CRC                   00000000 (0)\n-ECBBE Compressed Size       00000000 (0)\n-ECBC2 Uncompressed Size     00000000 (0)\n-ECBC6 Filename Length       0054 (84)\n-ECBC8 Extra Length          0000 (0)\n-ECBCA Comment Length        0000 (0)\n-ECBCC Disk Start            0000 (0)\n-ECBCE Int File Attributes   0000 (0)\n+ED825 Compression Method    0000 (0) 'Stored'\n+ED827 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+ED82B CRC                   00000000 (0)\n+ED82F Compressed Size       00000000 (0)\n+ED833 Uncompressed Size     00000000 (0)\n+ED837 Filename Length       0054 (84)\n+ED839 Extra Length          0000 (0)\n+ED83B Comment Length        0000 (0)\n+ED83D Disk Start            0000 (0)\n+ED83F Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-ECBD0 Ext File Attributes   41ED0010 (1106051088)\n+ED841 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-ECBD4 Local Header Offset   00000FEE (4078)\n-ECBD8 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+ED845 Local Header Offset   00000FEE (4078)\n+ED849 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xECBD8: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xED849: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xECBD8: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xED849: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xECBB0: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xED821: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-ECC2C CENTRAL HEADER #41    02014B50 (33639248)\n-ECC30 Created Zip Spec      14 (20) '2.0'\n-ECC31 Created OS            03 (3) 'Unix'\n-ECC32 Extract Zip Spec      0A (10) '1.0'\n-ECC33 Extract OS            00 (0) 'MS-DOS'\n-ECC34 General Purpose Flag  0800 (2048)\n+ED89D CENTRAL HEADER #41    02014B50 (33639248)\n+ED8A1 Created Zip Spec      14 (20) '2.0'\n+ED8A2 Created OS            03 (3) 'Unix'\n+ED8A3 Extract Zip Spec      0A (10) '1.0'\n+ED8A4 Extract OS            00 (0) 'MS-DOS'\n+ED8A5 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-ECC36 Compression Method    0000 (0) 'Stored'\n-ECC38 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-ECC3C CRC                   00000000 (0)\n-ECC40 Compressed Size       00000000 (0)\n-ECC44 Uncompressed Size     00000000 (0)\n-ECC48 Filename Length       0053 (83)\n-ECC4A Extra Length          0000 (0)\n-ECC4C Comment Length        0000 (0)\n-ECC4E Disk Start            0000 (0)\n-ECC50 Int File Attributes   0000 (0)\n+ED8A7 Compression Method    0000 (0) 'Stored'\n+ED8A9 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+ED8AD CRC                   00000000 (0)\n+ED8B1 Compressed Size       00000000 (0)\n+ED8B5 Uncompressed Size     00000000 (0)\n+ED8B9 Filename Length       0053 (83)\n+ED8BB Extra Length          0000 (0)\n+ED8BD Comment Length        0000 (0)\n+ED8BF Disk Start            0000 (0)\n+ED8C1 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-ECC52 Ext File Attributes   41ED0010 (1106051088)\n+ED8C3 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-ECC56 Local Header Offset   00001060 (4192)\n-ECC5A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+ED8C7 Local Header Offset   00001060 (4192)\n+ED8CB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xECC5A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xED8CB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xECC5A: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xED8CB: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xECC32: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xED8A3: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-ECCAD CENTRAL HEADER #42    02014B50 (33639248)\n-ECCB1 Created Zip Spec      14 (20) '2.0'\n-ECCB2 Created OS            03 (3) 'Unix'\n-ECCB3 Extract Zip Spec      0A (10) '1.0'\n-ECCB4 Extract OS            00 (0) 'MS-DOS'\n-ECCB5 General Purpose Flag  0800 (2048)\n+ED91E CENTRAL HEADER #42    02014B50 (33639248)\n+ED922 Created Zip Spec      14 (20) '2.0'\n+ED923 Created OS            03 (3) 'Unix'\n+ED924 Extract Zip Spec      0A (10) '1.0'\n+ED925 Extract OS            00 (0) 'MS-DOS'\n+ED926 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-ECCB7 Compression Method    0000 (0) 'Stored'\n-ECCB9 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-ECCBD CRC                   00000000 (0)\n-ECCC1 Compressed Size       00000000 (0)\n-ECCC5 Uncompressed Size     00000000 (0)\n-ECCC9 Filename Length       002B (43)\n-ECCCB Extra Length          0000 (0)\n-ECCCD Comment Length        0000 (0)\n-ECCCF Disk Start            0000 (0)\n-ECCD1 Int File Attributes   0000 (0)\n+ED928 Compression Method    0000 (0) 'Stored'\n+ED92A Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+ED92E CRC                   00000000 (0)\n+ED932 Compressed Size       00000000 (0)\n+ED936 Uncompressed Size     00000000 (0)\n+ED93A Filename Length       002B (43)\n+ED93C Extra Length          0000 (0)\n+ED93E Comment Length        0000 (0)\n+ED940 Disk Start            0000 (0)\n+ED942 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-ECCD3 Ext File Attributes   41ED0010 (1106051088)\n+ED944 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-ECCD7 Local Header Offset   000010D1 (4305)\n-ECCDB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+ED948 Local Header Offset   000010D1 (4305)\n+ED94C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xECCDB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xED94C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xECCDB: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xED94C: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xECCB3: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xED924: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-ECD06 CENTRAL HEADER #43    02014B50 (33639248)\n-ECD0A Created Zip Spec      14 (20) '2.0'\n-ECD0B Created OS            03 (3) 'Unix'\n-ECD0C Extract Zip Spec      0A (10) '1.0'\n-ECD0D Extract OS            00 (0) 'MS-DOS'\n-ECD0E General Purpose Flag  0800 (2048)\n+ED977 CENTRAL HEADER #43    02014B50 (33639248)\n+ED97B Created Zip Spec      14 (20) '2.0'\n+ED97C Created OS            03 (3) 'Unix'\n+ED97D Extract Zip Spec      0A (10) '1.0'\n+ED97E Extract OS            00 (0) 'MS-DOS'\n+ED97F General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-ECD10 Compression Method    0000 (0) 'Stored'\n-ECD12 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-ECD16 CRC                   00000000 (0)\n-ECD1A Compressed Size       00000000 (0)\n-ECD1E Uncompressed Size     00000000 (0)\n-ECD22 Filename Length       0032 (50)\n-ECD24 Extra Length          0000 (0)\n-ECD26 Comment Length        0000 (0)\n-ECD28 Disk Start            0000 (0)\n-ECD2A Int File Attributes   0000 (0)\n+ED981 Compression Method    0000 (0) 'Stored'\n+ED983 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+ED987 CRC                   00000000 (0)\n+ED98B Compressed Size       00000000 (0)\n+ED98F Uncompressed Size     00000000 (0)\n+ED993 Filename Length       0032 (50)\n+ED995 Extra Length          0000 (0)\n+ED997 Comment Length        0000 (0)\n+ED999 Disk Start            0000 (0)\n+ED99B Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-ECD2C Ext File Attributes   41ED0010 (1106051088)\n+ED99D Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-ECD30 Local Header Offset   0000111A (4378)\n-ECD34 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+ED9A1 Local Header Offset   0000111A (4378)\n+ED9A5 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xECD34: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xED9A5: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xECD34: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xED9A5: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xECD0C: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xED97D: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-ECD66 CENTRAL HEADER #44    02014B50 (33639248)\n-ECD6A Created Zip Spec      14 (20) '2.0'\n-ECD6B Created OS            03 (3) 'Unix'\n-ECD6C Extract Zip Spec      0A (10) '1.0'\n-ECD6D Extract OS            00 (0) 'MS-DOS'\n-ECD6E General Purpose Flag  0800 (2048)\n+ED9D7 CENTRAL HEADER #44    02014B50 (33639248)\n+ED9DB Created Zip Spec      14 (20) '2.0'\n+ED9DC Created OS            03 (3) 'Unix'\n+ED9DD Extract Zip Spec      0A (10) '1.0'\n+ED9DE Extract OS            00 (0) 'MS-DOS'\n+ED9DF General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-ECD70 Compression Method    0000 (0) 'Stored'\n-ECD72 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-ECD76 CRC                   00000000 (0)\n-ECD7A Compressed Size       00000000 (0)\n-ECD7E Uncompressed Size     00000000 (0)\n-ECD82 Filename Length       0079 (121)\n-ECD84 Extra Length          0000 (0)\n-ECD86 Comment Length        0000 (0)\n-ECD88 Disk Start            0000 (0)\n-ECD8A Int File Attributes   0000 (0)\n+ED9E1 Compression Method    0000 (0) 'Stored'\n+ED9E3 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+ED9E7 CRC                   00000000 (0)\n+ED9EB Compressed Size       00000000 (0)\n+ED9EF Uncompressed Size     00000000 (0)\n+ED9F3 Filename Length       0079 (121)\n+ED9F5 Extra Length          0000 (0)\n+ED9F7 Comment Length        0000 (0)\n+ED9F9 Disk Start            0000 (0)\n+ED9FB Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-ECD8C Ext File Attributes   41ED0010 (1106051088)\n+ED9FD Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-ECD90 Local Header Offset   0000116A (4458)\n-ECD94 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+EDA01 Local Header Offset   0000116A (4458)\n+EDA05 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xECD94: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEDA05: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xECD94: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xEDA05: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xECD6C: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xED9DD: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-ECE0D CENTRAL HEADER #45    02014B50 (33639248)\n-ECE11 Created Zip Spec      14 (20) '2.0'\n-ECE12 Created OS            03 (3) 'Unix'\n-ECE13 Extract Zip Spec      0A (10) '1.0'\n-ECE14 Extract OS            00 (0) 'MS-DOS'\n-ECE15 General Purpose Flag  0800 (2048)\n+EDA7E CENTRAL HEADER #45    02014B50 (33639248)\n+EDA82 Created Zip Spec      14 (20) '2.0'\n+EDA83 Created OS            03 (3) 'Unix'\n+EDA84 Extract Zip Spec      0A (10) '1.0'\n+EDA85 Extract OS            00 (0) 'MS-DOS'\n+EDA86 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-ECE17 Compression Method    0000 (0) 'Stored'\n-ECE19 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-ECE1D CRC                   00000000 (0)\n-ECE21 Compressed Size       00000000 (0)\n-ECE25 Uncompressed Size     00000000 (0)\n-ECE29 Filename Length       0023 (35)\n-ECE2B Extra Length          0000 (0)\n-ECE2D Comment Length        0000 (0)\n-ECE2F Disk Start            0000 (0)\n-ECE31 Int File Attributes   0000 (0)\n+EDA88 Compression Method    0000 (0) 'Stored'\n+EDA8A Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+EDA8E CRC                   00000000 (0)\n+EDA92 Compressed Size       00000000 (0)\n+EDA96 Uncompressed Size     00000000 (0)\n+EDA9A Filename Length       0023 (35)\n+EDA9C Extra Length          0000 (0)\n+EDA9E Comment Length        0000 (0)\n+EDAA0 Disk Start            0000 (0)\n+EDAA2 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-ECE33 Ext File Attributes   41ED0010 (1106051088)\n+EDAA4 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-ECE37 Local Header Offset   00001201 (4609)\n-ECE3B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+EDAA8 Local Header Offset   00001201 (4609)\n+EDAAC Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xECE3B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEDAAC: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xECE3B: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xEDAAC: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xECE13: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEDA84: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-ECE5E CENTRAL HEADER #46    02014B50 (33639248)\n-ECE62 Created Zip Spec      14 (20) '2.0'\n-ECE63 Created OS            03 (3) 'Unix'\n-ECE64 Extract Zip Spec      0A (10) '1.0'\n-ECE65 Extract OS            00 (0) 'MS-DOS'\n-ECE66 General Purpose Flag  0800 (2048)\n+EDACF CENTRAL HEADER #46    02014B50 (33639248)\n+EDAD3 Created Zip Spec      14 (20) '2.0'\n+EDAD4 Created OS            03 (3) 'Unix'\n+EDAD5 Extract Zip Spec      0A (10) '1.0'\n+EDAD6 Extract OS            00 (0) 'MS-DOS'\n+EDAD7 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-ECE68 Compression Method    0000 (0) 'Stored'\n-ECE6A Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-ECE6E CRC                   00000000 (0)\n-ECE72 Compressed Size       00000000 (0)\n-ECE76 Uncompressed Size     00000000 (0)\n-ECE7A Filename Length       002A (42)\n-ECE7C Extra Length          0000 (0)\n-ECE7E Comment Length        0000 (0)\n-ECE80 Disk Start            0000 (0)\n-ECE82 Int File Attributes   0000 (0)\n+EDAD9 Compression Method    0000 (0) 'Stored'\n+EDADB Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+EDADF CRC                   00000000 (0)\n+EDAE3 Compressed Size       00000000 (0)\n+EDAE7 Uncompressed Size     00000000 (0)\n+EDAEB Filename Length       002A (42)\n+EDAED Extra Length          0000 (0)\n+EDAEF Comment Length        0000 (0)\n+EDAF1 Disk Start            0000 (0)\n+EDAF3 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-ECE84 Ext File Attributes   41ED0010 (1106051088)\n+EDAF5 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-ECE88 Local Header Offset   00001242 (4674)\n-ECE8C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+EDAF9 Local Header Offset   00001242 (4674)\n+EDAFD Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xECE8C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEDAFD: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xECE8C: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xEDAFD: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xECE64: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEDAD5: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-ECEB6 CENTRAL HEADER #47    02014B50 (33639248)\n-ECEBA Created Zip Spec      14 (20) '2.0'\n-ECEBB Created OS            03 (3) 'Unix'\n-ECEBC Extract Zip Spec      0A (10) '1.0'\n-ECEBD Extract OS            00 (0) 'MS-DOS'\n-ECEBE General Purpose Flag  0800 (2048)\n+EDB27 CENTRAL HEADER #47    02014B50 (33639248)\n+EDB2B Created Zip Spec      14 (20) '2.0'\n+EDB2C Created OS            03 (3) 'Unix'\n+EDB2D Extract Zip Spec      0A (10) '1.0'\n+EDB2E Extract OS            00 (0) 'MS-DOS'\n+EDB2F General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-ECEC0 Compression Method    0000 (0) 'Stored'\n-ECEC2 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-ECEC6 CRC                   00000000 (0)\n-ECECA Compressed Size       00000000 (0)\n-ECECE Uncompressed Size     00000000 (0)\n-ECED2 Filename Length       0060 (96)\n-ECED4 Extra Length          0000 (0)\n-ECED6 Comment Length        0000 (0)\n-ECED8 Disk Start            0000 (0)\n-ECEDA Int File Attributes   0000 (0)\n+EDB31 Compression Method    0000 (0) 'Stored'\n+EDB33 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+EDB37 CRC                   00000000 (0)\n+EDB3B Compressed Size       00000000 (0)\n+EDB3F Uncompressed Size     00000000 (0)\n+EDB43 Filename Length       0060 (96)\n+EDB45 Extra Length          0000 (0)\n+EDB47 Comment Length        0000 (0)\n+EDB49 Disk Start            0000 (0)\n+EDB4B Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-ECEDC Ext File Attributes   41ED0010 (1106051088)\n+EDB4D Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-ECEE0 Local Header Offset   0000128A (4746)\n-ECEE4 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+EDB51 Local Header Offset   0000128A (4746)\n+EDB55 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xECEE4: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEDB55: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xECEE4: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xEDB55: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xECEBC: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEDB2D: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-ECF44 CENTRAL HEADER #48    02014B50 (33639248)\n-ECF48 Created Zip Spec      14 (20) '2.0'\n-ECF49 Created OS            03 (3) 'Unix'\n-ECF4A Extract Zip Spec      0A (10) '1.0'\n-ECF4B Extract OS            00 (0) 'MS-DOS'\n-ECF4C General Purpose Flag  0800 (2048)\n+EDBB5 CENTRAL HEADER #48    02014B50 (33639248)\n+EDBB9 Created Zip Spec      14 (20) '2.0'\n+EDBBA Created OS            03 (3) 'Unix'\n+EDBBB Extract Zip Spec      0A (10) '1.0'\n+EDBBC Extract OS            00 (0) 'MS-DOS'\n+EDBBD General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-ECF4E Compression Method    0000 (0) 'Stored'\n-ECF50 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-ECF54 CRC                   00000000 (0)\n-ECF58 Compressed Size       00000000 (0)\n-ECF5C Uncompressed Size     00000000 (0)\n-ECF60 Filename Length       0025 (37)\n-ECF62 Extra Length          0000 (0)\n-ECF64 Comment Length        0000 (0)\n-ECF66 Disk Start            0000 (0)\n-ECF68 Int File Attributes   0000 (0)\n+EDBBF Compression Method    0000 (0) 'Stored'\n+EDBC1 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+EDBC5 CRC                   00000000 (0)\n+EDBC9 Compressed Size       00000000 (0)\n+EDBCD Uncompressed Size     00000000 (0)\n+EDBD1 Filename Length       0025 (37)\n+EDBD3 Extra Length          0000 (0)\n+EDBD5 Comment Length        0000 (0)\n+EDBD7 Disk Start            0000 (0)\n+EDBD9 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-ECF6A Ext File Attributes   41ED0010 (1106051088)\n+EDBDB Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-ECF6E Local Header Offset   00001308 (4872)\n-ECF72 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+EDBDF Local Header Offset   00001308 (4872)\n+EDBE3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xECF72: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEDBE3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xECF72: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xEDBE3: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xECF4A: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEDBBB: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-ECF97 CENTRAL HEADER #49    02014B50 (33639248)\n-ECF9B Created Zip Spec      14 (20) '2.0'\n-ECF9C Created OS            03 (3) 'Unix'\n-ECF9D Extract Zip Spec      0A (10) '1.0'\n-ECF9E Extract OS            00 (0) 'MS-DOS'\n-ECF9F General Purpose Flag  0800 (2048)\n+EDC08 CENTRAL HEADER #49    02014B50 (33639248)\n+EDC0C Created Zip Spec      14 (20) '2.0'\n+EDC0D Created OS            03 (3) 'Unix'\n+EDC0E Extract Zip Spec      0A (10) '1.0'\n+EDC0F Extract OS            00 (0) 'MS-DOS'\n+EDC10 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-ECFA1 Compression Method    0000 (0) 'Stored'\n-ECFA3 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-ECFA7 CRC                   00000000 (0)\n-ECFAB Compressed Size       00000000 (0)\n-ECFAF Uncompressed Size     00000000 (0)\n-ECFB3 Filename Length       002C (44)\n-ECFB5 Extra Length          0000 (0)\n-ECFB7 Comment Length        0000 (0)\n-ECFB9 Disk Start            0000 (0)\n-ECFBB Int File Attributes   0000 (0)\n+EDC12 Compression Method    0000 (0) 'Stored'\n+EDC14 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+EDC18 CRC                   00000000 (0)\n+EDC1C Compressed Size       00000000 (0)\n+EDC20 Uncompressed Size     00000000 (0)\n+EDC24 Filename Length       002C (44)\n+EDC26 Extra Length          0000 (0)\n+EDC28 Comment Length        0000 (0)\n+EDC2A Disk Start            0000 (0)\n+EDC2C Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-ECFBD Ext File Attributes   41ED0010 (1106051088)\n+EDC2E Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-ECFC1 Local Header Offset   0000134B (4939)\n-ECFC5 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+EDC32 Local Header Offset   0000134B (4939)\n+EDC36 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xECFC5: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEDC36: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xECFC5: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xEDC36: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xECF9D: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEDC0E: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-ECFF1 CENTRAL HEADER #50    02014B50 (33639248)\n-ECFF5 Created Zip Spec      14 (20) '2.0'\n-ECFF6 Created OS            03 (3) 'Unix'\n-ECFF7 Extract Zip Spec      0A (10) '1.0'\n-ECFF8 Extract OS            00 (0) 'MS-DOS'\n-ECFF9 General Purpose Flag  0800 (2048)\n+EDC62 CENTRAL HEADER #50    02014B50 (33639248)\n+EDC66 Created Zip Spec      14 (20) '2.0'\n+EDC67 Created OS            03 (3) 'Unix'\n+EDC68 Extract Zip Spec      0A (10) '1.0'\n+EDC69 Extract OS            00 (0) 'MS-DOS'\n+EDC6A General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-ECFFB Compression Method    0000 (0) 'Stored'\n-ECFFD Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-ED001 CRC                   00000000 (0)\n-ED005 Compressed Size       00000000 (0)\n-ED009 Uncompressed Size     00000000 (0)\n-ED00D Filename Length       005D (93)\n-ED00F Extra Length          0000 (0)\n-ED011 Comment Length        0000 (0)\n-ED013 Disk Start            0000 (0)\n-ED015 Int File Attributes   0000 (0)\n+EDC6C Compression Method    0000 (0) 'Stored'\n+EDC6E Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+EDC72 CRC                   00000000 (0)\n+EDC76 Compressed Size       00000000 (0)\n+EDC7A Uncompressed Size     00000000 (0)\n+EDC7E Filename Length       005D (93)\n+EDC80 Extra Length          0000 (0)\n+EDC82 Comment Length        0000 (0)\n+EDC84 Disk Start            0000 (0)\n+EDC86 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-ED017 Ext File Attributes   41ED0010 (1106051088)\n+EDC88 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-ED01B Local Header Offset   00001395 (5013)\n-ED01F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+EDC8C Local Header Offset   00001395 (5013)\n+EDC90 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xED01F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEDC90: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xED01F: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xEDC90: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xECFF7: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEDC68: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-ED07C CENTRAL HEADER #51    02014B50 (33639248)\n-ED080 Created Zip Spec      14 (20) '2.0'\n-ED081 Created OS            03 (3) 'Unix'\n-ED082 Extract Zip Spec      0A (10) '1.0'\n-ED083 Extract OS            00 (0) 'MS-DOS'\n-ED084 General Purpose Flag  0800 (2048)\n+EDCED CENTRAL HEADER #51    02014B50 (33639248)\n+EDCF1 Created Zip Spec      14 (20) '2.0'\n+EDCF2 Created OS            03 (3) 'Unix'\n+EDCF3 Extract Zip Spec      0A (10) '1.0'\n+EDCF4 Extract OS            00 (0) 'MS-DOS'\n+EDCF5 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-ED086 Compression Method    0000 (0) 'Stored'\n-ED088 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-ED08C CRC                   00000000 (0)\n-ED090 Compressed Size       00000000 (0)\n-ED094 Uncompressed Size     00000000 (0)\n-ED098 Filename Length       006A (106)\n-ED09A Extra Length          0000 (0)\n-ED09C Comment Length        0000 (0)\n-ED09E Disk Start            0000 (0)\n-ED0A0 Int File Attributes   0000 (0)\n+EDCF7 Compression Method    0000 (0) 'Stored'\n+EDCF9 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+EDCFD CRC                   00000000 (0)\n+EDD01 Compressed Size       00000000 (0)\n+EDD05 Uncompressed Size     00000000 (0)\n+EDD09 Filename Length       006A (106)\n+EDD0B Extra Length          0000 (0)\n+EDD0D Comment Length        0000 (0)\n+EDD0F Disk Start            0000 (0)\n+EDD11 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-ED0A2 Ext File Attributes   41ED0010 (1106051088)\n+EDD13 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-ED0A6 Local Header Offset   00001410 (5136)\n-ED0AA Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+EDD17 Local Header Offset   00001410 (5136)\n+EDD1B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xED0AA: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEDD1B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xED0AA: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xEDD1B: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xED082: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEDCF3: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-ED114 CENTRAL HEADER #52    02014B50 (33639248)\n-ED118 Created Zip Spec      14 (20) '2.0'\n-ED119 Created OS            03 (3) 'Unix'\n-ED11A Extract Zip Spec      0A (10) '1.0'\n-ED11B Extract OS            00 (0) 'MS-DOS'\n-ED11C General Purpose Flag  0800 (2048)\n+EDD85 CENTRAL HEADER #52    02014B50 (33639248)\n+EDD89 Created Zip Spec      14 (20) '2.0'\n+EDD8A Created OS            03 (3) 'Unix'\n+EDD8B Extract Zip Spec      0A (10) '1.0'\n+EDD8C Extract OS            00 (0) 'MS-DOS'\n+EDD8D General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-ED11E Compression Method    0000 (0) 'Stored'\n-ED120 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-ED124 CRC                   00000000 (0)\n-ED128 Compressed Size       00000000 (0)\n-ED12C Uncompressed Size     00000000 (0)\n-ED130 Filename Length       0028 (40)\n-ED132 Extra Length          0000 (0)\n-ED134 Comment Length        0000 (0)\n-ED136 Disk Start            0000 (0)\n-ED138 Int File Attributes   0000 (0)\n+EDD8F Compression Method    0000 (0) 'Stored'\n+EDD91 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+EDD95 CRC                   00000000 (0)\n+EDD99 Compressed Size       00000000 (0)\n+EDD9D Uncompressed Size     00000000 (0)\n+EDDA1 Filename Length       0028 (40)\n+EDDA3 Extra Length          0000 (0)\n+EDDA5 Comment Length        0000 (0)\n+EDDA7 Disk Start            0000 (0)\n+EDDA9 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-ED13A Ext File Attributes   41ED0010 (1106051088)\n+EDDAB Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-ED13E Local Header Offset   00001498 (5272)\n-ED142 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+EDDAF Local Header Offset   00001498 (5272)\n+EDDB3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xED142: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEDDB3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xED142: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xEDDB3: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xED11A: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEDD8B: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-ED16A CENTRAL HEADER #53    02014B50 (33639248)\n-ED16E Created Zip Spec      14 (20) '2.0'\n-ED16F Created OS            03 (3) 'Unix'\n-ED170 Extract Zip Spec      0A (10) '1.0'\n-ED171 Extract OS            00 (0) 'MS-DOS'\n-ED172 General Purpose Flag  0800 (2048)\n+EDDDB CENTRAL HEADER #53    02014B50 (33639248)\n+EDDDF Created Zip Spec      14 (20) '2.0'\n+EDDE0 Created OS            03 (3) 'Unix'\n+EDDE1 Extract Zip Spec      0A (10) '1.0'\n+EDDE2 Extract OS            00 (0) 'MS-DOS'\n+EDDE3 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-ED174 Compression Method    0000 (0) 'Stored'\n-ED176 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-ED17A CRC                   00000000 (0)\n-ED17E Compressed Size       00000000 (0)\n-ED182 Uncompressed Size     00000000 (0)\n-ED186 Filename Length       002F (47)\n-ED188 Extra Length          0000 (0)\n-ED18A Comment Length        0000 (0)\n-ED18C Disk Start            0000 (0)\n-ED18E Int File Attributes   0000 (0)\n+EDDE5 Compression Method    0000 (0) 'Stored'\n+EDDE7 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+EDDEB CRC                   00000000 (0)\n+EDDEF Compressed Size       00000000 (0)\n+EDDF3 Uncompressed Size     00000000 (0)\n+EDDF7 Filename Length       002F (47)\n+EDDF9 Extra Length          0000 (0)\n+EDDFB Comment Length        0000 (0)\n+EDDFD Disk Start            0000 (0)\n+EDDFF Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-ED190 Ext File Attributes   41ED0010 (1106051088)\n+EDE01 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-ED194 Local Header Offset   000014DE (5342)\n-ED198 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+EDE05 Local Header Offset   000014DE (5342)\n+EDE09 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xED198: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEDE09: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xED198: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xEDE09: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xED170: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEDDE1: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-ED1C7 CENTRAL HEADER #54    02014B50 (33639248)\n-ED1CB Created Zip Spec      14 (20) '2.0'\n-ED1CC Created OS            03 (3) 'Unix'\n-ED1CD Extract Zip Spec      0A (10) '1.0'\n-ED1CE Extract OS            00 (0) 'MS-DOS'\n-ED1CF General Purpose Flag  0800 (2048)\n+EDE38 CENTRAL HEADER #54    02014B50 (33639248)\n+EDE3C Created Zip Spec      14 (20) '2.0'\n+EDE3D Created OS            03 (3) 'Unix'\n+EDE3E Extract Zip Spec      0A (10) '1.0'\n+EDE3F Extract OS            00 (0) 'MS-DOS'\n+EDE40 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-ED1D1 Compression Method    0000 (0) 'Stored'\n-ED1D3 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-ED1D7 CRC                   00000000 (0)\n-ED1DB Compressed Size       00000000 (0)\n-ED1DF Uncompressed Size     00000000 (0)\n-ED1E3 Filename Length       0061 (97)\n-ED1E5 Extra Length          0000 (0)\n-ED1E7 Comment Length        0000 (0)\n-ED1E9 Disk Start            0000 (0)\n-ED1EB Int File Attributes   0000 (0)\n+EDE42 Compression Method    0000 (0) 'Stored'\n+EDE44 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+EDE48 CRC                   00000000 (0)\n+EDE4C Compressed Size       00000000 (0)\n+EDE50 Uncompressed Size     00000000 (0)\n+EDE54 Filename Length       0061 (97)\n+EDE56 Extra Length          0000 (0)\n+EDE58 Comment Length        0000 (0)\n+EDE5A Disk Start            0000 (0)\n+EDE5C Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-ED1ED Ext File Attributes   41ED0010 (1106051088)\n+EDE5E Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-ED1F1 Local Header Offset   0000152B (5419)\n-ED1F5 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+EDE62 Local Header Offset   0000152B (5419)\n+EDE66 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xED1F5: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEDE66: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xED1F5: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xEDE66: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xED1CD: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEDE3E: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-ED256 CENTRAL HEADER #55    02014B50 (33639248)\n-ED25A Created Zip Spec      14 (20) '2.0'\n-ED25B Created OS            03 (3) 'Unix'\n-ED25C Extract Zip Spec      0A (10) '1.0'\n-ED25D Extract OS            00 (0) 'MS-DOS'\n-ED25E General Purpose Flag  0800 (2048)\n+EDEC7 CENTRAL HEADER #55    02014B50 (33639248)\n+EDECB Created Zip Spec      14 (20) '2.0'\n+EDECC Created OS            03 (3) 'Unix'\n+EDECD Extract Zip Spec      0A (10) '1.0'\n+EDECE Extract OS            00 (0) 'MS-DOS'\n+EDECF General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-ED260 Compression Method    0000 (0) 'Stored'\n-ED262 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-ED266 CRC                   00000000 (0)\n-ED26A Compressed Size       00000000 (0)\n-ED26E Uncompressed Size     00000000 (0)\n-ED272 Filename Length       0026 (38)\n-ED274 Extra Length          0000 (0)\n-ED276 Comment Length        0000 (0)\n-ED278 Disk Start            0000 (0)\n-ED27A Int File Attributes   0000 (0)\n+EDED1 Compression Method    0000 (0) 'Stored'\n+EDED3 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+EDED7 CRC                   00000000 (0)\n+EDEDB Compressed Size       00000000 (0)\n+EDEDF Uncompressed Size     00000000 (0)\n+EDEE3 Filename Length       0026 (38)\n+EDEE5 Extra Length          0000 (0)\n+EDEE7 Comment Length        0000 (0)\n+EDEE9 Disk Start            0000 (0)\n+EDEEB Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-ED27C Ext File Attributes   41ED0010 (1106051088)\n+EDEED Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-ED280 Local Header Offset   000015AA (5546)\n-ED284 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+EDEF1 Local Header Offset   000015AA (5546)\n+EDEF5 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xED284: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEDEF5: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xED284: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xEDEF5: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xED25C: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEDECD: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-ED2AA CENTRAL HEADER #56    02014B50 (33639248)\n-ED2AE Created Zip Spec      14 (20) '2.0'\n-ED2AF Created OS            03 (3) 'Unix'\n-ED2B0 Extract Zip Spec      0A (10) '1.0'\n-ED2B1 Extract OS            00 (0) 'MS-DOS'\n-ED2B2 General Purpose Flag  0800 (2048)\n+EDF1B CENTRAL HEADER #56    02014B50 (33639248)\n+EDF1F Created Zip Spec      14 (20) '2.0'\n+EDF20 Created OS            03 (3) 'Unix'\n+EDF21 Extract Zip Spec      0A (10) '1.0'\n+EDF22 Extract OS            00 (0) 'MS-DOS'\n+EDF23 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-ED2B4 Compression Method    0000 (0) 'Stored'\n-ED2B6 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-ED2BA CRC                   00000000 (0)\n-ED2BE Compressed Size       00000000 (0)\n-ED2C2 Uncompressed Size     00000000 (0)\n-ED2C6 Filename Length       002D (45)\n-ED2C8 Extra Length          0000 (0)\n-ED2CA Comment Length        0000 (0)\n-ED2CC Disk Start            0000 (0)\n-ED2CE Int File Attributes   0000 (0)\n+EDF25 Compression Method    0000 (0) 'Stored'\n+EDF27 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+EDF2B CRC                   00000000 (0)\n+EDF2F Compressed Size       00000000 (0)\n+EDF33 Uncompressed Size     00000000 (0)\n+EDF37 Filename Length       002D (45)\n+EDF39 Extra Length          0000 (0)\n+EDF3B Comment Length        0000 (0)\n+EDF3D Disk Start            0000 (0)\n+EDF3F Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-ED2D0 Ext File Attributes   41ED0010 (1106051088)\n+EDF41 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-ED2D4 Local Header Offset   000015EE (5614)\n-ED2D8 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+EDF45 Local Header Offset   000015EE (5614)\n+EDF49 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xED2D8: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEDF49: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xED2D8: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xEDF49: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xED2B0: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEDF21: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-ED305 CENTRAL HEADER #57    02014B50 (33639248)\n-ED309 Created Zip Spec      14 (20) '2.0'\n-ED30A Created OS            03 (3) 'Unix'\n-ED30B Extract Zip Spec      0A (10) '1.0'\n-ED30C Extract OS            00 (0) 'MS-DOS'\n-ED30D General Purpose Flag  0800 (2048)\n+EDF76 CENTRAL HEADER #57    02014B50 (33639248)\n+EDF7A Created Zip Spec      14 (20) '2.0'\n+EDF7B Created OS            03 (3) 'Unix'\n+EDF7C Extract Zip Spec      0A (10) '1.0'\n+EDF7D Extract OS            00 (0) 'MS-DOS'\n+EDF7E General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-ED30F Compression Method    0000 (0) 'Stored'\n-ED311 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-ED315 CRC                   00000000 (0)\n-ED319 Compressed Size       00000000 (0)\n-ED31D Uncompressed Size     00000000 (0)\n-ED321 Filename Length       0064 (100)\n-ED323 Extra Length          0000 (0)\n-ED325 Comment Length        0000 (0)\n-ED327 Disk Start            0000 (0)\n-ED329 Int File Attributes   0000 (0)\n+EDF80 Compression Method    0000 (0) 'Stored'\n+EDF82 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+EDF86 CRC                   00000000 (0)\n+EDF8A Compressed Size       00000000 (0)\n+EDF8E Uncompressed Size     00000000 (0)\n+EDF92 Filename Length       0064 (100)\n+EDF94 Extra Length          0000 (0)\n+EDF96 Comment Length        0000 (0)\n+EDF98 Disk Start            0000 (0)\n+EDF9A Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-ED32B Ext File Attributes   41ED0010 (1106051088)\n+EDF9C Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-ED32F Local Header Offset   00001639 (5689)\n-ED333 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+EDFA0 Local Header Offset   00001639 (5689)\n+EDFA4 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xED333: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEDFA4: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xED333: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xEDFA4: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xED30B: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEDF7C: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-ED397 CENTRAL HEADER #58    02014B50 (33639248)\n-ED39B Created Zip Spec      14 (20) '2.0'\n-ED39C Created OS            03 (3) 'Unix'\n-ED39D Extract Zip Spec      0A (10) '1.0'\n-ED39E Extract OS            00 (0) 'MS-DOS'\n-ED39F General Purpose Flag  0800 (2048)\n+EE008 CENTRAL HEADER #58    02014B50 (33639248)\n+EE00C Created Zip Spec      14 (20) '2.0'\n+EE00D Created OS            03 (3) 'Unix'\n+EE00E Extract Zip Spec      0A (10) '1.0'\n+EE00F Extract OS            00 (0) 'MS-DOS'\n+EE010 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-ED3A1 Compression Method    0000 (0) 'Stored'\n-ED3A3 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-ED3A7 CRC                   00000000 (0)\n-ED3AB Compressed Size       00000000 (0)\n-ED3AF Uncompressed Size     00000000 (0)\n-ED3B3 Filename Length       002F (47)\n-ED3B5 Extra Length          0000 (0)\n-ED3B7 Comment Length        0000 (0)\n-ED3B9 Disk Start            0000 (0)\n-ED3BB Int File Attributes   0000 (0)\n+EE012 Compression Method    0000 (0) 'Stored'\n+EE014 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+EE018 CRC                   00000000 (0)\n+EE01C Compressed Size       00000000 (0)\n+EE020 Uncompressed Size     00000000 (0)\n+EE024 Filename Length       002F (47)\n+EE026 Extra Length          0000 (0)\n+EE028 Comment Length        0000 (0)\n+EE02A Disk Start            0000 (0)\n+EE02C Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-ED3BD Ext File Attributes   41ED0010 (1106051088)\n+EE02E Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-ED3C1 Local Header Offset   000016BB (5819)\n-ED3C5 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+EE032 Local Header Offset   000016BB (5819)\n+EE036 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xED3C5: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEE036: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xED3C5: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xEE036: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xED39D: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEE00E: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-ED3F4 CENTRAL HEADER #59    02014B50 (33639248)\n-ED3F8 Created Zip Spec      14 (20) '2.0'\n-ED3F9 Created OS            03 (3) 'Unix'\n-ED3FA Extract Zip Spec      0A (10) '1.0'\n-ED3FB Extract OS            00 (0) 'MS-DOS'\n-ED3FC General Purpose Flag  0800 (2048)\n+EE065 CENTRAL HEADER #59    02014B50 (33639248)\n+EE069 Created Zip Spec      14 (20) '2.0'\n+EE06A Created OS            03 (3) 'Unix'\n+EE06B Extract Zip Spec      0A (10) '1.0'\n+EE06C Extract OS            00 (0) 'MS-DOS'\n+EE06D General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-ED3FE Compression Method    0000 (0) 'Stored'\n-ED400 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-ED404 CRC                   00000000 (0)\n-ED408 Compressed Size       00000000 (0)\n-ED40C Uncompressed Size     00000000 (0)\n-ED410 Filename Length       0036 (54)\n-ED412 Extra Length          0000 (0)\n-ED414 Comment Length        0000 (0)\n-ED416 Disk Start            0000 (0)\n-ED418 Int File Attributes   0000 (0)\n+EE06F Compression Method    0000 (0) 'Stored'\n+EE071 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+EE075 CRC                   00000000 (0)\n+EE079 Compressed Size       00000000 (0)\n+EE07D Uncompressed Size     00000000 (0)\n+EE081 Filename Length       0036 (54)\n+EE083 Extra Length          0000 (0)\n+EE085 Comment Length        0000 (0)\n+EE087 Disk Start            0000 (0)\n+EE089 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-ED41A Ext File Attributes   41ED0010 (1106051088)\n+EE08B Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-ED41E Local Header Offset   00001708 (5896)\n-ED422 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+EE08F Local Header Offset   00001708 (5896)\n+EE093 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xED422: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEE093: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xED422: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xEE093: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xED3FA: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEE06B: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-ED458 CENTRAL HEADER #60    02014B50 (33639248)\n-ED45C Created Zip Spec      14 (20) '2.0'\n-ED45D Created OS            03 (3) 'Unix'\n-ED45E Extract Zip Spec      0A (10) '1.0'\n-ED45F Extract OS            00 (0) 'MS-DOS'\n-ED460 General Purpose Flag  0800 (2048)\n+EE0C9 CENTRAL HEADER #60    02014B50 (33639248)\n+EE0CD Created Zip Spec      14 (20) '2.0'\n+EE0CE Created OS            03 (3) 'Unix'\n+EE0CF Extract Zip Spec      0A (10) '1.0'\n+EE0D0 Extract OS            00 (0) 'MS-DOS'\n+EE0D1 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-ED462 Compression Method    0000 (0) 'Stored'\n-ED464 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-ED468 CRC                   00000000 (0)\n-ED46C Compressed Size       00000000 (0)\n-ED470 Uncompressed Size     00000000 (0)\n-ED474 Filename Length       0078 (120)\n-ED476 Extra Length          0000 (0)\n-ED478 Comment Length        0000 (0)\n-ED47A Disk Start            0000 (0)\n-ED47C Int File Attributes   0000 (0)\n+EE0D3 Compression Method    0000 (0) 'Stored'\n+EE0D5 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+EE0D9 CRC                   00000000 (0)\n+EE0DD Compressed Size       00000000 (0)\n+EE0E1 Uncompressed Size     00000000 (0)\n+EE0E5 Filename Length       0078 (120)\n+EE0E7 Extra Length          0000 (0)\n+EE0E9 Comment Length        0000 (0)\n+EE0EB Disk Start            0000 (0)\n+EE0ED Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-ED47E Ext File Attributes   41ED0010 (1106051088)\n+EE0EF Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-ED482 Local Header Offset   0000175C (5980)\n-ED486 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+EE0F3 Local Header Offset   0000175C (5980)\n+EE0F7 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xED486: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEE0F7: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xED486: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xEE0F7: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xED45E: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEE0CF: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-ED4FE CENTRAL HEADER #61    02014B50 (33639248)\n-ED502 Created Zip Spec      14 (20) '2.0'\n-ED503 Created OS            03 (3) 'Unix'\n-ED504 Extract Zip Spec      0A (10) '1.0'\n-ED505 Extract OS            00 (0) 'MS-DOS'\n-ED506 General Purpose Flag  0800 (2048)\n+EE16F CENTRAL HEADER #61    02014B50 (33639248)\n+EE173 Created Zip Spec      14 (20) '2.0'\n+EE174 Created OS            03 (3) 'Unix'\n+EE175 Extract Zip Spec      0A (10) '1.0'\n+EE176 Extract OS            00 (0) 'MS-DOS'\n+EE177 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-ED508 Compression Method    0000 (0) 'Stored'\n-ED50A Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-ED50E CRC                   00000000 (0)\n-ED512 Compressed Size       00000000 (0)\n-ED516 Uncompressed Size     00000000 (0)\n-ED51A Filename Length       003B (59)\n-ED51C Extra Length          0000 (0)\n-ED51E Comment Length        0000 (0)\n-ED520 Disk Start            0000 (0)\n-ED522 Int File Attributes   0000 (0)\n+EE179 Compression Method    0000 (0) 'Stored'\n+EE17B Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+EE17F CRC                   00000000 (0)\n+EE183 Compressed Size       00000000 (0)\n+EE187 Uncompressed Size     00000000 (0)\n+EE18B Filename Length       003B (59)\n+EE18D Extra Length          0000 (0)\n+EE18F Comment Length        0000 (0)\n+EE191 Disk Start            0000 (0)\n+EE193 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-ED524 Ext File Attributes   41ED0010 (1106051088)\n+EE195 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-ED528 Local Header Offset   000017F2 (6130)\n-ED52C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+EE199 Local Header Offset   000017F2 (6130)\n+EE19D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xED52C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEE19D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xED52C: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xEE19D: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xED504: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEE175: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-ED567 CENTRAL HEADER #62    02014B50 (33639248)\n-ED56B Created Zip Spec      14 (20) '2.0'\n-ED56C Created OS            03 (3) 'Unix'\n-ED56D Extract Zip Spec      0A (10) '1.0'\n-ED56E Extract OS            00 (0) 'MS-DOS'\n-ED56F General Purpose Flag  0800 (2048)\n+EE1D8 CENTRAL HEADER #62    02014B50 (33639248)\n+EE1DC Created Zip Spec      14 (20) '2.0'\n+EE1DD Created OS            03 (3) 'Unix'\n+EE1DE Extract Zip Spec      0A (10) '1.0'\n+EE1DF Extract OS            00 (0) 'MS-DOS'\n+EE1E0 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-ED571 Compression Method    0000 (0) 'Stored'\n-ED573 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-ED577 CRC                   00000000 (0)\n-ED57B Compressed Size       00000000 (0)\n-ED57F Uncompressed Size     00000000 (0)\n-ED583 Filename Length       0042 (66)\n-ED585 Extra Length          0000 (0)\n-ED587 Comment Length        0000 (0)\n-ED589 Disk Start            0000 (0)\n-ED58B Int File Attributes   0000 (0)\n+EE1E2 Compression Method    0000 (0) 'Stored'\n+EE1E4 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+EE1E8 CRC                   00000000 (0)\n+EE1EC Compressed Size       00000000 (0)\n+EE1F0 Uncompressed Size     00000000 (0)\n+EE1F4 Filename Length       0042 (66)\n+EE1F6 Extra Length          0000 (0)\n+EE1F8 Comment Length        0000 (0)\n+EE1FA Disk Start            0000 (0)\n+EE1FC Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-ED58D Ext File Attributes   41ED0010 (1106051088)\n+EE1FE Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-ED591 Local Header Offset   0000184B (6219)\n-ED595 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+EE202 Local Header Offset   0000184B (6219)\n+EE206 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xED595: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEE206: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xED595: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xEE206: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xED56D: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEE1DE: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-ED5D7 CENTRAL HEADER #63    02014B50 (33639248)\n-ED5DB Created Zip Spec      14 (20) '2.0'\n-ED5DC Created OS            03 (3) 'Unix'\n-ED5DD Extract Zip Spec      0A (10) '1.0'\n-ED5DE Extract OS            00 (0) 'MS-DOS'\n-ED5DF General Purpose Flag  0800 (2048)\n+EE248 CENTRAL HEADER #63    02014B50 (33639248)\n+EE24C Created Zip Spec      14 (20) '2.0'\n+EE24D Created OS            03 (3) 'Unix'\n+EE24E Extract Zip Spec      0A (10) '1.0'\n+EE24F Extract OS            00 (0) 'MS-DOS'\n+EE250 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-ED5E1 Compression Method    0000 (0) 'Stored'\n-ED5E3 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-ED5E7 CRC                   00000000 (0)\n-ED5EB Compressed Size       00000000 (0)\n-ED5EF Uncompressed Size     00000000 (0)\n-ED5F3 Filename Length       007F (127)\n-ED5F5 Extra Length          0000 (0)\n-ED5F7 Comment Length        0000 (0)\n-ED5F9 Disk Start            0000 (0)\n-ED5FB Int File Attributes   0000 (0)\n+EE252 Compression Method    0000 (0) 'Stored'\n+EE254 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+EE258 CRC                   00000000 (0)\n+EE25C Compressed Size       00000000 (0)\n+EE260 Uncompressed Size     00000000 (0)\n+EE264 Filename Length       007F (127)\n+EE266 Extra Length          0000 (0)\n+EE268 Comment Length        0000 (0)\n+EE26A Disk Start            0000 (0)\n+EE26C Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-ED5FD Ext File Attributes   41ED0010 (1106051088)\n+EE26E Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-ED601 Local Header Offset   000018AB (6315)\n-ED605 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+EE272 Local Header Offset   000018AB (6315)\n+EE276 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xED605: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEE276: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xED605: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xEE276: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xED5DD: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEE24E: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-ED684 CENTRAL HEADER #64    02014B50 (33639248)\n-ED688 Created Zip Spec      14 (20) '2.0'\n-ED689 Created OS            03 (3) 'Unix'\n-ED68A Extract Zip Spec      0A (10) '1.0'\n-ED68B Extract OS            00 (0) 'MS-DOS'\n-ED68C General Purpose Flag  0800 (2048)\n+EE2F5 CENTRAL HEADER #64    02014B50 (33639248)\n+EE2F9 Created Zip Spec      14 (20) '2.0'\n+EE2FA Created OS            03 (3) 'Unix'\n+EE2FB Extract Zip Spec      0A (10) '1.0'\n+EE2FC Extract OS            00 (0) 'MS-DOS'\n+EE2FD General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-ED68E Compression Method    0000 (0) 'Stored'\n-ED690 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-ED694 CRC                   00000000 (0)\n-ED698 Compressed Size       00000000 (0)\n-ED69C Uncompressed Size     00000000 (0)\n-ED6A0 Filename Length       007B (123)\n-ED6A2 Extra Length          0000 (0)\n-ED6A4 Comment Length        0000 (0)\n-ED6A6 Disk Start            0000 (0)\n-ED6A8 Int File Attributes   0000 (0)\n+EE2FF Compression Method    0000 (0) 'Stored'\n+EE301 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+EE305 CRC                   00000000 (0)\n+EE309 Compressed Size       00000000 (0)\n+EE30D Uncompressed Size     00000000 (0)\n+EE311 Filename Length       007B (123)\n+EE313 Extra Length          0000 (0)\n+EE315 Comment Length        0000 (0)\n+EE317 Disk Start            0000 (0)\n+EE319 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-ED6AA Ext File Attributes   41ED0010 (1106051088)\n+EE31B Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-ED6AE Local Header Offset   00001948 (6472)\n-ED6B2 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+EE31F Local Header Offset   00001948 (6472)\n+EE323 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xED6B2: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEE323: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xED6B2: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xEE323: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xED68A: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEE2FB: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-ED72D CENTRAL HEADER #65    02014B50 (33639248)\n-ED731 Created Zip Spec      14 (20) '2.0'\n-ED732 Created OS            03 (3) 'Unix'\n-ED733 Extract Zip Spec      0A (10) '1.0'\n-ED734 Extract OS            00 (0) 'MS-DOS'\n-ED735 General Purpose Flag  0800 (2048)\n+EE39E CENTRAL HEADER #65    02014B50 (33639248)\n+EE3A2 Created Zip Spec      14 (20) '2.0'\n+EE3A3 Created OS            03 (3) 'Unix'\n+EE3A4 Extract Zip Spec      0A (10) '1.0'\n+EE3A5 Extract OS            00 (0) 'MS-DOS'\n+EE3A6 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-ED737 Compression Method    0000 (0) 'Stored'\n-ED739 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-ED73D CRC                   00000000 (0)\n-ED741 Compressed Size       00000000 (0)\n-ED745 Uncompressed Size     00000000 (0)\n-ED749 Filename Length       0034 (52)\n-ED74B Extra Length          0000 (0)\n-ED74D Comment Length        0000 (0)\n-ED74F Disk Start            0000 (0)\n-ED751 Int File Attributes   0000 (0)\n+EE3A8 Compression Method    0000 (0) 'Stored'\n+EE3AA Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+EE3AE CRC                   00000000 (0)\n+EE3B2 Compressed Size       00000000 (0)\n+EE3B6 Uncompressed Size     00000000 (0)\n+EE3BA Filename Length       0034 (52)\n+EE3BC Extra Length          0000 (0)\n+EE3BE Comment Length        0000 (0)\n+EE3C0 Disk Start            0000 (0)\n+EE3C2 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-ED753 Ext File Attributes   41ED0010 (1106051088)\n+EE3C4 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-ED757 Local Header Offset   000019E1 (6625)\n-ED75B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+EE3C8 Local Header Offset   000019E1 (6625)\n+EE3CC Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xED75B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEE3CC: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xED75B: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xEE3CC: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xED733: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEE3A4: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-ED78F CENTRAL HEADER #66    02014B50 (33639248)\n-ED793 Created Zip Spec      14 (20) '2.0'\n-ED794 Created OS            03 (3) 'Unix'\n-ED795 Extract Zip Spec      0A (10) '1.0'\n-ED796 Extract OS            00 (0) 'MS-DOS'\n-ED797 General Purpose Flag  0800 (2048)\n+EE400 CENTRAL HEADER #66    02014B50 (33639248)\n+EE404 Created Zip Spec      14 (20) '2.0'\n+EE405 Created OS            03 (3) 'Unix'\n+EE406 Extract Zip Spec      0A (10) '1.0'\n+EE407 Extract OS            00 (0) 'MS-DOS'\n+EE408 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-ED799 Compression Method    0000 (0) 'Stored'\n-ED79B Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-ED79F CRC                   00000000 (0)\n-ED7A3 Compressed Size       00000000 (0)\n-ED7A7 Uncompressed Size     00000000 (0)\n-ED7AB Filename Length       003B (59)\n-ED7AD Extra Length          0000 (0)\n-ED7AF Comment Length        0000 (0)\n-ED7B1 Disk Start            0000 (0)\n-ED7B3 Int File Attributes   0000 (0)\n+EE40A Compression Method    0000 (0) 'Stored'\n+EE40C Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+EE410 CRC                   00000000 (0)\n+EE414 Compressed Size       00000000 (0)\n+EE418 Uncompressed Size     00000000 (0)\n+EE41C Filename Length       003B (59)\n+EE41E Extra Length          0000 (0)\n+EE420 Comment Length        0000 (0)\n+EE422 Disk Start            0000 (0)\n+EE424 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-ED7B5 Ext File Attributes   41ED0010 (1106051088)\n+EE426 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-ED7B9 Local Header Offset   00001A33 (6707)\n-ED7BD Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+EE42A Local Header Offset   00001A33 (6707)\n+EE42E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xED7BD: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEE42E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xED7BD: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xEE42E: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xED795: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEE406: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-ED7F8 CENTRAL HEADER #67    02014B50 (33639248)\n-ED7FC Created Zip Spec      14 (20) '2.0'\n-ED7FD Created OS            03 (3) 'Unix'\n-ED7FE Extract Zip Spec      0A (10) '1.0'\n-ED7FF Extract OS            00 (0) 'MS-DOS'\n-ED800 General Purpose Flag  0800 (2048)\n+EE469 CENTRAL HEADER #67    02014B50 (33639248)\n+EE46D Created Zip Spec      14 (20) '2.0'\n+EE46E Created OS            03 (3) 'Unix'\n+EE46F Extract Zip Spec      0A (10) '1.0'\n+EE470 Extract OS            00 (0) 'MS-DOS'\n+EE471 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-ED802 Compression Method    0000 (0) 'Stored'\n-ED804 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-ED808 CRC                   00000000 (0)\n-ED80C Compressed Size       00000000 (0)\n-ED810 Uncompressed Size     00000000 (0)\n-ED814 Filename Length       0079 (121)\n-ED816 Extra Length          0000 (0)\n-ED818 Comment Length        0000 (0)\n-ED81A Disk Start            0000 (0)\n-ED81C Int File Attributes   0000 (0)\n+EE473 Compression Method    0000 (0) 'Stored'\n+EE475 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+EE479 CRC                   00000000 (0)\n+EE47D Compressed Size       00000000 (0)\n+EE481 Uncompressed Size     00000000 (0)\n+EE485 Filename Length       0079 (121)\n+EE487 Extra Length          0000 (0)\n+EE489 Comment Length        0000 (0)\n+EE48B Disk Start            0000 (0)\n+EE48D Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-ED81E Ext File Attributes   41ED0010 (1106051088)\n+EE48F Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-ED822 Local Header Offset   00001A8C (6796)\n-ED826 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+EE493 Local Header Offset   00001A8C (6796)\n+EE497 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xED826: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEE497: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xED826: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xEE497: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xED7FE: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEE46F: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-ED89F CENTRAL HEADER #68    02014B50 (33639248)\n-ED8A3 Created Zip Spec      14 (20) '2.0'\n-ED8A4 Created OS            03 (3) 'Unix'\n-ED8A5 Extract Zip Spec      0A (10) '1.0'\n-ED8A6 Extract OS            00 (0) 'MS-DOS'\n-ED8A7 General Purpose Flag  0800 (2048)\n+EE510 CENTRAL HEADER #68    02014B50 (33639248)\n+EE514 Created Zip Spec      14 (20) '2.0'\n+EE515 Created OS            03 (3) 'Unix'\n+EE516 Extract Zip Spec      0A (10) '1.0'\n+EE517 Extract OS            00 (0) 'MS-DOS'\n+EE518 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-ED8A9 Compression Method    0000 (0) 'Stored'\n-ED8AB Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-ED8AF CRC                   00000000 (0)\n-ED8B3 Compressed Size       00000000 (0)\n-ED8B7 Uncompressed Size     00000000 (0)\n-ED8BB Filename Length       007F (127)\n-ED8BD Extra Length          0000 (0)\n-ED8BF Comment Length        0000 (0)\n-ED8C1 Disk Start            0000 (0)\n-ED8C3 Int File Attributes   0000 (0)\n+EE51A Compression Method    0000 (0) 'Stored'\n+EE51C Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+EE520 CRC                   00000000 (0)\n+EE524 Compressed Size       00000000 (0)\n+EE528 Uncompressed Size     00000000 (0)\n+EE52C Filename Length       007F (127)\n+EE52E Extra Length          0000 (0)\n+EE530 Comment Length        0000 (0)\n+EE532 Disk Start            0000 (0)\n+EE534 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-ED8C5 Ext File Attributes   41ED0010 (1106051088)\n+EE536 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-ED8C9 Local Header Offset   00001B23 (6947)\n-ED8CD Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+EE53A Local Header Offset   00001B23 (6947)\n+EE53E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xED8CD: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEE53E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xED8CD: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xEE53E: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xED8A5: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEE516: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-ED94C CENTRAL HEADER #69    02014B50 (33639248)\n-ED950 Created Zip Spec      14 (20) '2.0'\n-ED951 Created OS            03 (3) 'Unix'\n-ED952 Extract Zip Spec      0A (10) '1.0'\n-ED953 Extract OS            00 (0) 'MS-DOS'\n-ED954 General Purpose Flag  0800 (2048)\n+EE5BD CENTRAL HEADER #69    02014B50 (33639248)\n+EE5C1 Created Zip Spec      14 (20) '2.0'\n+EE5C2 Created OS            03 (3) 'Unix'\n+EE5C3 Extract Zip Spec      0A (10) '1.0'\n+EE5C4 Extract OS            00 (0) 'MS-DOS'\n+EE5C5 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-ED956 Compression Method    0000 (0) 'Stored'\n-ED958 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-ED95C CRC                   00000000 (0)\n-ED960 Compressed Size       00000000 (0)\n-ED964 Uncompressed Size     00000000 (0)\n-ED968 Filename Length       007B (123)\n-ED96A Extra Length          0000 (0)\n-ED96C Comment Length        0000 (0)\n-ED96E Disk Start            0000 (0)\n-ED970 Int File Attributes   0000 (0)\n+EE5C7 Compression Method    0000 (0) 'Stored'\n+EE5C9 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+EE5CD CRC                   00000000 (0)\n+EE5D1 Compressed Size       00000000 (0)\n+EE5D5 Uncompressed Size     00000000 (0)\n+EE5D9 Filename Length       007B (123)\n+EE5DB Extra Length          0000 (0)\n+EE5DD Comment Length        0000 (0)\n+EE5DF Disk Start            0000 (0)\n+EE5E1 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-ED972 Ext File Attributes   41ED0010 (1106051088)\n+EE5E3 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-ED976 Local Header Offset   00001BC0 (7104)\n-ED97A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+EE5E7 Local Header Offset   00001BC0 (7104)\n+EE5EB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xED97A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEE5EB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xED97A: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xEE5EB: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xED952: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEE5C3: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-ED9F5 CENTRAL HEADER #70    02014B50 (33639248)\n-ED9F9 Created Zip Spec      14 (20) '2.0'\n-ED9FA Created OS            03 (3) 'Unix'\n-ED9FB Extract Zip Spec      0A (10) '1.0'\n-ED9FC Extract OS            00 (0) 'MS-DOS'\n-ED9FD General Purpose Flag  0800 (2048)\n+EE666 CENTRAL HEADER #70    02014B50 (33639248)\n+EE66A Created Zip Spec      14 (20) '2.0'\n+EE66B Created OS            03 (3) 'Unix'\n+EE66C Extract Zip Spec      0A (10) '1.0'\n+EE66D Extract OS            00 (0) 'MS-DOS'\n+EE66E General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-ED9FF Compression Method    0000 (0) 'Stored'\n-EDA01 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-EDA05 CRC                   00000000 (0)\n-EDA09 Compressed Size       00000000 (0)\n-EDA0D Uncompressed Size     00000000 (0)\n-EDA11 Filename Length       0084 (132)\n-EDA13 Extra Length          0000 (0)\n-EDA15 Comment Length        0000 (0)\n-EDA17 Disk Start            0000 (0)\n-EDA19 Int File Attributes   0000 (0)\n+EE670 Compression Method    0000 (0) 'Stored'\n+EE672 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+EE676 CRC                   00000000 (0)\n+EE67A Compressed Size       00000000 (0)\n+EE67E Uncompressed Size     00000000 (0)\n+EE682 Filename Length       0084 (132)\n+EE684 Extra Length          0000 (0)\n+EE686 Comment Length        0000 (0)\n+EE688 Disk Start            0000 (0)\n+EE68A Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-EDA1B Ext File Attributes   41ED0010 (1106051088)\n+EE68C Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-EDA1F Local Header Offset   00001C59 (7257)\n-EDA23 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+EE690 Local Header Offset   00001C59 (7257)\n+EE694 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             '\n #\n-# WARNING: Offset 0xEDA23: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEE694: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xEDA23: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xEE694: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xED9FB: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEE66C: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-EDAA7 CENTRAL HEADER #71    02014B50 (33639248)\n-EDAAB Created Zip Spec      14 (20) '2.0'\n-EDAAC Created OS            03 (3) 'Unix'\n-EDAAD Extract Zip Spec      0A (10) '1.0'\n-EDAAE Extract OS            00 (0) 'MS-DOS'\n-EDAAF General Purpose Flag  0800 (2048)\n+EE718 CENTRAL HEADER #71    02014B50 (33639248)\n+EE71C Created Zip Spec      14 (20) '2.0'\n+EE71D Created OS            03 (3) 'Unix'\n+EE71E Extract Zip Spec      0A (10) '1.0'\n+EE71F Extract OS            00 (0) 'MS-DOS'\n+EE720 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-EDAB1 Compression Method    0000 (0) 'Stored'\n-EDAB3 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-EDAB7 CRC                   00000000 (0)\n-EDABB Compressed Size       00000000 (0)\n-EDABF Uncompressed Size     00000000 (0)\n-EDAC3 Filename Length       0079 (121)\n-EDAC5 Extra Length          0000 (0)\n-EDAC7 Comment Length        0000 (0)\n-EDAC9 Disk Start            0000 (0)\n-EDACB Int File Attributes   0000 (0)\n+EE722 Compression Method    0000 (0) 'Stored'\n+EE724 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+EE728 CRC                   00000000 (0)\n+EE72C Compressed Size       00000000 (0)\n+EE730 Uncompressed Size     00000000 (0)\n+EE734 Filename Length       0079 (121)\n+EE736 Extra Length          0000 (0)\n+EE738 Comment Length        0000 (0)\n+EE73A Disk Start            0000 (0)\n+EE73C Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-EDACD Ext File Attributes   41ED0010 (1106051088)\n+EE73E Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-EDAD1 Local Header Offset   00001CFB (7419)\n-EDAD5 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+EE742 Local Header Offset   00001CFB (7419)\n+EE746 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xEDAD5: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEE746: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xEDAD5: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xEE746: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xEDAAD: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEE71E: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-EDB4E CENTRAL HEADER #72    02014B50 (33639248)\n-EDB52 Created Zip Spec      14 (20) '2.0'\n-EDB53 Created OS            03 (3) 'Unix'\n-EDB54 Extract Zip Spec      0A (10) '1.0'\n-EDB55 Extract OS            00 (0) 'MS-DOS'\n-EDB56 General Purpose Flag  0800 (2048)\n+EE7BF CENTRAL HEADER #72    02014B50 (33639248)\n+EE7C3 Created Zip Spec      14 (20) '2.0'\n+EE7C4 Created OS            03 (3) 'Unix'\n+EE7C5 Extract Zip Spec      0A (10) '1.0'\n+EE7C6 Extract OS            00 (0) 'MS-DOS'\n+EE7C7 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-EDB58 Compression Method    0000 (0) 'Stored'\n-EDB5A Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-EDB5E CRC                   00000000 (0)\n-EDB62 Compressed Size       00000000 (0)\n-EDB66 Uncompressed Size     00000000 (0)\n-EDB6A Filename Length       007B (123)\n-EDB6C Extra Length          0000 (0)\n-EDB6E Comment Length        0000 (0)\n-EDB70 Disk Start            0000 (0)\n-EDB72 Int File Attributes   0000 (0)\n+EE7C9 Compression Method    0000 (0) 'Stored'\n+EE7CB Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+EE7CF CRC                   00000000 (0)\n+EE7D3 Compressed Size       00000000 (0)\n+EE7D7 Uncompressed Size     00000000 (0)\n+EE7DB Filename Length       007B (123)\n+EE7DD Extra Length          0000 (0)\n+EE7DF Comment Length        0000 (0)\n+EE7E1 Disk Start            0000 (0)\n+EE7E3 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-EDB74 Ext File Attributes   41ED0010 (1106051088)\n+EE7E5 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-EDB78 Local Header Offset   00001D92 (7570)\n-EDB7C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+EE7E9 Local Header Offset   00001D92 (7570)\n+EE7ED Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xEDB7C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEE7ED: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xEDB7C: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xEE7ED: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xEDB54: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEE7C5: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-EDBF7 CENTRAL HEADER #73    02014B50 (33639248)\n-EDBFB Created Zip Spec      14 (20) '2.0'\n-EDBFC Created OS            03 (3) 'Unix'\n-EDBFD Extract Zip Spec      0A (10) '1.0'\n-EDBFE Extract OS            00 (0) 'MS-DOS'\n-EDBFF General Purpose Flag  0800 (2048)\n+EE868 CENTRAL HEADER #73    02014B50 (33639248)\n+EE86C Created Zip Spec      14 (20) '2.0'\n+EE86D Created OS            03 (3) 'Unix'\n+EE86E Extract Zip Spec      0A (10) '1.0'\n+EE86F Extract OS            00 (0) 'MS-DOS'\n+EE870 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-EDC01 Compression Method    0000 (0) 'Stored'\n-EDC03 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-EDC07 CRC                   00000000 (0)\n-EDC0B Compressed Size       00000000 (0)\n-EDC0F Uncompressed Size     00000000 (0)\n-EDC13 Filename Length       0078 (120)\n-EDC15 Extra Length          0000 (0)\n-EDC17 Comment Length        0000 (0)\n-EDC19 Disk Start            0000 (0)\n-EDC1B Int File Attributes   0000 (0)\n+EE872 Compression Method    0000 (0) 'Stored'\n+EE874 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+EE878 CRC                   00000000 (0)\n+EE87C Compressed Size       00000000 (0)\n+EE880 Uncompressed Size     00000000 (0)\n+EE884 Filename Length       0078 (120)\n+EE886 Extra Length          0000 (0)\n+EE888 Comment Length        0000 (0)\n+EE88A Disk Start            0000 (0)\n+EE88C Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-EDC1D Ext File Attributes   41ED0010 (1106051088)\n+EE88E Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-EDC21 Local Header Offset   00001E2B (7723)\n-EDC25 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+EE892 Local Header Offset   00001E2B (7723)\n+EE896 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xEDC25: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEE896: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xEDC25: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xEE896: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xEDBFD: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEE86E: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-EDC9D CENTRAL HEADER #74    02014B50 (33639248)\n-EDCA1 Created Zip Spec      14 (20) '2.0'\n-EDCA2 Created OS            03 (3) 'Unix'\n-EDCA3 Extract Zip Spec      0A (10) '1.0'\n-EDCA4 Extract OS            00 (0) 'MS-DOS'\n-EDCA5 General Purpose Flag  0800 (2048)\n+EE90E CENTRAL HEADER #74    02014B50 (33639248)\n+EE912 Created Zip Spec      14 (20) '2.0'\n+EE913 Created OS            03 (3) 'Unix'\n+EE914 Extract Zip Spec      0A (10) '1.0'\n+EE915 Extract OS            00 (0) 'MS-DOS'\n+EE916 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-EDCA7 Compression Method    0000 (0) 'Stored'\n-EDCA9 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-EDCAD CRC                   00000000 (0)\n-EDCB1 Compressed Size       00000000 (0)\n-EDCB5 Uncompressed Size     00000000 (0)\n-EDCB9 Filename Length       007F (127)\n-EDCBB Extra Length          0000 (0)\n-EDCBD Comment Length        0000 (0)\n-EDCBF Disk Start            0000 (0)\n-EDCC1 Int File Attributes   0000 (0)\n+EE918 Compression Method    0000 (0) 'Stored'\n+EE91A Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+EE91E CRC                   00000000 (0)\n+EE922 Compressed Size       00000000 (0)\n+EE926 Uncompressed Size     00000000 (0)\n+EE92A Filename Length       007F (127)\n+EE92C Extra Length          0000 (0)\n+EE92E Comment Length        0000 (0)\n+EE930 Disk Start            0000 (0)\n+EE932 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-EDCC3 Ext File Attributes   41ED0010 (1106051088)\n+EE934 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-EDCC7 Local Header Offset   00001EC1 (7873)\n-EDCCB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+EE938 Local Header Offset   00001EC1 (7873)\n+EE93C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xEDCCB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEE93C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xEDCCB: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xEE93C: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xEDCA3: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEE914: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-EDD4A CENTRAL HEADER #75    02014B50 (33639248)\n-EDD4E Created Zip Spec      14 (20) '2.0'\n-EDD4F Created OS            03 (3) 'Unix'\n-EDD50 Extract Zip Spec      0A (10) '1.0'\n-EDD51 Extract OS            00 (0) 'MS-DOS'\n-EDD52 General Purpose Flag  0800 (2048)\n+EE9BB CENTRAL HEADER #75    02014B50 (33639248)\n+EE9BF Created Zip Spec      14 (20) '2.0'\n+EE9C0 Created OS            03 (3) 'Unix'\n+EE9C1 Extract Zip Spec      0A (10) '1.0'\n+EE9C2 Extract OS            00 (0) 'MS-DOS'\n+EE9C3 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-EDD54 Compression Method    0000 (0) 'Stored'\n-EDD56 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-EDD5A CRC                   00000000 (0)\n-EDD5E Compressed Size       00000000 (0)\n-EDD62 Uncompressed Size     00000000 (0)\n-EDD66 Filename Length       0024 (36)\n-EDD68 Extra Length          0000 (0)\n-EDD6A Comment Length        0000 (0)\n-EDD6C Disk Start            0000 (0)\n-EDD6E Int File Attributes   0000 (0)\n+EE9C5 Compression Method    0000 (0) 'Stored'\n+EE9C7 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+EE9CB CRC                   00000000 (0)\n+EE9CF Compressed Size       00000000 (0)\n+EE9D3 Uncompressed Size     00000000 (0)\n+EE9D7 Filename Length       0024 (36)\n+EE9D9 Extra Length          0000 (0)\n+EE9DB Comment Length        0000 (0)\n+EE9DD Disk Start            0000 (0)\n+EE9DF Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-EDD70 Ext File Attributes   41ED0010 (1106051088)\n+EE9E1 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-EDD74 Local Header Offset   00001F5E (8030)\n-EDD78 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+EE9E5 Local Header Offset   00001F5E (8030)\n+EE9E9 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xEDD78: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEE9E9: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xEDD78: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xEE9E9: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xEDD50: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEE9C1: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-EDD9C CENTRAL HEADER #76    02014B50 (33639248)\n-EDDA0 Created Zip Spec      14 (20) '2.0'\n-EDDA1 Created OS            03 (3) 'Unix'\n-EDDA2 Extract Zip Spec      0A (10) '1.0'\n-EDDA3 Extract OS            00 (0) 'MS-DOS'\n-EDDA4 General Purpose Flag  0800 (2048)\n+EEA0D CENTRAL HEADER #76    02014B50 (33639248)\n+EEA11 Created Zip Spec      14 (20) '2.0'\n+EEA12 Created OS            03 (3) 'Unix'\n+EEA13 Extract Zip Spec      0A (10) '1.0'\n+EEA14 Extract OS            00 (0) 'MS-DOS'\n+EEA15 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-EDDA6 Compression Method    0000 (0) 'Stored'\n-EDDA8 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-EDDAC CRC                   00000000 (0)\n-EDDB0 Compressed Size       00000000 (0)\n-EDDB4 Uncompressed Size     00000000 (0)\n-EDDB8 Filename Length       002B (43)\n-EDDBA Extra Length          0000 (0)\n-EDDBC Comment Length        0000 (0)\n-EDDBE Disk Start            0000 (0)\n-EDDC0 Int File Attributes   0000 (0)\n+EEA17 Compression Method    0000 (0) 'Stored'\n+EEA19 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+EEA1D CRC                   00000000 (0)\n+EEA21 Compressed Size       00000000 (0)\n+EEA25 Uncompressed Size     00000000 (0)\n+EEA29 Filename Length       002B (43)\n+EEA2B Extra Length          0000 (0)\n+EEA2D Comment Length        0000 (0)\n+EEA2F Disk Start            0000 (0)\n+EEA31 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-EDDC2 Ext File Attributes   41ED0010 (1106051088)\n+EEA33 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-EDDC6 Local Header Offset   00001FA0 (8096)\n-EDDCA Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+EEA37 Local Header Offset   00001FA0 (8096)\n+EEA3B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xEDDCA: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEEA3B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xEDDCA: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xEEA3B: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xEDDA2: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEEA13: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-EDDF5 CENTRAL HEADER #77    02014B50 (33639248)\n-EDDF9 Created Zip Spec      14 (20) '2.0'\n-EDDFA Created OS            03 (3) 'Unix'\n-EDDFB Extract Zip Spec      0A (10) '1.0'\n-EDDFC Extract OS            00 (0) 'MS-DOS'\n-EDDFD General Purpose Flag  0800 (2048)\n+EEA66 CENTRAL HEADER #77    02014B50 (33639248)\n+EEA6A Created Zip Spec      14 (20) '2.0'\n+EEA6B Created OS            03 (3) 'Unix'\n+EEA6C Extract Zip Spec      0A (10) '1.0'\n+EEA6D Extract OS            00 (0) 'MS-DOS'\n+EEA6E General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-EDDFF Compression Method    0000 (0) 'Stored'\n-EDE01 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-EDE05 CRC                   00000000 (0)\n-EDE09 Compressed Size       00000000 (0)\n-EDE0D Uncompressed Size     00000000 (0)\n-EDE11 Filename Length       0058 (88)\n-EDE13 Extra Length          0000 (0)\n-EDE15 Comment Length        0000 (0)\n-EDE17 Disk Start            0000 (0)\n-EDE19 Int File Attributes   0000 (0)\n+EEA70 Compression Method    0000 (0) 'Stored'\n+EEA72 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+EEA76 CRC                   00000000 (0)\n+EEA7A Compressed Size       00000000 (0)\n+EEA7E Uncompressed Size     00000000 (0)\n+EEA82 Filename Length       0058 (88)\n+EEA84 Extra Length          0000 (0)\n+EEA86 Comment Length        0000 (0)\n+EEA88 Disk Start            0000 (0)\n+EEA8A Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-EDE1B Ext File Attributes   41ED0010 (1106051088)\n+EEA8C Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-EDE1F Local Header Offset   00001FE9 (8169)\n-EDE23 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+EEA90 Local Header Offset   00001FE9 (8169)\n+EEA94 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xEDE23: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEEA94: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xEDE23: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xEEA94: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xEDDFB: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEEA6C: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-EDE7B CENTRAL HEADER #78    02014B50 (33639248)\n-EDE7F Created Zip Spec      14 (20) '2.0'\n-EDE80 Created OS            03 (3) 'Unix'\n-EDE81 Extract Zip Spec      0A (10) '1.0'\n-EDE82 Extract OS            00 (0) 'MS-DOS'\n-EDE83 General Purpose Flag  0800 (2048)\n+EEAEC CENTRAL HEADER #78    02014B50 (33639248)\n+EEAF0 Created Zip Spec      14 (20) '2.0'\n+EEAF1 Created OS            03 (3) 'Unix'\n+EEAF2 Extract Zip Spec      0A (10) '1.0'\n+EEAF3 Extract OS            00 (0) 'MS-DOS'\n+EEAF4 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-EDE85 Compression Method    0000 (0) 'Stored'\n-EDE87 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-EDE8B CRC                   00000000 (0)\n-EDE8F Compressed Size       00000000 (0)\n-EDE93 Uncompressed Size     00000000 (0)\n-EDE97 Filename Length       0058 (88)\n-EDE99 Extra Length          0000 (0)\n-EDE9B Comment Length        0000 (0)\n-EDE9D Disk Start            0000 (0)\n-EDE9F Int File Attributes   0000 (0)\n+EEAF6 Compression Method    0000 (0) 'Stored'\n+EEAF8 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+EEAFC CRC                   00000000 (0)\n+EEB00 Compressed Size       00000000 (0)\n+EEB04 Uncompressed Size     00000000 (0)\n+EEB08 Filename Length       0058 (88)\n+EEB0A Extra Length          0000 (0)\n+EEB0C Comment Length        0000 (0)\n+EEB0E Disk Start            0000 (0)\n+EEB10 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-EDEA1 Ext File Attributes   41ED0010 (1106051088)\n+EEB12 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-EDEA5 Local Header Offset   0000205F (8287)\n-EDEA9 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+EEB16 Local Header Offset   0000205F (8287)\n+EEB1A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xEDEA9: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEEB1A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xEDEA9: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xEEB1A: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xEDE81: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEEAF2: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-EDF01 CENTRAL HEADER #79    02014B50 (33639248)\n-EDF05 Created Zip Spec      14 (20) '2.0'\n-EDF06 Created OS            03 (3) 'Unix'\n-EDF07 Extract Zip Spec      0A (10) '1.0'\n-EDF08 Extract OS            00 (0) 'MS-DOS'\n-EDF09 General Purpose Flag  0800 (2048)\n+EEB72 CENTRAL HEADER #79    02014B50 (33639248)\n+EEB76 Created Zip Spec      14 (20) '2.0'\n+EEB77 Created OS            03 (3) 'Unix'\n+EEB78 Extract Zip Spec      0A (10) '1.0'\n+EEB79 Extract OS            00 (0) 'MS-DOS'\n+EEB7A General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-EDF0B Compression Method    0000 (0) 'Stored'\n-EDF0D Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-EDF11 CRC                   00000000 (0)\n-EDF15 Compressed Size       00000000 (0)\n-EDF19 Uncompressed Size     00000000 (0)\n-EDF1D Filename Length       0023 (35)\n-EDF1F Extra Length          0000 (0)\n-EDF21 Comment Length        0000 (0)\n-EDF23 Disk Start            0000 (0)\n-EDF25 Int File Attributes   0000 (0)\n+EEB7C Compression Method    0000 (0) 'Stored'\n+EEB7E Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+EEB82 CRC                   00000000 (0)\n+EEB86 Compressed Size       00000000 (0)\n+EEB8A Uncompressed Size     00000000 (0)\n+EEB8E Filename Length       0023 (35)\n+EEB90 Extra Length          0000 (0)\n+EEB92 Comment Length        0000 (0)\n+EEB94 Disk Start            0000 (0)\n+EEB96 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-EDF27 Ext File Attributes   41ED0010 (1106051088)\n+EEB98 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-EDF2B Local Header Offset   000020D5 (8405)\n-EDF2F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+EEB9C Local Header Offset   000020D5 (8405)\n+EEBA0 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xEDF2F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEEBA0: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xEDF2F: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xEEBA0: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xEDF07: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEEB78: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-EDF52 CENTRAL HEADER #80    02014B50 (33639248)\n-EDF56 Created Zip Spec      14 (20) '2.0'\n-EDF57 Created OS            03 (3) 'Unix'\n-EDF58 Extract Zip Spec      0A (10) '1.0'\n-EDF59 Extract OS            00 (0) 'MS-DOS'\n-EDF5A General Purpose Flag  0800 (2048)\n+EEBC3 CENTRAL HEADER #80    02014B50 (33639248)\n+EEBC7 Created Zip Spec      14 (20) '2.0'\n+EEBC8 Created OS            03 (3) 'Unix'\n+EEBC9 Extract Zip Spec      0A (10) '1.0'\n+EEBCA Extract OS            00 (0) 'MS-DOS'\n+EEBCB General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-EDF5C Compression Method    0000 (0) 'Stored'\n-EDF5E Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-EDF62 CRC                   00000000 (0)\n-EDF66 Compressed Size       00000000 (0)\n-EDF6A Uncompressed Size     00000000 (0)\n-EDF6E Filename Length       002A (42)\n-EDF70 Extra Length          0000 (0)\n-EDF72 Comment Length        0000 (0)\n-EDF74 Disk Start            0000 (0)\n-EDF76 Int File Attributes   0000 (0)\n+EEBCD Compression Method    0000 (0) 'Stored'\n+EEBCF Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+EEBD3 CRC                   00000000 (0)\n+EEBD7 Compressed Size       00000000 (0)\n+EEBDB Uncompressed Size     00000000 (0)\n+EEBDF Filename Length       002A (42)\n+EEBE1 Extra Length          0000 (0)\n+EEBE3 Comment Length        0000 (0)\n+EEBE5 Disk Start            0000 (0)\n+EEBE7 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-EDF78 Ext File Attributes   41ED0010 (1106051088)\n+EEBE9 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-EDF7C Local Header Offset   00002116 (8470)\n-EDF80 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+EEBED Local Header Offset   00002116 (8470)\n+EEBF1 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xEDF80: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEEBF1: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xEDF80: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xEEBF1: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xEDF58: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEEBC9: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-EDFAA CENTRAL HEADER #81    02014B50 (33639248)\n-EDFAE Created Zip Spec      14 (20) '2.0'\n-EDFAF Created OS            03 (3) 'Unix'\n-EDFB0 Extract Zip Spec      0A (10) '1.0'\n-EDFB1 Extract OS            00 (0) 'MS-DOS'\n-EDFB2 General Purpose Flag  0800 (2048)\n+EEC1B CENTRAL HEADER #81    02014B50 (33639248)\n+EEC1F Created Zip Spec      14 (20) '2.0'\n+EEC20 Created OS            03 (3) 'Unix'\n+EEC21 Extract Zip Spec      0A (10) '1.0'\n+EEC22 Extract OS            00 (0) 'MS-DOS'\n+EEC23 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-EDFB4 Compression Method    0000 (0) 'Stored'\n-EDFB6 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-EDFBA CRC                   00000000 (0)\n-EDFBE Compressed Size       00000000 (0)\n-EDFC2 Uncompressed Size     00000000 (0)\n-EDFC6 Filename Length       0054 (84)\n-EDFC8 Extra Length          0000 (0)\n-EDFCA Comment Length        0000 (0)\n-EDFCC Disk Start            0000 (0)\n-EDFCE Int File Attributes   0000 (0)\n+EEC25 Compression Method    0000 (0) 'Stored'\n+EEC27 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+EEC2B CRC                   00000000 (0)\n+EEC2F Compressed Size       00000000 (0)\n+EEC33 Uncompressed Size     00000000 (0)\n+EEC37 Filename Length       0054 (84)\n+EEC39 Extra Length          0000 (0)\n+EEC3B Comment Length        0000 (0)\n+EEC3D Disk Start            0000 (0)\n+EEC3F Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-EDFD0 Ext File Attributes   41ED0010 (1106051088)\n+EEC41 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-EDFD4 Local Header Offset   0000215E (8542)\n-EDFD8 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+EEC45 Local Header Offset   0000215E (8542)\n+EEC49 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xEDFD8: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEEC49: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xEDFD8: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xEEC49: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xEDFB0: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEEC21: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-EE02C CENTRAL HEADER #82    02014B50 (33639248)\n-EE030 Created Zip Spec      14 (20) '2.0'\n-EE031 Created OS            03 (3) 'Unix'\n-EE032 Extract Zip Spec      0A (10) '1.0'\n-EE033 Extract OS            00 (0) 'MS-DOS'\n-EE034 General Purpose Flag  0800 (2048)\n+EEC9D CENTRAL HEADER #82    02014B50 (33639248)\n+EECA1 Created Zip Spec      14 (20) '2.0'\n+EECA2 Created OS            03 (3) 'Unix'\n+EECA3 Extract Zip Spec      0A (10) '1.0'\n+EECA4 Extract OS            00 (0) 'MS-DOS'\n+EECA5 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-EE036 Compression Method    0000 (0) 'Stored'\n-EE038 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-EE03C CRC                   00000000 (0)\n-EE040 Compressed Size       00000000 (0)\n-EE044 Uncompressed Size     00000000 (0)\n-EE048 Filename Length       0022 (34)\n-EE04A Extra Length          0000 (0)\n-EE04C Comment Length        0000 (0)\n-EE04E Disk Start            0000 (0)\n-EE050 Int File Attributes   0000 (0)\n+EECA7 Compression Method    0000 (0) 'Stored'\n+EECA9 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+EECAD CRC                   00000000 (0)\n+EECB1 Compressed Size       00000000 (0)\n+EECB5 Uncompressed Size     00000000 (0)\n+EECB9 Filename Length       0022 (34)\n+EECBB Extra Length          0000 (0)\n+EECBD Comment Length        0000 (0)\n+EECBF Disk Start            0000 (0)\n+EECC1 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-EE052 Ext File Attributes   41ED0010 (1106051088)\n+EECC3 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-EE056 Local Header Offset   000021D0 (8656)\n-EE05A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+EECC7 Local Header Offset   000021D0 (8656)\n+EECCB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xEE05A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEECCB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xEE05A: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xEECCB: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xEE032: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEECA3: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-EE07C CENTRAL HEADER #83    02014B50 (33639248)\n-EE080 Created Zip Spec      14 (20) '2.0'\n-EE081 Created OS            03 (3) 'Unix'\n-EE082 Extract Zip Spec      0A (10) '1.0'\n-EE083 Extract OS            00 (0) 'MS-DOS'\n-EE084 General Purpose Flag  0800 (2048)\n+EECED CENTRAL HEADER #83    02014B50 (33639248)\n+EECF1 Created Zip Spec      14 (20) '2.0'\n+EECF2 Created OS            03 (3) 'Unix'\n+EECF3 Extract Zip Spec      0A (10) '1.0'\n+EECF4 Extract OS            00 (0) 'MS-DOS'\n+EECF5 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-EE086 Compression Method    0000 (0) 'Stored'\n-EE088 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-EE08C CRC                   00000000 (0)\n-EE090 Compressed Size       00000000 (0)\n-EE094 Uncompressed Size     00000000 (0)\n-EE098 Filename Length       0029 (41)\n-EE09A Extra Length          0000 (0)\n-EE09C Comment Length        0000 (0)\n-EE09E Disk Start            0000 (0)\n-EE0A0 Int File Attributes   0000 (0)\n+EECF7 Compression Method    0000 (0) 'Stored'\n+EECF9 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+EECFD CRC                   00000000 (0)\n+EED01 Compressed Size       00000000 (0)\n+EED05 Uncompressed Size     00000000 (0)\n+EED09 Filename Length       0029 (41)\n+EED0B Extra Length          0000 (0)\n+EED0D Comment Length        0000 (0)\n+EED0F Disk Start            0000 (0)\n+EED11 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-EE0A2 Ext File Attributes   41ED0010 (1106051088)\n+EED13 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-EE0A6 Local Header Offset   00002210 (8720)\n-EE0AA Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+EED17 Local Header Offset   00002210 (8720)\n+EED1B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xEE0AA: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEED1B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xEE0AA: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xEED1B: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xEE082: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEECF3: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-EE0D3 CENTRAL HEADER #84    02014B50 (33639248)\n-EE0D7 Created Zip Spec      14 (20) '2.0'\n-EE0D8 Created OS            03 (3) 'Unix'\n-EE0D9 Extract Zip Spec      0A (10) '1.0'\n-EE0DA Extract OS            00 (0) 'MS-DOS'\n-EE0DB General Purpose Flag  0800 (2048)\n+EED44 CENTRAL HEADER #84    02014B50 (33639248)\n+EED48 Created Zip Spec      14 (20) '2.0'\n+EED49 Created OS            03 (3) 'Unix'\n+EED4A Extract Zip Spec      0A (10) '1.0'\n+EED4B Extract OS            00 (0) 'MS-DOS'\n+EED4C General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-EE0DD Compression Method    0000 (0) 'Stored'\n-EE0DF Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-EE0E3 CRC                   00000000 (0)\n-EE0E7 Compressed Size       00000000 (0)\n-EE0EB Uncompressed Size     00000000 (0)\n-EE0EF Filename Length       005D (93)\n-EE0F1 Extra Length          0000 (0)\n-EE0F3 Comment Length        0000 (0)\n-EE0F5 Disk Start            0000 (0)\n-EE0F7 Int File Attributes   0000 (0)\n+EED4E Compression Method    0000 (0) 'Stored'\n+EED50 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+EED54 CRC                   00000000 (0)\n+EED58 Compressed Size       00000000 (0)\n+EED5C Uncompressed Size     00000000 (0)\n+EED60 Filename Length       005D (93)\n+EED62 Extra Length          0000 (0)\n+EED64 Comment Length        0000 (0)\n+EED66 Disk Start            0000 (0)\n+EED68 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-EE0F9 Ext File Attributes   41ED0010 (1106051088)\n+EED6A Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-EE0FD Local Header Offset   00002257 (8791)\n-EE101 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+EED6E Local Header Offset   00002257 (8791)\n+EED72 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xEE101: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEED72: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xEE101: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xEED72: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xEE0D9: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEED4A: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-EE15E CENTRAL HEADER #85    02014B50 (33639248)\n-EE162 Created Zip Spec      14 (20) '2.0'\n-EE163 Created OS            03 (3) 'Unix'\n-EE164 Extract Zip Spec      0A (10) '1.0'\n-EE165 Extract OS            00 (0) 'MS-DOS'\n-EE166 General Purpose Flag  0800 (2048)\n+EEDCF CENTRAL HEADER #85    02014B50 (33639248)\n+EEDD3 Created Zip Spec      14 (20) '2.0'\n+EEDD4 Created OS            03 (3) 'Unix'\n+EEDD5 Extract Zip Spec      0A (10) '1.0'\n+EEDD6 Extract OS            00 (0) 'MS-DOS'\n+EEDD7 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-EE168 Compression Method    0000 (0) 'Stored'\n-EE16A Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-EE16E CRC                   00000000 (0)\n-EE172 Compressed Size       00000000 (0)\n-EE176 Uncompressed Size     00000000 (0)\n-EE17A Filename Length       005F (95)\n-EE17C Extra Length          0000 (0)\n-EE17E Comment Length        0000 (0)\n-EE180 Disk Start            0000 (0)\n-EE182 Int File Attributes   0000 (0)\n+EEDD9 Compression Method    0000 (0) 'Stored'\n+EEDDB Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+EEDDF CRC                   00000000 (0)\n+EEDE3 Compressed Size       00000000 (0)\n+EEDE7 Uncompressed Size     00000000 (0)\n+EEDEB Filename Length       005F (95)\n+EEDED Extra Length          0000 (0)\n+EEDEF Comment Length        0000 (0)\n+EEDF1 Disk Start            0000 (0)\n+EEDF3 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-EE184 Ext File Attributes   41ED0010 (1106051088)\n+EEDF5 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-EE188 Local Header Offset   000022D2 (8914)\n-EE18C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+EEDF9 Local Header Offset   000022D2 (8914)\n+EEDFD Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xEE18C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEEDFD: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xEE18C: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xEEDFD: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xEE164: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEEDD5: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-EE1EB CENTRAL HEADER #86    02014B50 (33639248)\n-EE1EF Created Zip Spec      14 (20) '2.0'\n-EE1F0 Created OS            03 (3) 'Unix'\n-EE1F1 Extract Zip Spec      0A (10) '1.0'\n-EE1F2 Extract OS            00 (0) 'MS-DOS'\n-EE1F3 General Purpose Flag  0800 (2048)\n+EEE5C CENTRAL HEADER #86    02014B50 (33639248)\n+EEE60 Created Zip Spec      14 (20) '2.0'\n+EEE61 Created OS            03 (3) 'Unix'\n+EEE62 Extract Zip Spec      0A (10) '1.0'\n+EEE63 Extract OS            00 (0) 'MS-DOS'\n+EEE64 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-EE1F5 Compression Method    0000 (0) 'Stored'\n-EE1F7 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-EE1FB CRC                   00000000 (0)\n-EE1FF Compressed Size       00000000 (0)\n-EE203 Uncompressed Size     00000000 (0)\n-EE207 Filename Length       005E (94)\n-EE209 Extra Length          0000 (0)\n-EE20B Comment Length        0000 (0)\n-EE20D Disk Start            0000 (0)\n-EE20F Int File Attributes   0000 (0)\n+EEE66 Compression Method    0000 (0) 'Stored'\n+EEE68 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+EEE6C CRC                   00000000 (0)\n+EEE70 Compressed Size       00000000 (0)\n+EEE74 Uncompressed Size     00000000 (0)\n+EEE78 Filename Length       005E (94)\n+EEE7A Extra Length          0000 (0)\n+EEE7C Comment Length        0000 (0)\n+EEE7E Disk Start            0000 (0)\n+EEE80 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-EE211 Ext File Attributes   41ED0010 (1106051088)\n+EEE82 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-EE215 Local Header Offset   0000234F (9039)\n-EE219 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+EEE86 Local Header Offset   0000234F (9039)\n+EEE8A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xEE219: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEEE8A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xEE219: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xEEE8A: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xEE1F1: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEEE62: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-EE277 CENTRAL HEADER #87    02014B50 (33639248)\n-EE27B Created Zip Spec      14 (20) '2.0'\n-EE27C Created OS            03 (3) 'Unix'\n-EE27D Extract Zip Spec      0A (10) '1.0'\n-EE27E Extract OS            00 (0) 'MS-DOS'\n-EE27F General Purpose Flag  0800 (2048)\n+EEEE8 CENTRAL HEADER #87    02014B50 (33639248)\n+EEEEC Created Zip Spec      14 (20) '2.0'\n+EEEED Created OS            03 (3) 'Unix'\n+EEEEE Extract Zip Spec      0A (10) '1.0'\n+EEEEF Extract OS            00 (0) 'MS-DOS'\n+EEEF0 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-EE281 Compression Method    0000 (0) 'Stored'\n-EE283 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-EE287 CRC                   00000000 (0)\n-EE28B Compressed Size       00000000 (0)\n-EE28F Uncompressed Size     00000000 (0)\n-EE293 Filename Length       005D (93)\n-EE295 Extra Length          0000 (0)\n-EE297 Comment Length        0000 (0)\n-EE299 Disk Start            0000 (0)\n-EE29B Int File Attributes   0000 (0)\n+EEEF2 Compression Method    0000 (0) 'Stored'\n+EEEF4 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+EEEF8 CRC                   00000000 (0)\n+EEEFC Compressed Size       00000000 (0)\n+EEF00 Uncompressed Size     00000000 (0)\n+EEF04 Filename Length       005D (93)\n+EEF06 Extra Length          0000 (0)\n+EEF08 Comment Length        0000 (0)\n+EEF0A Disk Start            0000 (0)\n+EEF0C Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-EE29D Ext File Attributes   41ED0010 (1106051088)\n+EEF0E Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-EE2A1 Local Header Offset   000023CB (9163)\n-EE2A5 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+EEF12 Local Header Offset   000023CB (9163)\n+EEF16 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xEE2A5: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEEF16: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xEE2A5: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xEEF16: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xEE27D: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEEEEE: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-EE302 CENTRAL HEADER #88    02014B50 (33639248)\n-EE306 Created Zip Spec      14 (20) '2.0'\n-EE307 Created OS            03 (3) 'Unix'\n-EE308 Extract Zip Spec      0A (10) '1.0'\n-EE309 Extract OS            00 (0) 'MS-DOS'\n-EE30A General Purpose Flag  0800 (2048)\n+EEF73 CENTRAL HEADER #88    02014B50 (33639248)\n+EEF77 Created Zip Spec      14 (20) '2.0'\n+EEF78 Created OS            03 (3) 'Unix'\n+EEF79 Extract Zip Spec      0A (10) '1.0'\n+EEF7A Extract OS            00 (0) 'MS-DOS'\n+EEF7B General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-EE30C Compression Method    0000 (0) 'Stored'\n-EE30E Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-EE312 CRC                   00000000 (0)\n-EE316 Compressed Size       00000000 (0)\n-EE31A Uncompressed Size     00000000 (0)\n-EE31E Filename Length       005E (94)\n-EE320 Extra Length          0000 (0)\n-EE322 Comment Length        0000 (0)\n-EE324 Disk Start            0000 (0)\n-EE326 Int File Attributes   0000 (0)\n+EEF7D Compression Method    0000 (0) 'Stored'\n+EEF7F Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+EEF83 CRC                   00000000 (0)\n+EEF87 Compressed Size       00000000 (0)\n+EEF8B Uncompressed Size     00000000 (0)\n+EEF8F Filename Length       005E (94)\n+EEF91 Extra Length          0000 (0)\n+EEF93 Comment Length        0000 (0)\n+EEF95 Disk Start            0000 (0)\n+EEF97 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-EE328 Ext File Attributes   41ED0010 (1106051088)\n+EEF99 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-EE32C Local Header Offset   00002446 (9286)\n-EE330 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+EEF9D Local Header Offset   00002446 (9286)\n+EEFA1 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xEE330: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEEFA1: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xEE330: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xEEFA1: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xEE308: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEEF79: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-EE38E CENTRAL HEADER #89    02014B50 (33639248)\n-EE392 Created Zip Spec      14 (20) '2.0'\n-EE393 Created OS            03 (3) 'Unix'\n-EE394 Extract Zip Spec      0A (10) '1.0'\n-EE395 Extract OS            00 (0) 'MS-DOS'\n-EE396 General Purpose Flag  0800 (2048)\n+EEFFF CENTRAL HEADER #89    02014B50 (33639248)\n+EF003 Created Zip Spec      14 (20) '2.0'\n+EF004 Created OS            03 (3) 'Unix'\n+EF005 Extract Zip Spec      0A (10) '1.0'\n+EF006 Extract OS            00 (0) 'MS-DOS'\n+EF007 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-EE398 Compression Method    0000 (0) 'Stored'\n-EE39A Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-EE39E CRC                   00000000 (0)\n-EE3A2 Compressed Size       00000000 (0)\n-EE3A6 Uncompressed Size     00000000 (0)\n-EE3AA Filename Length       0078 (120)\n-EE3AC Extra Length          0000 (0)\n-EE3AE Comment Length        0000 (0)\n-EE3B0 Disk Start            0000 (0)\n-EE3B2 Int File Attributes   0000 (0)\n+EF009 Compression Method    0000 (0) 'Stored'\n+EF00B Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+EF00F CRC                   00000000 (0)\n+EF013 Compressed Size       00000000 (0)\n+EF017 Uncompressed Size     00000000 (0)\n+EF01B Filename Length       0078 (120)\n+EF01D Extra Length          0000 (0)\n+EF01F Comment Length        0000 (0)\n+EF021 Disk Start            0000 (0)\n+EF023 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-EE3B4 Ext File Attributes   41ED0010 (1106051088)\n+EF025 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-EE3B8 Local Header Offset   000024C2 (9410)\n-EE3BC Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+EF029 Local Header Offset   000024C2 (9410)\n+EF02D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xEE3BC: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEF02D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xEE3BC: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xEF02D: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xEE394: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEF005: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-EE434 CENTRAL HEADER #90    02014B50 (33639248)\n-EE438 Created Zip Spec      14 (20) '2.0'\n-EE439 Created OS            03 (3) 'Unix'\n-EE43A Extract Zip Spec      0A (10) '1.0'\n-EE43B Extract OS            00 (0) 'MS-DOS'\n-EE43C General Purpose Flag  0800 (2048)\n+EF0A5 CENTRAL HEADER #90    02014B50 (33639248)\n+EF0A9 Created Zip Spec      14 (20) '2.0'\n+EF0AA Created OS            03 (3) 'Unix'\n+EF0AB Extract Zip Spec      0A (10) '1.0'\n+EF0AC Extract OS            00 (0) 'MS-DOS'\n+EF0AD General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-EE43E Compression Method    0000 (0) 'Stored'\n-EE440 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-EE444 CRC                   00000000 (0)\n-EE448 Compressed Size       00000000 (0)\n-EE44C Uncompressed Size     00000000 (0)\n-EE450 Filename Length       0079 (121)\n-EE452 Extra Length          0000 (0)\n-EE454 Comment Length        0000 (0)\n-EE456 Disk Start            0000 (0)\n-EE458 Int File Attributes   0000 (0)\n+EF0AF Compression Method    0000 (0) 'Stored'\n+EF0B1 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+EF0B5 CRC                   00000000 (0)\n+EF0B9 Compressed Size       00000000 (0)\n+EF0BD Uncompressed Size     00000000 (0)\n+EF0C1 Filename Length       0079 (121)\n+EF0C3 Extra Length          0000 (0)\n+EF0C5 Comment Length        0000 (0)\n+EF0C7 Disk Start            0000 (0)\n+EF0C9 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-EE45A Ext File Attributes   41ED0010 (1106051088)\n+EF0CB Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-EE45E Local Header Offset   00002558 (9560)\n-EE462 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+EF0CF Local Header Offset   00002558 (9560)\n+EF0D3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xEE462: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEF0D3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xEE462: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xEF0D3: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xEE43A: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEF0AB: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-EE4DB CENTRAL HEADER #91    02014B50 (33639248)\n-EE4DF Created Zip Spec      14 (20) '2.0'\n-EE4E0 Created OS            03 (3) 'Unix'\n-EE4E1 Extract Zip Spec      0A (10) '1.0'\n-EE4E2 Extract OS            00 (0) 'MS-DOS'\n-EE4E3 General Purpose Flag  0800 (2048)\n+EF14C CENTRAL HEADER #91    02014B50 (33639248)\n+EF150 Created Zip Spec      14 (20) '2.0'\n+EF151 Created OS            03 (3) 'Unix'\n+EF152 Extract Zip Spec      0A (10) '1.0'\n+EF153 Extract OS            00 (0) 'MS-DOS'\n+EF154 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-EE4E5 Compression Method    0000 (0) 'Stored'\n-EE4E7 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-EE4EB CRC                   00000000 (0)\n-EE4EF Compressed Size       00000000 (0)\n-EE4F3 Uncompressed Size     00000000 (0)\n-EE4F7 Filename Length       0074 (116)\n-EE4F9 Extra Length          0000 (0)\n-EE4FB Comment Length        0000 (0)\n-EE4FD Disk Start            0000 (0)\n-EE4FF Int File Attributes   0000 (0)\n+EF156 Compression Method    0000 (0) 'Stored'\n+EF158 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+EF15C CRC                   00000000 (0)\n+EF160 Compressed Size       00000000 (0)\n+EF164 Uncompressed Size     00000000 (0)\n+EF168 Filename Length       0074 (116)\n+EF16A Extra Length          0000 (0)\n+EF16C Comment Length        0000 (0)\n+EF16E Disk Start            0000 (0)\n+EF170 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-EE501 Ext File Attributes   41ED0010 (1106051088)\n+EF172 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-EE505 Local Header Offset   000025EF (9711)\n-EE509 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+EF176 Local Header Offset   000025EF (9711)\n+EF17A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xEE509: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEF17A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xEE509: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xEF17A: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xEE4E1: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEF152: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-EE57D CENTRAL HEADER #92    02014B50 (33639248)\n-EE581 Created Zip Spec      14 (20) '2.0'\n-EE582 Created OS            03 (3) 'Unix'\n-EE583 Extract Zip Spec      0A (10) '1.0'\n-EE584 Extract OS            00 (0) 'MS-DOS'\n-EE585 General Purpose Flag  0800 (2048)\n+EF1EE CENTRAL HEADER #92    02014B50 (33639248)\n+EF1F2 Created Zip Spec      14 (20) '2.0'\n+EF1F3 Created OS            03 (3) 'Unix'\n+EF1F4 Extract Zip Spec      0A (10) '1.0'\n+EF1F5 Extract OS            00 (0) 'MS-DOS'\n+EF1F6 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-EE587 Compression Method    0000 (0) 'Stored'\n-EE589 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-EE58D CRC                   00000000 (0)\n-EE591 Compressed Size       00000000 (0)\n-EE595 Uncompressed Size     00000000 (0)\n-EE599 Filename Length       0075 (117)\n-EE59B Extra Length          0000 (0)\n-EE59D Comment Length        0000 (0)\n-EE59F Disk Start            0000 (0)\n-EE5A1 Int File Attributes   0000 (0)\n+EF1F8 Compression Method    0000 (0) 'Stored'\n+EF1FA Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+EF1FE CRC                   00000000 (0)\n+EF202 Compressed Size       00000000 (0)\n+EF206 Uncompressed Size     00000000 (0)\n+EF20A Filename Length       0075 (117)\n+EF20C Extra Length          0000 (0)\n+EF20E Comment Length        0000 (0)\n+EF210 Disk Start            0000 (0)\n+EF212 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-EE5A3 Ext File Attributes   41ED0010 (1106051088)\n+EF214 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-EE5A7 Local Header Offset   00002681 (9857)\n-EE5AB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+EF218 Local Header Offset   00002681 (9857)\n+EF21C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xEE5AB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEF21C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xEE5AB: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xEF21C: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xEE583: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEF1F4: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-EE620 CENTRAL HEADER #93    02014B50 (33639248)\n-EE624 Created Zip Spec      14 (20) '2.0'\n-EE625 Created OS            03 (3) 'Unix'\n-EE626 Extract Zip Spec      0A (10) '1.0'\n-EE627 Extract OS            00 (0) 'MS-DOS'\n-EE628 General Purpose Flag  0800 (2048)\n+EF291 CENTRAL HEADER #93    02014B50 (33639248)\n+EF295 Created Zip Spec      14 (20) '2.0'\n+EF296 Created OS            03 (3) 'Unix'\n+EF297 Extract Zip Spec      0A (10) '1.0'\n+EF298 Extract OS            00 (0) 'MS-DOS'\n+EF299 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-EE62A Compression Method    0000 (0) 'Stored'\n-EE62C Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-EE630 CRC                   00000000 (0)\n-EE634 Compressed Size       00000000 (0)\n-EE638 Uncompressed Size     00000000 (0)\n-EE63C Filename Length       0026 (38)\n-EE63E Extra Length          0000 (0)\n-EE640 Comment Length        0000 (0)\n-EE642 Disk Start            0000 (0)\n-EE644 Int File Attributes   0000 (0)\n+EF29B Compression Method    0000 (0) 'Stored'\n+EF29D Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+EF2A1 CRC                   00000000 (0)\n+EF2A5 Compressed Size       00000000 (0)\n+EF2A9 Uncompressed Size     00000000 (0)\n+EF2AD Filename Length       0026 (38)\n+EF2AF Extra Length          0000 (0)\n+EF2B1 Comment Length        0000 (0)\n+EF2B3 Disk Start            0000 (0)\n+EF2B5 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-EE646 Ext File Attributes   41ED0010 (1106051088)\n+EF2B7 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-EE64A Local Header Offset   00002714 (10004)\n-EE64E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+EF2BB Local Header Offset   00002714 (10004)\n+EF2BF Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xEE64E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEF2BF: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xEE64E: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xEF2BF: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xEE626: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEF297: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-EE674 CENTRAL HEADER #94    02014B50 (33639248)\n-EE678 Created Zip Spec      14 (20) '2.0'\n-EE679 Created OS            03 (3) 'Unix'\n-EE67A Extract Zip Spec      0A (10) '1.0'\n-EE67B Extract OS            00 (0) 'MS-DOS'\n-EE67C General Purpose Flag  0800 (2048)\n+EF2E5 CENTRAL HEADER #94    02014B50 (33639248)\n+EF2E9 Created Zip Spec      14 (20) '2.0'\n+EF2EA Created OS            03 (3) 'Unix'\n+EF2EB Extract Zip Spec      0A (10) '1.0'\n+EF2EC Extract OS            00 (0) 'MS-DOS'\n+EF2ED General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-EE67E Compression Method    0000 (0) 'Stored'\n-EE680 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-EE684 CRC                   00000000 (0)\n-EE688 Compressed Size       00000000 (0)\n-EE68C Uncompressed Size     00000000 (0)\n-EE690 Filename Length       002D (45)\n-EE692 Extra Length          0000 (0)\n-EE694 Comment Length        0000 (0)\n-EE696 Disk Start            0000 (0)\n-EE698 Int File Attributes   0000 (0)\n+EF2EF Compression Method    0000 (0) 'Stored'\n+EF2F1 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+EF2F5 CRC                   00000000 (0)\n+EF2F9 Compressed Size       00000000 (0)\n+EF2FD Uncompressed Size     00000000 (0)\n+EF301 Filename Length       002D (45)\n+EF303 Extra Length          0000 (0)\n+EF305 Comment Length        0000 (0)\n+EF307 Disk Start            0000 (0)\n+EF309 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-EE69A Ext File Attributes   41ED0010 (1106051088)\n+EF30B Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-EE69E Local Header Offset   00002758 (10072)\n-EE6A2 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+EF30F Local Header Offset   00002758 (10072)\n+EF313 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xEE6A2: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEF313: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xEE6A2: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xEF313: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xEE67A: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEF2EB: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-EE6CF CENTRAL HEADER #95    02014B50 (33639248)\n-EE6D3 Created Zip Spec      14 (20) '2.0'\n-EE6D4 Created OS            03 (3) 'Unix'\n-EE6D5 Extract Zip Spec      0A (10) '1.0'\n-EE6D6 Extract OS            00 (0) 'MS-DOS'\n-EE6D7 General Purpose Flag  0800 (2048)\n+EF340 CENTRAL HEADER #95    02014B50 (33639248)\n+EF344 Created Zip Spec      14 (20) '2.0'\n+EF345 Created OS            03 (3) 'Unix'\n+EF346 Extract Zip Spec      0A (10) '1.0'\n+EF347 Extract OS            00 (0) 'MS-DOS'\n+EF348 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-EE6D9 Compression Method    0000 (0) 'Stored'\n-EE6DB Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-EE6DF CRC                   00000000 (0)\n-EE6E3 Compressed Size       00000000 (0)\n-EE6E7 Uncompressed Size     00000000 (0)\n-EE6EB Filename Length       005E (94)\n-EE6ED Extra Length          0000 (0)\n-EE6EF Comment Length        0000 (0)\n-EE6F1 Disk Start            0000 (0)\n-EE6F3 Int File Attributes   0000 (0)\n+EF34A Compression Method    0000 (0) 'Stored'\n+EF34C Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+EF350 CRC                   00000000 (0)\n+EF354 Compressed Size       00000000 (0)\n+EF358 Uncompressed Size     00000000 (0)\n+EF35C Filename Length       005E (94)\n+EF35E Extra Length          0000 (0)\n+EF360 Comment Length        0000 (0)\n+EF362 Disk Start            0000 (0)\n+EF364 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-EE6F5 Ext File Attributes   41ED0010 (1106051088)\n+EF366 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-EE6F9 Local Header Offset   000027A3 (10147)\n-EE6FD Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+EF36A Local Header Offset   000027A3 (10147)\n+EF36E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xEE6FD: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEF36E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xEE6FD: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xEF36E: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xEE6D5: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEF346: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-EE75B CENTRAL HEADER #96    02014B50 (33639248)\n-EE75F Created Zip Spec      14 (20) '2.0'\n-EE760 Created OS            03 (3) 'Unix'\n-EE761 Extract Zip Spec      0A (10) '1.0'\n-EE762 Extract OS            00 (0) 'MS-DOS'\n-EE763 General Purpose Flag  0800 (2048)\n+EF3CC CENTRAL HEADER #96    02014B50 (33639248)\n+EF3D0 Created Zip Spec      14 (20) '2.0'\n+EF3D1 Created OS            03 (3) 'Unix'\n+EF3D2 Extract Zip Spec      0A (10) '1.0'\n+EF3D3 Extract OS            00 (0) 'MS-DOS'\n+EF3D4 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-EE765 Compression Method    0000 (0) 'Stored'\n-EE767 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-EE76B CRC                   00000000 (0)\n-EE76F Compressed Size       00000000 (0)\n-EE773 Uncompressed Size     00000000 (0)\n-EE777 Filename Length       0026 (38)\n-EE779 Extra Length          0000 (0)\n-EE77B Comment Length        0000 (0)\n-EE77D Disk Start            0000 (0)\n-EE77F Int File Attributes   0000 (0)\n+EF3D6 Compression Method    0000 (0) 'Stored'\n+EF3D8 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+EF3DC CRC                   00000000 (0)\n+EF3E0 Compressed Size       00000000 (0)\n+EF3E4 Uncompressed Size     00000000 (0)\n+EF3E8 Filename Length       0026 (38)\n+EF3EA Extra Length          0000 (0)\n+EF3EC Comment Length        0000 (0)\n+EF3EE Disk Start            0000 (0)\n+EF3F0 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-EE781 Ext File Attributes   41ED0010 (1106051088)\n+EF3F2 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-EE785 Local Header Offset   0000281F (10271)\n-EE789 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+EF3F6 Local Header Offset   0000281F (10271)\n+EF3FA Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xEE789: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEF3FA: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xEE789: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xEF3FA: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xEE761: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEF3D2: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-EE7AF CENTRAL HEADER #97    02014B50 (33639248)\n-EE7B3 Created Zip Spec      14 (20) '2.0'\n-EE7B4 Created OS            03 (3) 'Unix'\n-EE7B5 Extract Zip Spec      0A (10) '1.0'\n-EE7B6 Extract OS            00 (0) 'MS-DOS'\n-EE7B7 General Purpose Flag  0800 (2048)\n+EF420 CENTRAL HEADER #97    02014B50 (33639248)\n+EF424 Created Zip Spec      14 (20) '2.0'\n+EF425 Created OS            03 (3) 'Unix'\n+EF426 Extract Zip Spec      0A (10) '1.0'\n+EF427 Extract OS            00 (0) 'MS-DOS'\n+EF428 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-EE7B9 Compression Method    0000 (0) 'Stored'\n-EE7BB Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-EE7BF CRC                   00000000 (0)\n-EE7C3 Compressed Size       00000000 (0)\n-EE7C7 Uncompressed Size     00000000 (0)\n-EE7CB Filename Length       002D (45)\n-EE7CD Extra Length          0000 (0)\n-EE7CF Comment Length        0000 (0)\n-EE7D1 Disk Start            0000 (0)\n-EE7D3 Int File Attributes   0000 (0)\n+EF42A Compression Method    0000 (0) 'Stored'\n+EF42C Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+EF430 CRC                   00000000 (0)\n+EF434 Compressed Size       00000000 (0)\n+EF438 Uncompressed Size     00000000 (0)\n+EF43C Filename Length       002D (45)\n+EF43E Extra Length          0000 (0)\n+EF440 Comment Length        0000 (0)\n+EF442 Disk Start            0000 (0)\n+EF444 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-EE7D5 Ext File Attributes   41ED0010 (1106051088)\n+EF446 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-EE7D9 Local Header Offset   00002863 (10339)\n-EE7DD Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+EF44A Local Header Offset   00002863 (10339)\n+EF44E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xEE7DD: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEF44E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xEE7DD: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xEF44E: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xEE7B5: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEF426: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-EE80A CENTRAL HEADER #98    02014B50 (33639248)\n-EE80E Created Zip Spec      14 (20) '2.0'\n-EE80F Created OS            03 (3) 'Unix'\n-EE810 Extract Zip Spec      0A (10) '1.0'\n-EE811 Extract OS            00 (0) 'MS-DOS'\n-EE812 General Purpose Flag  0800 (2048)\n+EF47B CENTRAL HEADER #98    02014B50 (33639248)\n+EF47F Created Zip Spec      14 (20) '2.0'\n+EF480 Created OS            03 (3) 'Unix'\n+EF481 Extract Zip Spec      0A (10) '1.0'\n+EF482 Extract OS            00 (0) 'MS-DOS'\n+EF483 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-EE814 Compression Method    0000 (0) 'Stored'\n-EE816 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-EE81A CRC                   00000000 (0)\n-EE81E Compressed Size       00000000 (0)\n-EE822 Uncompressed Size     00000000 (0)\n-EE826 Filename Length       0064 (100)\n-EE828 Extra Length          0000 (0)\n-EE82A Comment Length        0000 (0)\n-EE82C Disk Start            0000 (0)\n-EE82E Int File Attributes   0000 (0)\n+EF485 Compression Method    0000 (0) 'Stored'\n+EF487 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+EF48B CRC                   00000000 (0)\n+EF48F Compressed Size       00000000 (0)\n+EF493 Uncompressed Size     00000000 (0)\n+EF497 Filename Length       0064 (100)\n+EF499 Extra Length          0000 (0)\n+EF49B Comment Length        0000 (0)\n+EF49D Disk Start            0000 (0)\n+EF49F Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-EE830 Ext File Attributes   41ED0010 (1106051088)\n+EF4A1 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-EE834 Local Header Offset   000028AE (10414)\n-EE838 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+EF4A5 Local Header Offset   000028AE (10414)\n+EF4A9 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xEE838: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEF4A9: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xEE838: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xEF4A9: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xEE810: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEF481: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-EE89C CENTRAL HEADER #99    02014B50 (33639248)\n-EE8A0 Created Zip Spec      14 (20) '2.0'\n-EE8A1 Created OS            03 (3) 'Unix'\n-EE8A2 Extract Zip Spec      0A (10) '1.0'\n-EE8A3 Extract OS            00 (0) 'MS-DOS'\n-EE8A4 General Purpose Flag  0800 (2048)\n+EF50D CENTRAL HEADER #99    02014B50 (33639248)\n+EF511 Created Zip Spec      14 (20) '2.0'\n+EF512 Created OS            03 (3) 'Unix'\n+EF513 Extract Zip Spec      0A (10) '1.0'\n+EF514 Extract OS            00 (0) 'MS-DOS'\n+EF515 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-EE8A6 Compression Method    0000 (0) 'Stored'\n-EE8A8 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-EE8AC CRC                   00000000 (0)\n-EE8B0 Compressed Size       00000000 (0)\n-EE8B4 Uncompressed Size     00000000 (0)\n-EE8B8 Filename Length       0025 (37)\n-EE8BA Extra Length          0000 (0)\n-EE8BC Comment Length        0000 (0)\n-EE8BE Disk Start            0000 (0)\n-EE8C0 Int File Attributes   0000 (0)\n+EF517 Compression Method    0000 (0) 'Stored'\n+EF519 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+EF51D CRC                   00000000 (0)\n+EF521 Compressed Size       00000000 (0)\n+EF525 Uncompressed Size     00000000 (0)\n+EF529 Filename Length       0025 (37)\n+EF52B Extra Length          0000 (0)\n+EF52D Comment Length        0000 (0)\n+EF52F Disk Start            0000 (0)\n+EF531 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-EE8C2 Ext File Attributes   41ED0010 (1106051088)\n+EF533 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-EE8C6 Local Header Offset   00002930 (10544)\n-EE8CA Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+EF537 Local Header Offset   00002930 (10544)\n+EF53B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xEE8CA: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEF53B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xEE8CA: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xEF53B: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xEE8A2: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEF513: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-EE8EF CENTRAL HEADER #100   02014B50 (33639248)\n-EE8F3 Created Zip Spec      14 (20) '2.0'\n-EE8F4 Created OS            03 (3) 'Unix'\n-EE8F5 Extract Zip Spec      0A (10) '1.0'\n-EE8F6 Extract OS            00 (0) 'MS-DOS'\n-EE8F7 General Purpose Flag  0800 (2048)\n+EF560 CENTRAL HEADER #100   02014B50 (33639248)\n+EF564 Created Zip Spec      14 (20) '2.0'\n+EF565 Created OS            03 (3) 'Unix'\n+EF566 Extract Zip Spec      0A (10) '1.0'\n+EF567 Extract OS            00 (0) 'MS-DOS'\n+EF568 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-EE8F9 Compression Method    0000 (0) 'Stored'\n-EE8FB Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-EE8FF CRC                   00000000 (0)\n-EE903 Compressed Size       00000000 (0)\n-EE907 Uncompressed Size     00000000 (0)\n-EE90B Filename Length       002C (44)\n-EE90D Extra Length          0000 (0)\n-EE90F Comment Length        0000 (0)\n-EE911 Disk Start            0000 (0)\n-EE913 Int File Attributes   0000 (0)\n+EF56A Compression Method    0000 (0) 'Stored'\n+EF56C Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+EF570 CRC                   00000000 (0)\n+EF574 Compressed Size       00000000 (0)\n+EF578 Uncompressed Size     00000000 (0)\n+EF57C Filename Length       002C (44)\n+EF57E Extra Length          0000 (0)\n+EF580 Comment Length        0000 (0)\n+EF582 Disk Start            0000 (0)\n+EF584 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-EE915 Ext File Attributes   41ED0010 (1106051088)\n+EF586 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-EE919 Local Header Offset   00002973 (10611)\n-EE91D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+EF58A Local Header Offset   00002973 (10611)\n+EF58E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xEE91D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEF58E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xEE91D: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xEF58E: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xEE8F5: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEF566: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-EE949 CENTRAL HEADER #101   02014B50 (33639248)\n-EE94D Created Zip Spec      14 (20) '2.0'\n-EE94E Created OS            03 (3) 'Unix'\n-EE94F Extract Zip Spec      0A (10) '1.0'\n-EE950 Extract OS            00 (0) 'MS-DOS'\n-EE951 General Purpose Flag  0800 (2048)\n+EF5BA CENTRAL HEADER #101   02014B50 (33639248)\n+EF5BE Created Zip Spec      14 (20) '2.0'\n+EF5BF Created OS            03 (3) 'Unix'\n+EF5C0 Extract Zip Spec      0A (10) '1.0'\n+EF5C1 Extract OS            00 (0) 'MS-DOS'\n+EF5C2 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-EE953 Compression Method    0000 (0) 'Stored'\n-EE955 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-EE959 CRC                   00000000 (0)\n-EE95D Compressed Size       00000000 (0)\n-EE961 Uncompressed Size     00000000 (0)\n-EE965 Filename Length       0067 (103)\n-EE967 Extra Length          0000 (0)\n-EE969 Comment Length        0000 (0)\n-EE96B Disk Start            0000 (0)\n-EE96D Int File Attributes   0000 (0)\n+EF5C4 Compression Method    0000 (0) 'Stored'\n+EF5C6 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+EF5CA CRC                   00000000 (0)\n+EF5CE Compressed Size       00000000 (0)\n+EF5D2 Uncompressed Size     00000000 (0)\n+EF5D6 Filename Length       0067 (103)\n+EF5D8 Extra Length          0000 (0)\n+EF5DA Comment Length        0000 (0)\n+EF5DC Disk Start            0000 (0)\n+EF5DE Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-EE96F Ext File Attributes   41ED0010 (1106051088)\n+EF5E0 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-EE973 Local Header Offset   000029BD (10685)\n-EE977 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+EF5E4 Local Header Offset   000029BD (10685)\n+EF5E8 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xEE977: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEF5E8: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xEE977: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xEF5E8: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xEE94F: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEF5C0: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-EE9DE CENTRAL HEADER #102   02014B50 (33639248)\n-EE9E2 Created Zip Spec      14 (20) '2.0'\n-EE9E3 Created OS            03 (3) 'Unix'\n-EE9E4 Extract Zip Spec      0A (10) '1.0'\n-EE9E5 Extract OS            00 (0) 'MS-DOS'\n-EE9E6 General Purpose Flag  0800 (2048)\n+EF64F CENTRAL HEADER #102   02014B50 (33639248)\n+EF653 Created Zip Spec      14 (20) '2.0'\n+EF654 Created OS            03 (3) 'Unix'\n+EF655 Extract Zip Spec      0A (10) '1.0'\n+EF656 Extract OS            00 (0) 'MS-DOS'\n+EF657 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-EE9E8 Compression Method    0000 (0) 'Stored'\n-EE9EA Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-EE9EE CRC                   00000000 (0)\n-EE9F2 Compressed Size       00000000 (0)\n-EE9F6 Uncompressed Size     00000000 (0)\n-EE9FA Filename Length       0057 (87)\n-EE9FC Extra Length          0000 (0)\n-EE9FE Comment Length        0000 (0)\n-EEA00 Disk Start            0000 (0)\n-EEA02 Int File Attributes   0000 (0)\n+EF659 Compression Method    0000 (0) 'Stored'\n+EF65B Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+EF65F CRC                   00000000 (0)\n+EF663 Compressed Size       00000000 (0)\n+EF667 Uncompressed Size     00000000 (0)\n+EF66B Filename Length       0057 (87)\n+EF66D Extra Length          0000 (0)\n+EF66F Comment Length        0000 (0)\n+EF671 Disk Start            0000 (0)\n+EF673 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-EEA04 Ext File Attributes   41ED0010 (1106051088)\n+EF675 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-EEA08 Local Header Offset   00002A42 (10818)\n-EEA0C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+EF679 Local Header Offset   00002A42 (10818)\n+EF67D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xEEA0C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEF67D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xEEA0C: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xEF67D: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xEE9E4: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEF655: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-EEA63 CENTRAL HEADER #103   02014B50 (33639248)\n-EEA67 Created Zip Spec      14 (20) '2.0'\n-EEA68 Created OS            03 (3) 'Unix'\n-EEA69 Extract Zip Spec      0A (10) '1.0'\n-EEA6A Extract OS            00 (0) 'MS-DOS'\n-EEA6B General Purpose Flag  0800 (2048)\n+EF6D4 CENTRAL HEADER #103   02014B50 (33639248)\n+EF6D8 Created Zip Spec      14 (20) '2.0'\n+EF6D9 Created OS            03 (3) 'Unix'\n+EF6DA Extract Zip Spec      0A (10) '1.0'\n+EF6DB Extract OS            00 (0) 'MS-DOS'\n+EF6DC General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-EEA6D Compression Method    0000 (0) 'Stored'\n-EEA6F Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-EEA73 CRC                   00000000 (0)\n-EEA77 Compressed Size       00000000 (0)\n-EEA7B Uncompressed Size     00000000 (0)\n-EEA7F Filename Length       0056 (86)\n-EEA81 Extra Length          0000 (0)\n-EEA83 Comment Length        0000 (0)\n-EEA85 Disk Start            0000 (0)\n-EEA87 Int File Attributes   0000 (0)\n+EF6DE Compression Method    0000 (0) 'Stored'\n+EF6E0 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+EF6E4 CRC                   00000000 (0)\n+EF6E8 Compressed Size       00000000 (0)\n+EF6EC Uncompressed Size     00000000 (0)\n+EF6F0 Filename Length       0056 (86)\n+EF6F2 Extra Length          0000 (0)\n+EF6F4 Comment Length        0000 (0)\n+EF6F6 Disk Start            0000 (0)\n+EF6F8 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-EEA89 Ext File Attributes   41ED0010 (1106051088)\n+EF6FA Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-EEA8D Local Header Offset   00002AB7 (10935)\n-EEA91 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+EF6FE Local Header Offset   00002AB7 (10935)\n+EF702 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xEEA91: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEF702: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xEEA91: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xEF702: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xEEA69: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEF6DA: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-EEAE7 CENTRAL HEADER #104   02014B50 (33639248)\n-EEAEB Created Zip Spec      14 (20) '2.0'\n-EEAEC Created OS            03 (3) 'Unix'\n-EEAED Extract Zip Spec      0A (10) '1.0'\n-EEAEE Extract OS            00 (0) 'MS-DOS'\n-EEAEF General Purpose Flag  0800 (2048)\n+EF758 CENTRAL HEADER #104   02014B50 (33639248)\n+EF75C Created Zip Spec      14 (20) '2.0'\n+EF75D Created OS            03 (3) 'Unix'\n+EF75E Extract Zip Spec      0A (10) '1.0'\n+EF75F Extract OS            00 (0) 'MS-DOS'\n+EF760 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-EEAF1 Compression Method    0000 (0) 'Stored'\n-EEAF3 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-EEAF7 CRC                   00000000 (0)\n-EEAFB Compressed Size       00000000 (0)\n-EEAFF Uncompressed Size     00000000 (0)\n-EEB03 Filename Length       002E (46)\n-EEB05 Extra Length          0000 (0)\n-EEB07 Comment Length        0000 (0)\n-EEB09 Disk Start            0000 (0)\n-EEB0B Int File Attributes   0000 (0)\n+EF762 Compression Method    0000 (0) 'Stored'\n+EF764 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+EF768 CRC                   00000000 (0)\n+EF76C Compressed Size       00000000 (0)\n+EF770 Uncompressed Size     00000000 (0)\n+EF774 Filename Length       002E (46)\n+EF776 Extra Length          0000 (0)\n+EF778 Comment Length        0000 (0)\n+EF77A Disk Start            0000 (0)\n+EF77C Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-EEB0D Ext File Attributes   41ED0010 (1106051088)\n+EF77E Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-EEB11 Local Header Offset   00002B2B (11051)\n-EEB15 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+EF782 Local Header Offset   00002B2B (11051)\n+EF786 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xEEB15: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEF786: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xEEB15: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xEF786: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xEEAED: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEF75E: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-EEB43 CENTRAL HEADER #105   02014B50 (33639248)\n-EEB47 Created Zip Spec      14 (20) '2.0'\n-EEB48 Created OS            03 (3) 'Unix'\n-EEB49 Extract Zip Spec      0A (10) '1.0'\n-EEB4A Extract OS            00 (0) 'MS-DOS'\n-EEB4B General Purpose Flag  0800 (2048)\n+EF7B4 CENTRAL HEADER #105   02014B50 (33639248)\n+EF7B8 Created Zip Spec      14 (20) '2.0'\n+EF7B9 Created OS            03 (3) 'Unix'\n+EF7BA Extract Zip Spec      0A (10) '1.0'\n+EF7BB Extract OS            00 (0) 'MS-DOS'\n+EF7BC General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-EEB4D Compression Method    0000 (0) 'Stored'\n-EEB4F Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-EEB53 CRC                   00000000 (0)\n-EEB57 Compressed Size       00000000 (0)\n-EEB5B Uncompressed Size     00000000 (0)\n-EEB5F Filename Length       0035 (53)\n-EEB61 Extra Length          0000 (0)\n-EEB63 Comment Length        0000 (0)\n-EEB65 Disk Start            0000 (0)\n-EEB67 Int File Attributes   0000 (0)\n+EF7BE Compression Method    0000 (0) 'Stored'\n+EF7C0 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+EF7C4 CRC                   00000000 (0)\n+EF7C8 Compressed Size       00000000 (0)\n+EF7CC Uncompressed Size     00000000 (0)\n+EF7D0 Filename Length       0035 (53)\n+EF7D2 Extra Length          0000 (0)\n+EF7D4 Comment Length        0000 (0)\n+EF7D6 Disk Start            0000 (0)\n+EF7D8 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-EEB69 Ext File Attributes   41ED0010 (1106051088)\n+EF7DA Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-EEB6D Local Header Offset   00002B77 (11127)\n-EEB71 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+EF7DE Local Header Offset   00002B77 (11127)\n+EF7E2 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xEEB71: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEF7E2: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xEEB71: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xEF7E2: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xEEB49: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEF7BA: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-EEBA6 CENTRAL HEADER #106   02014B50 (33639248)\n-EEBAA Created Zip Spec      14 (20) '2.0'\n-EEBAB Created OS            03 (3) 'Unix'\n-EEBAC Extract Zip Spec      0A (10) '1.0'\n-EEBAD Extract OS            00 (0) 'MS-DOS'\n-EEBAE General Purpose Flag  0800 (2048)\n+EF817 CENTRAL HEADER #106   02014B50 (33639248)\n+EF81B Created Zip Spec      14 (20) '2.0'\n+EF81C Created OS            03 (3) 'Unix'\n+EF81D Extract Zip Spec      0A (10) '1.0'\n+EF81E Extract OS            00 (0) 'MS-DOS'\n+EF81F General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-EEBB0 Compression Method    0000 (0) 'Stored'\n-EEBB2 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-EEBB6 CRC                   00000000 (0)\n-EEBBA Compressed Size       00000000 (0)\n-EEBBE Uncompressed Size     00000000 (0)\n-EEBC2 Filename Length       0079 (121)\n-EEBC4 Extra Length          0000 (0)\n-EEBC6 Comment Length        0000 (0)\n-EEBC8 Disk Start            0000 (0)\n-EEBCA Int File Attributes   0000 (0)\n+EF821 Compression Method    0000 (0) 'Stored'\n+EF823 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+EF827 CRC                   00000000 (0)\n+EF82B Compressed Size       00000000 (0)\n+EF82F Uncompressed Size     00000000 (0)\n+EF833 Filename Length       0079 (121)\n+EF835 Extra Length          0000 (0)\n+EF837 Comment Length        0000 (0)\n+EF839 Disk Start            0000 (0)\n+EF83B Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-EEBCC Ext File Attributes   41ED0010 (1106051088)\n+EF83D Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-EEBD0 Local Header Offset   00002BCA (11210)\n-EEBD4 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+EF841 Local Header Offset   00002BCA (11210)\n+EF845 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xEEBD4: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEF845: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xEEBD4: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xEF845: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xEEBAC: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEF81D: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-EEC4D CENTRAL HEADER #107   02014B50 (33639248)\n-EEC51 Created Zip Spec      14 (20) '2.0'\n-EEC52 Created OS            03 (3) 'Unix'\n-EEC53 Extract Zip Spec      0A (10) '1.0'\n-EEC54 Extract OS            00 (0) 'MS-DOS'\n-EEC55 General Purpose Flag  0800 (2048)\n+EF8BE CENTRAL HEADER #107   02014B50 (33639248)\n+EF8C2 Created Zip Spec      14 (20) '2.0'\n+EF8C3 Created OS            03 (3) 'Unix'\n+EF8C4 Extract Zip Spec      0A (10) '1.0'\n+EF8C5 Extract OS            00 (0) 'MS-DOS'\n+EF8C6 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-EEC57 Compression Method    0000 (0) 'Stored'\n-EEC59 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-EEC5D CRC                   00000000 (0)\n-EEC61 Compressed Size       00000000 (0)\n-EEC65 Uncompressed Size     00000000 (0)\n-EEC69 Filename Length       0031 (49)\n-EEC6B Extra Length          0000 (0)\n-EEC6D Comment Length        0000 (0)\n-EEC6F Disk Start            0000 (0)\n-EEC71 Int File Attributes   0000 (0)\n+EF8C8 Compression Method    0000 (0) 'Stored'\n+EF8CA Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+EF8CE CRC                   00000000 (0)\n+EF8D2 Compressed Size       00000000 (0)\n+EF8D6 Uncompressed Size     00000000 (0)\n+EF8DA Filename Length       0031 (49)\n+EF8DC Extra Length          0000 (0)\n+EF8DE Comment Length        0000 (0)\n+EF8E0 Disk Start            0000 (0)\n+EF8E2 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-EEC73 Ext File Attributes   41ED0010 (1106051088)\n+EF8E4 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-EEC77 Local Header Offset   00002C61 (11361)\n-EEC7B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+EF8E8 Local Header Offset   00002C61 (11361)\n+EF8EC Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xEEC7B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEF8EC: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xEEC7B: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xEF8EC: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xEEC53: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEF8C4: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-EECAC CENTRAL HEADER #108   02014B50 (33639248)\n-EECB0 Created Zip Spec      14 (20) '2.0'\n-EECB1 Created OS            03 (3) 'Unix'\n-EECB2 Extract Zip Spec      0A (10) '1.0'\n-EECB3 Extract OS            00 (0) 'MS-DOS'\n-EECB4 General Purpose Flag  0800 (2048)\n+EF91D CENTRAL HEADER #108   02014B50 (33639248)\n+EF921 Created Zip Spec      14 (20) '2.0'\n+EF922 Created OS            03 (3) 'Unix'\n+EF923 Extract Zip Spec      0A (10) '1.0'\n+EF924 Extract OS            00 (0) 'MS-DOS'\n+EF925 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-EECB6 Compression Method    0000 (0) 'Stored'\n-EECB8 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-EECBC CRC                   00000000 (0)\n-EECC0 Compressed Size       00000000 (0)\n-EECC4 Uncompressed Size     00000000 (0)\n-EECC8 Filename Length       0038 (56)\n-EECCA Extra Length          0000 (0)\n-EECCC Comment Length        0000 (0)\n-EECCE Disk Start            0000 (0)\n-EECD0 Int File Attributes   0000 (0)\n+EF927 Compression Method    0000 (0) 'Stored'\n+EF929 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+EF92D CRC                   00000000 (0)\n+EF931 Compressed Size       00000000 (0)\n+EF935 Uncompressed Size     00000000 (0)\n+EF939 Filename Length       0038 (56)\n+EF93B Extra Length          0000 (0)\n+EF93D Comment Length        0000 (0)\n+EF93F Disk Start            0000 (0)\n+EF941 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-EECD2 Ext File Attributes   41ED0010 (1106051088)\n+EF943 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-EECD6 Local Header Offset   00002CB0 (11440)\n-EECDA Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+EF947 Local Header Offset   00002CB0 (11440)\n+EF94B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xEECDA: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEF94B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xEECDA: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xEF94B: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xEECB2: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEF923: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-EED12 CENTRAL HEADER #109   02014B50 (33639248)\n-EED16 Created Zip Spec      14 (20) '2.0'\n-EED17 Created OS            03 (3) 'Unix'\n-EED18 Extract Zip Spec      0A (10) '1.0'\n-EED19 Extract OS            00 (0) 'MS-DOS'\n-EED1A General Purpose Flag  0800 (2048)\n+EF983 CENTRAL HEADER #109   02014B50 (33639248)\n+EF987 Created Zip Spec      14 (20) '2.0'\n+EF988 Created OS            03 (3) 'Unix'\n+EF989 Extract Zip Spec      0A (10) '1.0'\n+EF98A Extract OS            00 (0) 'MS-DOS'\n+EF98B General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-EED1C Compression Method    0000 (0) 'Stored'\n-EED1E Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-EED22 CRC                   00000000 (0)\n-EED26 Compressed Size       00000000 (0)\n-EED2A Uncompressed Size     00000000 (0)\n-EED2E Filename Length       007F (127)\n-EED30 Extra Length          0000 (0)\n-EED32 Comment Length        0000 (0)\n-EED34 Disk Start            0000 (0)\n-EED36 Int File Attributes   0000 (0)\n+EF98D Compression Method    0000 (0) 'Stored'\n+EF98F Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+EF993 CRC                   00000000 (0)\n+EF997 Compressed Size       00000000 (0)\n+EF99B Uncompressed Size     00000000 (0)\n+EF99F Filename Length       007F (127)\n+EF9A1 Extra Length          0000 (0)\n+EF9A3 Comment Length        0000 (0)\n+EF9A5 Disk Start            0000 (0)\n+EF9A7 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-EED38 Ext File Attributes   41ED0010 (1106051088)\n+EF9A9 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-EED3C Local Header Offset   00002D06 (11526)\n-EED40 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+EF9AD Local Header Offset   00002D06 (11526)\n+EF9B1 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xEED40: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEF9B1: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xEED40: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xEF9B1: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xEED18: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEF989: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-EEDBF CENTRAL HEADER #110   02014B50 (33639248)\n-EEDC3 Created Zip Spec      14 (20) '2.0'\n-EEDC4 Created OS            03 (3) 'Unix'\n-EEDC5 Extract Zip Spec      0A (10) '1.0'\n-EEDC6 Extract OS            00 (0) 'MS-DOS'\n-EEDC7 General Purpose Flag  0800 (2048)\n+EFA30 CENTRAL HEADER #110   02014B50 (33639248)\n+EFA34 Created Zip Spec      14 (20) '2.0'\n+EFA35 Created OS            03 (3) 'Unix'\n+EFA36 Extract Zip Spec      0A (10) '1.0'\n+EFA37 Extract OS            00 (0) 'MS-DOS'\n+EFA38 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-EEDC9 Compression Method    0000 (0) 'Stored'\n-EEDCB Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-EEDCF CRC                   00000000 (0)\n-EEDD3 Compressed Size       00000000 (0)\n-EEDD7 Uncompressed Size     00000000 (0)\n-EEDDB Filename Length       0086 (134)\n-EEDDD Extra Length          0000 (0)\n-EEDDF Comment Length        0000 (0)\n-EEDE1 Disk Start            0000 (0)\n-EEDE3 Int File Attributes   0000 (0)\n+EFA3A Compression Method    0000 (0) 'Stored'\n+EFA3C Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+EFA40 CRC                   00000000 (0)\n+EFA44 Compressed Size       00000000 (0)\n+EFA48 Uncompressed Size     00000000 (0)\n+EFA4C Filename Length       0086 (134)\n+EFA4E Extra Length          0000 (0)\n+EFA50 Comment Length        0000 (0)\n+EFA52 Disk Start            0000 (0)\n+EFA54 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-EEDE5 Ext File Attributes   41ED0010 (1106051088)\n+EFA56 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-EEDE9 Local Header Offset   00002DA3 (11683)\n-EEDED Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+EFA5A Local Header Offset   00002DA3 (11683)\n+EFA5E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             XX'\n #\n-# WARNING: Offset 0xEEDED: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEFA5E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xEEDED: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xEFA5E: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xEEDC5: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEFA36: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-EEE73 CENTRAL HEADER #111   02014B50 (33639248)\n-EEE77 Created Zip Spec      14 (20) '2.0'\n-EEE78 Created OS            03 (3) 'Unix'\n-EEE79 Extract Zip Spec      0A (10) '1.0'\n-EEE7A Extract OS            00 (0) 'MS-DOS'\n-EEE7B General Purpose Flag  0800 (2048)\n+EFAE4 CENTRAL HEADER #111   02014B50 (33639248)\n+EFAE8 Created Zip Spec      14 (20) '2.0'\n+EFAE9 Created OS            03 (3) 'Unix'\n+EFAEA Extract Zip Spec      0A (10) '1.0'\n+EFAEB Extract OS            00 (0) 'MS-DOS'\n+EFAEC General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-EEE7D Compression Method    0000 (0) 'Stored'\n-EEE7F Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-EEE83 CRC                   00000000 (0)\n-EEE87 Compressed Size       00000000 (0)\n-EEE8B Uncompressed Size     00000000 (0)\n-EEE8F Filename Length       0086 (134)\n-EEE91 Extra Length          0000 (0)\n-EEE93 Comment Length        0000 (0)\n-EEE95 Disk Start            0000 (0)\n-EEE97 Int File Attributes   0000 (0)\n+EFAEE Compression Method    0000 (0) 'Stored'\n+EFAF0 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+EFAF4 CRC                   00000000 (0)\n+EFAF8 Compressed Size       00000000 (0)\n+EFAFC Uncompressed Size     00000000 (0)\n+EFB00 Filename Length       0086 (134)\n+EFB02 Extra Length          0000 (0)\n+EFB04 Comment Length        0000 (0)\n+EFB06 Disk Start            0000 (0)\n+EFB08 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-EEE99 Ext File Attributes   41ED0010 (1106051088)\n+EFB0A Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-EEE9D Local Header Offset   00002E47 (11847)\n-EEEA1 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+EFB0E Local Header Offset   00002E47 (11847)\n+EFB12 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             XX'\n #\n-# WARNING: Offset 0xEEEA1: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEFB12: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xEEEA1: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xEFB12: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xEEE79: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEFAEA: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-EEF27 CENTRAL HEADER #112   02014B50 (33639248)\n-EEF2B Created Zip Spec      14 (20) '2.0'\n-EEF2C Created OS            03 (3) 'Unix'\n-EEF2D Extract Zip Spec      0A (10) '1.0'\n-EEF2E Extract OS            00 (0) 'MS-DOS'\n-EEF2F General Purpose Flag  0800 (2048)\n+EFB98 CENTRAL HEADER #112   02014B50 (33639248)\n+EFB9C Created Zip Spec      14 (20) '2.0'\n+EFB9D Created OS            03 (3) 'Unix'\n+EFB9E Extract Zip Spec      0A (10) '1.0'\n+EFB9F Extract OS            00 (0) 'MS-DOS'\n+EFBA0 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-EEF31 Compression Method    0000 (0) 'Stored'\n-EEF33 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-EEF37 CRC                   00000000 (0)\n-EEF3B Compressed Size       00000000 (0)\n-EEF3F Uncompressed Size     00000000 (0)\n-EEF43 Filename Length       0024 (36)\n-EEF45 Extra Length          0000 (0)\n-EEF47 Comment Length        0000 (0)\n-EEF49 Disk Start            0000 (0)\n-EEF4B Int File Attributes   0000 (0)\n+EFBA2 Compression Method    0000 (0) 'Stored'\n+EFBA4 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+EFBA8 CRC                   00000000 (0)\n+EFBAC Compressed Size       00000000 (0)\n+EFBB0 Uncompressed Size     00000000 (0)\n+EFBB4 Filename Length       0024 (36)\n+EFBB6 Extra Length          0000 (0)\n+EFBB8 Comment Length        0000 (0)\n+EFBBA Disk Start            0000 (0)\n+EFBBC Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-EEF4D Ext File Attributes   41ED0010 (1106051088)\n+EFBBE Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-EEF51 Local Header Offset   00002EEB (12011)\n-EEF55 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+EFBC2 Local Header Offset   00002EEB (12011)\n+EFBC6 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xEEF55: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEFBC6: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xEEF55: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xEFBC6: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xEEF2D: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEFB9E: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-EEF79 CENTRAL HEADER #113   02014B50 (33639248)\n-EEF7D Created Zip Spec      14 (20) '2.0'\n-EEF7E Created OS            03 (3) 'Unix'\n-EEF7F Extract Zip Spec      0A (10) '1.0'\n-EEF80 Extract OS            00 (0) 'MS-DOS'\n-EEF81 General Purpose Flag  0800 (2048)\n+EFBEA CENTRAL HEADER #113   02014B50 (33639248)\n+EFBEE Created Zip Spec      14 (20) '2.0'\n+EFBEF Created OS            03 (3) 'Unix'\n+EFBF0 Extract Zip Spec      0A (10) '1.0'\n+EFBF1 Extract OS            00 (0) 'MS-DOS'\n+EFBF2 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-EEF83 Compression Method    0000 (0) 'Stored'\n-EEF85 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-EEF89 CRC                   00000000 (0)\n-EEF8D Compressed Size       00000000 (0)\n-EEF91 Uncompressed Size     00000000 (0)\n-EEF95 Filename Length       002B (43)\n-EEF97 Extra Length          0000 (0)\n-EEF99 Comment Length        0000 (0)\n-EEF9B Disk Start            0000 (0)\n-EEF9D Int File Attributes   0000 (0)\n+EFBF4 Compression Method    0000 (0) 'Stored'\n+EFBF6 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+EFBFA CRC                   00000000 (0)\n+EFBFE Compressed Size       00000000 (0)\n+EFC02 Uncompressed Size     00000000 (0)\n+EFC06 Filename Length       002B (43)\n+EFC08 Extra Length          0000 (0)\n+EFC0A Comment Length        0000 (0)\n+EFC0C Disk Start            0000 (0)\n+EFC0E Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-EEF9F Ext File Attributes   41ED0010 (1106051088)\n+EFC10 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-EEFA3 Local Header Offset   00002F2D (12077)\n-EEFA7 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+EFC14 Local Header Offset   00002F2D (12077)\n+EFC18 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xEEFA7: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEFC18: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xEEFA7: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xEFC18: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xEEF7F: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEFBF0: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-EEFD2 CENTRAL HEADER #114   02014B50 (33639248)\n-EEFD6 Created Zip Spec      14 (20) '2.0'\n-EEFD7 Created OS            03 (3) 'Unix'\n-EEFD8 Extract Zip Spec      0A (10) '1.0'\n-EEFD9 Extract OS            00 (0) 'MS-DOS'\n-EEFDA General Purpose Flag  0800 (2048)\n+EFC43 CENTRAL HEADER #114   02014B50 (33639248)\n+EFC47 Created Zip Spec      14 (20) '2.0'\n+EFC48 Created OS            03 (3) 'Unix'\n+EFC49 Extract Zip Spec      0A (10) '1.0'\n+EFC4A Extract OS            00 (0) 'MS-DOS'\n+EFC4B General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-EEFDC Compression Method    0000 (0) 'Stored'\n-EEFDE Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-EEFE2 CRC                   00000000 (0)\n-EEFE6 Compressed Size       00000000 (0)\n-EEFEA Uncompressed Size     00000000 (0)\n-EEFEE Filename Length       0052 (82)\n-EEFF0 Extra Length          0000 (0)\n-EEFF2 Comment Length        0000 (0)\n-EEFF4 Disk Start            0000 (0)\n-EEFF6 Int File Attributes   0000 (0)\n+EFC4D Compression Method    0000 (0) 'Stored'\n+EFC4F Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+EFC53 CRC                   00000000 (0)\n+EFC57 Compressed Size       00000000 (0)\n+EFC5B Uncompressed Size     00000000 (0)\n+EFC5F Filename Length       0052 (82)\n+EFC61 Extra Length          0000 (0)\n+EFC63 Comment Length        0000 (0)\n+EFC65 Disk Start            0000 (0)\n+EFC67 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-EEFF8 Ext File Attributes   41ED0010 (1106051088)\n+EFC69 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-EEFFC Local Header Offset   00002F76 (12150)\n-EF000 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+EFC6D Local Header Offset   00002F76 (12150)\n+EFC71 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xEF000: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEFC71: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xEF000: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xEFC71: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xEEFD8: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEFC49: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-EF052 CENTRAL HEADER #115   02014B50 (33639248)\n-EF056 Created Zip Spec      14 (20) '2.0'\n-EF057 Created OS            03 (3) 'Unix'\n-EF058 Extract Zip Spec      0A (10) '1.0'\n-EF059 Extract OS            00 (0) 'MS-DOS'\n-EF05A General Purpose Flag  0800 (2048)\n+EFCC3 CENTRAL HEADER #115   02014B50 (33639248)\n+EFCC7 Created Zip Spec      14 (20) '2.0'\n+EFCC8 Created OS            03 (3) 'Unix'\n+EFCC9 Extract Zip Spec      0A (10) '1.0'\n+EFCCA Extract OS            00 (0) 'MS-DOS'\n+EFCCB General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-EF05C Compression Method    0000 (0) 'Stored'\n-EF05E Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-EF062 CRC                   00000000 (0)\n-EF066 Compressed Size       00000000 (0)\n-EF06A Uncompressed Size     00000000 (0)\n-EF06E Filename Length       004E (78)\n-EF070 Extra Length          0000 (0)\n-EF072 Comment Length        0000 (0)\n-EF074 Disk Start            0000 (0)\n-EF076 Int File Attributes   0000 (0)\n+EFCCD Compression Method    0000 (0) 'Stored'\n+EFCCF Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+EFCD3 CRC                   00000000 (0)\n+EFCD7 Compressed Size       00000000 (0)\n+EFCDB Uncompressed Size     00000000 (0)\n+EFCDF Filename Length       004E (78)\n+EFCE1 Extra Length          0000 (0)\n+EFCE3 Comment Length        0000 (0)\n+EFCE5 Disk Start            0000 (0)\n+EFCE7 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-EF078 Ext File Attributes   41ED0010 (1106051088)\n+EFCE9 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-EF07C Local Header Offset   00002FE6 (12262)\n-EF080 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+EFCED Local Header Offset   00002FE6 (12262)\n+EFCF1 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xEF080: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEFCF1: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xEF080: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xEFCF1: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xEF058: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEFCC9: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-EF0CE CENTRAL HEADER #116   02014B50 (33639248)\n-EF0D2 Created Zip Spec      14 (20) '2.0'\n-EF0D3 Created OS            03 (3) 'Unix'\n-EF0D4 Extract Zip Spec      0A (10) '1.0'\n-EF0D5 Extract OS            00 (0) 'MS-DOS'\n-EF0D6 General Purpose Flag  0800 (2048)\n+EFD3F CENTRAL HEADER #116   02014B50 (33639248)\n+EFD43 Created Zip Spec      14 (20) '2.0'\n+EFD44 Created OS            03 (3) 'Unix'\n+EFD45 Extract Zip Spec      0A (10) '1.0'\n+EFD46 Extract OS            00 (0) 'MS-DOS'\n+EFD47 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-EF0D8 Compression Method    0000 (0) 'Stored'\n-EF0DA Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-EF0DE CRC                   00000000 (0)\n-EF0E2 Compressed Size       00000000 (0)\n-EF0E6 Uncompressed Size     00000000 (0)\n-EF0EA Filename Length       004E (78)\n-EF0EC Extra Length          0000 (0)\n-EF0EE Comment Length        0000 (0)\n-EF0F0 Disk Start            0000 (0)\n-EF0F2 Int File Attributes   0000 (0)\n+EFD49 Compression Method    0000 (0) 'Stored'\n+EFD4B Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+EFD4F CRC                   00000000 (0)\n+EFD53 Compressed Size       00000000 (0)\n+EFD57 Uncompressed Size     00000000 (0)\n+EFD5B Filename Length       004E (78)\n+EFD5D Extra Length          0000 (0)\n+EFD5F Comment Length        0000 (0)\n+EFD61 Disk Start            0000 (0)\n+EFD63 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-EF0F4 Ext File Attributes   41ED0010 (1106051088)\n+EFD65 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-EF0F8 Local Header Offset   00003052 (12370)\n-EF0FC Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+EFD69 Local Header Offset   00003052 (12370)\n+EFD6D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xEF0FC: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEFD6D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xEF0FC: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xEFD6D: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xEF0D4: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEFD45: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-EF14A CENTRAL HEADER #117   02014B50 (33639248)\n-EF14E Created Zip Spec      14 (20) '2.0'\n-EF14F Created OS            03 (3) 'Unix'\n-EF150 Extract Zip Spec      0A (10) '1.0'\n-EF151 Extract OS            00 (0) 'MS-DOS'\n-EF152 General Purpose Flag  0800 (2048)\n+EFDBB CENTRAL HEADER #117   02014B50 (33639248)\n+EFDBF Created Zip Spec      14 (20) '2.0'\n+EFDC0 Created OS            03 (3) 'Unix'\n+EFDC1 Extract Zip Spec      0A (10) '1.0'\n+EFDC2 Extract OS            00 (0) 'MS-DOS'\n+EFDC3 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-EF154 Compression Method    0000 (0) 'Stored'\n-EF156 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-EF15A CRC                   00000000 (0)\n-EF15E Compressed Size       00000000 (0)\n-EF162 Uncompressed Size     00000000 (0)\n-EF166 Filename Length       0050 (80)\n-EF168 Extra Length          0000 (0)\n-EF16A Comment Length        0000 (0)\n-EF16C Disk Start            0000 (0)\n-EF16E Int File Attributes   0000 (0)\n+EFDC5 Compression Method    0000 (0) 'Stored'\n+EFDC7 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+EFDCB CRC                   00000000 (0)\n+EFDCF Compressed Size       00000000 (0)\n+EFDD3 Uncompressed Size     00000000 (0)\n+EFDD7 Filename Length       0050 (80)\n+EFDD9 Extra Length          0000 (0)\n+EFDDB Comment Length        0000 (0)\n+EFDDD Disk Start            0000 (0)\n+EFDDF Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-EF170 Ext File Attributes   41ED0010 (1106051088)\n+EFDE1 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-EF174 Local Header Offset   000030BE (12478)\n-EF178 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+EFDE5 Local Header Offset   000030BE (12478)\n+EFDE9 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xEF178: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEFDE9: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xEF178: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xEFDE9: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xEF150: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEFDC1: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-EF1C8 CENTRAL HEADER #118   02014B50 (33639248)\n-EF1CC Created Zip Spec      14 (20) '2.0'\n-EF1CD Created OS            03 (3) 'Unix'\n-EF1CE Extract Zip Spec      0A (10) '1.0'\n-EF1CF Extract OS            00 (0) 'MS-DOS'\n-EF1D0 General Purpose Flag  0800 (2048)\n+EFE39 CENTRAL HEADER #118   02014B50 (33639248)\n+EFE3D Created Zip Spec      14 (20) '2.0'\n+EFE3E Created OS            03 (3) 'Unix'\n+EFE3F Extract Zip Spec      0A (10) '1.0'\n+EFE40 Extract OS            00 (0) 'MS-DOS'\n+EFE41 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-EF1D2 Compression Method    0000 (0) 'Stored'\n-EF1D4 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-EF1D8 CRC                   00000000 (0)\n-EF1DC Compressed Size       00000000 (0)\n-EF1E0 Uncompressed Size     00000000 (0)\n-EF1E4 Filename Length       0026 (38)\n-EF1E6 Extra Length          0000 (0)\n-EF1E8 Comment Length        0000 (0)\n-EF1EA Disk Start            0000 (0)\n-EF1EC Int File Attributes   0000 (0)\n+EFE43 Compression Method    0000 (0) 'Stored'\n+EFE45 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+EFE49 CRC                   00000000 (0)\n+EFE4D Compressed Size       00000000 (0)\n+EFE51 Uncompressed Size     00000000 (0)\n+EFE55 Filename Length       0026 (38)\n+EFE57 Extra Length          0000 (0)\n+EFE59 Comment Length        0000 (0)\n+EFE5B Disk Start            0000 (0)\n+EFE5D Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-EF1EE Ext File Attributes   41ED0010 (1106051088)\n+EFE5F Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-EF1F2 Local Header Offset   0000312C (12588)\n-EF1F6 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+EFE63 Local Header Offset   0000312C (12588)\n+EFE67 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xEF1F6: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEFE67: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xEF1F6: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xEFE67: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xEF1CE: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEFE3F: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-EF21C CENTRAL HEADER #119   02014B50 (33639248)\n-EF220 Created Zip Spec      14 (20) '2.0'\n-EF221 Created OS            03 (3) 'Unix'\n-EF222 Extract Zip Spec      0A (10) '1.0'\n-EF223 Extract OS            00 (0) 'MS-DOS'\n-EF224 General Purpose Flag  0800 (2048)\n+EFE8D CENTRAL HEADER #119   02014B50 (33639248)\n+EFE91 Created Zip Spec      14 (20) '2.0'\n+EFE92 Created OS            03 (3) 'Unix'\n+EFE93 Extract Zip Spec      0A (10) '1.0'\n+EFE94 Extract OS            00 (0) 'MS-DOS'\n+EFE95 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-EF226 Compression Method    0000 (0) 'Stored'\n-EF228 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-EF22C CRC                   00000000 (0)\n-EF230 Compressed Size       00000000 (0)\n-EF234 Uncompressed Size     00000000 (0)\n-EF238 Filename Length       002D (45)\n-EF23A Extra Length          0000 (0)\n-EF23C Comment Length        0000 (0)\n-EF23E Disk Start            0000 (0)\n-EF240 Int File Attributes   0000 (0)\n+EFE97 Compression Method    0000 (0) 'Stored'\n+EFE99 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+EFE9D CRC                   00000000 (0)\n+EFEA1 Compressed Size       00000000 (0)\n+EFEA5 Uncompressed Size     00000000 (0)\n+EFEA9 Filename Length       002D (45)\n+EFEAB Extra Length          0000 (0)\n+EFEAD Comment Length        0000 (0)\n+EFEAF Disk Start            0000 (0)\n+EFEB1 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-EF242 Ext File Attributes   41ED0010 (1106051088)\n+EFEB3 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-EF246 Local Header Offset   00003170 (12656)\n-EF24A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+EFEB7 Local Header Offset   00003170 (12656)\n+EFEBB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xEF24A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEFEBB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xEF24A: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xEFEBB: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xEF222: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEFE93: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-EF277 CENTRAL HEADER #120   02014B50 (33639248)\n-EF27B Created Zip Spec      14 (20) '2.0'\n-EF27C Created OS            03 (3) 'Unix'\n-EF27D Extract Zip Spec      0A (10) '1.0'\n-EF27E Extract OS            00 (0) 'MS-DOS'\n-EF27F General Purpose Flag  0800 (2048)\n+EFEE8 CENTRAL HEADER #120   02014B50 (33639248)\n+EFEEC Created Zip Spec      14 (20) '2.0'\n+EFEED Created OS            03 (3) 'Unix'\n+EFEEE Extract Zip Spec      0A (10) '1.0'\n+EFEEF Extract OS            00 (0) 'MS-DOS'\n+EFEF0 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-EF281 Compression Method    0000 (0) 'Stored'\n-EF283 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-EF287 CRC                   00000000 (0)\n-EF28B Compressed Size       00000000 (0)\n-EF28F Uncompressed Size     00000000 (0)\n-EF293 Filename Length       005B (91)\n-EF295 Extra Length          0000 (0)\n-EF297 Comment Length        0000 (0)\n-EF299 Disk Start            0000 (0)\n-EF29B Int File Attributes   0000 (0)\n+EFEF2 Compression Method    0000 (0) 'Stored'\n+EFEF4 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+EFEF8 CRC                   00000000 (0)\n+EFEFC Compressed Size       00000000 (0)\n+EFF00 Uncompressed Size     00000000 (0)\n+EFF04 Filename Length       005B (91)\n+EFF06 Extra Length          0000 (0)\n+EFF08 Comment Length        0000 (0)\n+EFF0A Disk Start            0000 (0)\n+EFF0C Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-EF29D Ext File Attributes   41ED0010 (1106051088)\n+EFF0E Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-EF2A1 Local Header Offset   000031BB (12731)\n-EF2A5 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+EFF12 Local Header Offset   000031BB (12731)\n+EFF16 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xEF2A5: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEFF16: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xEF2A5: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xEFF16: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xEF27D: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEFEEE: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-EF300 CENTRAL HEADER #121   02014B50 (33639248)\n-EF304 Created Zip Spec      14 (20) '2.0'\n-EF305 Created OS            03 (3) 'Unix'\n-EF306 Extract Zip Spec      0A (10) '1.0'\n-EF307 Extract OS            00 (0) 'MS-DOS'\n-EF308 General Purpose Flag  0800 (2048)\n+EFF71 CENTRAL HEADER #121   02014B50 (33639248)\n+EFF75 Created Zip Spec      14 (20) '2.0'\n+EFF76 Created OS            03 (3) 'Unix'\n+EFF77 Extract Zip Spec      0A (10) '1.0'\n+EFF78 Extract OS            00 (0) 'MS-DOS'\n+EFF79 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-EF30A Compression Method    0000 (0) 'Stored'\n-EF30C Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-EF310 CRC                   00000000 (0)\n-EF314 Compressed Size       00000000 (0)\n-EF318 Uncompressed Size     00000000 (0)\n-EF31C Filename Length       002D (45)\n-EF31E Extra Length          0000 (0)\n-EF320 Comment Length        0000 (0)\n-EF322 Disk Start            0000 (0)\n-EF324 Int File Attributes   0000 (0)\n+EFF7B Compression Method    0000 (0) 'Stored'\n+EFF7D Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+EFF81 CRC                   00000000 (0)\n+EFF85 Compressed Size       00000000 (0)\n+EFF89 Uncompressed Size     00000000 (0)\n+EFF8D Filename Length       002D (45)\n+EFF8F Extra Length          0000 (0)\n+EFF91 Comment Length        0000 (0)\n+EFF93 Disk Start            0000 (0)\n+EFF95 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-EF326 Ext File Attributes   41ED0010 (1106051088)\n+EFF97 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-EF32A Local Header Offset   00003234 (12852)\n-EF32E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+EFF9B Local Header Offset   00003234 (12852)\n+EFF9F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xEF32E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEFF9F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xEF32E: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xEFF9F: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xEF306: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEFF77: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-EF35B CENTRAL HEADER #122   02014B50 (33639248)\n-EF35F Created Zip Spec      14 (20) '2.0'\n-EF360 Created OS            03 (3) 'Unix'\n-EF361 Extract Zip Spec      0A (10) '1.0'\n-EF362 Extract OS            00 (0) 'MS-DOS'\n-EF363 General Purpose Flag  0800 (2048)\n+EFFCC CENTRAL HEADER #122   02014B50 (33639248)\n+EFFD0 Created Zip Spec      14 (20) '2.0'\n+EFFD1 Created OS            03 (3) 'Unix'\n+EFFD2 Extract Zip Spec      0A (10) '1.0'\n+EFFD3 Extract OS            00 (0) 'MS-DOS'\n+EFFD4 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-EF365 Compression Method    0000 (0) 'Stored'\n-EF367 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-EF36B CRC                   00000000 (0)\n-EF36F Compressed Size       00000000 (0)\n-EF373 Uncompressed Size     00000000 (0)\n-EF377 Filename Length       0034 (52)\n-EF379 Extra Length          0000 (0)\n-EF37B Comment Length        0000 (0)\n-EF37D Disk Start            0000 (0)\n-EF37F Int File Attributes   0000 (0)\n+EFFD6 Compression Method    0000 (0) 'Stored'\n+EFFD8 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+EFFDC CRC                   00000000 (0)\n+EFFE0 Compressed Size       00000000 (0)\n+EFFE4 Uncompressed Size     00000000 (0)\n+EFFE8 Filename Length       0034 (52)\n+EFFEA Extra Length          0000 (0)\n+EFFEC Comment Length        0000 (0)\n+EFFEE Disk Start            0000 (0)\n+EFFF0 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-EF381 Ext File Attributes   41ED0010 (1106051088)\n+EFFF2 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-EF385 Local Header Offset   0000327F (12927)\n-EF389 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+EFFF6 Local Header Offset   0000327F (12927)\n+EFFFA Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xEF389: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEFFFA: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xEF389: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xEFFFA: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xEF361: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEFFD2: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-EF3BD CENTRAL HEADER #123   02014B50 (33639248)\n-EF3C1 Created Zip Spec      14 (20) '2.0'\n-EF3C2 Created OS            03 (3) 'Unix'\n-EF3C3 Extract Zip Spec      0A (10) '1.0'\n-EF3C4 Extract OS            00 (0) 'MS-DOS'\n-EF3C5 General Purpose Flag  0800 (2048)\n+F002E CENTRAL HEADER #123   02014B50 (33639248)\n+F0032 Created Zip Spec      14 (20) '2.0'\n+F0033 Created OS            03 (3) 'Unix'\n+F0034 Extract Zip Spec      0A (10) '1.0'\n+F0035 Extract OS            00 (0) 'MS-DOS'\n+F0036 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-EF3C7 Compression Method    0000 (0) 'Stored'\n-EF3C9 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-EF3CD CRC                   00000000 (0)\n-EF3D1 Compressed Size       00000000 (0)\n-EF3D5 Uncompressed Size     00000000 (0)\n-EF3D9 Filename Length       0068 (104)\n-EF3DB Extra Length          0000 (0)\n-EF3DD Comment Length        0000 (0)\n-EF3DF Disk Start            0000 (0)\n-EF3E1 Int File Attributes   0000 (0)\n+F0038 Compression Method    0000 (0) 'Stored'\n+F003A Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F003E CRC                   00000000 (0)\n+F0042 Compressed Size       00000000 (0)\n+F0046 Uncompressed Size     00000000 (0)\n+F004A Filename Length       0068 (104)\n+F004C Extra Length          0000 (0)\n+F004E Comment Length        0000 (0)\n+F0050 Disk Start            0000 (0)\n+F0052 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-EF3E3 Ext File Attributes   41ED0010 (1106051088)\n+F0054 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-EF3E7 Local Header Offset   000032D1 (13009)\n-EF3EB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F0058 Local Header Offset   000032D1 (13009)\n+F005C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xEF3EB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF005C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xEF3EB: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF005C: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xEF3C3: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF0034: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-EF453 CENTRAL HEADER #124   02014B50 (33639248)\n-EF457 Created Zip Spec      14 (20) '2.0'\n-EF458 Created OS            03 (3) 'Unix'\n-EF459 Extract Zip Spec      0A (10) '1.0'\n-EF45A Extract OS            00 (0) 'MS-DOS'\n-EF45B General Purpose Flag  0800 (2048)\n+F00C4 CENTRAL HEADER #124   02014B50 (33639248)\n+F00C8 Created Zip Spec      14 (20) '2.0'\n+F00C9 Created OS            03 (3) 'Unix'\n+F00CA Extract Zip Spec      0A (10) '1.0'\n+F00CB Extract OS            00 (0) 'MS-DOS'\n+F00CC General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-EF45D Compression Method    0000 (0) 'Stored'\n-EF45F Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-EF463 CRC                   00000000 (0)\n-EF467 Compressed Size       00000000 (0)\n-EF46B Uncompressed Size     00000000 (0)\n-EF46F Filename Length       006C (108)\n-EF471 Extra Length          0000 (0)\n-EF473 Comment Length        0000 (0)\n-EF475 Disk Start            0000 (0)\n-EF477 Int File Attributes   0000 (0)\n+F00CE Compression Method    0000 (0) 'Stored'\n+F00D0 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F00D4 CRC                   00000000 (0)\n+F00D8 Compressed Size       00000000 (0)\n+F00DC Uncompressed Size     00000000 (0)\n+F00E0 Filename Length       006C (108)\n+F00E2 Extra Length          0000 (0)\n+F00E4 Comment Length        0000 (0)\n+F00E6 Disk Start            0000 (0)\n+F00E8 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-EF479 Ext File Attributes   41ED0010 (1106051088)\n+F00EA Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-EF47D Local Header Offset   00003357 (13143)\n-EF481 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F00EE Local Header Offset   00003357 (13143)\n+F00F2 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xEF481: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF00F2: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xEF481: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF00F2: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xEF459: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF00CA: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-EF4ED CENTRAL HEADER #125   02014B50 (33639248)\n-EF4F1 Created Zip Spec      14 (20) '2.0'\n-EF4F2 Created OS            03 (3) 'Unix'\n-EF4F3 Extract Zip Spec      0A (10) '1.0'\n-EF4F4 Extract OS            00 (0) 'MS-DOS'\n-EF4F5 General Purpose Flag  0800 (2048)\n+F015E CENTRAL HEADER #125   02014B50 (33639248)\n+F0162 Created Zip Spec      14 (20) '2.0'\n+F0163 Created OS            03 (3) 'Unix'\n+F0164 Extract Zip Spec      0A (10) '1.0'\n+F0165 Extract OS            00 (0) 'MS-DOS'\n+F0166 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-EF4F7 Compression Method    0000 (0) 'Stored'\n-EF4F9 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-EF4FD CRC                   00000000 (0)\n-EF501 Compressed Size       00000000 (0)\n-EF505 Uncompressed Size     00000000 (0)\n-EF509 Filename Length       005E (94)\n-EF50B Extra Length          0000 (0)\n-EF50D Comment Length        0000 (0)\n-EF50F Disk Start            0000 (0)\n-EF511 Int File Attributes   0000 (0)\n+F0168 Compression Method    0000 (0) 'Stored'\n+F016A Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F016E CRC                   00000000 (0)\n+F0172 Compressed Size       00000000 (0)\n+F0176 Uncompressed Size     00000000 (0)\n+F017A Filename Length       005E (94)\n+F017C Extra Length          0000 (0)\n+F017E Comment Length        0000 (0)\n+F0180 Disk Start            0000 (0)\n+F0182 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-EF513 Ext File Attributes   41ED0010 (1106051088)\n+F0184 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-EF517 Local Header Offset   000033E1 (13281)\n-EF51B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F0188 Local Header Offset   000033E1 (13281)\n+F018C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xEF51B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF018C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xEF51B: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF018C: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xEF4F3: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF0164: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-EF579 CENTRAL HEADER #126   02014B50 (33639248)\n-EF57D Created Zip Spec      14 (20) '2.0'\n-EF57E Created OS            03 (3) 'Unix'\n-EF57F Extract Zip Spec      0A (10) '1.0'\n-EF580 Extract OS            00 (0) 'MS-DOS'\n-EF581 General Purpose Flag  0800 (2048)\n+F01EA CENTRAL HEADER #126   02014B50 (33639248)\n+F01EE Created Zip Spec      14 (20) '2.0'\n+F01EF Created OS            03 (3) 'Unix'\n+F01F0 Extract Zip Spec      0A (10) '1.0'\n+F01F1 Extract OS            00 (0) 'MS-DOS'\n+F01F2 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-EF583 Compression Method    0000 (0) 'Stored'\n-EF585 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-EF589 CRC                   00000000 (0)\n-EF58D Compressed Size       00000000 (0)\n-EF591 Uncompressed Size     00000000 (0)\n-EF595 Filename Length       005E (94)\n-EF597 Extra Length          0000 (0)\n-EF599 Comment Length        0000 (0)\n-EF59B Disk Start            0000 (0)\n-EF59D Int File Attributes   0000 (0)\n+F01F4 Compression Method    0000 (0) 'Stored'\n+F01F6 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F01FA CRC                   00000000 (0)\n+F01FE Compressed Size       00000000 (0)\n+F0202 Uncompressed Size     00000000 (0)\n+F0206 Filename Length       005E (94)\n+F0208 Extra Length          0000 (0)\n+F020A Comment Length        0000 (0)\n+F020C Disk Start            0000 (0)\n+F020E Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-EF59F Ext File Attributes   41ED0010 (1106051088)\n+F0210 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-EF5A3 Local Header Offset   0000345D (13405)\n-EF5A7 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F0214 Local Header Offset   0000345D (13405)\n+F0218 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xEF5A7: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF0218: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xEF5A7: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF0218: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xEF57F: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF01F0: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-EF605 CENTRAL HEADER #127   02014B50 (33639248)\n-EF609 Created Zip Spec      14 (20) '2.0'\n-EF60A Created OS            03 (3) 'Unix'\n-EF60B Extract Zip Spec      0A (10) '1.0'\n-EF60C Extract OS            00 (0) 'MS-DOS'\n-EF60D General Purpose Flag  0800 (2048)\n+F0276 CENTRAL HEADER #127   02014B50 (33639248)\n+F027A Created Zip Spec      14 (20) '2.0'\n+F027B Created OS            03 (3) 'Unix'\n+F027C Extract Zip Spec      0A (10) '1.0'\n+F027D Extract OS            00 (0) 'MS-DOS'\n+F027E General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-EF60F Compression Method    0000 (0) 'Stored'\n-EF611 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-EF615 CRC                   00000000 (0)\n-EF619 Compressed Size       00000000 (0)\n-EF61D Uncompressed Size     00000000 (0)\n-EF621 Filename Length       0028 (40)\n-EF623 Extra Length          0000 (0)\n-EF625 Comment Length        0000 (0)\n-EF627 Disk Start            0000 (0)\n-EF629 Int File Attributes   0000 (0)\n+F0280 Compression Method    0000 (0) 'Stored'\n+F0282 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F0286 CRC                   00000000 (0)\n+F028A Compressed Size       00000000 (0)\n+F028E Uncompressed Size     00000000 (0)\n+F0292 Filename Length       0028 (40)\n+F0294 Extra Length          0000 (0)\n+F0296 Comment Length        0000 (0)\n+F0298 Disk Start            0000 (0)\n+F029A Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-EF62B Ext File Attributes   41ED0010 (1106051088)\n+F029C Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-EF62F Local Header Offset   000034D9 (13529)\n-EF633 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F02A0 Local Header Offset   000034D9 (13529)\n+F02A4 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xEF633: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF02A4: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xEF633: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF02A4: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xEF60B: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF027C: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-EF65B CENTRAL HEADER #128   02014B50 (33639248)\n-EF65F Created Zip Spec      14 (20) '2.0'\n-EF660 Created OS            03 (3) 'Unix'\n-EF661 Extract Zip Spec      0A (10) '1.0'\n-EF662 Extract OS            00 (0) 'MS-DOS'\n-EF663 General Purpose Flag  0800 (2048)\n+F02CC CENTRAL HEADER #128   02014B50 (33639248)\n+F02D0 Created Zip Spec      14 (20) '2.0'\n+F02D1 Created OS            03 (3) 'Unix'\n+F02D2 Extract Zip Spec      0A (10) '1.0'\n+F02D3 Extract OS            00 (0) 'MS-DOS'\n+F02D4 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-EF665 Compression Method    0000 (0) 'Stored'\n-EF667 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-EF66B CRC                   00000000 (0)\n-EF66F Compressed Size       00000000 (0)\n-EF673 Uncompressed Size     00000000 (0)\n-EF677 Filename Length       002F (47)\n-EF679 Extra Length          0000 (0)\n-EF67B Comment Length        0000 (0)\n-EF67D Disk Start            0000 (0)\n-EF67F Int File Attributes   0000 (0)\n+F02D6 Compression Method    0000 (0) 'Stored'\n+F02D8 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F02DC CRC                   00000000 (0)\n+F02E0 Compressed Size       00000000 (0)\n+F02E4 Uncompressed Size     00000000 (0)\n+F02E8 Filename Length       002F (47)\n+F02EA Extra Length          0000 (0)\n+F02EC Comment Length        0000 (0)\n+F02EE Disk Start            0000 (0)\n+F02F0 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-EF681 Ext File Attributes   41ED0010 (1106051088)\n+F02F2 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-EF685 Local Header Offset   0000351F (13599)\n-EF689 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F02F6 Local Header Offset   0000351F (13599)\n+F02FA Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xEF689: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF02FA: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xEF689: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF02FA: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xEF661: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF02D2: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-EF6B8 CENTRAL HEADER #129   02014B50 (33639248)\n-EF6BC Created Zip Spec      14 (20) '2.0'\n-EF6BD Created OS            03 (3) 'Unix'\n-EF6BE Extract Zip Spec      0A (10) '1.0'\n-EF6BF Extract OS            00 (0) 'MS-DOS'\n-EF6C0 General Purpose Flag  0800 (2048)\n+F0329 CENTRAL HEADER #129   02014B50 (33639248)\n+F032D Created Zip Spec      14 (20) '2.0'\n+F032E Created OS            03 (3) 'Unix'\n+F032F Extract Zip Spec      0A (10) '1.0'\n+F0330 Extract OS            00 (0) 'MS-DOS'\n+F0331 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-EF6C2 Compression Method    0000 (0) 'Stored'\n-EF6C4 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-EF6C8 CRC                   00000000 (0)\n-EF6CC Compressed Size       00000000 (0)\n-EF6D0 Uncompressed Size     00000000 (0)\n-EF6D4 Filename Length       006E (110)\n-EF6D6 Extra Length          0000 (0)\n-EF6D8 Comment Length        0000 (0)\n-EF6DA Disk Start            0000 (0)\n-EF6DC Int File Attributes   0000 (0)\n+F0333 Compression Method    0000 (0) 'Stored'\n+F0335 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F0339 CRC                   00000000 (0)\n+F033D Compressed Size       00000000 (0)\n+F0341 Uncompressed Size     00000000 (0)\n+F0345 Filename Length       006E (110)\n+F0347 Extra Length          0000 (0)\n+F0349 Comment Length        0000 (0)\n+F034B Disk Start            0000 (0)\n+F034D Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-EF6DE Ext File Attributes   41ED0010 (1106051088)\n+F034F Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-EF6E2 Local Header Offset   0000356C (13676)\n-EF6E6 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F0353 Local Header Offset   0000356C (13676)\n+F0357 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xEF6E6: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF0357: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xEF6E6: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF0357: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xEF6BE: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF032F: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-EF754 CENTRAL HEADER #130   02014B50 (33639248)\n-EF758 Created Zip Spec      14 (20) '2.0'\n-EF759 Created OS            03 (3) 'Unix'\n-EF75A Extract Zip Spec      0A (10) '1.0'\n-EF75B Extract OS            00 (0) 'MS-DOS'\n-EF75C General Purpose Flag  0800 (2048)\n+F03C5 CENTRAL HEADER #130   02014B50 (33639248)\n+F03C9 Created Zip Spec      14 (20) '2.0'\n+F03CA Created OS            03 (3) 'Unix'\n+F03CB Extract Zip Spec      0A (10) '1.0'\n+F03CC Extract OS            00 (0) 'MS-DOS'\n+F03CD General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-EF75E Compression Method    0000 (0) 'Stored'\n-EF760 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-EF764 CRC                   00000000 (0)\n-EF768 Compressed Size       00000000 (0)\n-EF76C Uncompressed Size     00000000 (0)\n-EF770 Filename Length       0068 (104)\n-EF772 Extra Length          0000 (0)\n-EF774 Comment Length        0000 (0)\n-EF776 Disk Start            0000 (0)\n-EF778 Int File Attributes   0000 (0)\n+F03CF Compression Method    0000 (0) 'Stored'\n+F03D1 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F03D5 CRC                   00000000 (0)\n+F03D9 Compressed Size       00000000 (0)\n+F03DD Uncompressed Size     00000000 (0)\n+F03E1 Filename Length       0068 (104)\n+F03E3 Extra Length          0000 (0)\n+F03E5 Comment Length        0000 (0)\n+F03E7 Disk Start            0000 (0)\n+F03E9 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-EF77A Ext File Attributes   41ED0010 (1106051088)\n+F03EB Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-EF77E Local Header Offset   000035F8 (13816)\n-EF782 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F03EF Local Header Offset   000035F8 (13816)\n+F03F3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xEF782: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF03F3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xEF782: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF03F3: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xEF75A: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF03CB: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-EF7EA CENTRAL HEADER #131   02014B50 (33639248)\n-EF7EE Created Zip Spec      14 (20) '2.0'\n-EF7EF Created OS            03 (3) 'Unix'\n-EF7F0 Extract Zip Spec      0A (10) '1.0'\n-EF7F1 Extract OS            00 (0) 'MS-DOS'\n-EF7F2 General Purpose Flag  0800 (2048)\n+F045B CENTRAL HEADER #131   02014B50 (33639248)\n+F045F Created Zip Spec      14 (20) '2.0'\n+F0460 Created OS            03 (3) 'Unix'\n+F0461 Extract Zip Spec      0A (10) '1.0'\n+F0462 Extract OS            00 (0) 'MS-DOS'\n+F0463 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-EF7F4 Compression Method    0000 (0) 'Stored'\n-EF7F6 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-EF7FA CRC                   00000000 (0)\n-EF7FE Compressed Size       00000000 (0)\n-EF802 Uncompressed Size     00000000 (0)\n-EF806 Filename Length       006E (110)\n-EF808 Extra Length          0000 (0)\n-EF80A Comment Length        0000 (0)\n-EF80C Disk Start            0000 (0)\n-EF80E Int File Attributes   0000 (0)\n+F0465 Compression Method    0000 (0) 'Stored'\n+F0467 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F046B CRC                   00000000 (0)\n+F046F Compressed Size       00000000 (0)\n+F0473 Uncompressed Size     00000000 (0)\n+F0477 Filename Length       006E (110)\n+F0479 Extra Length          0000 (0)\n+F047B Comment Length        0000 (0)\n+F047D Disk Start            0000 (0)\n+F047F Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-EF810 Ext File Attributes   41ED0010 (1106051088)\n+F0481 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-EF814 Local Header Offset   0000367E (13950)\n-EF818 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F0485 Local Header Offset   0000367E (13950)\n+F0489 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xEF818: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF0489: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xEF818: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF0489: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xEF7F0: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF0461: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-EF886 CENTRAL HEADER #132   02014B50 (33639248)\n-EF88A Created Zip Spec      14 (20) '2.0'\n-EF88B Created OS            03 (3) 'Unix'\n-EF88C Extract Zip Spec      0A (10) '1.0'\n-EF88D Extract OS            00 (0) 'MS-DOS'\n-EF88E General Purpose Flag  0800 (2048)\n+F04F7 CENTRAL HEADER #132   02014B50 (33639248)\n+F04FB Created Zip Spec      14 (20) '2.0'\n+F04FC Created OS            03 (3) 'Unix'\n+F04FD Extract Zip Spec      0A (10) '1.0'\n+F04FE Extract OS            00 (0) 'MS-DOS'\n+F04FF General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-EF890 Compression Method    0000 (0) 'Stored'\n-EF892 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-EF896 CRC                   00000000 (0)\n-EF89A Compressed Size       00000000 (0)\n-EF89E Uncompressed Size     00000000 (0)\n-EF8A2 Filename Length       0068 (104)\n-EF8A4 Extra Length          0000 (0)\n-EF8A6 Comment Length        0000 (0)\n-EF8A8 Disk Start            0000 (0)\n-EF8AA Int File Attributes   0000 (0)\n+F0501 Compression Method    0000 (0) 'Stored'\n+F0503 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F0507 CRC                   00000000 (0)\n+F050B Compressed Size       00000000 (0)\n+F050F Uncompressed Size     00000000 (0)\n+F0513 Filename Length       0068 (104)\n+F0515 Extra Length          0000 (0)\n+F0517 Comment Length        0000 (0)\n+F0519 Disk Start            0000 (0)\n+F051B Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-EF8AC Ext File Attributes   41ED0010 (1106051088)\n+F051D Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-EF8B0 Local Header Offset   0000370A (14090)\n-EF8B4 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F0521 Local Header Offset   0000370A (14090)\n+F0525 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xEF8B4: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF0525: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xEF8B4: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF0525: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xEF88C: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF04FD: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-EF91C CENTRAL HEADER #133   02014B50 (33639248)\n-EF920 Created Zip Spec      14 (20) '2.0'\n-EF921 Created OS            03 (3) 'Unix'\n-EF922 Extract Zip Spec      0A (10) '1.0'\n-EF923 Extract OS            00 (0) 'MS-DOS'\n-EF924 General Purpose Flag  0800 (2048)\n+F058D CENTRAL HEADER #133   02014B50 (33639248)\n+F0591 Created Zip Spec      14 (20) '2.0'\n+F0592 Created OS            03 (3) 'Unix'\n+F0593 Extract Zip Spec      0A (10) '1.0'\n+F0594 Extract OS            00 (0) 'MS-DOS'\n+F0595 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-EF926 Compression Method    0000 (0) 'Stored'\n-EF928 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-EF92C CRC                   00000000 (0)\n-EF930 Compressed Size       00000000 (0)\n-EF934 Uncompressed Size     00000000 (0)\n-EF938 Filename Length       0028 (40)\n-EF93A Extra Length          0000 (0)\n-EF93C Comment Length        0000 (0)\n-EF93E Disk Start            0000 (0)\n-EF940 Int File Attributes   0000 (0)\n+F0597 Compression Method    0000 (0) 'Stored'\n+F0599 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F059D CRC                   00000000 (0)\n+F05A1 Compressed Size       00000000 (0)\n+F05A5 Uncompressed Size     00000000 (0)\n+F05A9 Filename Length       0028 (40)\n+F05AB Extra Length          0000 (0)\n+F05AD Comment Length        0000 (0)\n+F05AF Disk Start            0000 (0)\n+F05B1 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-EF942 Ext File Attributes   41ED0010 (1106051088)\n+F05B3 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-EF946 Local Header Offset   00003790 (14224)\n-EF94A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F05B7 Local Header Offset   00003790 (14224)\n+F05BB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xEF94A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF05BB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xEF94A: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF05BB: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xEF922: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF0593: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-EF972 CENTRAL HEADER #134   02014B50 (33639248)\n-EF976 Created Zip Spec      14 (20) '2.0'\n-EF977 Created OS            03 (3) 'Unix'\n-EF978 Extract Zip Spec      0A (10) '1.0'\n-EF979 Extract OS            00 (0) 'MS-DOS'\n-EF97A General Purpose Flag  0800 (2048)\n+F05E3 CENTRAL HEADER #134   02014B50 (33639248)\n+F05E7 Created Zip Spec      14 (20) '2.0'\n+F05E8 Created OS            03 (3) 'Unix'\n+F05E9 Extract Zip Spec      0A (10) '1.0'\n+F05EA Extract OS            00 (0) 'MS-DOS'\n+F05EB General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-EF97C Compression Method    0000 (0) 'Stored'\n-EF97E Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-EF982 CRC                   00000000 (0)\n-EF986 Compressed Size       00000000 (0)\n-EF98A Uncompressed Size     00000000 (0)\n-EF98E Filename Length       002F (47)\n-EF990 Extra Length          0000 (0)\n-EF992 Comment Length        0000 (0)\n-EF994 Disk Start            0000 (0)\n-EF996 Int File Attributes   0000 (0)\n+F05ED Compression Method    0000 (0) 'Stored'\n+F05EF Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F05F3 CRC                   00000000 (0)\n+F05F7 Compressed Size       00000000 (0)\n+F05FB Uncompressed Size     00000000 (0)\n+F05FF Filename Length       002F (47)\n+F0601 Extra Length          0000 (0)\n+F0603 Comment Length        0000 (0)\n+F0605 Disk Start            0000 (0)\n+F0607 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-EF998 Ext File Attributes   41ED0010 (1106051088)\n+F0609 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-EF99C Local Header Offset   000037D6 (14294)\n-EF9A0 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F060D Local Header Offset   000037D6 (14294)\n+F0611 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xEF9A0: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF0611: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xEF9A0: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF0611: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xEF978: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF05E9: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-EF9CF CENTRAL HEADER #135   02014B50 (33639248)\n-EF9D3 Created Zip Spec      14 (20) '2.0'\n-EF9D4 Created OS            03 (3) 'Unix'\n-EF9D5 Extract Zip Spec      0A (10) '1.0'\n-EF9D6 Extract OS            00 (0) 'MS-DOS'\n-EF9D7 General Purpose Flag  0800 (2048)\n+F0640 CENTRAL HEADER #135   02014B50 (33639248)\n+F0644 Created Zip Spec      14 (20) '2.0'\n+F0645 Created OS            03 (3) 'Unix'\n+F0646 Extract Zip Spec      0A (10) '1.0'\n+F0647 Extract OS            00 (0) 'MS-DOS'\n+F0648 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-EF9D9 Compression Method    0000 (0) 'Stored'\n-EF9DB Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-EF9DF CRC                   00000000 (0)\n-EF9E3 Compressed Size       00000000 (0)\n-EF9E7 Uncompressed Size     00000000 (0)\n-EF9EB Filename Length       006E (110)\n-EF9ED Extra Length          0000 (0)\n-EF9EF Comment Length        0000 (0)\n-EF9F1 Disk Start            0000 (0)\n-EF9F3 Int File Attributes   0000 (0)\n+F064A Compression Method    0000 (0) 'Stored'\n+F064C Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F0650 CRC                   00000000 (0)\n+F0654 Compressed Size       00000000 (0)\n+F0658 Uncompressed Size     00000000 (0)\n+F065C Filename Length       006E (110)\n+F065E Extra Length          0000 (0)\n+F0660 Comment Length        0000 (0)\n+F0662 Disk Start            0000 (0)\n+F0664 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-EF9F5 Ext File Attributes   41ED0010 (1106051088)\n+F0666 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-EF9F9 Local Header Offset   00003823 (14371)\n-EF9FD Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F066A Local Header Offset   00003823 (14371)\n+F066E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xEF9FD: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF066E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xEF9FD: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF066E: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xEF9D5: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF0646: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-EFA6B CENTRAL HEADER #136   02014B50 (33639248)\n-EFA6F Created Zip Spec      14 (20) '2.0'\n-EFA70 Created OS            03 (3) 'Unix'\n-EFA71 Extract Zip Spec      0A (10) '1.0'\n-EFA72 Extract OS            00 (0) 'MS-DOS'\n-EFA73 General Purpose Flag  0800 (2048)\n+F06DC CENTRAL HEADER #136   02014B50 (33639248)\n+F06E0 Created Zip Spec      14 (20) '2.0'\n+F06E1 Created OS            03 (3) 'Unix'\n+F06E2 Extract Zip Spec      0A (10) '1.0'\n+F06E3 Extract OS            00 (0) 'MS-DOS'\n+F06E4 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-EFA75 Compression Method    0000 (0) 'Stored'\n-EFA77 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-EFA7B CRC                   00000000 (0)\n-EFA7F Compressed Size       00000000 (0)\n-EFA83 Uncompressed Size     00000000 (0)\n-EFA87 Filename Length       0068 (104)\n-EFA89 Extra Length          0000 (0)\n-EFA8B Comment Length        0000 (0)\n-EFA8D Disk Start            0000 (0)\n-EFA8F Int File Attributes   0000 (0)\n+F06E6 Compression Method    0000 (0) 'Stored'\n+F06E8 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F06EC CRC                   00000000 (0)\n+F06F0 Compressed Size       00000000 (0)\n+F06F4 Uncompressed Size     00000000 (0)\n+F06F8 Filename Length       0068 (104)\n+F06FA Extra Length          0000 (0)\n+F06FC Comment Length        0000 (0)\n+F06FE Disk Start            0000 (0)\n+F0700 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-EFA91 Ext File Attributes   41ED0010 (1106051088)\n+F0702 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-EFA95 Local Header Offset   000038AF (14511)\n-EFA99 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F0706 Local Header Offset   000038AF (14511)\n+F070A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xEFA99: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF070A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xEFA99: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF070A: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xEFA71: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF06E2: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-EFB01 CENTRAL HEADER #137   02014B50 (33639248)\n-EFB05 Created Zip Spec      14 (20) '2.0'\n-EFB06 Created OS            03 (3) 'Unix'\n-EFB07 Extract Zip Spec      0A (10) '1.0'\n-EFB08 Extract OS            00 (0) 'MS-DOS'\n-EFB09 General Purpose Flag  0800 (2048)\n+F0772 CENTRAL HEADER #137   02014B50 (33639248)\n+F0776 Created Zip Spec      14 (20) '2.0'\n+F0777 Created OS            03 (3) 'Unix'\n+F0778 Extract Zip Spec      0A (10) '1.0'\n+F0779 Extract OS            00 (0) 'MS-DOS'\n+F077A General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-EFB0B Compression Method    0000 (0) 'Stored'\n-EFB0D Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-EFB11 CRC                   00000000 (0)\n-EFB15 Compressed Size       00000000 (0)\n-EFB19 Uncompressed Size     00000000 (0)\n-EFB1D Filename Length       006E (110)\n-EFB1F Extra Length          0000 (0)\n-EFB21 Comment Length        0000 (0)\n-EFB23 Disk Start            0000 (0)\n-EFB25 Int File Attributes   0000 (0)\n+F077C Compression Method    0000 (0) 'Stored'\n+F077E Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F0782 CRC                   00000000 (0)\n+F0786 Compressed Size       00000000 (0)\n+F078A Uncompressed Size     00000000 (0)\n+F078E Filename Length       006E (110)\n+F0790 Extra Length          0000 (0)\n+F0792 Comment Length        0000 (0)\n+F0794 Disk Start            0000 (0)\n+F0796 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-EFB27 Ext File Attributes   41ED0010 (1106051088)\n+F0798 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-EFB2B Local Header Offset   00003935 (14645)\n-EFB2F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F079C Local Header Offset   00003935 (14645)\n+F07A0 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xEFB2F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF07A0: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xEFB2F: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF07A0: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xEFB07: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF0778: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-EFB9D CENTRAL HEADER #138   02014B50 (33639248)\n-EFBA1 Created Zip Spec      14 (20) '2.0'\n-EFBA2 Created OS            03 (3) 'Unix'\n-EFBA3 Extract Zip Spec      0A (10) '1.0'\n-EFBA4 Extract OS            00 (0) 'MS-DOS'\n-EFBA5 General Purpose Flag  0800 (2048)\n+F080E CENTRAL HEADER #138   02014B50 (33639248)\n+F0812 Created Zip Spec      14 (20) '2.0'\n+F0813 Created OS            03 (3) 'Unix'\n+F0814 Extract Zip Spec      0A (10) '1.0'\n+F0815 Extract OS            00 (0) 'MS-DOS'\n+F0816 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-EFBA7 Compression Method    0000 (0) 'Stored'\n-EFBA9 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-EFBAD CRC                   00000000 (0)\n-EFBB1 Compressed Size       00000000 (0)\n-EFBB5 Uncompressed Size     00000000 (0)\n-EFBB9 Filename Length       0068 (104)\n-EFBBB Extra Length          0000 (0)\n-EFBBD Comment Length        0000 (0)\n-EFBBF Disk Start            0000 (0)\n-EFBC1 Int File Attributes   0000 (0)\n+F0818 Compression Method    0000 (0) 'Stored'\n+F081A Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F081E CRC                   00000000 (0)\n+F0822 Compressed Size       00000000 (0)\n+F0826 Uncompressed Size     00000000 (0)\n+F082A Filename Length       0068 (104)\n+F082C Extra Length          0000 (0)\n+F082E Comment Length        0000 (0)\n+F0830 Disk Start            0000 (0)\n+F0832 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-EFBC3 Ext File Attributes   41ED0010 (1106051088)\n+F0834 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-EFBC7 Local Header Offset   000039C1 (14785)\n-EFBCB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F0838 Local Header Offset   000039C1 (14785)\n+F083C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xEFBCB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF083C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xEFBCB: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF083C: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xEFBA3: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF0814: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-EFC33 CENTRAL HEADER #139   02014B50 (33639248)\n-EFC37 Created Zip Spec      14 (20) '2.0'\n-EFC38 Created OS            03 (3) 'Unix'\n-EFC39 Extract Zip Spec      0A (10) '1.0'\n-EFC3A Extract OS            00 (0) 'MS-DOS'\n-EFC3B General Purpose Flag  0800 (2048)\n+F08A4 CENTRAL HEADER #139   02014B50 (33639248)\n+F08A8 Created Zip Spec      14 (20) '2.0'\n+F08A9 Created OS            03 (3) 'Unix'\n+F08AA Extract Zip Spec      0A (10) '1.0'\n+F08AB Extract OS            00 (0) 'MS-DOS'\n+F08AC General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-EFC3D Compression Method    0000 (0) 'Stored'\n-EFC3F Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-EFC43 CRC                   00000000 (0)\n-EFC47 Compressed Size       00000000 (0)\n-EFC4B Uncompressed Size     00000000 (0)\n-EFC4F Filename Length       0028 (40)\n-EFC51 Extra Length          0000 (0)\n-EFC53 Comment Length        0000 (0)\n-EFC55 Disk Start            0000 (0)\n-EFC57 Int File Attributes   0000 (0)\n+F08AE Compression Method    0000 (0) 'Stored'\n+F08B0 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F08B4 CRC                   00000000 (0)\n+F08B8 Compressed Size       00000000 (0)\n+F08BC Uncompressed Size     00000000 (0)\n+F08C0 Filename Length       0028 (40)\n+F08C2 Extra Length          0000 (0)\n+F08C4 Comment Length        0000 (0)\n+F08C6 Disk Start            0000 (0)\n+F08C8 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-EFC59 Ext File Attributes   41ED0010 (1106051088)\n+F08CA Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-EFC5D Local Header Offset   00003A47 (14919)\n-EFC61 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F08CE Local Header Offset   00003A47 (14919)\n+F08D2 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xEFC61: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF08D2: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xEFC61: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF08D2: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xEFC39: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF08AA: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-EFC89 CENTRAL HEADER #140   02014B50 (33639248)\n-EFC8D Created Zip Spec      14 (20) '2.0'\n-EFC8E Created OS            03 (3) 'Unix'\n-EFC8F Extract Zip Spec      0A (10) '1.0'\n-EFC90 Extract OS            00 (0) 'MS-DOS'\n-EFC91 General Purpose Flag  0800 (2048)\n+F08FA CENTRAL HEADER #140   02014B50 (33639248)\n+F08FE Created Zip Spec      14 (20) '2.0'\n+F08FF Created OS            03 (3) 'Unix'\n+F0900 Extract Zip Spec      0A (10) '1.0'\n+F0901 Extract OS            00 (0) 'MS-DOS'\n+F0902 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-EFC93 Compression Method    0000 (0) 'Stored'\n-EFC95 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-EFC99 CRC                   00000000 (0)\n-EFC9D Compressed Size       00000000 (0)\n-EFCA1 Uncompressed Size     00000000 (0)\n-EFCA5 Filename Length       002F (47)\n-EFCA7 Extra Length          0000 (0)\n-EFCA9 Comment Length        0000 (0)\n-EFCAB Disk Start            0000 (0)\n-EFCAD Int File Attributes   0000 (0)\n+F0904 Compression Method    0000 (0) 'Stored'\n+F0906 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F090A CRC                   00000000 (0)\n+F090E Compressed Size       00000000 (0)\n+F0912 Uncompressed Size     00000000 (0)\n+F0916 Filename Length       002F (47)\n+F0918 Extra Length          0000 (0)\n+F091A Comment Length        0000 (0)\n+F091C Disk Start            0000 (0)\n+F091E Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-EFCAF Ext File Attributes   41ED0010 (1106051088)\n+F0920 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-EFCB3 Local Header Offset   00003A8D (14989)\n-EFCB7 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F0924 Local Header Offset   00003A8D (14989)\n+F0928 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xEFCB7: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF0928: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xEFCB7: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF0928: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xEFC8F: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF0900: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-EFCE6 CENTRAL HEADER #141   02014B50 (33639248)\n-EFCEA Created Zip Spec      14 (20) '2.0'\n-EFCEB Created OS            03 (3) 'Unix'\n-EFCEC Extract Zip Spec      0A (10) '1.0'\n-EFCED Extract OS            00 (0) 'MS-DOS'\n-EFCEE General Purpose Flag  0800 (2048)\n+F0957 CENTRAL HEADER #141   02014B50 (33639248)\n+F095B Created Zip Spec      14 (20) '2.0'\n+F095C Created OS            03 (3) 'Unix'\n+F095D Extract Zip Spec      0A (10) '1.0'\n+F095E Extract OS            00 (0) 'MS-DOS'\n+F095F General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-EFCF0 Compression Method    0000 (0) 'Stored'\n-EFCF2 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-EFCF6 CRC                   00000000 (0)\n-EFCFA Compressed Size       00000000 (0)\n-EFCFE Uncompressed Size     00000000 (0)\n-EFD02 Filename Length       006E (110)\n-EFD04 Extra Length          0000 (0)\n-EFD06 Comment Length        0000 (0)\n-EFD08 Disk Start            0000 (0)\n-EFD0A Int File Attributes   0000 (0)\n+F0961 Compression Method    0000 (0) 'Stored'\n+F0963 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F0967 CRC                   00000000 (0)\n+F096B Compressed Size       00000000 (0)\n+F096F Uncompressed Size     00000000 (0)\n+F0973 Filename Length       006E (110)\n+F0975 Extra Length          0000 (0)\n+F0977 Comment Length        0000 (0)\n+F0979 Disk Start            0000 (0)\n+F097B Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-EFD0C Ext File Attributes   41ED0010 (1106051088)\n+F097D Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-EFD10 Local Header Offset   00003ADA (15066)\n-EFD14 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F0981 Local Header Offset   00003ADA (15066)\n+F0985 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xEFD14: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF0985: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xEFD14: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF0985: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xEFCEC: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF095D: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-EFD82 CENTRAL HEADER #142   02014B50 (33639248)\n-EFD86 Created Zip Spec      14 (20) '2.0'\n-EFD87 Created OS            03 (3) 'Unix'\n-EFD88 Extract Zip Spec      0A (10) '1.0'\n-EFD89 Extract OS            00 (0) 'MS-DOS'\n-EFD8A General Purpose Flag  0800 (2048)\n+F09F3 CENTRAL HEADER #142   02014B50 (33639248)\n+F09F7 Created Zip Spec      14 (20) '2.0'\n+F09F8 Created OS            03 (3) 'Unix'\n+F09F9 Extract Zip Spec      0A (10) '1.0'\n+F09FA Extract OS            00 (0) 'MS-DOS'\n+F09FB General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-EFD8C Compression Method    0000 (0) 'Stored'\n-EFD8E Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-EFD92 CRC                   00000000 (0)\n-EFD96 Compressed Size       00000000 (0)\n-EFD9A Uncompressed Size     00000000 (0)\n-EFD9E Filename Length       0068 (104)\n-EFDA0 Extra Length          0000 (0)\n-EFDA2 Comment Length        0000 (0)\n-EFDA4 Disk Start            0000 (0)\n-EFDA6 Int File Attributes   0000 (0)\n+F09FD Compression Method    0000 (0) 'Stored'\n+F09FF Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F0A03 CRC                   00000000 (0)\n+F0A07 Compressed Size       00000000 (0)\n+F0A0B Uncompressed Size     00000000 (0)\n+F0A0F Filename Length       0068 (104)\n+F0A11 Extra Length          0000 (0)\n+F0A13 Comment Length        0000 (0)\n+F0A15 Disk Start            0000 (0)\n+F0A17 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-EFDA8 Ext File Attributes   41ED0010 (1106051088)\n+F0A19 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-EFDAC Local Header Offset   00003B66 (15206)\n-EFDB0 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F0A1D Local Header Offset   00003B66 (15206)\n+F0A21 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xEFDB0: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF0A21: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xEFDB0: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF0A21: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xEFD88: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF09F9: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-EFE18 CENTRAL HEADER #143   02014B50 (33639248)\n-EFE1C Created Zip Spec      14 (20) '2.0'\n-EFE1D Created OS            03 (3) 'Unix'\n-EFE1E Extract Zip Spec      0A (10) '1.0'\n-EFE1F Extract OS            00 (0) 'MS-DOS'\n-EFE20 General Purpose Flag  0800 (2048)\n+F0A89 CENTRAL HEADER #143   02014B50 (33639248)\n+F0A8D Created Zip Spec      14 (20) '2.0'\n+F0A8E Created OS            03 (3) 'Unix'\n+F0A8F Extract Zip Spec      0A (10) '1.0'\n+F0A90 Extract OS            00 (0) 'MS-DOS'\n+F0A91 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-EFE22 Compression Method    0000 (0) 'Stored'\n-EFE24 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-EFE28 CRC                   00000000 (0)\n-EFE2C Compressed Size       00000000 (0)\n-EFE30 Uncompressed Size     00000000 (0)\n-EFE34 Filename Length       006E (110)\n-EFE36 Extra Length          0000 (0)\n-EFE38 Comment Length        0000 (0)\n-EFE3A Disk Start            0000 (0)\n-EFE3C Int File Attributes   0000 (0)\n+F0A93 Compression Method    0000 (0) 'Stored'\n+F0A95 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F0A99 CRC                   00000000 (0)\n+F0A9D Compressed Size       00000000 (0)\n+F0AA1 Uncompressed Size     00000000 (0)\n+F0AA5 Filename Length       006E (110)\n+F0AA7 Extra Length          0000 (0)\n+F0AA9 Comment Length        0000 (0)\n+F0AAB Disk Start            0000 (0)\n+F0AAD Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-EFE3E Ext File Attributes   41ED0010 (1106051088)\n+F0AAF Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-EFE42 Local Header Offset   00003BEC (15340)\n-EFE46 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F0AB3 Local Header Offset   00003BEC (15340)\n+F0AB7 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xEFE46: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF0AB7: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xEFE46: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF0AB7: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xEFE1E: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF0A8F: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-EFEB4 CENTRAL HEADER #144   02014B50 (33639248)\n-EFEB8 Created Zip Spec      14 (20) '2.0'\n-EFEB9 Created OS            03 (3) 'Unix'\n-EFEBA Extract Zip Spec      0A (10) '1.0'\n-EFEBB Extract OS            00 (0) 'MS-DOS'\n-EFEBC General Purpose Flag  0800 (2048)\n+F0B25 CENTRAL HEADER #144   02014B50 (33639248)\n+F0B29 Created Zip Spec      14 (20) '2.0'\n+F0B2A Created OS            03 (3) 'Unix'\n+F0B2B Extract Zip Spec      0A (10) '1.0'\n+F0B2C Extract OS            00 (0) 'MS-DOS'\n+F0B2D General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-EFEBE Compression Method    0000 (0) 'Stored'\n-EFEC0 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-EFEC4 CRC                   00000000 (0)\n-EFEC8 Compressed Size       00000000 (0)\n-EFECC Uncompressed Size     00000000 (0)\n-EFED0 Filename Length       0068 (104)\n-EFED2 Extra Length          0000 (0)\n-EFED4 Comment Length        0000 (0)\n-EFED6 Disk Start            0000 (0)\n-EFED8 Int File Attributes   0000 (0)\n+F0B2F Compression Method    0000 (0) 'Stored'\n+F0B31 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F0B35 CRC                   00000000 (0)\n+F0B39 Compressed Size       00000000 (0)\n+F0B3D Uncompressed Size     00000000 (0)\n+F0B41 Filename Length       0068 (104)\n+F0B43 Extra Length          0000 (0)\n+F0B45 Comment Length        0000 (0)\n+F0B47 Disk Start            0000 (0)\n+F0B49 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-EFEDA Ext File Attributes   41ED0010 (1106051088)\n+F0B4B Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-EFEDE Local Header Offset   00003C78 (15480)\n-EFEE2 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F0B4F Local Header Offset   00003C78 (15480)\n+F0B53 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xEFEE2: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF0B53: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xEFEE2: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF0B53: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xEFEBA: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF0B2B: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-EFF4A CENTRAL HEADER #145   02014B50 (33639248)\n-EFF4E Created Zip Spec      14 (20) '2.0'\n-EFF4F Created OS            03 (3) 'Unix'\n-EFF50 Extract Zip Spec      0A (10) '1.0'\n-EFF51 Extract OS            00 (0) 'MS-DOS'\n-EFF52 General Purpose Flag  0800 (2048)\n+F0BBB CENTRAL HEADER #145   02014B50 (33639248)\n+F0BBF Created Zip Spec      14 (20) '2.0'\n+F0BC0 Created OS            03 (3) 'Unix'\n+F0BC1 Extract Zip Spec      0A (10) '1.0'\n+F0BC2 Extract OS            00 (0) 'MS-DOS'\n+F0BC3 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-EFF54 Compression Method    0000 (0) 'Stored'\n-EFF56 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-EFF5A CRC                   00000000 (0)\n-EFF5E Compressed Size       00000000 (0)\n-EFF62 Uncompressed Size     00000000 (0)\n-EFF66 Filename Length       0023 (35)\n-EFF68 Extra Length          0000 (0)\n-EFF6A Comment Length        0000 (0)\n-EFF6C Disk Start            0000 (0)\n-EFF6E Int File Attributes   0000 (0)\n+F0BC5 Compression Method    0000 (0) 'Stored'\n+F0BC7 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F0BCB CRC                   00000000 (0)\n+F0BCF Compressed Size       00000000 (0)\n+F0BD3 Uncompressed Size     00000000 (0)\n+F0BD7 Filename Length       0023 (35)\n+F0BD9 Extra Length          0000 (0)\n+F0BDB Comment Length        0000 (0)\n+F0BDD Disk Start            0000 (0)\n+F0BDF Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-EFF70 Ext File Attributes   41ED0010 (1106051088)\n+F0BE1 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-EFF74 Local Header Offset   00003CFE (15614)\n-EFF78 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F0BE5 Local Header Offset   00003CFE (15614)\n+F0BE9 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xEFF78: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF0BE9: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xEFF78: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF0BE9: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xEFF50: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF0BC1: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-EFF9B CENTRAL HEADER #146   02014B50 (33639248)\n-EFF9F Created Zip Spec      14 (20) '2.0'\n-EFFA0 Created OS            03 (3) 'Unix'\n-EFFA1 Extract Zip Spec      0A (10) '1.0'\n-EFFA2 Extract OS            00 (0) 'MS-DOS'\n-EFFA3 General Purpose Flag  0800 (2048)\n+F0C0C CENTRAL HEADER #146   02014B50 (33639248)\n+F0C10 Created Zip Spec      14 (20) '2.0'\n+F0C11 Created OS            03 (3) 'Unix'\n+F0C12 Extract Zip Spec      0A (10) '1.0'\n+F0C13 Extract OS            00 (0) 'MS-DOS'\n+F0C14 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-EFFA5 Compression Method    0000 (0) 'Stored'\n-EFFA7 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-EFFAB CRC                   00000000 (0)\n-EFFAF Compressed Size       00000000 (0)\n-EFFB3 Uncompressed Size     00000000 (0)\n-EFFB7 Filename Length       002A (42)\n-EFFB9 Extra Length          0000 (0)\n-EFFBB Comment Length        0000 (0)\n-EFFBD Disk Start            0000 (0)\n-EFFBF Int File Attributes   0000 (0)\n+F0C16 Compression Method    0000 (0) 'Stored'\n+F0C18 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F0C1C CRC                   00000000 (0)\n+F0C20 Compressed Size       00000000 (0)\n+F0C24 Uncompressed Size     00000000 (0)\n+F0C28 Filename Length       002A (42)\n+F0C2A Extra Length          0000 (0)\n+F0C2C Comment Length        0000 (0)\n+F0C2E Disk Start            0000 (0)\n+F0C30 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-EFFC1 Ext File Attributes   41ED0010 (1106051088)\n+F0C32 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-EFFC5 Local Header Offset   00003D3F (15679)\n-EFFC9 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F0C36 Local Header Offset   00003D3F (15679)\n+F0C3A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xEFFC9: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF0C3A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xEFFC9: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF0C3A: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xEFFA1: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF0C12: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-EFFF3 CENTRAL HEADER #147   02014B50 (33639248)\n-EFFF7 Created Zip Spec      14 (20) '2.0'\n-EFFF8 Created OS            03 (3) 'Unix'\n-EFFF9 Extract Zip Spec      0A (10) '1.0'\n-EFFFA Extract OS            00 (0) 'MS-DOS'\n-EFFFB General Purpose Flag  0800 (2048)\n+F0C64 CENTRAL HEADER #147   02014B50 (33639248)\n+F0C68 Created Zip Spec      14 (20) '2.0'\n+F0C69 Created OS            03 (3) 'Unix'\n+F0C6A Extract Zip Spec      0A (10) '1.0'\n+F0C6B Extract OS            00 (0) 'MS-DOS'\n+F0C6C General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-EFFFD Compression Method    0000 (0) 'Stored'\n-EFFFF Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F0003 CRC                   00000000 (0)\n-F0007 Compressed Size       00000000 (0)\n-F000B Uncompressed Size     00000000 (0)\n-F000F Filename Length       0052 (82)\n-F0011 Extra Length          0000 (0)\n-F0013 Comment Length        0000 (0)\n-F0015 Disk Start            0000 (0)\n-F0017 Int File Attributes   0000 (0)\n+F0C6E Compression Method    0000 (0) 'Stored'\n+F0C70 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F0C74 CRC                   00000000 (0)\n+F0C78 Compressed Size       00000000 (0)\n+F0C7C Uncompressed Size     00000000 (0)\n+F0C80 Filename Length       0052 (82)\n+F0C82 Extra Length          0000 (0)\n+F0C84 Comment Length        0000 (0)\n+F0C86 Disk Start            0000 (0)\n+F0C88 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F0019 Ext File Attributes   41ED0010 (1106051088)\n+F0C8A Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F001D Local Header Offset   00003D87 (15751)\n-F0021 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F0C8E Local Header Offset   00003D87 (15751)\n+F0C92 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF0021: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF0C92: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF0021: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF0C92: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xEFFF9: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF0C6A: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F0073 CENTRAL HEADER #148   02014B50 (33639248)\n-F0077 Created Zip Spec      14 (20) '2.0'\n-F0078 Created OS            03 (3) 'Unix'\n-F0079 Extract Zip Spec      0A (10) '1.0'\n-F007A Extract OS            00 (0) 'MS-DOS'\n-F007B General Purpose Flag  0800 (2048)\n+F0CE4 CENTRAL HEADER #148   02014B50 (33639248)\n+F0CE8 Created Zip Spec      14 (20) '2.0'\n+F0CE9 Created OS            03 (3) 'Unix'\n+F0CEA Extract Zip Spec      0A (10) '1.0'\n+F0CEB Extract OS            00 (0) 'MS-DOS'\n+F0CEC General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F007D Compression Method    0000 (0) 'Stored'\n-F007F Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F0083 CRC                   00000000 (0)\n-F0087 Compressed Size       00000000 (0)\n-F008B Uncompressed Size     00000000 (0)\n-F008F Filename Length       002E (46)\n-F0091 Extra Length          0000 (0)\n-F0093 Comment Length        0000 (0)\n-F0095 Disk Start            0000 (0)\n-F0097 Int File Attributes   0000 (0)\n+F0CEE Compression Method    0000 (0) 'Stored'\n+F0CF0 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F0CF4 CRC                   00000000 (0)\n+F0CF8 Compressed Size       00000000 (0)\n+F0CFC Uncompressed Size     00000000 (0)\n+F0D00 Filename Length       002E (46)\n+F0D02 Extra Length          0000 (0)\n+F0D04 Comment Length        0000 (0)\n+F0D06 Disk Start            0000 (0)\n+F0D08 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F0099 Ext File Attributes   41ED0010 (1106051088)\n+F0D0A Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F009D Local Header Offset   00003DF7 (15863)\n-F00A1 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F0D0E Local Header Offset   00003DF7 (15863)\n+F0D12 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF00A1: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF0D12: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF00A1: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF0D12: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF0079: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF0CEA: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F00CF CENTRAL HEADER #149   02014B50 (33639248)\n-F00D3 Created Zip Spec      14 (20) '2.0'\n-F00D4 Created OS            03 (3) 'Unix'\n-F00D5 Extract Zip Spec      0A (10) '1.0'\n-F00D6 Extract OS            00 (0) 'MS-DOS'\n-F00D7 General Purpose Flag  0800 (2048)\n+F0D40 CENTRAL HEADER #149   02014B50 (33639248)\n+F0D44 Created Zip Spec      14 (20) '2.0'\n+F0D45 Created OS            03 (3) 'Unix'\n+F0D46 Extract Zip Spec      0A (10) '1.0'\n+F0D47 Extract OS            00 (0) 'MS-DOS'\n+F0D48 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F00D9 Compression Method    0000 (0) 'Stored'\n-F00DB Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F00DF CRC                   00000000 (0)\n-F00E3 Compressed Size       00000000 (0)\n-F00E7 Uncompressed Size     00000000 (0)\n-F00EB Filename Length       0035 (53)\n-F00ED Extra Length          0000 (0)\n-F00EF Comment Length        0000 (0)\n-F00F1 Disk Start            0000 (0)\n-F00F3 Int File Attributes   0000 (0)\n+F0D4A Compression Method    0000 (0) 'Stored'\n+F0D4C Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F0D50 CRC                   00000000 (0)\n+F0D54 Compressed Size       00000000 (0)\n+F0D58 Uncompressed Size     00000000 (0)\n+F0D5C Filename Length       0035 (53)\n+F0D5E Extra Length          0000 (0)\n+F0D60 Comment Length        0000 (0)\n+F0D62 Disk Start            0000 (0)\n+F0D64 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F00F5 Ext File Attributes   41ED0010 (1106051088)\n+F0D66 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F00F9 Local Header Offset   00003E43 (15939)\n-F00FD Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F0D6A Local Header Offset   00003E43 (15939)\n+F0D6E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF00FD: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF0D6E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF00FD: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF0D6E: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF00D5: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF0D46: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F0132 CENTRAL HEADER #150   02014B50 (33639248)\n-F0136 Created Zip Spec      14 (20) '2.0'\n-F0137 Created OS            03 (3) 'Unix'\n-F0138 Extract Zip Spec      0A (10) '1.0'\n-F0139 Extract OS            00 (0) 'MS-DOS'\n-F013A General Purpose Flag  0800 (2048)\n+F0DA3 CENTRAL HEADER #150   02014B50 (33639248)\n+F0DA7 Created Zip Spec      14 (20) '2.0'\n+F0DA8 Created OS            03 (3) 'Unix'\n+F0DA9 Extract Zip Spec      0A (10) '1.0'\n+F0DAA Extract OS            00 (0) 'MS-DOS'\n+F0DAB General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F013C Compression Method    0000 (0) 'Stored'\n-F013E Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F0142 CRC                   00000000 (0)\n-F0146 Compressed Size       00000000 (0)\n-F014A Uncompressed Size     00000000 (0)\n-F014E Filename Length       005E (94)\n-F0150 Extra Length          0000 (0)\n-F0152 Comment Length        0000 (0)\n-F0154 Disk Start            0000 (0)\n-F0156 Int File Attributes   0000 (0)\n+F0DAD Compression Method    0000 (0) 'Stored'\n+F0DAF Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F0DB3 CRC                   00000000 (0)\n+F0DB7 Compressed Size       00000000 (0)\n+F0DBB Uncompressed Size     00000000 (0)\n+F0DBF Filename Length       005E (94)\n+F0DC1 Extra Length          0000 (0)\n+F0DC3 Comment Length        0000 (0)\n+F0DC5 Disk Start            0000 (0)\n+F0DC7 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F0158 Ext File Attributes   41ED0010 (1106051088)\n+F0DC9 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F015C Local Header Offset   00003E96 (16022)\n-F0160 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F0DCD Local Header Offset   00003E96 (16022)\n+F0DD1 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF0160: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF0DD1: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF0160: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF0DD1: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF0138: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF0DA9: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F01BE CENTRAL HEADER #151   02014B50 (33639248)\n-F01C2 Created Zip Spec      14 (20) '2.0'\n-F01C3 Created OS            03 (3) 'Unix'\n-F01C4 Extract Zip Spec      0A (10) '1.0'\n-F01C5 Extract OS            00 (0) 'MS-DOS'\n-F01C6 General Purpose Flag  0800 (2048)\n+F0E2F CENTRAL HEADER #151   02014B50 (33639248)\n+F0E33 Created Zip Spec      14 (20) '2.0'\n+F0E34 Created OS            03 (3) 'Unix'\n+F0E35 Extract Zip Spec      0A (10) '1.0'\n+F0E36 Extract OS            00 (0) 'MS-DOS'\n+F0E37 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F01C8 Compression Method    0000 (0) 'Stored'\n-F01CA Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F01CE CRC                   00000000 (0)\n-F01D2 Compressed Size       00000000 (0)\n-F01D6 Uncompressed Size     00000000 (0)\n-F01DA Filename Length       0064 (100)\n-F01DC Extra Length          0000 (0)\n-F01DE Comment Length        0000 (0)\n-F01E0 Disk Start            0000 (0)\n-F01E2 Int File Attributes   0000 (0)\n+F0E39 Compression Method    0000 (0) 'Stored'\n+F0E3B Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F0E3F CRC                   00000000 (0)\n+F0E43 Compressed Size       00000000 (0)\n+F0E47 Uncompressed Size     00000000 (0)\n+F0E4B Filename Length       0064 (100)\n+F0E4D Extra Length          0000 (0)\n+F0E4F Comment Length        0000 (0)\n+F0E51 Disk Start            0000 (0)\n+F0E53 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F01E4 Ext File Attributes   41ED0010 (1106051088)\n+F0E55 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F01E8 Local Header Offset   00003F12 (16146)\n-F01EC Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F0E59 Local Header Offset   00003F12 (16146)\n+F0E5D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF01EC: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF0E5D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF01EC: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF0E5D: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF01C4: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF0E35: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F0250 CENTRAL HEADER #152   02014B50 (33639248)\n-F0254 Created Zip Spec      14 (20) '2.0'\n-F0255 Created OS            03 (3) 'Unix'\n-F0256 Extract Zip Spec      0A (10) '1.0'\n-F0257 Extract OS            00 (0) 'MS-DOS'\n-F0258 General Purpose Flag  0800 (2048)\n+F0EC1 CENTRAL HEADER #152   02014B50 (33639248)\n+F0EC5 Created Zip Spec      14 (20) '2.0'\n+F0EC6 Created OS            03 (3) 'Unix'\n+F0EC7 Extract Zip Spec      0A (10) '1.0'\n+F0EC8 Extract OS            00 (0) 'MS-DOS'\n+F0EC9 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F025A Compression Method    0000 (0) 'Stored'\n-F025C Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F0260 CRC                   00000000 (0)\n-F0264 Compressed Size       00000000 (0)\n-F0268 Uncompressed Size     00000000 (0)\n-F026C Filename Length       0026 (38)\n-F026E Extra Length          0000 (0)\n-F0270 Comment Length        0000 (0)\n-F0272 Disk Start            0000 (0)\n-F0274 Int File Attributes   0000 (0)\n+F0ECB Compression Method    0000 (0) 'Stored'\n+F0ECD Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F0ED1 CRC                   00000000 (0)\n+F0ED5 Compressed Size       00000000 (0)\n+F0ED9 Uncompressed Size     00000000 (0)\n+F0EDD Filename Length       0026 (38)\n+F0EDF Extra Length          0000 (0)\n+F0EE1 Comment Length        0000 (0)\n+F0EE3 Disk Start            0000 (0)\n+F0EE5 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F0276 Ext File Attributes   41ED0010 (1106051088)\n+F0EE7 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F027A Local Header Offset   00003F94 (16276)\n-F027E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F0EEB Local Header Offset   00003F94 (16276)\n+F0EEF Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF027E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF0EEF: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF027E: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF0EEF: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF0256: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF0EC7: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F02A4 CENTRAL HEADER #153   02014B50 (33639248)\n-F02A8 Created Zip Spec      14 (20) '2.0'\n-F02A9 Created OS            03 (3) 'Unix'\n-F02AA Extract Zip Spec      0A (10) '1.0'\n-F02AB Extract OS            00 (0) 'MS-DOS'\n-F02AC General Purpose Flag  0800 (2048)\n+F0F15 CENTRAL HEADER #153   02014B50 (33639248)\n+F0F19 Created Zip Spec      14 (20) '2.0'\n+F0F1A Created OS            03 (3) 'Unix'\n+F0F1B Extract Zip Spec      0A (10) '1.0'\n+F0F1C Extract OS            00 (0) 'MS-DOS'\n+F0F1D General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F02AE Compression Method    0000 (0) 'Stored'\n-F02B0 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F02B4 CRC                   00000000 (0)\n-F02B8 Compressed Size       00000000 (0)\n-F02BC Uncompressed Size     00000000 (0)\n-F02C0 Filename Length       002D (45)\n-F02C2 Extra Length          0000 (0)\n-F02C4 Comment Length        0000 (0)\n-F02C6 Disk Start            0000 (0)\n-F02C8 Int File Attributes   0000 (0)\n+F0F1F Compression Method    0000 (0) 'Stored'\n+F0F21 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F0F25 CRC                   00000000 (0)\n+F0F29 Compressed Size       00000000 (0)\n+F0F2D Uncompressed Size     00000000 (0)\n+F0F31 Filename Length       002D (45)\n+F0F33 Extra Length          0000 (0)\n+F0F35 Comment Length        0000 (0)\n+F0F37 Disk Start            0000 (0)\n+F0F39 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F02CA Ext File Attributes   41ED0010 (1106051088)\n+F0F3B Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F02CE Local Header Offset   00003FD8 (16344)\n-F02D2 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F0F3F Local Header Offset   00003FD8 (16344)\n+F0F43 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF02D2: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF0F43: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF02D2: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF0F43: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF02AA: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF0F1B: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F02FF CENTRAL HEADER #154   02014B50 (33639248)\n-F0303 Created Zip Spec      14 (20) '2.0'\n-F0304 Created OS            03 (3) 'Unix'\n-F0305 Extract Zip Spec      0A (10) '1.0'\n-F0306 Extract OS            00 (0) 'MS-DOS'\n-F0307 General Purpose Flag  0800 (2048)\n+F0F70 CENTRAL HEADER #154   02014B50 (33639248)\n+F0F74 Created Zip Spec      14 (20) '2.0'\n+F0F75 Created OS            03 (3) 'Unix'\n+F0F76 Extract Zip Spec      0A (10) '1.0'\n+F0F77 Extract OS            00 (0) 'MS-DOS'\n+F0F78 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F0309 Compression Method    0000 (0) 'Stored'\n-F030B Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F030F CRC                   00000000 (0)\n-F0313 Compressed Size       00000000 (0)\n-F0317 Uncompressed Size     00000000 (0)\n-F031B Filename Length       005C (92)\n-F031D Extra Length          0000 (0)\n-F031F Comment Length        0000 (0)\n-F0321 Disk Start            0000 (0)\n-F0323 Int File Attributes   0000 (0)\n+F0F7A Compression Method    0000 (0) 'Stored'\n+F0F7C Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F0F80 CRC                   00000000 (0)\n+F0F84 Compressed Size       00000000 (0)\n+F0F88 Uncompressed Size     00000000 (0)\n+F0F8C Filename Length       005C (92)\n+F0F8E Extra Length          0000 (0)\n+F0F90 Comment Length        0000 (0)\n+F0F92 Disk Start            0000 (0)\n+F0F94 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F0325 Ext File Attributes   41ED0010 (1106051088)\n+F0F96 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F0329 Local Header Offset   00004023 (16419)\n-F032D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F0F9A Local Header Offset   00004023 (16419)\n+F0F9E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF032D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF0F9E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF032D: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF0F9E: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF0305: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF0F76: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F0389 CENTRAL HEADER #155   02014B50 (33639248)\n-F038D Created Zip Spec      14 (20) '2.0'\n-F038E Created OS            03 (3) 'Unix'\n-F038F Extract Zip Spec      0A (10) '1.0'\n-F0390 Extract OS            00 (0) 'MS-DOS'\n-F0391 General Purpose Flag  0800 (2048)\n+F0FFA CENTRAL HEADER #155   02014B50 (33639248)\n+F0FFE Created Zip Spec      14 (20) '2.0'\n+F0FFF Created OS            03 (3) 'Unix'\n+F1000 Extract Zip Spec      0A (10) '1.0'\n+F1001 Extract OS            00 (0) 'MS-DOS'\n+F1002 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F0393 Compression Method    0000 (0) 'Stored'\n-F0395 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F0399 CRC                   00000000 (0)\n-F039D Compressed Size       00000000 (0)\n-F03A1 Uncompressed Size     00000000 (0)\n-F03A5 Filename Length       0059 (89)\n-F03A7 Extra Length          0000 (0)\n-F03A9 Comment Length        0000 (0)\n-F03AB Disk Start            0000 (0)\n-F03AD Int File Attributes   0000 (0)\n+F1004 Compression Method    0000 (0) 'Stored'\n+F1006 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F100A CRC                   00000000 (0)\n+F100E Compressed Size       00000000 (0)\n+F1012 Uncompressed Size     00000000 (0)\n+F1016 Filename Length       0059 (89)\n+F1018 Extra Length          0000 (0)\n+F101A Comment Length        0000 (0)\n+F101C Disk Start            0000 (0)\n+F101E Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F03AF Ext File Attributes   41ED0010 (1106051088)\n+F1020 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F03B3 Local Header Offset   0000409D (16541)\n-F03B7 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F1024 Local Header Offset   0000409D (16541)\n+F1028 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF03B7: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF1028: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF03B7: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF1028: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF038F: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF1000: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F0410 CENTRAL HEADER #156   02014B50 (33639248)\n-F0414 Created Zip Spec      14 (20) '2.0'\n-F0415 Created OS            03 (3) 'Unix'\n-F0416 Extract Zip Spec      0A (10) '1.0'\n-F0417 Extract OS            00 (0) 'MS-DOS'\n-F0418 General Purpose Flag  0800 (2048)\n+F1081 CENTRAL HEADER #156   02014B50 (33639248)\n+F1085 Created Zip Spec      14 (20) '2.0'\n+F1086 Created OS            03 (3) 'Unix'\n+F1087 Extract Zip Spec      0A (10) '1.0'\n+F1088 Extract OS            00 (0) 'MS-DOS'\n+F1089 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F041A Compression Method    0000 (0) 'Stored'\n-F041C Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F0420 CRC                   00000000 (0)\n-F0424 Compressed Size       00000000 (0)\n-F0428 Uncompressed Size     00000000 (0)\n-F042C Filename Length       005F (95)\n-F042E Extra Length          0000 (0)\n-F0430 Comment Length        0000 (0)\n-F0432 Disk Start            0000 (0)\n-F0434 Int File Attributes   0000 (0)\n+F108B Compression Method    0000 (0) 'Stored'\n+F108D Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F1091 CRC                   00000000 (0)\n+F1095 Compressed Size       00000000 (0)\n+F1099 Uncompressed Size     00000000 (0)\n+F109D Filename Length       005F (95)\n+F109F Extra Length          0000 (0)\n+F10A1 Comment Length        0000 (0)\n+F10A3 Disk Start            0000 (0)\n+F10A5 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F0436 Ext File Attributes   41ED0010 (1106051088)\n+F10A7 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F043A Local Header Offset   00004114 (16660)\n-F043E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F10AB Local Header Offset   00004114 (16660)\n+F10AF Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF043E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF10AF: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF043E: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF10AF: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF0416: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF1087: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F049D CENTRAL HEADER #157   02014B50 (33639248)\n-F04A1 Created Zip Spec      14 (20) '2.0'\n-F04A2 Created OS            03 (3) 'Unix'\n-F04A3 Extract Zip Spec      0A (10) '1.0'\n-F04A4 Extract OS            00 (0) 'MS-DOS'\n-F04A5 General Purpose Flag  0800 (2048)\n+F110E CENTRAL HEADER #157   02014B50 (33639248)\n+F1112 Created Zip Spec      14 (20) '2.0'\n+F1113 Created OS            03 (3) 'Unix'\n+F1114 Extract Zip Spec      0A (10) '1.0'\n+F1115 Extract OS            00 (0) 'MS-DOS'\n+F1116 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F04A7 Compression Method    0000 (0) 'Stored'\n-F04A9 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F04AD CRC                   00000000 (0)\n-F04B1 Compressed Size       00000000 (0)\n-F04B5 Uncompressed Size     00000000 (0)\n-F04B9 Filename Length       0059 (89)\n-F04BB Extra Length          0000 (0)\n-F04BD Comment Length        0000 (0)\n-F04BF Disk Start            0000 (0)\n-F04C1 Int File Attributes   0000 (0)\n+F1118 Compression Method    0000 (0) 'Stored'\n+F111A Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F111E CRC                   00000000 (0)\n+F1122 Compressed Size       00000000 (0)\n+F1126 Uncompressed Size     00000000 (0)\n+F112A Filename Length       0059 (89)\n+F112C Extra Length          0000 (0)\n+F112E Comment Length        0000 (0)\n+F1130 Disk Start            0000 (0)\n+F1132 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F04C3 Ext File Attributes   41ED0010 (1106051088)\n+F1134 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F04C7 Local Header Offset   00004191 (16785)\n-F04CB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F1138 Local Header Offset   00004191 (16785)\n+F113C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF04CB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF113C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF04CB: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF113C: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF04A3: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF1114: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F0524 CENTRAL HEADER #158   02014B50 (33639248)\n-F0528 Created Zip Spec      14 (20) '2.0'\n-F0529 Created OS            03 (3) 'Unix'\n-F052A Extract Zip Spec      0A (10) '1.0'\n-F052B Extract OS            00 (0) 'MS-DOS'\n-F052C General Purpose Flag  0800 (2048)\n+F1195 CENTRAL HEADER #158   02014B50 (33639248)\n+F1199 Created Zip Spec      14 (20) '2.0'\n+F119A Created OS            03 (3) 'Unix'\n+F119B Extract Zip Spec      0A (10) '1.0'\n+F119C Extract OS            00 (0) 'MS-DOS'\n+F119D General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F052E Compression Method    0000 (0) 'Stored'\n-F0530 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F0534 CRC                   00000000 (0)\n-F0538 Compressed Size       00000000 (0)\n-F053C Uncompressed Size     00000000 (0)\n-F0540 Filename Length       0064 (100)\n-F0542 Extra Length          0000 (0)\n-F0544 Comment Length        0000 (0)\n-F0546 Disk Start            0000 (0)\n-F0548 Int File Attributes   0000 (0)\n+F119F Compression Method    0000 (0) 'Stored'\n+F11A1 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F11A5 CRC                   00000000 (0)\n+F11A9 Compressed Size       00000000 (0)\n+F11AD Uncompressed Size     00000000 (0)\n+F11B1 Filename Length       0064 (100)\n+F11B3 Extra Length          0000 (0)\n+F11B5 Comment Length        0000 (0)\n+F11B7 Disk Start            0000 (0)\n+F11B9 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F054A Ext File Attributes   41ED0010 (1106051088)\n+F11BB Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F054E Local Header Offset   00004208 (16904)\n-F0552 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F11BF Local Header Offset   00004208 (16904)\n+F11C3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF0552: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF11C3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF0552: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF11C3: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF052A: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF119B: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F05B6 CENTRAL HEADER #159   02014B50 (33639248)\n-F05BA Created Zip Spec      14 (20) '2.0'\n-F05BB Created OS            03 (3) 'Unix'\n-F05BC Extract Zip Spec      0A (10) '1.0'\n-F05BD Extract OS            00 (0) 'MS-DOS'\n-F05BE General Purpose Flag  0800 (2048)\n+F1227 CENTRAL HEADER #159   02014B50 (33639248)\n+F122B Created Zip Spec      14 (20) '2.0'\n+F122C Created OS            03 (3) 'Unix'\n+F122D Extract Zip Spec      0A (10) '1.0'\n+F122E Extract OS            00 (0) 'MS-DOS'\n+F122F General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F05C0 Compression Method    0000 (0) 'Stored'\n-F05C2 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F05C6 CRC                   00000000 (0)\n-F05CA Compressed Size       00000000 (0)\n-F05CE Uncompressed Size     00000000 (0)\n-F05D2 Filename Length       0064 (100)\n-F05D4 Extra Length          0000 (0)\n-F05D6 Comment Length        0000 (0)\n-F05D8 Disk Start            0000 (0)\n-F05DA Int File Attributes   0000 (0)\n+F1231 Compression Method    0000 (0) 'Stored'\n+F1233 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F1237 CRC                   00000000 (0)\n+F123B Compressed Size       00000000 (0)\n+F123F Uncompressed Size     00000000 (0)\n+F1243 Filename Length       0064 (100)\n+F1245 Extra Length          0000 (0)\n+F1247 Comment Length        0000 (0)\n+F1249 Disk Start            0000 (0)\n+F124B Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F05DC Ext File Attributes   41ED0010 (1106051088)\n+F124D Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F05E0 Local Header Offset   0000428A (17034)\n-F05E4 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F1251 Local Header Offset   0000428A (17034)\n+F1255 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF05E4: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF1255: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF05E4: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF1255: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF05BC: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF122D: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F0648 CENTRAL HEADER #160   02014B50 (33639248)\n-F064C Created Zip Spec      14 (20) '2.0'\n-F064D Created OS            03 (3) 'Unix'\n-F064E Extract Zip Spec      0A (10) '1.0'\n-F064F Extract OS            00 (0) 'MS-DOS'\n-F0650 General Purpose Flag  0800 (2048)\n+F12B9 CENTRAL HEADER #160   02014B50 (33639248)\n+F12BD Created Zip Spec      14 (20) '2.0'\n+F12BE Created OS            03 (3) 'Unix'\n+F12BF Extract Zip Spec      0A (10) '1.0'\n+F12C0 Extract OS            00 (0) 'MS-DOS'\n+F12C1 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F0652 Compression Method    0000 (0) 'Stored'\n-F0654 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F0658 CRC                   00000000 (0)\n-F065C Compressed Size       00000000 (0)\n-F0660 Uncompressed Size     00000000 (0)\n-F0664 Filename Length       0063 (99)\n-F0666 Extra Length          0000 (0)\n-F0668 Comment Length        0000 (0)\n-F066A Disk Start            0000 (0)\n-F066C Int File Attributes   0000 (0)\n+F12C3 Compression Method    0000 (0) 'Stored'\n+F12C5 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F12C9 CRC                   00000000 (0)\n+F12CD Compressed Size       00000000 (0)\n+F12D1 Uncompressed Size     00000000 (0)\n+F12D5 Filename Length       0063 (99)\n+F12D7 Extra Length          0000 (0)\n+F12D9 Comment Length        0000 (0)\n+F12DB Disk Start            0000 (0)\n+F12DD Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F066E Ext File Attributes   41ED0010 (1106051088)\n+F12DF Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F0672 Local Header Offset   0000430C (17164)\n-F0676 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F12E3 Local Header Offset   0000430C (17164)\n+F12E7 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF0676: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF12E7: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF0676: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF12E7: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF064E: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF12BF: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F06D9 CENTRAL HEADER #161   02014B50 (33639248)\n-F06DD Created Zip Spec      14 (20) '2.0'\n-F06DE Created OS            03 (3) 'Unix'\n-F06DF Extract Zip Spec      0A (10) '1.0'\n-F06E0 Extract OS            00 (0) 'MS-DOS'\n-F06E1 General Purpose Flag  0800 (2048)\n+F134A CENTRAL HEADER #161   02014B50 (33639248)\n+F134E Created Zip Spec      14 (20) '2.0'\n+F134F Created OS            03 (3) 'Unix'\n+F1350 Extract Zip Spec      0A (10) '1.0'\n+F1351 Extract OS            00 (0) 'MS-DOS'\n+F1352 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F06E3 Compression Method    0000 (0) 'Stored'\n-F06E5 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F06E9 CRC                   00000000 (0)\n-F06ED Compressed Size       00000000 (0)\n-F06F1 Uncompressed Size     00000000 (0)\n-F06F5 Filename Length       0061 (97)\n-F06F7 Extra Length          0000 (0)\n-F06F9 Comment Length        0000 (0)\n-F06FB Disk Start            0000 (0)\n-F06FD Int File Attributes   0000 (0)\n+F1354 Compression Method    0000 (0) 'Stored'\n+F1356 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F135A CRC                   00000000 (0)\n+F135E Compressed Size       00000000 (0)\n+F1362 Uncompressed Size     00000000 (0)\n+F1366 Filename Length       0061 (97)\n+F1368 Extra Length          0000 (0)\n+F136A Comment Length        0000 (0)\n+F136C Disk Start            0000 (0)\n+F136E Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F06FF Ext File Attributes   41ED0010 (1106051088)\n+F1370 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F0703 Local Header Offset   0000438D (17293)\n-F0707 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F1374 Local Header Offset   0000438D (17293)\n+F1378 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF0707: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF1378: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF0707: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF1378: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF06DF: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF1350: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F0768 CENTRAL HEADER #162   02014B50 (33639248)\n-F076C Created Zip Spec      14 (20) '2.0'\n-F076D Created OS            03 (3) 'Unix'\n-F076E Extract Zip Spec      0A (10) '1.0'\n-F076F Extract OS            00 (0) 'MS-DOS'\n-F0770 General Purpose Flag  0800 (2048)\n+F13D9 CENTRAL HEADER #162   02014B50 (33639248)\n+F13DD Created Zip Spec      14 (20) '2.0'\n+F13DE Created OS            03 (3) 'Unix'\n+F13DF Extract Zip Spec      0A (10) '1.0'\n+F13E0 Extract OS            00 (0) 'MS-DOS'\n+F13E1 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F0772 Compression Method    0000 (0) 'Stored'\n-F0774 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F0778 CRC                   00000000 (0)\n-F077C Compressed Size       00000000 (0)\n-F0780 Uncompressed Size     00000000 (0)\n-F0784 Filename Length       0023 (35)\n-F0786 Extra Length          0000 (0)\n-F0788 Comment Length        0000 (0)\n-F078A Disk Start            0000 (0)\n-F078C Int File Attributes   0000 (0)\n+F13E3 Compression Method    0000 (0) 'Stored'\n+F13E5 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F13E9 CRC                   00000000 (0)\n+F13ED Compressed Size       00000000 (0)\n+F13F1 Uncompressed Size     00000000 (0)\n+F13F5 Filename Length       0023 (35)\n+F13F7 Extra Length          0000 (0)\n+F13F9 Comment Length        0000 (0)\n+F13FB Disk Start            0000 (0)\n+F13FD Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F078E Ext File Attributes   41ED0010 (1106051088)\n+F13FF Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F0792 Local Header Offset   0000440C (17420)\n-F0796 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F1403 Local Header Offset   0000440C (17420)\n+F1407 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF0796: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF1407: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF0796: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF1407: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF076E: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF13DF: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F07B9 CENTRAL HEADER #163   02014B50 (33639248)\n-F07BD Created Zip Spec      14 (20) '2.0'\n-F07BE Created OS            03 (3) 'Unix'\n-F07BF Extract Zip Spec      0A (10) '1.0'\n-F07C0 Extract OS            00 (0) 'MS-DOS'\n-F07C1 General Purpose Flag  0800 (2048)\n+F142A CENTRAL HEADER #163   02014B50 (33639248)\n+F142E Created Zip Spec      14 (20) '2.0'\n+F142F Created OS            03 (3) 'Unix'\n+F1430 Extract Zip Spec      0A (10) '1.0'\n+F1431 Extract OS            00 (0) 'MS-DOS'\n+F1432 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F07C3 Compression Method    0000 (0) 'Stored'\n-F07C5 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F07C9 CRC                   00000000 (0)\n-F07CD Compressed Size       00000000 (0)\n-F07D1 Uncompressed Size     00000000 (0)\n-F07D5 Filename Length       002A (42)\n-F07D7 Extra Length          0000 (0)\n-F07D9 Comment Length        0000 (0)\n-F07DB Disk Start            0000 (0)\n-F07DD Int File Attributes   0000 (0)\n+F1434 Compression Method    0000 (0) 'Stored'\n+F1436 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F143A CRC                   00000000 (0)\n+F143E Compressed Size       00000000 (0)\n+F1442 Uncompressed Size     00000000 (0)\n+F1446 Filename Length       002A (42)\n+F1448 Extra Length          0000 (0)\n+F144A Comment Length        0000 (0)\n+F144C Disk Start            0000 (0)\n+F144E Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F07DF Ext File Attributes   41ED0010 (1106051088)\n+F1450 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F07E3 Local Header Offset   0000444D (17485)\n-F07E7 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F1454 Local Header Offset   0000444D (17485)\n+F1458 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF07E7: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF1458: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF07E7: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF1458: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF07BF: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF1430: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F0811 CENTRAL HEADER #164   02014B50 (33639248)\n-F0815 Created Zip Spec      14 (20) '2.0'\n-F0816 Created OS            03 (3) 'Unix'\n-F0817 Extract Zip Spec      0A (10) '1.0'\n-F0818 Extract OS            00 (0) 'MS-DOS'\n-F0819 General Purpose Flag  0800 (2048)\n+F1482 CENTRAL HEADER #164   02014B50 (33639248)\n+F1486 Created Zip Spec      14 (20) '2.0'\n+F1487 Created OS            03 (3) 'Unix'\n+F1488 Extract Zip Spec      0A (10) '1.0'\n+F1489 Extract OS            00 (0) 'MS-DOS'\n+F148A General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F081B Compression Method    0000 (0) 'Stored'\n-F081D Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F0821 CRC                   00000000 (0)\n-F0825 Compressed Size       00000000 (0)\n-F0829 Uncompressed Size     00000000 (0)\n-F082D Filename Length       0056 (86)\n-F082F Extra Length          0000 (0)\n-F0831 Comment Length        0000 (0)\n-F0833 Disk Start            0000 (0)\n-F0835 Int File Attributes   0000 (0)\n+F148C Compression Method    0000 (0) 'Stored'\n+F148E Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F1492 CRC                   00000000 (0)\n+F1496 Compressed Size       00000000 (0)\n+F149A Uncompressed Size     00000000 (0)\n+F149E Filename Length       0056 (86)\n+F14A0 Extra Length          0000 (0)\n+F14A2 Comment Length        0000 (0)\n+F14A4 Disk Start            0000 (0)\n+F14A6 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F0837 Ext File Attributes   41ED0010 (1106051088)\n+F14A8 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F083B Local Header Offset   00004495 (17557)\n-F083F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F14AC Local Header Offset   00004495 (17557)\n+F14B0 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF083F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF14B0: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF083F: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF14B0: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF0817: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF1488: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F0895 CENTRAL HEADER #165   02014B50 (33639248)\n-F0899 Created Zip Spec      14 (20) '2.0'\n-F089A Created OS            03 (3) 'Unix'\n-F089B Extract Zip Spec      0A (10) '1.0'\n-F089C Extract OS            00 (0) 'MS-DOS'\n-F089D General Purpose Flag  0800 (2048)\n+F1506 CENTRAL HEADER #165   02014B50 (33639248)\n+F150A Created Zip Spec      14 (20) '2.0'\n+F150B Created OS            03 (3) 'Unix'\n+F150C Extract Zip Spec      0A (10) '1.0'\n+F150D Extract OS            00 (0) 'MS-DOS'\n+F150E General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F089F Compression Method    0000 (0) 'Stored'\n-F08A1 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F08A5 CRC                   00000000 (0)\n-F08A9 Compressed Size       00000000 (0)\n-F08AD Uncompressed Size     00000000 (0)\n-F08B1 Filename Length       0031 (49)\n-F08B3 Extra Length          0000 (0)\n-F08B5 Comment Length        0000 (0)\n-F08B7 Disk Start            0000 (0)\n-F08B9 Int File Attributes   0000 (0)\n+F1510 Compression Method    0000 (0) 'Stored'\n+F1512 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F1516 CRC                   00000000 (0)\n+F151A Compressed Size       00000000 (0)\n+F151E Uncompressed Size     00000000 (0)\n+F1522 Filename Length       0031 (49)\n+F1524 Extra Length          0000 (0)\n+F1526 Comment Length        0000 (0)\n+F1528 Disk Start            0000 (0)\n+F152A Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F08BB Ext File Attributes   41ED0010 (1106051088)\n+F152C Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F08BF Local Header Offset   00004509 (17673)\n-F08C3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F1530 Local Header Offset   00004509 (17673)\n+F1534 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF08C3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF1534: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF08C3: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF1534: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF089B: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF150C: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F08F4 CENTRAL HEADER #166   02014B50 (33639248)\n-F08F8 Created Zip Spec      14 (20) '2.0'\n-F08F9 Created OS            03 (3) 'Unix'\n-F08FA Extract Zip Spec      0A (10) '1.0'\n-F08FB Extract OS            00 (0) 'MS-DOS'\n-F08FC General Purpose Flag  0800 (2048)\n+F1565 CENTRAL HEADER #166   02014B50 (33639248)\n+F1569 Created Zip Spec      14 (20) '2.0'\n+F156A Created OS            03 (3) 'Unix'\n+F156B Extract Zip Spec      0A (10) '1.0'\n+F156C Extract OS            00 (0) 'MS-DOS'\n+F156D General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F08FE Compression Method    0000 (0) 'Stored'\n-F0900 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F0904 CRC                   00000000 (0)\n-F0908 Compressed Size       00000000 (0)\n-F090C Uncompressed Size     00000000 (0)\n-F0910 Filename Length       0038 (56)\n-F0912 Extra Length          0000 (0)\n-F0914 Comment Length        0000 (0)\n-F0916 Disk Start            0000 (0)\n-F0918 Int File Attributes   0000 (0)\n+F156F Compression Method    0000 (0) 'Stored'\n+F1571 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F1575 CRC                   00000000 (0)\n+F1579 Compressed Size       00000000 (0)\n+F157D Uncompressed Size     00000000 (0)\n+F1581 Filename Length       0038 (56)\n+F1583 Extra Length          0000 (0)\n+F1585 Comment Length        0000 (0)\n+F1587 Disk Start            0000 (0)\n+F1589 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F091A Ext File Attributes   41ED0010 (1106051088)\n+F158B Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F091E Local Header Offset   00004558 (17752)\n-F0922 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F158F Local Header Offset   00004558 (17752)\n+F1593 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF0922: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF1593: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF0922: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF1593: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF08FA: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF156B: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F095A CENTRAL HEADER #167   02014B50 (33639248)\n-F095E Created Zip Spec      14 (20) '2.0'\n-F095F Created OS            03 (3) 'Unix'\n-F0960 Extract Zip Spec      0A (10) '1.0'\n-F0961 Extract OS            00 (0) 'MS-DOS'\n-F0962 General Purpose Flag  0800 (2048)\n+F15CB CENTRAL HEADER #167   02014B50 (33639248)\n+F15CF Created Zip Spec      14 (20) '2.0'\n+F15D0 Created OS            03 (3) 'Unix'\n+F15D1 Extract Zip Spec      0A (10) '1.0'\n+F15D2 Extract OS            00 (0) 'MS-DOS'\n+F15D3 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F0964 Compression Method    0000 (0) 'Stored'\n-F0966 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F096A CRC                   00000000 (0)\n-F096E Compressed Size       00000000 (0)\n-F0972 Uncompressed Size     00000000 (0)\n-F0976 Filename Length       006A (106)\n-F0978 Extra Length          0000 (0)\n-F097A Comment Length        0000 (0)\n-F097C Disk Start            0000 (0)\n-F097E Int File Attributes   0000 (0)\n+F15D5 Compression Method    0000 (0) 'Stored'\n+F15D7 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F15DB CRC                   00000000 (0)\n+F15DF Compressed Size       00000000 (0)\n+F15E3 Uncompressed Size     00000000 (0)\n+F15E7 Filename Length       006A (106)\n+F15E9 Extra Length          0000 (0)\n+F15EB Comment Length        0000 (0)\n+F15ED Disk Start            0000 (0)\n+F15EF Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F0980 Ext File Attributes   41ED0010 (1106051088)\n+F15F1 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F0984 Local Header Offset   000045AE (17838)\n-F0988 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F15F5 Local Header Offset   000045AE (17838)\n+F15F9 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF0988: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF15F9: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF0988: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF15F9: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF0960: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF15D1: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F09F2 CENTRAL HEADER #168   02014B50 (33639248)\n-F09F6 Created Zip Spec      14 (20) '2.0'\n-F09F7 Created OS            03 (3) 'Unix'\n-F09F8 Extract Zip Spec      0A (10) '1.0'\n-F09F9 Extract OS            00 (0) 'MS-DOS'\n-F09FA General Purpose Flag  0800 (2048)\n+F1663 CENTRAL HEADER #168   02014B50 (33639248)\n+F1667 Created Zip Spec      14 (20) '2.0'\n+F1668 Created OS            03 (3) 'Unix'\n+F1669 Extract Zip Spec      0A (10) '1.0'\n+F166A Extract OS            00 (0) 'MS-DOS'\n+F166B General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F09FC Compression Method    0000 (0) 'Stored'\n-F09FE Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F0A02 CRC                   00000000 (0)\n-F0A06 Compressed Size       00000000 (0)\n-F0A0A Uncompressed Size     00000000 (0)\n-F0A0E Filename Length       0022 (34)\n-F0A10 Extra Length          0000 (0)\n-F0A12 Comment Length        0000 (0)\n-F0A14 Disk Start            0000 (0)\n-F0A16 Int File Attributes   0000 (0)\n+F166D Compression Method    0000 (0) 'Stored'\n+F166F Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F1673 CRC                   00000000 (0)\n+F1677 Compressed Size       00000000 (0)\n+F167B Uncompressed Size     00000000 (0)\n+F167F Filename Length       0022 (34)\n+F1681 Extra Length          0000 (0)\n+F1683 Comment Length        0000 (0)\n+F1685 Disk Start            0000 (0)\n+F1687 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F0A18 Ext File Attributes   41ED0010 (1106051088)\n+F1689 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F0A1C Local Header Offset   00004636 (17974)\n-F0A20 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F168D Local Header Offset   00004636 (17974)\n+F1691 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF0A20: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF1691: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF0A20: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF1691: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF09F8: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF1669: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F0A42 CENTRAL HEADER #169   02014B50 (33639248)\n-F0A46 Created Zip Spec      14 (20) '2.0'\n-F0A47 Created OS            03 (3) 'Unix'\n-F0A48 Extract Zip Spec      0A (10) '1.0'\n-F0A49 Extract OS            00 (0) 'MS-DOS'\n-F0A4A General Purpose Flag  0800 (2048)\n+F16B3 CENTRAL HEADER #169   02014B50 (33639248)\n+F16B7 Created Zip Spec      14 (20) '2.0'\n+F16B8 Created OS            03 (3) 'Unix'\n+F16B9 Extract Zip Spec      0A (10) '1.0'\n+F16BA Extract OS            00 (0) 'MS-DOS'\n+F16BB General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F0A4C Compression Method    0000 (0) 'Stored'\n-F0A4E Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F0A52 CRC                   00000000 (0)\n-F0A56 Compressed Size       00000000 (0)\n-F0A5A Uncompressed Size     00000000 (0)\n-F0A5E Filename Length       0029 (41)\n-F0A60 Extra Length          0000 (0)\n-F0A62 Comment Length        0000 (0)\n-F0A64 Disk Start            0000 (0)\n-F0A66 Int File Attributes   0000 (0)\n+F16BD Compression Method    0000 (0) 'Stored'\n+F16BF Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F16C3 CRC                   00000000 (0)\n+F16C7 Compressed Size       00000000 (0)\n+F16CB Uncompressed Size     00000000 (0)\n+F16CF Filename Length       0029 (41)\n+F16D1 Extra Length          0000 (0)\n+F16D3 Comment Length        0000 (0)\n+F16D5 Disk Start            0000 (0)\n+F16D7 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F0A68 Ext File Attributes   41ED0010 (1106051088)\n+F16D9 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F0A6C Local Header Offset   00004676 (18038)\n-F0A70 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F16DD Local Header Offset   00004676 (18038)\n+F16E1 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF0A70: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF16E1: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF0A70: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF16E1: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF0A48: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF16B9: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F0A99 CENTRAL HEADER #170   02014B50 (33639248)\n-F0A9D Created Zip Spec      14 (20) '2.0'\n-F0A9E Created OS            03 (3) 'Unix'\n-F0A9F Extract Zip Spec      0A (10) '1.0'\n-F0AA0 Extract OS            00 (0) 'MS-DOS'\n-F0AA1 General Purpose Flag  0800 (2048)\n+F170A CENTRAL HEADER #170   02014B50 (33639248)\n+F170E Created Zip Spec      14 (20) '2.0'\n+F170F Created OS            03 (3) 'Unix'\n+F1710 Extract Zip Spec      0A (10) '1.0'\n+F1711 Extract OS            00 (0) 'MS-DOS'\n+F1712 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F0AA3 Compression Method    0000 (0) 'Stored'\n-F0AA5 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F0AA9 CRC                   00000000 (0)\n-F0AAD Compressed Size       00000000 (0)\n-F0AB1 Uncompressed Size     00000000 (0)\n-F0AB5 Filename Length       004B (75)\n-F0AB7 Extra Length          0000 (0)\n-F0AB9 Comment Length        0000 (0)\n-F0ABB Disk Start            0000 (0)\n-F0ABD Int File Attributes   0000 (0)\n+F1714 Compression Method    0000 (0) 'Stored'\n+F1716 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F171A CRC                   00000000 (0)\n+F171E Compressed Size       00000000 (0)\n+F1722 Uncompressed Size     00000000 (0)\n+F1726 Filename Length       004B (75)\n+F1728 Extra Length          0000 (0)\n+F172A Comment Length        0000 (0)\n+F172C Disk Start            0000 (0)\n+F172E Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F0ABF Ext File Attributes   41ED0010 (1106051088)\n+F1730 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F0AC3 Local Header Offset   000046BD (18109)\n-F0AC7 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F1734 Local Header Offset   000046BD (18109)\n+F1738 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF0AC7: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF1738: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF0AC7: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF1738: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF0A9F: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF1710: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F0B12 CENTRAL HEADER #171   02014B50 (33639248)\n-F0B16 Created Zip Spec      14 (20) '2.0'\n-F0B17 Created OS            03 (3) 'Unix'\n-F0B18 Extract Zip Spec      0A (10) '1.0'\n-F0B19 Extract OS            00 (0) 'MS-DOS'\n-F0B1A General Purpose Flag  0800 (2048)\n+F1783 CENTRAL HEADER #171   02014B50 (33639248)\n+F1787 Created Zip Spec      14 (20) '2.0'\n+F1788 Created OS            03 (3) 'Unix'\n+F1789 Extract Zip Spec      0A (10) '1.0'\n+F178A Extract OS            00 (0) 'MS-DOS'\n+F178B General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F0B1C Compression Method    0000 (0) 'Stored'\n-F0B1E Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F0B22 CRC                   00000000 (0)\n-F0B26 Compressed Size       00000000 (0)\n-F0B2A Uncompressed Size     00000000 (0)\n-F0B2E Filename Length       0063 (99)\n-F0B30 Extra Length          0000 (0)\n-F0B32 Comment Length        0000 (0)\n-F0B34 Disk Start            0000 (0)\n-F0B36 Int File Attributes   0000 (0)\n+F178D Compression Method    0000 (0) 'Stored'\n+F178F Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F1793 CRC                   00000000 (0)\n+F1797 Compressed Size       00000000 (0)\n+F179B Uncompressed Size     00000000 (0)\n+F179F Filename Length       0063 (99)\n+F17A1 Extra Length          0000 (0)\n+F17A3 Comment Length        0000 (0)\n+F17A5 Disk Start            0000 (0)\n+F17A7 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F0B38 Ext File Attributes   41ED0010 (1106051088)\n+F17A9 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F0B3C Local Header Offset   00004726 (18214)\n-F0B40 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F17AD Local Header Offset   00004726 (18214)\n+F17B1 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF0B40: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF17B1: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF0B40: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF17B1: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF0B18: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF1789: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F0BA3 CENTRAL HEADER #172   02014B50 (33639248)\n-F0BA7 Created Zip Spec      14 (20) '2.0'\n-F0BA8 Created OS            03 (3) 'Unix'\n-F0BA9 Extract Zip Spec      0A (10) '1.0'\n-F0BAA Extract OS            00 (0) 'MS-DOS'\n-F0BAB General Purpose Flag  0800 (2048)\n+F1814 CENTRAL HEADER #172   02014B50 (33639248)\n+F1818 Created Zip Spec      14 (20) '2.0'\n+F1819 Created OS            03 (3) 'Unix'\n+F181A Extract Zip Spec      0A (10) '1.0'\n+F181B Extract OS            00 (0) 'MS-DOS'\n+F181C General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F0BAD Compression Method    0000 (0) 'Stored'\n-F0BAF Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F0BB3 CRC                   00000000 (0)\n-F0BB7 Compressed Size       00000000 (0)\n-F0BBB Uncompressed Size     00000000 (0)\n-F0BBF Filename Length       0030 (48)\n-F0BC1 Extra Length          0000 (0)\n-F0BC3 Comment Length        0000 (0)\n-F0BC5 Disk Start            0000 (0)\n-F0BC7 Int File Attributes   0000 (0)\n+F181E Compression Method    0000 (0) 'Stored'\n+F1820 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F1824 CRC                   00000000 (0)\n+F1828 Compressed Size       00000000 (0)\n+F182C Uncompressed Size     00000000 (0)\n+F1830 Filename Length       0030 (48)\n+F1832 Extra Length          0000 (0)\n+F1834 Comment Length        0000 (0)\n+F1836 Disk Start            0000 (0)\n+F1838 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F0BC9 Ext File Attributes   41ED0010 (1106051088)\n+F183A Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F0BCD Local Header Offset   000047A7 (18343)\n-F0BD1 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F183E Local Header Offset   000047A7 (18343)\n+F1842 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF0BD1: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF1842: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF0BD1: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF1842: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF0BA9: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF181A: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F0C01 CENTRAL HEADER #173   02014B50 (33639248)\n-F0C05 Created Zip Spec      14 (20) '2.0'\n-F0C06 Created OS            03 (3) 'Unix'\n-F0C07 Extract Zip Spec      0A (10) '1.0'\n-F0C08 Extract OS            00 (0) 'MS-DOS'\n-F0C09 General Purpose Flag  0800 (2048)\n+F1872 CENTRAL HEADER #173   02014B50 (33639248)\n+F1876 Created Zip Spec      14 (20) '2.0'\n+F1877 Created OS            03 (3) 'Unix'\n+F1878 Extract Zip Spec      0A (10) '1.0'\n+F1879 Extract OS            00 (0) 'MS-DOS'\n+F187A General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F0C0B Compression Method    0000 (0) 'Stored'\n-F0C0D Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F0C11 CRC                   00000000 (0)\n-F0C15 Compressed Size       00000000 (0)\n-F0C19 Uncompressed Size     00000000 (0)\n-F0C1D Filename Length       0037 (55)\n-F0C1F Extra Length          0000 (0)\n-F0C21 Comment Length        0000 (0)\n-F0C23 Disk Start            0000 (0)\n-F0C25 Int File Attributes   0000 (0)\n+F187C Compression Method    0000 (0) 'Stored'\n+F187E Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F1882 CRC                   00000000 (0)\n+F1886 Compressed Size       00000000 (0)\n+F188A Uncompressed Size     00000000 (0)\n+F188E Filename Length       0037 (55)\n+F1890 Extra Length          0000 (0)\n+F1892 Comment Length        0000 (0)\n+F1894 Disk Start            0000 (0)\n+F1896 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F0C27 Ext File Attributes   41ED0010 (1106051088)\n+F1898 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F0C2B Local Header Offset   000047F5 (18421)\n-F0C2F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F189C Local Header Offset   000047F5 (18421)\n+F18A0 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF0C2F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF18A0: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF0C2F: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF18A0: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF0C07: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF1878: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F0C66 CENTRAL HEADER #174   02014B50 (33639248)\n-F0C6A Created Zip Spec      14 (20) '2.0'\n-F0C6B Created OS            03 (3) 'Unix'\n-F0C6C Extract Zip Spec      0A (10) '1.0'\n-F0C6D Extract OS            00 (0) 'MS-DOS'\n-F0C6E General Purpose Flag  0800 (2048)\n+F18D7 CENTRAL HEADER #174   02014B50 (33639248)\n+F18DB Created Zip Spec      14 (20) '2.0'\n+F18DC Created OS            03 (3) 'Unix'\n+F18DD Extract Zip Spec      0A (10) '1.0'\n+F18DE Extract OS            00 (0) 'MS-DOS'\n+F18DF General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F0C70 Compression Method    0000 (0) 'Stored'\n-F0C72 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F0C76 CRC                   00000000 (0)\n-F0C7A Compressed Size       00000000 (0)\n-F0C7E Uncompressed Size     00000000 (0)\n-F0C82 Filename Length       0068 (104)\n-F0C84 Extra Length          0000 (0)\n-F0C86 Comment Length        0000 (0)\n-F0C88 Disk Start            0000 (0)\n-F0C8A Int File Attributes   0000 (0)\n+F18E1 Compression Method    0000 (0) 'Stored'\n+F18E3 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F18E7 CRC                   00000000 (0)\n+F18EB Compressed Size       00000000 (0)\n+F18EF Uncompressed Size     00000000 (0)\n+F18F3 Filename Length       0068 (104)\n+F18F5 Extra Length          0000 (0)\n+F18F7 Comment Length        0000 (0)\n+F18F9 Disk Start            0000 (0)\n+F18FB Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F0C8C Ext File Attributes   41ED0010 (1106051088)\n+F18FD Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F0C90 Local Header Offset   0000484A (18506)\n-F0C94 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F1901 Local Header Offset   0000484A (18506)\n+F1905 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF0C94: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF1905: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF0C94: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF1905: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF0C6C: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF18DD: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F0CFC CENTRAL HEADER #175   02014B50 (33639248)\n-F0D00 Created Zip Spec      14 (20) '2.0'\n-F0D01 Created OS            03 (3) 'Unix'\n-F0D02 Extract Zip Spec      0A (10) '1.0'\n-F0D03 Extract OS            00 (0) 'MS-DOS'\n-F0D04 General Purpose Flag  0800 (2048)\n+F196D CENTRAL HEADER #175   02014B50 (33639248)\n+F1971 Created Zip Spec      14 (20) '2.0'\n+F1972 Created OS            03 (3) 'Unix'\n+F1973 Extract Zip Spec      0A (10) '1.0'\n+F1974 Extract OS            00 (0) 'MS-DOS'\n+F1975 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F0D06 Compression Method    0000 (0) 'Stored'\n-F0D08 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F0D0C CRC                   00000000 (0)\n-F0D10 Compressed Size       00000000 (0)\n-F0D14 Uncompressed Size     00000000 (0)\n-F0D18 Filename Length       003C (60)\n-F0D1A Extra Length          0000 (0)\n-F0D1C Comment Length        0000 (0)\n-F0D1E Disk Start            0000 (0)\n-F0D20 Int File Attributes   0000 (0)\n+F1977 Compression Method    0000 (0) 'Stored'\n+F1979 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F197D CRC                   00000000 (0)\n+F1981 Compressed Size       00000000 (0)\n+F1985 Uncompressed Size     00000000 (0)\n+F1989 Filename Length       003C (60)\n+F198B Extra Length          0000 (0)\n+F198D Comment Length        0000 (0)\n+F198F Disk Start            0000 (0)\n+F1991 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F0D22 Ext File Attributes   41ED0010 (1106051088)\n+F1993 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F0D26 Local Header Offset   000048D0 (18640)\n-F0D2A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F1997 Local Header Offset   000048D0 (18640)\n+F199B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF0D2A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF199B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF0D2A: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF199B: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF0D02: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF1973: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F0D66 CENTRAL HEADER #176   02014B50 (33639248)\n-F0D6A Created Zip Spec      14 (20) '2.0'\n-F0D6B Created OS            03 (3) 'Unix'\n-F0D6C Extract Zip Spec      0A (10) '1.0'\n-F0D6D Extract OS            00 (0) 'MS-DOS'\n-F0D6E General Purpose Flag  0800 (2048)\n+F19D7 CENTRAL HEADER #176   02014B50 (33639248)\n+F19DB Created Zip Spec      14 (20) '2.0'\n+F19DC Created OS            03 (3) 'Unix'\n+F19DD Extract Zip Spec      0A (10) '1.0'\n+F19DE Extract OS            00 (0) 'MS-DOS'\n+F19DF General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F0D70 Compression Method    0000 (0) 'Stored'\n-F0D72 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F0D76 CRC                   00000000 (0)\n-F0D7A Compressed Size       00000000 (0)\n-F0D7E Uncompressed Size     00000000 (0)\n-F0D82 Filename Length       0043 (67)\n-F0D84 Extra Length          0000 (0)\n-F0D86 Comment Length        0000 (0)\n-F0D88 Disk Start            0000 (0)\n-F0D8A Int File Attributes   0000 (0)\n+F19E1 Compression Method    0000 (0) 'Stored'\n+F19E3 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F19E7 CRC                   00000000 (0)\n+F19EB Compressed Size       00000000 (0)\n+F19EF Uncompressed Size     00000000 (0)\n+F19F3 Filename Length       0043 (67)\n+F19F5 Extra Length          0000 (0)\n+F19F7 Comment Length        0000 (0)\n+F19F9 Disk Start            0000 (0)\n+F19FB Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F0D8C Ext File Attributes   41ED0010 (1106051088)\n+F19FD Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F0D90 Local Header Offset   0000492A (18730)\n-F0D94 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F1A01 Local Header Offset   0000492A (18730)\n+F1A05 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF0D94: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF1A05: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF0D94: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF1A05: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF0D6C: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF19DD: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F0DD7 CENTRAL HEADER #177   02014B50 (33639248)\n-F0DDB Created Zip Spec      14 (20) '2.0'\n-F0DDC Created OS            03 (3) 'Unix'\n-F0DDD Extract Zip Spec      0A (10) '1.0'\n-F0DDE Extract OS            00 (0) 'MS-DOS'\n-F0DDF General Purpose Flag  0800 (2048)\n+F1A48 CENTRAL HEADER #177   02014B50 (33639248)\n+F1A4C Created Zip Spec      14 (20) '2.0'\n+F1A4D Created OS            03 (3) 'Unix'\n+F1A4E Extract Zip Spec      0A (10) '1.0'\n+F1A4F Extract OS            00 (0) 'MS-DOS'\n+F1A50 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F0DE1 Compression Method    0000 (0) 'Stored'\n-F0DE3 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F0DE7 CRC                   00000000 (0)\n-F0DEB Compressed Size       00000000 (0)\n-F0DEF Uncompressed Size     00000000 (0)\n-F0DF3 Filename Length       0061 (97)\n-F0DF5 Extra Length          0000 (0)\n-F0DF7 Comment Length        0000 (0)\n-F0DF9 Disk Start            0000 (0)\n-F0DFB Int File Attributes   0000 (0)\n+F1A52 Compression Method    0000 (0) 'Stored'\n+F1A54 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F1A58 CRC                   00000000 (0)\n+F1A5C Compressed Size       00000000 (0)\n+F1A60 Uncompressed Size     00000000 (0)\n+F1A64 Filename Length       0061 (97)\n+F1A66 Extra Length          0000 (0)\n+F1A68 Comment Length        0000 (0)\n+F1A6A Disk Start            0000 (0)\n+F1A6C Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F0DFD Ext File Attributes   41ED0010 (1106051088)\n+F1A6E Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F0E01 Local Header Offset   0000498B (18827)\n-F0E05 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F1A72 Local Header Offset   0000498B (18827)\n+F1A76 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF0E05: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF1A76: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF0E05: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF1A76: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF0DDD: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF1A4E: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F0E66 CENTRAL HEADER #178   02014B50 (33639248)\n-F0E6A Created Zip Spec      14 (20) '2.0'\n-F0E6B Created OS            03 (3) 'Unix'\n-F0E6C Extract Zip Spec      0A (10) '1.0'\n-F0E6D Extract OS            00 (0) 'MS-DOS'\n-F0E6E General Purpose Flag  0800 (2048)\n+F1AD7 CENTRAL HEADER #178   02014B50 (33639248)\n+F1ADB Created Zip Spec      14 (20) '2.0'\n+F1ADC Created OS            03 (3) 'Unix'\n+F1ADD Extract Zip Spec      0A (10) '1.0'\n+F1ADE Extract OS            00 (0) 'MS-DOS'\n+F1ADF General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F0E70 Compression Method    0000 (0) 'Stored'\n-F0E72 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F0E76 CRC                   00000000 (0)\n-F0E7A Compressed Size       00000000 (0)\n-F0E7E Uncompressed Size     00000000 (0)\n-F0E82 Filename Length       0061 (97)\n-F0E84 Extra Length          0000 (0)\n-F0E86 Comment Length        0000 (0)\n-F0E88 Disk Start            0000 (0)\n-F0E8A Int File Attributes   0000 (0)\n+F1AE1 Compression Method    0000 (0) 'Stored'\n+F1AE3 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F1AE7 CRC                   00000000 (0)\n+F1AEB Compressed Size       00000000 (0)\n+F1AEF Uncompressed Size     00000000 (0)\n+F1AF3 Filename Length       0061 (97)\n+F1AF5 Extra Length          0000 (0)\n+F1AF7 Comment Length        0000 (0)\n+F1AF9 Disk Start            0000 (0)\n+F1AFB Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F0E8C Ext File Attributes   41ED0010 (1106051088)\n+F1AFD Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F0E90 Local Header Offset   00004A0A (18954)\n-F0E94 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F1B01 Local Header Offset   00004A0A (18954)\n+F1B05 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF0E94: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF1B05: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF0E94: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF1B05: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF0E6C: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF1ADD: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F0EF5 CENTRAL HEADER #179   02014B50 (33639248)\n-F0EF9 Created Zip Spec      14 (20) '2.0'\n-F0EFA Created OS            03 (3) 'Unix'\n-F0EFB Extract Zip Spec      0A (10) '1.0'\n-F0EFC Extract OS            00 (0) 'MS-DOS'\n-F0EFD General Purpose Flag  0800 (2048)\n+F1B66 CENTRAL HEADER #179   02014B50 (33639248)\n+F1B6A Created Zip Spec      14 (20) '2.0'\n+F1B6B Created OS            03 (3) 'Unix'\n+F1B6C Extract Zip Spec      0A (10) '1.0'\n+F1B6D Extract OS            00 (0) 'MS-DOS'\n+F1B6E General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F0EFF Compression Method    0000 (0) 'Stored'\n-F0F01 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F0F05 CRC                   00000000 (0)\n-F0F09 Compressed Size       00000000 (0)\n-F0F0D Uncompressed Size     00000000 (0)\n-F0F11 Filename Length       0063 (99)\n-F0F13 Extra Length          0000 (0)\n-F0F15 Comment Length        0000 (0)\n-F0F17 Disk Start            0000 (0)\n-F0F19 Int File Attributes   0000 (0)\n+F1B70 Compression Method    0000 (0) 'Stored'\n+F1B72 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F1B76 CRC                   00000000 (0)\n+F1B7A Compressed Size       00000000 (0)\n+F1B7E Uncompressed Size     00000000 (0)\n+F1B82 Filename Length       0063 (99)\n+F1B84 Extra Length          0000 (0)\n+F1B86 Comment Length        0000 (0)\n+F1B88 Disk Start            0000 (0)\n+F1B8A Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F0F1B Ext File Attributes   41ED0010 (1106051088)\n+F1B8C Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F0F1F Local Header Offset   00004A89 (19081)\n-F0F23 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F1B90 Local Header Offset   00004A89 (19081)\n+F1B94 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF0F23: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF1B94: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF0F23: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF1B94: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF0EFB: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF1B6C: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F0F86 CENTRAL HEADER #180   02014B50 (33639248)\n-F0F8A Created Zip Spec      14 (20) '2.0'\n-F0F8B Created OS            03 (3) 'Unix'\n-F0F8C Extract Zip Spec      0A (10) '1.0'\n-F0F8D Extract OS            00 (0) 'MS-DOS'\n-F0F8E General Purpose Flag  0800 (2048)\n+F1BF7 CENTRAL HEADER #180   02014B50 (33639248)\n+F1BFB Created Zip Spec      14 (20) '2.0'\n+F1BFC Created OS            03 (3) 'Unix'\n+F1BFD Extract Zip Spec      0A (10) '1.0'\n+F1BFE Extract OS            00 (0) 'MS-DOS'\n+F1BFF General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F0F90 Compression Method    0000 (0) 'Stored'\n-F0F92 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F0F96 CRC                   00000000 (0)\n-F0F9A Compressed Size       00000000 (0)\n-F0F9E Uncompressed Size     00000000 (0)\n-F0FA2 Filename Length       0067 (103)\n-F0FA4 Extra Length          0000 (0)\n-F0FA6 Comment Length        0000 (0)\n-F0FA8 Disk Start            0000 (0)\n-F0FAA Int File Attributes   0000 (0)\n+F1C01 Compression Method    0000 (0) 'Stored'\n+F1C03 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F1C07 CRC                   00000000 (0)\n+F1C0B Compressed Size       00000000 (0)\n+F1C0F Uncompressed Size     00000000 (0)\n+F1C13 Filename Length       0067 (103)\n+F1C15 Extra Length          0000 (0)\n+F1C17 Comment Length        0000 (0)\n+F1C19 Disk Start            0000 (0)\n+F1C1B Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F0FAC Ext File Attributes   41ED0010 (1106051088)\n+F1C1D Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F0FB0 Local Header Offset   00004B0A (19210)\n-F0FB4 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F1C21 Local Header Offset   00004B0A (19210)\n+F1C25 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF0FB4: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF1C25: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF0FB4: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF1C25: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF0F8C: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF1BFD: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F101B CENTRAL HEADER #181   02014B50 (33639248)\n-F101F Created Zip Spec      14 (20) '2.0'\n-F1020 Created OS            03 (3) 'Unix'\n-F1021 Extract Zip Spec      0A (10) '1.0'\n-F1022 Extract OS            00 (0) 'MS-DOS'\n-F1023 General Purpose Flag  0800 (2048)\n+F1C8C CENTRAL HEADER #181   02014B50 (33639248)\n+F1C90 Created Zip Spec      14 (20) '2.0'\n+F1C91 Created OS            03 (3) 'Unix'\n+F1C92 Extract Zip Spec      0A (10) '1.0'\n+F1C93 Extract OS            00 (0) 'MS-DOS'\n+F1C94 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F1025 Compression Method    0000 (0) 'Stored'\n-F1027 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F102B CRC                   00000000 (0)\n-F102F Compressed Size       00000000 (0)\n-F1033 Uncompressed Size     00000000 (0)\n-F1037 Filename Length       0067 (103)\n-F1039 Extra Length          0000 (0)\n-F103B Comment Length        0000 (0)\n-F103D Disk Start            0000 (0)\n-F103F Int File Attributes   0000 (0)\n+F1C96 Compression Method    0000 (0) 'Stored'\n+F1C98 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F1C9C CRC                   00000000 (0)\n+F1CA0 Compressed Size       00000000 (0)\n+F1CA4 Uncompressed Size     00000000 (0)\n+F1CA8 Filename Length       0067 (103)\n+F1CAA Extra Length          0000 (0)\n+F1CAC Comment Length        0000 (0)\n+F1CAE Disk Start            0000 (0)\n+F1CB0 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F1041 Ext File Attributes   41ED0010 (1106051088)\n+F1CB2 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F1045 Local Header Offset   00004B8F (19343)\n-F1049 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F1CB6 Local Header Offset   00004B8F (19343)\n+F1CBA Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF1049: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF1CBA: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF1049: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF1CBA: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF1021: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF1C92: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F10B0 CENTRAL HEADER #182   02014B50 (33639248)\n-F10B4 Created Zip Spec      14 (20) '2.0'\n-F10B5 Created OS            03 (3) 'Unix'\n-F10B6 Extract Zip Spec      0A (10) '1.0'\n-F10B7 Extract OS            00 (0) 'MS-DOS'\n-F10B8 General Purpose Flag  0800 (2048)\n+F1D21 CENTRAL HEADER #182   02014B50 (33639248)\n+F1D25 Created Zip Spec      14 (20) '2.0'\n+F1D26 Created OS            03 (3) 'Unix'\n+F1D27 Extract Zip Spec      0A (10) '1.0'\n+F1D28 Extract OS            00 (0) 'MS-DOS'\n+F1D29 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F10BA Compression Method    0000 (0) 'Stored'\n-F10BC Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F10C0 CRC                   00000000 (0)\n-F10C4 Compressed Size       00000000 (0)\n-F10C8 Uncompressed Size     00000000 (0)\n-F10CC Filename Length       006B (107)\n-F10CE Extra Length          0000 (0)\n-F10D0 Comment Length        0000 (0)\n-F10D2 Disk Start            0000 (0)\n-F10D4 Int File Attributes   0000 (0)\n+F1D2B Compression Method    0000 (0) 'Stored'\n+F1D2D Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F1D31 CRC                   00000000 (0)\n+F1D35 Compressed Size       00000000 (0)\n+F1D39 Uncompressed Size     00000000 (0)\n+F1D3D Filename Length       006B (107)\n+F1D3F Extra Length          0000 (0)\n+F1D41 Comment Length        0000 (0)\n+F1D43 Disk Start            0000 (0)\n+F1D45 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F10D6 Ext File Attributes   41ED0010 (1106051088)\n+F1D47 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F10DA Local Header Offset   00004C14 (19476)\n-F10DE Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F1D4B Local Header Offset   00004C14 (19476)\n+F1D4F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF10DE: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF1D4F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF10DE: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF1D4F: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF10B6: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF1D27: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F1149 CENTRAL HEADER #183   02014B50 (33639248)\n-F114D Created Zip Spec      14 (20) '2.0'\n-F114E Created OS            03 (3) 'Unix'\n-F114F Extract Zip Spec      0A (10) '1.0'\n-F1150 Extract OS            00 (0) 'MS-DOS'\n-F1151 General Purpose Flag  0800 (2048)\n+F1DBA CENTRAL HEADER #183   02014B50 (33639248)\n+F1DBE Created Zip Spec      14 (20) '2.0'\n+F1DBF Created OS            03 (3) 'Unix'\n+F1DC0 Extract Zip Spec      0A (10) '1.0'\n+F1DC1 Extract OS            00 (0) 'MS-DOS'\n+F1DC2 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F1153 Compression Method    0000 (0) 'Stored'\n-F1155 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F1159 CRC                   00000000 (0)\n-F115D Compressed Size       00000000 (0)\n-F1161 Uncompressed Size     00000000 (0)\n-F1165 Filename Length       0067 (103)\n-F1167 Extra Length          0000 (0)\n-F1169 Comment Length        0000 (0)\n-F116B Disk Start            0000 (0)\n-F116D Int File Attributes   0000 (0)\n+F1DC4 Compression Method    0000 (0) 'Stored'\n+F1DC6 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F1DCA CRC                   00000000 (0)\n+F1DCE Compressed Size       00000000 (0)\n+F1DD2 Uncompressed Size     00000000 (0)\n+F1DD6 Filename Length       0067 (103)\n+F1DD8 Extra Length          0000 (0)\n+F1DDA Comment Length        0000 (0)\n+F1DDC Disk Start            0000 (0)\n+F1DDE Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F116F Ext File Attributes   41ED0010 (1106051088)\n+F1DE0 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F1173 Local Header Offset   00004C9D (19613)\n-F1177 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F1DE4 Local Header Offset   00004C9D (19613)\n+F1DE8 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF1177: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF1DE8: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF1177: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF1DE8: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF114F: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF1DC0: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F11DE CENTRAL HEADER #184   02014B50 (33639248)\n-F11E2 Created Zip Spec      14 (20) '2.0'\n-F11E3 Created OS            03 (3) 'Unix'\n-F11E4 Extract Zip Spec      0A (10) '1.0'\n-F11E5 Extract OS            00 (0) 'MS-DOS'\n-F11E6 General Purpose Flag  0800 (2048)\n+F1E4F CENTRAL HEADER #184   02014B50 (33639248)\n+F1E53 Created Zip Spec      14 (20) '2.0'\n+F1E54 Created OS            03 (3) 'Unix'\n+F1E55 Extract Zip Spec      0A (10) '1.0'\n+F1E56 Extract OS            00 (0) 'MS-DOS'\n+F1E57 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F11E8 Compression Method    0000 (0) 'Stored'\n-F11EA Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F11EE CRC                   00000000 (0)\n-F11F2 Compressed Size       00000000 (0)\n-F11F6 Uncompressed Size     00000000 (0)\n-F11FA Filename Length       0076 (118)\n-F11FC Extra Length          0000 (0)\n-F11FE Comment Length        0000 (0)\n-F1200 Disk Start            0000 (0)\n-F1202 Int File Attributes   0000 (0)\n+F1E59 Compression Method    0000 (0) 'Stored'\n+F1E5B Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F1E5F CRC                   00000000 (0)\n+F1E63 Compressed Size       00000000 (0)\n+F1E67 Uncompressed Size     00000000 (0)\n+F1E6B Filename Length       0076 (118)\n+F1E6D Extra Length          0000 (0)\n+F1E6F Comment Length        0000 (0)\n+F1E71 Disk Start            0000 (0)\n+F1E73 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F1204 Ext File Attributes   41ED0010 (1106051088)\n+F1E75 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F1208 Local Header Offset   00004D22 (19746)\n-F120C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F1E79 Local Header Offset   00004D22 (19746)\n+F1E7D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF120C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF1E7D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF120C: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF1E7D: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF11E4: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF1E55: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F1282 CENTRAL HEADER #185   02014B50 (33639248)\n-F1286 Created Zip Spec      14 (20) '2.0'\n-F1287 Created OS            03 (3) 'Unix'\n-F1288 Extract Zip Spec      0A (10) '1.0'\n-F1289 Extract OS            00 (0) 'MS-DOS'\n-F128A General Purpose Flag  0800 (2048)\n+F1EF3 CENTRAL HEADER #185   02014B50 (33639248)\n+F1EF7 Created Zip Spec      14 (20) '2.0'\n+F1EF8 Created OS            03 (3) 'Unix'\n+F1EF9 Extract Zip Spec      0A (10) '1.0'\n+F1EFA Extract OS            00 (0) 'MS-DOS'\n+F1EFB General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F128C Compression Method    0000 (0) 'Stored'\n-F128E Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F1292 CRC                   00000000 (0)\n-F1296 Compressed Size       00000000 (0)\n-F129A Uncompressed Size     00000000 (0)\n-F129E Filename Length       0061 (97)\n-F12A0 Extra Length          0000 (0)\n-F12A2 Comment Length        0000 (0)\n-F12A4 Disk Start            0000 (0)\n-F12A6 Int File Attributes   0000 (0)\n+F1EFD Compression Method    0000 (0) 'Stored'\n+F1EFF Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F1F03 CRC                   00000000 (0)\n+F1F07 Compressed Size       00000000 (0)\n+F1F0B Uncompressed Size     00000000 (0)\n+F1F0F Filename Length       0061 (97)\n+F1F11 Extra Length          0000 (0)\n+F1F13 Comment Length        0000 (0)\n+F1F15 Disk Start            0000 (0)\n+F1F17 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F12A8 Ext File Attributes   41ED0010 (1106051088)\n+F1F19 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F12AC Local Header Offset   00004DB6 (19894)\n-F12B0 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F1F1D Local Header Offset   00004DB6 (19894)\n+F1F21 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF12B0: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF1F21: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF12B0: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF1F21: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF1288: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF1EF9: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F1311 CENTRAL HEADER #186   02014B50 (33639248)\n-F1315 Created Zip Spec      14 (20) '2.0'\n-F1316 Created OS            03 (3) 'Unix'\n-F1317 Extract Zip Spec      0A (10) '1.0'\n-F1318 Extract OS            00 (0) 'MS-DOS'\n-F1319 General Purpose Flag  0800 (2048)\n+F1F82 CENTRAL HEADER #186   02014B50 (33639248)\n+F1F86 Created Zip Spec      14 (20) '2.0'\n+F1F87 Created OS            03 (3) 'Unix'\n+F1F88 Extract Zip Spec      0A (10) '1.0'\n+F1F89 Extract OS            00 (0) 'MS-DOS'\n+F1F8A General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F131B Compression Method    0000 (0) 'Stored'\n-F131D Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F1321 CRC                   00000000 (0)\n-F1325 Compressed Size       00000000 (0)\n-F1329 Uncompressed Size     00000000 (0)\n-F132D Filename Length       006A (106)\n-F132F Extra Length          0000 (0)\n-F1331 Comment Length        0000 (0)\n-F1333 Disk Start            0000 (0)\n-F1335 Int File Attributes   0000 (0)\n+F1F8C Compression Method    0000 (0) 'Stored'\n+F1F8E Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F1F92 CRC                   00000000 (0)\n+F1F96 Compressed Size       00000000 (0)\n+F1F9A Uncompressed Size     00000000 (0)\n+F1F9E Filename Length       006A (106)\n+F1FA0 Extra Length          0000 (0)\n+F1FA2 Comment Length        0000 (0)\n+F1FA4 Disk Start            0000 (0)\n+F1FA6 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F1337 Ext File Attributes   41ED0010 (1106051088)\n+F1FA8 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F133B Local Header Offset   00004E35 (20021)\n-F133F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F1FAC Local Header Offset   00004E35 (20021)\n+F1FB0 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF133F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF1FB0: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF133F: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF1FB0: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF1317: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF1F88: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F13A9 CENTRAL HEADER #187   02014B50 (33639248)\n-F13AD Created Zip Spec      14 (20) '2.0'\n-F13AE Created OS            03 (3) 'Unix'\n-F13AF Extract Zip Spec      0A (10) '1.0'\n-F13B0 Extract OS            00 (0) 'MS-DOS'\n-F13B1 General Purpose Flag  0800 (2048)\n+F201A CENTRAL HEADER #187   02014B50 (33639248)\n+F201E Created Zip Spec      14 (20) '2.0'\n+F201F Created OS            03 (3) 'Unix'\n+F2020 Extract Zip Spec      0A (10) '1.0'\n+F2021 Extract OS            00 (0) 'MS-DOS'\n+F2022 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F13B3 Compression Method    0000 (0) 'Stored'\n-F13B5 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F13B9 CRC                   00000000 (0)\n-F13BD Compressed Size       00000000 (0)\n-F13C1 Uncompressed Size     00000000 (0)\n-F13C5 Filename Length       0067 (103)\n-F13C7 Extra Length          0000 (0)\n-F13C9 Comment Length        0000 (0)\n-F13CB Disk Start            0000 (0)\n-F13CD Int File Attributes   0000 (0)\n+F2024 Compression Method    0000 (0) 'Stored'\n+F2026 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F202A CRC                   00000000 (0)\n+F202E Compressed Size       00000000 (0)\n+F2032 Uncompressed Size     00000000 (0)\n+F2036 Filename Length       0067 (103)\n+F2038 Extra Length          0000 (0)\n+F203A Comment Length        0000 (0)\n+F203C Disk Start            0000 (0)\n+F203E Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F13CF Ext File Attributes   41ED0010 (1106051088)\n+F2040 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F13D3 Local Header Offset   00004EBD (20157)\n-F13D7 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F2044 Local Header Offset   00004EBD (20157)\n+F2048 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF13D7: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF2048: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF13D7: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF2048: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF13AF: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF2020: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F143E CENTRAL HEADER #188   02014B50 (33639248)\n-F1442 Created Zip Spec      14 (20) '2.0'\n-F1443 Created OS            03 (3) 'Unix'\n-F1444 Extract Zip Spec      0A (10) '1.0'\n-F1445 Extract OS            00 (0) 'MS-DOS'\n-F1446 General Purpose Flag  0800 (2048)\n+F20AF CENTRAL HEADER #188   02014B50 (33639248)\n+F20B3 Created Zip Spec      14 (20) '2.0'\n+F20B4 Created OS            03 (3) 'Unix'\n+F20B5 Extract Zip Spec      0A (10) '1.0'\n+F20B6 Extract OS            00 (0) 'MS-DOS'\n+F20B7 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F1448 Compression Method    0000 (0) 'Stored'\n-F144A Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F144E CRC                   00000000 (0)\n-F1452 Compressed Size       00000000 (0)\n-F1456 Uncompressed Size     00000000 (0)\n-F145A Filename Length       0029 (41)\n-F145C Extra Length          0000 (0)\n-F145E Comment Length        0000 (0)\n-F1460 Disk Start            0000 (0)\n-F1462 Int File Attributes   0000 (0)\n+F20B9 Compression Method    0000 (0) 'Stored'\n+F20BB Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F20BF CRC                   00000000 (0)\n+F20C3 Compressed Size       00000000 (0)\n+F20C7 Uncompressed Size     00000000 (0)\n+F20CB Filename Length       0029 (41)\n+F20CD Extra Length          0000 (0)\n+F20CF Comment Length        0000 (0)\n+F20D1 Disk Start            0000 (0)\n+F20D3 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F1464 Ext File Attributes   41ED0010 (1106051088)\n+F20D5 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F1468 Local Header Offset   00004F42 (20290)\n-F146C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F20D9 Local Header Offset   00004F42 (20290)\n+F20DD Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF146C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF20DD: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF146C: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF20DD: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF1444: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF20B5: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F1495 CENTRAL HEADER #189   02014B50 (33639248)\n-F1499 Created Zip Spec      14 (20) '2.0'\n-F149A Created OS            03 (3) 'Unix'\n-F149B Extract Zip Spec      0A (10) '1.0'\n-F149C Extract OS            00 (0) 'MS-DOS'\n-F149D General Purpose Flag  0800 (2048)\n+F2106 CENTRAL HEADER #189   02014B50 (33639248)\n+F210A Created Zip Spec      14 (20) '2.0'\n+F210B Created OS            03 (3) 'Unix'\n+F210C Extract Zip Spec      0A (10) '1.0'\n+F210D Extract OS            00 (0) 'MS-DOS'\n+F210E General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F149F Compression Method    0000 (0) 'Stored'\n-F14A1 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F14A5 CRC                   00000000 (0)\n-F14A9 Compressed Size       00000000 (0)\n-F14AD Uncompressed Size     00000000 (0)\n-F14B1 Filename Length       0030 (48)\n-F14B3 Extra Length          0000 (0)\n-F14B5 Comment Length        0000 (0)\n-F14B7 Disk Start            0000 (0)\n-F14B9 Int File Attributes   0000 (0)\n+F2110 Compression Method    0000 (0) 'Stored'\n+F2112 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F2116 CRC                   00000000 (0)\n+F211A Compressed Size       00000000 (0)\n+F211E Uncompressed Size     00000000 (0)\n+F2122 Filename Length       0030 (48)\n+F2124 Extra Length          0000 (0)\n+F2126 Comment Length        0000 (0)\n+F2128 Disk Start            0000 (0)\n+F212A Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F14BB Ext File Attributes   41ED0010 (1106051088)\n+F212C Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F14BF Local Header Offset   00004F89 (20361)\n-F14C3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F2130 Local Header Offset   00004F89 (20361)\n+F2134 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF14C3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF2134: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF14C3: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF2134: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF149B: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF210C: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F14F3 CENTRAL HEADER #190   02014B50 (33639248)\n-F14F7 Created Zip Spec      14 (20) '2.0'\n-F14F8 Created OS            03 (3) 'Unix'\n-F14F9 Extract Zip Spec      0A (10) '1.0'\n-F14FA Extract OS            00 (0) 'MS-DOS'\n-F14FB General Purpose Flag  0800 (2048)\n+F2164 CENTRAL HEADER #190   02014B50 (33639248)\n+F2168 Created Zip Spec      14 (20) '2.0'\n+F2169 Created OS            03 (3) 'Unix'\n+F216A Extract Zip Spec      0A (10) '1.0'\n+F216B Extract OS            00 (0) 'MS-DOS'\n+F216C General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F14FD Compression Method    0000 (0) 'Stored'\n-F14FF Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F1503 CRC                   00000000 (0)\n-F1507 Compressed Size       00000000 (0)\n-F150B Uncompressed Size     00000000 (0)\n-F150F Filename Length       006A (106)\n-F1511 Extra Length          0000 (0)\n-F1513 Comment Length        0000 (0)\n-F1515 Disk Start            0000 (0)\n-F1517 Int File Attributes   0000 (0)\n+F216E Compression Method    0000 (0) 'Stored'\n+F2170 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F2174 CRC                   00000000 (0)\n+F2178 Compressed Size       00000000 (0)\n+F217C Uncompressed Size     00000000 (0)\n+F2180 Filename Length       006A (106)\n+F2182 Extra Length          0000 (0)\n+F2184 Comment Length        0000 (0)\n+F2186 Disk Start            0000 (0)\n+F2188 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F1519 Ext File Attributes   41ED0010 (1106051088)\n+F218A Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F151D Local Header Offset   00004FD7 (20439)\n-F1521 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F218E Local Header Offset   00004FD7 (20439)\n+F2192 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF1521: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF2192: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF1521: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF2192: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF14F9: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF216A: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F158B CENTRAL HEADER #191   02014B50 (33639248)\n-F158F Created Zip Spec      14 (20) '2.0'\n-F1590 Created OS            03 (3) 'Unix'\n-F1591 Extract Zip Spec      0A (10) '1.0'\n-F1592 Extract OS            00 (0) 'MS-DOS'\n-F1593 General Purpose Flag  0800 (2048)\n+F21FC CENTRAL HEADER #191   02014B50 (33639248)\n+F2200 Created Zip Spec      14 (20) '2.0'\n+F2201 Created OS            03 (3) 'Unix'\n+F2202 Extract Zip Spec      0A (10) '1.0'\n+F2203 Extract OS            00 (0) 'MS-DOS'\n+F2204 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F1595 Compression Method    0000 (0) 'Stored'\n-F1597 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F159B CRC                   00000000 (0)\n-F159F Compressed Size       00000000 (0)\n-F15A3 Uncompressed Size     00000000 (0)\n-F15A7 Filename Length       006C (108)\n-F15A9 Extra Length          0000 (0)\n-F15AB Comment Length        0000 (0)\n-F15AD Disk Start            0000 (0)\n-F15AF Int File Attributes   0000 (0)\n+F2206 Compression Method    0000 (0) 'Stored'\n+F2208 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F220C CRC                   00000000 (0)\n+F2210 Compressed Size       00000000 (0)\n+F2214 Uncompressed Size     00000000 (0)\n+F2218 Filename Length       006C (108)\n+F221A Extra Length          0000 (0)\n+F221C Comment Length        0000 (0)\n+F221E Disk Start            0000 (0)\n+F2220 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F15B1 Ext File Attributes   41ED0010 (1106051088)\n+F2222 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F15B5 Local Header Offset   0000505F (20575)\n-F15B9 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F2226 Local Header Offset   0000505F (20575)\n+F222A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF15B9: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF222A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF15B9: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF222A: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF1591: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF2202: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F1625 CENTRAL HEADER #192   02014B50 (33639248)\n-F1629 Created Zip Spec      14 (20) '2.0'\n-F162A Created OS            03 (3) 'Unix'\n-F162B Extract Zip Spec      0A (10) '1.0'\n-F162C Extract OS            00 (0) 'MS-DOS'\n-F162D General Purpose Flag  0800 (2048)\n+F2296 CENTRAL HEADER #192   02014B50 (33639248)\n+F229A Created Zip Spec      14 (20) '2.0'\n+F229B Created OS            03 (3) 'Unix'\n+F229C Extract Zip Spec      0A (10) '1.0'\n+F229D Extract OS            00 (0) 'MS-DOS'\n+F229E General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F162F Compression Method    0000 (0) 'Stored'\n-F1631 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F1635 CRC                   00000000 (0)\n-F1639 Compressed Size       00000000 (0)\n-F163D Uncompressed Size     00000000 (0)\n-F1641 Filename Length       0028 (40)\n-F1643 Extra Length          0000 (0)\n-F1645 Comment Length        0000 (0)\n-F1647 Disk Start            0000 (0)\n-F1649 Int File Attributes   0000 (0)\n+F22A0 Compression Method    0000 (0) 'Stored'\n+F22A2 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F22A6 CRC                   00000000 (0)\n+F22AA Compressed Size       00000000 (0)\n+F22AE Uncompressed Size     00000000 (0)\n+F22B2 Filename Length       0028 (40)\n+F22B4 Extra Length          0000 (0)\n+F22B6 Comment Length        0000 (0)\n+F22B8 Disk Start            0000 (0)\n+F22BA Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F164B Ext File Attributes   41ED0010 (1106051088)\n+F22BC Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F164F Local Header Offset   000050E9 (20713)\n-F1653 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F22C0 Local Header Offset   000050E9 (20713)\n+F22C4 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF1653: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF22C4: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF1653: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF22C4: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF162B: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF229C: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F167B CENTRAL HEADER #193   02014B50 (33639248)\n-F167F Created Zip Spec      14 (20) '2.0'\n-F1680 Created OS            03 (3) 'Unix'\n-F1681 Extract Zip Spec      0A (10) '1.0'\n-F1682 Extract OS            00 (0) 'MS-DOS'\n-F1683 General Purpose Flag  0800 (2048)\n+F22EC CENTRAL HEADER #193   02014B50 (33639248)\n+F22F0 Created Zip Spec      14 (20) '2.0'\n+F22F1 Created OS            03 (3) 'Unix'\n+F22F2 Extract Zip Spec      0A (10) '1.0'\n+F22F3 Extract OS            00 (0) 'MS-DOS'\n+F22F4 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F1685 Compression Method    0000 (0) 'Stored'\n-F1687 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F168B CRC                   00000000 (0)\n-F168F Compressed Size       00000000 (0)\n-F1693 Uncompressed Size     00000000 (0)\n-F1697 Filename Length       002F (47)\n-F1699 Extra Length          0000 (0)\n-F169B Comment Length        0000 (0)\n-F169D Disk Start            0000 (0)\n-F169F Int File Attributes   0000 (0)\n+F22F6 Compression Method    0000 (0) 'Stored'\n+F22F8 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F22FC CRC                   00000000 (0)\n+F2300 Compressed Size       00000000 (0)\n+F2304 Uncompressed Size     00000000 (0)\n+F2308 Filename Length       002F (47)\n+F230A Extra Length          0000 (0)\n+F230C Comment Length        0000 (0)\n+F230E Disk Start            0000 (0)\n+F2310 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F16A1 Ext File Attributes   41ED0010 (1106051088)\n+F2312 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F16A5 Local Header Offset   0000512F (20783)\n-F16A9 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F2316 Local Header Offset   0000512F (20783)\n+F231A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF16A9: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF231A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF16A9: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF231A: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF1681: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF22F2: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F16D8 CENTRAL HEADER #194   02014B50 (33639248)\n-F16DC Created Zip Spec      14 (20) '2.0'\n-F16DD Created OS            03 (3) 'Unix'\n-F16DE Extract Zip Spec      0A (10) '1.0'\n-F16DF Extract OS            00 (0) 'MS-DOS'\n-F16E0 General Purpose Flag  0800 (2048)\n+F2349 CENTRAL HEADER #194   02014B50 (33639248)\n+F234D Created Zip Spec      14 (20) '2.0'\n+F234E Created OS            03 (3) 'Unix'\n+F234F Extract Zip Spec      0A (10) '1.0'\n+F2350 Extract OS            00 (0) 'MS-DOS'\n+F2351 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F16E2 Compression Method    0000 (0) 'Stored'\n-F16E4 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F16E8 CRC                   00000000 (0)\n-F16EC Compressed Size       00000000 (0)\n-F16F0 Uncompressed Size     00000000 (0)\n-F16F4 Filename Length       005F (95)\n-F16F6 Extra Length          0000 (0)\n-F16F8 Comment Length        0000 (0)\n-F16FA Disk Start            0000 (0)\n-F16FC Int File Attributes   0000 (0)\n+F2353 Compression Method    0000 (0) 'Stored'\n+F2355 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F2359 CRC                   00000000 (0)\n+F235D Compressed Size       00000000 (0)\n+F2361 Uncompressed Size     00000000 (0)\n+F2365 Filename Length       005F (95)\n+F2367 Extra Length          0000 (0)\n+F2369 Comment Length        0000 (0)\n+F236B Disk Start            0000 (0)\n+F236D Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F16FE Ext File Attributes   41ED0010 (1106051088)\n+F236F Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F1702 Local Header Offset   0000517C (20860)\n-F1706 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F2373 Local Header Offset   0000517C (20860)\n+F2377 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF1706: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF2377: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF1706: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF2377: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF16DE: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF234F: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F1765 CENTRAL HEADER #195   02014B50 (33639248)\n-F1769 Created Zip Spec      14 (20) '2.0'\n-F176A Created OS            03 (3) 'Unix'\n-F176B Extract Zip Spec      0A (10) '1.0'\n-F176C Extract OS            00 (0) 'MS-DOS'\n-F176D General Purpose Flag  0800 (2048)\n+F23D6 CENTRAL HEADER #195   02014B50 (33639248)\n+F23DA Created Zip Spec      14 (20) '2.0'\n+F23DB Created OS            03 (3) 'Unix'\n+F23DC Extract Zip Spec      0A (10) '1.0'\n+F23DD Extract OS            00 (0) 'MS-DOS'\n+F23DE General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F176F Compression Method    0000 (0) 'Stored'\n-F1771 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F1775 CRC                   00000000 (0)\n-F1779 Compressed Size       00000000 (0)\n-F177D Uncompressed Size     00000000 (0)\n-F1781 Filename Length       0066 (102)\n-F1783 Extra Length          0000 (0)\n-F1785 Comment Length        0000 (0)\n-F1787 Disk Start            0000 (0)\n-F1789 Int File Attributes   0000 (0)\n+F23E0 Compression Method    0000 (0) 'Stored'\n+F23E2 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F23E6 CRC                   00000000 (0)\n+F23EA Compressed Size       00000000 (0)\n+F23EE Uncompressed Size     00000000 (0)\n+F23F2 Filename Length       0066 (102)\n+F23F4 Extra Length          0000 (0)\n+F23F6 Comment Length        0000 (0)\n+F23F8 Disk Start            0000 (0)\n+F23FA Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F178B Ext File Attributes   41ED0010 (1106051088)\n+F23FC Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F178F Local Header Offset   000051F9 (20985)\n-F1793 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F2400 Local Header Offset   000051F9 (20985)\n+F2404 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF1793: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF2404: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF1793: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF2404: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF176B: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF23DC: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F17F9 CENTRAL HEADER #196   02014B50 (33639248)\n-F17FD Created Zip Spec      14 (20) '2.0'\n-F17FE Created OS            03 (3) 'Unix'\n-F17FF Extract Zip Spec      0A (10) '1.0'\n-F1800 Extract OS            00 (0) 'MS-DOS'\n-F1801 General Purpose Flag  0800 (2048)\n+F246A CENTRAL HEADER #196   02014B50 (33639248)\n+F246E Created Zip Spec      14 (20) '2.0'\n+F246F Created OS            03 (3) 'Unix'\n+F2470 Extract Zip Spec      0A (10) '1.0'\n+F2471 Extract OS            00 (0) 'MS-DOS'\n+F2472 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F1803 Compression Method    0000 (0) 'Stored'\n-F1805 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F1809 CRC                   00000000 (0)\n-F180D Compressed Size       00000000 (0)\n-F1811 Uncompressed Size     00000000 (0)\n-F1815 Filename Length       0069 (105)\n-F1817 Extra Length          0000 (0)\n-F1819 Comment Length        0000 (0)\n-F181B Disk Start            0000 (0)\n-F181D Int File Attributes   0000 (0)\n+F2474 Compression Method    0000 (0) 'Stored'\n+F2476 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F247A CRC                   00000000 (0)\n+F247E Compressed Size       00000000 (0)\n+F2482 Uncompressed Size     00000000 (0)\n+F2486 Filename Length       0069 (105)\n+F2488 Extra Length          0000 (0)\n+F248A Comment Length        0000 (0)\n+F248C Disk Start            0000 (0)\n+F248E Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F181F Ext File Attributes   41ED0010 (1106051088)\n+F2490 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F1823 Local Header Offset   0000527D (21117)\n-F1827 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F2494 Local Header Offset   0000527D (21117)\n+F2498 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF1827: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF2498: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF1827: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF2498: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF17FF: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF2470: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F1890 CENTRAL HEADER #197   02014B50 (33639248)\n-F1894 Created Zip Spec      14 (20) '2.0'\n-F1895 Created OS            03 (3) 'Unix'\n-F1896 Extract Zip Spec      0A (10) '1.0'\n-F1897 Extract OS            00 (0) 'MS-DOS'\n-F1898 General Purpose Flag  0800 (2048)\n+F2501 CENTRAL HEADER #197   02014B50 (33639248)\n+F2505 Created Zip Spec      14 (20) '2.0'\n+F2506 Created OS            03 (3) 'Unix'\n+F2507 Extract Zip Spec      0A (10) '1.0'\n+F2508 Extract OS            00 (0) 'MS-DOS'\n+F2509 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F189A Compression Method    0000 (0) 'Stored'\n-F189C Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F18A0 CRC                   00000000 (0)\n-F18A4 Compressed Size       00000000 (0)\n-F18A8 Uncompressed Size     00000000 (0)\n-F18AC Filename Length       0069 (105)\n-F18AE Extra Length          0000 (0)\n-F18B0 Comment Length        0000 (0)\n-F18B2 Disk Start            0000 (0)\n-F18B4 Int File Attributes   0000 (0)\n+F250B Compression Method    0000 (0) 'Stored'\n+F250D Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F2511 CRC                   00000000 (0)\n+F2515 Compressed Size       00000000 (0)\n+F2519 Uncompressed Size     00000000 (0)\n+F251D Filename Length       0069 (105)\n+F251F Extra Length          0000 (0)\n+F2521 Comment Length        0000 (0)\n+F2523 Disk Start            0000 (0)\n+F2525 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F18B6 Ext File Attributes   41ED0010 (1106051088)\n+F2527 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F18BA Local Header Offset   00005304 (21252)\n-F18BE Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F252B Local Header Offset   00005304 (21252)\n+F252F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF18BE: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF252F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF18BE: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF252F: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF1896: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF2507: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F1927 CENTRAL HEADER #198   02014B50 (33639248)\n-F192B Created Zip Spec      14 (20) '2.0'\n-F192C Created OS            03 (3) 'Unix'\n-F192D Extract Zip Spec      0A (10) '1.0'\n-F192E Extract OS            00 (0) 'MS-DOS'\n-F192F General Purpose Flag  0800 (2048)\n+F2598 CENTRAL HEADER #198   02014B50 (33639248)\n+F259C Created Zip Spec      14 (20) '2.0'\n+F259D Created OS            03 (3) 'Unix'\n+F259E Extract Zip Spec      0A (10) '1.0'\n+F259F Extract OS            00 (0) 'MS-DOS'\n+F25A0 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F1931 Compression Method    0000 (0) 'Stored'\n-F1933 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F1937 CRC                   00000000 (0)\n-F193B Compressed Size       00000000 (0)\n-F193F Uncompressed Size     00000000 (0)\n-F1943 Filename Length       0068 (104)\n-F1945 Extra Length          0000 (0)\n-F1947 Comment Length        0000 (0)\n-F1949 Disk Start            0000 (0)\n-F194B Int File Attributes   0000 (0)\n+F25A2 Compression Method    0000 (0) 'Stored'\n+F25A4 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F25A8 CRC                   00000000 (0)\n+F25AC Compressed Size       00000000 (0)\n+F25B0 Uncompressed Size     00000000 (0)\n+F25B4 Filename Length       0068 (104)\n+F25B6 Extra Length          0000 (0)\n+F25B8 Comment Length        0000 (0)\n+F25BA Disk Start            0000 (0)\n+F25BC Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F194D Ext File Attributes   41ED0010 (1106051088)\n+F25BE Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F1951 Local Header Offset   0000538B (21387)\n-F1955 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F25C2 Local Header Offset   0000538B (21387)\n+F25C6 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF1955: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF25C6: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF1955: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF25C6: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF192D: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF259E: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F19BD CENTRAL HEADER #199   02014B50 (33639248)\n-F19C1 Created Zip Spec      14 (20) '2.0'\n-F19C2 Created OS            03 (3) 'Unix'\n-F19C3 Extract Zip Spec      0A (10) '1.0'\n-F19C4 Extract OS            00 (0) 'MS-DOS'\n-F19C5 General Purpose Flag  0800 (2048)\n+F262E CENTRAL HEADER #199   02014B50 (33639248)\n+F2632 Created Zip Spec      14 (20) '2.0'\n+F2633 Created OS            03 (3) 'Unix'\n+F2634 Extract Zip Spec      0A (10) '1.0'\n+F2635 Extract OS            00 (0) 'MS-DOS'\n+F2636 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F19C7 Compression Method    0000 (0) 'Stored'\n-F19C9 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F19CD CRC                   00000000 (0)\n-F19D1 Compressed Size       00000000 (0)\n-F19D5 Uncompressed Size     00000000 (0)\n-F19D9 Filename Length       0026 (38)\n-F19DB Extra Length          0000 (0)\n-F19DD Comment Length        0000 (0)\n-F19DF Disk Start            0000 (0)\n-F19E1 Int File Attributes   0000 (0)\n+F2638 Compression Method    0000 (0) 'Stored'\n+F263A Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F263E CRC                   00000000 (0)\n+F2642 Compressed Size       00000000 (0)\n+F2646 Uncompressed Size     00000000 (0)\n+F264A Filename Length       0026 (38)\n+F264C Extra Length          0000 (0)\n+F264E Comment Length        0000 (0)\n+F2650 Disk Start            0000 (0)\n+F2652 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F19E3 Ext File Attributes   41ED0010 (1106051088)\n+F2654 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F19E7 Local Header Offset   00005411 (21521)\n-F19EB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F2658 Local Header Offset   00005411 (21521)\n+F265C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF19EB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF265C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF19EB: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF265C: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF19C3: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF2634: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F1A11 CENTRAL HEADER #200   02014B50 (33639248)\n-F1A15 Created Zip Spec      14 (20) '2.0'\n-F1A16 Created OS            03 (3) 'Unix'\n-F1A17 Extract Zip Spec      0A (10) '1.0'\n-F1A18 Extract OS            00 (0) 'MS-DOS'\n-F1A19 General Purpose Flag  0800 (2048)\n+F2682 CENTRAL HEADER #200   02014B50 (33639248)\n+F2686 Created Zip Spec      14 (20) '2.0'\n+F2687 Created OS            03 (3) 'Unix'\n+F2688 Extract Zip Spec      0A (10) '1.0'\n+F2689 Extract OS            00 (0) 'MS-DOS'\n+F268A General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F1A1B Compression Method    0000 (0) 'Stored'\n-F1A1D Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F1A21 CRC                   00000000 (0)\n-F1A25 Compressed Size       00000000 (0)\n-F1A29 Uncompressed Size     00000000 (0)\n-F1A2D Filename Length       002D (45)\n-F1A2F Extra Length          0000 (0)\n-F1A31 Comment Length        0000 (0)\n-F1A33 Disk Start            0000 (0)\n-F1A35 Int File Attributes   0000 (0)\n+F268C Compression Method    0000 (0) 'Stored'\n+F268E Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F2692 CRC                   00000000 (0)\n+F2696 Compressed Size       00000000 (0)\n+F269A Uncompressed Size     00000000 (0)\n+F269E Filename Length       002D (45)\n+F26A0 Extra Length          0000 (0)\n+F26A2 Comment Length        0000 (0)\n+F26A4 Disk Start            0000 (0)\n+F26A6 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F1A37 Ext File Attributes   41ED0010 (1106051088)\n+F26A8 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F1A3B Local Header Offset   00005455 (21589)\n-F1A3F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F26AC Local Header Offset   00005455 (21589)\n+F26B0 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF1A3F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF26B0: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF1A3F: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF26B0: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF1A17: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF2688: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F1A6C CENTRAL HEADER #201   02014B50 (33639248)\n-F1A70 Created Zip Spec      14 (20) '2.0'\n-F1A71 Created OS            03 (3) 'Unix'\n-F1A72 Extract Zip Spec      0A (10) '1.0'\n-F1A73 Extract OS            00 (0) 'MS-DOS'\n-F1A74 General Purpose Flag  0800 (2048)\n+F26DD CENTRAL HEADER #201   02014B50 (33639248)\n+F26E1 Created Zip Spec      14 (20) '2.0'\n+F26E2 Created OS            03 (3) 'Unix'\n+F26E3 Extract Zip Spec      0A (10) '1.0'\n+F26E4 Extract OS            00 (0) 'MS-DOS'\n+F26E5 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F1A76 Compression Method    0000 (0) 'Stored'\n-F1A78 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F1A7C CRC                   00000000 (0)\n-F1A80 Compressed Size       00000000 (0)\n-F1A84 Uncompressed Size     00000000 (0)\n-F1A88 Filename Length       005B (91)\n-F1A8A Extra Length          0000 (0)\n-F1A8C Comment Length        0000 (0)\n-F1A8E Disk Start            0000 (0)\n-F1A90 Int File Attributes   0000 (0)\n+F26E7 Compression Method    0000 (0) 'Stored'\n+F26E9 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F26ED CRC                   00000000 (0)\n+F26F1 Compressed Size       00000000 (0)\n+F26F5 Uncompressed Size     00000000 (0)\n+F26F9 Filename Length       005B (91)\n+F26FB Extra Length          0000 (0)\n+F26FD Comment Length        0000 (0)\n+F26FF Disk Start            0000 (0)\n+F2701 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F1A92 Ext File Attributes   41ED0010 (1106051088)\n+F2703 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F1A96 Local Header Offset   000054A0 (21664)\n-F1A9A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F2707 Local Header Offset   000054A0 (21664)\n+F270B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF1A9A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF270B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF1A9A: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF270B: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF1A72: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF26E3: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F1AF5 CENTRAL HEADER #202   02014B50 (33639248)\n-F1AF9 Created Zip Spec      14 (20) '2.0'\n-F1AFA Created OS            03 (3) 'Unix'\n-F1AFB Extract Zip Spec      0A (10) '1.0'\n-F1AFC Extract OS            00 (0) 'MS-DOS'\n-F1AFD General Purpose Flag  0800 (2048)\n+F2766 CENTRAL HEADER #202   02014B50 (33639248)\n+F276A Created Zip Spec      14 (20) '2.0'\n+F276B Created OS            03 (3) 'Unix'\n+F276C Extract Zip Spec      0A (10) '1.0'\n+F276D Extract OS            00 (0) 'MS-DOS'\n+F276E General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F1AFF Compression Method    0000 (0) 'Stored'\n-F1B01 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F1B05 CRC                   00000000 (0)\n-F1B09 Compressed Size       00000000 (0)\n-F1B0D Uncompressed Size     00000000 (0)\n-F1B11 Filename Length       0035 (53)\n-F1B13 Extra Length          0000 (0)\n-F1B15 Comment Length        0000 (0)\n-F1B17 Disk Start            0000 (0)\n-F1B19 Int File Attributes   0000 (0)\n+F2770 Compression Method    0000 (0) 'Stored'\n+F2772 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F2776 CRC                   00000000 (0)\n+F277A Compressed Size       00000000 (0)\n+F277E Uncompressed Size     00000000 (0)\n+F2782 Filename Length       0035 (53)\n+F2784 Extra Length          0000 (0)\n+F2786 Comment Length        0000 (0)\n+F2788 Disk Start            0000 (0)\n+F278A Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F1B1B Ext File Attributes   41ED0010 (1106051088)\n+F278C Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F1B1F Local Header Offset   00005519 (21785)\n-F1B23 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F2790 Local Header Offset   00005519 (21785)\n+F2794 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF1B23: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF2794: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF1B23: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF2794: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF1AFB: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF276C: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F1B58 CENTRAL HEADER #203   02014B50 (33639248)\n-F1B5C Created Zip Spec      14 (20) '2.0'\n-F1B5D Created OS            03 (3) 'Unix'\n-F1B5E Extract Zip Spec      0A (10) '1.0'\n-F1B5F Extract OS            00 (0) 'MS-DOS'\n-F1B60 General Purpose Flag  0800 (2048)\n+F27C9 CENTRAL HEADER #203   02014B50 (33639248)\n+F27CD Created Zip Spec      14 (20) '2.0'\n+F27CE Created OS            03 (3) 'Unix'\n+F27CF Extract Zip Spec      0A (10) '1.0'\n+F27D0 Extract OS            00 (0) 'MS-DOS'\n+F27D1 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F1B62 Compression Method    0000 (0) 'Stored'\n-F1B64 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F1B68 CRC                   00000000 (0)\n-F1B6C Compressed Size       00000000 (0)\n-F1B70 Uncompressed Size     00000000 (0)\n-F1B74 Filename Length       003C (60)\n-F1B76 Extra Length          0000 (0)\n-F1B78 Comment Length        0000 (0)\n-F1B7A Disk Start            0000 (0)\n-F1B7C Int File Attributes   0000 (0)\n+F27D3 Compression Method    0000 (0) 'Stored'\n+F27D5 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F27D9 CRC                   00000000 (0)\n+F27DD Compressed Size       00000000 (0)\n+F27E1 Uncompressed Size     00000000 (0)\n+F27E5 Filename Length       003C (60)\n+F27E7 Extra Length          0000 (0)\n+F27E9 Comment Length        0000 (0)\n+F27EB Disk Start            0000 (0)\n+F27ED Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F1B7E Ext File Attributes   41ED0010 (1106051088)\n+F27EF Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F1B82 Local Header Offset   0000556C (21868)\n-F1B86 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F27F3 Local Header Offset   0000556C (21868)\n+F27F7 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF1B86: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF27F7: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF1B86: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF27F7: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF1B5E: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF27CF: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F1BC2 CENTRAL HEADER #204   02014B50 (33639248)\n-F1BC6 Created Zip Spec      14 (20) '2.0'\n-F1BC7 Created OS            03 (3) 'Unix'\n-F1BC8 Extract Zip Spec      0A (10) '1.0'\n-F1BC9 Extract OS            00 (0) 'MS-DOS'\n-F1BCA General Purpose Flag  0800 (2048)\n+F2833 CENTRAL HEADER #204   02014B50 (33639248)\n+F2837 Created Zip Spec      14 (20) '2.0'\n+F2838 Created OS            03 (3) 'Unix'\n+F2839 Extract Zip Spec      0A (10) '1.0'\n+F283A Extract OS            00 (0) 'MS-DOS'\n+F283B General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F1BCC Compression Method    0000 (0) 'Stored'\n-F1BCE Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F1BD2 CRC                   00000000 (0)\n-F1BD6 Compressed Size       00000000 (0)\n-F1BDA Uncompressed Size     00000000 (0)\n-F1BDE Filename Length       0076 (118)\n-F1BE0 Extra Length          0000 (0)\n-F1BE2 Comment Length        0000 (0)\n-F1BE4 Disk Start            0000 (0)\n-F1BE6 Int File Attributes   0000 (0)\n+F283D Compression Method    0000 (0) 'Stored'\n+F283F Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F2843 CRC                   00000000 (0)\n+F2847 Compressed Size       00000000 (0)\n+F284B Uncompressed Size     00000000 (0)\n+F284F Filename Length       0076 (118)\n+F2851 Extra Length          0000 (0)\n+F2853 Comment Length        0000 (0)\n+F2855 Disk Start            0000 (0)\n+F2857 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F1BE8 Ext File Attributes   41ED0010 (1106051088)\n+F2859 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F1BEC Local Header Offset   000055C6 (21958)\n-F1BF0 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F285D Local Header Offset   000055C6 (21958)\n+F2861 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF1BF0: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF2861: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF1BF0: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF2861: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF1BC8: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF2839: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F1C66 CENTRAL HEADER #205   02014B50 (33639248)\n-F1C6A Created Zip Spec      14 (20) '2.0'\n-F1C6B Created OS            03 (3) 'Unix'\n-F1C6C Extract Zip Spec      0A (10) '1.0'\n-F1C6D Extract OS            00 (0) 'MS-DOS'\n-F1C6E General Purpose Flag  0800 (2048)\n+F28D7 CENTRAL HEADER #205   02014B50 (33639248)\n+F28DB Created Zip Spec      14 (20) '2.0'\n+F28DC Created OS            03 (3) 'Unix'\n+F28DD Extract Zip Spec      0A (10) '1.0'\n+F28DE Extract OS            00 (0) 'MS-DOS'\n+F28DF General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F1C70 Compression Method    0000 (0) 'Stored'\n-F1C72 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F1C76 CRC                   00000000 (0)\n-F1C7A Compressed Size       00000000 (0)\n-F1C7E Uncompressed Size     00000000 (0)\n-F1C82 Filename Length       0075 (117)\n-F1C84 Extra Length          0000 (0)\n-F1C86 Comment Length        0000 (0)\n-F1C88 Disk Start            0000 (0)\n-F1C8A Int File Attributes   0000 (0)\n+F28E1 Compression Method    0000 (0) 'Stored'\n+F28E3 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F28E7 CRC                   00000000 (0)\n+F28EB Compressed Size       00000000 (0)\n+F28EF Uncompressed Size     00000000 (0)\n+F28F3 Filename Length       0075 (117)\n+F28F5 Extra Length          0000 (0)\n+F28F7 Comment Length        0000 (0)\n+F28F9 Disk Start            0000 (0)\n+F28FB Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F1C8C Ext File Attributes   41ED0010 (1106051088)\n+F28FD Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F1C90 Local Header Offset   0000565A (22106)\n-F1C94 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F2901 Local Header Offset   0000565A (22106)\n+F2905 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF1C94: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF2905: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF1C94: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF2905: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF1C6C: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF28DD: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F1D09 CENTRAL HEADER #206   02014B50 (33639248)\n-F1D0D Created Zip Spec      14 (20) '2.0'\n-F1D0E Created OS            03 (3) 'Unix'\n-F1D0F Extract Zip Spec      0A (10) '1.0'\n-F1D10 Extract OS            00 (0) 'MS-DOS'\n-F1D11 General Purpose Flag  0800 (2048)\n+F297A CENTRAL HEADER #206   02014B50 (33639248)\n+F297E Created Zip Spec      14 (20) '2.0'\n+F297F Created OS            03 (3) 'Unix'\n+F2980 Extract Zip Spec      0A (10) '1.0'\n+F2981 Extract OS            00 (0) 'MS-DOS'\n+F2982 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F1D13 Compression Method    0000 (0) 'Stored'\n-F1D15 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F1D19 CRC                   00000000 (0)\n-F1D1D Compressed Size       00000000 (0)\n-F1D21 Uncompressed Size     00000000 (0)\n-F1D25 Filename Length       0078 (120)\n-F1D27 Extra Length          0000 (0)\n-F1D29 Comment Length        0000 (0)\n-F1D2B Disk Start            0000 (0)\n-F1D2D Int File Attributes   0000 (0)\n+F2984 Compression Method    0000 (0) 'Stored'\n+F2986 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F298A CRC                   00000000 (0)\n+F298E Compressed Size       00000000 (0)\n+F2992 Uncompressed Size     00000000 (0)\n+F2996 Filename Length       0078 (120)\n+F2998 Extra Length          0000 (0)\n+F299A Comment Length        0000 (0)\n+F299C Disk Start            0000 (0)\n+F299E Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F1D2F Ext File Attributes   41ED0010 (1106051088)\n+F29A0 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F1D33 Local Header Offset   000056ED (22253)\n-F1D37 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F29A4 Local Header Offset   000056ED (22253)\n+F29A8 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF1D37: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF29A8: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF1D37: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF29A8: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF1D0F: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF2980: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F1DAF CENTRAL HEADER #207   02014B50 (33639248)\n-F1DB3 Created Zip Spec      14 (20) '2.0'\n-F1DB4 Created OS            03 (3) 'Unix'\n-F1DB5 Extract Zip Spec      0A (10) '1.0'\n-F1DB6 Extract OS            00 (0) 'MS-DOS'\n-F1DB7 General Purpose Flag  0800 (2048)\n+F2A20 CENTRAL HEADER #207   02014B50 (33639248)\n+F2A24 Created Zip Spec      14 (20) '2.0'\n+F2A25 Created OS            03 (3) 'Unix'\n+F2A26 Extract Zip Spec      0A (10) '1.0'\n+F2A27 Extract OS            00 (0) 'MS-DOS'\n+F2A28 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F1DB9 Compression Method    0000 (0) 'Stored'\n-F1DBB Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F1DBF CRC                   00000000 (0)\n-F1DC3 Compressed Size       00000000 (0)\n-F1DC7 Uncompressed Size     00000000 (0)\n-F1DCB Filename Length       0074 (116)\n-F1DCD Extra Length          0000 (0)\n-F1DCF Comment Length        0000 (0)\n-F1DD1 Disk Start            0000 (0)\n-F1DD3 Int File Attributes   0000 (0)\n+F2A2A Compression Method    0000 (0) 'Stored'\n+F2A2C Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F2A30 CRC                   00000000 (0)\n+F2A34 Compressed Size       00000000 (0)\n+F2A38 Uncompressed Size     00000000 (0)\n+F2A3C Filename Length       0074 (116)\n+F2A3E Extra Length          0000 (0)\n+F2A40 Comment Length        0000 (0)\n+F2A42 Disk Start            0000 (0)\n+F2A44 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F1DD5 Ext File Attributes   41ED0010 (1106051088)\n+F2A46 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F1DD9 Local Header Offset   00005783 (22403)\n-F1DDD Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F2A4A Local Header Offset   00005783 (22403)\n+F2A4E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF1DDD: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF2A4E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF1DDD: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF2A4E: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF1DB5: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF2A26: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F1E51 CENTRAL HEADER #208   02014B50 (33639248)\n-F1E55 Created Zip Spec      14 (20) '2.0'\n-F1E56 Created OS            03 (3) 'Unix'\n-F1E57 Extract Zip Spec      0A (10) '1.0'\n-F1E58 Extract OS            00 (0) 'MS-DOS'\n-F1E59 General Purpose Flag  0800 (2048)\n+F2AC2 CENTRAL HEADER #208   02014B50 (33639248)\n+F2AC6 Created Zip Spec      14 (20) '2.0'\n+F2AC7 Created OS            03 (3) 'Unix'\n+F2AC8 Extract Zip Spec      0A (10) '1.0'\n+F2AC9 Extract OS            00 (0) 'MS-DOS'\n+F2ACA General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F1E5B Compression Method    0000 (0) 'Stored'\n-F1E5D Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F1E61 CRC                   00000000 (0)\n-F1E65 Compressed Size       00000000 (0)\n-F1E69 Uncompressed Size     00000000 (0)\n-F1E6D Filename Length       0024 (36)\n-F1E6F Extra Length          0000 (0)\n-F1E71 Comment Length        0000 (0)\n-F1E73 Disk Start            0000 (0)\n-F1E75 Int File Attributes   0000 (0)\n+F2ACC Compression Method    0000 (0) 'Stored'\n+F2ACE Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F2AD2 CRC                   00000000 (0)\n+F2AD6 Compressed Size       00000000 (0)\n+F2ADA Uncompressed Size     00000000 (0)\n+F2ADE Filename Length       0024 (36)\n+F2AE0 Extra Length          0000 (0)\n+F2AE2 Comment Length        0000 (0)\n+F2AE4 Disk Start            0000 (0)\n+F2AE6 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F1E77 Ext File Attributes   41ED0010 (1106051088)\n+F2AE8 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F1E7B Local Header Offset   00005815 (22549)\n-F1E7F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F2AEC Local Header Offset   00005815 (22549)\n+F2AF0 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF1E7F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF2AF0: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF1E7F: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF2AF0: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF1E57: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF2AC8: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F1EA3 CENTRAL HEADER #209   02014B50 (33639248)\n-F1EA7 Created Zip Spec      14 (20) '2.0'\n-F1EA8 Created OS            03 (3) 'Unix'\n-F1EA9 Extract Zip Spec      0A (10) '1.0'\n-F1EAA Extract OS            00 (0) 'MS-DOS'\n-F1EAB General Purpose Flag  0800 (2048)\n+F2B14 CENTRAL HEADER #209   02014B50 (33639248)\n+F2B18 Created Zip Spec      14 (20) '2.0'\n+F2B19 Created OS            03 (3) 'Unix'\n+F2B1A Extract Zip Spec      0A (10) '1.0'\n+F2B1B Extract OS            00 (0) 'MS-DOS'\n+F2B1C General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F1EAD Compression Method    0000 (0) 'Stored'\n-F1EAF Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F1EB3 CRC                   00000000 (0)\n-F1EB7 Compressed Size       00000000 (0)\n-F1EBB Uncompressed Size     00000000 (0)\n-F1EBF Filename Length       002B (43)\n-F1EC1 Extra Length          0000 (0)\n-F1EC3 Comment Length        0000 (0)\n-F1EC5 Disk Start            0000 (0)\n-F1EC7 Int File Attributes   0000 (0)\n+F2B1E Compression Method    0000 (0) 'Stored'\n+F2B20 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F2B24 CRC                   00000000 (0)\n+F2B28 Compressed Size       00000000 (0)\n+F2B2C Uncompressed Size     00000000 (0)\n+F2B30 Filename Length       002B (43)\n+F2B32 Extra Length          0000 (0)\n+F2B34 Comment Length        0000 (0)\n+F2B36 Disk Start            0000 (0)\n+F2B38 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F1EC9 Ext File Attributes   41ED0010 (1106051088)\n+F2B3A Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F1ECD Local Header Offset   00005857 (22615)\n-F1ED1 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F2B3E Local Header Offset   00005857 (22615)\n+F2B42 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF1ED1: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF2B42: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF1ED1: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF2B42: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF1EA9: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF2B1A: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F1EFC CENTRAL HEADER #210   02014B50 (33639248)\n-F1F00 Created Zip Spec      14 (20) '2.0'\n-F1F01 Created OS            03 (3) 'Unix'\n-F1F02 Extract Zip Spec      0A (10) '1.0'\n-F1F03 Extract OS            00 (0) 'MS-DOS'\n-F1F04 General Purpose Flag  0800 (2048)\n+F2B6D CENTRAL HEADER #210   02014B50 (33639248)\n+F2B71 Created Zip Spec      14 (20) '2.0'\n+F2B72 Created OS            03 (3) 'Unix'\n+F2B73 Extract Zip Spec      0A (10) '1.0'\n+F2B74 Extract OS            00 (0) 'MS-DOS'\n+F2B75 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F1F06 Compression Method    0000 (0) 'Stored'\n-F1F08 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F1F0C CRC                   00000000 (0)\n-F1F10 Compressed Size       00000000 (0)\n-F1F14 Uncompressed Size     00000000 (0)\n-F1F18 Filename Length       0056 (86)\n-F1F1A Extra Length          0000 (0)\n-F1F1C Comment Length        0000 (0)\n-F1F1E Disk Start            0000 (0)\n-F1F20 Int File Attributes   0000 (0)\n+F2B77 Compression Method    0000 (0) 'Stored'\n+F2B79 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F2B7D CRC                   00000000 (0)\n+F2B81 Compressed Size       00000000 (0)\n+F2B85 Uncompressed Size     00000000 (0)\n+F2B89 Filename Length       0056 (86)\n+F2B8B Extra Length          0000 (0)\n+F2B8D Comment Length        0000 (0)\n+F2B8F Disk Start            0000 (0)\n+F2B91 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F1F22 Ext File Attributes   41ED0010 (1106051088)\n+F2B93 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F1F26 Local Header Offset   000058A0 (22688)\n-F1F2A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F2B97 Local Header Offset   000058A0 (22688)\n+F2B9B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF1F2A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF2B9B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF1F2A: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF2B9B: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF1F02: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF2B73: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F1F80 CENTRAL HEADER #211   02014B50 (33639248)\n-F1F84 Created Zip Spec      14 (20) '2.0'\n-F1F85 Created OS            03 (3) 'Unix'\n-F1F86 Extract Zip Spec      0A (10) '1.0'\n-F1F87 Extract OS            00 (0) 'MS-DOS'\n-F1F88 General Purpose Flag  0800 (2048)\n+F2BF1 CENTRAL HEADER #211   02014B50 (33639248)\n+F2BF5 Created Zip Spec      14 (20) '2.0'\n+F2BF6 Created OS            03 (3) 'Unix'\n+F2BF7 Extract Zip Spec      0A (10) '1.0'\n+F2BF8 Extract OS            00 (0) 'MS-DOS'\n+F2BF9 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F1F8A Compression Method    0000 (0) 'Stored'\n-F1F8C Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F1F90 CRC                   00000000 (0)\n-F1F94 Compressed Size       00000000 (0)\n-F1F98 Uncompressed Size     00000000 (0)\n-F1F9C Filename Length       0059 (89)\n-F1F9E Extra Length          0000 (0)\n-F1FA0 Comment Length        0000 (0)\n-F1FA2 Disk Start            0000 (0)\n-F1FA4 Int File Attributes   0000 (0)\n+F2BFB Compression Method    0000 (0) 'Stored'\n+F2BFD Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F2C01 CRC                   00000000 (0)\n+F2C05 Compressed Size       00000000 (0)\n+F2C09 Uncompressed Size     00000000 (0)\n+F2C0D Filename Length       0059 (89)\n+F2C0F Extra Length          0000 (0)\n+F2C11 Comment Length        0000 (0)\n+F2C13 Disk Start            0000 (0)\n+F2C15 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F1FA6 Ext File Attributes   41ED0010 (1106051088)\n+F2C17 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F1FAA Local Header Offset   00005914 (22804)\n-F1FAE Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F2C1B Local Header Offset   00005914 (22804)\n+F2C1F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF1FAE: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF2C1F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF1FAE: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF2C1F: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF1F86: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF2BF7: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F2007 CENTRAL HEADER #212   02014B50 (33639248)\n-F200B Created Zip Spec      14 (20) '2.0'\n-F200C Created OS            03 (3) 'Unix'\n-F200D Extract Zip Spec      0A (10) '1.0'\n-F200E Extract OS            00 (0) 'MS-DOS'\n-F200F General Purpose Flag  0800 (2048)\n+F2C78 CENTRAL HEADER #212   02014B50 (33639248)\n+F2C7C Created Zip Spec      14 (20) '2.0'\n+F2C7D Created OS            03 (3) 'Unix'\n+F2C7E Extract Zip Spec      0A (10) '1.0'\n+F2C7F Extract OS            00 (0) 'MS-DOS'\n+F2C80 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F2011 Compression Method    0000 (0) 'Stored'\n-F2013 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F2017 CRC                   00000000 (0)\n-F201B Compressed Size       00000000 (0)\n-F201F Uncompressed Size     00000000 (0)\n-F2023 Filename Length       0055 (85)\n-F2025 Extra Length          0000 (0)\n-F2027 Comment Length        0000 (0)\n-F2029 Disk Start            0000 (0)\n-F202B Int File Attributes   0000 (0)\n+F2C82 Compression Method    0000 (0) 'Stored'\n+F2C84 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F2C88 CRC                   00000000 (0)\n+F2C8C Compressed Size       00000000 (0)\n+F2C90 Uncompressed Size     00000000 (0)\n+F2C94 Filename Length       0055 (85)\n+F2C96 Extra Length          0000 (0)\n+F2C98 Comment Length        0000 (0)\n+F2C9A Disk Start            0000 (0)\n+F2C9C Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F202D Ext File Attributes   41ED0010 (1106051088)\n+F2C9E Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F2031 Local Header Offset   0000598B (22923)\n-F2035 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F2CA2 Local Header Offset   0000598B (22923)\n+F2CA6 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF2035: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF2CA6: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF2035: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF2CA6: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF200D: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF2C7E: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F208A CENTRAL HEADER #213   02014B50 (33639248)\n-F208E Created Zip Spec      14 (20) '2.0'\n-F208F Created OS            03 (3) 'Unix'\n-F2090 Extract Zip Spec      0A (10) '1.0'\n-F2091 Extract OS            00 (0) 'MS-DOS'\n-F2092 General Purpose Flag  0800 (2048)\n+F2CFB CENTRAL HEADER #213   02014B50 (33639248)\n+F2CFF Created Zip Spec      14 (20) '2.0'\n+F2D00 Created OS            03 (3) 'Unix'\n+F2D01 Extract Zip Spec      0A (10) '1.0'\n+F2D02 Extract OS            00 (0) 'MS-DOS'\n+F2D03 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F2094 Compression Method    0000 (0) 'Stored'\n-F2096 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F209A CRC                   00000000 (0)\n-F209E Compressed Size       00000000 (0)\n-F20A2 Uncompressed Size     00000000 (0)\n-F20A6 Filename Length       0023 (35)\n-F20A8 Extra Length          0000 (0)\n-F20AA Comment Length        0000 (0)\n-F20AC Disk Start            0000 (0)\n-F20AE Int File Attributes   0000 (0)\n+F2D05 Compression Method    0000 (0) 'Stored'\n+F2D07 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F2D0B CRC                   00000000 (0)\n+F2D0F Compressed Size       00000000 (0)\n+F2D13 Uncompressed Size     00000000 (0)\n+F2D17 Filename Length       0023 (35)\n+F2D19 Extra Length          0000 (0)\n+F2D1B Comment Length        0000 (0)\n+F2D1D Disk Start            0000 (0)\n+F2D1F Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F20B0 Ext File Attributes   41ED0010 (1106051088)\n+F2D21 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F20B4 Local Header Offset   000059FE (23038)\n-F20B8 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F2D25 Local Header Offset   000059FE (23038)\n+F2D29 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF20B8: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF2D29: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF20B8: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF2D29: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF2090: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF2D01: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F20DB CENTRAL HEADER #214   02014B50 (33639248)\n-F20DF Created Zip Spec      14 (20) '2.0'\n-F20E0 Created OS            03 (3) 'Unix'\n-F20E1 Extract Zip Spec      0A (10) '1.0'\n-F20E2 Extract OS            00 (0) 'MS-DOS'\n-F20E3 General Purpose Flag  0800 (2048)\n+F2D4C CENTRAL HEADER #214   02014B50 (33639248)\n+F2D50 Created Zip Spec      14 (20) '2.0'\n+F2D51 Created OS            03 (3) 'Unix'\n+F2D52 Extract Zip Spec      0A (10) '1.0'\n+F2D53 Extract OS            00 (0) 'MS-DOS'\n+F2D54 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F20E5 Compression Method    0000 (0) 'Stored'\n-F20E7 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F20EB CRC                   00000000 (0)\n-F20EF Compressed Size       00000000 (0)\n-F20F3 Uncompressed Size     00000000 (0)\n-F20F7 Filename Length       002A (42)\n-F20F9 Extra Length          0000 (0)\n-F20FB Comment Length        0000 (0)\n-F20FD Disk Start            0000 (0)\n-F20FF Int File Attributes   0000 (0)\n+F2D56 Compression Method    0000 (0) 'Stored'\n+F2D58 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F2D5C CRC                   00000000 (0)\n+F2D60 Compressed Size       00000000 (0)\n+F2D64 Uncompressed Size     00000000 (0)\n+F2D68 Filename Length       002A (42)\n+F2D6A Extra Length          0000 (0)\n+F2D6C Comment Length        0000 (0)\n+F2D6E Disk Start            0000 (0)\n+F2D70 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F2101 Ext File Attributes   41ED0010 (1106051088)\n+F2D72 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F2105 Local Header Offset   00005A3F (23103)\n-F2109 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F2D76 Local Header Offset   00005A3F (23103)\n+F2D7A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF2109: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF2D7A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF2109: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF2D7A: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF20E1: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF2D52: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F2133 CENTRAL HEADER #215   02014B50 (33639248)\n-F2137 Created Zip Spec      14 (20) '2.0'\n-F2138 Created OS            03 (3) 'Unix'\n-F2139 Extract Zip Spec      0A (10) '1.0'\n-F213A Extract OS            00 (0) 'MS-DOS'\n-F213B General Purpose Flag  0800 (2048)\n+F2DA4 CENTRAL HEADER #215   02014B50 (33639248)\n+F2DA8 Created Zip Spec      14 (20) '2.0'\n+F2DA9 Created OS            03 (3) 'Unix'\n+F2DAA Extract Zip Spec      0A (10) '1.0'\n+F2DAB Extract OS            00 (0) 'MS-DOS'\n+F2DAC General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F213D Compression Method    0000 (0) 'Stored'\n-F213F Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F2143 CRC                   00000000 (0)\n-F2147 Compressed Size       00000000 (0)\n-F214B Uncompressed Size     00000000 (0)\n-F214F Filename Length       0052 (82)\n-F2151 Extra Length          0000 (0)\n-F2153 Comment Length        0000 (0)\n-F2155 Disk Start            0000 (0)\n-F2157 Int File Attributes   0000 (0)\n+F2DAE Compression Method    0000 (0) 'Stored'\n+F2DB0 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F2DB4 CRC                   00000000 (0)\n+F2DB8 Compressed Size       00000000 (0)\n+F2DBC Uncompressed Size     00000000 (0)\n+F2DC0 Filename Length       0052 (82)\n+F2DC2 Extra Length          0000 (0)\n+F2DC4 Comment Length        0000 (0)\n+F2DC6 Disk Start            0000 (0)\n+F2DC8 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F2159 Ext File Attributes   41ED0010 (1106051088)\n+F2DCA Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F215D Local Header Offset   00005A87 (23175)\n-F2161 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F2DCE Local Header Offset   00005A87 (23175)\n+F2DD2 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF2161: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF2DD2: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF2161: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF2DD2: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF2139: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF2DAA: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F21B3 CENTRAL HEADER #216   02014B50 (33639248)\n-F21B7 Created Zip Spec      14 (20) '2.0'\n-F21B8 Created OS            03 (3) 'Unix'\n-F21B9 Extract Zip Spec      0A (10) '1.0'\n-F21BA Extract OS            00 (0) 'MS-DOS'\n-F21BB General Purpose Flag  0800 (2048)\n+F2E24 CENTRAL HEADER #216   02014B50 (33639248)\n+F2E28 Created Zip Spec      14 (20) '2.0'\n+F2E29 Created OS            03 (3) 'Unix'\n+F2E2A Extract Zip Spec      0A (10) '1.0'\n+F2E2B Extract OS            00 (0) 'MS-DOS'\n+F2E2C General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F21BD Compression Method    0000 (0) 'Stored'\n-F21BF Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F21C3 CRC                   00000000 (0)\n-F21C7 Compressed Size       00000000 (0)\n-F21CB Uncompressed Size     00000000 (0)\n-F21CF Filename Length       0059 (89)\n-F21D1 Extra Length          0000 (0)\n-F21D3 Comment Length        0000 (0)\n-F21D5 Disk Start            0000 (0)\n-F21D7 Int File Attributes   0000 (0)\n+F2E2E Compression Method    0000 (0) 'Stored'\n+F2E30 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F2E34 CRC                   00000000 (0)\n+F2E38 Compressed Size       00000000 (0)\n+F2E3C Uncompressed Size     00000000 (0)\n+F2E40 Filename Length       0059 (89)\n+F2E42 Extra Length          0000 (0)\n+F2E44 Comment Length        0000 (0)\n+F2E46 Disk Start            0000 (0)\n+F2E48 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F21D9 Ext File Attributes   41ED0010 (1106051088)\n+F2E4A Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F21DD Local Header Offset   00005AF7 (23287)\n-F21E1 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F2E4E Local Header Offset   00005AF7 (23287)\n+F2E52 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF21E1: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF2E52: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF21E1: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF2E52: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF21B9: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF2E2A: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F223A CENTRAL HEADER #217   02014B50 (33639248)\n-F223E Created Zip Spec      14 (20) '2.0'\n-F223F Created OS            03 (3) 'Unix'\n-F2240 Extract Zip Spec      0A (10) '1.0'\n-F2241 Extract OS            00 (0) 'MS-DOS'\n-F2242 General Purpose Flag  0800 (2048)\n+F2EAB CENTRAL HEADER #217   02014B50 (33639248)\n+F2EAF Created Zip Spec      14 (20) '2.0'\n+F2EB0 Created OS            03 (3) 'Unix'\n+F2EB1 Extract Zip Spec      0A (10) '1.0'\n+F2EB2 Extract OS            00 (0) 'MS-DOS'\n+F2EB3 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F2244 Compression Method    0000 (0) 'Stored'\n-F2246 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F224A CRC                   00000000 (0)\n-F224E Compressed Size       00000000 (0)\n-F2252 Uncompressed Size     00000000 (0)\n-F2256 Filename Length       0057 (87)\n-F2258 Extra Length          0000 (0)\n-F225A Comment Length        0000 (0)\n-F225C Disk Start            0000 (0)\n-F225E Int File Attributes   0000 (0)\n+F2EB5 Compression Method    0000 (0) 'Stored'\n+F2EB7 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F2EBB CRC                   00000000 (0)\n+F2EBF Compressed Size       00000000 (0)\n+F2EC3 Uncompressed Size     00000000 (0)\n+F2EC7 Filename Length       0057 (87)\n+F2EC9 Extra Length          0000 (0)\n+F2ECB Comment Length        0000 (0)\n+F2ECD Disk Start            0000 (0)\n+F2ECF Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F2260 Ext File Attributes   41ED0010 (1106051088)\n+F2ED1 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F2264 Local Header Offset   00005B6E (23406)\n-F2268 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F2ED5 Local Header Offset   00005B6E (23406)\n+F2ED9 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF2268: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF2ED9: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF2268: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF2ED9: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF2240: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF2EB1: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F22BF CENTRAL HEADER #218   02014B50 (33639248)\n-F22C3 Created Zip Spec      14 (20) '2.0'\n-F22C4 Created OS            03 (3) 'Unix'\n-F22C5 Extract Zip Spec      0A (10) '1.0'\n-F22C6 Extract OS            00 (0) 'MS-DOS'\n-F22C7 General Purpose Flag  0800 (2048)\n+F2F30 CENTRAL HEADER #218   02014B50 (33639248)\n+F2F34 Created Zip Spec      14 (20) '2.0'\n+F2F35 Created OS            03 (3) 'Unix'\n+F2F36 Extract Zip Spec      0A (10) '1.0'\n+F2F37 Extract OS            00 (0) 'MS-DOS'\n+F2F38 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F22C9 Compression Method    0000 (0) 'Stored'\n-F22CB Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F22CF CRC                   00000000 (0)\n-F22D3 Compressed Size       00000000 (0)\n-F22D7 Uncompressed Size     00000000 (0)\n-F22DB Filename Length       0052 (82)\n-F22DD Extra Length          0000 (0)\n-F22DF Comment Length        0000 (0)\n-F22E1 Disk Start            0000 (0)\n-F22E3 Int File Attributes   0000 (0)\n+F2F3A Compression Method    0000 (0) 'Stored'\n+F2F3C Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F2F40 CRC                   00000000 (0)\n+F2F44 Compressed Size       00000000 (0)\n+F2F48 Uncompressed Size     00000000 (0)\n+F2F4C Filename Length       0052 (82)\n+F2F4E Extra Length          0000 (0)\n+F2F50 Comment Length        0000 (0)\n+F2F52 Disk Start            0000 (0)\n+F2F54 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F22E5 Ext File Attributes   41ED0010 (1106051088)\n+F2F56 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F22E9 Local Header Offset   00005BE3 (23523)\n-F22ED Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F2F5A Local Header Offset   00005BE3 (23523)\n+F2F5E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF22ED: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF2F5E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF22ED: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF2F5E: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF22C5: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF2F36: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F233F CENTRAL HEADER #219   02014B50 (33639248)\n-F2343 Created Zip Spec      14 (20) '2.0'\n-F2344 Created OS            03 (3) 'Unix'\n-F2345 Extract Zip Spec      0A (10) '1.0'\n-F2346 Extract OS            00 (0) 'MS-DOS'\n-F2347 General Purpose Flag  0800 (2048)\n+F2FB0 CENTRAL HEADER #219   02014B50 (33639248)\n+F2FB4 Created Zip Spec      14 (20) '2.0'\n+F2FB5 Created OS            03 (3) 'Unix'\n+F2FB6 Extract Zip Spec      0A (10) '1.0'\n+F2FB7 Extract OS            00 (0) 'MS-DOS'\n+F2FB8 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F2349 Compression Method    0000 (0) 'Stored'\n-F234B Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F234F CRC                   00000000 (0)\n-F2353 Compressed Size       00000000 (0)\n-F2357 Uncompressed Size     00000000 (0)\n-F235B Filename Length       0023 (35)\n-F235D Extra Length          0000 (0)\n-F235F Comment Length        0000 (0)\n-F2361 Disk Start            0000 (0)\n-F2363 Int File Attributes   0000 (0)\n+F2FBA Compression Method    0000 (0) 'Stored'\n+F2FBC Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F2FC0 CRC                   00000000 (0)\n+F2FC4 Compressed Size       00000000 (0)\n+F2FC8 Uncompressed Size     00000000 (0)\n+F2FCC Filename Length       0023 (35)\n+F2FCE Extra Length          0000 (0)\n+F2FD0 Comment Length        0000 (0)\n+F2FD2 Disk Start            0000 (0)\n+F2FD4 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F2365 Ext File Attributes   41ED0010 (1106051088)\n+F2FD6 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F2369 Local Header Offset   00005C53 (23635)\n-F236D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F2FDA Local Header Offset   00005C53 (23635)\n+F2FDE Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF236D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF2FDE: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF236D: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF2FDE: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF2345: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF2FB6: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F2390 CENTRAL HEADER #220   02014B50 (33639248)\n-F2394 Created Zip Spec      14 (20) '2.0'\n-F2395 Created OS            03 (3) 'Unix'\n-F2396 Extract Zip Spec      0A (10) '1.0'\n-F2397 Extract OS            00 (0) 'MS-DOS'\n-F2398 General Purpose Flag  0800 (2048)\n+F3001 CENTRAL HEADER #220   02014B50 (33639248)\n+F3005 Created Zip Spec      14 (20) '2.0'\n+F3006 Created OS            03 (3) 'Unix'\n+F3007 Extract Zip Spec      0A (10) '1.0'\n+F3008 Extract OS            00 (0) 'MS-DOS'\n+F3009 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F239A Compression Method    0000 (0) 'Stored'\n-F239C Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F23A0 CRC                   00000000 (0)\n-F23A4 Compressed Size       00000000 (0)\n-F23A8 Uncompressed Size     00000000 (0)\n-F23AC Filename Length       002A (42)\n-F23AE Extra Length          0000 (0)\n-F23B0 Comment Length        0000 (0)\n-F23B2 Disk Start            0000 (0)\n-F23B4 Int File Attributes   0000 (0)\n+F300B Compression Method    0000 (0) 'Stored'\n+F300D Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F3011 CRC                   00000000 (0)\n+F3015 Compressed Size       00000000 (0)\n+F3019 Uncompressed Size     00000000 (0)\n+F301D Filename Length       002A (42)\n+F301F Extra Length          0000 (0)\n+F3021 Comment Length        0000 (0)\n+F3023 Disk Start            0000 (0)\n+F3025 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F23B6 Ext File Attributes   41ED0010 (1106051088)\n+F3027 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F23BA Local Header Offset   00005C94 (23700)\n-F23BE Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F302B Local Header Offset   00005C94 (23700)\n+F302F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF23BE: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF302F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF23BE: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF302F: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF2396: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF3007: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F23E8 CENTRAL HEADER #221   02014B50 (33639248)\n-F23EC Created Zip Spec      14 (20) '2.0'\n-F23ED Created OS            03 (3) 'Unix'\n-F23EE Extract Zip Spec      0A (10) '1.0'\n-F23EF Extract OS            00 (0) 'MS-DOS'\n-F23F0 General Purpose Flag  0800 (2048)\n+F3059 CENTRAL HEADER #221   02014B50 (33639248)\n+F305D Created Zip Spec      14 (20) '2.0'\n+F305E Created OS            03 (3) 'Unix'\n+F305F Extract Zip Spec      0A (10) '1.0'\n+F3060 Extract OS            00 (0) 'MS-DOS'\n+F3061 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F23F2 Compression Method    0000 (0) 'Stored'\n-F23F4 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F23F8 CRC                   00000000 (0)\n-F23FC Compressed Size       00000000 (0)\n-F2400 Uncompressed Size     00000000 (0)\n-F2404 Filename Length       0052 (82)\n-F2406 Extra Length          0000 (0)\n-F2408 Comment Length        0000 (0)\n-F240A Disk Start            0000 (0)\n-F240C Int File Attributes   0000 (0)\n+F3063 Compression Method    0000 (0) 'Stored'\n+F3065 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F3069 CRC                   00000000 (0)\n+F306D Compressed Size       00000000 (0)\n+F3071 Uncompressed Size     00000000 (0)\n+F3075 Filename Length       0052 (82)\n+F3077 Extra Length          0000 (0)\n+F3079 Comment Length        0000 (0)\n+F307B Disk Start            0000 (0)\n+F307D Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F240E Ext File Attributes   41ED0010 (1106051088)\n+F307F Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F2412 Local Header Offset   00005CDC (23772)\n-F2416 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F3083 Local Header Offset   00005CDC (23772)\n+F3087 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF2416: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF3087: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF2416: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF3087: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF23EE: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF305F: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F2468 CENTRAL HEADER #222   02014B50 (33639248)\n-F246C Created Zip Spec      14 (20) '2.0'\n-F246D Created OS            03 (3) 'Unix'\n-F246E Extract Zip Spec      0A (10) '1.0'\n-F246F Extract OS            00 (0) 'MS-DOS'\n-F2470 General Purpose Flag  0800 (2048)\n+F30D9 CENTRAL HEADER #222   02014B50 (33639248)\n+F30DD Created Zip Spec      14 (20) '2.0'\n+F30DE Created OS            03 (3) 'Unix'\n+F30DF Extract Zip Spec      0A (10) '1.0'\n+F30E0 Extract OS            00 (0) 'MS-DOS'\n+F30E1 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F2472 Compression Method    0000 (0) 'Stored'\n-F2474 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F2478 CRC                   00000000 (0)\n-F247C Compressed Size       00000000 (0)\n-F2480 Uncompressed Size     00000000 (0)\n-F2484 Filename Length       005F (95)\n-F2486 Extra Length          0000 (0)\n-F2488 Comment Length        0000 (0)\n-F248A Disk Start            0000 (0)\n-F248C Int File Attributes   0000 (0)\n+F30E3 Compression Method    0000 (0) 'Stored'\n+F30E5 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F30E9 CRC                   00000000 (0)\n+F30ED Compressed Size       00000000 (0)\n+F30F1 Uncompressed Size     00000000 (0)\n+F30F5 Filename Length       005F (95)\n+F30F7 Extra Length          0000 (0)\n+F30F9 Comment Length        0000 (0)\n+F30FB Disk Start            0000 (0)\n+F30FD Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F248E Ext File Attributes   41ED0010 (1106051088)\n+F30FF Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F2492 Local Header Offset   00005D4C (23884)\n-F2496 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F3103 Local Header Offset   00005D4C (23884)\n+F3107 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF2496: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF3107: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF2496: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF3107: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF246E: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF30DF: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F24F5 CENTRAL HEADER #223   02014B50 (33639248)\n-F24F9 Created Zip Spec      14 (20) '2.0'\n-F24FA Created OS            03 (3) 'Unix'\n-F24FB Extract Zip Spec      0A (10) '1.0'\n-F24FC Extract OS            00 (0) 'MS-DOS'\n-F24FD General Purpose Flag  0800 (2048)\n+F3166 CENTRAL HEADER #223   02014B50 (33639248)\n+F316A Created Zip Spec      14 (20) '2.0'\n+F316B Created OS            03 (3) 'Unix'\n+F316C Extract Zip Spec      0A (10) '1.0'\n+F316D Extract OS            00 (0) 'MS-DOS'\n+F316E General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F24FF Compression Method    0000 (0) 'Stored'\n-F2501 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F2505 CRC                   00000000 (0)\n-F2509 Compressed Size       00000000 (0)\n-F250D Uncompressed Size     00000000 (0)\n-F2511 Filename Length       0058 (88)\n-F2513 Extra Length          0000 (0)\n-F2515 Comment Length        0000 (0)\n-F2517 Disk Start            0000 (0)\n-F2519 Int File Attributes   0000 (0)\n+F3170 Compression Method    0000 (0) 'Stored'\n+F3172 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F3176 CRC                   00000000 (0)\n+F317A Compressed Size       00000000 (0)\n+F317E Uncompressed Size     00000000 (0)\n+F3182 Filename Length       0058 (88)\n+F3184 Extra Length          0000 (0)\n+F3186 Comment Length        0000 (0)\n+F3188 Disk Start            0000 (0)\n+F318A Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F251B Ext File Attributes   41ED0010 (1106051088)\n+F318C Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F251F Local Header Offset   00005DC9 (24009)\n-F2523 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F3190 Local Header Offset   00005DC9 (24009)\n+F3194 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF2523: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF3194: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF2523: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF3194: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF24FB: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF316C: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F257B CENTRAL HEADER #224   02014B50 (33639248)\n-F257F Created Zip Spec      14 (20) '2.0'\n-F2580 Created OS            03 (3) 'Unix'\n-F2581 Extract Zip Spec      0A (10) '1.0'\n-F2582 Extract OS            00 (0) 'MS-DOS'\n-F2583 General Purpose Flag  0800 (2048)\n+F31EC CENTRAL HEADER #224   02014B50 (33639248)\n+F31F0 Created Zip Spec      14 (20) '2.0'\n+F31F1 Created OS            03 (3) 'Unix'\n+F31F2 Extract Zip Spec      0A (10) '1.0'\n+F31F3 Extract OS            00 (0) 'MS-DOS'\n+F31F4 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F2585 Compression Method    0000 (0) 'Stored'\n-F2587 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F258B CRC                   00000000 (0)\n-F258F Compressed Size       00000000 (0)\n-F2593 Uncompressed Size     00000000 (0)\n-F2597 Filename Length       0025 (37)\n-F2599 Extra Length          0000 (0)\n-F259B Comment Length        0000 (0)\n-F259D Disk Start            0000 (0)\n-F259F Int File Attributes   0000 (0)\n+F31F6 Compression Method    0000 (0) 'Stored'\n+F31F8 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F31FC CRC                   00000000 (0)\n+F3200 Compressed Size       00000000 (0)\n+F3204 Uncompressed Size     00000000 (0)\n+F3208 Filename Length       0025 (37)\n+F320A Extra Length          0000 (0)\n+F320C Comment Length        0000 (0)\n+F320E Disk Start            0000 (0)\n+F3210 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F25A1 Ext File Attributes   41ED0010 (1106051088)\n+F3212 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F25A5 Local Header Offset   00005E3F (24127)\n-F25A9 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F3216 Local Header Offset   00005E3F (24127)\n+F321A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF25A9: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF321A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF25A9: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF321A: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF2581: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF31F2: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F25CE CENTRAL HEADER #225   02014B50 (33639248)\n-F25D2 Created Zip Spec      14 (20) '2.0'\n-F25D3 Created OS            03 (3) 'Unix'\n-F25D4 Extract Zip Spec      0A (10) '1.0'\n-F25D5 Extract OS            00 (0) 'MS-DOS'\n-F25D6 General Purpose Flag  0800 (2048)\n+F323F CENTRAL HEADER #225   02014B50 (33639248)\n+F3243 Created Zip Spec      14 (20) '2.0'\n+F3244 Created OS            03 (3) 'Unix'\n+F3245 Extract Zip Spec      0A (10) '1.0'\n+F3246 Extract OS            00 (0) 'MS-DOS'\n+F3247 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F25D8 Compression Method    0000 (0) 'Stored'\n-F25DA Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F25DE CRC                   00000000 (0)\n-F25E2 Compressed Size       00000000 (0)\n-F25E6 Uncompressed Size     00000000 (0)\n-F25EA Filename Length       002C (44)\n-F25EC Extra Length          0000 (0)\n-F25EE Comment Length        0000 (0)\n-F25F0 Disk Start            0000 (0)\n-F25F2 Int File Attributes   0000 (0)\n+F3249 Compression Method    0000 (0) 'Stored'\n+F324B Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F324F CRC                   00000000 (0)\n+F3253 Compressed Size       00000000 (0)\n+F3257 Uncompressed Size     00000000 (0)\n+F325B Filename Length       002C (44)\n+F325D Extra Length          0000 (0)\n+F325F Comment Length        0000 (0)\n+F3261 Disk Start            0000 (0)\n+F3263 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F25F4 Ext File Attributes   41ED0010 (1106051088)\n+F3265 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F25F8 Local Header Offset   00005E82 (24194)\n-F25FC Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F3269 Local Header Offset   00005E82 (24194)\n+F326D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF25FC: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF326D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF25FC: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF326D: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF25D4: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF3245: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F2628 CENTRAL HEADER #226   02014B50 (33639248)\n-F262C Created Zip Spec      14 (20) '2.0'\n-F262D Created OS            03 (3) 'Unix'\n-F262E Extract Zip Spec      0A (10) '1.0'\n-F262F Extract OS            00 (0) 'MS-DOS'\n-F2630 General Purpose Flag  0800 (2048)\n+F3299 CENTRAL HEADER #226   02014B50 (33639248)\n+F329D Created Zip Spec      14 (20) '2.0'\n+F329E Created OS            03 (3) 'Unix'\n+F329F Extract Zip Spec      0A (10) '1.0'\n+F32A0 Extract OS            00 (0) 'MS-DOS'\n+F32A1 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F2632 Compression Method    0000 (0) 'Stored'\n-F2634 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F2638 CRC                   00000000 (0)\n-F263C Compressed Size       00000000 (0)\n-F2640 Uncompressed Size     00000000 (0)\n-F2644 Filename Length       005C (92)\n-F2646 Extra Length          0000 (0)\n-F2648 Comment Length        0000 (0)\n-F264A Disk Start            0000 (0)\n-F264C Int File Attributes   0000 (0)\n+F32A3 Compression Method    0000 (0) 'Stored'\n+F32A5 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F32A9 CRC                   00000000 (0)\n+F32AD Compressed Size       00000000 (0)\n+F32B1 Uncompressed Size     00000000 (0)\n+F32B5 Filename Length       005C (92)\n+F32B7 Extra Length          0000 (0)\n+F32B9 Comment Length        0000 (0)\n+F32BB Disk Start            0000 (0)\n+F32BD Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F264E Ext File Attributes   41ED0010 (1106051088)\n+F32BF Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F2652 Local Header Offset   00005ECC (24268)\n-F2656 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F32C3 Local Header Offset   00005ECC (24268)\n+F32C7 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF2656: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF32C7: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF2656: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF32C7: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF262E: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF329F: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F26B2 CENTRAL HEADER #227   02014B50 (33639248)\n-F26B6 Created Zip Spec      14 (20) '2.0'\n-F26B7 Created OS            03 (3) 'Unix'\n-F26B8 Extract Zip Spec      0A (10) '1.0'\n-F26B9 Extract OS            00 (0) 'MS-DOS'\n-F26BA General Purpose Flag  0800 (2048)\n+F3323 CENTRAL HEADER #227   02014B50 (33639248)\n+F3327 Created Zip Spec      14 (20) '2.0'\n+F3328 Created OS            03 (3) 'Unix'\n+F3329 Extract Zip Spec      0A (10) '1.0'\n+F332A Extract OS            00 (0) 'MS-DOS'\n+F332B General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F26BC Compression Method    0000 (0) 'Stored'\n-F26BE Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F26C2 CRC                   00000000 (0)\n-F26C6 Compressed Size       00000000 (0)\n-F26CA Uncompressed Size     00000000 (0)\n-F26CE Filename Length       0068 (104)\n-F26D0 Extra Length          0000 (0)\n-F26D2 Comment Length        0000 (0)\n-F26D4 Disk Start            0000 (0)\n-F26D6 Int File Attributes   0000 (0)\n+F332D Compression Method    0000 (0) 'Stored'\n+F332F Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F3333 CRC                   00000000 (0)\n+F3337 Compressed Size       00000000 (0)\n+F333B Uncompressed Size     00000000 (0)\n+F333F Filename Length       0068 (104)\n+F3341 Extra Length          0000 (0)\n+F3343 Comment Length        0000 (0)\n+F3345 Disk Start            0000 (0)\n+F3347 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F26D8 Ext File Attributes   41ED0010 (1106051088)\n+F3349 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F26DC Local Header Offset   00005F46 (24390)\n-F26E0 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F334D Local Header Offset   00005F46 (24390)\n+F3351 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF26E0: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF3351: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF26E0: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF3351: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF26B8: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF3329: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F2748 CENTRAL HEADER #228   02014B50 (33639248)\n-F274C Created Zip Spec      14 (20) '2.0'\n-F274D Created OS            03 (3) 'Unix'\n-F274E Extract Zip Spec      0A (10) '1.0'\n-F274F Extract OS            00 (0) 'MS-DOS'\n-F2750 General Purpose Flag  0800 (2048)\n+F33B9 CENTRAL HEADER #228   02014B50 (33639248)\n+F33BD Created Zip Spec      14 (20) '2.0'\n+F33BE Created OS            03 (3) 'Unix'\n+F33BF Extract Zip Spec      0A (10) '1.0'\n+F33C0 Extract OS            00 (0) 'MS-DOS'\n+F33C1 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F2752 Compression Method    0000 (0) 'Stored'\n-F2754 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F2758 CRC                   00000000 (0)\n-F275C Compressed Size       00000000 (0)\n-F2760 Uncompressed Size     00000000 (0)\n-F2764 Filename Length       0025 (37)\n-F2766 Extra Length          0000 (0)\n-F2768 Comment Length        0000 (0)\n-F276A Disk Start            0000 (0)\n-F276C Int File Attributes   0000 (0)\n+F33C3 Compression Method    0000 (0) 'Stored'\n+F33C5 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F33C9 CRC                   00000000 (0)\n+F33CD Compressed Size       00000000 (0)\n+F33D1 Uncompressed Size     00000000 (0)\n+F33D5 Filename Length       0025 (37)\n+F33D7 Extra Length          0000 (0)\n+F33D9 Comment Length        0000 (0)\n+F33DB Disk Start            0000 (0)\n+F33DD Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F276E Ext File Attributes   41ED0010 (1106051088)\n+F33DF Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F2772 Local Header Offset   00005FCC (24524)\n-F2776 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F33E3 Local Header Offset   00005FCC (24524)\n+F33E7 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF2776: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF33E7: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF2776: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF33E7: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF274E: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF33BF: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F279B CENTRAL HEADER #229   02014B50 (33639248)\n-F279F Created Zip Spec      14 (20) '2.0'\n-F27A0 Created OS            03 (3) 'Unix'\n-F27A1 Extract Zip Spec      0A (10) '1.0'\n-F27A2 Extract OS            00 (0) 'MS-DOS'\n-F27A3 General Purpose Flag  0800 (2048)\n+F340C CENTRAL HEADER #229   02014B50 (33639248)\n+F3410 Created Zip Spec      14 (20) '2.0'\n+F3411 Created OS            03 (3) 'Unix'\n+F3412 Extract Zip Spec      0A (10) '1.0'\n+F3413 Extract OS            00 (0) 'MS-DOS'\n+F3414 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F27A5 Compression Method    0000 (0) 'Stored'\n-F27A7 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F27AB CRC                   00000000 (0)\n-F27AF Compressed Size       00000000 (0)\n-F27B3 Uncompressed Size     00000000 (0)\n-F27B7 Filename Length       002C (44)\n-F27B9 Extra Length          0000 (0)\n-F27BB Comment Length        0000 (0)\n-F27BD Disk Start            0000 (0)\n-F27BF Int File Attributes   0000 (0)\n+F3416 Compression Method    0000 (0) 'Stored'\n+F3418 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F341C CRC                   00000000 (0)\n+F3420 Compressed Size       00000000 (0)\n+F3424 Uncompressed Size     00000000 (0)\n+F3428 Filename Length       002C (44)\n+F342A Extra Length          0000 (0)\n+F342C Comment Length        0000 (0)\n+F342E Disk Start            0000 (0)\n+F3430 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F27C1 Ext File Attributes   41ED0010 (1106051088)\n+F3432 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F27C5 Local Header Offset   0000600F (24591)\n-F27C9 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F3436 Local Header Offset   0000600F (24591)\n+F343A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF27C9: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF343A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF27C9: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF343A: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF27A1: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF3412: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F27F5 CENTRAL HEADER #230   02014B50 (33639248)\n-F27F9 Created Zip Spec      14 (20) '2.0'\n-F27FA Created OS            03 (3) 'Unix'\n-F27FB Extract Zip Spec      0A (10) '1.0'\n-F27FC Extract OS            00 (0) 'MS-DOS'\n-F27FD General Purpose Flag  0800 (2048)\n+F3466 CENTRAL HEADER #230   02014B50 (33639248)\n+F346A Created Zip Spec      14 (20) '2.0'\n+F346B Created OS            03 (3) 'Unix'\n+F346C Extract Zip Spec      0A (10) '1.0'\n+F346D Extract OS            00 (0) 'MS-DOS'\n+F346E General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F27FF Compression Method    0000 (0) 'Stored'\n-F2801 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F2805 CRC                   00000000 (0)\n-F2809 Compressed Size       00000000 (0)\n-F280D Uncompressed Size     00000000 (0)\n-F2811 Filename Length       005A (90)\n-F2813 Extra Length          0000 (0)\n-F2815 Comment Length        0000 (0)\n-F2817 Disk Start            0000 (0)\n-F2819 Int File Attributes   0000 (0)\n+F3470 Compression Method    0000 (0) 'Stored'\n+F3472 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F3476 CRC                   00000000 (0)\n+F347A Compressed Size       00000000 (0)\n+F347E Uncompressed Size     00000000 (0)\n+F3482 Filename Length       005A (90)\n+F3484 Extra Length          0000 (0)\n+F3486 Comment Length        0000 (0)\n+F3488 Disk Start            0000 (0)\n+F348A Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F281B Ext File Attributes   41ED0010 (1106051088)\n+F348C Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F281F Local Header Offset   00006059 (24665)\n-F2823 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F3490 Local Header Offset   00006059 (24665)\n+F3494 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF2823: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF3494: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF2823: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF3494: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF27FB: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF346C: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F287D CENTRAL HEADER #231   02014B50 (33639248)\n-F2881 Created Zip Spec      14 (20) '2.0'\n-F2882 Created OS            03 (3) 'Unix'\n-F2883 Extract Zip Spec      0A (10) '1.0'\n-F2884 Extract OS            00 (0) 'MS-DOS'\n-F2885 General Purpose Flag  0800 (2048)\n+F34EE CENTRAL HEADER #231   02014B50 (33639248)\n+F34F2 Created Zip Spec      14 (20) '2.0'\n+F34F3 Created OS            03 (3) 'Unix'\n+F34F4 Extract Zip Spec      0A (10) '1.0'\n+F34F5 Extract OS            00 (0) 'MS-DOS'\n+F34F6 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F2887 Compression Method    0000 (0) 'Stored'\n-F2889 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F288D CRC                   00000000 (0)\n-F2891 Compressed Size       00000000 (0)\n-F2895 Uncompressed Size     00000000 (0)\n-F2899 Filename Length       0027 (39)\n-F289B Extra Length          0000 (0)\n-F289D Comment Length        0000 (0)\n-F289F Disk Start            0000 (0)\n-F28A1 Int File Attributes   0000 (0)\n+F34F8 Compression Method    0000 (0) 'Stored'\n+F34FA Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F34FE CRC                   00000000 (0)\n+F3502 Compressed Size       00000000 (0)\n+F3506 Uncompressed Size     00000000 (0)\n+F350A Filename Length       0027 (39)\n+F350C Extra Length          0000 (0)\n+F350E Comment Length        0000 (0)\n+F3510 Disk Start            0000 (0)\n+F3512 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F28A3 Ext File Attributes   41ED0010 (1106051088)\n+F3514 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F28A7 Local Header Offset   000060D1 (24785)\n-F28AB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F3518 Local Header Offset   000060D1 (24785)\n+F351C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF28AB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF351C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF28AB: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF351C: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF2883: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF34F4: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F28D2 CENTRAL HEADER #232   02014B50 (33639248)\n-F28D6 Created Zip Spec      14 (20) '2.0'\n-F28D7 Created OS            03 (3) 'Unix'\n-F28D8 Extract Zip Spec      0A (10) '1.0'\n-F28D9 Extract OS            00 (0) 'MS-DOS'\n-F28DA General Purpose Flag  0800 (2048)\n+F3543 CENTRAL HEADER #232   02014B50 (33639248)\n+F3547 Created Zip Spec      14 (20) '2.0'\n+F3548 Created OS            03 (3) 'Unix'\n+F3549 Extract Zip Spec      0A (10) '1.0'\n+F354A Extract OS            00 (0) 'MS-DOS'\n+F354B General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F28DC Compression Method    0000 (0) 'Stored'\n-F28DE Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F28E2 CRC                   00000000 (0)\n-F28E6 Compressed Size       00000000 (0)\n-F28EA Uncompressed Size     00000000 (0)\n-F28EE Filename Length       002E (46)\n-F28F0 Extra Length          0000 (0)\n-F28F2 Comment Length        0000 (0)\n-F28F4 Disk Start            0000 (0)\n-F28F6 Int File Attributes   0000 (0)\n+F354D Compression Method    0000 (0) 'Stored'\n+F354F Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F3553 CRC                   00000000 (0)\n+F3557 Compressed Size       00000000 (0)\n+F355B Uncompressed Size     00000000 (0)\n+F355F Filename Length       002E (46)\n+F3561 Extra Length          0000 (0)\n+F3563 Comment Length        0000 (0)\n+F3565 Disk Start            0000 (0)\n+F3567 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F28F8 Ext File Attributes   41ED0010 (1106051088)\n+F3569 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F28FC Local Header Offset   00006116 (24854)\n-F2900 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F356D Local Header Offset   00006116 (24854)\n+F3571 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF2900: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF3571: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF2900: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF3571: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF28D8: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF3549: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F292E CENTRAL HEADER #233   02014B50 (33639248)\n-F2932 Created Zip Spec      14 (20) '2.0'\n-F2933 Created OS            03 (3) 'Unix'\n-F2934 Extract Zip Spec      0A (10) '1.0'\n-F2935 Extract OS            00 (0) 'MS-DOS'\n-F2936 General Purpose Flag  0800 (2048)\n+F359F CENTRAL HEADER #233   02014B50 (33639248)\n+F35A3 Created Zip Spec      14 (20) '2.0'\n+F35A4 Created OS            03 (3) 'Unix'\n+F35A5 Extract Zip Spec      0A (10) '1.0'\n+F35A6 Extract OS            00 (0) 'MS-DOS'\n+F35A7 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F2938 Compression Method    0000 (0) 'Stored'\n-F293A Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F293E CRC                   00000000 (0)\n-F2942 Compressed Size       00000000 (0)\n-F2946 Uncompressed Size     00000000 (0)\n-F294A Filename Length       0067 (103)\n-F294C Extra Length          0000 (0)\n-F294E Comment Length        0000 (0)\n-F2950 Disk Start            0000 (0)\n-F2952 Int File Attributes   0000 (0)\n+F35A9 Compression Method    0000 (0) 'Stored'\n+F35AB Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F35AF CRC                   00000000 (0)\n+F35B3 Compressed Size       00000000 (0)\n+F35B7 Uncompressed Size     00000000 (0)\n+F35BB Filename Length       0067 (103)\n+F35BD Extra Length          0000 (0)\n+F35BF Comment Length        0000 (0)\n+F35C1 Disk Start            0000 (0)\n+F35C3 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F2954 Ext File Attributes   41ED0010 (1106051088)\n+F35C5 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F2958 Local Header Offset   00006162 (24930)\n-F295C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F35C9 Local Header Offset   00006162 (24930)\n+F35CD Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF295C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF35CD: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF295C: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF35CD: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF2934: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF35A5: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F29C3 CENTRAL HEADER #234   02014B50 (33639248)\n-F29C7 Created Zip Spec      14 (20) '2.0'\n-F29C8 Created OS            03 (3) 'Unix'\n-F29C9 Extract Zip Spec      0A (10) '1.0'\n-F29CA Extract OS            00 (0) 'MS-DOS'\n-F29CB General Purpose Flag  0800 (2048)\n+F3634 CENTRAL HEADER #234   02014B50 (33639248)\n+F3638 Created Zip Spec      14 (20) '2.0'\n+F3639 Created OS            03 (3) 'Unix'\n+F363A Extract Zip Spec      0A (10) '1.0'\n+F363B Extract OS            00 (0) 'MS-DOS'\n+F363C General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F29CD Compression Method    0000 (0) 'Stored'\n-F29CF Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F29D3 CRC                   00000000 (0)\n-F29D7 Compressed Size       00000000 (0)\n-F29DB Uncompressed Size     00000000 (0)\n-F29DF Filename Length       0067 (103)\n-F29E1 Extra Length          0000 (0)\n-F29E3 Comment Length        0000 (0)\n-F29E5 Disk Start            0000 (0)\n-F29E7 Int File Attributes   0000 (0)\n+F363E Compression Method    0000 (0) 'Stored'\n+F3640 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F3644 CRC                   00000000 (0)\n+F3648 Compressed Size       00000000 (0)\n+F364C Uncompressed Size     00000000 (0)\n+F3650 Filename Length       0067 (103)\n+F3652 Extra Length          0000 (0)\n+F3654 Comment Length        0000 (0)\n+F3656 Disk Start            0000 (0)\n+F3658 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F29E9 Ext File Attributes   41ED0010 (1106051088)\n+F365A Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F29ED Local Header Offset   000061E7 (25063)\n-F29F1 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F365E Local Header Offset   000061E7 (25063)\n+F3662 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF29F1: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF3662: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF29F1: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF3662: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF29C9: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF363A: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F2A58 CENTRAL HEADER #235   02014B50 (33639248)\n-F2A5C Created Zip Spec      14 (20) '2.0'\n-F2A5D Created OS            03 (3) 'Unix'\n-F2A5E Extract Zip Spec      0A (10) '1.0'\n-F2A5F Extract OS            00 (0) 'MS-DOS'\n-F2A60 General Purpose Flag  0800 (2048)\n+F36C9 CENTRAL HEADER #235   02014B50 (33639248)\n+F36CD Created Zip Spec      14 (20) '2.0'\n+F36CE Created OS            03 (3) 'Unix'\n+F36CF Extract Zip Spec      0A (10) '1.0'\n+F36D0 Extract OS            00 (0) 'MS-DOS'\n+F36D1 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F2A62 Compression Method    0000 (0) 'Stored'\n-F2A64 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F2A68 CRC                   00000000 (0)\n-F2A6C Compressed Size       00000000 (0)\n-F2A70 Uncompressed Size     00000000 (0)\n-F2A74 Filename Length       005E (94)\n-F2A76 Extra Length          0000 (0)\n-F2A78 Comment Length        0000 (0)\n-F2A7A Disk Start            0000 (0)\n-F2A7C Int File Attributes   0000 (0)\n+F36D3 Compression Method    0000 (0) 'Stored'\n+F36D5 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F36D9 CRC                   00000000 (0)\n+F36DD Compressed Size       00000000 (0)\n+F36E1 Uncompressed Size     00000000 (0)\n+F36E5 Filename Length       005E (94)\n+F36E7 Extra Length          0000 (0)\n+F36E9 Comment Length        0000 (0)\n+F36EB Disk Start            0000 (0)\n+F36ED Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F2A7E Ext File Attributes   41ED0010 (1106051088)\n+F36EF Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F2A82 Local Header Offset   0000626C (25196)\n-F2A86 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F36F3 Local Header Offset   0000626C (25196)\n+F36F7 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF2A86: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF36F7: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF2A86: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF36F7: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF2A5E: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF36CF: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F2AE4 CENTRAL HEADER #236   02014B50 (33639248)\n-F2AE8 Created Zip Spec      14 (20) '2.0'\n-F2AE9 Created OS            03 (3) 'Unix'\n-F2AEA Extract Zip Spec      0A (10) '1.0'\n-F2AEB Extract OS            00 (0) 'MS-DOS'\n-F2AEC General Purpose Flag  0800 (2048)\n+F3755 CENTRAL HEADER #236   02014B50 (33639248)\n+F3759 Created Zip Spec      14 (20) '2.0'\n+F375A Created OS            03 (3) 'Unix'\n+F375B Extract Zip Spec      0A (10) '1.0'\n+F375C Extract OS            00 (0) 'MS-DOS'\n+F375D General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F2AEE Compression Method    0000 (0) 'Stored'\n-F2AF0 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F2AF4 CRC                   00000000 (0)\n-F2AF8 Compressed Size       00000000 (0)\n-F2AFC Uncompressed Size     00000000 (0)\n-F2B00 Filename Length       005C (92)\n-F2B02 Extra Length          0000 (0)\n-F2B04 Comment Length        0000 (0)\n-F2B06 Disk Start            0000 (0)\n-F2B08 Int File Attributes   0000 (0)\n+F375F Compression Method    0000 (0) 'Stored'\n+F3761 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F3765 CRC                   00000000 (0)\n+F3769 Compressed Size       00000000 (0)\n+F376D Uncompressed Size     00000000 (0)\n+F3771 Filename Length       005C (92)\n+F3773 Extra Length          0000 (0)\n+F3775 Comment Length        0000 (0)\n+F3777 Disk Start            0000 (0)\n+F3779 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F2B0A Ext File Attributes   41ED0010 (1106051088)\n+F377B Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F2B0E Local Header Offset   000062E8 (25320)\n-F2B12 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F377F Local Header Offset   000062E8 (25320)\n+F3783 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF2B12: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF3783: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF2B12: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF3783: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF2AEA: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF375B: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F2B6E CENTRAL HEADER #237   02014B50 (33639248)\n-F2B72 Created Zip Spec      14 (20) '2.0'\n-F2B73 Created OS            03 (3) 'Unix'\n-F2B74 Extract Zip Spec      0A (10) '1.0'\n-F2B75 Extract OS            00 (0) 'MS-DOS'\n-F2B76 General Purpose Flag  0800 (2048)\n+F37DF CENTRAL HEADER #237   02014B50 (33639248)\n+F37E3 Created Zip Spec      14 (20) '2.0'\n+F37E4 Created OS            03 (3) 'Unix'\n+F37E5 Extract Zip Spec      0A (10) '1.0'\n+F37E6 Extract OS            00 (0) 'MS-DOS'\n+F37E7 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F2B78 Compression Method    0000 (0) 'Stored'\n-F2B7A Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F2B7E CRC                   00000000 (0)\n-F2B82 Compressed Size       00000000 (0)\n-F2B86 Uncompressed Size     00000000 (0)\n-F2B8A Filename Length       0061 (97)\n-F2B8C Extra Length          0000 (0)\n-F2B8E Comment Length        0000 (0)\n-F2B90 Disk Start            0000 (0)\n-F2B92 Int File Attributes   0000 (0)\n+F37E9 Compression Method    0000 (0) 'Stored'\n+F37EB Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F37EF CRC                   00000000 (0)\n+F37F3 Compressed Size       00000000 (0)\n+F37F7 Uncompressed Size     00000000 (0)\n+F37FB Filename Length       0061 (97)\n+F37FD Extra Length          0000 (0)\n+F37FF Comment Length        0000 (0)\n+F3801 Disk Start            0000 (0)\n+F3803 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F2B94 Ext File Attributes   41ED0010 (1106051088)\n+F3805 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F2B98 Local Header Offset   00006362 (25442)\n-F2B9C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F3809 Local Header Offset   00006362 (25442)\n+F380D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF2B9C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF380D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF2B9C: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF380D: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF2B74: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF37E5: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F2BFD CENTRAL HEADER #238   02014B50 (33639248)\n-F2C01 Created Zip Spec      14 (20) '2.0'\n-F2C02 Created OS            03 (3) 'Unix'\n-F2C03 Extract Zip Spec      0A (10) '1.0'\n-F2C04 Extract OS            00 (0) 'MS-DOS'\n-F2C05 General Purpose Flag  0800 (2048)\n+F386E CENTRAL HEADER #238   02014B50 (33639248)\n+F3872 Created Zip Spec      14 (20) '2.0'\n+F3873 Created OS            03 (3) 'Unix'\n+F3874 Extract Zip Spec      0A (10) '1.0'\n+F3875 Extract OS            00 (0) 'MS-DOS'\n+F3876 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F2C07 Compression Method    0000 (0) 'Stored'\n-F2C09 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F2C0D CRC                   00000000 (0)\n-F2C11 Compressed Size       00000000 (0)\n-F2C15 Uncompressed Size     00000000 (0)\n-F2C19 Filename Length       0063 (99)\n-F2C1B Extra Length          0000 (0)\n-F2C1D Comment Length        0000 (0)\n-F2C1F Disk Start            0000 (0)\n-F2C21 Int File Attributes   0000 (0)\n+F3878 Compression Method    0000 (0) 'Stored'\n+F387A Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F387E CRC                   00000000 (0)\n+F3882 Compressed Size       00000000 (0)\n+F3886 Uncompressed Size     00000000 (0)\n+F388A Filename Length       0063 (99)\n+F388C Extra Length          0000 (0)\n+F388E Comment Length        0000 (0)\n+F3890 Disk Start            0000 (0)\n+F3892 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F2C23 Ext File Attributes   41ED0010 (1106051088)\n+F3894 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F2C27 Local Header Offset   000063E1 (25569)\n-F2C2B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F3898 Local Header Offset   000063E1 (25569)\n+F389C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF2C2B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF389C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF2C2B: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF389C: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF2C03: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF3874: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F2C8E CENTRAL HEADER #239   02014B50 (33639248)\n-F2C92 Created Zip Spec      14 (20) '2.0'\n-F2C93 Created OS            03 (3) 'Unix'\n-F2C94 Extract Zip Spec      0A (10) '1.0'\n-F2C95 Extract OS            00 (0) 'MS-DOS'\n-F2C96 General Purpose Flag  0800 (2048)\n+F38FF CENTRAL HEADER #239   02014B50 (33639248)\n+F3903 Created Zip Spec      14 (20) '2.0'\n+F3904 Created OS            03 (3) 'Unix'\n+F3905 Extract Zip Spec      0A (10) '1.0'\n+F3906 Extract OS            00 (0) 'MS-DOS'\n+F3907 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F2C98 Compression Method    0000 (0) 'Stored'\n-F2C9A Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F2C9E CRC                   00000000 (0)\n-F2CA2 Compressed Size       00000000 (0)\n-F2CA6 Uncompressed Size     00000000 (0)\n-F2CAA Filename Length       0061 (97)\n-F2CAC Extra Length          0000 (0)\n-F2CAE Comment Length        0000 (0)\n-F2CB0 Disk Start            0000 (0)\n-F2CB2 Int File Attributes   0000 (0)\n+F3909 Compression Method    0000 (0) 'Stored'\n+F390B Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F390F CRC                   00000000 (0)\n+F3913 Compressed Size       00000000 (0)\n+F3917 Uncompressed Size     00000000 (0)\n+F391B Filename Length       0061 (97)\n+F391D Extra Length          0000 (0)\n+F391F Comment Length        0000 (0)\n+F3921 Disk Start            0000 (0)\n+F3923 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F2CB4 Ext File Attributes   41ED0010 (1106051088)\n+F3925 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F2CB8 Local Header Offset   00006462 (25698)\n-F2CBC Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F3929 Local Header Offset   00006462 (25698)\n+F392D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF2CBC: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF392D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF2CBC: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF392D: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF2C94: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF3905: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F2D1D CENTRAL HEADER #240   02014B50 (33639248)\n-F2D21 Created Zip Spec      14 (20) '2.0'\n-F2D22 Created OS            03 (3) 'Unix'\n-F2D23 Extract Zip Spec      0A (10) '1.0'\n-F2D24 Extract OS            00 (0) 'MS-DOS'\n-F2D25 General Purpose Flag  0800 (2048)\n+F398E CENTRAL HEADER #240   02014B50 (33639248)\n+F3992 Created Zip Spec      14 (20) '2.0'\n+F3993 Created OS            03 (3) 'Unix'\n+F3994 Extract Zip Spec      0A (10) '1.0'\n+F3995 Extract OS            00 (0) 'MS-DOS'\n+F3996 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F2D27 Compression Method    0000 (0) 'Stored'\n-F2D29 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F2D2D CRC                   00000000 (0)\n-F2D31 Compressed Size       00000000 (0)\n-F2D35 Uncompressed Size     00000000 (0)\n-F2D39 Filename Length       0067 (103)\n-F2D3B Extra Length          0000 (0)\n-F2D3D Comment Length        0000 (0)\n-F2D3F Disk Start            0000 (0)\n-F2D41 Int File Attributes   0000 (0)\n+F3998 Compression Method    0000 (0) 'Stored'\n+F399A Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F399E CRC                   00000000 (0)\n+F39A2 Compressed Size       00000000 (0)\n+F39A6 Uncompressed Size     00000000 (0)\n+F39AA Filename Length       0067 (103)\n+F39AC Extra Length          0000 (0)\n+F39AE Comment Length        0000 (0)\n+F39B0 Disk Start            0000 (0)\n+F39B2 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F2D43 Ext File Attributes   41ED0010 (1106051088)\n+F39B4 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F2D47 Local Header Offset   000064E1 (25825)\n-F2D4B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F39B8 Local Header Offset   000064E1 (25825)\n+F39BC Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF2D4B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF39BC: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF2D4B: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF39BC: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF2D23: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF3994: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F2DB2 CENTRAL HEADER #241   02014B50 (33639248)\n-F2DB6 Created Zip Spec      14 (20) '2.0'\n-F2DB7 Created OS            03 (3) 'Unix'\n-F2DB8 Extract Zip Spec      0A (10) '1.0'\n-F2DB9 Extract OS            00 (0) 'MS-DOS'\n-F2DBA General Purpose Flag  0800 (2048)\n+F3A23 CENTRAL HEADER #241   02014B50 (33639248)\n+F3A27 Created Zip Spec      14 (20) '2.0'\n+F3A28 Created OS            03 (3) 'Unix'\n+F3A29 Extract Zip Spec      0A (10) '1.0'\n+F3A2A Extract OS            00 (0) 'MS-DOS'\n+F3A2B General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F2DBC Compression Method    0000 (0) 'Stored'\n-F2DBE Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F2DC2 CRC                   00000000 (0)\n-F2DC6 Compressed Size       00000000 (0)\n-F2DCA Uncompressed Size     00000000 (0)\n-F2DCE Filename Length       005E (94)\n-F2DD0 Extra Length          0000 (0)\n-F2DD2 Comment Length        0000 (0)\n-F2DD4 Disk Start            0000 (0)\n-F2DD6 Int File Attributes   0000 (0)\n+F3A2D Compression Method    0000 (0) 'Stored'\n+F3A2F Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F3A33 CRC                   00000000 (0)\n+F3A37 Compressed Size       00000000 (0)\n+F3A3B Uncompressed Size     00000000 (0)\n+F3A3F Filename Length       005E (94)\n+F3A41 Extra Length          0000 (0)\n+F3A43 Comment Length        0000 (0)\n+F3A45 Disk Start            0000 (0)\n+F3A47 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F2DD8 Ext File Attributes   41ED0010 (1106051088)\n+F3A49 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F2DDC Local Header Offset   00006566 (25958)\n-F2DE0 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F3A4D Local Header Offset   00006566 (25958)\n+F3A51 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF2DE0: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF3A51: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF2DE0: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF3A51: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF2DB8: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF3A29: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F2E3E CENTRAL HEADER #242   02014B50 (33639248)\n-F2E42 Created Zip Spec      14 (20) '2.0'\n-F2E43 Created OS            03 (3) 'Unix'\n-F2E44 Extract Zip Spec      0A (10) '1.0'\n-F2E45 Extract OS            00 (0) 'MS-DOS'\n-F2E46 General Purpose Flag  0800 (2048)\n+F3AAF CENTRAL HEADER #242   02014B50 (33639248)\n+F3AB3 Created Zip Spec      14 (20) '2.0'\n+F3AB4 Created OS            03 (3) 'Unix'\n+F3AB5 Extract Zip Spec      0A (10) '1.0'\n+F3AB6 Extract OS            00 (0) 'MS-DOS'\n+F3AB7 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F2E48 Compression Method    0000 (0) 'Stored'\n-F2E4A Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F2E4E CRC                   00000000 (0)\n-F2E52 Compressed Size       00000000 (0)\n-F2E56 Uncompressed Size     00000000 (0)\n-F2E5A Filename Length       0061 (97)\n-F2E5C Extra Length          0000 (0)\n-F2E5E Comment Length        0000 (0)\n-F2E60 Disk Start            0000 (0)\n-F2E62 Int File Attributes   0000 (0)\n+F3AB9 Compression Method    0000 (0) 'Stored'\n+F3ABB Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F3ABF CRC                   00000000 (0)\n+F3AC3 Compressed Size       00000000 (0)\n+F3AC7 Uncompressed Size     00000000 (0)\n+F3ACB Filename Length       0061 (97)\n+F3ACD Extra Length          0000 (0)\n+F3ACF Comment Length        0000 (0)\n+F3AD1 Disk Start            0000 (0)\n+F3AD3 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F2E64 Ext File Attributes   41ED0010 (1106051088)\n+F3AD5 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F2E68 Local Header Offset   000065E2 (26082)\n-F2E6C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F3AD9 Local Header Offset   000065E2 (26082)\n+F3ADD Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF2E6C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF3ADD: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF2E6C: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF3ADD: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF2E44: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF3AB5: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F2ECD CENTRAL HEADER #243   02014B50 (33639248)\n-F2ED1 Created Zip Spec      14 (20) '2.0'\n-F2ED2 Created OS            03 (3) 'Unix'\n-F2ED3 Extract Zip Spec      0A (10) '1.0'\n-F2ED4 Extract OS            00 (0) 'MS-DOS'\n-F2ED5 General Purpose Flag  0800 (2048)\n+F3B3E CENTRAL HEADER #243   02014B50 (33639248)\n+F3B42 Created Zip Spec      14 (20) '2.0'\n+F3B43 Created OS            03 (3) 'Unix'\n+F3B44 Extract Zip Spec      0A (10) '1.0'\n+F3B45 Extract OS            00 (0) 'MS-DOS'\n+F3B46 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F2ED7 Compression Method    0000 (0) 'Stored'\n-F2ED9 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F2EDD CRC                   00000000 (0)\n-F2EE1 Compressed Size       00000000 (0)\n-F2EE5 Uncompressed Size     00000000 (0)\n-F2EE9 Filename Length       005D (93)\n-F2EEB Extra Length          0000 (0)\n-F2EED Comment Length        0000 (0)\n-F2EEF Disk Start            0000 (0)\n-F2EF1 Int File Attributes   0000 (0)\n+F3B48 Compression Method    0000 (0) 'Stored'\n+F3B4A Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F3B4E CRC                   00000000 (0)\n+F3B52 Compressed Size       00000000 (0)\n+F3B56 Uncompressed Size     00000000 (0)\n+F3B5A Filename Length       005D (93)\n+F3B5C Extra Length          0000 (0)\n+F3B5E Comment Length        0000 (0)\n+F3B60 Disk Start            0000 (0)\n+F3B62 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F2EF3 Ext File Attributes   41ED0010 (1106051088)\n+F3B64 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F2EF7 Local Header Offset   00006661 (26209)\n-F2EFB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F3B68 Local Header Offset   00006661 (26209)\n+F3B6C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF2EFB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF3B6C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF2EFB: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF3B6C: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF2ED3: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF3B44: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F2F58 CENTRAL HEADER #244   02014B50 (33639248)\n-F2F5C Created Zip Spec      14 (20) '2.0'\n-F2F5D Created OS            03 (3) 'Unix'\n-F2F5E Extract Zip Spec      0A (10) '1.0'\n-F2F5F Extract OS            00 (0) 'MS-DOS'\n-F2F60 General Purpose Flag  0800 (2048)\n+F3BC9 CENTRAL HEADER #244   02014B50 (33639248)\n+F3BCD Created Zip Spec      14 (20) '2.0'\n+F3BCE Created OS            03 (3) 'Unix'\n+F3BCF Extract Zip Spec      0A (10) '1.0'\n+F3BD0 Extract OS            00 (0) 'MS-DOS'\n+F3BD1 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F2F62 Compression Method    0000 (0) 'Stored'\n-F2F64 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F2F68 CRC                   00000000 (0)\n-F2F6C Compressed Size       00000000 (0)\n-F2F70 Uncompressed Size     00000000 (0)\n-F2F74 Filename Length       0065 (101)\n-F2F76 Extra Length          0000 (0)\n-F2F78 Comment Length        0000 (0)\n-F2F7A Disk Start            0000 (0)\n-F2F7C Int File Attributes   0000 (0)\n+F3BD3 Compression Method    0000 (0) 'Stored'\n+F3BD5 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F3BD9 CRC                   00000000 (0)\n+F3BDD Compressed Size       00000000 (0)\n+F3BE1 Uncompressed Size     00000000 (0)\n+F3BE5 Filename Length       0065 (101)\n+F3BE7 Extra Length          0000 (0)\n+F3BE9 Comment Length        0000 (0)\n+F3BEB Disk Start            0000 (0)\n+F3BED Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F2F7E Ext File Attributes   41ED0010 (1106051088)\n+F3BEF Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F2F82 Local Header Offset   000066DC (26332)\n-F2F86 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F3BF3 Local Header Offset   000066DC (26332)\n+F3BF7 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF2F86: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF3BF7: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF2F86: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF3BF7: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF2F5E: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF3BCF: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F2FEB CENTRAL HEADER #245   02014B50 (33639248)\n-F2FEF Created Zip Spec      14 (20) '2.0'\n-F2FF0 Created OS            03 (3) 'Unix'\n-F2FF1 Extract Zip Spec      0A (10) '1.0'\n-F2FF2 Extract OS            00 (0) 'MS-DOS'\n-F2FF3 General Purpose Flag  0800 (2048)\n+F3C5C CENTRAL HEADER #245   02014B50 (33639248)\n+F3C60 Created Zip Spec      14 (20) '2.0'\n+F3C61 Created OS            03 (3) 'Unix'\n+F3C62 Extract Zip Spec      0A (10) '1.0'\n+F3C63 Extract OS            00 (0) 'MS-DOS'\n+F3C64 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F2FF5 Compression Method    0000 (0) 'Stored'\n-F2FF7 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F2FFB CRC                   00000000 (0)\n-F2FFF Compressed Size       00000000 (0)\n-F3003 Uncompressed Size     00000000 (0)\n-F3007 Filename Length       0064 (100)\n-F3009 Extra Length          0000 (0)\n-F300B Comment Length        0000 (0)\n-F300D Disk Start            0000 (0)\n-F300F Int File Attributes   0000 (0)\n+F3C66 Compression Method    0000 (0) 'Stored'\n+F3C68 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F3C6C CRC                   00000000 (0)\n+F3C70 Compressed Size       00000000 (0)\n+F3C74 Uncompressed Size     00000000 (0)\n+F3C78 Filename Length       0064 (100)\n+F3C7A Extra Length          0000 (0)\n+F3C7C Comment Length        0000 (0)\n+F3C7E Disk Start            0000 (0)\n+F3C80 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F3011 Ext File Attributes   41ED0010 (1106051088)\n+F3C82 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F3015 Local Header Offset   0000675F (26463)\n-F3019 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F3C86 Local Header Offset   0000675F (26463)\n+F3C8A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF3019: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF3C8A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF3019: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF3C8A: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF2FF1: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF3C62: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F307D CENTRAL HEADER #246   02014B50 (33639248)\n-F3081 Created Zip Spec      14 (20) '2.0'\n-F3082 Created OS            03 (3) 'Unix'\n-F3083 Extract Zip Spec      0A (10) '1.0'\n-F3084 Extract OS            00 (0) 'MS-DOS'\n-F3085 General Purpose Flag  0800 (2048)\n+F3CEE CENTRAL HEADER #246   02014B50 (33639248)\n+F3CF2 Created Zip Spec      14 (20) '2.0'\n+F3CF3 Created OS            03 (3) 'Unix'\n+F3CF4 Extract Zip Spec      0A (10) '1.0'\n+F3CF5 Extract OS            00 (0) 'MS-DOS'\n+F3CF6 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F3087 Compression Method    0000 (0) 'Stored'\n-F3089 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F308D CRC                   00000000 (0)\n-F3091 Compressed Size       00000000 (0)\n-F3095 Uncompressed Size     00000000 (0)\n-F3099 Filename Length       0065 (101)\n-F309B Extra Length          0000 (0)\n-F309D Comment Length        0000 (0)\n-F309F Disk Start            0000 (0)\n-F30A1 Int File Attributes   0000 (0)\n+F3CF8 Compression Method    0000 (0) 'Stored'\n+F3CFA Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F3CFE CRC                   00000000 (0)\n+F3D02 Compressed Size       00000000 (0)\n+F3D06 Uncompressed Size     00000000 (0)\n+F3D0A Filename Length       0065 (101)\n+F3D0C Extra Length          0000 (0)\n+F3D0E Comment Length        0000 (0)\n+F3D10 Disk Start            0000 (0)\n+F3D12 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F30A3 Ext File Attributes   41ED0010 (1106051088)\n+F3D14 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F30A7 Local Header Offset   000067E1 (26593)\n-F30AB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F3D18 Local Header Offset   000067E1 (26593)\n+F3D1C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF30AB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF3D1C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF30AB: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF3D1C: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF3083: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF3CF4: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F3110 CENTRAL HEADER #247   02014B50 (33639248)\n-F3114 Created Zip Spec      14 (20) '2.0'\n-F3115 Created OS            03 (3) 'Unix'\n-F3116 Extract Zip Spec      0A (10) '1.0'\n-F3117 Extract OS            00 (0) 'MS-DOS'\n-F3118 General Purpose Flag  0800 (2048)\n+F3D81 CENTRAL HEADER #247   02014B50 (33639248)\n+F3D85 Created Zip Spec      14 (20) '2.0'\n+F3D86 Created OS            03 (3) 'Unix'\n+F3D87 Extract Zip Spec      0A (10) '1.0'\n+F3D88 Extract OS            00 (0) 'MS-DOS'\n+F3D89 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F311A Compression Method    0000 (0) 'Stored'\n-F311C Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F3120 CRC                   00000000 (0)\n-F3124 Compressed Size       00000000 (0)\n-F3128 Uncompressed Size     00000000 (0)\n-F312C Filename Length       0063 (99)\n-F312E Extra Length          0000 (0)\n-F3130 Comment Length        0000 (0)\n-F3132 Disk Start            0000 (0)\n-F3134 Int File Attributes   0000 (0)\n+F3D8B Compression Method    0000 (0) 'Stored'\n+F3D8D Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F3D91 CRC                   00000000 (0)\n+F3D95 Compressed Size       00000000 (0)\n+F3D99 Uncompressed Size     00000000 (0)\n+F3D9D Filename Length       0063 (99)\n+F3D9F Extra Length          0000 (0)\n+F3DA1 Comment Length        0000 (0)\n+F3DA3 Disk Start            0000 (0)\n+F3DA5 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F3136 Ext File Attributes   41ED0010 (1106051088)\n+F3DA7 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F313A Local Header Offset   00006864 (26724)\n-F313E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F3DAB Local Header Offset   00006864 (26724)\n+F3DAF Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF313E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF3DAF: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF313E: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF3DAF: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF3116: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF3D87: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F31A1 CENTRAL HEADER #248   02014B50 (33639248)\n-F31A5 Created Zip Spec      14 (20) '2.0'\n-F31A6 Created OS            03 (3) 'Unix'\n-F31A7 Extract Zip Spec      0A (10) '1.0'\n-F31A8 Extract OS            00 (0) 'MS-DOS'\n-F31A9 General Purpose Flag  0800 (2048)\n+F3E12 CENTRAL HEADER #248   02014B50 (33639248)\n+F3E16 Created Zip Spec      14 (20) '2.0'\n+F3E17 Created OS            03 (3) 'Unix'\n+F3E18 Extract Zip Spec      0A (10) '1.0'\n+F3E19 Extract OS            00 (0) 'MS-DOS'\n+F3E1A General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F31AB Compression Method    0000 (0) 'Stored'\n-F31AD Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F31B1 CRC                   00000000 (0)\n-F31B5 Compressed Size       00000000 (0)\n-F31B9 Uncompressed Size     00000000 (0)\n-F31BD Filename Length       0061 (97)\n-F31BF Extra Length          0000 (0)\n-F31C1 Comment Length        0000 (0)\n-F31C3 Disk Start            0000 (0)\n-F31C5 Int File Attributes   0000 (0)\n+F3E1C Compression Method    0000 (0) 'Stored'\n+F3E1E Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F3E22 CRC                   00000000 (0)\n+F3E26 Compressed Size       00000000 (0)\n+F3E2A Uncompressed Size     00000000 (0)\n+F3E2E Filename Length       0061 (97)\n+F3E30 Extra Length          0000 (0)\n+F3E32 Comment Length        0000 (0)\n+F3E34 Disk Start            0000 (0)\n+F3E36 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F31C7 Ext File Attributes   41ED0010 (1106051088)\n+F3E38 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F31CB Local Header Offset   000068E5 (26853)\n-F31CF Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F3E3C Local Header Offset   000068E5 (26853)\n+F3E40 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF31CF: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF3E40: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF31CF: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF3E40: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF31A7: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF3E18: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F3230 CENTRAL HEADER #249   02014B50 (33639248)\n-F3234 Created Zip Spec      14 (20) '2.0'\n-F3235 Created OS            03 (3) 'Unix'\n-F3236 Extract Zip Spec      0A (10) '1.0'\n-F3237 Extract OS            00 (0) 'MS-DOS'\n-F3238 General Purpose Flag  0800 (2048)\n+F3EA1 CENTRAL HEADER #249   02014B50 (33639248)\n+F3EA5 Created Zip Spec      14 (20) '2.0'\n+F3EA6 Created OS            03 (3) 'Unix'\n+F3EA7 Extract Zip Spec      0A (10) '1.0'\n+F3EA8 Extract OS            00 (0) 'MS-DOS'\n+F3EA9 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F323A Compression Method    0000 (0) 'Stored'\n-F323C Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F3240 CRC                   00000000 (0)\n-F3244 Compressed Size       00000000 (0)\n-F3248 Uncompressed Size     00000000 (0)\n-F324C Filename Length       0064 (100)\n-F324E Extra Length          0000 (0)\n-F3250 Comment Length        0000 (0)\n-F3252 Disk Start            0000 (0)\n-F3254 Int File Attributes   0000 (0)\n+F3EAB Compression Method    0000 (0) 'Stored'\n+F3EAD Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F3EB1 CRC                   00000000 (0)\n+F3EB5 Compressed Size       00000000 (0)\n+F3EB9 Uncompressed Size     00000000 (0)\n+F3EBD Filename Length       0064 (100)\n+F3EBF Extra Length          0000 (0)\n+F3EC1 Comment Length        0000 (0)\n+F3EC3 Disk Start            0000 (0)\n+F3EC5 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F3256 Ext File Attributes   41ED0010 (1106051088)\n+F3EC7 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F325A Local Header Offset   00006964 (26980)\n-F325E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F3ECB Local Header Offset   00006964 (26980)\n+F3ECF Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF325E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF3ECF: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF325E: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF3ECF: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF3236: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF3EA7: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F32C2 CENTRAL HEADER #250   02014B50 (33639248)\n-F32C6 Created Zip Spec      14 (20) '2.0'\n-F32C7 Created OS            03 (3) 'Unix'\n-F32C8 Extract Zip Spec      0A (10) '1.0'\n-F32C9 Extract OS            00 (0) 'MS-DOS'\n-F32CA General Purpose Flag  0800 (2048)\n+F3F33 CENTRAL HEADER #250   02014B50 (33639248)\n+F3F37 Created Zip Spec      14 (20) '2.0'\n+F3F38 Created OS            03 (3) 'Unix'\n+F3F39 Extract Zip Spec      0A (10) '1.0'\n+F3F3A Extract OS            00 (0) 'MS-DOS'\n+F3F3B General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F32CC Compression Method    0000 (0) 'Stored'\n-F32CE Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F32D2 CRC                   00000000 (0)\n-F32D6 Compressed Size       00000000 (0)\n-F32DA Uncompressed Size     00000000 (0)\n-F32DE Filename Length       005A (90)\n-F32E0 Extra Length          0000 (0)\n-F32E2 Comment Length        0000 (0)\n-F32E4 Disk Start            0000 (0)\n-F32E6 Int File Attributes   0000 (0)\n+F3F3D Compression Method    0000 (0) 'Stored'\n+F3F3F Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F3F43 CRC                   00000000 (0)\n+F3F47 Compressed Size       00000000 (0)\n+F3F4B Uncompressed Size     00000000 (0)\n+F3F4F Filename Length       005A (90)\n+F3F51 Extra Length          0000 (0)\n+F3F53 Comment Length        0000 (0)\n+F3F55 Disk Start            0000 (0)\n+F3F57 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F32E8 Ext File Attributes   41ED0010 (1106051088)\n+F3F59 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F32EC Local Header Offset   000069E6 (27110)\n-F32F0 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F3F5D Local Header Offset   000069E6 (27110)\n+F3F61 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF32F0: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF3F61: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF32F0: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF3F61: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF32C8: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF3F39: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F334A CENTRAL HEADER #251   02014B50 (33639248)\n-F334E Created Zip Spec      14 (20) '2.0'\n-F334F Created OS            03 (3) 'Unix'\n-F3350 Extract Zip Spec      0A (10) '1.0'\n-F3351 Extract OS            00 (0) 'MS-DOS'\n-F3352 General Purpose Flag  0800 (2048)\n+F3FBB CENTRAL HEADER #251   02014B50 (33639248)\n+F3FBF Created Zip Spec      14 (20) '2.0'\n+F3FC0 Created OS            03 (3) 'Unix'\n+F3FC1 Extract Zip Spec      0A (10) '1.0'\n+F3FC2 Extract OS            00 (0) 'MS-DOS'\n+F3FC3 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F3354 Compression Method    0000 (0) 'Stored'\n-F3356 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F335A CRC                   00000000 (0)\n-F335E Compressed Size       00000000 (0)\n-F3362 Uncompressed Size     00000000 (0)\n-F3366 Filename Length       005B (91)\n-F3368 Extra Length          0000 (0)\n-F336A Comment Length        0000 (0)\n-F336C Disk Start            0000 (0)\n-F336E Int File Attributes   0000 (0)\n+F3FC5 Compression Method    0000 (0) 'Stored'\n+F3FC7 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F3FCB CRC                   00000000 (0)\n+F3FCF Compressed Size       00000000 (0)\n+F3FD3 Uncompressed Size     00000000 (0)\n+F3FD7 Filename Length       005B (91)\n+F3FD9 Extra Length          0000 (0)\n+F3FDB Comment Length        0000 (0)\n+F3FDD Disk Start            0000 (0)\n+F3FDF Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F3370 Ext File Attributes   41ED0010 (1106051088)\n+F3FE1 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F3374 Local Header Offset   00006A5E (27230)\n-F3378 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F3FE5 Local Header Offset   00006A5E (27230)\n+F3FE9 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF3378: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF3FE9: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF3378: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF3FE9: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF3350: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF3FC1: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F33D3 CENTRAL HEADER #252   02014B50 (33639248)\n-F33D7 Created Zip Spec      14 (20) '2.0'\n-F33D8 Created OS            03 (3) 'Unix'\n-F33D9 Extract Zip Spec      0A (10) '1.0'\n-F33DA Extract OS            00 (0) 'MS-DOS'\n-F33DB General Purpose Flag  0800 (2048)\n+F4044 CENTRAL HEADER #252   02014B50 (33639248)\n+F4048 Created Zip Spec      14 (20) '2.0'\n+F4049 Created OS            03 (3) 'Unix'\n+F404A Extract Zip Spec      0A (10) '1.0'\n+F404B Extract OS            00 (0) 'MS-DOS'\n+F404C General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F33DD Compression Method    0000 (0) 'Stored'\n-F33DF Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F33E3 CRC                   00000000 (0)\n-F33E7 Compressed Size       00000000 (0)\n-F33EB Uncompressed Size     00000000 (0)\n-F33EF Filename Length       005B (91)\n-F33F1 Extra Length          0000 (0)\n-F33F3 Comment Length        0000 (0)\n-F33F5 Disk Start            0000 (0)\n-F33F7 Int File Attributes   0000 (0)\n+F404E Compression Method    0000 (0) 'Stored'\n+F4050 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F4054 CRC                   00000000 (0)\n+F4058 Compressed Size       00000000 (0)\n+F405C Uncompressed Size     00000000 (0)\n+F4060 Filename Length       005B (91)\n+F4062 Extra Length          0000 (0)\n+F4064 Comment Length        0000 (0)\n+F4066 Disk Start            0000 (0)\n+F4068 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F33F9 Ext File Attributes   41ED0010 (1106051088)\n+F406A Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F33FD Local Header Offset   00006AD7 (27351)\n-F3401 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F406E Local Header Offset   00006AD7 (27351)\n+F4072 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF3401: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF4072: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF3401: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF4072: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF33D9: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF404A: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F345C CENTRAL HEADER #253   02014B50 (33639248)\n-F3460 Created Zip Spec      14 (20) '2.0'\n-F3461 Created OS            03 (3) 'Unix'\n-F3462 Extract Zip Spec      0A (10) '1.0'\n-F3463 Extract OS            00 (0) 'MS-DOS'\n-F3464 General Purpose Flag  0800 (2048)\n+F40CD CENTRAL HEADER #253   02014B50 (33639248)\n+F40D1 Created Zip Spec      14 (20) '2.0'\n+F40D2 Created OS            03 (3) 'Unix'\n+F40D3 Extract Zip Spec      0A (10) '1.0'\n+F40D4 Extract OS            00 (0) 'MS-DOS'\n+F40D5 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F3466 Compression Method    0000 (0) 'Stored'\n-F3468 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F346C CRC                   00000000 (0)\n-F3470 Compressed Size       00000000 (0)\n-F3474 Uncompressed Size     00000000 (0)\n-F3478 Filename Length       005C (92)\n-F347A Extra Length          0000 (0)\n-F347C Comment Length        0000 (0)\n-F347E Disk Start            0000 (0)\n-F3480 Int File Attributes   0000 (0)\n+F40D7 Compression Method    0000 (0) 'Stored'\n+F40D9 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F40DD CRC                   00000000 (0)\n+F40E1 Compressed Size       00000000 (0)\n+F40E5 Uncompressed Size     00000000 (0)\n+F40E9 Filename Length       005C (92)\n+F40EB Extra Length          0000 (0)\n+F40ED Comment Length        0000 (0)\n+F40EF Disk Start            0000 (0)\n+F40F1 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F3482 Ext File Attributes   41ED0010 (1106051088)\n+F40F3 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F3486 Local Header Offset   00006B50 (27472)\n-F348A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F40F7 Local Header Offset   00006B50 (27472)\n+F40FB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF348A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF40FB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF348A: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF40FB: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF3462: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF40D3: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F34E6 CENTRAL HEADER #254   02014B50 (33639248)\n-F34EA Created Zip Spec      14 (20) '2.0'\n-F34EB Created OS            03 (3) 'Unix'\n-F34EC Extract Zip Spec      0A (10) '1.0'\n-F34ED Extract OS            00 (0) 'MS-DOS'\n-F34EE General Purpose Flag  0800 (2048)\n+F4157 CENTRAL HEADER #254   02014B50 (33639248)\n+F415B Created Zip Spec      14 (20) '2.0'\n+F415C Created OS            03 (3) 'Unix'\n+F415D Extract Zip Spec      0A (10) '1.0'\n+F415E Extract OS            00 (0) 'MS-DOS'\n+F415F General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F34F0 Compression Method    0000 (0) 'Stored'\n-F34F2 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F34F6 CRC                   00000000 (0)\n-F34FA Compressed Size       00000000 (0)\n-F34FE Uncompressed Size     00000000 (0)\n-F3502 Filename Length       005F (95)\n-F3504 Extra Length          0000 (0)\n-F3506 Comment Length        0000 (0)\n-F3508 Disk Start            0000 (0)\n-F350A Int File Attributes   0000 (0)\n+F4161 Compression Method    0000 (0) 'Stored'\n+F4163 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F4167 CRC                   00000000 (0)\n+F416B Compressed Size       00000000 (0)\n+F416F Uncompressed Size     00000000 (0)\n+F4173 Filename Length       005F (95)\n+F4175 Extra Length          0000 (0)\n+F4177 Comment Length        0000 (0)\n+F4179 Disk Start            0000 (0)\n+F417B Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F350C Ext File Attributes   41ED0010 (1106051088)\n+F417D Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F3510 Local Header Offset   00006BCA (27594)\n-F3514 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F4181 Local Header Offset   00006BCA (27594)\n+F4185 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF3514: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF4185: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF3514: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF4185: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF34EC: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF415D: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F3573 CENTRAL HEADER #255   02014B50 (33639248)\n-F3577 Created Zip Spec      14 (20) '2.0'\n-F3578 Created OS            03 (3) 'Unix'\n-F3579 Extract Zip Spec      0A (10) '1.0'\n-F357A Extract OS            00 (0) 'MS-DOS'\n-F357B General Purpose Flag  0800 (2048)\n+F41E4 CENTRAL HEADER #255   02014B50 (33639248)\n+F41E8 Created Zip Spec      14 (20) '2.0'\n+F41E9 Created OS            03 (3) 'Unix'\n+F41EA Extract Zip Spec      0A (10) '1.0'\n+F41EB Extract OS            00 (0) 'MS-DOS'\n+F41EC General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F357D Compression Method    0000 (0) 'Stored'\n-F357F Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F3583 CRC                   00000000 (0)\n-F3587 Compressed Size       00000000 (0)\n-F358B Uncompressed Size     00000000 (0)\n-F358F Filename Length       005F (95)\n-F3591 Extra Length          0000 (0)\n-F3593 Comment Length        0000 (0)\n-F3595 Disk Start            0000 (0)\n-F3597 Int File Attributes   0000 (0)\n+F41EE Compression Method    0000 (0) 'Stored'\n+F41F0 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F41F4 CRC                   00000000 (0)\n+F41F8 Compressed Size       00000000 (0)\n+F41FC Uncompressed Size     00000000 (0)\n+F4200 Filename Length       005F (95)\n+F4202 Extra Length          0000 (0)\n+F4204 Comment Length        0000 (0)\n+F4206 Disk Start            0000 (0)\n+F4208 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F3599 Ext File Attributes   41ED0010 (1106051088)\n+F420A Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F359D Local Header Offset   00006C47 (27719)\n-F35A1 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F420E Local Header Offset   00006C47 (27719)\n+F4212 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF35A1: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF4212: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF35A1: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF4212: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF3579: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF41EA: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F3600 CENTRAL HEADER #256   02014B50 (33639248)\n-F3604 Created Zip Spec      14 (20) '2.0'\n-F3605 Created OS            03 (3) 'Unix'\n-F3606 Extract Zip Spec      0A (10) '1.0'\n-F3607 Extract OS            00 (0) 'MS-DOS'\n-F3608 General Purpose Flag  0800 (2048)\n+F4271 CENTRAL HEADER #256   02014B50 (33639248)\n+F4275 Created Zip Spec      14 (20) '2.0'\n+F4276 Created OS            03 (3) 'Unix'\n+F4277 Extract Zip Spec      0A (10) '1.0'\n+F4278 Extract OS            00 (0) 'MS-DOS'\n+F4279 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F360A Compression Method    0000 (0) 'Stored'\n-F360C Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F3610 CRC                   00000000 (0)\n-F3614 Compressed Size       00000000 (0)\n-F3618 Uncompressed Size     00000000 (0)\n-F361C Filename Length       005E (94)\n-F361E Extra Length          0000 (0)\n-F3620 Comment Length        0000 (0)\n-F3622 Disk Start            0000 (0)\n-F3624 Int File Attributes   0000 (0)\n+F427B Compression Method    0000 (0) 'Stored'\n+F427D Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F4281 CRC                   00000000 (0)\n+F4285 Compressed Size       00000000 (0)\n+F4289 Uncompressed Size     00000000 (0)\n+F428D Filename Length       005E (94)\n+F428F Extra Length          0000 (0)\n+F4291 Comment Length        0000 (0)\n+F4293 Disk Start            0000 (0)\n+F4295 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F3626 Ext File Attributes   41ED0010 (1106051088)\n+F4297 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F362A Local Header Offset   00006CC4 (27844)\n-F362E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F429B Local Header Offset   00006CC4 (27844)\n+F429F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF362E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF429F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF362E: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF429F: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF3606: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF4277: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F368C CENTRAL HEADER #257   02014B50 (33639248)\n-F3690 Created Zip Spec      14 (20) '2.0'\n-F3691 Created OS            03 (3) 'Unix'\n-F3692 Extract Zip Spec      0A (10) '1.0'\n-F3693 Extract OS            00 (0) 'MS-DOS'\n-F3694 General Purpose Flag  0800 (2048)\n+F42FD CENTRAL HEADER #257   02014B50 (33639248)\n+F4301 Created Zip Spec      14 (20) '2.0'\n+F4302 Created OS            03 (3) 'Unix'\n+F4303 Extract Zip Spec      0A (10) '1.0'\n+F4304 Extract OS            00 (0) 'MS-DOS'\n+F4305 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F3696 Compression Method    0000 (0) 'Stored'\n-F3698 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F369C CRC                   00000000 (0)\n-F36A0 Compressed Size       00000000 (0)\n-F36A4 Uncompressed Size     00000000 (0)\n-F36A8 Filename Length       0062 (98)\n-F36AA Extra Length          0000 (0)\n-F36AC Comment Length        0000 (0)\n-F36AE Disk Start            0000 (0)\n-F36B0 Int File Attributes   0000 (0)\n+F4307 Compression Method    0000 (0) 'Stored'\n+F4309 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F430D CRC                   00000000 (0)\n+F4311 Compressed Size       00000000 (0)\n+F4315 Uncompressed Size     00000000 (0)\n+F4319 Filename Length       0062 (98)\n+F431B Extra Length          0000 (0)\n+F431D Comment Length        0000 (0)\n+F431F Disk Start            0000 (0)\n+F4321 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F36B2 Ext File Attributes   41ED0010 (1106051088)\n+F4323 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F36B6 Local Header Offset   00006D40 (27968)\n-F36BA Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F4327 Local Header Offset   00006D40 (27968)\n+F432B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF36BA: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF432B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF36BA: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF432B: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF3692: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF4303: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F371C CENTRAL HEADER #258   02014B50 (33639248)\n-F3720 Created Zip Spec      14 (20) '2.0'\n-F3721 Created OS            03 (3) 'Unix'\n-F3722 Extract Zip Spec      0A (10) '1.0'\n-F3723 Extract OS            00 (0) 'MS-DOS'\n-F3724 General Purpose Flag  0800 (2048)\n+F438D CENTRAL HEADER #258   02014B50 (33639248)\n+F4391 Created Zip Spec      14 (20) '2.0'\n+F4392 Created OS            03 (3) 'Unix'\n+F4393 Extract Zip Spec      0A (10) '1.0'\n+F4394 Extract OS            00 (0) 'MS-DOS'\n+F4395 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F3726 Compression Method    0000 (0) 'Stored'\n-F3728 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F372C CRC                   00000000 (0)\n-F3730 Compressed Size       00000000 (0)\n-F3734 Uncompressed Size     00000000 (0)\n-F3738 Filename Length       005B (91)\n-F373A Extra Length          0000 (0)\n-F373C Comment Length        0000 (0)\n-F373E Disk Start            0000 (0)\n-F3740 Int File Attributes   0000 (0)\n+F4397 Compression Method    0000 (0) 'Stored'\n+F4399 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F439D CRC                   00000000 (0)\n+F43A1 Compressed Size       00000000 (0)\n+F43A5 Uncompressed Size     00000000 (0)\n+F43A9 Filename Length       005B (91)\n+F43AB Extra Length          0000 (0)\n+F43AD Comment Length        0000 (0)\n+F43AF Disk Start            0000 (0)\n+F43B1 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F3742 Ext File Attributes   41ED0010 (1106051088)\n+F43B3 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F3746 Local Header Offset   00006DC0 (28096)\n-F374A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F43B7 Local Header Offset   00006DC0 (28096)\n+F43BB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF374A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF43BB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF374A: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF43BB: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF3722: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF4393: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F37A5 CENTRAL HEADER #259   02014B50 (33639248)\n-F37A9 Created Zip Spec      14 (20) '2.0'\n-F37AA Created OS            03 (3) 'Unix'\n-F37AB Extract Zip Spec      0A (10) '1.0'\n-F37AC Extract OS            00 (0) 'MS-DOS'\n-F37AD General Purpose Flag  0800 (2048)\n+F4416 CENTRAL HEADER #259   02014B50 (33639248)\n+F441A Created Zip Spec      14 (20) '2.0'\n+F441B Created OS            03 (3) 'Unix'\n+F441C Extract Zip Spec      0A (10) '1.0'\n+F441D Extract OS            00 (0) 'MS-DOS'\n+F441E General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F37AF Compression Method    0000 (0) 'Stored'\n-F37B1 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F37B5 CRC                   00000000 (0)\n-F37B9 Compressed Size       00000000 (0)\n-F37BD Uncompressed Size     00000000 (0)\n-F37C1 Filename Length       005E (94)\n-F37C3 Extra Length          0000 (0)\n-F37C5 Comment Length        0000 (0)\n-F37C7 Disk Start            0000 (0)\n-F37C9 Int File Attributes   0000 (0)\n+F4420 Compression Method    0000 (0) 'Stored'\n+F4422 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F4426 CRC                   00000000 (0)\n+F442A Compressed Size       00000000 (0)\n+F442E Uncompressed Size     00000000 (0)\n+F4432 Filename Length       005E (94)\n+F4434 Extra Length          0000 (0)\n+F4436 Comment Length        0000 (0)\n+F4438 Disk Start            0000 (0)\n+F443A Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F37CB Ext File Attributes   41ED0010 (1106051088)\n+F443C Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F37CF Local Header Offset   00006E39 (28217)\n-F37D3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F4440 Local Header Offset   00006E39 (28217)\n+F4444 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF37D3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF4444: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF37D3: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF4444: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF37AB: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF441C: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F3831 CENTRAL HEADER #260   02014B50 (33639248)\n-F3835 Created Zip Spec      14 (20) '2.0'\n-F3836 Created OS            03 (3) 'Unix'\n-F3837 Extract Zip Spec      0A (10) '1.0'\n-F3838 Extract OS            00 (0) 'MS-DOS'\n-F3839 General Purpose Flag  0800 (2048)\n+F44A2 CENTRAL HEADER #260   02014B50 (33639248)\n+F44A6 Created Zip Spec      14 (20) '2.0'\n+F44A7 Created OS            03 (3) 'Unix'\n+F44A8 Extract Zip Spec      0A (10) '1.0'\n+F44A9 Extract OS            00 (0) 'MS-DOS'\n+F44AA General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F383B Compression Method    0000 (0) 'Stored'\n-F383D Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F3841 CRC                   00000000 (0)\n-F3845 Compressed Size       00000000 (0)\n-F3849 Uncompressed Size     00000000 (0)\n-F384D Filename Length       0064 (100)\n-F384F Extra Length          0000 (0)\n-F3851 Comment Length        0000 (0)\n-F3853 Disk Start            0000 (0)\n-F3855 Int File Attributes   0000 (0)\n+F44AC Compression Method    0000 (0) 'Stored'\n+F44AE Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F44B2 CRC                   00000000 (0)\n+F44B6 Compressed Size       00000000 (0)\n+F44BA Uncompressed Size     00000000 (0)\n+F44BE Filename Length       0064 (100)\n+F44C0 Extra Length          0000 (0)\n+F44C2 Comment Length        0000 (0)\n+F44C4 Disk Start            0000 (0)\n+F44C6 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F3857 Ext File Attributes   41ED0010 (1106051088)\n+F44C8 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F385B Local Header Offset   00006EB5 (28341)\n-F385F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F44CC Local Header Offset   00006EB5 (28341)\n+F44D0 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF385F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF44D0: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF385F: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF44D0: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF3837: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF44A8: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F38C3 CENTRAL HEADER #261   02014B50 (33639248)\n-F38C7 Created Zip Spec      14 (20) '2.0'\n-F38C8 Created OS            03 (3) 'Unix'\n-F38C9 Extract Zip Spec      0A (10) '1.0'\n-F38CA Extract OS            00 (0) 'MS-DOS'\n-F38CB General Purpose Flag  0800 (2048)\n+F4534 CENTRAL HEADER #261   02014B50 (33639248)\n+F4538 Created Zip Spec      14 (20) '2.0'\n+F4539 Created OS            03 (3) 'Unix'\n+F453A Extract Zip Spec      0A (10) '1.0'\n+F453B Extract OS            00 (0) 'MS-DOS'\n+F453C General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F38CD Compression Method    0000 (0) 'Stored'\n-F38CF Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F38D3 CRC                   00000000 (0)\n-F38D7 Compressed Size       00000000 (0)\n-F38DB Uncompressed Size     00000000 (0)\n-F38DF Filename Length       0063 (99)\n-F38E1 Extra Length          0000 (0)\n-F38E3 Comment Length        0000 (0)\n-F38E5 Disk Start            0000 (0)\n-F38E7 Int File Attributes   0000 (0)\n+F453E Compression Method    0000 (0) 'Stored'\n+F4540 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F4544 CRC                   00000000 (0)\n+F4548 Compressed Size       00000000 (0)\n+F454C Uncompressed Size     00000000 (0)\n+F4550 Filename Length       0063 (99)\n+F4552 Extra Length          0000 (0)\n+F4554 Comment Length        0000 (0)\n+F4556 Disk Start            0000 (0)\n+F4558 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F38E9 Ext File Attributes   41ED0010 (1106051088)\n+F455A Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F38ED Local Header Offset   00006F37 (28471)\n-F38F1 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F455E Local Header Offset   00006F37 (28471)\n+F4562 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF38F1: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF4562: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF38F1: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF4562: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF38C9: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF453A: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F3954 CENTRAL HEADER #262   02014B50 (33639248)\n-F3958 Created Zip Spec      14 (20) '2.0'\n-F3959 Created OS            03 (3) 'Unix'\n-F395A Extract Zip Spec      0A (10) '1.0'\n-F395B Extract OS            00 (0) 'MS-DOS'\n-F395C General Purpose Flag  0800 (2048)\n+F45C5 CENTRAL HEADER #262   02014B50 (33639248)\n+F45C9 Created Zip Spec      14 (20) '2.0'\n+F45CA Created OS            03 (3) 'Unix'\n+F45CB Extract Zip Spec      0A (10) '1.0'\n+F45CC Extract OS            00 (0) 'MS-DOS'\n+F45CD General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F395E Compression Method    0000 (0) 'Stored'\n-F3960 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F3964 CRC                   00000000 (0)\n-F3968 Compressed Size       00000000 (0)\n-F396C Uncompressed Size     00000000 (0)\n-F3970 Filename Length       005F (95)\n-F3972 Extra Length          0000 (0)\n-F3974 Comment Length        0000 (0)\n-F3976 Disk Start            0000 (0)\n-F3978 Int File Attributes   0000 (0)\n+F45CF Compression Method    0000 (0) 'Stored'\n+F45D1 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F45D5 CRC                   00000000 (0)\n+F45D9 Compressed Size       00000000 (0)\n+F45DD Uncompressed Size     00000000 (0)\n+F45E1 Filename Length       005F (95)\n+F45E3 Extra Length          0000 (0)\n+F45E5 Comment Length        0000 (0)\n+F45E7 Disk Start            0000 (0)\n+F45E9 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F397A Ext File Attributes   41ED0010 (1106051088)\n+F45EB Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F397E Local Header Offset   00006FB8 (28600)\n-F3982 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F45EF Local Header Offset   00006FB8 (28600)\n+F45F3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF3982: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF45F3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF3982: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF45F3: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF395A: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF45CB: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F39E1 CENTRAL HEADER #263   02014B50 (33639248)\n-F39E5 Created Zip Spec      14 (20) '2.0'\n-F39E6 Created OS            03 (3) 'Unix'\n-F39E7 Extract Zip Spec      0A (10) '1.0'\n-F39E8 Extract OS            00 (0) 'MS-DOS'\n-F39E9 General Purpose Flag  0800 (2048)\n+F4652 CENTRAL HEADER #263   02014B50 (33639248)\n+F4656 Created Zip Spec      14 (20) '2.0'\n+F4657 Created OS            03 (3) 'Unix'\n+F4658 Extract Zip Spec      0A (10) '1.0'\n+F4659 Extract OS            00 (0) 'MS-DOS'\n+F465A General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F39EB Compression Method    0000 (0) 'Stored'\n-F39ED Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F39F1 CRC                   00000000 (0)\n-F39F5 Compressed Size       00000000 (0)\n-F39F9 Uncompressed Size     00000000 (0)\n-F39FD Filename Length       005B (91)\n-F39FF Extra Length          0000 (0)\n-F3A01 Comment Length        0000 (0)\n-F3A03 Disk Start            0000 (0)\n-F3A05 Int File Attributes   0000 (0)\n+F465C Compression Method    0000 (0) 'Stored'\n+F465E Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F4662 CRC                   00000000 (0)\n+F4666 Compressed Size       00000000 (0)\n+F466A Uncompressed Size     00000000 (0)\n+F466E Filename Length       005B (91)\n+F4670 Extra Length          0000 (0)\n+F4672 Comment Length        0000 (0)\n+F4674 Disk Start            0000 (0)\n+F4676 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F3A07 Ext File Attributes   41ED0010 (1106051088)\n+F4678 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F3A0B Local Header Offset   00007035 (28725)\n-F3A0F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F467C Local Header Offset   00007035 (28725)\n+F4680 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF3A0F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF4680: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF3A0F: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF4680: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF39E7: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF4658: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F3A6A CENTRAL HEADER #264   02014B50 (33639248)\n-F3A6E Created Zip Spec      14 (20) '2.0'\n-F3A6F Created OS            03 (3) 'Unix'\n-F3A70 Extract Zip Spec      0A (10) '1.0'\n-F3A71 Extract OS            00 (0) 'MS-DOS'\n-F3A72 General Purpose Flag  0800 (2048)\n+F46DB CENTRAL HEADER #264   02014B50 (33639248)\n+F46DF Created Zip Spec      14 (20) '2.0'\n+F46E0 Created OS            03 (3) 'Unix'\n+F46E1 Extract Zip Spec      0A (10) '1.0'\n+F46E2 Extract OS            00 (0) 'MS-DOS'\n+F46E3 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F3A74 Compression Method    0000 (0) 'Stored'\n-F3A76 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F3A7A CRC                   00000000 (0)\n-F3A7E Compressed Size       00000000 (0)\n-F3A82 Uncompressed Size     00000000 (0)\n-F3A86 Filename Length       005F (95)\n-F3A88 Extra Length          0000 (0)\n-F3A8A Comment Length        0000 (0)\n-F3A8C Disk Start            0000 (0)\n-F3A8E Int File Attributes   0000 (0)\n+F46E5 Compression Method    0000 (0) 'Stored'\n+F46E7 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F46EB CRC                   00000000 (0)\n+F46EF Compressed Size       00000000 (0)\n+F46F3 Uncompressed Size     00000000 (0)\n+F46F7 Filename Length       005F (95)\n+F46F9 Extra Length          0000 (0)\n+F46FB Comment Length        0000 (0)\n+F46FD Disk Start            0000 (0)\n+F46FF Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F3A90 Ext File Attributes   41ED0010 (1106051088)\n+F4701 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F3A94 Local Header Offset   000070AE (28846)\n-F3A98 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F4705 Local Header Offset   000070AE (28846)\n+F4709 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF3A98: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF4709: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF3A98: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF4709: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF3A70: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF46E1: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F3AF7 CENTRAL HEADER #265   02014B50 (33639248)\n-F3AFB Created Zip Spec      14 (20) '2.0'\n-F3AFC Created OS            03 (3) 'Unix'\n-F3AFD Extract Zip Spec      0A (10) '1.0'\n-F3AFE Extract OS            00 (0) 'MS-DOS'\n-F3AFF General Purpose Flag  0800 (2048)\n+F4768 CENTRAL HEADER #265   02014B50 (33639248)\n+F476C Created Zip Spec      14 (20) '2.0'\n+F476D Created OS            03 (3) 'Unix'\n+F476E Extract Zip Spec      0A (10) '1.0'\n+F476F Extract OS            00 (0) 'MS-DOS'\n+F4770 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F3B01 Compression Method    0000 (0) 'Stored'\n-F3B03 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F3B07 CRC                   00000000 (0)\n-F3B0B Compressed Size       00000000 (0)\n-F3B0F Uncompressed Size     00000000 (0)\n-F3B13 Filename Length       005E (94)\n-F3B15 Extra Length          0000 (0)\n-F3B17 Comment Length        0000 (0)\n-F3B19 Disk Start            0000 (0)\n-F3B1B Int File Attributes   0000 (0)\n+F4772 Compression Method    0000 (0) 'Stored'\n+F4774 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F4778 CRC                   00000000 (0)\n+F477C Compressed Size       00000000 (0)\n+F4780 Uncompressed Size     00000000 (0)\n+F4784 Filename Length       005E (94)\n+F4786 Extra Length          0000 (0)\n+F4788 Comment Length        0000 (0)\n+F478A Disk Start            0000 (0)\n+F478C Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F3B1D Ext File Attributes   41ED0010 (1106051088)\n+F478E Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F3B21 Local Header Offset   0000712B (28971)\n-F3B25 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F4792 Local Header Offset   0000712B (28971)\n+F4796 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF3B25: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF4796: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF3B25: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF4796: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF3AFD: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF476E: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F3B83 CENTRAL HEADER #266   02014B50 (33639248)\n-F3B87 Created Zip Spec      14 (20) '2.0'\n-F3B88 Created OS            03 (3) 'Unix'\n-F3B89 Extract Zip Spec      0A (10) '1.0'\n-F3B8A Extract OS            00 (0) 'MS-DOS'\n-F3B8B General Purpose Flag  0800 (2048)\n+F47F4 CENTRAL HEADER #266   02014B50 (33639248)\n+F47F8 Created Zip Spec      14 (20) '2.0'\n+F47F9 Created OS            03 (3) 'Unix'\n+F47FA Extract Zip Spec      0A (10) '1.0'\n+F47FB Extract OS            00 (0) 'MS-DOS'\n+F47FC General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F3B8D Compression Method    0000 (0) 'Stored'\n-F3B8F Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F3B93 CRC                   00000000 (0)\n-F3B97 Compressed Size       00000000 (0)\n-F3B9B Uncompressed Size     00000000 (0)\n-F3B9F Filename Length       0061 (97)\n-F3BA1 Extra Length          0000 (0)\n-F3BA3 Comment Length        0000 (0)\n-F3BA5 Disk Start            0000 (0)\n-F3BA7 Int File Attributes   0000 (0)\n+F47FE Compression Method    0000 (0) 'Stored'\n+F4800 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F4804 CRC                   00000000 (0)\n+F4808 Compressed Size       00000000 (0)\n+F480C Uncompressed Size     00000000 (0)\n+F4810 Filename Length       0061 (97)\n+F4812 Extra Length          0000 (0)\n+F4814 Comment Length        0000 (0)\n+F4816 Disk Start            0000 (0)\n+F4818 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F3BA9 Ext File Attributes   41ED0010 (1106051088)\n+F481A Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F3BAD Local Header Offset   000071A7 (29095)\n-F3BB1 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F481E Local Header Offset   000071A7 (29095)\n+F4822 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF3BB1: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF4822: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF3BB1: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF4822: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF3B89: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF47FA: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F3C12 CENTRAL HEADER #267   02014B50 (33639248)\n-F3C16 Created Zip Spec      14 (20) '2.0'\n-F3C17 Created OS            03 (3) 'Unix'\n-F3C18 Extract Zip Spec      0A (10) '1.0'\n-F3C19 Extract OS            00 (0) 'MS-DOS'\n-F3C1A General Purpose Flag  0800 (2048)\n+F4883 CENTRAL HEADER #267   02014B50 (33639248)\n+F4887 Created Zip Spec      14 (20) '2.0'\n+F4888 Created OS            03 (3) 'Unix'\n+F4889 Extract Zip Spec      0A (10) '1.0'\n+F488A Extract OS            00 (0) 'MS-DOS'\n+F488B General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F3C1C Compression Method    0000 (0) 'Stored'\n-F3C1E Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F3C22 CRC                   00000000 (0)\n-F3C26 Compressed Size       00000000 (0)\n-F3C2A Uncompressed Size     00000000 (0)\n-F3C2E Filename Length       005E (94)\n-F3C30 Extra Length          0000 (0)\n-F3C32 Comment Length        0000 (0)\n-F3C34 Disk Start            0000 (0)\n-F3C36 Int File Attributes   0000 (0)\n+F488D Compression Method    0000 (0) 'Stored'\n+F488F Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F4893 CRC                   00000000 (0)\n+F4897 Compressed Size       00000000 (0)\n+F489B Uncompressed Size     00000000 (0)\n+F489F Filename Length       005E (94)\n+F48A1 Extra Length          0000 (0)\n+F48A3 Comment Length        0000 (0)\n+F48A5 Disk Start            0000 (0)\n+F48A7 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F3C38 Ext File Attributes   41ED0010 (1106051088)\n+F48A9 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F3C3C Local Header Offset   00007226 (29222)\n-F3C40 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F48AD Local Header Offset   00007226 (29222)\n+F48B1 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF3C40: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF48B1: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF3C40: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF48B1: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF3C18: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF4889: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F3C9E CENTRAL HEADER #268   02014B50 (33639248)\n-F3CA2 Created Zip Spec      14 (20) '2.0'\n-F3CA3 Created OS            03 (3) 'Unix'\n-F3CA4 Extract Zip Spec      0A (10) '1.0'\n-F3CA5 Extract OS            00 (0) 'MS-DOS'\n-F3CA6 General Purpose Flag  0800 (2048)\n+F490F CENTRAL HEADER #268   02014B50 (33639248)\n+F4913 Created Zip Spec      14 (20) '2.0'\n+F4914 Created OS            03 (3) 'Unix'\n+F4915 Extract Zip Spec      0A (10) '1.0'\n+F4916 Extract OS            00 (0) 'MS-DOS'\n+F4917 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F3CA8 Compression Method    0000 (0) 'Stored'\n-F3CAA Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F3CAE CRC                   00000000 (0)\n-F3CB2 Compressed Size       00000000 (0)\n-F3CB6 Uncompressed Size     00000000 (0)\n-F3CBA Filename Length       0057 (87)\n-F3CBC Extra Length          0000 (0)\n-F3CBE Comment Length        0000 (0)\n-F3CC0 Disk Start            0000 (0)\n-F3CC2 Int File Attributes   0000 (0)\n+F4919 Compression Method    0000 (0) 'Stored'\n+F491B Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F491F CRC                   00000000 (0)\n+F4923 Compressed Size       00000000 (0)\n+F4927 Uncompressed Size     00000000 (0)\n+F492B Filename Length       0057 (87)\n+F492D Extra Length          0000 (0)\n+F492F Comment Length        0000 (0)\n+F4931 Disk Start            0000 (0)\n+F4933 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F3CC4 Ext File Attributes   41ED0010 (1106051088)\n+F4935 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F3CC8 Local Header Offset   000072A2 (29346)\n-F3CCC Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F4939 Local Header Offset   000072A2 (29346)\n+F493D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF3CCC: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF493D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF3CCC: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF493D: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF3CA4: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF4915: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F3D23 CENTRAL HEADER #269   02014B50 (33639248)\n-F3D27 Created Zip Spec      14 (20) '2.0'\n-F3D28 Created OS            03 (3) 'Unix'\n-F3D29 Extract Zip Spec      0A (10) '1.0'\n-F3D2A Extract OS            00 (0) 'MS-DOS'\n-F3D2B General Purpose Flag  0800 (2048)\n+F4994 CENTRAL HEADER #269   02014B50 (33639248)\n+F4998 Created Zip Spec      14 (20) '2.0'\n+F4999 Created OS            03 (3) 'Unix'\n+F499A Extract Zip Spec      0A (10) '1.0'\n+F499B Extract OS            00 (0) 'MS-DOS'\n+F499C General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F3D2D Compression Method    0000 (0) 'Stored'\n-F3D2F Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F3D33 CRC                   00000000 (0)\n-F3D37 Compressed Size       00000000 (0)\n-F3D3B Uncompressed Size     00000000 (0)\n-F3D3F Filename Length       0068 (104)\n-F3D41 Extra Length          0000 (0)\n-F3D43 Comment Length        0000 (0)\n-F3D45 Disk Start            0000 (0)\n-F3D47 Int File Attributes   0000 (0)\n+F499E Compression Method    0000 (0) 'Stored'\n+F49A0 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F49A4 CRC                   00000000 (0)\n+F49A8 Compressed Size       00000000 (0)\n+F49AC Uncompressed Size     00000000 (0)\n+F49B0 Filename Length       0068 (104)\n+F49B2 Extra Length          0000 (0)\n+F49B4 Comment Length        0000 (0)\n+F49B6 Disk Start            0000 (0)\n+F49B8 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F3D49 Ext File Attributes   41ED0010 (1106051088)\n+F49BA Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F3D4D Local Header Offset   00007317 (29463)\n-F3D51 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F49BE Local Header Offset   00007317 (29463)\n+F49C2 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF3D51: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF49C2: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF3D51: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF49C2: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF3D29: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF499A: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F3DB9 CENTRAL HEADER #270   02014B50 (33639248)\n-F3DBD Created Zip Spec      14 (20) '2.0'\n-F3DBE Created OS            03 (3) 'Unix'\n-F3DBF Extract Zip Spec      0A (10) '1.0'\n-F3DC0 Extract OS            00 (0) 'MS-DOS'\n-F3DC1 General Purpose Flag  0800 (2048)\n+F4A2A CENTRAL HEADER #270   02014B50 (33639248)\n+F4A2E Created Zip Spec      14 (20) '2.0'\n+F4A2F Created OS            03 (3) 'Unix'\n+F4A30 Extract Zip Spec      0A (10) '1.0'\n+F4A31 Extract OS            00 (0) 'MS-DOS'\n+F4A32 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F3DC3 Compression Method    0000 (0) 'Stored'\n-F3DC5 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F3DC9 CRC                   00000000 (0)\n-F3DCD Compressed Size       00000000 (0)\n-F3DD1 Uncompressed Size     00000000 (0)\n-F3DD5 Filename Length       0032 (50)\n-F3DD7 Extra Length          0000 (0)\n-F3DD9 Comment Length        0000 (0)\n-F3DDB Disk Start            0000 (0)\n-F3DDD Int File Attributes   0000 (0)\n+F4A34 Compression Method    0000 (0) 'Stored'\n+F4A36 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F4A3A CRC                   00000000 (0)\n+F4A3E Compressed Size       00000000 (0)\n+F4A42 Uncompressed Size     00000000 (0)\n+F4A46 Filename Length       0032 (50)\n+F4A48 Extra Length          0000 (0)\n+F4A4A Comment Length        0000 (0)\n+F4A4C Disk Start            0000 (0)\n+F4A4E Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F3DDF Ext File Attributes   41ED0010 (1106051088)\n+F4A50 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F3DE3 Local Header Offset   0000739D (29597)\n-F3DE7 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F4A54 Local Header Offset   0000739D (29597)\n+F4A58 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF3DE7: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF4A58: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF3DE7: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF4A58: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF3DBF: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF4A30: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F3E19 CENTRAL HEADER #271   02014B50 (33639248)\n-F3E1D Created Zip Spec      14 (20) '2.0'\n-F3E1E Created OS            03 (3) 'Unix'\n-F3E1F Extract Zip Spec      0A (10) '1.0'\n-F3E20 Extract OS            00 (0) 'MS-DOS'\n-F3E21 General Purpose Flag  0800 (2048)\n+F4A8A CENTRAL HEADER #271   02014B50 (33639248)\n+F4A8E Created Zip Spec      14 (20) '2.0'\n+F4A8F Created OS            03 (3) 'Unix'\n+F4A90 Extract Zip Spec      0A (10) '1.0'\n+F4A91 Extract OS            00 (0) 'MS-DOS'\n+F4A92 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F3E23 Compression Method    0000 (0) 'Stored'\n-F3E25 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F3E29 CRC                   00000000 (0)\n-F3E2D Compressed Size       00000000 (0)\n-F3E31 Uncompressed Size     00000000 (0)\n-F3E35 Filename Length       0039 (57)\n-F3E37 Extra Length          0000 (0)\n-F3E39 Comment Length        0000 (0)\n-F3E3B Disk Start            0000 (0)\n-F3E3D Int File Attributes   0000 (0)\n+F4A94 Compression Method    0000 (0) 'Stored'\n+F4A96 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F4A9A CRC                   00000000 (0)\n+F4A9E Compressed Size       00000000 (0)\n+F4AA2 Uncompressed Size     00000000 (0)\n+F4AA6 Filename Length       0039 (57)\n+F4AA8 Extra Length          0000 (0)\n+F4AAA Comment Length        0000 (0)\n+F4AAC Disk Start            0000 (0)\n+F4AAE Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F3E3F Ext File Attributes   41ED0010 (1106051088)\n+F4AB0 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F3E43 Local Header Offset   000073ED (29677)\n-F3E47 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F4AB4 Local Header Offset   000073ED (29677)\n+F4AB8 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF3E47: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF4AB8: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF3E47: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF4AB8: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF3E1F: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF4A90: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F3E80 CENTRAL HEADER #272   02014B50 (33639248)\n-F3E84 Created Zip Spec      14 (20) '2.0'\n-F3E85 Created OS            03 (3) 'Unix'\n-F3E86 Extract Zip Spec      0A (10) '1.0'\n-F3E87 Extract OS            00 (0) 'MS-DOS'\n-F3E88 General Purpose Flag  0800 (2048)\n+F4AF1 CENTRAL HEADER #272   02014B50 (33639248)\n+F4AF5 Created Zip Spec      14 (20) '2.0'\n+F4AF6 Created OS            03 (3) 'Unix'\n+F4AF7 Extract Zip Spec      0A (10) '1.0'\n+F4AF8 Extract OS            00 (0) 'MS-DOS'\n+F4AF9 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F3E8A Compression Method    0000 (0) 'Stored'\n-F3E8C Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F3E90 CRC                   00000000 (0)\n-F3E94 Compressed Size       00000000 (0)\n-F3E98 Uncompressed Size     00000000 (0)\n-F3E9C Filename Length       006F (111)\n-F3E9E Extra Length          0000 (0)\n-F3EA0 Comment Length        0000 (0)\n-F3EA2 Disk Start            0000 (0)\n-F3EA4 Int File Attributes   0000 (0)\n+F4AFB Compression Method    0000 (0) 'Stored'\n+F4AFD Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F4B01 CRC                   00000000 (0)\n+F4B05 Compressed Size       00000000 (0)\n+F4B09 Uncompressed Size     00000000 (0)\n+F4B0D Filename Length       006F (111)\n+F4B0F Extra Length          0000 (0)\n+F4B11 Comment Length        0000 (0)\n+F4B13 Disk Start            0000 (0)\n+F4B15 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F3EA6 Ext File Attributes   41ED0010 (1106051088)\n+F4B17 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F3EAA Local Header Offset   00007444 (29764)\n-F3EAE Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F4B1B Local Header Offset   00007444 (29764)\n+F4B1F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF3EAE: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF4B1F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF3EAE: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF4B1F: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF3E86: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF4AF7: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F3F1D CENTRAL HEADER #273   02014B50 (33639248)\n-F3F21 Created Zip Spec      14 (20) '2.0'\n-F3F22 Created OS            03 (3) 'Unix'\n-F3F23 Extract Zip Spec      0A (10) '1.0'\n-F3F24 Extract OS            00 (0) 'MS-DOS'\n-F3F25 General Purpose Flag  0800 (2048)\n+F4B8E CENTRAL HEADER #273   02014B50 (33639248)\n+F4B92 Created Zip Spec      14 (20) '2.0'\n+F4B93 Created OS            03 (3) 'Unix'\n+F4B94 Extract Zip Spec      0A (10) '1.0'\n+F4B95 Extract OS            00 (0) 'MS-DOS'\n+F4B96 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F3F27 Compression Method    0000 (0) 'Stored'\n-F3F29 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F3F2D CRC                   00000000 (0)\n-F3F31 Compressed Size       00000000 (0)\n-F3F35 Uncompressed Size     00000000 (0)\n-F3F39 Filename Length       002F (47)\n-F3F3B Extra Length          0000 (0)\n-F3F3D Comment Length        0000 (0)\n-F3F3F Disk Start            0000 (0)\n-F3F41 Int File Attributes   0000 (0)\n+F4B98 Compression Method    0000 (0) 'Stored'\n+F4B9A Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F4B9E CRC                   00000000 (0)\n+F4BA2 Compressed Size       00000000 (0)\n+F4BA6 Uncompressed Size     00000000 (0)\n+F4BAA Filename Length       002F (47)\n+F4BAC Extra Length          0000 (0)\n+F4BAE Comment Length        0000 (0)\n+F4BB0 Disk Start            0000 (0)\n+F4BB2 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F3F43 Ext File Attributes   41ED0010 (1106051088)\n+F4BB4 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F3F47 Local Header Offset   000074D1 (29905)\n-F3F4B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F4BB8 Local Header Offset   000074D1 (29905)\n+F4BBC Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF3F4B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF4BBC: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF3F4B: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF4BBC: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF3F23: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF4B94: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F3F7A CENTRAL HEADER #274   02014B50 (33639248)\n-F3F7E Created Zip Spec      14 (20) '2.0'\n-F3F7F Created OS            03 (3) 'Unix'\n-F3F80 Extract Zip Spec      0A (10) '1.0'\n-F3F81 Extract OS            00 (0) 'MS-DOS'\n-F3F82 General Purpose Flag  0800 (2048)\n+F4BEB CENTRAL HEADER #274   02014B50 (33639248)\n+F4BEF Created Zip Spec      14 (20) '2.0'\n+F4BF0 Created OS            03 (3) 'Unix'\n+F4BF1 Extract Zip Spec      0A (10) '1.0'\n+F4BF2 Extract OS            00 (0) 'MS-DOS'\n+F4BF3 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F3F84 Compression Method    0000 (0) 'Stored'\n-F3F86 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F3F8A CRC                   00000000 (0)\n-F3F8E Compressed Size       00000000 (0)\n-F3F92 Uncompressed Size     00000000 (0)\n-F3F96 Filename Length       0036 (54)\n-F3F98 Extra Length          0000 (0)\n-F3F9A Comment Length        0000 (0)\n-F3F9C Disk Start            0000 (0)\n-F3F9E Int File Attributes   0000 (0)\n+F4BF5 Compression Method    0000 (0) 'Stored'\n+F4BF7 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F4BFB CRC                   00000000 (0)\n+F4BFF Compressed Size       00000000 (0)\n+F4C03 Uncompressed Size     00000000 (0)\n+F4C07 Filename Length       0036 (54)\n+F4C09 Extra Length          0000 (0)\n+F4C0B Comment Length        0000 (0)\n+F4C0D Disk Start            0000 (0)\n+F4C0F Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F3FA0 Ext File Attributes   41ED0010 (1106051088)\n+F4C11 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F3FA4 Local Header Offset   0000751E (29982)\n-F3FA8 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F4C15 Local Header Offset   0000751E (29982)\n+F4C19 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF3FA8: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF4C19: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF3FA8: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF4C19: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF3F80: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF4BF1: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F3FDE CENTRAL HEADER #275   02014B50 (33639248)\n-F3FE2 Created Zip Spec      14 (20) '2.0'\n-F3FE3 Created OS            03 (3) 'Unix'\n-F3FE4 Extract Zip Spec      0A (10) '1.0'\n-F3FE5 Extract OS            00 (0) 'MS-DOS'\n-F3FE6 General Purpose Flag  0800 (2048)\n+F4C4F CENTRAL HEADER #275   02014B50 (33639248)\n+F4C53 Created Zip Spec      14 (20) '2.0'\n+F4C54 Created OS            03 (3) 'Unix'\n+F4C55 Extract Zip Spec      0A (10) '1.0'\n+F4C56 Extract OS            00 (0) 'MS-DOS'\n+F4C57 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F3FE8 Compression Method    0000 (0) 'Stored'\n-F3FEA Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F3FEE CRC                   00000000 (0)\n-F3FF2 Compressed Size       00000000 (0)\n-F3FF6 Uncompressed Size     00000000 (0)\n-F3FFA Filename Length       006C (108)\n-F3FFC Extra Length          0000 (0)\n-F3FFE Comment Length        0000 (0)\n-F4000 Disk Start            0000 (0)\n-F4002 Int File Attributes   0000 (0)\n+F4C59 Compression Method    0000 (0) 'Stored'\n+F4C5B Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F4C5F CRC                   00000000 (0)\n+F4C63 Compressed Size       00000000 (0)\n+F4C67 Uncompressed Size     00000000 (0)\n+F4C6B Filename Length       006C (108)\n+F4C6D Extra Length          0000 (0)\n+F4C6F Comment Length        0000 (0)\n+F4C71 Disk Start            0000 (0)\n+F4C73 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F4004 Ext File Attributes   41ED0010 (1106051088)\n+F4C75 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F4008 Local Header Offset   00007572 (30066)\n-F400C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F4C79 Local Header Offset   00007572 (30066)\n+F4C7D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF400C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF4C7D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF400C: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF4C7D: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF3FE4: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF4C55: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F4078 CENTRAL HEADER #276   02014B50 (33639248)\n-F407C Created Zip Spec      14 (20) '2.0'\n-F407D Created OS            03 (3) 'Unix'\n-F407E Extract Zip Spec      0A (10) '1.0'\n-F407F Extract OS            00 (0) 'MS-DOS'\n-F4080 General Purpose Flag  0800 (2048)\n+F4CE9 CENTRAL HEADER #276   02014B50 (33639248)\n+F4CED Created Zip Spec      14 (20) '2.0'\n+F4CEE Created OS            03 (3) 'Unix'\n+F4CEF Extract Zip Spec      0A (10) '1.0'\n+F4CF0 Extract OS            00 (0) 'MS-DOS'\n+F4CF1 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F4082 Compression Method    0000 (0) 'Stored'\n-F4084 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F4088 CRC                   00000000 (0)\n-F408C Compressed Size       00000000 (0)\n-F4090 Uncompressed Size     00000000 (0)\n-F4094 Filename Length       0033 (51)\n-F4096 Extra Length          0000 (0)\n-F4098 Comment Length        0000 (0)\n-F409A Disk Start            0000 (0)\n-F409C Int File Attributes   0000 (0)\n+F4CF3 Compression Method    0000 (0) 'Stored'\n+F4CF5 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F4CF9 CRC                   00000000 (0)\n+F4CFD Compressed Size       00000000 (0)\n+F4D01 Uncompressed Size     00000000 (0)\n+F4D05 Filename Length       0033 (51)\n+F4D07 Extra Length          0000 (0)\n+F4D09 Comment Length        0000 (0)\n+F4D0B Disk Start            0000 (0)\n+F4D0D Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F409E Ext File Attributes   41ED0010 (1106051088)\n+F4D0F Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F40A2 Local Header Offset   000075FC (30204)\n-F40A6 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F4D13 Local Header Offset   000075FC (30204)\n+F4D17 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF40A6: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF4D17: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF40A6: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF4D17: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF407E: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF4CEF: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F40D9 CENTRAL HEADER #277   02014B50 (33639248)\n-F40DD Created Zip Spec      14 (20) '2.0'\n-F40DE Created OS            03 (3) 'Unix'\n-F40DF Extract Zip Spec      0A (10) '1.0'\n-F40E0 Extract OS            00 (0) 'MS-DOS'\n-F40E1 General Purpose Flag  0800 (2048)\n+F4D4A CENTRAL HEADER #277   02014B50 (33639248)\n+F4D4E Created Zip Spec      14 (20) '2.0'\n+F4D4F Created OS            03 (3) 'Unix'\n+F4D50 Extract Zip Spec      0A (10) '1.0'\n+F4D51 Extract OS            00 (0) 'MS-DOS'\n+F4D52 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F40E3 Compression Method    0000 (0) 'Stored'\n-F40E5 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F40E9 CRC                   00000000 (0)\n-F40ED Compressed Size       00000000 (0)\n-F40F1 Uncompressed Size     00000000 (0)\n-F40F5 Filename Length       003A (58)\n-F40F7 Extra Length          0000 (0)\n-F40F9 Comment Length        0000 (0)\n-F40FB Disk Start            0000 (0)\n-F40FD Int File Attributes   0000 (0)\n+F4D54 Compression Method    0000 (0) 'Stored'\n+F4D56 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F4D5A CRC                   00000000 (0)\n+F4D5E Compressed Size       00000000 (0)\n+F4D62 Uncompressed Size     00000000 (0)\n+F4D66 Filename Length       003A (58)\n+F4D68 Extra Length          0000 (0)\n+F4D6A Comment Length        0000 (0)\n+F4D6C Disk Start            0000 (0)\n+F4D6E Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F40FF Ext File Attributes   41ED0010 (1106051088)\n+F4D70 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F4103 Local Header Offset   0000764D (30285)\n-F4107 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F4D74 Local Header Offset   0000764D (30285)\n+F4D78 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF4107: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF4D78: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF4107: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF4D78: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF40DF: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF4D50: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F4141 CENTRAL HEADER #278   02014B50 (33639248)\n-F4145 Created Zip Spec      14 (20) '2.0'\n-F4146 Created OS            03 (3) 'Unix'\n-F4147 Extract Zip Spec      0A (10) '1.0'\n-F4148 Extract OS            00 (0) 'MS-DOS'\n-F4149 General Purpose Flag  0800 (2048)\n+F4DB2 CENTRAL HEADER #278   02014B50 (33639248)\n+F4DB6 Created Zip Spec      14 (20) '2.0'\n+F4DB7 Created OS            03 (3) 'Unix'\n+F4DB8 Extract Zip Spec      0A (10) '1.0'\n+F4DB9 Extract OS            00 (0) 'MS-DOS'\n+F4DBA General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F414B Compression Method    0000 (0) 'Stored'\n-F414D Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F4151 CRC                   00000000 (0)\n-F4155 Compressed Size       00000000 (0)\n-F4159 Uncompressed Size     00000000 (0)\n-F415D Filename Length       0070 (112)\n-F415F Extra Length          0000 (0)\n-F4161 Comment Length        0000 (0)\n-F4163 Disk Start            0000 (0)\n-F4165 Int File Attributes   0000 (0)\n+F4DBC Compression Method    0000 (0) 'Stored'\n+F4DBE Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F4DC2 CRC                   00000000 (0)\n+F4DC6 Compressed Size       00000000 (0)\n+F4DCA Uncompressed Size     00000000 (0)\n+F4DCE Filename Length       0070 (112)\n+F4DD0 Extra Length          0000 (0)\n+F4DD2 Comment Length        0000 (0)\n+F4DD4 Disk Start            0000 (0)\n+F4DD6 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F4167 Ext File Attributes   41ED0010 (1106051088)\n+F4DD8 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F416B Local Header Offset   000076A5 (30373)\n-F416F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F4DDC Local Header Offset   000076A5 (30373)\n+F4DE0 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF416F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF4DE0: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF416F: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF4DE0: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF4147: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF4DB8: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F41DF CENTRAL HEADER #279   02014B50 (33639248)\n-F41E3 Created Zip Spec      14 (20) '2.0'\n-F41E4 Created OS            03 (3) 'Unix'\n-F41E5 Extract Zip Spec      0A (10) '1.0'\n-F41E6 Extract OS            00 (0) 'MS-DOS'\n-F41E7 General Purpose Flag  0800 (2048)\n+F4E50 CENTRAL HEADER #279   02014B50 (33639248)\n+F4E54 Created Zip Spec      14 (20) '2.0'\n+F4E55 Created OS            03 (3) 'Unix'\n+F4E56 Extract Zip Spec      0A (10) '1.0'\n+F4E57 Extract OS            00 (0) 'MS-DOS'\n+F4E58 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F41E9 Compression Method    0000 (0) 'Stored'\n-F41EB Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F41EF CRC                   00000000 (0)\n-F41F3 Compressed Size       00000000 (0)\n-F41F7 Uncompressed Size     00000000 (0)\n-F41FB Filename Length       0030 (48)\n-F41FD Extra Length          0000 (0)\n-F41FF Comment Length        0000 (0)\n-F4201 Disk Start            0000 (0)\n-F4203 Int File Attributes   0000 (0)\n+F4E5A Compression Method    0000 (0) 'Stored'\n+F4E5C Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F4E60 CRC                   00000000 (0)\n+F4E64 Compressed Size       00000000 (0)\n+F4E68 Uncompressed Size     00000000 (0)\n+F4E6C Filename Length       0030 (48)\n+F4E6E Extra Length          0000 (0)\n+F4E70 Comment Length        0000 (0)\n+F4E72 Disk Start            0000 (0)\n+F4E74 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F4205 Ext File Attributes   41ED0010 (1106051088)\n+F4E76 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F4209 Local Header Offset   00007733 (30515)\n-F420D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F4E7A Local Header Offset   00007733 (30515)\n+F4E7E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF420D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF4E7E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF420D: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF4E7E: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF41E5: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF4E56: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F423D CENTRAL HEADER #280   02014B50 (33639248)\n-F4241 Created Zip Spec      14 (20) '2.0'\n-F4242 Created OS            03 (3) 'Unix'\n-F4243 Extract Zip Spec      0A (10) '1.0'\n-F4244 Extract OS            00 (0) 'MS-DOS'\n-F4245 General Purpose Flag  0800 (2048)\n+F4EAE CENTRAL HEADER #280   02014B50 (33639248)\n+F4EB2 Created Zip Spec      14 (20) '2.0'\n+F4EB3 Created OS            03 (3) 'Unix'\n+F4EB4 Extract Zip Spec      0A (10) '1.0'\n+F4EB5 Extract OS            00 (0) 'MS-DOS'\n+F4EB6 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F4247 Compression Method    0000 (0) 'Stored'\n-F4249 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F424D CRC                   00000000 (0)\n-F4251 Compressed Size       00000000 (0)\n-F4255 Uncompressed Size     00000000 (0)\n-F4259 Filename Length       0037 (55)\n-F425B Extra Length          0000 (0)\n-F425D Comment Length        0000 (0)\n-F425F Disk Start            0000 (0)\n-F4261 Int File Attributes   0000 (0)\n+F4EB8 Compression Method    0000 (0) 'Stored'\n+F4EBA Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F4EBE CRC                   00000000 (0)\n+F4EC2 Compressed Size       00000000 (0)\n+F4EC6 Uncompressed Size     00000000 (0)\n+F4ECA Filename Length       0037 (55)\n+F4ECC Extra Length          0000 (0)\n+F4ECE Comment Length        0000 (0)\n+F4ED0 Disk Start            0000 (0)\n+F4ED2 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F4263 Ext File Attributes   41ED0010 (1106051088)\n+F4ED4 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F4267 Local Header Offset   00007781 (30593)\n-F426B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F4ED8 Local Header Offset   00007781 (30593)\n+F4EDC Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF426B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF4EDC: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF426B: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF4EDC: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF4243: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF4EB4: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F42A2 CENTRAL HEADER #281   02014B50 (33639248)\n-F42A6 Created Zip Spec      14 (20) '2.0'\n-F42A7 Created OS            03 (3) 'Unix'\n-F42A8 Extract Zip Spec      0A (10) '1.0'\n-F42A9 Extract OS            00 (0) 'MS-DOS'\n-F42AA General Purpose Flag  0800 (2048)\n+F4F13 CENTRAL HEADER #281   02014B50 (33639248)\n+F4F17 Created Zip Spec      14 (20) '2.0'\n+F4F18 Created OS            03 (3) 'Unix'\n+F4F19 Extract Zip Spec      0A (10) '1.0'\n+F4F1A Extract OS            00 (0) 'MS-DOS'\n+F4F1B General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F42AC Compression Method    0000 (0) 'Stored'\n-F42AE Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F42B2 CRC                   00000000 (0)\n-F42B6 Compressed Size       00000000 (0)\n-F42BA Uncompressed Size     00000000 (0)\n-F42BE Filename Length       007B (123)\n-F42C0 Extra Length          0000 (0)\n-F42C2 Comment Length        0000 (0)\n-F42C4 Disk Start            0000 (0)\n-F42C6 Int File Attributes   0000 (0)\n+F4F1D Compression Method    0000 (0) 'Stored'\n+F4F1F Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F4F23 CRC                   00000000 (0)\n+F4F27 Compressed Size       00000000 (0)\n+F4F2B Uncompressed Size     00000000 (0)\n+F4F2F Filename Length       007B (123)\n+F4F31 Extra Length          0000 (0)\n+F4F33 Comment Length        0000 (0)\n+F4F35 Disk Start            0000 (0)\n+F4F37 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F42C8 Ext File Attributes   41ED0010 (1106051088)\n+F4F39 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F42CC Local Header Offset   000077D6 (30678)\n-F42D0 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F4F3D Local Header Offset   000077D6 (30678)\n+F4F41 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF42D0: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF4F41: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF42D0: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF4F41: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF42A8: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF4F19: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F434B CENTRAL HEADER #282   02014B50 (33639248)\n-F434F Created Zip Spec      14 (20) '2.0'\n-F4350 Created OS            03 (3) 'Unix'\n-F4351 Extract Zip Spec      0A (10) '1.0'\n-F4352 Extract OS            00 (0) 'MS-DOS'\n-F4353 General Purpose Flag  0800 (2048)\n+F4FBC CENTRAL HEADER #282   02014B50 (33639248)\n+F4FC0 Created Zip Spec      14 (20) '2.0'\n+F4FC1 Created OS            03 (3) 'Unix'\n+F4FC2 Extract Zip Spec      0A (10) '1.0'\n+F4FC3 Extract OS            00 (0) 'MS-DOS'\n+F4FC4 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F4355 Compression Method    0000 (0) 'Stored'\n-F4357 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F435B CRC                   00000000 (0)\n-F435F Compressed Size       00000000 (0)\n-F4363 Uncompressed Size     00000000 (0)\n-F4367 Filename Length       0031 (49)\n-F4369 Extra Length          0000 (0)\n-F436B Comment Length        0000 (0)\n-F436D Disk Start            0000 (0)\n-F436F Int File Attributes   0000 (0)\n+F4FC6 Compression Method    0000 (0) 'Stored'\n+F4FC8 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F4FCC CRC                   00000000 (0)\n+F4FD0 Compressed Size       00000000 (0)\n+F4FD4 Uncompressed Size     00000000 (0)\n+F4FD8 Filename Length       0031 (49)\n+F4FDA Extra Length          0000 (0)\n+F4FDC Comment Length        0000 (0)\n+F4FDE Disk Start            0000 (0)\n+F4FE0 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F4371 Ext File Attributes   41ED0010 (1106051088)\n+F4FE2 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F4375 Local Header Offset   0000786F (30831)\n-F4379 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F4FE6 Local Header Offset   0000786F (30831)\n+F4FEA Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF4379: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF4FEA: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF4379: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF4FEA: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF4351: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF4FC2: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F43AA CENTRAL HEADER #283   02014B50 (33639248)\n-F43AE Created Zip Spec      14 (20) '2.0'\n-F43AF Created OS            03 (3) 'Unix'\n-F43B0 Extract Zip Spec      0A (10) '1.0'\n-F43B1 Extract OS            00 (0) 'MS-DOS'\n-F43B2 General Purpose Flag  0800 (2048)\n+F501B CENTRAL HEADER #283   02014B50 (33639248)\n+F501F Created Zip Spec      14 (20) '2.0'\n+F5020 Created OS            03 (3) 'Unix'\n+F5021 Extract Zip Spec      0A (10) '1.0'\n+F5022 Extract OS            00 (0) 'MS-DOS'\n+F5023 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F43B4 Compression Method    0000 (0) 'Stored'\n-F43B6 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F43BA CRC                   00000000 (0)\n-F43BE Compressed Size       00000000 (0)\n-F43C2 Uncompressed Size     00000000 (0)\n-F43C6 Filename Length       0038 (56)\n-F43C8 Extra Length          0000 (0)\n-F43CA Comment Length        0000 (0)\n-F43CC Disk Start            0000 (0)\n-F43CE Int File Attributes   0000 (0)\n+F5025 Compression Method    0000 (0) 'Stored'\n+F5027 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F502B CRC                   00000000 (0)\n+F502F Compressed Size       00000000 (0)\n+F5033 Uncompressed Size     00000000 (0)\n+F5037 Filename Length       0038 (56)\n+F5039 Extra Length          0000 (0)\n+F503B Comment Length        0000 (0)\n+F503D Disk Start            0000 (0)\n+F503F Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F43D0 Ext File Attributes   41ED0010 (1106051088)\n+F5041 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F43D4 Local Header Offset   000078BE (30910)\n-F43D8 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F5045 Local Header Offset   000078BE (30910)\n+F5049 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF43D8: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF5049: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF43D8: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF5049: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF43B0: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF5021: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F4410 CENTRAL HEADER #284   02014B50 (33639248)\n-F4414 Created Zip Spec      14 (20) '2.0'\n-F4415 Created OS            03 (3) 'Unix'\n-F4416 Extract Zip Spec      0A (10) '1.0'\n-F4417 Extract OS            00 (0) 'MS-DOS'\n-F4418 General Purpose Flag  0800 (2048)\n+F5081 CENTRAL HEADER #284   02014B50 (33639248)\n+F5085 Created Zip Spec      14 (20) '2.0'\n+F5086 Created OS            03 (3) 'Unix'\n+F5087 Extract Zip Spec      0A (10) '1.0'\n+F5088 Extract OS            00 (0) 'MS-DOS'\n+F5089 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F441A Compression Method    0000 (0) 'Stored'\n-F441C Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F4420 CRC                   00000000 (0)\n-F4424 Compressed Size       00000000 (0)\n-F4428 Uncompressed Size     00000000 (0)\n-F442C Filename Length       006C (108)\n-F442E Extra Length          0000 (0)\n-F4430 Comment Length        0000 (0)\n-F4432 Disk Start            0000 (0)\n-F4434 Int File Attributes   0000 (0)\n+F508B Compression Method    0000 (0) 'Stored'\n+F508D Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F5091 CRC                   00000000 (0)\n+F5095 Compressed Size       00000000 (0)\n+F5099 Uncompressed Size     00000000 (0)\n+F509D Filename Length       006C (108)\n+F509F Extra Length          0000 (0)\n+F50A1 Comment Length        0000 (0)\n+F50A3 Disk Start            0000 (0)\n+F50A5 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F4436 Ext File Attributes   41ED0010 (1106051088)\n+F50A7 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F443A Local Header Offset   00007914 (30996)\n-F443E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F50AB Local Header Offset   00007914 (30996)\n+F50AF Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF443E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF50AF: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF443E: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF50AF: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF4416: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF5087: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F44AA CENTRAL HEADER #285   02014B50 (33639248)\n-F44AE Created Zip Spec      14 (20) '2.0'\n-F44AF Created OS            03 (3) 'Unix'\n-F44B0 Extract Zip Spec      0A (10) '1.0'\n-F44B1 Extract OS            00 (0) 'MS-DOS'\n-F44B2 General Purpose Flag  0800 (2048)\n+F511B CENTRAL HEADER #285   02014B50 (33639248)\n+F511F Created Zip Spec      14 (20) '2.0'\n+F5120 Created OS            03 (3) 'Unix'\n+F5121 Extract Zip Spec      0A (10) '1.0'\n+F5122 Extract OS            00 (0) 'MS-DOS'\n+F5123 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F44B4 Compression Method    0000 (0) 'Stored'\n-F44B6 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F44BA CRC                   00000000 (0)\n-F44BE Compressed Size       00000000 (0)\n-F44C2 Uncompressed Size     00000000 (0)\n-F44C6 Filename Length       0026 (38)\n-F44C8 Extra Length          0000 (0)\n-F44CA Comment Length        0000 (0)\n-F44CC Disk Start            0000 (0)\n-F44CE Int File Attributes   0000 (0)\n+F5125 Compression Method    0000 (0) 'Stored'\n+F5127 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F512B CRC                   00000000 (0)\n+F512F Compressed Size       00000000 (0)\n+F5133 Uncompressed Size     00000000 (0)\n+F5137 Filename Length       0026 (38)\n+F5139 Extra Length          0000 (0)\n+F513B Comment Length        0000 (0)\n+F513D Disk Start            0000 (0)\n+F513F Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F44D0 Ext File Attributes   41ED0010 (1106051088)\n+F5141 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F44D4 Local Header Offset   0000799E (31134)\n-F44D8 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F5145 Local Header Offset   0000799E (31134)\n+F5149 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF44D8: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF5149: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF44D8: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF5149: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF44B0: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF5121: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F44FE CENTRAL HEADER #286   02014B50 (33639248)\n-F4502 Created Zip Spec      14 (20) '2.0'\n-F4503 Created OS            03 (3) 'Unix'\n-F4504 Extract Zip Spec      0A (10) '1.0'\n-F4505 Extract OS            00 (0) 'MS-DOS'\n-F4506 General Purpose Flag  0800 (2048)\n+F516F CENTRAL HEADER #286   02014B50 (33639248)\n+F5173 Created Zip Spec      14 (20) '2.0'\n+F5174 Created OS            03 (3) 'Unix'\n+F5175 Extract Zip Spec      0A (10) '1.0'\n+F5176 Extract OS            00 (0) 'MS-DOS'\n+F5177 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F4508 Compression Method    0000 (0) 'Stored'\n-F450A Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F450E CRC                   00000000 (0)\n-F4512 Compressed Size       00000000 (0)\n-F4516 Uncompressed Size     00000000 (0)\n-F451A Filename Length       002D (45)\n-F451C Extra Length          0000 (0)\n-F451E Comment Length        0000 (0)\n-F4520 Disk Start            0000 (0)\n-F4522 Int File Attributes   0000 (0)\n+F5179 Compression Method    0000 (0) 'Stored'\n+F517B Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F517F CRC                   00000000 (0)\n+F5183 Compressed Size       00000000 (0)\n+F5187 Uncompressed Size     00000000 (0)\n+F518B Filename Length       002D (45)\n+F518D Extra Length          0000 (0)\n+F518F Comment Length        0000 (0)\n+F5191 Disk Start            0000 (0)\n+F5193 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F4524 Ext File Attributes   41ED0010 (1106051088)\n+F5195 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F4528 Local Header Offset   000079E2 (31202)\n-F452C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F5199 Local Header Offset   000079E2 (31202)\n+F519D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF452C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF519D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF452C: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF519D: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF4504: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF5175: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F4559 CENTRAL HEADER #287   02014B50 (33639248)\n-F455D Created Zip Spec      14 (20) '2.0'\n-F455E Created OS            03 (3) 'Unix'\n-F455F Extract Zip Spec      0A (10) '1.0'\n-F4560 Extract OS            00 (0) 'MS-DOS'\n-F4561 General Purpose Flag  0800 (2048)\n+F51CA CENTRAL HEADER #287   02014B50 (33639248)\n+F51CE Created Zip Spec      14 (20) '2.0'\n+F51CF Created OS            03 (3) 'Unix'\n+F51D0 Extract Zip Spec      0A (10) '1.0'\n+F51D1 Extract OS            00 (0) 'MS-DOS'\n+F51D2 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F4563 Compression Method    0000 (0) 'Stored'\n-F4565 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F4569 CRC                   00000000 (0)\n-F456D Compressed Size       00000000 (0)\n-F4571 Uncompressed Size     00000000 (0)\n-F4575 Filename Length       005B (91)\n-F4577 Extra Length          0000 (0)\n-F4579 Comment Length        0000 (0)\n-F457B Disk Start            0000 (0)\n-F457D Int File Attributes   0000 (0)\n+F51D4 Compression Method    0000 (0) 'Stored'\n+F51D6 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F51DA CRC                   00000000 (0)\n+F51DE Compressed Size       00000000 (0)\n+F51E2 Uncompressed Size     00000000 (0)\n+F51E6 Filename Length       005B (91)\n+F51E8 Extra Length          0000 (0)\n+F51EA Comment Length        0000 (0)\n+F51EC Disk Start            0000 (0)\n+F51EE Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F457F Ext File Attributes   41ED0010 (1106051088)\n+F51F0 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F4583 Local Header Offset   00007A2D (31277)\n-F4587 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F51F4 Local Header Offset   00007A2D (31277)\n+F51F8 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF4587: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF51F8: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF4587: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF51F8: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF455F: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF51D0: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F45E2 CENTRAL HEADER #288   02014B50 (33639248)\n-F45E6 Created Zip Spec      14 (20) '2.0'\n-F45E7 Created OS            03 (3) 'Unix'\n-F45E8 Extract Zip Spec      0A (10) '1.0'\n-F45E9 Extract OS            00 (0) 'MS-DOS'\n-F45EA General Purpose Flag  0800 (2048)\n+F5253 CENTRAL HEADER #288   02014B50 (33639248)\n+F5257 Created Zip Spec      14 (20) '2.0'\n+F5258 Created OS            03 (3) 'Unix'\n+F5259 Extract Zip Spec      0A (10) '1.0'\n+F525A Extract OS            00 (0) 'MS-DOS'\n+F525B General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F45EC Compression Method    0000 (0) 'Stored'\n-F45EE Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F45F2 CRC                   00000000 (0)\n-F45F6 Compressed Size       00000000 (0)\n-F45FA Uncompressed Size     00000000 (0)\n-F45FE Filename Length       0061 (97)\n-F4600 Extra Length          0000 (0)\n-F4602 Comment Length        0000 (0)\n-F4604 Disk Start            0000 (0)\n-F4606 Int File Attributes   0000 (0)\n+F525D Compression Method    0000 (0) 'Stored'\n+F525F Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F5263 CRC                   00000000 (0)\n+F5267 Compressed Size       00000000 (0)\n+F526B Uncompressed Size     00000000 (0)\n+F526F Filename Length       0061 (97)\n+F5271 Extra Length          0000 (0)\n+F5273 Comment Length        0000 (0)\n+F5275 Disk Start            0000 (0)\n+F5277 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F4608 Ext File Attributes   41ED0010 (1106051088)\n+F5279 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F460C Local Header Offset   00007AA6 (31398)\n-F4610 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F527D Local Header Offset   00007AA6 (31398)\n+F5281 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF4610: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF5281: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF4610: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF5281: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF45E8: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF5259: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F4671 CENTRAL HEADER #289   02014B50 (33639248)\n-F4675 Created Zip Spec      14 (20) '2.0'\n-F4676 Created OS            03 (3) 'Unix'\n-F4677 Extract Zip Spec      0A (10) '1.0'\n-F4678 Extract OS            00 (0) 'MS-DOS'\n-F4679 General Purpose Flag  0800 (2048)\n+F52E2 CENTRAL HEADER #289   02014B50 (33639248)\n+F52E6 Created Zip Spec      14 (20) '2.0'\n+F52E7 Created OS            03 (3) 'Unix'\n+F52E8 Extract Zip Spec      0A (10) '1.0'\n+F52E9 Extract OS            00 (0) 'MS-DOS'\n+F52EA General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F467B Compression Method    0000 (0) 'Stored'\n-F467D Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F4681 CRC                   00000000 (0)\n-F4685 Compressed Size       00000000 (0)\n-F4689 Uncompressed Size     00000000 (0)\n-F468D Filename Length       002F (47)\n-F468F Extra Length          0000 (0)\n-F4691 Comment Length        0000 (0)\n-F4693 Disk Start            0000 (0)\n-F4695 Int File Attributes   0000 (0)\n+F52EC Compression Method    0000 (0) 'Stored'\n+F52EE Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F52F2 CRC                   00000000 (0)\n+F52F6 Compressed Size       00000000 (0)\n+F52FA Uncompressed Size     00000000 (0)\n+F52FE Filename Length       002F (47)\n+F5300 Extra Length          0000 (0)\n+F5302 Comment Length        0000 (0)\n+F5304 Disk Start            0000 (0)\n+F5306 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F4697 Ext File Attributes   41ED0010 (1106051088)\n+F5308 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F469B Local Header Offset   00007B25 (31525)\n-F469F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F530C Local Header Offset   00007B25 (31525)\n+F5310 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF469F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF5310: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF469F: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF5310: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF4677: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF52E8: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F46CE CENTRAL HEADER #290   02014B50 (33639248)\n-F46D2 Created Zip Spec      14 (20) '2.0'\n-F46D3 Created OS            03 (3) 'Unix'\n-F46D4 Extract Zip Spec      0A (10) '1.0'\n-F46D5 Extract OS            00 (0) 'MS-DOS'\n-F46D6 General Purpose Flag  0800 (2048)\n+F533F CENTRAL HEADER #290   02014B50 (33639248)\n+F5343 Created Zip Spec      14 (20) '2.0'\n+F5344 Created OS            03 (3) 'Unix'\n+F5345 Extract Zip Spec      0A (10) '1.0'\n+F5346 Extract OS            00 (0) 'MS-DOS'\n+F5347 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F46D8 Compression Method    0000 (0) 'Stored'\n-F46DA Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F46DE CRC                   00000000 (0)\n-F46E2 Compressed Size       00000000 (0)\n-F46E6 Uncompressed Size     00000000 (0)\n-F46EA Filename Length       0036 (54)\n-F46EC Extra Length          0000 (0)\n-F46EE Comment Length        0000 (0)\n-F46F0 Disk Start            0000 (0)\n-F46F2 Int File Attributes   0000 (0)\n+F5349 Compression Method    0000 (0) 'Stored'\n+F534B Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F534F CRC                   00000000 (0)\n+F5353 Compressed Size       00000000 (0)\n+F5357 Uncompressed Size     00000000 (0)\n+F535B Filename Length       0036 (54)\n+F535D Extra Length          0000 (0)\n+F535F Comment Length        0000 (0)\n+F5361 Disk Start            0000 (0)\n+F5363 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F46F4 Ext File Attributes   41ED0010 (1106051088)\n+F5365 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F46F8 Local Header Offset   00007B72 (31602)\n-F46FC Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F5369 Local Header Offset   00007B72 (31602)\n+F536D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF46FC: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF536D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF46FC: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF536D: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF46D4: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF5345: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F4732 CENTRAL HEADER #291   02014B50 (33639248)\n-F4736 Created Zip Spec      14 (20) '2.0'\n-F4737 Created OS            03 (3) 'Unix'\n-F4738 Extract Zip Spec      0A (10) '1.0'\n-F4739 Extract OS            00 (0) 'MS-DOS'\n-F473A General Purpose Flag  0800 (2048)\n+F53A3 CENTRAL HEADER #291   02014B50 (33639248)\n+F53A7 Created Zip Spec      14 (20) '2.0'\n+F53A8 Created OS            03 (3) 'Unix'\n+F53A9 Extract Zip Spec      0A (10) '1.0'\n+F53AA Extract OS            00 (0) 'MS-DOS'\n+F53AB General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F473C Compression Method    0000 (0) 'Stored'\n-F473E Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F4742 CRC                   00000000 (0)\n-F4746 Compressed Size       00000000 (0)\n-F474A Uncompressed Size     00000000 (0)\n-F474E Filename Length       0069 (105)\n-F4750 Extra Length          0000 (0)\n-F4752 Comment Length        0000 (0)\n-F4754 Disk Start            0000 (0)\n-F4756 Int File Attributes   0000 (0)\n+F53AD Compression Method    0000 (0) 'Stored'\n+F53AF Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F53B3 CRC                   00000000 (0)\n+F53B7 Compressed Size       00000000 (0)\n+F53BB Uncompressed Size     00000000 (0)\n+F53BF Filename Length       0069 (105)\n+F53C1 Extra Length          0000 (0)\n+F53C3 Comment Length        0000 (0)\n+F53C5 Disk Start            0000 (0)\n+F53C7 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F4758 Ext File Attributes   41ED0010 (1106051088)\n+F53C9 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F475C Local Header Offset   00007BC6 (31686)\n-F4760 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F53CD Local Header Offset   00007BC6 (31686)\n+F53D1 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF4760: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF53D1: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF4760: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF53D1: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF4738: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF53A9: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F47C9 CENTRAL HEADER #292   02014B50 (33639248)\n-F47CD Created Zip Spec      14 (20) '2.0'\n-F47CE Created OS            03 (3) 'Unix'\n-F47CF Extract Zip Spec      0A (10) '1.0'\n-F47D0 Extract OS            00 (0) 'MS-DOS'\n-F47D1 General Purpose Flag  0800 (2048)\n+F543A CENTRAL HEADER #292   02014B50 (33639248)\n+F543E Created Zip Spec      14 (20) '2.0'\n+F543F Created OS            03 (3) 'Unix'\n+F5440 Extract Zip Spec      0A (10) '1.0'\n+F5441 Extract OS            00 (0) 'MS-DOS'\n+F5442 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F47D3 Compression Method    0000 (0) 'Stored'\n-F47D5 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F47D9 CRC                   00000000 (0)\n-F47DD Compressed Size       00000000 (0)\n-F47E1 Uncompressed Size     00000000 (0)\n-F47E5 Filename Length       000F (15)\n-F47E7 Extra Length          0000 (0)\n-F47E9 Comment Length        0000 (0)\n-F47EB Disk Start            0000 (0)\n-F47ED Int File Attributes   0000 (0)\n+F5444 Compression Method    0000 (0) 'Stored'\n+F5446 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F544A CRC                   00000000 (0)\n+F544E Compressed Size       00000000 (0)\n+F5452 Uncompressed Size     00000000 (0)\n+F5456 Filename Length       000F (15)\n+F5458 Extra Length          0000 (0)\n+F545A Comment Length        0000 (0)\n+F545C Disk Start            0000 (0)\n+F545E Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F47EF Ext File Attributes   41ED0010 (1106051088)\n+F5460 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F47F3 Local Header Offset   00007C4D (31821)\n-F47F7 Filename              'XXXXXXXXXXXXXXX'\n+F5464 Local Header Offset   00007C4D (31821)\n+F5468 Filename              'XXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF47F7: Filename 'XXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF5468: Filename 'XXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF47F7: Directory 'XXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF5468: Directory 'XXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF47CF: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF5440: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXX'\n #\n \n-F4806 CENTRAL HEADER #293   02014B50 (33639248)\n-F480A Created Zip Spec      14 (20) '2.0'\n-F480B Created OS            03 (3) 'Unix'\n-F480C Extract Zip Spec      0A (10) '1.0'\n-F480D Extract OS            00 (0) 'MS-DOS'\n-F480E General Purpose Flag  0800 (2048)\n+F5477 CENTRAL HEADER #293   02014B50 (33639248)\n+F547B Created Zip Spec      14 (20) '2.0'\n+F547C Created OS            03 (3) 'Unix'\n+F547D Extract Zip Spec      0A (10) '1.0'\n+F547E Extract OS            00 (0) 'MS-DOS'\n+F547F General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F4810 Compression Method    0000 (0) 'Stored'\n-F4812 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F4816 CRC                   00000000 (0)\n-F481A Compressed Size       00000000 (0)\n-F481E Uncompressed Size     00000000 (0)\n-F4822 Filename Length       001F (31)\n-F4824 Extra Length          0000 (0)\n-F4826 Comment Length        0000 (0)\n-F4828 Disk Start            0000 (0)\n-F482A Int File Attributes   0000 (0)\n+F5481 Compression Method    0000 (0) 'Stored'\n+F5483 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F5487 CRC                   00000000 (0)\n+F548B Compressed Size       00000000 (0)\n+F548F Uncompressed Size     00000000 (0)\n+F5493 Filename Length       001F (31)\n+F5495 Extra Length          0000 (0)\n+F5497 Comment Length        0000 (0)\n+F5499 Disk Start            0000 (0)\n+F549B Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F482C Ext File Attributes   41ED0010 (1106051088)\n+F549D Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F4830 Local Header Offset   00007C7A (31866)\n-F4834 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F54A1 Local Header Offset   00007C7A (31866)\n+F54A5 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF4834: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF54A5: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF4834: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF54A5: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF480C: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF547D: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F4853 CENTRAL HEADER #294   02014B50 (33639248)\n-F4857 Created Zip Spec      14 (20) '2.0'\n-F4858 Created OS            03 (3) 'Unix'\n-F4859 Extract Zip Spec      0A (10) '1.0'\n-F485A Extract OS            00 (0) 'MS-DOS'\n-F485B General Purpose Flag  0800 (2048)\n+F54C4 CENTRAL HEADER #294   02014B50 (33639248)\n+F54C8 Created Zip Spec      14 (20) '2.0'\n+F54C9 Created OS            03 (3) 'Unix'\n+F54CA Extract Zip Spec      0A (10) '1.0'\n+F54CB Extract OS            00 (0) 'MS-DOS'\n+F54CC General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-F485D Compression Method    0000 (0) 'Stored'\n-F485F Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F4863 CRC                   00000000 (0)\n-F4867 Compressed Size       00000000 (0)\n-F486B Uncompressed Size     00000000 (0)\n-F486F Filename Length       0035 (53)\n-F4871 Extra Length          0000 (0)\n-F4873 Comment Length        0000 (0)\n-F4875 Disk Start            0000 (0)\n-F4877 Int File Attributes   0000 (0)\n+F54CE Compression Method    0000 (0) 'Stored'\n+F54D0 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F54D4 CRC                   00000000 (0)\n+F54D8 Compressed Size       00000000 (0)\n+F54DC Uncompressed Size     00000000 (0)\n+F54E0 Filename Length       0035 (53)\n+F54E2 Extra Length          0000 (0)\n+F54E4 Comment Length        0000 (0)\n+F54E6 Disk Start            0000 (0)\n+F54E8 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F4879 Ext File Attributes   41ED0010 (1106051088)\n+F54EA Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-F487D Local Header Offset   00007CB7 (31927)\n-F4881 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F54EE Local Header Offset   00007CB7 (31927)\n+F54F2 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF4881: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF54F2: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0xF4881: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0xF54F2: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0xF4859: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF54CA: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-F48B6 CENTRAL HEADER #295   02014B50 (33639248)\n-F48BA Created Zip Spec      14 (20) '2.0'\n-F48BB Created OS            03 (3) 'Unix'\n-F48BC Extract Zip Spec      14 (20) '2.0'\n-F48BD Extract OS            00 (0) 'MS-DOS'\n-F48BE General Purpose Flag  0800 (2048)\n+F5527 CENTRAL HEADER #295   02014B50 (33639248)\n+F552B Created Zip Spec      14 (20) '2.0'\n+F552C Created OS            03 (3) 'Unix'\n+F552D Extract Zip Spec      14 (20) '2.0'\n+F552E Extract OS            00 (0) 'MS-DOS'\n+F552F General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-F48C0 Compression Method    0008 (8) 'Deflated'\n-F48C2 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F48C6 CRC                   9DCF049A (2647590042)\n-F48CA Compressed Size       00001F13 (7955)\n-F48CE Uncompressed Size     00012A7A (76410)\n-F48D2 Filename Length       0015 (21)\n-F48D4 Extra Length          0000 (0)\n-F48D6 Comment Length        0000 (0)\n-F48D8 Disk Start            0000 (0)\n-F48DA Int File Attributes   0000 (0)\n+F5531 Compression Method    0008 (8) 'Deflated'\n+F5533 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F5537 CRC                   CCFF255F (3439273311)\n+F553B Compressed Size       00002711 (10001)\n+F553F Uncompressed Size     0001647E (91262)\n+F5543 Filename Length       0015 (21)\n+F5545 Extra Length          0000 (0)\n+F5547 Comment Length        0000 (0)\n+F5549 Disk Start            0000 (0)\n+F554B Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F48DC Ext File Attributes   81A40000 (2175008768)\n+F554D Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-F48E0 Local Header Offset   00007D0A (32010)\n-F48E4 Filename              'XXXXXXXXXXXXXXXXXXXXX'\n+F5551 Local Header Offset   00007D0A (32010)\n+F5555 Filename              'XXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF48E4: Filename 'XXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF5555: Filename 'XXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-F48F9 CENTRAL HEADER #296   02014B50 (33639248)\n-F48FD Created Zip Spec      14 (20) '2.0'\n-F48FE Created OS            03 (3) 'Unix'\n-F48FF Extract Zip Spec      14 (20) '2.0'\n-F4900 Extract OS            00 (0) 'MS-DOS'\n-F4901 General Purpose Flag  0800 (2048)\n+F556A CENTRAL HEADER #296   02014B50 (33639248)\n+F556E Created Zip Spec      14 (20) '2.0'\n+F556F Created OS            03 (3) 'Unix'\n+F5570 Extract Zip Spec      14 (20) '2.0'\n+F5571 Extract OS            00 (0) 'MS-DOS'\n+F5572 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-F4903 Compression Method    0008 (8) 'Deflated'\n-F4905 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F4909 CRC                   86E2B4B4 (2263004340)\n-F490D Compressed Size       00000F6D (3949)\n-F4911 Uncompressed Size     00002C5E (11358)\n-F4915 Filename Length       0010 (16)\n-F4917 Extra Length          0000 (0)\n-F4919 Comment Length        0000 (0)\n-F491B Disk Start            0000 (0)\n-F491D Int File Attributes   0000 (0)\n+F5574 Compression Method    0008 (8) 'Deflated'\n+F5576 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F557A CRC                   86E2B4B4 (2263004340)\n+F557E Compressed Size       00000F6D (3949)\n+F5582 Uncompressed Size     00002C5E (11358)\n+F5586 Filename Length       0010 (16)\n+F5588 Extra Length          0000 (0)\n+F558A Comment Length        0000 (0)\n+F558C Disk Start            0000 (0)\n+F558E Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F491F Ext File Attributes   81A40000 (2175008768)\n+F5590 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-F4923 Local Header Offset   00009C50 (40016)\n-F4927 Filename              'XXXXXXXXXXXXXXXX'\n+F5594 Local Header Offset   0000A44E (42062)\n+F5598 Filename              'XXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF4927: Filename 'XXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF5598: Filename 'XXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-F4937 CENTRAL HEADER #297   02014B50 (33639248)\n-F493B Created Zip Spec      14 (20) '2.0'\n-F493C Created OS            03 (3) 'Unix'\n-F493D Extract Zip Spec      14 (20) '2.0'\n-F493E Extract OS            00 (0) 'MS-DOS'\n-F493F General Purpose Flag  0800 (2048)\n+F55A8 CENTRAL HEADER #297   02014B50 (33639248)\n+F55AC Created Zip Spec      14 (20) '2.0'\n+F55AD Created OS            03 (3) 'Unix'\n+F55AE Extract Zip Spec      14 (20) '2.0'\n+F55AF Extract OS            00 (0) 'MS-DOS'\n+F55B0 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-F4941 Compression Method    0008 (8) 'Deflated'\n-F4943 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F4947 CRC                   91A82808 (2443716616)\n-F494B Compressed Size       00000082 (130)\n-F494F Uncompressed Size     000000A0 (160)\n-F4953 Filename Length       000F (15)\n-F4955 Extra Length          0000 (0)\n-F4957 Comment Length        0000 (0)\n-F4959 Disk Start            0000 (0)\n-F495B Int File Attributes   0000 (0)\n+F55B2 Compression Method    0008 (8) 'Deflated'\n+F55B4 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F55B8 CRC                   91A82808 (2443716616)\n+F55BC Compressed Size       00000082 (130)\n+F55C0 Uncompressed Size     000000A0 (160)\n+F55C4 Filename Length       000F (15)\n+F55C6 Extra Length          0000 (0)\n+F55C8 Comment Length        0000 (0)\n+F55CA Disk Start            0000 (0)\n+F55CC Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F495D Ext File Attributes   81A40000 (2175008768)\n+F55CE Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-F4961 Local Header Offset   0000ABEB (44011)\n-F4965 Filename              'XXXXXXXXXXXXXXX'\n+F55D2 Local Header Offset   0000B3E9 (46057)\n+F55D6 Filename              'XXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF4965: Filename 'XXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF55D6: Filename 'XXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-F4974 CENTRAL HEADER #298   02014B50 (33639248)\n-F4978 Created Zip Spec      14 (20) '2.0'\n-F4979 Created OS            03 (3) 'Unix'\n-F497A Extract Zip Spec      14 (20) '2.0'\n-F497B Extract OS            00 (0) 'MS-DOS'\n-F497C General Purpose Flag  0800 (2048)\n+F55E5 CENTRAL HEADER #298   02014B50 (33639248)\n+F55E9 Created Zip Spec      14 (20) '2.0'\n+F55EA Created OS            03 (3) 'Unix'\n+F55EB Extract Zip Spec      14 (20) '2.0'\n+F55EC Extract OS            00 (0) 'MS-DOS'\n+F55ED General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-F497E Compression Method    0008 (8) 'Deflated'\n-F4980 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F4984 CRC                   A0542DCB (2689871307)\n-F4988 Compressed Size       000002EA (746)\n-F498C Uncompressed Size     000004EB (1259)\n-F4990 Filename Length       0010 (16)\n-F4992 Extra Length          0000 (0)\n-F4994 Comment Length        0000 (0)\n-F4996 Disk Start            0000 (0)\n-F4998 Int File Attributes   0000 (0)\n+F55EF Compression Method    0008 (8) 'Deflated'\n+F55F1 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F55F5 CRC                   ADF1FCE9 (2918317289)\n+F55F9 Compressed Size       000002C3 (707)\n+F55FD Uncompressed Size     000004AF (1199)\n+F5601 Filename Length       0010 (16)\n+F5603 Extra Length          0000 (0)\n+F5605 Comment Length        0000 (0)\n+F5607 Disk Start            0000 (0)\n+F5609 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F499A Ext File Attributes   81A40000 (2175008768)\n+F560B Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-F499E Local Header Offset   0000AC9A (44186)\n-F49A2 Filename              'XXXXXXXXXXXXXXXX'\n+F560F Local Header Offset   0000B498 (46232)\n+F5613 Filename              'XXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF49A2: Filename 'XXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF5613: Filename 'XXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-F49B2 CENTRAL HEADER #299   02014B50 (33639248)\n-F49B6 Created Zip Spec      14 (20) '2.0'\n-F49B7 Created OS            03 (3) 'Unix'\n-F49B8 Extract Zip Spec      14 (20) '2.0'\n-F49B9 Extract OS            00 (0) 'MS-DOS'\n-F49BA General Purpose Flag  0800 (2048)\n+F5623 CENTRAL HEADER #299   02014B50 (33639248)\n+F5627 Created Zip Spec      14 (20) '2.0'\n+F5628 Created OS            03 (3) 'Unix'\n+F5629 Extract Zip Spec      14 (20) '2.0'\n+F562A Extract OS            00 (0) 'MS-DOS'\n+F562B General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-F49BC Compression Method    0008 (8) 'Deflated'\n-F49BE Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F49C2 CRC                   9CB4EC6B (2629102699)\n-F49C6 Compressed Size       00000546 (1350)\n-F49CA Uncompressed Size     00000AA2 (2722)\n-F49CE Filename Length       007B (123)\n-F49D0 Extra Length          0000 (0)\n-F49D2 Comment Length        0000 (0)\n-F49D4 Disk Start            0000 (0)\n-F49D6 Int File Attributes   0000 (0)\n+F562D Compression Method    0008 (8) 'Deflated'\n+F562F Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F5633 CRC                   9CB4EC6B (2629102699)\n+F5637 Compressed Size       00000546 (1350)\n+F563B Uncompressed Size     00000AA2 (2722)\n+F563F Filename Length       007B (123)\n+F5641 Extra Length          0000 (0)\n+F5643 Comment Length        0000 (0)\n+F5645 Disk Start            0000 (0)\n+F5647 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F49D8 Ext File Attributes   81A40000 (2175008768)\n+F5649 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-F49DC Local Header Offset   0000AFB2 (44978)\n-F49E0 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F564D Local Header Offset   0000B789 (46985)\n+F5651 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF49E0: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF5651: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-F4A5B CENTRAL HEADER #300   02014B50 (33639248)\n-F4A5F Created Zip Spec      14 (20) '2.0'\n-F4A60 Created OS            03 (3) 'Unix'\n-F4A61 Extract Zip Spec      14 (20) '2.0'\n-F4A62 Extract OS            00 (0) 'MS-DOS'\n-F4A63 General Purpose Flag  0800 (2048)\n+F56CC CENTRAL HEADER #300   02014B50 (33639248)\n+F56D0 Created Zip Spec      14 (20) '2.0'\n+F56D1 Created OS            03 (3) 'Unix'\n+F56D2 Extract Zip Spec      14 (20) '2.0'\n+F56D3 Extract OS            00 (0) 'MS-DOS'\n+F56D4 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-F4A65 Compression Method    0008 (8) 'Deflated'\n-F4A67 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F4A6B CRC                   1401A9F3 (335653363)\n-F4A6F Compressed Size       000003C5 (965)\n-F4A73 Uncompressed Size     00000945 (2373)\n-F4A77 Filename Length       0077 (119)\n-F4A79 Extra Length          0000 (0)\n-F4A7B Comment Length        0000 (0)\n-F4A7D Disk Start            0000 (0)\n-F4A7F Int File Attributes   0000 (0)\n+F56D6 Compression Method    0008 (8) 'Deflated'\n+F56D8 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F56DC CRC                   1401A9F3 (335653363)\n+F56E0 Compressed Size       000003C5 (965)\n+F56E4 Uncompressed Size     00000945 (2373)\n+F56E8 Filename Length       0077 (119)\n+F56EA Extra Length          0000 (0)\n+F56EC Comment Length        0000 (0)\n+F56EE Disk Start            0000 (0)\n+F56F0 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F4A81 Ext File Attributes   81A40000 (2175008768)\n+F56F2 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-F4A85 Local Header Offset   0000B591 (46481)\n-F4A89 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F56F6 Local Header Offset   0000BD68 (48488)\n+F56FA Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF4A89: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF56FA: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-F4B00 CENTRAL HEADER #301   02014B50 (33639248)\n-F4B04 Created Zip Spec      14 (20) '2.0'\n-F4B05 Created OS            03 (3) 'Unix'\n-F4B06 Extract Zip Spec      14 (20) '2.0'\n-F4B07 Extract OS            00 (0) 'MS-DOS'\n-F4B08 General Purpose Flag  0800 (2048)\n+F5771 CENTRAL HEADER #301   02014B50 (33639248)\n+F5775 Created Zip Spec      14 (20) '2.0'\n+F5776 Created OS            03 (3) 'Unix'\n+F5777 Extract Zip Spec      14 (20) '2.0'\n+F5778 Extract OS            00 (0) 'MS-DOS'\n+F5779 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-F4B0A Compression Method    0008 (8) 'Deflated'\n-F4B0C Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F4B10 CRC                   445AD7B2 (1146804146)\n-F4B14 Compressed Size       000006D4 (1748)\n-F4B18 Uncompressed Size     00000FBF (4031)\n-F4B1C Filename Length       006C (108)\n-F4B1E Extra Length          0000 (0)\n-F4B20 Comment Length        0000 (0)\n-F4B22 Disk Start            0000 (0)\n-F4B24 Int File Attributes   0000 (0)\n+F577B Compression Method    0008 (8) 'Deflated'\n+F577D Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F5781 CRC                   445AD7B2 (1146804146)\n+F5785 Compressed Size       000006D4 (1748)\n+F5789 Uncompressed Size     00000FBF (4031)\n+F578D Filename Length       006C (108)\n+F578F Extra Length          0000 (0)\n+F5791 Comment Length        0000 (0)\n+F5793 Disk Start            0000 (0)\n+F5795 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F4B26 Ext File Attributes   81A40000 (2175008768)\n+F5797 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-F4B2A Local Header Offset   0000B9EB (47595)\n-F4B2E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F579B Local Header Offset   0000C1C2 (49602)\n+F579F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF4B2E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF579F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-F4B9A CENTRAL HEADER #302   02014B50 (33639248)\n-F4B9E Created Zip Spec      14 (20) '2.0'\n-F4B9F Created OS            03 (3) 'Unix'\n-F4BA0 Extract Zip Spec      14 (20) '2.0'\n-F4BA1 Extract OS            00 (0) 'MS-DOS'\n-F4BA2 General Purpose Flag  0800 (2048)\n+F580B CENTRAL HEADER #302   02014B50 (33639248)\n+F580F Created Zip Spec      14 (20) '2.0'\n+F5810 Created OS            03 (3) 'Unix'\n+F5811 Extract Zip Spec      14 (20) '2.0'\n+F5812 Extract OS            00 (0) 'MS-DOS'\n+F5813 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-F4BA4 Compression Method    0008 (8) 'Deflated'\n-F4BA6 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F4BAA CRC                   A2A96EA2 (2729012898)\n-F4BAE Compressed Size       0000092B (2347)\n-F4BB2 Uncompressed Size     000016DE (5854)\n-F4BB6 Filename Length       006C (108)\n-F4BB8 Extra Length          0000 (0)\n-F4BBA Comment Length        0000 (0)\n-F4BBC Disk Start            0000 (0)\n-F4BBE Int File Attributes   0000 (0)\n+F5815 Compression Method    0008 (8) 'Deflated'\n+F5817 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F581B CRC                   A2A96EA2 (2729012898)\n+F581F Compressed Size       0000092B (2347)\n+F5823 Uncompressed Size     000016DE (5854)\n+F5827 Filename Length       006C (108)\n+F5829 Extra Length          0000 (0)\n+F582B Comment Length        0000 (0)\n+F582D Disk Start            0000 (0)\n+F582F Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F4BC0 Ext File Attributes   81A40000 (2175008768)\n+F5831 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-F4BC4 Local Header Offset   0000C149 (49481)\n-F4BC8 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F5835 Local Header Offset   0000C920 (51488)\n+F5839 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF4BC8: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF5839: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-F4C34 CENTRAL HEADER #303   02014B50 (33639248)\n-F4C38 Created Zip Spec      14 (20) '2.0'\n-F4C39 Created OS            03 (3) 'Unix'\n-F4C3A Extract Zip Spec      14 (20) '2.0'\n-F4C3B Extract OS            00 (0) 'MS-DOS'\n-F4C3C General Purpose Flag  0800 (2048)\n+F58A5 CENTRAL HEADER #303   02014B50 (33639248)\n+F58A9 Created Zip Spec      14 (20) '2.0'\n+F58AA Created OS            03 (3) 'Unix'\n+F58AB Extract Zip Spec      14 (20) '2.0'\n+F58AC Extract OS            00 (0) 'MS-DOS'\n+F58AD General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-F4C3E Compression Method    0008 (8) 'Deflated'\n-F4C40 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F4C44 CRC                   7416DF2A (1947655978)\n-F4C48 Compressed Size       0000091D (2333)\n-F4C4C Uncompressed Size     00001512 (5394)\n-F4C50 Filename Length       007C (124)\n-F4C52 Extra Length          0000 (0)\n-F4C54 Comment Length        0000 (0)\n-F4C56 Disk Start            0000 (0)\n-F4C58 Int File Attributes   0000 (0)\n+F58AF Compression Method    0008 (8) 'Deflated'\n+F58B1 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F58B5 CRC                   7416DF2A (1947655978)\n+F58B9 Compressed Size       0000091D (2333)\n+F58BD Uncompressed Size     00001512 (5394)\n+F58C1 Filename Length       007C (124)\n+F58C3 Extra Length          0000 (0)\n+F58C5 Comment Length        0000 (0)\n+F58C7 Disk Start            0000 (0)\n+F58C9 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F4C5A Ext File Attributes   81A40000 (2175008768)\n+F58CB Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-F4C5E Local Header Offset   0000CAFE (51966)\n-F4C62 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F58CF Local Header Offset   0000D2D5 (53973)\n+F58D3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF4C62: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF58D3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-F4CDE CENTRAL HEADER #304   02014B50 (33639248)\n-F4CE2 Created Zip Spec      14 (20) '2.0'\n-F4CE3 Created OS            03 (3) 'Unix'\n-F4CE4 Extract Zip Spec      14 (20) '2.0'\n-F4CE5 Extract OS            00 (0) 'MS-DOS'\n-F4CE6 General Purpose Flag  0800 (2048)\n+F594F CENTRAL HEADER #304   02014B50 (33639248)\n+F5953 Created Zip Spec      14 (20) '2.0'\n+F5954 Created OS            03 (3) 'Unix'\n+F5955 Extract Zip Spec      14 (20) '2.0'\n+F5956 Extract OS            00 (0) 'MS-DOS'\n+F5957 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-F4CE8 Compression Method    0008 (8) 'Deflated'\n-F4CEA Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F4CEE CRC                   826E1CC4 (2188254404)\n-F4CF2 Compressed Size       00000DE0 (3552)\n-F4CF6 Uncompressed Size     00002F90 (12176)\n-F4CFA Filename Length       0079 (121)\n-F4CFC Extra Length          0000 (0)\n-F4CFE Comment Length        0000 (0)\n-F4D00 Disk Start            0000 (0)\n-F4D02 Int File Attributes   0000 (0)\n+F5959 Compression Method    0008 (8) 'Deflated'\n+F595B Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F595F CRC                   826E1CC4 (2188254404)\n+F5963 Compressed Size       00000DE0 (3552)\n+F5967 Uncompressed Size     00002F90 (12176)\n+F596B Filename Length       0079 (121)\n+F596D Extra Length          0000 (0)\n+F596F Comment Length        0000 (0)\n+F5971 Disk Start            0000 (0)\n+F5973 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F4D04 Ext File Attributes   81A40000 (2175008768)\n+F5975 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-F4D08 Local Header Offset   0000D4B5 (54453)\n-F4D0C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F5979 Local Header Offset   0000DC8C (56460)\n+F597D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF4D0C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF597D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-F4D85 CENTRAL HEADER #305   02014B50 (33639248)\n-F4D89 Created Zip Spec      14 (20) '2.0'\n-F4D8A Created OS            03 (3) 'Unix'\n-F4D8B Extract Zip Spec      14 (20) '2.0'\n-F4D8C Extract OS            00 (0) 'MS-DOS'\n-F4D8D General Purpose Flag  0800 (2048)\n+F59F6 CENTRAL HEADER #305   02014B50 (33639248)\n+F59FA Created Zip Spec      14 (20) '2.0'\n+F59FB Created OS            03 (3) 'Unix'\n+F59FC Extract Zip Spec      14 (20) '2.0'\n+F59FD Extract OS            00 (0) 'MS-DOS'\n+F59FE General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-F4D8F Compression Method    0008 (8) 'Deflated'\n-F4D91 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F4D95 CRC                   1BE163AC (467755948)\n-F4D99 Compressed Size       00000476 (1142)\n-F4D9D Uncompressed Size     00000967 (2407)\n-F4DA1 Filename Length       0082 (130)\n-F4DA3 Extra Length          0000 (0)\n-F4DA5 Comment Length        0000 (0)\n-F4DA7 Disk Start            0000 (0)\n-F4DA9 Int File Attributes   0000 (0)\n+F5A00 Compression Method    0008 (8) 'Deflated'\n+F5A02 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F5A06 CRC                   1BE163AC (467755948)\n+F5A0A Compressed Size       00000476 (1142)\n+F5A0E Uncompressed Size     00000967 (2407)\n+F5A12 Filename Length       0082 (130)\n+F5A14 Extra Length          0000 (0)\n+F5A16 Comment Length        0000 (0)\n+F5A18 Disk Start            0000 (0)\n+F5A1A Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F4DAB Ext File Attributes   81A40000 (2175008768)\n+F5A1C Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-F4DAF Local Header Offset   0000E32C (58156)\n-F4DB3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F5A20 Local Header Offset   0000EB03 (60163)\n+F5A24 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF4DB3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF5A24: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-F4E35 CENTRAL HEADER #306   02014B50 (33639248)\n-F4E39 Created Zip Spec      14 (20) '2.0'\n-F4E3A Created OS            03 (3) 'Unix'\n-F4E3B Extract Zip Spec      14 (20) '2.0'\n-F4E3C Extract OS            00 (0) 'MS-DOS'\n-F4E3D General Purpose Flag  0800 (2048)\n+F5AA6 CENTRAL HEADER #306   02014B50 (33639248)\n+F5AAA Created Zip Spec      14 (20) '2.0'\n+F5AAB Created OS            03 (3) 'Unix'\n+F5AAC Extract Zip Spec      14 (20) '2.0'\n+F5AAD Extract OS            00 (0) 'MS-DOS'\n+F5AAE General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-F4E3F Compression Method    0008 (8) 'Deflated'\n-F4E41 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F4E45 CRC                   11DB1110 (299569424)\n-F4E49 Compressed Size       00000428 (1064)\n-F4E4D Uncompressed Size     0000080F (2063)\n-F4E51 Filename Length       007C (124)\n-F4E53 Extra Length          0000 (0)\n-F4E55 Comment Length        0000 (0)\n-F4E57 Disk Start            0000 (0)\n-F4E59 Int File Attributes   0000 (0)\n+F5AB0 Compression Method    0008 (8) 'Deflated'\n+F5AB2 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F5AB6 CRC                   11DB1110 (299569424)\n+F5ABA Compressed Size       00000428 (1064)\n+F5ABE Uncompressed Size     0000080F (2063)\n+F5AC2 Filename Length       007C (124)\n+F5AC4 Extra Length          0000 (0)\n+F5AC6 Comment Length        0000 (0)\n+F5AC8 Disk Start            0000 (0)\n+F5ACA Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F4E5B Ext File Attributes   81A40000 (2175008768)\n+F5ACC Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-F4E5F Local Header Offset   0000E842 (59458)\n-F4E63 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F5AD0 Local Header Offset   0000F019 (61465)\n+F5AD4 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF4E63: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF5AD4: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-F4EDF CENTRAL HEADER #307   02014B50 (33639248)\n-F4EE3 Created Zip Spec      14 (20) '2.0'\n-F4EE4 Created OS            03 (3) 'Unix'\n-F4EE5 Extract Zip Spec      14 (20) '2.0'\n-F4EE6 Extract OS            00 (0) 'MS-DOS'\n-F4EE7 General Purpose Flag  0800 (2048)\n+F5B50 CENTRAL HEADER #307   02014B50 (33639248)\n+F5B54 Created Zip Spec      14 (20) '2.0'\n+F5B55 Created OS            03 (3) 'Unix'\n+F5B56 Extract Zip Spec      14 (20) '2.0'\n+F5B57 Extract OS            00 (0) 'MS-DOS'\n+F5B58 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-F4EE9 Compression Method    0008 (8) 'Deflated'\n-F4EEB Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F4EEF CRC                   30A69673 (816223859)\n-F4EF3 Compressed Size       000005CE (1486)\n-F4EF7 Uncompressed Size     00000C1C (3100)\n-F4EFB Filename Length       0078 (120)\n-F4EFD Extra Length          0000 (0)\n-F4EFF Comment Length        0000 (0)\n-F4F01 Disk Start            0000 (0)\n-F4F03 Int File Attributes   0000 (0)\n+F5B5A Compression Method    0008 (8) 'Deflated'\n+F5B5C Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F5B60 CRC                   30A69673 (816223859)\n+F5B64 Compressed Size       000005CE (1486)\n+F5B68 Uncompressed Size     00000C1C (3100)\n+F5B6C Filename Length       0078 (120)\n+F5B6E Extra Length          0000 (0)\n+F5B70 Comment Length        0000 (0)\n+F5B72 Disk Start            0000 (0)\n+F5B74 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F4F05 Ext File Attributes   81A40000 (2175008768)\n+F5B76 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-F4F09 Local Header Offset   0000ED04 (60676)\n-F4F0D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F5B7A Local Header Offset   0000F4DB (62683)\n+F5B7E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF4F0D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF5B7E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-F4F85 CENTRAL HEADER #308   02014B50 (33639248)\n-F4F89 Created Zip Spec      14 (20) '2.0'\n-F4F8A Created OS            03 (3) 'Unix'\n-F4F8B Extract Zip Spec      14 (20) '2.0'\n-F4F8C Extract OS            00 (0) 'MS-DOS'\n-F4F8D General Purpose Flag  0800 (2048)\n+F5BF6 CENTRAL HEADER #308   02014B50 (33639248)\n+F5BFA Created Zip Spec      14 (20) '2.0'\n+F5BFB Created OS            03 (3) 'Unix'\n+F5BFC Extract Zip Spec      14 (20) '2.0'\n+F5BFD Extract OS            00 (0) 'MS-DOS'\n+F5BFE General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-F4F8F Compression Method    0008 (8) 'Deflated'\n-F4F91 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F4F95 CRC                   0C316B32 (204565298)\n-F4F99 Compressed Size       000003A1 (929)\n-F4F9D Uncompressed Size     000006D7 (1751)\n-F4FA1 Filename Length       0082 (130)\n-F4FA3 Extra Length          0000 (0)\n-F4FA5 Comment Length        0000 (0)\n-F4FA7 Disk Start            0000 (0)\n-F4FA9 Int File Attributes   0000 (0)\n+F5C00 Compression Method    0008 (8) 'Deflated'\n+F5C02 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F5C06 CRC                   0C316B32 (204565298)\n+F5C0A Compressed Size       000003A1 (929)\n+F5C0E Uncompressed Size     000006D7 (1751)\n+F5C12 Filename Length       0082 (130)\n+F5C14 Extra Length          0000 (0)\n+F5C16 Comment Length        0000 (0)\n+F5C18 Disk Start            0000 (0)\n+F5C1A Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F4FAB Ext File Attributes   81A40000 (2175008768)\n+F5C1C Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-F4FAF Local Header Offset   0000F368 (62312)\n-F4FB3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F5C20 Local Header Offset   0000FB3F (64319)\n+F5C24 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF4FB3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF5C24: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-F5035 CENTRAL HEADER #309   02014B50 (33639248)\n-F5039 Created Zip Spec      14 (20) '2.0'\n-F503A Created OS            03 (3) 'Unix'\n-F503B Extract Zip Spec      14 (20) '2.0'\n-F503C Extract OS            00 (0) 'MS-DOS'\n-F503D General Purpose Flag  0800 (2048)\n+F5CA6 CENTRAL HEADER #309   02014B50 (33639248)\n+F5CAA Created Zip Spec      14 (20) '2.0'\n+F5CAB Created OS            03 (3) 'Unix'\n+F5CAC Extract Zip Spec      14 (20) '2.0'\n+F5CAD Extract OS            00 (0) 'MS-DOS'\n+F5CAE General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-F503F Compression Method    0008 (8) 'Deflated'\n-F5041 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F5045 CRC                   37BEEC96 (935259286)\n-F5049 Compressed Size       000006C9 (1737)\n-F504D Uncompressed Size     0000133B (4923)\n-F5051 Filename Length       007E (126)\n-F5053 Extra Length          0000 (0)\n-F5055 Comment Length        0000 (0)\n-F5057 Disk Start            0000 (0)\n-F5059 Int File Attributes   0000 (0)\n+F5CB0 Compression Method    0008 (8) 'Deflated'\n+F5CB2 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F5CB6 CRC                   37BEEC96 (935259286)\n+F5CBA Compressed Size       000006C9 (1737)\n+F5CBE Uncompressed Size     0000133B (4923)\n+F5CC2 Filename Length       007E (126)\n+F5CC4 Extra Length          0000 (0)\n+F5CC6 Comment Length        0000 (0)\n+F5CC8 Disk Start            0000 (0)\n+F5CCA Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F505B Ext File Attributes   81A40000 (2175008768)\n+F5CCC Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-F505F Local Header Offset   0000F7A9 (63401)\n-F5063 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F5CD0 Local Header Offset   0000FF80 (65408)\n+F5CD4 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF5063: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF5CD4: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-F50E1 CENTRAL HEADER #310   02014B50 (33639248)\n-F50E5 Created Zip Spec      14 (20) '2.0'\n-F50E6 Created OS            03 (3) 'Unix'\n-F50E7 Extract Zip Spec      14 (20) '2.0'\n-F50E8 Extract OS            00 (0) 'MS-DOS'\n-F50E9 General Purpose Flag  0800 (2048)\n+F5D52 CENTRAL HEADER #310   02014B50 (33639248)\n+F5D56 Created Zip Spec      14 (20) '2.0'\n+F5D57 Created OS            03 (3) 'Unix'\n+F5D58 Extract Zip Spec      14 (20) '2.0'\n+F5D59 Extract OS            00 (0) 'MS-DOS'\n+F5D5A General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-F50EB Compression Method    0008 (8) 'Deflated'\n-F50ED Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F50F1 CRC                   D0AE7BE4 (3501095908)\n-F50F5 Compressed Size       000003D9 (985)\n-F50F9 Uncompressed Size     0000074C (1868)\n-F50FD Filename Length       0086 (134)\n-F50FF Extra Length          0000 (0)\n-F5101 Comment Length        0000 (0)\n-F5103 Disk Start            0000 (0)\n-F5105 Int File Attributes   0000 (0)\n+F5D5C Compression Method    0008 (8) 'Deflated'\n+F5D5E Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F5D62 CRC                   D0AE7BE4 (3501095908)\n+F5D66 Compressed Size       000003D9 (985)\n+F5D6A Uncompressed Size     0000074C (1868)\n+F5D6E Filename Length       0086 (134)\n+F5D70 Extra Length          0000 (0)\n+F5D72 Comment Length        0000 (0)\n+F5D74 Disk Start            0000 (0)\n+F5D76 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F5107 Ext File Attributes   81A40000 (2175008768)\n+F5D78 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-F510B Local Header Offset   0000FF0E (65294)\n-F510F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+F5D7C Local Header Offset   000106E5 (67301)\n+F5D80 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             XX'\n #\n-# WARNING: Offset 0xF510F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF5D80: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-F5195 CENTRAL HEADER #311   02014B50 (33639248)\n-F5199 Created Zip Spec      14 (20) '2.0'\n-F519A Created OS            03 (3) 'Unix'\n-F519B Extract Zip Spec      14 (20) '2.0'\n-F519C Extract OS            00 (0) 'MS-DOS'\n-F519D General Purpose Flag  0800 (2048)\n+F5E06 CENTRAL HEADER #311   02014B50 (33639248)\n+F5E0A Created Zip Spec      14 (20) '2.0'\n+F5E0B Created OS            03 (3) 'Unix'\n+F5E0C Extract Zip Spec      14 (20) '2.0'\n+F5E0D Extract OS            00 (0) 'MS-DOS'\n+F5E0E General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-F519F Compression Method    0008 (8) 'Deflated'\n-F51A1 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F51A5 CRC                   4C134CE6 (1276333286)\n-F51A9 Compressed Size       000006D5 (1749)\n-F51AD Uncompressed Size     0000103C (4156)\n-F51B1 Filename Length       0082 (130)\n-F51B3 Extra Length          0000 (0)\n-F51B5 Comment Length        0000 (0)\n-F51B7 Disk Start            0000 (0)\n-F51B9 Int File Attributes   0000 (0)\n+F5E10 Compression Method    0008 (8) 'Deflated'\n+F5E12 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F5E16 CRC                   4C134CE6 (1276333286)\n+F5E1A Compressed Size       000006D5 (1749)\n+F5E1E Uncompressed Size     0000103C (4156)\n+F5E22 Filename Length       0082 (130)\n+F5E24 Extra Length          0000 (0)\n+F5E26 Comment Length        0000 (0)\n+F5E28 Disk Start            0000 (0)\n+F5E2A Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F51BB Ext File Attributes   81A40000 (2175008768)\n+F5E2C Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-F51BF Local Header Offset   0001038B (66443)\n-F51C3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F5E30 Local Header Offset   00010B62 (68450)\n+F5E34 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF51C3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF5E34: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-F5245 CENTRAL HEADER #312   02014B50 (33639248)\n-F5249 Created Zip Spec      14 (20) '2.0'\n-F524A Created OS            03 (3) 'Unix'\n-F524B Extract Zip Spec      14 (20) '2.0'\n-F524C Extract OS            00 (0) 'MS-DOS'\n-F524D General Purpose Flag  0800 (2048)\n+F5EB6 CENTRAL HEADER #312   02014B50 (33639248)\n+F5EBA Created Zip Spec      14 (20) '2.0'\n+F5EBB Created OS            03 (3) 'Unix'\n+F5EBC Extract Zip Spec      14 (20) '2.0'\n+F5EBD Extract OS            00 (0) 'MS-DOS'\n+F5EBE General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-F524F Compression Method    0008 (8) 'Deflated'\n-F5251 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F5255 CRC                   63086228 (1661493800)\n-F5259 Compressed Size       00000430 (1072)\n-F525D Uncompressed Size     00000838 (2104)\n-F5261 Filename Length       0084 (132)\n-F5263 Extra Length          0000 (0)\n-F5265 Comment Length        0000 (0)\n-F5267 Disk Start            0000 (0)\n-F5269 Int File Attributes   0000 (0)\n+F5EC0 Compression Method    0008 (8) 'Deflated'\n+F5EC2 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F5EC6 CRC                   63086228 (1661493800)\n+F5ECA Compressed Size       00000430 (1072)\n+F5ECE Uncompressed Size     00000838 (2104)\n+F5ED2 Filename Length       0084 (132)\n+F5ED4 Extra Length          0000 (0)\n+F5ED6 Comment Length        0000 (0)\n+F5ED8 Disk Start            0000 (0)\n+F5EDA Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F526B Ext File Attributes   81A40000 (2175008768)\n+F5EDC Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-F526F Local Header Offset   00010B00 (68352)\n-F5273 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+F5EE0 Local Header Offset   000112D7 (70359)\n+F5EE4 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             '\n #\n-# WARNING: Offset 0xF5273: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF5EE4: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-F52F7 CENTRAL HEADER #313   02014B50 (33639248)\n-F52FB Created Zip Spec      14 (20) '2.0'\n-F52FC Created OS            03 (3) 'Unix'\n-F52FD Extract Zip Spec      14 (20) '2.0'\n-F52FE Extract OS            00 (0) 'MS-DOS'\n-F52FF General Purpose Flag  0800 (2048)\n+F5F68 CENTRAL HEADER #313   02014B50 (33639248)\n+F5F6C Created Zip Spec      14 (20) '2.0'\n+F5F6D Created OS            03 (3) 'Unix'\n+F5F6E Extract Zip Spec      14 (20) '2.0'\n+F5F6F Extract OS            00 (0) 'MS-DOS'\n+F5F70 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-F5301 Compression Method    0008 (8) 'Deflated'\n-F5303 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F5307 CRC                   9EF621C1 (2666930625)\n-F530B Compressed Size       000005D9 (1497)\n-F530F Uncompressed Size     00000C90 (3216)\n-F5313 Filename Length       0080 (128)\n-F5315 Extra Length          0000 (0)\n-F5317 Comment Length        0000 (0)\n-F5319 Disk Start            0000 (0)\n-F531B Int File Attributes   0000 (0)\n+F5F72 Compression Method    0008 (8) 'Deflated'\n+F5F74 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F5F78 CRC                   9EF621C1 (2666930625)\n+F5F7C Compressed Size       000005D9 (1497)\n+F5F80 Uncompressed Size     00000C90 (3216)\n+F5F84 Filename Length       0080 (128)\n+F5F86 Extra Length          0000 (0)\n+F5F88 Comment Length        0000 (0)\n+F5F8A Disk Start            0000 (0)\n+F5F8C Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F531D Ext File Attributes   81A40000 (2175008768)\n+F5F8E Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-F5321 Local Header Offset   00010FD2 (69586)\n-F5325 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F5F92 Local Header Offset   000117A9 (71593)\n+F5F96 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF5325: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF5F96: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-F53A5 CENTRAL HEADER #314   02014B50 (33639248)\n-F53A9 Created Zip Spec      14 (20) '2.0'\n-F53AA Created OS            03 (3) 'Unix'\n-F53AB Extract Zip Spec      14 (20) '2.0'\n-F53AC Extract OS            00 (0) 'MS-DOS'\n-F53AD General Purpose Flag  0800 (2048)\n+F6016 CENTRAL HEADER #314   02014B50 (33639248)\n+F601A Created Zip Spec      14 (20) '2.0'\n+F601B Created OS            03 (3) 'Unix'\n+F601C Extract Zip Spec      14 (20) '2.0'\n+F601D Extract OS            00 (0) 'MS-DOS'\n+F601E General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-F53AF Compression Method    0008 (8) 'Deflated'\n-F53B1 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F53B5 CRC                   6BE0FFE8 (1809907688)\n-F53B9 Compressed Size       00000687 (1671)\n-F53BD Uncompressed Size     00000EF6 (3830)\n-F53C1 Filename Length       0068 (104)\n-F53C3 Extra Length          0000 (0)\n-F53C5 Comment Length        0000 (0)\n-F53C7 Disk Start            0000 (0)\n-F53C9 Int File Attributes   0000 (0)\n+F6020 Compression Method    0008 (8) 'Deflated'\n+F6022 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F6026 CRC                   6BE0FFE8 (1809907688)\n+F602A Compressed Size       00000687 (1671)\n+F602E Uncompressed Size     00000EF6 (3830)\n+F6032 Filename Length       0068 (104)\n+F6034 Extra Length          0000 (0)\n+F6036 Comment Length        0000 (0)\n+F6038 Disk Start            0000 (0)\n+F603A Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F53CB Ext File Attributes   81A40000 (2175008768)\n+F603C Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-F53CF Local Header Offset   00011649 (71241)\n-F53D3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F6040 Local Header Offset   00011E20 (73248)\n+F6044 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF53D3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF6044: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-F543B CENTRAL HEADER #315   02014B50 (33639248)\n-F543F Created Zip Spec      14 (20) '2.0'\n-F5440 Created OS            03 (3) 'Unix'\n-F5441 Extract Zip Spec      14 (20) '2.0'\n-F5442 Extract OS            00 (0) 'MS-DOS'\n-F5443 General Purpose Flag  0800 (2048)\n+F60AC CENTRAL HEADER #315   02014B50 (33639248)\n+F60B0 Created Zip Spec      14 (20) '2.0'\n+F60B1 Created OS            03 (3) 'Unix'\n+F60B2 Extract Zip Spec      14 (20) '2.0'\n+F60B3 Extract OS            00 (0) 'MS-DOS'\n+F60B4 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-F5445 Compression Method    0008 (8) 'Deflated'\n-F5447 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F544B CRC                   988DC4AD (2559427757)\n-F544F Compressed Size       000003CA (970)\n-F5453 Uncompressed Size     0000071B (1819)\n-F5457 Filename Length       006D (109)\n-F5459 Extra Length          0000 (0)\n-F545B Comment Length        0000 (0)\n-F545D Disk Start            0000 (0)\n-F545F Int File Attributes   0000 (0)\n+F60B6 Compression Method    0008 (8) 'Deflated'\n+F60B8 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F60BC CRC                   988DC4AD (2559427757)\n+F60C0 Compressed Size       000003CA (970)\n+F60C4 Uncompressed Size     0000071B (1819)\n+F60C8 Filename Length       006D (109)\n+F60CA Extra Length          0000 (0)\n+F60CC Comment Length        0000 (0)\n+F60CE Disk Start            0000 (0)\n+F60D0 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F5461 Ext File Attributes   81A40000 (2175008768)\n+F60D2 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-F5465 Local Header Offset   00011D56 (73046)\n-F5469 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F60D6 Local Header Offset   0001252D (75053)\n+F60DA Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF5469: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF60DA: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-F54D6 CENTRAL HEADER #316   02014B50 (33639248)\n-F54DA Created Zip Spec      14 (20) '2.0'\n-F54DB Created OS            03 (3) 'Unix'\n-F54DC Extract Zip Spec      14 (20) '2.0'\n-F54DD Extract OS            00 (0) 'MS-DOS'\n-F54DE General Purpose Flag  0800 (2048)\n+F6147 CENTRAL HEADER #316   02014B50 (33639248)\n+F614B Created Zip Spec      14 (20) '2.0'\n+F614C Created OS            03 (3) 'Unix'\n+F614D Extract Zip Spec      14 (20) '2.0'\n+F614E Extract OS            00 (0) 'MS-DOS'\n+F614F General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-F54E0 Compression Method    0008 (8) 'Deflated'\n-F54E2 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F54E6 CRC                   07A59EC9 (128294601)\n-F54EA Compressed Size       000004D1 (1233)\n-F54EE Uncompressed Size     00000C29 (3113)\n-F54F2 Filename Length       0088 (136)\n-F54F4 Extra Length          0000 (0)\n-F54F6 Comment Length        0000 (0)\n-F54F8 Disk Start            0000 (0)\n-F54FA Int File Attributes   0000 (0)\n+F6151 Compression Method    0008 (8) 'Deflated'\n+F6153 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F6157 CRC                   07A59EC9 (128294601)\n+F615B Compressed Size       000004D1 (1233)\n+F615F Uncompressed Size     00000C29 (3113)\n+F6163 Filename Length       0088 (136)\n+F6165 Extra Length          0000 (0)\n+F6167 Comment Length        0000 (0)\n+F6169 Disk Start            0000 (0)\n+F616B Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F54FC Ext File Attributes   81A40000 (2175008768)\n+F616D Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-F5500 Local Header Offset   000121AB (74155)\n-F5504 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+F6171 Local Header Offset   00012982 (76162)\n+F6175 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             XXXX'\n #\n-# WARNING: Offset 0xF5504: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF6175: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-F558C CENTRAL HEADER #317   02014B50 (33639248)\n-F5590 Created Zip Spec      14 (20) '2.0'\n-F5591 Created OS            03 (3) 'Unix'\n-F5592 Extract Zip Spec      14 (20) '2.0'\n-F5593 Extract OS            00 (0) 'MS-DOS'\n-F5594 General Purpose Flag  0800 (2048)\n+F61FD CENTRAL HEADER #317   02014B50 (33639248)\n+F6201 Created Zip Spec      14 (20) '2.0'\n+F6202 Created OS            03 (3) 'Unix'\n+F6203 Extract Zip Spec      14 (20) '2.0'\n+F6204 Extract OS            00 (0) 'MS-DOS'\n+F6205 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-F5596 Compression Method    0008 (8) 'Deflated'\n-F5598 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F559C CRC                   63D24DDE (1674726878)\n-F55A0 Compressed Size       0000046A (1130)\n-F55A4 Uncompressed Size     00000E46 (3654)\n-F55A8 Filename Length       0082 (130)\n-F55AA Extra Length          0000 (0)\n-F55AC Comment Length        0000 (0)\n-F55AE Disk Start            0000 (0)\n-F55B0 Int File Attributes   0000 (0)\n+F6207 Compression Method    0008 (8) 'Deflated'\n+F6209 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F620D CRC                   63D24DDE (1674726878)\n+F6211 Compressed Size       0000046A (1130)\n+F6215 Uncompressed Size     00000E46 (3654)\n+F6219 Filename Length       0082 (130)\n+F621B Extra Length          0000 (0)\n+F621D Comment Length        0000 (0)\n+F621F Disk Start            0000 (0)\n+F6221 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F55B2 Ext File Attributes   81A40000 (2175008768)\n+F6223 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-F55B6 Local Header Offset   00012722 (75554)\n-F55BA Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F6227 Local Header Offset   00012EF9 (77561)\n+F622B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF55BA: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF622B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-F563C CENTRAL HEADER #318   02014B50 (33639248)\n-F5640 Created Zip Spec      14 (20) '2.0'\n-F5641 Created OS            03 (3) 'Unix'\n-F5642 Extract Zip Spec      14 (20) '2.0'\n-F5643 Extract OS            00 (0) 'MS-DOS'\n-F5644 General Purpose Flag  0800 (2048)\n+F62AD CENTRAL HEADER #318   02014B50 (33639248)\n+F62B1 Created Zip Spec      14 (20) '2.0'\n+F62B2 Created OS            03 (3) 'Unix'\n+F62B3 Extract Zip Spec      14 (20) '2.0'\n+F62B4 Extract OS            00 (0) 'MS-DOS'\n+F62B5 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-F5646 Compression Method    0008 (8) 'Deflated'\n-F5648 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F564C CRC                   2E17013D (773259581)\n-F5650 Compressed Size       0000043F (1087)\n-F5654 Uncompressed Size     00000888 (2184)\n-F5658 Filename Length       0089 (137)\n-F565A Extra Length          0000 (0)\n-F565C Comment Length        0000 (0)\n-F565E Disk Start            0000 (0)\n-F5660 Int File Attributes   0000 (0)\n+F62B7 Compression Method    0008 (8) 'Deflated'\n+F62B9 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F62BD CRC                   2E17013D (773259581)\n+F62C1 Compressed Size       0000043F (1087)\n+F62C5 Uncompressed Size     00000888 (2184)\n+F62C9 Filename Length       0089 (137)\n+F62CB Extra Length          0000 (0)\n+F62CD Comment Length        0000 (0)\n+F62CF Disk Start            0000 (0)\n+F62D1 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F5662 Ext File Attributes   81A40000 (2175008768)\n+F62D3 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-F5666 Local Header Offset   00012C2C (76844)\n-F566A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+F62D7 Local Header Offset   00013403 (78851)\n+F62DB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             XXXXX'\n #\n-# WARNING: Offset 0xF566A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF62DB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-F56F3 CENTRAL HEADER #319   02014B50 (33639248)\n-F56F7 Created Zip Spec      14 (20) '2.0'\n-F56F8 Created OS            03 (3) 'Unix'\n-F56F9 Extract Zip Spec      14 (20) '2.0'\n-F56FA Extract OS            00 (0) 'MS-DOS'\n-F56FB General Purpose Flag  0800 (2048)\n+F6364 CENTRAL HEADER #319   02014B50 (33639248)\n+F6368 Created Zip Spec      14 (20) '2.0'\n+F6369 Created OS            03 (3) 'Unix'\n+F636A Extract Zip Spec      14 (20) '2.0'\n+F636B Extract OS            00 (0) 'MS-DOS'\n+F636C General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-F56FD Compression Method    0008 (8) 'Deflated'\n-F56FF Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F5703 CRC                   C1E5A225 (3253051941)\n-F5707 Compressed Size       000003A3 (931)\n-F570B Uncompressed Size     0000070B (1803)\n-F570F Filename Length       006B (107)\n-F5711 Extra Length          0000 (0)\n-F5713 Comment Length        0000 (0)\n-F5715 Disk Start            0000 (0)\n-F5717 Int File Attributes   0000 (0)\n+F636E Compression Method    0008 (8) 'Deflated'\n+F6370 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F6374 CRC                   C1E5A225 (3253051941)\n+F6378 Compressed Size       000003A3 (931)\n+F637C Uncompressed Size     0000070B (1803)\n+F6380 Filename Length       006B (107)\n+F6382 Extra Length          0000 (0)\n+F6384 Comment Length        0000 (0)\n+F6386 Disk Start            0000 (0)\n+F6388 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F5719 Ext File Attributes   81A40000 (2175008768)\n+F638A Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-F571D Local Header Offset   00013112 (78098)\n-F5721 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F638E Local Header Offset   000138E9 (80105)\n+F6392 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF5721: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF6392: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-F578C CENTRAL HEADER #320   02014B50 (33639248)\n-F5790 Created Zip Spec      14 (20) '2.0'\n-F5791 Created OS            03 (3) 'Unix'\n-F5792 Extract Zip Spec      14 (20) '2.0'\n-F5793 Extract OS            00 (0) 'MS-DOS'\n-F5794 General Purpose Flag  0800 (2048)\n+F63FD CENTRAL HEADER #320   02014B50 (33639248)\n+F6401 Created Zip Spec      14 (20) '2.0'\n+F6402 Created OS            03 (3) 'Unix'\n+F6403 Extract Zip Spec      14 (20) '2.0'\n+F6404 Extract OS            00 (0) 'MS-DOS'\n+F6405 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-F5796 Compression Method    0008 (8) 'Deflated'\n-F5798 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F579C CRC                   8950733E (2303750974)\n-F57A0 Compressed Size       00000350 (848)\n-F57A4 Uncompressed Size     0000064D (1613)\n-F57A8 Filename Length       006A (106)\n-F57AA Extra Length          0000 (0)\n-F57AC Comment Length        0000 (0)\n-F57AE Disk Start            0000 (0)\n-F57B0 Int File Attributes   0000 (0)\n+F6407 Compression Method    0008 (8) 'Deflated'\n+F6409 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F640D CRC                   8950733E (2303750974)\n+F6411 Compressed Size       00000350 (848)\n+F6415 Uncompressed Size     0000064D (1613)\n+F6419 Filename Length       006A (106)\n+F641B Extra Length          0000 (0)\n+F641D Comment Length        0000 (0)\n+F641F Disk Start            0000 (0)\n+F6421 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F57B2 Ext File Attributes   81A40000 (2175008768)\n+F6423 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-F57B6 Local Header Offset   0001353E (79166)\n-F57BA Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F6427 Local Header Offset   00013D15 (81173)\n+F642B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF57BA: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF642B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-F5824 CENTRAL HEADER #321   02014B50 (33639248)\n-F5828 Created Zip Spec      14 (20) '2.0'\n-F5829 Created OS            03 (3) 'Unix'\n-F582A Extract Zip Spec      14 (20) '2.0'\n-F582B Extract OS            00 (0) 'MS-DOS'\n-F582C General Purpose Flag  0800 (2048)\n+F6495 CENTRAL HEADER #321   02014B50 (33639248)\n+F6499 Created Zip Spec      14 (20) '2.0'\n+F649A Created OS            03 (3) 'Unix'\n+F649B Extract Zip Spec      14 (20) '2.0'\n+F649C Extract OS            00 (0) 'MS-DOS'\n+F649D General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-F582E Compression Method    0008 (8) 'Deflated'\n-F5830 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F5834 CRC                   A0157ABE (2685762238)\n-F5838 Compressed Size       0000034B (843)\n-F583C Uncompressed Size     00000643 (1603)\n-F5840 Filename Length       0069 (105)\n-F5842 Extra Length          0000 (0)\n-F5844 Comment Length        0000 (0)\n-F5846 Disk Start            0000 (0)\n-F5848 Int File Attributes   0000 (0)\n+F649F Compression Method    0008 (8) 'Deflated'\n+F64A1 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F64A5 CRC                   A0157ABE (2685762238)\n+F64A9 Compressed Size       0000034B (843)\n+F64AD Uncompressed Size     00000643 (1603)\n+F64B1 Filename Length       0069 (105)\n+F64B3 Extra Length          0000 (0)\n+F64B5 Comment Length        0000 (0)\n+F64B7 Disk Start            0000 (0)\n+F64B9 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F584A Ext File Attributes   81A40000 (2175008768)\n+F64BB Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-F584E Local Header Offset   00013916 (80150)\n-F5852 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F64BF Local Header Offset   000140ED (82157)\n+F64C3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF5852: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF64C3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-F58BB CENTRAL HEADER #322   02014B50 (33639248)\n-F58BF Created Zip Spec      14 (20) '2.0'\n-F58C0 Created OS            03 (3) 'Unix'\n-F58C1 Extract Zip Spec      14 (20) '2.0'\n-F58C2 Extract OS            00 (0) 'MS-DOS'\n-F58C3 General Purpose Flag  0800 (2048)\n+F652C CENTRAL HEADER #322   02014B50 (33639248)\n+F6530 Created Zip Spec      14 (20) '2.0'\n+F6531 Created OS            03 (3) 'Unix'\n+F6532 Extract Zip Spec      14 (20) '2.0'\n+F6533 Extract OS            00 (0) 'MS-DOS'\n+F6534 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-F58C5 Compression Method    0008 (8) 'Deflated'\n-F58C7 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F58CB CRC                   164EC61D (374261277)\n-F58CF Compressed Size       0000054E (1358)\n-F58D3 Uncompressed Size     00000B15 (2837)\n-F58D7 Filename Length       008F (143)\n-F58D9 Extra Length          0000 (0)\n-F58DB Comment Length        0000 (0)\n-F58DD Disk Start            0000 (0)\n-F58DF Int File Attributes   0000 (0)\n+F6536 Compression Method    0008 (8) 'Deflated'\n+F6538 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F653C CRC                   164EC61D (374261277)\n+F6540 Compressed Size       0000054E (1358)\n+F6544 Uncompressed Size     00000B15 (2837)\n+F6548 Filename Length       008F (143)\n+F654A Extra Length          0000 (0)\n+F654C Comment Length        0000 (0)\n+F654E Disk Start            0000 (0)\n+F6550 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F58E1 Ext File Attributes   81A40000 (2175008768)\n+F6552 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-F58E5 Local Header Offset   00013CE8 (81128)\n-F58E9 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+F6556 Local Header Offset   000144BF (83135)\n+F655A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             XXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF58E9: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF655A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-F5978 CENTRAL HEADER #323   02014B50 (33639248)\n-F597C Created Zip Spec      14 (20) '2.0'\n-F597D Created OS            03 (3) 'Unix'\n-F597E Extract Zip Spec      14 (20) '2.0'\n-F597F Extract OS            00 (0) 'MS-DOS'\n-F5980 General Purpose Flag  0800 (2048)\n+F65E9 CENTRAL HEADER #323   02014B50 (33639248)\n+F65ED Created Zip Spec      14 (20) '2.0'\n+F65EE Created OS            03 (3) 'Unix'\n+F65EF Extract Zip Spec      14 (20) '2.0'\n+F65F0 Extract OS            00 (0) 'MS-DOS'\n+F65F1 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-F5982 Compression Method    0008 (8) 'Deflated'\n-F5984 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F5988 CRC                   A42AA4FE (2754258174)\n-F598C Compressed Size       00000510 (1296)\n-F5990 Uncompressed Size     00000C7F (3199)\n-F5994 Filename Length       0076 (118)\n-F5996 Extra Length          0000 (0)\n-F5998 Comment Length        0000 (0)\n-F599A Disk Start            0000 (0)\n-F599C Int File Attributes   0000 (0)\n+F65F3 Compression Method    0008 (8) 'Deflated'\n+F65F5 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F65F9 CRC                   A42AA4FE (2754258174)\n+F65FD Compressed Size       00000510 (1296)\n+F6601 Uncompressed Size     00000C7F (3199)\n+F6605 Filename Length       0076 (118)\n+F6607 Extra Length          0000 (0)\n+F6609 Comment Length        0000 (0)\n+F660B Disk Start            0000 (0)\n+F660D Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F599E Ext File Attributes   81A40000 (2175008768)\n+F660F Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-F59A2 Local Header Offset   000142E3 (82659)\n-F59A6 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F6613 Local Header Offset   00014ABA (84666)\n+F6617 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF59A6: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF6617: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-F5A1C CENTRAL HEADER #324   02014B50 (33639248)\n-F5A20 Created Zip Spec      14 (20) '2.0'\n-F5A21 Created OS            03 (3) 'Unix'\n-F5A22 Extract Zip Spec      14 (20) '2.0'\n-F5A23 Extract OS            00 (0) 'MS-DOS'\n-F5A24 General Purpose Flag  0800 (2048)\n+F668D CENTRAL HEADER #324   02014B50 (33639248)\n+F6691 Created Zip Spec      14 (20) '2.0'\n+F6692 Created OS            03 (3) 'Unix'\n+F6693 Extract Zip Spec      14 (20) '2.0'\n+F6694 Extract OS            00 (0) 'MS-DOS'\n+F6695 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-F5A26 Compression Method    0008 (8) 'Deflated'\n-F5A28 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F5A2C CRC                   4F9A1C4F (1335499855)\n-F5A30 Compressed Size       000003FB (1019)\n-F5A34 Uncompressed Size     000009AF (2479)\n-F5A38 Filename Length       0073 (115)\n-F5A3A Extra Length          0000 (0)\n-F5A3C Comment Length        0000 (0)\n-F5A3E Disk Start            0000 (0)\n-F5A40 Int File Attributes   0000 (0)\n+F6697 Compression Method    0008 (8) 'Deflated'\n+F6699 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F669D CRC                   4F9A1C4F (1335499855)\n+F66A1 Compressed Size       000003FB (1019)\n+F66A5 Uncompressed Size     000009AF (2479)\n+F66A9 Filename Length       0073 (115)\n+F66AB Extra Length          0000 (0)\n+F66AD Comment Length        0000 (0)\n+F66AF Disk Start            0000 (0)\n+F66B1 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F5A42 Ext File Attributes   81A40000 (2175008768)\n+F66B3 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-F5A46 Local Header Offset   00014887 (84103)\n-F5A4A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F66B7 Local Header Offset   0001505E (86110)\n+F66BB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF5A4A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF66BB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-F5ABD CENTRAL HEADER #325   02014B50 (33639248)\n-F5AC1 Created Zip Spec      14 (20) '2.0'\n-F5AC2 Created OS            03 (3) 'Unix'\n-F5AC3 Extract Zip Spec      14 (20) '2.0'\n-F5AC4 Extract OS            00 (0) 'MS-DOS'\n-F5AC5 General Purpose Flag  0800 (2048)\n+F672E CENTRAL HEADER #325   02014B50 (33639248)\n+F6732 Created Zip Spec      14 (20) '2.0'\n+F6733 Created OS            03 (3) 'Unix'\n+F6734 Extract Zip Spec      14 (20) '2.0'\n+F6735 Extract OS            00 (0) 'MS-DOS'\n+F6736 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-F5AC7 Compression Method    0008 (8) 'Deflated'\n-F5AC9 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F5ACD CRC                   754F4527 (1968129319)\n-F5AD1 Compressed Size       00000573 (1395)\n-F5AD5 Uncompressed Size     00001265 (4709)\n-F5AD9 Filename Length       0080 (128)\n-F5ADB Extra Length          0000 (0)\n-F5ADD Comment Length        0000 (0)\n-F5ADF Disk Start            0000 (0)\n-F5AE1 Int File Attributes   0000 (0)\n+F6738 Compression Method    0008 (8) 'Deflated'\n+F673A Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F673E CRC                   754F4527 (1968129319)\n+F6742 Compressed Size       00000573 (1395)\n+F6746 Uncompressed Size     00001265 (4709)\n+F674A Filename Length       0080 (128)\n+F674C Extra Length          0000 (0)\n+F674E Comment Length        0000 (0)\n+F6750 Disk Start            0000 (0)\n+F6752 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F5AE3 Ext File Attributes   81A40000 (2175008768)\n+F6754 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-F5AE7 Local Header Offset   00014D13 (85267)\n-F5AEB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F6758 Local Header Offset   000154EA (87274)\n+F675C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF5AEB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF675C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-F5B6B CENTRAL HEADER #326   02014B50 (33639248)\n-F5B6F Created Zip Spec      14 (20) '2.0'\n-F5B70 Created OS            03 (3) 'Unix'\n-F5B71 Extract Zip Spec      14 (20) '2.0'\n-F5B72 Extract OS            00 (0) 'MS-DOS'\n-F5B73 General Purpose Flag  0800 (2048)\n+F67DC CENTRAL HEADER #326   02014B50 (33639248)\n+F67E0 Created Zip Spec      14 (20) '2.0'\n+F67E1 Created OS            03 (3) 'Unix'\n+F67E2 Extract Zip Spec      14 (20) '2.0'\n+F67E3 Extract OS            00 (0) 'MS-DOS'\n+F67E4 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-F5B75 Compression Method    0008 (8) 'Deflated'\n-F5B77 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F5B7B CRC                   FAE26E3E (4209143358)\n-F5B7F Compressed Size       000003B7 (951)\n-F5B83 Uncompressed Size     00000715 (1813)\n-F5B87 Filename Length       0077 (119)\n-F5B89 Extra Length          0000 (0)\n-F5B8B Comment Length        0000 (0)\n-F5B8D Disk Start            0000 (0)\n-F5B8F Int File Attributes   0000 (0)\n+F67E6 Compression Method    0008 (8) 'Deflated'\n+F67E8 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F67EC CRC                   FAE26E3E (4209143358)\n+F67F0 Compressed Size       000003B7 (951)\n+F67F4 Uncompressed Size     00000715 (1813)\n+F67F8 Filename Length       0077 (119)\n+F67FA Extra Length          0000 (0)\n+F67FC Comment Length        0000 (0)\n+F67FE Disk Start            0000 (0)\n+F6800 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F5B91 Ext File Attributes   81A40000 (2175008768)\n+F6802 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-F5B95 Local Header Offset   00015324 (86820)\n-F5B99 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F6806 Local Header Offset   00015AFB (88827)\n+F680A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF5B99: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF680A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-F5C10 CENTRAL HEADER #327   02014B50 (33639248)\n-F5C14 Created Zip Spec      14 (20) '2.0'\n-F5C15 Created OS            03 (3) 'Unix'\n-F5C16 Extract Zip Spec      14 (20) '2.0'\n-F5C17 Extract OS            00 (0) 'MS-DOS'\n-F5C18 General Purpose Flag  0800 (2048)\n+F6881 CENTRAL HEADER #327   02014B50 (33639248)\n+F6885 Created Zip Spec      14 (20) '2.0'\n+F6886 Created OS            03 (3) 'Unix'\n+F6887 Extract Zip Spec      14 (20) '2.0'\n+F6888 Extract OS            00 (0) 'MS-DOS'\n+F6889 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-F5C1A Compression Method    0008 (8) 'Deflated'\n-F5C1C Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F5C20 CRC                   FFF8AD9F (4294487455)\n-F5C24 Compressed Size       0000035A (858)\n-F5C28 Uncompressed Size     00000868 (2152)\n-F5C2C Filename Length       007A (122)\n-F5C2E Extra Length          0000 (0)\n-F5C30 Comment Length        0000 (0)\n-F5C32 Disk Start            0000 (0)\n-F5C34 Int File Attributes   0000 (0)\n+F688B Compression Method    0008 (8) 'Deflated'\n+F688D Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F6891 CRC                   FFF8AD9F (4294487455)\n+F6895 Compressed Size       0000035A (858)\n+F6899 Uncompressed Size     00000868 (2152)\n+F689D Filename Length       007A (122)\n+F689F Extra Length          0000 (0)\n+F68A1 Comment Length        0000 (0)\n+F68A3 Disk Start            0000 (0)\n+F68A5 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F5C36 Ext File Attributes   81A40000 (2175008768)\n+F68A7 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-F5C3A Local Header Offset   00015770 (87920)\n-F5C3E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F68AB Local Header Offset   00015F47 (89927)\n+F68AF Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF5C3E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF68AF: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-F5CB8 CENTRAL HEADER #328   02014B50 (33639248)\n-F5CBC Created Zip Spec      14 (20) '2.0'\n-F5CBD Created OS            03 (3) 'Unix'\n-F5CBE Extract Zip Spec      14 (20) '2.0'\n-F5CBF Extract OS            00 (0) 'MS-DOS'\n-F5CC0 General Purpose Flag  0800 (2048)\n+F6929 CENTRAL HEADER #328   02014B50 (33639248)\n+F692D Created Zip Spec      14 (20) '2.0'\n+F692E Created OS            03 (3) 'Unix'\n+F692F Extract Zip Spec      14 (20) '2.0'\n+F6930 Extract OS            00 (0) 'MS-DOS'\n+F6931 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-F5CC2 Compression Method    0008 (8) 'Deflated'\n-F5CC4 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F5CC8 CRC                   896578EC (2305128684)\n-F5CCC Compressed Size       00000746 (1862)\n-F5CD0 Uncompressed Size     00001327 (4903)\n-F5CD4 Filename Length       008E (142)\n-F5CD6 Extra Length          0000 (0)\n-F5CD8 Comment Length        0000 (0)\n-F5CDA Disk Start            0000 (0)\n-F5CDC Int File Attributes   0000 (0)\n+F6933 Compression Method    0008 (8) 'Deflated'\n+F6935 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F6939 CRC                   896578EC (2305128684)\n+F693D Compressed Size       00000746 (1862)\n+F6941 Uncompressed Size     00001327 (4903)\n+F6945 Filename Length       008E (142)\n+F6947 Extra Length          0000 (0)\n+F6949 Comment Length        0000 (0)\n+F694B Disk Start            0000 (0)\n+F694D Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F5CDE Ext File Attributes   81A40000 (2175008768)\n+F694F Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-F5CE2 Local Header Offset   00015B62 (88930)\n-F5CE6 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+F6953 Local Header Offset   00016339 (90937)\n+F6957 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             XXXXXXXXXX'\n #\n-# WARNING: Offset 0xF5CE6: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF6957: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-F5D74 CENTRAL HEADER #329   02014B50 (33639248)\n-F5D78 Created Zip Spec      14 (20) '2.0'\n-F5D79 Created OS            03 (3) 'Unix'\n-F5D7A Extract Zip Spec      14 (20) '2.0'\n-F5D7B Extract OS            00 (0) 'MS-DOS'\n-F5D7C General Purpose Flag  0800 (2048)\n+F69E5 CENTRAL HEADER #329   02014B50 (33639248)\n+F69E9 Created Zip Spec      14 (20) '2.0'\n+F69EA Created OS            03 (3) 'Unix'\n+F69EB Extract Zip Spec      14 (20) '2.0'\n+F69EC Extract OS            00 (0) 'MS-DOS'\n+F69ED General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-F5D7E Compression Method    0008 (8) 'Deflated'\n-F5D80 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F5D84 CRC                   64624734 (1684162356)\n-F5D88 Compressed Size       0000063D (1597)\n-F5D8C Uncompressed Size     00000D24 (3364)\n-F5D90 Filename Length       0095 (149)\n-F5D92 Extra Length          0000 (0)\n-F5D94 Comment Length        0000 (0)\n-F5D96 Disk Start            0000 (0)\n-F5D98 Int File Attributes   0000 (0)\n+F69EF Compression Method    0008 (8) 'Deflated'\n+F69F1 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F69F5 CRC                   64624734 (1684162356)\n+F69F9 Compressed Size       0000063D (1597)\n+F69FD Uncompressed Size     00000D24 (3364)\n+F6A01 Filename Length       0095 (149)\n+F6A03 Extra Length          0000 (0)\n+F6A05 Comment Length        0000 (0)\n+F6A07 Disk Start            0000 (0)\n+F6A09 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F5D9A Ext File Attributes   81A40000 (2175008768)\n+F6A0B Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-F5D9E Local Header Offset   00016354 (90964)\n-F5DA2 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+F6A0F Local Header Offset   00016B2B (92971)\n+F6A13 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             XXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF5DA2: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF6A13: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-F5E37 CENTRAL HEADER #330   02014B50 (33639248)\n-F5E3B Created Zip Spec      14 (20) '2.0'\n-F5E3C Created OS            03 (3) 'Unix'\n-F5E3D Extract Zip Spec      14 (20) '2.0'\n-F5E3E Extract OS            00 (0) 'MS-DOS'\n-F5E3F General Purpose Flag  0800 (2048)\n+F6AA8 CENTRAL HEADER #330   02014B50 (33639248)\n+F6AAC Created Zip Spec      14 (20) '2.0'\n+F6AAD Created OS            03 (3) 'Unix'\n+F6AAE Extract Zip Spec      14 (20) '2.0'\n+F6AAF Extract OS            00 (0) 'MS-DOS'\n+F6AB0 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-F5E41 Compression Method    0008 (8) 'Deflated'\n-F5E43 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F5E47 CRC                   2B6EF697 (728692375)\n-F5E4B Compressed Size       00000444 (1092)\n-F5E4F Uncompressed Size     000008CD (2253)\n-F5E53 Filename Length       0091 (145)\n-F5E55 Extra Length          0000 (0)\n-F5E57 Comment Length        0000 (0)\n-F5E59 Disk Start            0000 (0)\n-F5E5B Int File Attributes   0000 (0)\n+F6AB2 Compression Method    0008 (8) 'Deflated'\n+F6AB4 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F6AB8 CRC                   2B6EF697 (728692375)\n+F6ABC Compressed Size       00000444 (1092)\n+F6AC0 Uncompressed Size     000008CD (2253)\n+F6AC4 Filename Length       0091 (145)\n+F6AC6 Extra Length          0000 (0)\n+F6AC8 Comment Length        0000 (0)\n+F6ACA Disk Start            0000 (0)\n+F6ACC Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F5E5D Ext File Attributes   81A40000 (2175008768)\n+F6ACE Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-F5E61 Local Header Offset   00016A44 (92740)\n-F5E65 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+F6AD2 Local Header Offset   0001721B (94747)\n+F6AD6 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             XXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF5E65: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF6AD6: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-F5EF6 CENTRAL HEADER #331   02014B50 (33639248)\n-F5EFA Created Zip Spec      14 (20) '2.0'\n-F5EFB Created OS            03 (3) 'Unix'\n-F5EFC Extract Zip Spec      14 (20) '2.0'\n-F5EFD Extract OS            00 (0) 'MS-DOS'\n-F5EFE General Purpose Flag  0800 (2048)\n+F6B67 CENTRAL HEADER #331   02014B50 (33639248)\n+F6B6B Created Zip Spec      14 (20) '2.0'\n+F6B6C Created OS            03 (3) 'Unix'\n+F6B6D Extract Zip Spec      14 (20) '2.0'\n+F6B6E Extract OS            00 (0) 'MS-DOS'\n+F6B6F General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-F5F00 Compression Method    0008 (8) 'Deflated'\n-F5F02 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F5F06 CRC                   DBC79151 (3687289169)\n-F5F0A Compressed Size       00000874 (2164)\n-F5F0E Uncompressed Size     000013B1 (5041)\n-F5F12 Filename Length       008F (143)\n-F5F14 Extra Length          0000 (0)\n-F5F16 Comment Length        0000 (0)\n-F5F18 Disk Start            0000 (0)\n-F5F1A Int File Attributes   0000 (0)\n+F6B71 Compression Method    0008 (8) 'Deflated'\n+F6B73 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F6B77 CRC                   DBC79151 (3687289169)\n+F6B7B Compressed Size       00000874 (2164)\n+F6B7F Uncompressed Size     000013B1 (5041)\n+F6B83 Filename Length       008F (143)\n+F6B85 Extra Length          0000 (0)\n+F6B87 Comment Length        0000 (0)\n+F6B89 Disk Start            0000 (0)\n+F6B8B Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F5F1C Ext File Attributes   81A40000 (2175008768)\n+F6B8D Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-F5F20 Local Header Offset   00016F37 (94007)\n-F5F24 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+F6B91 Local Header Offset   0001770E (96014)\n+F6B95 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             XXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF5F24: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF6B95: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-F5FB3 CENTRAL HEADER #332   02014B50 (33639248)\n-F5FB7 Created Zip Spec      14 (20) '2.0'\n-F5FB8 Created OS            03 (3) 'Unix'\n-F5FB9 Extract Zip Spec      14 (20) '2.0'\n-F5FBA Extract OS            00 (0) 'MS-DOS'\n-F5FBB General Purpose Flag  0800 (2048)\n+F6C24 CENTRAL HEADER #332   02014B50 (33639248)\n+F6C28 Created Zip Spec      14 (20) '2.0'\n+F6C29 Created OS            03 (3) 'Unix'\n+F6C2A Extract Zip Spec      14 (20) '2.0'\n+F6C2B Extract OS            00 (0) 'MS-DOS'\n+F6C2C General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-F5FBD Compression Method    0008 (8) 'Deflated'\n-F5FBF Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F5FC3 CRC                   9AFFB21B (2600448539)\n-F5FC7 Compressed Size       0000033F (831)\n-F5FCB Uncompressed Size     0000064E (1614)\n-F5FCF Filename Length       0095 (149)\n-F5FD1 Extra Length          0000 (0)\n-F5FD3 Comment Length        0000 (0)\n-F5FD5 Disk Start            0000 (0)\n-F5FD7 Int File Attributes   0000 (0)\n+F6C2E Compression Method    0008 (8) 'Deflated'\n+F6C30 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F6C34 CRC                   9AFFB21B (2600448539)\n+F6C38 Compressed Size       0000033F (831)\n+F6C3C Uncompressed Size     0000064E (1614)\n+F6C40 Filename Length       0095 (149)\n+F6C42 Extra Length          0000 (0)\n+F6C44 Comment Length        0000 (0)\n+F6C46 Disk Start            0000 (0)\n+F6C48 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F5FD9 Ext File Attributes   81A40000 (2175008768)\n+F6C4A Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-F5FDD Local Header Offset   00017858 (96344)\n-F5FE1 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+F6C4E Local Header Offset   0001802F (98351)\n+F6C52 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             XXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF5FE1: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF6C52: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-F6076 CENTRAL HEADER #333   02014B50 (33639248)\n-F607A Created Zip Spec      14 (20) '2.0'\n-F607B Created OS            03 (3) 'Unix'\n-F607C Extract Zip Spec      14 (20) '2.0'\n-F607D Extract OS            00 (0) 'MS-DOS'\n-F607E General Purpose Flag  0800 (2048)\n+F6CE7 CENTRAL HEADER #333   02014B50 (33639248)\n+F6CEB Created Zip Spec      14 (20) '2.0'\n+F6CEC Created OS            03 (3) 'Unix'\n+F6CED Extract Zip Spec      14 (20) '2.0'\n+F6CEE Extract OS            00 (0) 'MS-DOS'\n+F6CEF General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-F6080 Compression Method    0008 (8) 'Deflated'\n-F6082 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F6086 CRC                   88CF36AA (2295281322)\n-F608A Compressed Size       000004BC (1212)\n-F608E Uncompressed Size     00000A4F (2639)\n-F6092 Filename Length       0091 (145)\n-F6094 Extra Length          0000 (0)\n-F6096 Comment Length        0000 (0)\n-F6098 Disk Start            0000 (0)\n-F609A Int File Attributes   0000 (0)\n+F6CF1 Compression Method    0008 (8) 'Deflated'\n+F6CF3 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F6CF7 CRC                   88CF36AA (2295281322)\n+F6CFB Compressed Size       000004BC (1212)\n+F6CFF Uncompressed Size     00000A4F (2639)\n+F6D03 Filename Length       0091 (145)\n+F6D05 Extra Length          0000 (0)\n+F6D07 Comment Length        0000 (0)\n+F6D09 Disk Start            0000 (0)\n+F6D0B Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F609C Ext File Attributes   81A40000 (2175008768)\n+F6D0D Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-F60A0 Local Header Offset   00017C4A (97354)\n-F60A4 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+F6D11 Local Header Offset   00018421 (99361)\n+F6D15 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             XXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF60A4: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF6D15: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-F6135 CENTRAL HEADER #334   02014B50 (33639248)\n-F6139 Created Zip Spec      14 (20) '2.0'\n-F613A Created OS            03 (3) 'Unix'\n-F613B Extract Zip Spec      14 (20) '2.0'\n-F613C Extract OS            00 (0) 'MS-DOS'\n-F613D General Purpose Flag  0800 (2048)\n+F6DA6 CENTRAL HEADER #334   02014B50 (33639248)\n+F6DAA Created Zip Spec      14 (20) '2.0'\n+F6DAB Created OS            03 (3) 'Unix'\n+F6DAC Extract Zip Spec      14 (20) '2.0'\n+F6DAD Extract OS            00 (0) 'MS-DOS'\n+F6DAE General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-F613F Compression Method    0008 (8) 'Deflated'\n-F6141 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F6145 CRC                   9593555C (2509460828)\n-F6149 Compressed Size       000005DA (1498)\n-F614D Uncompressed Size     00000D05 (3333)\n-F6151 Filename Length       009A (154)\n-F6153 Extra Length          0000 (0)\n-F6155 Comment Length        0000 (0)\n-F6157 Disk Start            0000 (0)\n-F6159 Int File Attributes   0000 (0)\n+F6DB0 Compression Method    0008 (8) 'Deflated'\n+F6DB2 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F6DB6 CRC                   9593555C (2509460828)\n+F6DBA Compressed Size       000005DA (1498)\n+F6DBE Uncompressed Size     00000D05 (3333)\n+F6DC2 Filename Length       009A (154)\n+F6DC4 Extra Length          0000 (0)\n+F6DC6 Comment Length        0000 (0)\n+F6DC8 Disk Start            0000 (0)\n+F6DCA Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F615B Ext File Attributes   81A40000 (2175008768)\n+F6DCC Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-F615F Local Header Offset   000181B5 (98741)\n-F6163 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+F6DD0 Local Header Offset   0001898C (100748)\n+F6DD4 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             XXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF6163: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF6DD4: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-F61FD CENTRAL HEADER #335   02014B50 (33639248)\n-F6201 Created Zip Spec      14 (20) '2.0'\n-F6202 Created OS            03 (3) 'Unix'\n-F6203 Extract Zip Spec      14 (20) '2.0'\n-F6204 Extract OS            00 (0) 'MS-DOS'\n-F6205 General Purpose Flag  0800 (2048)\n+F6E6E CENTRAL HEADER #335   02014B50 (33639248)\n+F6E72 Created Zip Spec      14 (20) '2.0'\n+F6E73 Created OS            03 (3) 'Unix'\n+F6E74 Extract Zip Spec      14 (20) '2.0'\n+F6E75 Extract OS            00 (0) 'MS-DOS'\n+F6E76 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-F6207 Compression Method    0008 (8) 'Deflated'\n-F6209 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F620D CRC                   9640338D (2520789901)\n-F6211 Compressed Size       00000785 (1925)\n-F6215 Uncompressed Size     000013DD (5085)\n-F6219 Filename Length       008F (143)\n-F621B Extra Length          0000 (0)\n-F621D Comment Length        0000 (0)\n-F621F Disk Start            0000 (0)\n-F6221 Int File Attributes   0000 (0)\n+F6E78 Compression Method    0008 (8) 'Deflated'\n+F6E7A Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F6E7E CRC                   9640338D (2520789901)\n+F6E82 Compressed Size       00000785 (1925)\n+F6E86 Uncompressed Size     000013DD (5085)\n+F6E8A Filename Length       008F (143)\n+F6E8C Extra Length          0000 (0)\n+F6E8E Comment Length        0000 (0)\n+F6E90 Disk Start            0000 (0)\n+F6E92 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F6223 Ext File Attributes   81A40000 (2175008768)\n+F6E94 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-F6227 Local Header Offset   00018847 (100423)\n-F622B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+F6E98 Local Header Offset   0001901E (102430)\n+F6E9C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             XXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF622B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF6E9C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-F62BA CENTRAL HEADER #336   02014B50 (33639248)\n-F62BE Created Zip Spec      14 (20) '2.0'\n-F62BF Created OS            03 (3) 'Unix'\n-F62C0 Extract Zip Spec      14 (20) '2.0'\n-F62C1 Extract OS            00 (0) 'MS-DOS'\n-F62C2 General Purpose Flag  0800 (2048)\n+F6F2B CENTRAL HEADER #336   02014B50 (33639248)\n+F6F2F Created Zip Spec      14 (20) '2.0'\n+F6F30 Created OS            03 (3) 'Unix'\n+F6F31 Extract Zip Spec      14 (20) '2.0'\n+F6F32 Extract OS            00 (0) 'MS-DOS'\n+F6F33 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-F62C4 Compression Method    0008 (8) 'Deflated'\n-F62C6 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F62CA CRC                   5232B519 (1379054873)\n-F62CE Compressed Size       000009AF (2479)\n-F62D2 Uncompressed Size     00001C1F (7199)\n-F62D6 Filename Length       0091 (145)\n-F62D8 Extra Length          0000 (0)\n-F62DA Comment Length        0000 (0)\n-F62DC Disk Start            0000 (0)\n-F62DE Int File Attributes   0000 (0)\n+F6F35 Compression Method    0008 (8) 'Deflated'\n+F6F37 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F6F3B CRC                   5232B519 (1379054873)\n+F6F3F Compressed Size       000009AF (2479)\n+F6F43 Uncompressed Size     00001C1F (7199)\n+F6F47 Filename Length       0091 (145)\n+F6F49 Extra Length          0000 (0)\n+F6F4B Comment Length        0000 (0)\n+F6F4D Disk Start            0000 (0)\n+F6F4F Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F62E0 Ext File Attributes   81A40000 (2175008768)\n+F6F51 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-F62E4 Local Header Offset   00019079 (102521)\n-F62E8 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+F6F55 Local Header Offset   00019850 (104528)\n+F6F59 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             XXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF62E8: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF6F59: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-F6379 CENTRAL HEADER #337   02014B50 (33639248)\n-F637D Created Zip Spec      14 (20) '2.0'\n-F637E Created OS            03 (3) 'Unix'\n-F637F Extract Zip Spec      14 (20) '2.0'\n-F6380 Extract OS            00 (0) 'MS-DOS'\n-F6381 General Purpose Flag  0800 (2048)\n+F6FEA CENTRAL HEADER #337   02014B50 (33639248)\n+F6FEE Created Zip Spec      14 (20) '2.0'\n+F6FEF Created OS            03 (3) 'Unix'\n+F6FF0 Extract Zip Spec      14 (20) '2.0'\n+F6FF1 Extract OS            00 (0) 'MS-DOS'\n+F6FF2 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-F6383 Compression Method    0008 (8) 'Deflated'\n-F6385 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F6389 CRC                   57267C45 (1462139973)\n-F638D Compressed Size       0000083D (2109)\n-F6391 Uncompressed Size     000013D6 (5078)\n-F6395 Filename Length       008E (142)\n-F6397 Extra Length          0000 (0)\n-F6399 Comment Length        0000 (0)\n-F639B Disk Start            0000 (0)\n-F639D Int File Attributes   0000 (0)\n+F6FF4 Compression Method    0008 (8) 'Deflated'\n+F6FF6 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F6FFA CRC                   57267C45 (1462139973)\n+F6FFE Compressed Size       0000083D (2109)\n+F7002 Uncompressed Size     000013D6 (5078)\n+F7006 Filename Length       008E (142)\n+F7008 Extra Length          0000 (0)\n+F700A Comment Length        0000 (0)\n+F700C Disk Start            0000 (0)\n+F700E Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F639F Ext File Attributes   81A40000 (2175008768)\n+F7010 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-F63A3 Local Header Offset   00019AD7 (105175)\n-F63A7 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+F7014 Local Header Offset   0001A2AE (107182)\n+F7018 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             XXXXXXXXXX'\n #\n-# WARNING: Offset 0xF63A7: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF7018: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-F6435 CENTRAL HEADER #338   02014B50 (33639248)\n-F6439 Created Zip Spec      14 (20) '2.0'\n-F643A Created OS            03 (3) 'Unix'\n-F643B Extract Zip Spec      14 (20) '2.0'\n-F643C Extract OS            00 (0) 'MS-DOS'\n-F643D General Purpose Flag  0800 (2048)\n+F70A6 CENTRAL HEADER #338   02014B50 (33639248)\n+F70AA Created Zip Spec      14 (20) '2.0'\n+F70AB Created OS            03 (3) 'Unix'\n+F70AC Extract Zip Spec      14 (20) '2.0'\n+F70AD Extract OS            00 (0) 'MS-DOS'\n+F70AE General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-F643F Compression Method    0008 (8) 'Deflated'\n-F6441 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F6445 CRC                   333FC2BB (859816635)\n-F6449 Compressed Size       00000395 (917)\n-F644D Uncompressed Size     00000736 (1846)\n-F6451 Filename Length       0095 (149)\n-F6453 Extra Length          0000 (0)\n-F6455 Comment Length        0000 (0)\n-F6457 Disk Start            0000 (0)\n-F6459 Int File Attributes   0000 (0)\n+F70B0 Compression Method    0008 (8) 'Deflated'\n+F70B2 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F70B6 CRC                   333FC2BB (859816635)\n+F70BA Compressed Size       00000395 (917)\n+F70BE Uncompressed Size     00000736 (1846)\n+F70C2 Filename Length       0095 (149)\n+F70C4 Extra Length          0000 (0)\n+F70C6 Comment Length        0000 (0)\n+F70C8 Disk Start            0000 (0)\n+F70CA Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F645B Ext File Attributes   81A40000 (2175008768)\n+F70CC Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-F645F Local Header Offset   0001A3C0 (107456)\n-F6463 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+F70D0 Local Header Offset   0001AB97 (109463)\n+F70D4 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             XXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF6463: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF70D4: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-F64F8 CENTRAL HEADER #339   02014B50 (33639248)\n-F64FC Created Zip Spec      14 (20) '2.0'\n-F64FD Created OS            03 (3) 'Unix'\n-F64FE Extract Zip Spec      14 (20) '2.0'\n-F64FF Extract OS            00 (0) 'MS-DOS'\n-F6500 General Purpose Flag  0800 (2048)\n+F7169 CENTRAL HEADER #339   02014B50 (33639248)\n+F716D Created Zip Spec      14 (20) '2.0'\n+F716E Created OS            03 (3) 'Unix'\n+F716F Extract Zip Spec      14 (20) '2.0'\n+F7170 Extract OS            00 (0) 'MS-DOS'\n+F7171 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-F6502 Compression Method    0008 (8) 'Deflated'\n-F6504 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F6508 CRC                   10CC5E74 (281828980)\n-F650C Compressed Size       000004BC (1212)\n-F6510 Uncompressed Size     000009CD (2509)\n-F6514 Filename Length       006E (110)\n-F6516 Extra Length          0000 (0)\n-F6518 Comment Length        0000 (0)\n-F651A Disk Start            0000 (0)\n-F651C Int File Attributes   0000 (0)\n+F7173 Compression Method    0008 (8) 'Deflated'\n+F7175 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F7179 CRC                   10CC5E74 (281828980)\n+F717D Compressed Size       000004BC (1212)\n+F7181 Uncompressed Size     000009CD (2509)\n+F7185 Filename Length       006E (110)\n+F7187 Extra Length          0000 (0)\n+F7189 Comment Length        0000 (0)\n+F718B Disk Start            0000 (0)\n+F718D Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F651E Ext File Attributes   81A40000 (2175008768)\n+F718F Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-F6522 Local Header Offset   0001A808 (108552)\n-F6526 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F7193 Local Header Offset   0001AFDF (110559)\n+F7197 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF6526: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF7197: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-F6594 CENTRAL HEADER #340   02014B50 (33639248)\n-F6598 Created Zip Spec      14 (20) '2.0'\n-F6599 Created OS            03 (3) 'Unix'\n-F659A Extract Zip Spec      14 (20) '2.0'\n-F659B Extract OS            00 (0) 'MS-DOS'\n-F659C General Purpose Flag  0800 (2048)\n+F7205 CENTRAL HEADER #340   02014B50 (33639248)\n+F7209 Created Zip Spec      14 (20) '2.0'\n+F720A Created OS            03 (3) 'Unix'\n+F720B Extract Zip Spec      14 (20) '2.0'\n+F720C Extract OS            00 (0) 'MS-DOS'\n+F720D General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-F659E Compression Method    0008 (8) 'Deflated'\n-F65A0 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F65A4 CRC                   5F6BF872 (1600911474)\n-F65A8 Compressed Size       000004BC (1212)\n-F65AC Uncompressed Size     000009A0 (2464)\n-F65B0 Filename Length       006E (110)\n-F65B2 Extra Length          0000 (0)\n-F65B4 Comment Length        0000 (0)\n-F65B6 Disk Start            0000 (0)\n-F65B8 Int File Attributes   0000 (0)\n+F720F Compression Method    0008 (8) 'Deflated'\n+F7211 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F7215 CRC                   5F6BF872 (1600911474)\n+F7219 Compressed Size       000004BC (1212)\n+F721D Uncompressed Size     000009A0 (2464)\n+F7221 Filename Length       006E (110)\n+F7223 Extra Length          0000 (0)\n+F7225 Comment Length        0000 (0)\n+F7227 Disk Start            0000 (0)\n+F7229 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F65BA Ext File Attributes   81A40000 (2175008768)\n+F722B Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-F65BE Local Header Offset   0001AD50 (109904)\n-F65C2 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F722F Local Header Offset   0001B527 (111911)\n+F7233 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF65C2: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF7233: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-F6630 CENTRAL HEADER #341   02014B50 (33639248)\n-F6634 Created Zip Spec      14 (20) '2.0'\n-F6635 Created OS            03 (3) 'Unix'\n-F6636 Extract Zip Spec      14 (20) '2.0'\n-F6637 Extract OS            00 (0) 'MS-DOS'\n-F6638 General Purpose Flag  0800 (2048)\n+F72A1 CENTRAL HEADER #341   02014B50 (33639248)\n+F72A5 Created Zip Spec      14 (20) '2.0'\n+F72A6 Created OS            03 (3) 'Unix'\n+F72A7 Extract Zip Spec      14 (20) '2.0'\n+F72A8 Extract OS            00 (0) 'MS-DOS'\n+F72A9 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-F663A Compression Method    0008 (8) 'Deflated'\n-F663C Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F6640 CRC                   456B0BC9 (1164643273)\n-F6644 Compressed Size       000005BD (1469)\n-F6648 Uncompressed Size     00001135 (4405)\n-F664C Filename Length       006A (106)\n-F664E Extra Length          0000 (0)\n-F6650 Comment Length        0000 (0)\n-F6652 Disk Start            0000 (0)\n-F6654 Int File Attributes   0000 (0)\n+F72AB Compression Method    0008 (8) 'Deflated'\n+F72AD Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F72B1 CRC                   456B0BC9 (1164643273)\n+F72B5 Compressed Size       000005BD (1469)\n+F72B9 Uncompressed Size     00001135 (4405)\n+F72BD Filename Length       006A (106)\n+F72BF Extra Length          0000 (0)\n+F72C1 Comment Length        0000 (0)\n+F72C3 Disk Start            0000 (0)\n+F72C5 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F6656 Ext File Attributes   81A40000 (2175008768)\n+F72C7 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-F665A Local Header Offset   0001B298 (111256)\n-F665E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F72CB Local Header Offset   0001BA6F (113263)\n+F72CF Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF665E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF72CF: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-F66C8 CENTRAL HEADER #342   02014B50 (33639248)\n-F66CC Created Zip Spec      14 (20) '2.0'\n-F66CD Created OS            03 (3) 'Unix'\n-F66CE Extract Zip Spec      14 (20) '2.0'\n-F66CF Extract OS            00 (0) 'MS-DOS'\n-F66D0 General Purpose Flag  0800 (2048)\n+F7339 CENTRAL HEADER #342   02014B50 (33639248)\n+F733D Created Zip Spec      14 (20) '2.0'\n+F733E Created OS            03 (3) 'Unix'\n+F733F Extract Zip Spec      14 (20) '2.0'\n+F7340 Extract OS            00 (0) 'MS-DOS'\n+F7341 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-F66D2 Compression Method    0008 (8) 'Deflated'\n-F66D4 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F66D8 CRC                   6A45582D (1782929453)\n-F66DC Compressed Size       000004E4 (1252)\n-F66E0 Uncompressed Size     000009E0 (2528)\n-F66E4 Filename Length       0073 (115)\n-F66E6 Extra Length          0000 (0)\n-F66E8 Comment Length        0000 (0)\n-F66EA Disk Start            0000 (0)\n-F66EC Int File Attributes   0000 (0)\n+F7343 Compression Method    0008 (8) 'Deflated'\n+F7345 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F7349 CRC                   6A45582D (1782929453)\n+F734D Compressed Size       000004E4 (1252)\n+F7351 Uncompressed Size     000009E0 (2528)\n+F7355 Filename Length       0073 (115)\n+F7357 Extra Length          0000 (0)\n+F7359 Comment Length        0000 (0)\n+F735B Disk Start            0000 (0)\n+F735D Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F66EE Ext File Attributes   81A40000 (2175008768)\n+F735F Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-F66F2 Local Header Offset   0001B8DD (112861)\n-F66F6 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F7363 Local Header Offset   0001C0B4 (114868)\n+F7367 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF66F6: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF7367: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-F6769 CENTRAL HEADER #343   02014B50 (33639248)\n-F676D Created Zip Spec      14 (20) '2.0'\n-F676E Created OS            03 (3) 'Unix'\n-F676F Extract Zip Spec      14 (20) '2.0'\n-F6770 Extract OS            00 (0) 'MS-DOS'\n-F6771 General Purpose Flag  0800 (2048)\n+F73DA CENTRAL HEADER #343   02014B50 (33639248)\n+F73DE Created Zip Spec      14 (20) '2.0'\n+F73DF Created OS            03 (3) 'Unix'\n+F73E0 Extract Zip Spec      14 (20) '2.0'\n+F73E1 Extract OS            00 (0) 'MS-DOS'\n+F73E2 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-F6773 Compression Method    0008 (8) 'Deflated'\n-F6775 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F6779 CRC                   4731534C (1194414924)\n-F677D Compressed Size       0000051E (1310)\n-F6781 Uncompressed Size     00000B90 (2960)\n-F6785 Filename Length       0075 (117)\n-F6787 Extra Length          0000 (0)\n-F6789 Comment Length        0000 (0)\n-F678B Disk Start            0000 (0)\n-F678D Int File Attributes   0000 (0)\n+F73E4 Compression Method    0008 (8) 'Deflated'\n+F73E6 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F73EA CRC                   4731534C (1194414924)\n+F73EE Compressed Size       0000051E (1310)\n+F73F2 Uncompressed Size     00000B90 (2960)\n+F73F6 Filename Length       0075 (117)\n+F73F8 Extra Length          0000 (0)\n+F73FA Comment Length        0000 (0)\n+F73FC Disk Start            0000 (0)\n+F73FE Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F678F Ext File Attributes   81A40000 (2175008768)\n+F7400 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-F6793 Local Header Offset   0001BE52 (114258)\n-F6797 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F7404 Local Header Offset   0001C629 (116265)\n+F7408 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF6797: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF7408: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-F680C CENTRAL HEADER #344   02014B50 (33639248)\n-F6810 Created Zip Spec      14 (20) '2.0'\n-F6811 Created OS            03 (3) 'Unix'\n-F6812 Extract Zip Spec      14 (20) '2.0'\n-F6813 Extract OS            00 (0) 'MS-DOS'\n-F6814 General Purpose Flag  0800 (2048)\n+F747D CENTRAL HEADER #344   02014B50 (33639248)\n+F7481 Created Zip Spec      14 (20) '2.0'\n+F7482 Created OS            03 (3) 'Unix'\n+F7483 Extract Zip Spec      14 (20) '2.0'\n+F7484 Extract OS            00 (0) 'MS-DOS'\n+F7485 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-F6816 Compression Method    0008 (8) 'Deflated'\n-F6818 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F681C CRC                   CEBA8B64 (3468331876)\n-F6820 Compressed Size       000004A0 (1184)\n-F6824 Uncompressed Size     00000A7D (2685)\n-F6828 Filename Length       0074 (116)\n-F682A Extra Length          0000 (0)\n-F682C Comment Length        0000 (0)\n-F682E Disk Start            0000 (0)\n-F6830 Int File Attributes   0000 (0)\n+F7487 Compression Method    0008 (8) 'Deflated'\n+F7489 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F748D CRC                   CEBA8B64 (3468331876)\n+F7491 Compressed Size       000004A0 (1184)\n+F7495 Uncompressed Size     00000A7D (2685)\n+F7499 Filename Length       0074 (116)\n+F749B Extra Length          0000 (0)\n+F749D Comment Length        0000 (0)\n+F749F Disk Start            0000 (0)\n+F74A1 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F6832 Ext File Attributes   81A40000 (2175008768)\n+F74A3 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-F6836 Local Header Offset   0001C403 (115715)\n-F683A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F74A7 Local Header Offset   0001CBDA (117722)\n+F74AB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF683A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF74AB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-F68AE CENTRAL HEADER #345   02014B50 (33639248)\n-F68B2 Created Zip Spec      14 (20) '2.0'\n-F68B3 Created OS            03 (3) 'Unix'\n-F68B4 Extract Zip Spec      14 (20) '2.0'\n-F68B5 Extract OS            00 (0) 'MS-DOS'\n-F68B6 General Purpose Flag  0800 (2048)\n+F751F CENTRAL HEADER #345   02014B50 (33639248)\n+F7523 Created Zip Spec      14 (20) '2.0'\n+F7524 Created OS            03 (3) 'Unix'\n+F7525 Extract Zip Spec      14 (20) '2.0'\n+F7526 Extract OS            00 (0) 'MS-DOS'\n+F7527 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-F68B8 Compression Method    0008 (8) 'Deflated'\n-F68BA Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F68BE CRC                   0DACEA84 (229436036)\n-F68C2 Compressed Size       000004B1 (1201)\n-F68C6 Uncompressed Size     00000A95 (2709)\n-F68CA Filename Length       0073 (115)\n-F68CC Extra Length          0000 (0)\n-F68CE Comment Length        0000 (0)\n-F68D0 Disk Start            0000 (0)\n-F68D2 Int File Attributes   0000 (0)\n+F7529 Compression Method    0008 (8) 'Deflated'\n+F752B Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F752F CRC                   0DACEA84 (229436036)\n+F7533 Compressed Size       000004B1 (1201)\n+F7537 Uncompressed Size     00000A95 (2709)\n+F753B Filename Length       0073 (115)\n+F753D Extra Length          0000 (0)\n+F753F Comment Length        0000 (0)\n+F7541 Disk Start            0000 (0)\n+F7543 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F68D4 Ext File Attributes   81A40000 (2175008768)\n+F7545 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-F68D8 Local Header Offset   0001C935 (117045)\n-F68DC Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F7549 Local Header Offset   0001D10C (119052)\n+F754D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF68DC: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF754D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-F694F CENTRAL HEADER #346   02014B50 (33639248)\n-F6953 Created Zip Spec      14 (20) '2.0'\n-F6954 Created OS            03 (3) 'Unix'\n-F6955 Extract Zip Spec      14 (20) '2.0'\n-F6956 Extract OS            00 (0) 'MS-DOS'\n-F6957 General Purpose Flag  0800 (2048)\n+F75C0 CENTRAL HEADER #346   02014B50 (33639248)\n+F75C4 Created Zip Spec      14 (20) '2.0'\n+F75C5 Created OS            03 (3) 'Unix'\n+F75C6 Extract Zip Spec      14 (20) '2.0'\n+F75C7 Extract OS            00 (0) 'MS-DOS'\n+F75C8 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-F6959 Compression Method    0008 (8) 'Deflated'\n-F695B Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F695F CRC                   2E84B239 (780448313)\n-F6963 Compressed Size       000006DB (1755)\n-F6967 Uncompressed Size     0000121D (4637)\n-F696B Filename Length       0074 (116)\n-F696D Extra Length          0000 (0)\n-F696F Comment Length        0000 (0)\n-F6971 Disk Start            0000 (0)\n-F6973 Int File Attributes   0000 (0)\n+F75CA Compression Method    0008 (8) 'Deflated'\n+F75CC Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F75D0 CRC                   2E84B239 (780448313)\n+F75D4 Compressed Size       000006DB (1755)\n+F75D8 Uncompressed Size     0000121D (4637)\n+F75DC Filename Length       0074 (116)\n+F75DE Extra Length          0000 (0)\n+F75E0 Comment Length        0000 (0)\n+F75E2 Disk Start            0000 (0)\n+F75E4 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F6975 Ext File Attributes   81A40000 (2175008768)\n+F75E6 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-F6979 Local Header Offset   0001CE77 (118391)\n-F697D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F75EA Local Header Offset   0001D64E (120398)\n+F75EE Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF697D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF75EE: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-F69F1 CENTRAL HEADER #347   02014B50 (33639248)\n-F69F5 Created Zip Spec      14 (20) '2.0'\n-F69F6 Created OS            03 (3) 'Unix'\n-F69F7 Extract Zip Spec      14 (20) '2.0'\n-F69F8 Extract OS            00 (0) 'MS-DOS'\n-F69F9 General Purpose Flag  0800 (2048)\n+F7662 CENTRAL HEADER #347   02014B50 (33639248)\n+F7666 Created Zip Spec      14 (20) '2.0'\n+F7667 Created OS            03 (3) 'Unix'\n+F7668 Extract Zip Spec      14 (20) '2.0'\n+F7669 Extract OS            00 (0) 'MS-DOS'\n+F766A General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-F69FB Compression Method    0008 (8) 'Deflated'\n-F69FD Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F6A01 CRC                   10E7267F (283584127)\n-F6A05 Compressed Size       000003B1 (945)\n-F6A09 Uncompressed Size     000006FB (1787)\n-F6A0D Filename Length       008E (142)\n-F6A0F Extra Length          0000 (0)\n-F6A11 Comment Length        0000 (0)\n-F6A13 Disk Start            0000 (0)\n-F6A15 Int File Attributes   0000 (0)\n+F766C Compression Method    0008 (8) 'Deflated'\n+F766E Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F7672 CRC                   10E7267F (283584127)\n+F7676 Compressed Size       000003B1 (945)\n+F767A Uncompressed Size     000006FB (1787)\n+F767E Filename Length       008E (142)\n+F7680 Extra Length          0000 (0)\n+F7682 Comment Length        0000 (0)\n+F7684 Disk Start            0000 (0)\n+F7686 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F6A17 Ext File Attributes   81A40000 (2175008768)\n+F7688 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-F6A1B Local Header Offset   0001D5E4 (120292)\n-F6A1F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+F768C Local Header Offset   0001DDBB (122299)\n+F7690 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             XXXXXXXXXX'\n #\n-# WARNING: Offset 0xF6A1F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF7690: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-F6AAD CENTRAL HEADER #348   02014B50 (33639248)\n-F6AB1 Created Zip Spec      14 (20) '2.0'\n-F6AB2 Created OS            03 (3) 'Unix'\n-F6AB3 Extract Zip Spec      14 (20) '2.0'\n-F6AB4 Extract OS            00 (0) 'MS-DOS'\n-F6AB5 General Purpose Flag  0800 (2048)\n+F771E CENTRAL HEADER #348   02014B50 (33639248)\n+F7722 Created Zip Spec      14 (20) '2.0'\n+F7723 Created OS            03 (3) 'Unix'\n+F7724 Extract Zip Spec      14 (20) '2.0'\n+F7725 Extract OS            00 (0) 'MS-DOS'\n+F7726 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-F6AB7 Compression Method    0008 (8) 'Deflated'\n-F6AB9 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F6ABD CRC                   24E47A3B (618953275)\n-F6AC1 Compressed Size       000003B4 (948)\n-F6AC5 Uncompressed Size     000006FF (1791)\n-F6AC9 Filename Length       008F (143)\n-F6ACB Extra Length          0000 (0)\n-F6ACD Comment Length        0000 (0)\n-F6ACF Disk Start            0000 (0)\n-F6AD1 Int File Attributes   0000 (0)\n+F7728 Compression Method    0008 (8) 'Deflated'\n+F772A Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F772E CRC                   24E47A3B (618953275)\n+F7732 Compressed Size       000003B4 (948)\n+F7736 Uncompressed Size     000006FF (1791)\n+F773A Filename Length       008F (143)\n+F773C Extra Length          0000 (0)\n+F773E Comment Length        0000 (0)\n+F7740 Disk Start            0000 (0)\n+F7742 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F6AD3 Ext File Attributes   81A40000 (2175008768)\n+F7744 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-F6AD7 Local Header Offset   0001DA41 (121409)\n-F6ADB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+F7748 Local Header Offset   0001E218 (123416)\n+F774C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             XXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF6ADB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF774C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-F6B6A CENTRAL HEADER #349   02014B50 (33639248)\n-F6B6E Created Zip Spec      14 (20) '2.0'\n-F6B6F Created OS            03 (3) 'Unix'\n-F6B70 Extract Zip Spec      14 (20) '2.0'\n-F6B71 Extract OS            00 (0) 'MS-DOS'\n-F6B72 General Purpose Flag  0800 (2048)\n+F77DB CENTRAL HEADER #349   02014B50 (33639248)\n+F77DF Created Zip Spec      14 (20) '2.0'\n+F77E0 Created OS            03 (3) 'Unix'\n+F77E1 Extract Zip Spec      14 (20) '2.0'\n+F77E2 Extract OS            00 (0) 'MS-DOS'\n+F77E3 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-F6B74 Compression Method    0008 (8) 'Deflated'\n-F6B76 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F6B7A CRC                   042BB565 (69973349)\n-F6B7E Compressed Size       000007C6 (1990)\n-F6B82 Uncompressed Size     00001364 (4964)\n-F6B86 Filename Length       008A (138)\n-F6B88 Extra Length          0000 (0)\n-F6B8A Comment Length        0000 (0)\n-F6B8C Disk Start            0000 (0)\n-F6B8E Int File Attributes   0000 (0)\n+F77E5 Compression Method    0008 (8) 'Deflated'\n+F77E7 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F77EB CRC                   042BB565 (69973349)\n+F77EF Compressed Size       000007C6 (1990)\n+F77F3 Uncompressed Size     00001364 (4964)\n+F77F7 Filename Length       008A (138)\n+F77F9 Extra Length          0000 (0)\n+F77FB Comment Length        0000 (0)\n+F77FD Disk Start            0000 (0)\n+F77FF Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F6B90 Ext File Attributes   81A40000 (2175008768)\n+F7801 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-F6B94 Local Header Offset   0001DEA2 (122530)\n-F6B98 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+F7805 Local Header Offset   0001E679 (124537)\n+F7809 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             XXXXXX'\n #\n-# WARNING: Offset 0xF6B98: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF7809: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-F6C22 CENTRAL HEADER #350   02014B50 (33639248)\n-F6C26 Created Zip Spec      14 (20) '2.0'\n-F6C27 Created OS            03 (3) 'Unix'\n-F6C28 Extract Zip Spec      14 (20) '2.0'\n-F6C29 Extract OS            00 (0) 'MS-DOS'\n-F6C2A General Purpose Flag  0800 (2048)\n+F7893 CENTRAL HEADER #350   02014B50 (33639248)\n+F7897 Created Zip Spec      14 (20) '2.0'\n+F7898 Created OS            03 (3) 'Unix'\n+F7899 Extract Zip Spec      14 (20) '2.0'\n+F789A Extract OS            00 (0) 'MS-DOS'\n+F789B General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-F6C2C Compression Method    0008 (8) 'Deflated'\n-F6C2E Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F6C32 CRC                   7A63232B (2053317419)\n-F6C36 Compressed Size       0000084C (2124)\n-F6C3A Uncompressed Size     000013C0 (5056)\n-F6C3E Filename Length       008B (139)\n-F6C40 Extra Length          0000 (0)\n-F6C42 Comment Length        0000 (0)\n-F6C44 Disk Start            0000 (0)\n-F6C46 Int File Attributes   0000 (0)\n+F789D Compression Method    0008 (8) 'Deflated'\n+F789F Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F78A3 CRC                   7A63232B (2053317419)\n+F78A7 Compressed Size       0000084C (2124)\n+F78AB Uncompressed Size     000013C0 (5056)\n+F78AF Filename Length       008B (139)\n+F78B1 Extra Length          0000 (0)\n+F78B3 Comment Length        0000 (0)\n+F78B5 Disk Start            0000 (0)\n+F78B7 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F6C48 Ext File Attributes   81A40000 (2175008768)\n+F78B9 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-F6C4C Local Header Offset   0001E710 (124688)\n-F6C50 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+F78BD Local Header Offset   0001EEE7 (126695)\n+F78C1 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             XXXXXXX'\n #\n-# WARNING: Offset 0xF6C50: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF78C1: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-F6CDB CENTRAL HEADER #351   02014B50 (33639248)\n-F6CDF Created Zip Spec      14 (20) '2.0'\n-F6CE0 Created OS            03 (3) 'Unix'\n-F6CE1 Extract Zip Spec      14 (20) '2.0'\n-F6CE2 Extract OS            00 (0) 'MS-DOS'\n-F6CE3 General Purpose Flag  0800 (2048)\n+F794C CENTRAL HEADER #351   02014B50 (33639248)\n+F7950 Created Zip Spec      14 (20) '2.0'\n+F7951 Created OS            03 (3) 'Unix'\n+F7952 Extract Zip Spec      14 (20) '2.0'\n+F7953 Extract OS            00 (0) 'MS-DOS'\n+F7954 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-F6CE5 Compression Method    0008 (8) 'Deflated'\n-F6CE7 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F6CEB CRC                   19888393 (428376979)\n-F6CEF Compressed Size       000004B8 (1208)\n-F6CF3 Uncompressed Size     0000092E (2350)\n-F6CF7 Filename Length       0074 (116)\n-F6CF9 Extra Length          0000 (0)\n-F6CFB Comment Length        0000 (0)\n-F6CFD Disk Start            0000 (0)\n-F6CFF Int File Attributes   0000 (0)\n+F7956 Compression Method    0008 (8) 'Deflated'\n+F7958 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F795C CRC                   19888393 (428376979)\n+F7960 Compressed Size       000004B8 (1208)\n+F7964 Uncompressed Size     0000092E (2350)\n+F7968 Filename Length       0074 (116)\n+F796A Extra Length          0000 (0)\n+F796C Comment Length        0000 (0)\n+F796E Disk Start            0000 (0)\n+F7970 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F6D01 Ext File Attributes   81A40000 (2175008768)\n+F7972 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-F6D05 Local Header Offset   0001F005 (126981)\n-F6D09 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F7976 Local Header Offset   0001F7DC (128988)\n+F797A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF6D09: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF797A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-F6D7D CENTRAL HEADER #352   02014B50 (33639248)\n-F6D81 Created Zip Spec      14 (20) '2.0'\n-F6D82 Created OS            03 (3) 'Unix'\n-F6D83 Extract Zip Spec      14 (20) '2.0'\n-F6D84 Extract OS            00 (0) 'MS-DOS'\n-F6D85 General Purpose Flag  0800 (2048)\n+F79EE CENTRAL HEADER #352   02014B50 (33639248)\n+F79F2 Created Zip Spec      14 (20) '2.0'\n+F79F3 Created OS            03 (3) 'Unix'\n+F79F4 Extract Zip Spec      14 (20) '2.0'\n+F79F5 Extract OS            00 (0) 'MS-DOS'\n+F79F6 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-F6D87 Compression Method    0008 (8) 'Deflated'\n-F6D89 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F6D8D CRC                   8B1E3BB7 (2334014391)\n-F6D91 Compressed Size       00000B79 (2937)\n-F6D95 Uncompressed Size     00002091 (8337)\n-F6D99 Filename Length       007A (122)\n-F6D9B Extra Length          0000 (0)\n-F6D9D Comment Length        0000 (0)\n-F6D9F Disk Start            0000 (0)\n-F6DA1 Int File Attributes   0000 (0)\n+F79F8 Compression Method    0008 (8) 'Deflated'\n+F79FA Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F79FE CRC                   8B1E3BB7 (2334014391)\n+F7A02 Compressed Size       00000B79 (2937)\n+F7A06 Uncompressed Size     00002091 (8337)\n+F7A0A Filename Length       007A (122)\n+F7A0C Extra Length          0000 (0)\n+F7A0E Comment Length        0000 (0)\n+F7A10 Disk Start            0000 (0)\n+F7A12 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F6DA3 Ext File Attributes   81A40000 (2175008768)\n+F7A14 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-F6DA7 Local Header Offset   0001F54F (128335)\n-F6DAB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F7A18 Local Header Offset   0001FD26 (130342)\n+F7A1C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF6DAB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF7A1C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-F6E25 CENTRAL HEADER #353   02014B50 (33639248)\n-F6E29 Created Zip Spec      14 (20) '2.0'\n-F6E2A Created OS            03 (3) 'Unix'\n-F6E2B Extract Zip Spec      14 (20) '2.0'\n-F6E2C Extract OS            00 (0) 'MS-DOS'\n-F6E2D General Purpose Flag  0800 (2048)\n+F7A96 CENTRAL HEADER #353   02014B50 (33639248)\n+F7A9A Created Zip Spec      14 (20) '2.0'\n+F7A9B Created OS            03 (3) 'Unix'\n+F7A9C Extract Zip Spec      14 (20) '2.0'\n+F7A9D Extract OS            00 (0) 'MS-DOS'\n+F7A9E General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-F6E2F Compression Method    0008 (8) 'Deflated'\n-F6E31 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F6E35 CRC                   EAE74E6F (3941027439)\n-F6E39 Compressed Size       0000075E (1886)\n-F6E3D Uncompressed Size     00001481 (5249)\n-F6E41 Filename Length       007D (125)\n-F6E43 Extra Length          0000 (0)\n-F6E45 Comment Length        0000 (0)\n-F6E47 Disk Start            0000 (0)\n-F6E49 Int File Attributes   0000 (0)\n+F7AA0 Compression Method    0008 (8) 'Deflated'\n+F7AA2 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F7AA6 CRC                   EAE74E6F (3941027439)\n+F7AAA Compressed Size       0000075E (1886)\n+F7AAE Uncompressed Size     00001481 (5249)\n+F7AB2 Filename Length       007D (125)\n+F7AB4 Extra Length          0000 (0)\n+F7AB6 Comment Length        0000 (0)\n+F7AB8 Disk Start            0000 (0)\n+F7ABA Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F6E4B Ext File Attributes   81A40000 (2175008768)\n+F7ABC Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-F6E4F Local Header Offset   00020160 (131424)\n-F6E53 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F7AC0 Local Header Offset   00020937 (133431)\n+F7AC4 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF6E53: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF7AC4: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-F6ED0 CENTRAL HEADER #354   02014B50 (33639248)\n-F6ED4 Created Zip Spec      14 (20) '2.0'\n-F6ED5 Created OS            03 (3) 'Unix'\n-F6ED6 Extract Zip Spec      14 (20) '2.0'\n-F6ED7 Extract OS            00 (0) 'MS-DOS'\n-F6ED8 General Purpose Flag  0800 (2048)\n+F7B41 CENTRAL HEADER #354   02014B50 (33639248)\n+F7B45 Created Zip Spec      14 (20) '2.0'\n+F7B46 Created OS            03 (3) 'Unix'\n+F7B47 Extract Zip Spec      14 (20) '2.0'\n+F7B48 Extract OS            00 (0) 'MS-DOS'\n+F7B49 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-F6EDA Compression Method    0008 (8) 'Deflated'\n-F6EDC Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F6EE0 CRC                   49F8AFD7 (1241034711)\n-F6EE4 Compressed Size       00000A90 (2704)\n-F6EE8 Uncompressed Size     000025C9 (9673)\n-F6EEC Filename Length       006D (109)\n-F6EEE Extra Length          0000 (0)\n-F6EF0 Comment Length        0000 (0)\n-F6EF2 Disk Start            0000 (0)\n-F6EF4 Int File Attributes   0000 (0)\n+F7B4B Compression Method    0008 (8) 'Deflated'\n+F7B4D Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F7B51 CRC                   49F8AFD7 (1241034711)\n+F7B55 Compressed Size       00000A90 (2704)\n+F7B59 Uncompressed Size     000025C9 (9673)\n+F7B5D Filename Length       006D (109)\n+F7B5F Extra Length          0000 (0)\n+F7B61 Comment Length        0000 (0)\n+F7B63 Disk Start            0000 (0)\n+F7B65 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F6EF6 Ext File Attributes   81A40000 (2175008768)\n+F7B67 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-F6EFA Local Header Offset   00020959 (133465)\n-F6EFE Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F7B6B Local Header Offset   00021130 (135472)\n+F7B6F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF6EFE: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF7B6F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-F6F6B CENTRAL HEADER #355   02014B50 (33639248)\n-F6F6F Created Zip Spec      14 (20) '2.0'\n-F6F70 Created OS            03 (3) 'Unix'\n-F6F71 Extract Zip Spec      14 (20) '2.0'\n-F6F72 Extract OS            00 (0) 'MS-DOS'\n-F6F73 General Purpose Flag  0800 (2048)\n+F7BDC CENTRAL HEADER #355   02014B50 (33639248)\n+F7BE0 Created Zip Spec      14 (20) '2.0'\n+F7BE1 Created OS            03 (3) 'Unix'\n+F7BE2 Extract Zip Spec      14 (20) '2.0'\n+F7BE3 Extract OS            00 (0) 'MS-DOS'\n+F7BE4 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-F6F75 Compression Method    0008 (8) 'Deflated'\n-F6F77 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F6F7B CRC                   332580F8 (858095864)\n-F6F7F Compressed Size       000004E7 (1255)\n-F6F83 Uncompressed Size     00000E10 (3600)\n-F6F87 Filename Length       006C (108)\n-F6F89 Extra Length          0000 (0)\n-F6F8B Comment Length        0000 (0)\n-F6F8D Disk Start            0000 (0)\n-F6F8F Int File Attributes   0000 (0)\n+F7BE6 Compression Method    0008 (8) 'Deflated'\n+F7BE8 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F7BEC CRC                   332580F8 (858095864)\n+F7BF0 Compressed Size       000004E7 (1255)\n+F7BF4 Uncompressed Size     00000E10 (3600)\n+F7BF8 Filename Length       006C (108)\n+F7BFA Extra Length          0000 (0)\n+F7BFC Comment Length        0000 (0)\n+F7BFE Disk Start            0000 (0)\n+F7C00 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F6F91 Ext File Attributes   81A40000 (2175008768)\n+F7C02 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-F6F95 Local Header Offset   00021474 (136308)\n-F6F99 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F7C06 Local Header Offset   00021C4B (138315)\n+F7C0A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF6F99: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF7C0A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-F7005 CENTRAL HEADER #356   02014B50 (33639248)\n-F7009 Created Zip Spec      14 (20) '2.0'\n-F700A Created OS            03 (3) 'Unix'\n-F700B Extract Zip Spec      14 (20) '2.0'\n-F700C Extract OS            00 (0) 'MS-DOS'\n-F700D General Purpose Flag  0800 (2048)\n+F7C76 CENTRAL HEADER #356   02014B50 (33639248)\n+F7C7A Created Zip Spec      14 (20) '2.0'\n+F7C7B Created OS            03 (3) 'Unix'\n+F7C7C Extract Zip Spec      14 (20) '2.0'\n+F7C7D Extract OS            00 (0) 'MS-DOS'\n+F7C7E General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-F700F Compression Method    0008 (8) 'Deflated'\n-F7011 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F7015 CRC                   0D142FFC (219426812)\n-F7019 Compressed Size       000009EA (2538)\n-F701D Uncompressed Size     00001A7B (6779)\n-F7021 Filename Length       008F (143)\n-F7023 Extra Length          0000 (0)\n-F7025 Comment Length        0000 (0)\n-F7027 Disk Start            0000 (0)\n-F7029 Int File Attributes   0000 (0)\n+F7C80 Compression Method    0008 (8) 'Deflated'\n+F7C82 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F7C86 CRC                   0D142FFC (219426812)\n+F7C8A Compressed Size       000009EA (2538)\n+F7C8E Uncompressed Size     00001A7B (6779)\n+F7C92 Filename Length       008F (143)\n+F7C94 Extra Length          0000 (0)\n+F7C96 Comment Length        0000 (0)\n+F7C98 Disk Start            0000 (0)\n+F7C9A Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F702B Ext File Attributes   81A40000 (2175008768)\n+F7C9C Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-F702F Local Header Offset   000219E5 (137701)\n-F7033 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+F7CA0 Local Header Offset   000221BC (139708)\n+F7CA4 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             XXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF7033: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF7CA4: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-F70C2 CENTRAL HEADER #357   02014B50 (33639248)\n-F70C6 Created Zip Spec      14 (20) '2.0'\n-F70C7 Created OS            03 (3) 'Unix'\n-F70C8 Extract Zip Spec      14 (20) '2.0'\n-F70C9 Extract OS            00 (0) 'MS-DOS'\n-F70CA General Purpose Flag  0800 (2048)\n+F7D33 CENTRAL HEADER #357   02014B50 (33639248)\n+F7D37 Created Zip Spec      14 (20) '2.0'\n+F7D38 Created OS            03 (3) 'Unix'\n+F7D39 Extract Zip Spec      14 (20) '2.0'\n+F7D3A Extract OS            00 (0) 'MS-DOS'\n+F7D3B General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-F70CC Compression Method    0008 (8) 'Deflated'\n-F70CE Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F70D2 CRC                   726CFBF2 (1919745010)\n-F70D6 Compressed Size       00000434 (1076)\n-F70DA Uncompressed Size     00000886 (2182)\n-F70DE Filename Length       0095 (149)\n-F70E0 Extra Length          0000 (0)\n-F70E2 Comment Length        0000 (0)\n-F70E4 Disk Start            0000 (0)\n-F70E6 Int File Attributes   0000 (0)\n+F7D3D Compression Method    0008 (8) 'Deflated'\n+F7D3F Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F7D43 CRC                   726CFBF2 (1919745010)\n+F7D47 Compressed Size       00000434 (1076)\n+F7D4B Uncompressed Size     00000886 (2182)\n+F7D4F Filename Length       0095 (149)\n+F7D51 Extra Length          0000 (0)\n+F7D53 Comment Length        0000 (0)\n+F7D55 Disk Start            0000 (0)\n+F7D57 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F70E8 Ext File Attributes   81A40000 (2175008768)\n+F7D59 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-F70EC Local Header Offset   0002247C (140412)\n-F70F0 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+F7D5D Local Header Offset   00022C53 (142419)\n+F7D61 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             XXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF70F0: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF7D61: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-F7185 CENTRAL HEADER #358   02014B50 (33639248)\n-F7189 Created Zip Spec      14 (20) '2.0'\n-F718A Created OS            03 (3) 'Unix'\n-F718B Extract Zip Spec      14 (20) '2.0'\n-F718C Extract OS            00 (0) 'MS-DOS'\n-F718D General Purpose Flag  0800 (2048)\n+F7DF6 CENTRAL HEADER #358   02014B50 (33639248)\n+F7DFA Created Zip Spec      14 (20) '2.0'\n+F7DFB Created OS            03 (3) 'Unix'\n+F7DFC Extract Zip Spec      14 (20) '2.0'\n+F7DFD Extract OS            00 (0) 'MS-DOS'\n+F7DFE General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-F718F Compression Method    0008 (8) 'Deflated'\n-F7191 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F7195 CRC                   0124A640 (19179072)\n-F7199 Compressed Size       0000070A (1802)\n-F719D Uncompressed Size     00001071 (4209)\n-F71A1 Filename Length       009C (156)\n-F71A3 Extra Length          0000 (0)\n-F71A5 Comment Length        0000 (0)\n-F71A7 Disk Start            0000 (0)\n-F71A9 Int File Attributes   0000 (0)\n+F7E00 Compression Method    0008 (8) 'Deflated'\n+F7E02 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F7E06 CRC                   0124A640 (19179072)\n+F7E0A Compressed Size       0000070A (1802)\n+F7E0E Uncompressed Size     00001071 (4209)\n+F7E12 Filename Length       009C (156)\n+F7E14 Extra Length          0000 (0)\n+F7E16 Comment Length        0000 (0)\n+F7E18 Disk Start            0000 (0)\n+F7E1A Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F71AB Ext File Attributes   81A40000 (2175008768)\n+F7E1C Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-F71AF Local Header Offset   00022963 (141667)\n-F71B3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+F7E20 Local Header Offset   0002313A (143674)\n+F7E24 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             XXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF71B3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF7E24: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-F724F CENTRAL HEADER #359   02014B50 (33639248)\n-F7253 Created Zip Spec      14 (20) '2.0'\n-F7254 Created OS            03 (3) 'Unix'\n-F7255 Extract Zip Spec      14 (20) '2.0'\n-F7256 Extract OS            00 (0) 'MS-DOS'\n-F7257 General Purpose Flag  0800 (2048)\n+F7EC0 CENTRAL HEADER #359   02014B50 (33639248)\n+F7EC4 Created Zip Spec      14 (20) '2.0'\n+F7EC5 Created OS            03 (3) 'Unix'\n+F7EC6 Extract Zip Spec      14 (20) '2.0'\n+F7EC7 Extract OS            00 (0) 'MS-DOS'\n+F7EC8 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-F7259 Compression Method    0008 (8) 'Deflated'\n-F725B Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F725F CRC                   7E793C9C (2121874588)\n-F7263 Compressed Size       00000459 (1113)\n-F7267 Uncompressed Size     000008CC (2252)\n-F726B Filename Length       009C (156)\n-F726D Extra Length          0000 (0)\n-F726F Comment Length        0000 (0)\n-F7271 Disk Start            0000 (0)\n-F7273 Int File Attributes   0000 (0)\n+F7ECA Compression Method    0008 (8) 'Deflated'\n+F7ECC Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F7ED0 CRC                   7E793C9C (2121874588)\n+F7ED4 Compressed Size       00000459 (1113)\n+F7ED8 Uncompressed Size     000008CC (2252)\n+F7EDC Filename Length       009C (156)\n+F7EDE Extra Length          0000 (0)\n+F7EE0 Comment Length        0000 (0)\n+F7EE2 Disk Start            0000 (0)\n+F7EE4 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F7275 Ext File Attributes   81A40000 (2175008768)\n+F7EE6 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-F7279 Local Header Offset   00023127 (143655)\n-F727D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+F7EEA Local Header Offset   000238FE (145662)\n+F7EEE Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             XXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF727D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF7EEE: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-F7319 CENTRAL HEADER #360   02014B50 (33639248)\n-F731D Created Zip Spec      14 (20) '2.0'\n-F731E Created OS            03 (3) 'Unix'\n-F731F Extract Zip Spec      14 (20) '2.0'\n-F7320 Extract OS            00 (0) 'MS-DOS'\n-F7321 General Purpose Flag  0800 (2048)\n+F7F8A CENTRAL HEADER #360   02014B50 (33639248)\n+F7F8E Created Zip Spec      14 (20) '2.0'\n+F7F8F Created OS            03 (3) 'Unix'\n+F7F90 Extract Zip Spec      14 (20) '2.0'\n+F7F91 Extract OS            00 (0) 'MS-DOS'\n+F7F92 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-F7323 Compression Method    0008 (8) 'Deflated'\n-F7325 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F7329 CRC                   A8584B88 (2824358792)\n-F732D Compressed Size       000003BB (955)\n-F7331 Uncompressed Size     0000070D (1805)\n-F7335 Filename Length       0068 (104)\n-F7337 Extra Length          0000 (0)\n-F7339 Comment Length        0000 (0)\n-F733B Disk Start            0000 (0)\n-F733D Int File Attributes   0000 (0)\n+F7F94 Compression Method    0008 (8) 'Deflated'\n+F7F96 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F7F9A CRC                   A8584B88 (2824358792)\n+F7F9E Compressed Size       000003BB (955)\n+F7FA2 Uncompressed Size     0000070D (1805)\n+F7FA6 Filename Length       0068 (104)\n+F7FA8 Extra Length          0000 (0)\n+F7FAA Comment Length        0000 (0)\n+F7FAC Disk Start            0000 (0)\n+F7FAE Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F733F Ext File Attributes   81A40000 (2175008768)\n+F7FB0 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-F7343 Local Header Offset   0002363A (144954)\n-F7347 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F7FB4 Local Header Offset   00023E11 (146961)\n+F7FB8 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF7347: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF7FB8: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-F73AF CENTRAL HEADER #361   02014B50 (33639248)\n-F73B3 Created Zip Spec      14 (20) '2.0'\n-F73B4 Created OS            03 (3) 'Unix'\n-F73B5 Extract Zip Spec      14 (20) '2.0'\n-F73B6 Extract OS            00 (0) 'MS-DOS'\n-F73B7 General Purpose Flag  0800 (2048)\n+F8020 CENTRAL HEADER #361   02014B50 (33639248)\n+F8024 Created Zip Spec      14 (20) '2.0'\n+F8025 Created OS            03 (3) 'Unix'\n+F8026 Extract Zip Spec      14 (20) '2.0'\n+F8027 Extract OS            00 (0) 'MS-DOS'\n+F8028 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-F73B9 Compression Method    0008 (8) 'Deflated'\n-F73BB Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F73BF CRC                   A8336B4A (2821942090)\n-F73C3 Compressed Size       000003BA (954)\n-F73C7 Uncompressed Size     00000760 (1888)\n-F73CB Filename Length       0064 (100)\n-F73CD Extra Length          0000 (0)\n-F73CF Comment Length        0000 (0)\n-F73D1 Disk Start            0000 (0)\n-F73D3 Int File Attributes   0000 (0)\n+F802A Compression Method    0008 (8) 'Deflated'\n+F802C Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F8030 CRC                   A8336B4A (2821942090)\n+F8034 Compressed Size       000003BA (954)\n+F8038 Uncompressed Size     00000760 (1888)\n+F803C Filename Length       0064 (100)\n+F803E Extra Length          0000 (0)\n+F8040 Comment Length        0000 (0)\n+F8042 Disk Start            0000 (0)\n+F8044 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F73D5 Ext File Attributes   81A40000 (2175008768)\n+F8046 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-F73D9 Local Header Offset   00023A7B (146043)\n-F73DD Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F804A Local Header Offset   00024252 (148050)\n+F804E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF73DD: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF804E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-F7441 CENTRAL HEADER #362   02014B50 (33639248)\n-F7445 Created Zip Spec      14 (20) '2.0'\n-F7446 Created OS            03 (3) 'Unix'\n-F7447 Extract Zip Spec      14 (20) '2.0'\n-F7448 Extract OS            00 (0) 'MS-DOS'\n-F7449 General Purpose Flag  0800 (2048)\n+F80B2 CENTRAL HEADER #362   02014B50 (33639248)\n+F80B6 Created Zip Spec      14 (20) '2.0'\n+F80B7 Created OS            03 (3) 'Unix'\n+F80B8 Extract Zip Spec      14 (20) '2.0'\n+F80B9 Extract OS            00 (0) 'MS-DOS'\n+F80BA General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-F744B Compression Method    0008 (8) 'Deflated'\n-F744D Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F7451 CRC                   7559BE1A (1968815642)\n-F7455 Compressed Size       000003BA (954)\n-F7459 Uncompressed Size     00000764 (1892)\n-F745D Filename Length       0064 (100)\n-F745F Extra Length          0000 (0)\n-F7461 Comment Length        0000 (0)\n-F7463 Disk Start            0000 (0)\n-F7465 Int File Attributes   0000 (0)\n+F80BC Compression Method    0008 (8) 'Deflated'\n+F80BE Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F80C2 CRC                   7559BE1A (1968815642)\n+F80C6 Compressed Size       000003BA (954)\n+F80CA Uncompressed Size     00000764 (1892)\n+F80CE Filename Length       0064 (100)\n+F80D0 Extra Length          0000 (0)\n+F80D2 Comment Length        0000 (0)\n+F80D4 Disk Start            0000 (0)\n+F80D6 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F7467 Ext File Attributes   81A40000 (2175008768)\n+F80D8 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-F746B Local Header Offset   00023EB7 (147127)\n-F746F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F80DC Local Header Offset   0002468E (149134)\n+F80E0 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF746F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF80E0: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-F74D3 CENTRAL HEADER #363   02014B50 (33639248)\n-F74D7 Created Zip Spec      14 (20) '2.0'\n-F74D8 Created OS            03 (3) 'Unix'\n-F74D9 Extract Zip Spec      14 (20) '2.0'\n-F74DA Extract OS            00 (0) 'MS-DOS'\n-F74DB General Purpose Flag  0800 (2048)\n+F8144 CENTRAL HEADER #363   02014B50 (33639248)\n+F8148 Created Zip Spec      14 (20) '2.0'\n+F8149 Created OS            03 (3) 'Unix'\n+F814A Extract Zip Spec      14 (20) '2.0'\n+F814B Extract OS            00 (0) 'MS-DOS'\n+F814C General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-F74DD Compression Method    0008 (8) 'Deflated'\n-F74DF Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F74E3 CRC                   F2039839 (4060321849)\n-F74E7 Compressed Size       000005D5 (1493)\n-F74EB Uncompressed Size     00000F35 (3893)\n-F74EF Filename Length       0066 (102)\n-F74F1 Extra Length          0000 (0)\n-F74F3 Comment Length        0000 (0)\n-F74F5 Disk Start            0000 (0)\n-F74F7 Int File Attributes   0000 (0)\n+F814E Compression Method    0008 (8) 'Deflated'\n+F8150 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F8154 CRC                   F2039839 (4060321849)\n+F8158 Compressed Size       000005D5 (1493)\n+F815C Uncompressed Size     00000F35 (3893)\n+F8160 Filename Length       0066 (102)\n+F8162 Extra Length          0000 (0)\n+F8164 Comment Length        0000 (0)\n+F8166 Disk Start            0000 (0)\n+F8168 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F74F9 Ext File Attributes   81A40000 (2175008768)\n+F816A Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-F74FD Local Header Offset   000242F3 (148211)\n-F7501 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F816E Local Header Offset   00024ACA (150218)\n+F8172 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF7501: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF8172: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-F7567 CENTRAL HEADER #364   02014B50 (33639248)\n-F756B Created Zip Spec      14 (20) '2.0'\n-F756C Created OS            03 (3) 'Unix'\n-F756D Extract Zip Spec      14 (20) '2.0'\n-F756E Extract OS            00 (0) 'MS-DOS'\n-F756F General Purpose Flag  0800 (2048)\n+F81D8 CENTRAL HEADER #364   02014B50 (33639248)\n+F81DC Created Zip Spec      14 (20) '2.0'\n+F81DD Created OS            03 (3) 'Unix'\n+F81DE Extract Zip Spec      14 (20) '2.0'\n+F81DF Extract OS            00 (0) 'MS-DOS'\n+F81E0 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-F7571 Compression Method    0008 (8) 'Deflated'\n-F7573 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F7577 CRC                   4C048087 (1275363463)\n-F757B Compressed Size       00000445 (1093)\n-F757F Uncompressed Size     00000861 (2145)\n-F7583 Filename Length       0071 (113)\n-F7585 Extra Length          0000 (0)\n-F7587 Comment Length        0000 (0)\n-F7589 Disk Start            0000 (0)\n-F758B Int File Attributes   0000 (0)\n+F81E2 Compression Method    0008 (8) 'Deflated'\n+F81E4 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F81E8 CRC                   4C048087 (1275363463)\n+F81EC Compressed Size       00000445 (1093)\n+F81F0 Uncompressed Size     00000861 (2145)\n+F81F4 Filename Length       0071 (113)\n+F81F6 Extra Length          0000 (0)\n+F81F8 Comment Length        0000 (0)\n+F81FA Disk Start            0000 (0)\n+F81FC Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F758D Ext File Attributes   81A40000 (2175008768)\n+F81FE Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-F7591 Local Header Offset   0002494C (149836)\n-F7595 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F8202 Local Header Offset   00025123 (151843)\n+F8206 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF7595: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF8206: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-F7606 CENTRAL HEADER #365   02014B50 (33639248)\n-F760A Created Zip Spec      14 (20) '2.0'\n-F760B Created OS            03 (3) 'Unix'\n-F760C Extract Zip Spec      14 (20) '2.0'\n-F760D Extract OS            00 (0) 'MS-DOS'\n-F760E General Purpose Flag  0800 (2048)\n+F8277 CENTRAL HEADER #365   02014B50 (33639248)\n+F827B Created Zip Spec      14 (20) '2.0'\n+F827C Created OS            03 (3) 'Unix'\n+F827D Extract Zip Spec      14 (20) '2.0'\n+F827E Extract OS            00 (0) 'MS-DOS'\n+F827F General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-F7610 Compression Method    0008 (8) 'Deflated'\n-F7612 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F7616 CRC                   877B2EE8 (2272997096)\n-F761A Compressed Size       00000AAF (2735)\n-F761E Uncompressed Size     0000215E (8542)\n-F7622 Filename Length       007E (126)\n-F7624 Extra Length          0000 (0)\n-F7626 Comment Length        0000 (0)\n-F7628 Disk Start            0000 (0)\n-F762A Int File Attributes   0000 (0)\n+F8281 Compression Method    0008 (8) 'Deflated'\n+F8283 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F8287 CRC                   877B2EE8 (2272997096)\n+F828B Compressed Size       00000AAF (2735)\n+F828F Uncompressed Size     0000215E (8542)\n+F8293 Filename Length       007E (126)\n+F8295 Extra Length          0000 (0)\n+F8297 Comment Length        0000 (0)\n+F8299 Disk Start            0000 (0)\n+F829B Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F762C Ext File Attributes   81A40000 (2175008768)\n+F829D Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-F7630 Local Header Offset   00024E20 (151072)\n-F7634 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F82A1 Local Header Offset   000255F7 (153079)\n+F82A5 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF7634: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF82A5: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-F76B2 CENTRAL HEADER #366   02014B50 (33639248)\n-F76B6 Created Zip Spec      14 (20) '2.0'\n-F76B7 Created OS            03 (3) 'Unix'\n-F76B8 Extract Zip Spec      14 (20) '2.0'\n-F76B9 Extract OS            00 (0) 'MS-DOS'\n-F76BA General Purpose Flag  0800 (2048)\n+F8323 CENTRAL HEADER #366   02014B50 (33639248)\n+F8327 Created Zip Spec      14 (20) '2.0'\n+F8328 Created OS            03 (3) 'Unix'\n+F8329 Extract Zip Spec      14 (20) '2.0'\n+F832A Extract OS            00 (0) 'MS-DOS'\n+F832B General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-F76BC Compression Method    0008 (8) 'Deflated'\n-F76BE Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F76C2 CRC                   E43D22D5 (3829211861)\n-F76C6 Compressed Size       00000806 (2054)\n-F76CA Uncompressed Size     0000147F (5247)\n-F76CE Filename Length       0082 (130)\n-F76D0 Extra Length          0000 (0)\n-F76D2 Comment Length        0000 (0)\n-F76D4 Disk Start            0000 (0)\n-F76D6 Int File Attributes   0000 (0)\n+F832D Compression Method    0008 (8) 'Deflated'\n+F832F Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F8333 CRC                   E43D22D5 (3829211861)\n+F8337 Compressed Size       00000806 (2054)\n+F833B Uncompressed Size     0000147F (5247)\n+F833F Filename Length       0082 (130)\n+F8341 Extra Length          0000 (0)\n+F8343 Comment Length        0000 (0)\n+F8345 Disk Start            0000 (0)\n+F8347 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F76D8 Ext File Attributes   81A40000 (2175008768)\n+F8349 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-F76DC Local Header Offset   0002596B (153963)\n-F76E0 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F834D Local Header Offset   00026142 (155970)\n+F8351 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF76E0: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF8351: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-F7762 CENTRAL HEADER #367   02014B50 (33639248)\n-F7766 Created Zip Spec      14 (20) '2.0'\n-F7767 Created OS            03 (3) 'Unix'\n-F7768 Extract Zip Spec      14 (20) '2.0'\n-F7769 Extract OS            00 (0) 'MS-DOS'\n-F776A General Purpose Flag  0800 (2048)\n+F83D3 CENTRAL HEADER #367   02014B50 (33639248)\n+F83D7 Created Zip Spec      14 (20) '2.0'\n+F83D8 Created OS            03 (3) 'Unix'\n+F83D9 Extract Zip Spec      14 (20) '2.0'\n+F83DA Extract OS            00 (0) 'MS-DOS'\n+F83DB General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-F776C Compression Method    0008 (8) 'Deflated'\n-F776E Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F7772 CRC                   D765846F (3613754479)\n-F7776 Compressed Size       0000069E (1694)\n-F777A Uncompressed Size     00001060 (4192)\n-F777E Filename Length       0074 (116)\n-F7780 Extra Length          0000 (0)\n-F7782 Comment Length        0000 (0)\n-F7784 Disk Start            0000 (0)\n-F7786 Int File Attributes   0000 (0)\n+F83DD Compression Method    0008 (8) 'Deflated'\n+F83DF Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F83E3 CRC                   D765846F (3613754479)\n+F83E7 Compressed Size       0000069E (1694)\n+F83EB Uncompressed Size     00001060 (4192)\n+F83EF Filename Length       0074 (116)\n+F83F1 Extra Length          0000 (0)\n+F83F3 Comment Length        0000 (0)\n+F83F5 Disk Start            0000 (0)\n+F83F7 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F7788 Ext File Attributes   81A40000 (2175008768)\n+F83F9 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-F778C Local Header Offset   00026211 (156177)\n-F7790 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F83FD Local Header Offset   000269E8 (158184)\n+F8401 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF7790: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF8401: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-F7804 CENTRAL HEADER #368   02014B50 (33639248)\n-F7808 Created Zip Spec      14 (20) '2.0'\n-F7809 Created OS            03 (3) 'Unix'\n-F780A Extract Zip Spec      14 (20) '2.0'\n-F780B Extract OS            00 (0) 'MS-DOS'\n-F780C General Purpose Flag  0800 (2048)\n+F8475 CENTRAL HEADER #368   02014B50 (33639248)\n+F8479 Created Zip Spec      14 (20) '2.0'\n+F847A Created OS            03 (3) 'Unix'\n+F847B Extract Zip Spec      14 (20) '2.0'\n+F847C Extract OS            00 (0) 'MS-DOS'\n+F847D General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-F780E Compression Method    0008 (8) 'Deflated'\n-F7810 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F7814 CRC                   57E394F3 (1474532595)\n-F7818 Compressed Size       000006F4 (1780)\n-F781C Uncompressed Size     0000115C (4444)\n-F7820 Filename Length       0074 (116)\n-F7822 Extra Length          0000 (0)\n-F7824 Comment Length        0000 (0)\n-F7826 Disk Start            0000 (0)\n-F7828 Int File Attributes   0000 (0)\n+F847F Compression Method    0008 (8) 'Deflated'\n+F8481 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F8485 CRC                   57E394F3 (1474532595)\n+F8489 Compressed Size       000006F4 (1780)\n+F848D Uncompressed Size     0000115C (4444)\n+F8491 Filename Length       0074 (116)\n+F8493 Extra Length          0000 (0)\n+F8495 Comment Length        0000 (0)\n+F8497 Disk Start            0000 (0)\n+F8499 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F782A Ext File Attributes   81A40000 (2175008768)\n+F849B Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-F782E Local Header Offset   00026941 (158017)\n-F7832 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F849F Local Header Offset   00027118 (160024)\n+F84A3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF7832: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF84A3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-F78A6 CENTRAL HEADER #369   02014B50 (33639248)\n-F78AA Created Zip Spec      14 (20) '2.0'\n-F78AB Created OS            03 (3) 'Unix'\n-F78AC Extract Zip Spec      14 (20) '2.0'\n-F78AD Extract OS            00 (0) 'MS-DOS'\n-F78AE General Purpose Flag  0800 (2048)\n+F8517 CENTRAL HEADER #369   02014B50 (33639248)\n+F851B Created Zip Spec      14 (20) '2.0'\n+F851C Created OS            03 (3) 'Unix'\n+F851D Extract Zip Spec      14 (20) '2.0'\n+F851E Extract OS            00 (0) 'MS-DOS'\n+F851F General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-F78B0 Compression Method    0008 (8) 'Deflated'\n-F78B2 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F78B6 CRC                   4293EC30 (1116990512)\n-F78BA Compressed Size       00000889 (2185)\n-F78BE Uncompressed Size     00001A2C (6700)\n-F78C2 Filename Length       0084 (132)\n-F78C4 Extra Length          0000 (0)\n-F78C6 Comment Length        0000 (0)\n-F78C8 Disk Start            0000 (0)\n-F78CA Int File Attributes   0000 (0)\n+F8521 Compression Method    0008 (8) 'Deflated'\n+F8523 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F8527 CRC                   4293EC30 (1116990512)\n+F852B Compressed Size       00000889 (2185)\n+F852F Uncompressed Size     00001A2C (6700)\n+F8533 Filename Length       0084 (132)\n+F8535 Extra Length          0000 (0)\n+F8537 Comment Length        0000 (0)\n+F8539 Disk Start            0000 (0)\n+F853B Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F78CC Ext File Attributes   81A40000 (2175008768)\n+F853D Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-F78D0 Local Header Offset   000270C7 (159943)\n-F78D4 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+F8541 Local Header Offset   0002789E (161950)\n+F8545 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             '\n #\n-# WARNING: Offset 0xF78D4: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF8545: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-F7958 CENTRAL HEADER #370   02014B50 (33639248)\n-F795C Created Zip Spec      14 (20) '2.0'\n-F795D Created OS            03 (3) 'Unix'\n-F795E Extract Zip Spec      14 (20) '2.0'\n-F795F Extract OS            00 (0) 'MS-DOS'\n-F7960 General Purpose Flag  0800 (2048)\n+F85C9 CENTRAL HEADER #370   02014B50 (33639248)\n+F85CD Created Zip Spec      14 (20) '2.0'\n+F85CE Created OS            03 (3) 'Unix'\n+F85CF Extract Zip Spec      14 (20) '2.0'\n+F85D0 Extract OS            00 (0) 'MS-DOS'\n+F85D1 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-F7962 Compression Method    0008 (8) 'Deflated'\n-F7964 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F7968 CRC                   83659368 (2204472168)\n-F796C Compressed Size       0000086F (2159)\n-F7970 Uncompressed Size     000019EF (6639)\n-F7974 Filename Length       007E (126)\n-F7976 Extra Length          0000 (0)\n-F7978 Comment Length        0000 (0)\n-F797A Disk Start            0000 (0)\n-F797C Int File Attributes   0000 (0)\n+F85D3 Compression Method    0008 (8) 'Deflated'\n+F85D5 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F85D9 CRC                   83659368 (2204472168)\n+F85DD Compressed Size       0000086F (2159)\n+F85E1 Uncompressed Size     000019EF (6639)\n+F85E5 Filename Length       007E (126)\n+F85E7 Extra Length          0000 (0)\n+F85E9 Comment Length        0000 (0)\n+F85EB Disk Start            0000 (0)\n+F85ED Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F797E Ext File Attributes   81A40000 (2175008768)\n+F85EF Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-F7982 Local Header Offset   000279F2 (162290)\n-F7986 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F85F3 Local Header Offset   000281C9 (164297)\n+F85F7 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF7986: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF85F7: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-F7A04 CENTRAL HEADER #371   02014B50 (33639248)\n-F7A08 Created Zip Spec      14 (20) '2.0'\n-F7A09 Created OS            03 (3) 'Unix'\n-F7A0A Extract Zip Spec      14 (20) '2.0'\n-F7A0B Extract OS            00 (0) 'MS-DOS'\n-F7A0C General Purpose Flag  0800 (2048)\n+F8675 CENTRAL HEADER #371   02014B50 (33639248)\n+F8679 Created Zip Spec      14 (20) '2.0'\n+F867A Created OS            03 (3) 'Unix'\n+F867B Extract Zip Spec      14 (20) '2.0'\n+F867C Extract OS            00 (0) 'MS-DOS'\n+F867D General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-F7A0E Compression Method    0008 (8) 'Deflated'\n-F7A10 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F7A14 CRC                   73F3DBE5 (1945361381)\n-F7A18 Compressed Size       000008C4 (2244)\n-F7A1C Uncompressed Size     00001AFA (6906)\n-F7A20 Filename Length       0084 (132)\n-F7A22 Extra Length          0000 (0)\n-F7A24 Comment Length        0000 (0)\n-F7A26 Disk Start            0000 (0)\n-F7A28 Int File Attributes   0000 (0)\n+F867F Compression Method    0008 (8) 'Deflated'\n+F8681 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F8685 CRC                   73F3DBE5 (1945361381)\n+F8689 Compressed Size       000008C4 (2244)\n+F868D Uncompressed Size     00001AFA (6906)\n+F8691 Filename Length       0084 (132)\n+F8693 Extra Length          0000 (0)\n+F8695 Comment Length        0000 (0)\n+F8697 Disk Start            0000 (0)\n+F8699 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F7A2A Ext File Attributes   81A40000 (2175008768)\n+F869B Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-F7A2E Local Header Offset   000282FD (164605)\n-F7A32 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+F869F Local Header Offset   00028AD4 (166612)\n+F86A3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             '\n #\n-# WARNING: Offset 0xF7A32: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF86A3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-F7AB6 CENTRAL HEADER #372   02014B50 (33639248)\n-F7ABA Created Zip Spec      14 (20) '2.0'\n-F7ABB Created OS            03 (3) 'Unix'\n-F7ABC Extract Zip Spec      14 (20) '2.0'\n-F7ABD Extract OS            00 (0) 'MS-DOS'\n-F7ABE General Purpose Flag  0800 (2048)\n+F8727 CENTRAL HEADER #372   02014B50 (33639248)\n+F872B Created Zip Spec      14 (20) '2.0'\n+F872C Created OS            03 (3) 'Unix'\n+F872D Extract Zip Spec      14 (20) '2.0'\n+F872E Extract OS            00 (0) 'MS-DOS'\n+F872F General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-F7AC0 Compression Method    0008 (8) 'Deflated'\n-F7AC2 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F7AC6 CRC                   847E83D6 (2222883798)\n-F7ACA Compressed Size       000009FD (2557)\n-F7ACE Uncompressed Size     00001E83 (7811)\n-F7AD2 Filename Length       007E (126)\n-F7AD4 Extra Length          0000 (0)\n-F7AD6 Comment Length        0000 (0)\n-F7AD8 Disk Start            0000 (0)\n-F7ADA Int File Attributes   0000 (0)\n+F8731 Compression Method    0008 (8) 'Deflated'\n+F8733 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F8737 CRC                   847E83D6 (2222883798)\n+F873B Compressed Size       000009FD (2557)\n+F873F Uncompressed Size     00001E83 (7811)\n+F8743 Filename Length       007E (126)\n+F8745 Extra Length          0000 (0)\n+F8747 Comment Length        0000 (0)\n+F8749 Disk Start            0000 (0)\n+F874B Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F7ADC Ext File Attributes   81A40000 (2175008768)\n+F874D Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-F7AE0 Local Header Offset   00028C63 (167011)\n-F7AE4 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F8751 Local Header Offset   0002943A (169018)\n+F8755 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF7AE4: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF8755: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-F7B62 CENTRAL HEADER #373   02014B50 (33639248)\n-F7B66 Created Zip Spec      14 (20) '2.0'\n-F7B67 Created OS            03 (3) 'Unix'\n-F7B68 Extract Zip Spec      14 (20) '2.0'\n-F7B69 Extract OS            00 (0) 'MS-DOS'\n-F7B6A General Purpose Flag  0800 (2048)\n+F87D3 CENTRAL HEADER #373   02014B50 (33639248)\n+F87D7 Created Zip Spec      14 (20) '2.0'\n+F87D8 Created OS            03 (3) 'Unix'\n+F87D9 Extract Zip Spec      14 (20) '2.0'\n+F87DA Extract OS            00 (0) 'MS-DOS'\n+F87DB General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-F7B6C Compression Method    0008 (8) 'Deflated'\n-F7B6E Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F7B72 CRC                   8DCDE743 (2379081539)\n-F7B76 Compressed Size       000010D1 (4305)\n-F7B7A Uncompressed Size     00003DFB (15867)\n-F7B7E Filename Length       0084 (132)\n-F7B80 Extra Length          0000 (0)\n-F7B82 Comment Length        0000 (0)\n-F7B84 Disk Start            0000 (0)\n-F7B86 Int File Attributes   0000 (0)\n+F87DD Compression Method    0008 (8) 'Deflated'\n+F87DF Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F87E3 CRC                   8DCDE743 (2379081539)\n+F87E7 Compressed Size       000010D1 (4305)\n+F87EB Uncompressed Size     00003DFB (15867)\n+F87EF Filename Length       0084 (132)\n+F87F1 Extra Length          0000 (0)\n+F87F3 Comment Length        0000 (0)\n+F87F5 Disk Start            0000 (0)\n+F87F7 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F7B88 Ext File Attributes   81A40000 (2175008768)\n+F87F9 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-F7B8C Local Header Offset   000296FC (169724)\n-F7B90 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+F87FD Local Header Offset   00029ED3 (171731)\n+F8801 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             '\n #\n-# WARNING: Offset 0xF7B90: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF8801: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-F7C14 CENTRAL HEADER #374   02014B50 (33639248)\n-F7C18 Created Zip Spec      14 (20) '2.0'\n-F7C19 Created OS            03 (3) 'Unix'\n-F7C1A Extract Zip Spec      14 (20) '2.0'\n-F7C1B Extract OS            00 (0) 'MS-DOS'\n-F7C1C General Purpose Flag  0800 (2048)\n+F8885 CENTRAL HEADER #374   02014B50 (33639248)\n+F8889 Created Zip Spec      14 (20) '2.0'\n+F888A Created OS            03 (3) 'Unix'\n+F888B Extract Zip Spec      14 (20) '2.0'\n+F888C Extract OS            00 (0) 'MS-DOS'\n+F888D General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-F7C1E Compression Method    0008 (8) 'Deflated'\n-F7C20 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F7C24 CRC                   46F84C94 (1190677652)\n-F7C28 Compressed Size       000010B3 (4275)\n-F7C2C Uncompressed Size     00003DB7 (15799)\n-F7C30 Filename Length       007E (126)\n-F7C32 Extra Length          0000 (0)\n-F7C34 Comment Length        0000 (0)\n-F7C36 Disk Start            0000 (0)\n-F7C38 Int File Attributes   0000 (0)\n+F888F Compression Method    0008 (8) 'Deflated'\n+F8891 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F8895 CRC                   46F84C94 (1190677652)\n+F8899 Compressed Size       000010B3 (4275)\n+F889D Uncompressed Size     00003DB7 (15799)\n+F88A1 Filename Length       007E (126)\n+F88A3 Extra Length          0000 (0)\n+F88A5 Comment Length        0000 (0)\n+F88A7 Disk Start            0000 (0)\n+F88A9 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F7C3A Ext File Attributes   81A40000 (2175008768)\n+F88AB Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-F7C3E Local Header Offset   0002A86F (174191)\n-F7C42 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F88AF Local Header Offset   0002B046 (176198)\n+F88B3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF7C42: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF88B3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-F7CC0 CENTRAL HEADER #375   02014B50 (33639248)\n-F7CC4 Created Zip Spec      14 (20) '2.0'\n-F7CC5 Created OS            03 (3) 'Unix'\n-F7CC6 Extract Zip Spec      14 (20) '2.0'\n-F7CC7 Extract OS            00 (0) 'MS-DOS'\n-F7CC8 General Purpose Flag  0800 (2048)\n+F8931 CENTRAL HEADER #375   02014B50 (33639248)\n+F8935 Created Zip Spec      14 (20) '2.0'\n+F8936 Created OS            03 (3) 'Unix'\n+F8937 Extract Zip Spec      14 (20) '2.0'\n+F8938 Extract OS            00 (0) 'MS-DOS'\n+F8939 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-F7CCA Compression Method    0008 (8) 'Deflated'\n-F7CCC Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F7CD0 CRC                   96FAF425 (2533028901)\n-F7CD4 Compressed Size       00000AE7 (2791)\n-F7CD8 Uncompressed Size     000028CF (10447)\n-F7CDC Filename Length       0084 (132)\n-F7CDE Extra Length          0000 (0)\n-F7CE0 Comment Length        0000 (0)\n-F7CE2 Disk Start            0000 (0)\n-F7CE4 Int File Attributes   0000 (0)\n+F893B Compression Method    0008 (8) 'Deflated'\n+F893D Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F8941 CRC                   96FAF425 (2533028901)\n+F8945 Compressed Size       00000AE7 (2791)\n+F8949 Uncompressed Size     000028CF (10447)\n+F894D Filename Length       0084 (132)\n+F894F Extra Length          0000 (0)\n+F8951 Comment Length        0000 (0)\n+F8953 Disk Start            0000 (0)\n+F8955 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F7CE6 Ext File Attributes   81A40000 (2175008768)\n+F8957 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-F7CEA Local Header Offset   0002B9BE (178622)\n-F7CEE Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+F895B Local Header Offset   0002C195 (180629)\n+F895F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             '\n #\n-# WARNING: Offset 0xF7CEE: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF895F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-F7D72 CENTRAL HEADER #376   02014B50 (33639248)\n-F7D76 Created Zip Spec      14 (20) '2.0'\n-F7D77 Created OS            03 (3) 'Unix'\n-F7D78 Extract Zip Spec      14 (20) '2.0'\n-F7D79 Extract OS            00 (0) 'MS-DOS'\n-F7D7A General Purpose Flag  0800 (2048)\n+F89E3 CENTRAL HEADER #376   02014B50 (33639248)\n+F89E7 Created Zip Spec      14 (20) '2.0'\n+F89E8 Created OS            03 (3) 'Unix'\n+F89E9 Extract Zip Spec      14 (20) '2.0'\n+F89EA Extract OS            00 (0) 'MS-DOS'\n+F89EB General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-F7D7C Compression Method    0008 (8) 'Deflated'\n-F7D7E Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F7D82 CRC                   77DFCD97 (2011155863)\n-F7D86 Compressed Size       00000C16 (3094)\n-F7D8A Uncompressed Size     00002C4A (11338)\n-F7D8E Filename Length       007E (126)\n-F7D90 Extra Length          0000 (0)\n-F7D92 Comment Length        0000 (0)\n-F7D94 Disk Start            0000 (0)\n-F7D96 Int File Attributes   0000 (0)\n+F89ED Compression Method    0008 (8) 'Deflated'\n+F89EF Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F89F3 CRC                   77DFCD97 (2011155863)\n+F89F7 Compressed Size       00000C16 (3094)\n+F89FB Uncompressed Size     00002C4A (11338)\n+F89FF Filename Length       007E (126)\n+F8A01 Extra Length          0000 (0)\n+F8A03 Comment Length        0000 (0)\n+F8A05 Disk Start            0000 (0)\n+F8A07 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F7D98 Ext File Attributes   81A40000 (2175008768)\n+F8A09 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-F7D9C Local Header Offset   0002C547 (181575)\n-F7DA0 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F8A0D Local Header Offset   0002CD1E (183582)\n+F8A11 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF7DA0: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF8A11: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-F7E1E CENTRAL HEADER #377   02014B50 (33639248)\n-F7E22 Created Zip Spec      14 (20) '2.0'\n-F7E23 Created OS            03 (3) 'Unix'\n-F7E24 Extract Zip Spec      14 (20) '2.0'\n-F7E25 Extract OS            00 (0) 'MS-DOS'\n-F7E26 General Purpose Flag  0800 (2048)\n+F8A8F CENTRAL HEADER #377   02014B50 (33639248)\n+F8A93 Created Zip Spec      14 (20) '2.0'\n+F8A94 Created OS            03 (3) 'Unix'\n+F8A95 Extract Zip Spec      14 (20) '2.0'\n+F8A96 Extract OS            00 (0) 'MS-DOS'\n+F8A97 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-F7E28 Compression Method    0008 (8) 'Deflated'\n-F7E2A Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F7E2E CRC                   249CCFCD (614256589)\n-F7E32 Compressed Size       0000164B (5707)\n-F7E36 Uncompressed Size     00005101 (20737)\n-F7E3A Filename Length       0084 (132)\n-F7E3C Extra Length          0000 (0)\n-F7E3E Comment Length        0000 (0)\n-F7E40 Disk Start            0000 (0)\n-F7E42 Int File Attributes   0000 (0)\n+F8A99 Compression Method    0008 (8) 'Deflated'\n+F8A9B Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F8A9F CRC                   249CCFCD (614256589)\n+F8AA3 Compressed Size       0000164B (5707)\n+F8AA7 Uncompressed Size     00005101 (20737)\n+F8AAB Filename Length       0084 (132)\n+F8AAD Extra Length          0000 (0)\n+F8AAF Comment Length        0000 (0)\n+F8AB1 Disk Start            0000 (0)\n+F8AB3 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F7E44 Ext File Attributes   81A40000 (2175008768)\n+F8AB5 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-F7E48 Local Header Offset   0002D1F9 (184825)\n-F7E4C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+F8AB9 Local Header Offset   0002D9D0 (186832)\n+F8ABD Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             '\n #\n-# WARNING: Offset 0xF7E4C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF8ABD: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-F7ED0 CENTRAL HEADER #378   02014B50 (33639248)\n-F7ED4 Created Zip Spec      14 (20) '2.0'\n-F7ED5 Created OS            03 (3) 'Unix'\n-F7ED6 Extract Zip Spec      14 (20) '2.0'\n-F7ED7 Extract OS            00 (0) 'MS-DOS'\n-F7ED8 General Purpose Flag  0800 (2048)\n+F8B41 CENTRAL HEADER #378   02014B50 (33639248)\n+F8B45 Created Zip Spec      14 (20) '2.0'\n+F8B46 Created OS            03 (3) 'Unix'\n+F8B47 Extract Zip Spec      14 (20) '2.0'\n+F8B48 Extract OS            00 (0) 'MS-DOS'\n+F8B49 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-F7EDA Compression Method    0008 (8) 'Deflated'\n-F7EDC Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F7EE0 CRC                   46DA6369 (1188717417)\n-F7EE4 Compressed Size       000010B4 (4276)\n-F7EE8 Uncompressed Size     00003DB7 (15799)\n-F7EEC Filename Length       007E (126)\n-F7EEE Extra Length          0000 (0)\n-F7EF0 Comment Length        0000 (0)\n-F7EF2 Disk Start            0000 (0)\n-F7EF4 Int File Attributes   0000 (0)\n+F8B4B Compression Method    0008 (8) 'Deflated'\n+F8B4D Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F8B51 CRC                   46DA6369 (1188717417)\n+F8B55 Compressed Size       000010B4 (4276)\n+F8B59 Uncompressed Size     00003DB7 (15799)\n+F8B5D Filename Length       007E (126)\n+F8B5F Extra Length          0000 (0)\n+F8B61 Comment Length        0000 (0)\n+F8B63 Disk Start            0000 (0)\n+F8B65 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F7EF6 Ext File Attributes   81A40000 (2175008768)\n+F8B67 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-F7EFA Local Header Offset   0002E8E6 (190694)\n-F7EFE Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F8B6B Local Header Offset   0002F0BD (192701)\n+F8B6F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF7EFE: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF8B6F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-F7F7C CENTRAL HEADER #379   02014B50 (33639248)\n-F7F80 Created Zip Spec      14 (20) '2.0'\n-F7F81 Created OS            03 (3) 'Unix'\n-F7F82 Extract Zip Spec      14 (20) '2.0'\n-F7F83 Extract OS            00 (0) 'MS-DOS'\n-F7F84 General Purpose Flag  0800 (2048)\n+F8BED CENTRAL HEADER #379   02014B50 (33639248)\n+F8BF1 Created Zip Spec      14 (20) '2.0'\n+F8BF2 Created OS            03 (3) 'Unix'\n+F8BF3 Extract Zip Spec      14 (20) '2.0'\n+F8BF4 Extract OS            00 (0) 'MS-DOS'\n+F8BF5 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-F7F86 Compression Method    0008 (8) 'Deflated'\n-F7F88 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F7F8C CRC                   6668C19E (1718141342)\n-F7F90 Compressed Size       00001899 (6297)\n-F7F94 Uncompressed Size     00009C3B (39995)\n-F7F98 Filename Length       0084 (132)\n-F7F9A Extra Length          0000 (0)\n-F7F9C Comment Length        0000 (0)\n-F7F9E Disk Start            0000 (0)\n-F7FA0 Int File Attributes   0000 (0)\n+F8BF7 Compression Method    0008 (8) 'Deflated'\n+F8BF9 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F8BFD CRC                   6668C19E (1718141342)\n+F8C01 Compressed Size       00001899 (6297)\n+F8C05 Uncompressed Size     00009C3B (39995)\n+F8C09 Filename Length       0084 (132)\n+F8C0B Extra Length          0000 (0)\n+F8C0D Comment Length        0000 (0)\n+F8C0F Disk Start            0000 (0)\n+F8C11 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F7FA2 Ext File Attributes   81A40000 (2175008768)\n+F8C13 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-F7FA6 Local Header Offset   0002FA36 (195126)\n-F7FAA Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+F8C17 Local Header Offset   0003020D (197133)\n+F8C1B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             '\n #\n-# WARNING: Offset 0xF7FAA: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF8C1B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-F802E CENTRAL HEADER #380   02014B50 (33639248)\n-F8032 Created Zip Spec      14 (20) '2.0'\n-F8033 Created OS            03 (3) 'Unix'\n-F8034 Extract Zip Spec      14 (20) '2.0'\n-F8035 Extract OS            00 (0) 'MS-DOS'\n-F8036 General Purpose Flag  0800 (2048)\n+F8C9F CENTRAL HEADER #380   02014B50 (33639248)\n+F8CA3 Created Zip Spec      14 (20) '2.0'\n+F8CA4 Created OS            03 (3) 'Unix'\n+F8CA5 Extract Zip Spec      14 (20) '2.0'\n+F8CA6 Extract OS            00 (0) 'MS-DOS'\n+F8CA7 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-F8038 Compression Method    0008 (8) 'Deflated'\n-F803A Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F803E CRC                   23E20FDA (602017754)\n-F8042 Compressed Size       00000C17 (3095)\n-F8046 Uncompressed Size     00002C4A (11338)\n-F804A Filename Length       007E (126)\n-F804C Extra Length          0000 (0)\n-F804E Comment Length        0000 (0)\n-F8050 Disk Start            0000 (0)\n-F8052 Int File Attributes   0000 (0)\n+F8CA9 Compression Method    0008 (8) 'Deflated'\n+F8CAB Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F8CAF CRC                   23E20FDA (602017754)\n+F8CB3 Compressed Size       00000C17 (3095)\n+F8CB7 Uncompressed Size     00002C4A (11338)\n+F8CBB Filename Length       007E (126)\n+F8CBD Extra Length          0000 (0)\n+F8CBF Comment Length        0000 (0)\n+F8CC1 Disk Start            0000 (0)\n+F8CC3 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F8054 Ext File Attributes   81A40000 (2175008768)\n+F8CC5 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-F8058 Local Header Offset   00031371 (201585)\n-F805C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F8CC9 Local Header Offset   00031B48 (203592)\n+F8CCD Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF805C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF8CCD: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-F80DA CENTRAL HEADER #381   02014B50 (33639248)\n-F80DE Created Zip Spec      14 (20) '2.0'\n-F80DF Created OS            03 (3) 'Unix'\n-F80E0 Extract Zip Spec      14 (20) '2.0'\n-F80E1 Extract OS            00 (0) 'MS-DOS'\n-F80E2 General Purpose Flag  0800 (2048)\n+F8D4B CENTRAL HEADER #381   02014B50 (33639248)\n+F8D4F Created Zip Spec      14 (20) '2.0'\n+F8D50 Created OS            03 (3) 'Unix'\n+F8D51 Extract Zip Spec      14 (20) '2.0'\n+F8D52 Extract OS            00 (0) 'MS-DOS'\n+F8D53 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-F80E4 Compression Method    0008 (8) 'Deflated'\n-F80E6 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F80EA CRC                   90D14EC3 (2429636291)\n-F80EE Compressed Size       0000085E (2142)\n-F80F2 Uncompressed Size     00001ABD (6845)\n-F80F6 Filename Length       0068 (104)\n-F80F8 Extra Length          0000 (0)\n-F80FA Comment Length        0000 (0)\n-F80FC Disk Start            0000 (0)\n-F80FE Int File Attributes   0000 (0)\n+F8D55 Compression Method    0008 (8) 'Deflated'\n+F8D57 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F8D5B CRC                   90D14EC3 (2429636291)\n+F8D5F Compressed Size       0000085E (2142)\n+F8D63 Uncompressed Size     00001ABD (6845)\n+F8D67 Filename Length       0068 (104)\n+F8D69 Extra Length          0000 (0)\n+F8D6B Comment Length        0000 (0)\n+F8D6D Disk Start            0000 (0)\n+F8D6F Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F8100 Ext File Attributes   81A40000 (2175008768)\n+F8D71 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-F8104 Local Header Offset   00032024 (204836)\n-F8108 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F8D75 Local Header Offset   000327FB (206843)\n+F8D79 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF8108: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF8D79: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-F8170 CENTRAL HEADER #382   02014B50 (33639248)\n-F8174 Created Zip Spec      14 (20) '2.0'\n-F8175 Created OS            03 (3) 'Unix'\n-F8176 Extract Zip Spec      14 (20) '2.0'\n-F8177 Extract OS            00 (0) 'MS-DOS'\n-F8178 General Purpose Flag  0800 (2048)\n+F8DE1 CENTRAL HEADER #382   02014B50 (33639248)\n+F8DE5 Created Zip Spec      14 (20) '2.0'\n+F8DE6 Created OS            03 (3) 'Unix'\n+F8DE7 Extract Zip Spec      14 (20) '2.0'\n+F8DE8 Extract OS            00 (0) 'MS-DOS'\n+F8DE9 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-F817A Compression Method    0008 (8) 'Deflated'\n-F817C Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F8180 CRC                   F19E6303 (4053689091)\n-F8184 Compressed Size       0000063F (1599)\n-F8188 Uncompressed Size     00000ED8 (3800)\n-F818C Filename Length       0074 (116)\n-F818E Extra Length          0000 (0)\n-F8190 Comment Length        0000 (0)\n-F8192 Disk Start            0000 (0)\n-F8194 Int File Attributes   0000 (0)\n+F8DEB Compression Method    0008 (8) 'Deflated'\n+F8DED Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F8DF1 CRC                   F19E6303 (4053689091)\n+F8DF5 Compressed Size       0000063F (1599)\n+F8DF9 Uncompressed Size     00000ED8 (3800)\n+F8DFD Filename Length       0074 (116)\n+F8DFF Extra Length          0000 (0)\n+F8E01 Comment Length        0000 (0)\n+F8E03 Disk Start            0000 (0)\n+F8E05 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F8196 Ext File Attributes   81A40000 (2175008768)\n+F8E07 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-F819A Local Header Offset   00032908 (207112)\n-F819E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F8E0B Local Header Offset   000330DF (209119)\n+F8E0F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF819E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF8E0F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-F8212 CENTRAL HEADER #383   02014B50 (33639248)\n-F8216 Created Zip Spec      14 (20) '2.0'\n-F8217 Created OS            03 (3) 'Unix'\n-F8218 Extract Zip Spec      14 (20) '2.0'\n-F8219 Extract OS            00 (0) 'MS-DOS'\n-F821A General Purpose Flag  0800 (2048)\n+F8E83 CENTRAL HEADER #383   02014B50 (33639248)\n+F8E87 Created Zip Spec      14 (20) '2.0'\n+F8E88 Created OS            03 (3) 'Unix'\n+F8E89 Extract Zip Spec      14 (20) '2.0'\n+F8E8A Extract OS            00 (0) 'MS-DOS'\n+F8E8B General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-F821C Compression Method    0008 (8) 'Deflated'\n-F821E Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F8222 CRC                   51B4F745 (1370814277)\n-F8226 Compressed Size       0000075A (1882)\n-F822A Uncompressed Size     000016D7 (5847)\n-F822E Filename Length       007A (122)\n-F8230 Extra Length          0000 (0)\n-F8232 Comment Length        0000 (0)\n-F8234 Disk Start            0000 (0)\n-F8236 Int File Attributes   0000 (0)\n+F8E8D Compression Method    0008 (8) 'Deflated'\n+F8E8F Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F8E93 CRC                   51B4F745 (1370814277)\n+F8E97 Compressed Size       0000075A (1882)\n+F8E9B Uncompressed Size     000016D7 (5847)\n+F8E9F Filename Length       007A (122)\n+F8EA1 Extra Length          0000 (0)\n+F8EA3 Comment Length        0000 (0)\n+F8EA5 Disk Start            0000 (0)\n+F8EA7 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F8238 Ext File Attributes   81A40000 (2175008768)\n+F8EA9 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-F823C Local Header Offset   00032FD9 (208857)\n-F8240 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F8EAD Local Header Offset   000337B0 (210864)\n+F8EB1 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF8240: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF8EB1: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-F82BA CENTRAL HEADER #384   02014B50 (33639248)\n-F82BE Created Zip Spec      14 (20) '2.0'\n-F82BF Created OS            03 (3) 'Unix'\n-F82C0 Extract Zip Spec      14 (20) '2.0'\n-F82C1 Extract OS            00 (0) 'MS-DOS'\n-F82C2 General Purpose Flag  0800 (2048)\n+F8F2B CENTRAL HEADER #384   02014B50 (33639248)\n+F8F2F Created Zip Spec      14 (20) '2.0'\n+F8F30 Created OS            03 (3) 'Unix'\n+F8F31 Extract Zip Spec      14 (20) '2.0'\n+F8F32 Extract OS            00 (0) 'MS-DOS'\n+F8F33 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-F82C4 Compression Method    0008 (8) 'Deflated'\n-F82C6 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F82CA CRC                   357DA477 (897426551)\n-F82CE Compressed Size       0000039F (927)\n-F82D2 Uncompressed Size     000006C6 (1734)\n-F82D6 Filename Length       0072 (114)\n-F82D8 Extra Length          0000 (0)\n-F82DA Comment Length        0000 (0)\n-F82DC Disk Start            0000 (0)\n-F82DE Int File Attributes   0000 (0)\n+F8F35 Compression Method    0008 (8) 'Deflated'\n+F8F37 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F8F3B CRC                   357DA477 (897426551)\n+F8F3F Compressed Size       0000039F (927)\n+F8F43 Uncompressed Size     000006C6 (1734)\n+F8F47 Filename Length       0072 (114)\n+F8F49 Extra Length          0000 (0)\n+F8F4B Comment Length        0000 (0)\n+F8F4D Disk Start            0000 (0)\n+F8F4F Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F82E0 Ext File Attributes   81A40000 (2175008768)\n+F8F51 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-F82E4 Local Header Offset   000337CB (210891)\n-F82E8 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F8F55 Local Header Offset   00033FA2 (212898)\n+F8F59 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF82E8: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF8F59: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-F835A CENTRAL HEADER #385   02014B50 (33639248)\n-F835E Created Zip Spec      14 (20) '2.0'\n-F835F Created OS            03 (3) 'Unix'\n-F8360 Extract Zip Spec      14 (20) '2.0'\n-F8361 Extract OS            00 (0) 'MS-DOS'\n-F8362 General Purpose Flag  0800 (2048)\n+F8FCB CENTRAL HEADER #385   02014B50 (33639248)\n+F8FCF Created Zip Spec      14 (20) '2.0'\n+F8FD0 Created OS            03 (3) 'Unix'\n+F8FD1 Extract Zip Spec      14 (20) '2.0'\n+F8FD2 Extract OS            00 (0) 'MS-DOS'\n+F8FD3 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-F8364 Compression Method    0008 (8) 'Deflated'\n-F8366 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F836A CRC                   F9CAC97B (4190816635)\n-F836E Compressed Size       000004CB (1227)\n-F8372 Uncompressed Size     000009BC (2492)\n-F8376 Filename Length       006F (111)\n-F8378 Extra Length          0000 (0)\n-F837A Comment Length        0000 (0)\n-F837C Disk Start            0000 (0)\n-F837E Int File Attributes   0000 (0)\n+F8FD5 Compression Method    0008 (8) 'Deflated'\n+F8FD7 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F8FDB CRC                   F9CAC97B (4190816635)\n+F8FDF Compressed Size       000004CB (1227)\n+F8FE3 Uncompressed Size     000009BC (2492)\n+F8FE7 Filename Length       006F (111)\n+F8FE9 Extra Length          0000 (0)\n+F8FEB Comment Length        0000 (0)\n+F8FED Disk Start            0000 (0)\n+F8FEF Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F8380 Ext File Attributes   81A40000 (2175008768)\n+F8FF1 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-F8384 Local Header Offset   00033BFA (211962)\n-F8388 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F8FF5 Local Header Offset   000343D1 (213969)\n+F8FF9 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF8388: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF8FF9: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-F83F7 CENTRAL HEADER #386   02014B50 (33639248)\n-F83FB Created Zip Spec      14 (20) '2.0'\n-F83FC Created OS            03 (3) 'Unix'\n-F83FD Extract Zip Spec      14 (20) '2.0'\n-F83FE Extract OS            00 (0) 'MS-DOS'\n-F83FF General Purpose Flag  0800 (2048)\n+F9068 CENTRAL HEADER #386   02014B50 (33639248)\n+F906C Created Zip Spec      14 (20) '2.0'\n+F906D Created OS            03 (3) 'Unix'\n+F906E Extract Zip Spec      14 (20) '2.0'\n+F906F Extract OS            00 (0) 'MS-DOS'\n+F9070 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-F8401 Compression Method    0008 (8) 'Deflated'\n-F8403 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F8407 CRC                   9DEB8C8B (2649459851)\n-F840B Compressed Size       000004E7 (1255)\n-F840F Uncompressed Size     00000A07 (2567)\n-F8413 Filename Length       0075 (117)\n-F8415 Extra Length          0000 (0)\n-F8417 Comment Length        0000 (0)\n-F8419 Disk Start            0000 (0)\n-F841B Int File Attributes   0000 (0)\n+F9072 Compression Method    0008 (8) 'Deflated'\n+F9074 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F9078 CRC                   9DEB8C8B (2649459851)\n+F907C Compressed Size       000004E7 (1255)\n+F9080 Uncompressed Size     00000A07 (2567)\n+F9084 Filename Length       0075 (117)\n+F9086 Extra Length          0000 (0)\n+F9088 Comment Length        0000 (0)\n+F908A Disk Start            0000 (0)\n+F908C Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F841D Ext File Attributes   81A40000 (2175008768)\n+F908E Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-F8421 Local Header Offset   00034152 (213330)\n-F8425 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F9092 Local Header Offset   00034929 (215337)\n+F9096 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF8425: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF9096: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-F849A CENTRAL HEADER #387   02014B50 (33639248)\n-F849E Created Zip Spec      14 (20) '2.0'\n-F849F Created OS            03 (3) 'Unix'\n-F84A0 Extract Zip Spec      14 (20) '2.0'\n-F84A1 Extract OS            00 (0) 'MS-DOS'\n-F84A2 General Purpose Flag  0800 (2048)\n+F910B CENTRAL HEADER #387   02014B50 (33639248)\n+F910F Created Zip Spec      14 (20) '2.0'\n+F9110 Created OS            03 (3) 'Unix'\n+F9111 Extract Zip Spec      14 (20) '2.0'\n+F9112 Extract OS            00 (0) 'MS-DOS'\n+F9113 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-F84A4 Compression Method    0008 (8) 'Deflated'\n-F84A6 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F84AA CRC                   85B17459 (2242999385)\n-F84AE Compressed Size       0000060E (1550)\n-F84B2 Uncompressed Size     00000DDE (3550)\n-F84B6 Filename Length       006F (111)\n-F84B8 Extra Length          0000 (0)\n-F84BA Comment Length        0000 (0)\n-F84BC Disk Start            0000 (0)\n-F84BE Int File Attributes   0000 (0)\n+F9115 Compression Method    0008 (8) 'Deflated'\n+F9117 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F911B CRC                   85B17459 (2242999385)\n+F911F Compressed Size       0000060E (1550)\n+F9123 Uncompressed Size     00000DDE (3550)\n+F9127 Filename Length       006F (111)\n+F9129 Extra Length          0000 (0)\n+F912B Comment Length        0000 (0)\n+F912D Disk Start            0000 (0)\n+F912F Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F84C0 Ext File Attributes   81A40000 (2175008768)\n+F9131 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-F84C4 Local Header Offset   000346CC (214732)\n-F84C8 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F9135 Local Header Offset   00034EA3 (216739)\n+F9139 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF84C8: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF9139: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-F8537 CENTRAL HEADER #388   02014B50 (33639248)\n-F853B Created Zip Spec      14 (20) '2.0'\n-F853C Created OS            03 (3) 'Unix'\n-F853D Extract Zip Spec      14 (20) '2.0'\n-F853E Extract OS            00 (0) 'MS-DOS'\n-F853F General Purpose Flag  0800 (2048)\n+F91A8 CENTRAL HEADER #388   02014B50 (33639248)\n+F91AC Created Zip Spec      14 (20) '2.0'\n+F91AD Created OS            03 (3) 'Unix'\n+F91AE Extract Zip Spec      14 (20) '2.0'\n+F91AF Extract OS            00 (0) 'MS-DOS'\n+F91B0 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-F8541 Compression Method    0008 (8) 'Deflated'\n-F8543 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F8547 CRC                   9C229073 (2619510899)\n-F854B Compressed Size       00000330 (816)\n-F854F Uncompressed Size     000005CF (1487)\n-F8553 Filename Length       007A (122)\n-F8555 Extra Length          0000 (0)\n-F8557 Comment Length        0000 (0)\n-F8559 Disk Start            0000 (0)\n-F855B Int File Attributes   0000 (0)\n+F91B2 Compression Method    0008 (8) 'Deflated'\n+F91B4 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F91B8 CRC                   9C229073 (2619510899)\n+F91BC Compressed Size       00000330 (816)\n+F91C0 Uncompressed Size     000005CF (1487)\n+F91C4 Filename Length       007A (122)\n+F91C6 Extra Length          0000 (0)\n+F91C8 Comment Length        0000 (0)\n+F91CA Disk Start            0000 (0)\n+F91CC Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F855D Ext File Attributes   81A40000 (2175008768)\n+F91CE Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-F8561 Local Header Offset   00034D67 (216423)\n-F8565 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F91D2 Local Header Offset   0003553E (218430)\n+F91D6 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF8565: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF91D6: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-F85DF CENTRAL HEADER #389   02014B50 (33639248)\n-F85E3 Created Zip Spec      14 (20) '2.0'\n-F85E4 Created OS            03 (3) 'Unix'\n-F85E5 Extract Zip Spec      14 (20) '2.0'\n-F85E6 Extract OS            00 (0) 'MS-DOS'\n-F85E7 General Purpose Flag  0800 (2048)\n+F9250 CENTRAL HEADER #389   02014B50 (33639248)\n+F9254 Created Zip Spec      14 (20) '2.0'\n+F9255 Created OS            03 (3) 'Unix'\n+F9256 Extract Zip Spec      14 (20) '2.0'\n+F9257 Extract OS            00 (0) 'MS-DOS'\n+F9258 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-F85E9 Compression Method    0008 (8) 'Deflated'\n-F85EB Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F85EF CRC                   A57691CD (2776011213)\n-F85F3 Compressed Size       00000316 (790)\n-F85F7 Uncompressed Size     000005C2 (1474)\n-F85FB Filename Length       007A (122)\n-F85FD Extra Length          0000 (0)\n-F85FF Comment Length        0000 (0)\n-F8601 Disk Start            0000 (0)\n-F8603 Int File Attributes   0000 (0)\n+F925A Compression Method    0008 (8) 'Deflated'\n+F925C Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F9260 CRC                   A57691CD (2776011213)\n+F9264 Compressed Size       00000316 (790)\n+F9268 Uncompressed Size     000005C2 (1474)\n+F926C Filename Length       007A (122)\n+F926E Extra Length          0000 (0)\n+F9270 Comment Length        0000 (0)\n+F9272 Disk Start            0000 (0)\n+F9274 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F8605 Ext File Attributes   81A40000 (2175008768)\n+F9276 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-F8609 Local Header Offset   0003512F (217391)\n-F860D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F927A Local Header Offset   00035906 (219398)\n+F927E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF860D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF927E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-F8687 CENTRAL HEADER #390   02014B50 (33639248)\n-F868B Created Zip Spec      14 (20) '2.0'\n-F868C Created OS            03 (3) 'Unix'\n-F868D Extract Zip Spec      14 (20) '2.0'\n-F868E Extract OS            00 (0) 'MS-DOS'\n-F868F General Purpose Flag  0800 (2048)\n+F92F8 CENTRAL HEADER #390   02014B50 (33639248)\n+F92FC Created Zip Spec      14 (20) '2.0'\n+F92FD Created OS            03 (3) 'Unix'\n+F92FE Extract Zip Spec      14 (20) '2.0'\n+F92FF Extract OS            00 (0) 'MS-DOS'\n+F9300 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-F8691 Compression Method    0008 (8) 'Deflated'\n-F8693 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F8697 CRC                   6CD31445 (1825772613)\n-F869B Compressed Size       000003CA (970)\n-F869F Uncompressed Size     0000073A (1850)\n-F86A3 Filename Length       0079 (121)\n-F86A5 Extra Length          0000 (0)\n-F86A7 Comment Length        0000 (0)\n-F86A9 Disk Start            0000 (0)\n-F86AB Int File Attributes   0000 (0)\n+F9302 Compression Method    0008 (8) 'Deflated'\n+F9304 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F9308 CRC                   6CD31445 (1825772613)\n+F930C Compressed Size       000003CA (970)\n+F9310 Uncompressed Size     0000073A (1850)\n+F9314 Filename Length       0079 (121)\n+F9316 Extra Length          0000 (0)\n+F9318 Comment Length        0000 (0)\n+F931A Disk Start            0000 (0)\n+F931C Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F86AD Ext File Attributes   81A40000 (2175008768)\n+F931E Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-F86B1 Local Header Offset   000354DD (218333)\n-F86B5 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F9322 Local Header Offset   00035CB4 (220340)\n+F9326 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF86B5: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF9326: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-F872E CENTRAL HEADER #391   02014B50 (33639248)\n-F8732 Created Zip Spec      14 (20) '2.0'\n-F8733 Created OS            03 (3) 'Unix'\n-F8734 Extract Zip Spec      14 (20) '2.0'\n-F8735 Extract OS            00 (0) 'MS-DOS'\n-F8736 General Purpose Flag  0800 (2048)\n+F939F CENTRAL HEADER #391   02014B50 (33639248)\n+F93A3 Created Zip Spec      14 (20) '2.0'\n+F93A4 Created OS            03 (3) 'Unix'\n+F93A5 Extract Zip Spec      14 (20) '2.0'\n+F93A6 Extract OS            00 (0) 'MS-DOS'\n+F93A7 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-F8738 Compression Method    0008 (8) 'Deflated'\n-F873A Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F873E CRC                   C97DF8D6 (3380476118)\n-F8742 Compressed Size       00000522 (1314)\n-F8746 Uncompressed Size     00000A92 (2706)\n-F874A Filename Length       0077 (119)\n-F874C Extra Length          0000 (0)\n-F874E Comment Length        0000 (0)\n-F8750 Disk Start            0000 (0)\n-F8752 Int File Attributes   0000 (0)\n+F93A9 Compression Method    0008 (8) 'Deflated'\n+F93AB Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F93AF CRC                   C97DF8D6 (3380476118)\n+F93B3 Compressed Size       00000522 (1314)\n+F93B7 Uncompressed Size     00000A92 (2706)\n+F93BB Filename Length       0077 (119)\n+F93BD Extra Length          0000 (0)\n+F93BF Comment Length        0000 (0)\n+F93C1 Disk Start            0000 (0)\n+F93C3 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F8754 Ext File Attributes   81A40000 (2175008768)\n+F93C5 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-F8758 Local Header Offset   0003593E (219454)\n-F875C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F93C9 Local Header Offset   00036115 (221461)\n+F93CD Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF875C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF93CD: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-F87D3 CENTRAL HEADER #392   02014B50 (33639248)\n-F87D7 Created Zip Spec      14 (20) '2.0'\n-F87D8 Created OS            03 (3) 'Unix'\n-F87D9 Extract Zip Spec      14 (20) '2.0'\n-F87DA Extract OS            00 (0) 'MS-DOS'\n-F87DB General Purpose Flag  0800 (2048)\n+F9444 CENTRAL HEADER #392   02014B50 (33639248)\n+F9448 Created Zip Spec      14 (20) '2.0'\n+F9449 Created OS            03 (3) 'Unix'\n+F944A Extract Zip Spec      14 (20) '2.0'\n+F944B Extract OS            00 (0) 'MS-DOS'\n+F944C General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-F87DD Compression Method    0008 (8) 'Deflated'\n-F87DF Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F87E3 CRC                   0B04A112 (184852754)\n-F87E7 Compressed Size       000003C7 (967)\n-F87EB Uncompressed Size     00000795 (1941)\n-F87EF Filename Length       006C (108)\n-F87F1 Extra Length          0000 (0)\n-F87F3 Comment Length        0000 (0)\n-F87F5 Disk Start            0000 (0)\n-F87F7 Int File Attributes   0000 (0)\n+F944E Compression Method    0008 (8) 'Deflated'\n+F9450 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F9454 CRC                   0B04A112 (184852754)\n+F9458 Compressed Size       000003C7 (967)\n+F945C Uncompressed Size     00000795 (1941)\n+F9460 Filename Length       006C (108)\n+F9462 Extra Length          0000 (0)\n+F9464 Comment Length        0000 (0)\n+F9466 Disk Start            0000 (0)\n+F9468 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F87F9 Ext File Attributes   81A40000 (2175008768)\n+F946A Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-F87FD Local Header Offset   00035EF5 (220917)\n-F8801 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F946E Local Header Offset   000366CC (222924)\n+F9472 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF8801: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF9472: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-F886D CENTRAL HEADER #393   02014B50 (33639248)\n-F8871 Created Zip Spec      14 (20) '2.0'\n-F8872 Created OS            03 (3) 'Unix'\n-F8873 Extract Zip Spec      14 (20) '2.0'\n-F8874 Extract OS            00 (0) 'MS-DOS'\n-F8875 General Purpose Flag  0800 (2048)\n+F94DE CENTRAL HEADER #393   02014B50 (33639248)\n+F94E2 Created Zip Spec      14 (20) '2.0'\n+F94E3 Created OS            03 (3) 'Unix'\n+F94E4 Extract Zip Spec      14 (20) '2.0'\n+F94E5 Extract OS            00 (0) 'MS-DOS'\n+F94E6 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-F8877 Compression Method    0008 (8) 'Deflated'\n-F8879 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F887D CRC                   9A51A289 (2589041289)\n-F8881 Compressed Size       00000425 (1061)\n-F8885 Uncompressed Size     000008AB (2219)\n-F8889 Filename Length       0080 (128)\n-F888B Extra Length          0000 (0)\n-F888D Comment Length        0000 (0)\n-F888F Disk Start            0000 (0)\n-F8891 Int File Attributes   0000 (0)\n+F94E8 Compression Method    0008 (8) 'Deflated'\n+F94EA Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F94EE CRC                   9A51A289 (2589041289)\n+F94F2 Compressed Size       00000425 (1061)\n+F94F6 Uncompressed Size     000008AB (2219)\n+F94FA Filename Length       0080 (128)\n+F94FC Extra Length          0000 (0)\n+F94FE Comment Length        0000 (0)\n+F9500 Disk Start            0000 (0)\n+F9502 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F8893 Ext File Attributes   81A40000 (2175008768)\n+F9504 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-F8897 Local Header Offset   00036346 (222022)\n-F889B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F9508 Local Header Offset   00036B1D (224029)\n+F950C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF889B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF950C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-F891B CENTRAL HEADER #394   02014B50 (33639248)\n-F891F Created Zip Spec      14 (20) '2.0'\n-F8920 Created OS            03 (3) 'Unix'\n-F8921 Extract Zip Spec      14 (20) '2.0'\n-F8922 Extract OS            00 (0) 'MS-DOS'\n-F8923 General Purpose Flag  0800 (2048)\n+F958C CENTRAL HEADER #394   02014B50 (33639248)\n+F9590 Created Zip Spec      14 (20) '2.0'\n+F9591 Created OS            03 (3) 'Unix'\n+F9592 Extract Zip Spec      14 (20) '2.0'\n+F9593 Extract OS            00 (0) 'MS-DOS'\n+F9594 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-F8925 Compression Method    0008 (8) 'Deflated'\n-F8927 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F892B CRC                   BEAE3D9C (3199090076)\n-F892F Compressed Size       0000127D (4733)\n-F8933 Uncompressed Size     0000396F (14703)\n-F8937 Filename Length       0061 (97)\n-F8939 Extra Length          0000 (0)\n-F893B Comment Length        0000 (0)\n-F893D Disk Start            0000 (0)\n-F893F Int File Attributes   0000 (0)\n+F9596 Compression Method    0008 (8) 'Deflated'\n+F9598 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F959C CRC                   BEAE3D9C (3199090076)\n+F95A0 Compressed Size       0000127D (4733)\n+F95A4 Uncompressed Size     0000396F (14703)\n+F95A8 Filename Length       0061 (97)\n+F95AA Extra Length          0000 (0)\n+F95AC Comment Length        0000 (0)\n+F95AE Disk Start            0000 (0)\n+F95B0 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F8941 Ext File Attributes   81A40000 (2175008768)\n+F95B2 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-F8945 Local Header Offset   00036809 (223241)\n-F8949 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F95B6 Local Header Offset   00036FE0 (225248)\n+F95BA Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF8949: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF95BA: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-F89AA CENTRAL HEADER #395   02014B50 (33639248)\n-F89AE Created Zip Spec      14 (20) '2.0'\n-F89AF Created OS            03 (3) 'Unix'\n-F89B0 Extract Zip Spec      14 (20) '2.0'\n-F89B1 Extract OS            00 (0) 'MS-DOS'\n-F89B2 General Purpose Flag  0800 (2048)\n+F961B CENTRAL HEADER #395   02014B50 (33639248)\n+F961F Created Zip Spec      14 (20) '2.0'\n+F9620 Created OS            03 (3) 'Unix'\n+F9621 Extract Zip Spec      14 (20) '2.0'\n+F9622 Extract OS            00 (0) 'MS-DOS'\n+F9623 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-F89B4 Compression Method    0008 (8) 'Deflated'\n-F89B6 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F89BA CRC                   28034B81 (671304577)\n-F89BE Compressed Size       00000540 (1344)\n-F89C2 Uncompressed Size     00000E44 (3652)\n-F89C6 Filename Length       0079 (121)\n-F89C8 Extra Length          0000 (0)\n-F89CA Comment Length        0000 (0)\n-F89CC Disk Start            0000 (0)\n-F89CE Int File Attributes   0000 (0)\n+F9625 Compression Method    0008 (8) 'Deflated'\n+F9627 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F962B CRC                   28034B81 (671304577)\n+F962F Compressed Size       00000540 (1344)\n+F9633 Uncompressed Size     00000E44 (3652)\n+F9637 Filename Length       0079 (121)\n+F9639 Extra Length          0000 (0)\n+F963B Comment Length        0000 (0)\n+F963D Disk Start            0000 (0)\n+F963F Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F89D0 Ext File Attributes   81A40000 (2175008768)\n+F9641 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-F89D4 Local Header Offset   00037B05 (228101)\n-F89D8 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F9645 Local Header Offset   000382DC (230108)\n+F9649 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF89D8: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF9649: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-F8A51 CENTRAL HEADER #396   02014B50 (33639248)\n-F8A55 Created Zip Spec      14 (20) '2.0'\n-F8A56 Created OS            03 (3) 'Unix'\n-F8A57 Extract Zip Spec      14 (20) '2.0'\n-F8A58 Extract OS            00 (0) 'MS-DOS'\n-F8A59 General Purpose Flag  0800 (2048)\n+F96C2 CENTRAL HEADER #396   02014B50 (33639248)\n+F96C6 Created Zip Spec      14 (20) '2.0'\n+F96C7 Created OS            03 (3) 'Unix'\n+F96C8 Extract Zip Spec      14 (20) '2.0'\n+F96C9 Extract OS            00 (0) 'MS-DOS'\n+F96CA General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-F8A5B Compression Method    0008 (8) 'Deflated'\n-F8A5D Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F8A61 CRC                   29D620BA (701898938)\n-F8A65 Compressed Size       00000BC2 (3010)\n-F8A69 Uncompressed Size     00002421 (9249)\n-F8A6D Filename Length       007E (126)\n-F8A6F Extra Length          0000 (0)\n-F8A71 Comment Length        0000 (0)\n-F8A73 Disk Start            0000 (0)\n-F8A75 Int File Attributes   0000 (0)\n+F96CC Compression Method    0008 (8) 'Deflated'\n+F96CE Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F96D2 CRC                   29D620BA (701898938)\n+F96D6 Compressed Size       00000BC2 (3010)\n+F96DA Uncompressed Size     00002421 (9249)\n+F96DE Filename Length       007E (126)\n+F96E0 Extra Length          0000 (0)\n+F96E2 Comment Length        0000 (0)\n+F96E4 Disk Start            0000 (0)\n+F96E6 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F8A77 Ext File Attributes   81A40000 (2175008768)\n+F96E8 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-F8A7B Local Header Offset   000380DC (229596)\n-F8A7F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F96EC Local Header Offset   000388B3 (231603)\n+F96F0 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF8A7F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF96F0: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-F8AFD CENTRAL HEADER #397   02014B50 (33639248)\n-F8B01 Created Zip Spec      14 (20) '2.0'\n-F8B02 Created OS            03 (3) 'Unix'\n-F8B03 Extract Zip Spec      14 (20) '2.0'\n-F8B04 Extract OS            00 (0) 'MS-DOS'\n-F8B05 General Purpose Flag  0800 (2048)\n+F976E CENTRAL HEADER #397   02014B50 (33639248)\n+F9772 Created Zip Spec      14 (20) '2.0'\n+F9773 Created OS            03 (3) 'Unix'\n+F9774 Extract Zip Spec      14 (20) '2.0'\n+F9775 Extract OS            00 (0) 'MS-DOS'\n+F9776 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-F8B07 Compression Method    0008 (8) 'Deflated'\n-F8B09 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F8B0D CRC                   9ED7BE90 (2664939152)\n-F8B11 Compressed Size       00001217 (4631)\n-F8B15 Uncompressed Size     000036E7 (14055)\n-F8B19 Filename Length       0077 (119)\n-F8B1B Extra Length          0000 (0)\n-F8B1D Comment Length        0000 (0)\n-F8B1F Disk Start            0000 (0)\n-F8B21 Int File Attributes   0000 (0)\n+F9778 Compression Method    0008 (8) 'Deflated'\n+F977A Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F977E CRC                   9ED7BE90 (2664939152)\n+F9782 Compressed Size       00001217 (4631)\n+F9786 Uncompressed Size     000036E7 (14055)\n+F978A Filename Length       0077 (119)\n+F978C Extra Length          0000 (0)\n+F978E Comment Length        0000 (0)\n+F9790 Disk Start            0000 (0)\n+F9792 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F8B23 Ext File Attributes   81A40000 (2175008768)\n+F9794 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-F8B27 Local Header Offset   00038D3A (232762)\n-F8B2B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F9798 Local Header Offset   00039511 (234769)\n+F979C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF8B2B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF979C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-F8BA2 CENTRAL HEADER #398   02014B50 (33639248)\n-F8BA6 Created Zip Spec      14 (20) '2.0'\n-F8BA7 Created OS            03 (3) 'Unix'\n-F8BA8 Extract Zip Spec      14 (20) '2.0'\n-F8BA9 Extract OS            00 (0) 'MS-DOS'\n-F8BAA General Purpose Flag  0800 (2048)\n+F9813 CENTRAL HEADER #398   02014B50 (33639248)\n+F9817 Created Zip Spec      14 (20) '2.0'\n+F9818 Created OS            03 (3) 'Unix'\n+F9819 Extract Zip Spec      14 (20) '2.0'\n+F981A Extract OS            00 (0) 'MS-DOS'\n+F981B General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-F8BAC Compression Method    0008 (8) 'Deflated'\n-F8BAE Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F8BB2 CRC                   B51FDD91 (3038764433)\n-F8BB6 Compressed Size       0000156C (5484)\n-F8BBA Uncompressed Size     00004792 (18322)\n-F8BBE Filename Length       0077 (119)\n-F8BC0 Extra Length          0000 (0)\n-F8BC2 Comment Length        0000 (0)\n-F8BC4 Disk Start            0000 (0)\n-F8BC6 Int File Attributes   0000 (0)\n+F981D Compression Method    0008 (8) 'Deflated'\n+F981F Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F9823 CRC                   B51FDD91 (3038764433)\n+F9827 Compressed Size       0000156C (5484)\n+F982B Uncompressed Size     00004792 (18322)\n+F982F Filename Length       0077 (119)\n+F9831 Extra Length          0000 (0)\n+F9833 Comment Length        0000 (0)\n+F9835 Disk Start            0000 (0)\n+F9837 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F8BC8 Ext File Attributes   81A40000 (2175008768)\n+F9839 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-F8BCC Local Header Offset   00039FE6 (237542)\n-F8BD0 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F983D Local Header Offset   0003A7BD (239549)\n+F9841 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF8BD0: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF9841: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-F8C47 CENTRAL HEADER #399   02014B50 (33639248)\n-F8C4B Created Zip Spec      14 (20) '2.0'\n-F8C4C Created OS            03 (3) 'Unix'\n-F8C4D Extract Zip Spec      14 (20) '2.0'\n-F8C4E Extract OS            00 (0) 'MS-DOS'\n-F8C4F General Purpose Flag  0800 (2048)\n+F98B8 CENTRAL HEADER #399   02014B50 (33639248)\n+F98BC Created Zip Spec      14 (20) '2.0'\n+F98BD Created OS            03 (3) 'Unix'\n+F98BE Extract Zip Spec      14 (20) '2.0'\n+F98BF Extract OS            00 (0) 'MS-DOS'\n+F98C0 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-F8C51 Compression Method    0008 (8) 'Deflated'\n-F8C53 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F8C57 CRC                   27CFA48B (667919499)\n-F8C5B Compressed Size       000018CC (6348)\n-F8C5F Uncompressed Size     00005DDC (24028)\n-F8C63 Filename Length       0079 (121)\n-F8C65 Extra Length          0000 (0)\n-F8C67 Comment Length        0000 (0)\n-F8C69 Disk Start            0000 (0)\n-F8C6B Int File Attributes   0000 (0)\n+F98C2 Compression Method    0008 (8) 'Deflated'\n+F98C4 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F98C8 CRC                   27CFA48B (667919499)\n+F98CC Compressed Size       000018CC (6348)\n+F98D0 Uncompressed Size     00005DDC (24028)\n+F98D4 Filename Length       0079 (121)\n+F98D6 Extra Length          0000 (0)\n+F98D8 Comment Length        0000 (0)\n+F98DA Disk Start            0000 (0)\n+F98DC Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F8C6D Ext File Attributes   81A40000 (2175008768)\n+F98DE Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-F8C71 Local Header Offset   0003B5E7 (243175)\n-F8C75 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F98E2 Local Header Offset   0003BDBE (245182)\n+F98E6 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF8C75: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF98E6: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-F8CEE CENTRAL HEADER #400   02014B50 (33639248)\n-F8CF2 Created Zip Spec      14 (20) '2.0'\n-F8CF3 Created OS            03 (3) 'Unix'\n-F8CF4 Extract Zip Spec      14 (20) '2.0'\n-F8CF5 Extract OS            00 (0) 'MS-DOS'\n-F8CF6 General Purpose Flag  0800 (2048)\n+F995F CENTRAL HEADER #400   02014B50 (33639248)\n+F9963 Created Zip Spec      14 (20) '2.0'\n+F9964 Created OS            03 (3) 'Unix'\n+F9965 Extract Zip Spec      14 (20) '2.0'\n+F9966 Extract OS            00 (0) 'MS-DOS'\n+F9967 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-F8CF8 Compression Method    0008 (8) 'Deflated'\n-F8CFA Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F8CFE CRC                   620AB78F (1644869519)\n-F8D02 Compressed Size       000012CF (4815)\n-F8D06 Uncompressed Size     00003B3A (15162)\n-F8D0A Filename Length       007D (125)\n-F8D0C Extra Length          0000 (0)\n-F8D0E Comment Length        0000 (0)\n-F8D10 Disk Start            0000 (0)\n-F8D12 Int File Attributes   0000 (0)\n+F9969 Compression Method    0008 (8) 'Deflated'\n+F996B Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F996F CRC                   620AB78F (1644869519)\n+F9973 Compressed Size       000012CF (4815)\n+F9977 Uncompressed Size     00003B3A (15162)\n+F997B Filename Length       007D (125)\n+F997D Extra Length          0000 (0)\n+F997F Comment Length        0000 (0)\n+F9981 Disk Start            0000 (0)\n+F9983 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F8D14 Ext File Attributes   81A40000 (2175008768)\n+F9985 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-F8D18 Local Header Offset   0003CF4A (249674)\n-F8D1C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F9989 Local Header Offset   0003D721 (251681)\n+F998D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF8D1C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF998D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-F8D99 CENTRAL HEADER #401   02014B50 (33639248)\n-F8D9D Created Zip Spec      14 (20) '2.0'\n-F8D9E Created OS            03 (3) 'Unix'\n-F8D9F Extract Zip Spec      14 (20) '2.0'\n-F8DA0 Extract OS            00 (0) 'MS-DOS'\n-F8DA1 General Purpose Flag  0800 (2048)\n+F9A0A CENTRAL HEADER #401   02014B50 (33639248)\n+F9A0E Created Zip Spec      14 (20) '2.0'\n+F9A0F Created OS            03 (3) 'Unix'\n+F9A10 Extract Zip Spec      14 (20) '2.0'\n+F9A11 Extract OS            00 (0) 'MS-DOS'\n+F9A12 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-F8DA3 Compression Method    0008 (8) 'Deflated'\n-F8DA5 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F8DA9 CRC                   937A07E6 (2474248166)\n-F8DAD Compressed Size       000013A9 (5033)\n-F8DB1 Uncompressed Size     00004869 (18537)\n-F8DB5 Filename Length       007D (125)\n-F8DB7 Extra Length          0000 (0)\n-F8DB9 Comment Length        0000 (0)\n-F8DBB Disk Start            0000 (0)\n-F8DBD Int File Attributes   0000 (0)\n+F9A14 Compression Method    0008 (8) 'Deflated'\n+F9A16 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F9A1A CRC                   937A07E6 (2474248166)\n+F9A1E Compressed Size       000013A9 (5033)\n+F9A22 Uncompressed Size     00004869 (18537)\n+F9A26 Filename Length       007D (125)\n+F9A28 Extra Length          0000 (0)\n+F9A2A Comment Length        0000 (0)\n+F9A2C Disk Start            0000 (0)\n+F9A2E Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F8DBF Ext File Attributes   81A40000 (2175008768)\n+F9A30 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-F8DC3 Local Header Offset   0003E2B4 (254644)\n-F8DC7 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F9A34 Local Header Offset   0003EA8B (256651)\n+F9A38 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF8DC7: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF9A38: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-F8E44 CENTRAL HEADER #402   02014B50 (33639248)\n-F8E48 Created Zip Spec      14 (20) '2.0'\n-F8E49 Created OS            03 (3) 'Unix'\n-F8E4A Extract Zip Spec      14 (20) '2.0'\n-F8E4B Extract OS            00 (0) 'MS-DOS'\n-F8E4C General Purpose Flag  0800 (2048)\n+F9AB5 CENTRAL HEADER #402   02014B50 (33639248)\n+F9AB9 Created Zip Spec      14 (20) '2.0'\n+F9ABA Created OS            03 (3) 'Unix'\n+F9ABB Extract Zip Spec      14 (20) '2.0'\n+F9ABC Extract OS            00 (0) 'MS-DOS'\n+F9ABD General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-F8E4E Compression Method    0008 (8) 'Deflated'\n-F8E50 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F8E54 CRC                   53DFF1D7 (1407185367)\n-F8E58 Compressed Size       00000442 (1090)\n-F8E5C Uncompressed Size     00000ADF (2783)\n-F8E60 Filename Length       0081 (129)\n-F8E62 Extra Length          0000 (0)\n-F8E64 Comment Length        0000 (0)\n-F8E66 Disk Start            0000 (0)\n-F8E68 Int File Attributes   0000 (0)\n+F9ABF Compression Method    0008 (8) 'Deflated'\n+F9AC1 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F9AC5 CRC                   53DFF1D7 (1407185367)\n+F9AC9 Compressed Size       00000442 (1090)\n+F9ACD Uncompressed Size     00000ADF (2783)\n+F9AD1 Filename Length       0081 (129)\n+F9AD3 Extra Length          0000 (0)\n+F9AD5 Comment Length        0000 (0)\n+F9AD7 Disk Start            0000 (0)\n+F9AD9 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F8E6A Ext File Attributes   81A40000 (2175008768)\n+F9ADB Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-F8E6E Local Header Offset   0003F6F8 (259832)\n-F8E72 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F9ADF Local Header Offset   0003FECF (261839)\n+F9AE3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF8E72: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF9AE3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-F8EF3 CENTRAL HEADER #403   02014B50 (33639248)\n-F8EF7 Created Zip Spec      14 (20) '2.0'\n-F8EF8 Created OS            03 (3) 'Unix'\n-F8EF9 Extract Zip Spec      14 (20) '2.0'\n-F8EFA Extract OS            00 (0) 'MS-DOS'\n-F8EFB General Purpose Flag  0800 (2048)\n+F9B64 CENTRAL HEADER #403   02014B50 (33639248)\n+F9B68 Created Zip Spec      14 (20) '2.0'\n+F9B69 Created OS            03 (3) 'Unix'\n+F9B6A Extract Zip Spec      14 (20) '2.0'\n+F9B6B Extract OS            00 (0) 'MS-DOS'\n+F9B6C General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-F8EFD Compression Method    0008 (8) 'Deflated'\n-F8EFF Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F8F03 CRC                   6D3A5445 (1832539205)\n-F8F07 Compressed Size       000003FF (1023)\n-F8F0B Uncompressed Size     00000939 (2361)\n-F8F0F Filename Length       007D (125)\n-F8F11 Extra Length          0000 (0)\n-F8F13 Comment Length        0000 (0)\n-F8F15 Disk Start            0000 (0)\n-F8F17 Int File Attributes   0000 (0)\n+F9B6E Compression Method    0008 (8) 'Deflated'\n+F9B70 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F9B74 CRC                   6D3A5445 (1832539205)\n+F9B78 Compressed Size       000003FF (1023)\n+F9B7C Uncompressed Size     00000939 (2361)\n+F9B80 Filename Length       007D (125)\n+F9B82 Extra Length          0000 (0)\n+F9B84 Comment Length        0000 (0)\n+F9B86 Disk Start            0000 (0)\n+F9B88 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F8F19 Ext File Attributes   81A40000 (2175008768)\n+F9B8A Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-F8F1D Local Header Offset   0003FBD9 (261081)\n-F8F21 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F9B8E Local Header Offset   000403B0 (263088)\n+F9B92 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF8F21: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF9B92: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-F8F9E CENTRAL HEADER #404   02014B50 (33639248)\n-F8FA2 Created Zip Spec      14 (20) '2.0'\n-F8FA3 Created OS            03 (3) 'Unix'\n-F8FA4 Extract Zip Spec      14 (20) '2.0'\n-F8FA5 Extract OS            00 (0) 'MS-DOS'\n-F8FA6 General Purpose Flag  0800 (2048)\n+F9C0F CENTRAL HEADER #404   02014B50 (33639248)\n+F9C13 Created Zip Spec      14 (20) '2.0'\n+F9C14 Created OS            03 (3) 'Unix'\n+F9C15 Extract Zip Spec      14 (20) '2.0'\n+F9C16 Extract OS            00 (0) 'MS-DOS'\n+F9C17 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-F8FA8 Compression Method    0008 (8) 'Deflated'\n-F8FAA Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F8FAE CRC                   5C6B1924 (1550522660)\n-F8FB2 Compressed Size       000005D8 (1496)\n-F8FB6 Uncompressed Size     00000DDD (3549)\n-F8FBA Filename Length       008C (140)\n-F8FBC Extra Length          0000 (0)\n-F8FBE Comment Length        0000 (0)\n-F8FC0 Disk Start            0000 (0)\n-F8FC2 Int File Attributes   0000 (0)\n+F9C19 Compression Method    0008 (8) 'Deflated'\n+F9C1B Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F9C1F CRC                   5C6B1924 (1550522660)\n+F9C23 Compressed Size       000005D8 (1496)\n+F9C27 Uncompressed Size     00000DDD (3549)\n+F9C2B Filename Length       008C (140)\n+F9C2D Extra Length          0000 (0)\n+F9C2F Comment Length        0000 (0)\n+F9C31 Disk Start            0000 (0)\n+F9C33 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F8FC4 Ext File Attributes   81A40000 (2175008768)\n+F9C35 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-F8FC8 Local Header Offset   00040073 (262259)\n-F8FCC Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+F9C39 Local Header Offset   0004084A (264266)\n+F9C3D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             XXXXXXXX'\n #\n-# WARNING: Offset 0xF8FCC: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF9C3D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-F9058 CENTRAL HEADER #405   02014B50 (33639248)\n-F905C Created Zip Spec      14 (20) '2.0'\n-F905D Created OS            03 (3) 'Unix'\n-F905E Extract Zip Spec      14 (20) '2.0'\n-F905F Extract OS            00 (0) 'MS-DOS'\n-F9060 General Purpose Flag  0800 (2048)\n+F9CC9 CENTRAL HEADER #405   02014B50 (33639248)\n+F9CCD Created Zip Spec      14 (20) '2.0'\n+F9CCE Created OS            03 (3) 'Unix'\n+F9CCF Extract Zip Spec      14 (20) '2.0'\n+F9CD0 Extract OS            00 (0) 'MS-DOS'\n+F9CD1 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-F9062 Compression Method    0008 (8) 'Deflated'\n-F9064 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F9068 CRC                   C7DF88BB (3353315515)\n-F906C Compressed Size       00001C38 (7224)\n-F9070 Uncompressed Size     00009335 (37685)\n-F9074 Filename Length       0077 (119)\n-F9076 Extra Length          0000 (0)\n-F9078 Comment Length        0000 (0)\n-F907A Disk Start            0000 (0)\n-F907C Int File Attributes   0000 (0)\n+F9CD3 Compression Method    0008 (8) 'Deflated'\n+F9CD5 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F9CD9 CRC                   C7DF88BB (3353315515)\n+F9CDD Compressed Size       00001C38 (7224)\n+F9CE1 Uncompressed Size     00009335 (37685)\n+F9CE5 Filename Length       0077 (119)\n+F9CE7 Extra Length          0000 (0)\n+F9CE9 Comment Length        0000 (0)\n+F9CEB Disk Start            0000 (0)\n+F9CED Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F907E Ext File Attributes   81A40000 (2175008768)\n+F9CEF Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-F9082 Local Header Offset   000406F5 (263925)\n-F9086 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F9CF3 Local Header Offset   00040ECC (265932)\n+F9CF7 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF9086: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF9CF7: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-F90FD CENTRAL HEADER #406   02014B50 (33639248)\n-F9101 Created Zip Spec      14 (20) '2.0'\n-F9102 Created OS            03 (3) 'Unix'\n-F9103 Extract Zip Spec      14 (20) '2.0'\n-F9104 Extract OS            00 (0) 'MS-DOS'\n-F9105 General Purpose Flag  0800 (2048)\n+F9D6E CENTRAL HEADER #406   02014B50 (33639248)\n+F9D72 Created Zip Spec      14 (20) '2.0'\n+F9D73 Created OS            03 (3) 'Unix'\n+F9D74 Extract Zip Spec      14 (20) '2.0'\n+F9D75 Extract OS            00 (0) 'MS-DOS'\n+F9D76 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-F9107 Compression Method    0008 (8) 'Deflated'\n-F9109 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F910D CRC                   217BBE0B (561757707)\n-F9111 Compressed Size       00000651 (1617)\n-F9115 Uncompressed Size     00001BB1 (7089)\n-F9119 Filename Length       0080 (128)\n-F911B Extra Length          0000 (0)\n-F911D Comment Length        0000 (0)\n-F911F Disk Start            0000 (0)\n-F9121 Int File Attributes   0000 (0)\n+F9D78 Compression Method    0008 (8) 'Deflated'\n+F9D7A Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F9D7E CRC                   217BBE0B (561757707)\n+F9D82 Compressed Size       00000651 (1617)\n+F9D86 Uncompressed Size     00001BB1 (7089)\n+F9D8A Filename Length       0080 (128)\n+F9D8C Extra Length          0000 (0)\n+F9D8E Comment Length        0000 (0)\n+F9D90 Disk Start            0000 (0)\n+F9D92 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F9123 Ext File Attributes   81A40000 (2175008768)\n+F9D94 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-F9127 Local Header Offset   000423C2 (271298)\n-F912B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F9D98 Local Header Offset   00042B99 (273305)\n+F9D9C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF912B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF9D9C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-F91AB CENTRAL HEADER #407   02014B50 (33639248)\n-F91AF Created Zip Spec      14 (20) '2.0'\n-F91B0 Created OS            03 (3) 'Unix'\n-F91B1 Extract Zip Spec      14 (20) '2.0'\n-F91B2 Extract OS            00 (0) 'MS-DOS'\n-F91B3 General Purpose Flag  0800 (2048)\n+F9E1C CENTRAL HEADER #407   02014B50 (33639248)\n+F9E20 Created Zip Spec      14 (20) '2.0'\n+F9E21 Created OS            03 (3) 'Unix'\n+F9E22 Extract Zip Spec      14 (20) '2.0'\n+F9E23 Extract OS            00 (0) 'MS-DOS'\n+F9E24 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-F91B5 Compression Method    0008 (8) 'Deflated'\n-F91B7 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F91BB CRC                   CF72F6D0 (3480418000)\n-F91BF Compressed Size       00001400 (5120)\n-F91C3 Uncompressed Size     00004A6A (19050)\n-F91C7 Filename Length       007D (125)\n-F91C9 Extra Length          0000 (0)\n-F91CB Comment Length        0000 (0)\n-F91CD Disk Start            0000 (0)\n-F91CF Int File Attributes   0000 (0)\n+F9E26 Compression Method    0008 (8) 'Deflated'\n+F9E28 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F9E2C CRC                   CF72F6D0 (3480418000)\n+F9E30 Compressed Size       00001400 (5120)\n+F9E34 Uncompressed Size     00004A6A (19050)\n+F9E38 Filename Length       007D (125)\n+F9E3A Extra Length          0000 (0)\n+F9E3C Comment Length        0000 (0)\n+F9E3E Disk Start            0000 (0)\n+F9E40 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F91D1 Ext File Attributes   81A40000 (2175008768)\n+F9E42 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-F91D5 Local Header Offset   00042AB1 (273073)\n-F91D9 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F9E46 Local Header Offset   00043288 (275080)\n+F9E4A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF91D9: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF9E4A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-F9256 CENTRAL HEADER #408   02014B50 (33639248)\n-F925A Created Zip Spec      14 (20) '2.0'\n-F925B Created OS            03 (3) 'Unix'\n-F925C Extract Zip Spec      14 (20) '2.0'\n-F925D Extract OS            00 (0) 'MS-DOS'\n-F925E General Purpose Flag  0800 (2048)\n+F9EC7 CENTRAL HEADER #408   02014B50 (33639248)\n+F9ECB Created Zip Spec      14 (20) '2.0'\n+F9ECC Created OS            03 (3) 'Unix'\n+F9ECD Extract Zip Spec      14 (20) '2.0'\n+F9ECE Extract OS            00 (0) 'MS-DOS'\n+F9ECF General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-F9260 Compression Method    0008 (8) 'Deflated'\n-F9262 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F9266 CRC                   DCEFA272 (3706692210)\n-F926A Compressed Size       0000049C (1180)\n-F926E Uncompressed Size     000009D3 (2515)\n-F9272 Filename Length       0080 (128)\n-F9274 Extra Length          0000 (0)\n-F9276 Comment Length        0000 (0)\n-F9278 Disk Start            0000 (0)\n-F927A Int File Attributes   0000 (0)\n+F9ED1 Compression Method    0008 (8) 'Deflated'\n+F9ED3 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F9ED7 CRC                   DCEFA272 (3706692210)\n+F9EDB Compressed Size       0000049C (1180)\n+F9EDF Uncompressed Size     000009D3 (2515)\n+F9EE3 Filename Length       0080 (128)\n+F9EE5 Extra Length          0000 (0)\n+F9EE7 Comment Length        0000 (0)\n+F9EE9 Disk Start            0000 (0)\n+F9EEB Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F927C Ext File Attributes   81A40000 (2175008768)\n+F9EED Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-F9280 Local Header Offset   00043F4C (278348)\n-F9284 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F9EF1 Local Header Offset   00044723 (280355)\n+F9EF5 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF9284: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF9EF5: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-F9304 CENTRAL HEADER #409   02014B50 (33639248)\n-F9308 Created Zip Spec      14 (20) '2.0'\n-F9309 Created OS            03 (3) 'Unix'\n-F930A Extract Zip Spec      14 (20) '2.0'\n-F930B Extract OS            00 (0) 'MS-DOS'\n-F930C General Purpose Flag  0800 (2048)\n+F9F75 CENTRAL HEADER #409   02014B50 (33639248)\n+F9F79 Created Zip Spec      14 (20) '2.0'\n+F9F7A Created OS            03 (3) 'Unix'\n+F9F7B Extract Zip Spec      14 (20) '2.0'\n+F9F7C Extract OS            00 (0) 'MS-DOS'\n+F9F7D General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-F930E Compression Method    0008 (8) 'Deflated'\n-F9310 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F9314 CRC                   26E963FE (652829694)\n-F9318 Compressed Size       0000080C (2060)\n-F931C Uncompressed Size     00001276 (4726)\n-F9320 Filename Length       0082 (130)\n-F9322 Extra Length          0000 (0)\n-F9324 Comment Length        0000 (0)\n-F9326 Disk Start            0000 (0)\n-F9328 Int File Attributes   0000 (0)\n+F9F7F Compression Method    0008 (8) 'Deflated'\n+F9F81 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+F9F85 CRC                   26E963FE (652829694)\n+F9F89 Compressed Size       0000080C (2060)\n+F9F8D Uncompressed Size     00001276 (4726)\n+F9F91 Filename Length       0082 (130)\n+F9F93 Extra Length          0000 (0)\n+F9F95 Comment Length        0000 (0)\n+F9F97 Disk Start            0000 (0)\n+F9F99 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F932A Ext File Attributes   81A40000 (2175008768)\n+F9F9B Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-F932E Local Header Offset   00044486 (279686)\n-F9332 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+F9F9F Local Header Offset   00044C5D (281693)\n+F9FA3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF9332: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF9FA3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-F93B4 CENTRAL HEADER #410   02014B50 (33639248)\n-F93B8 Created Zip Spec      14 (20) '2.0'\n-F93B9 Created OS            03 (3) 'Unix'\n-F93BA Extract Zip Spec      14 (20) '2.0'\n-F93BB Extract OS            00 (0) 'MS-DOS'\n-F93BC General Purpose Flag  0800 (2048)\n+FA025 CENTRAL HEADER #410   02014B50 (33639248)\n+FA029 Created Zip Spec      14 (20) '2.0'\n+FA02A Created OS            03 (3) 'Unix'\n+FA02B Extract Zip Spec      14 (20) '2.0'\n+FA02C Extract OS            00 (0) 'MS-DOS'\n+FA02D General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-F93BE Compression Method    0008 (8) 'Deflated'\n-F93C0 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F93C4 CRC                   6B96B8CE (1805039822)\n-F93C8 Compressed Size       00001EEB (7915)\n-F93CC Uncompressed Size     00008944 (35140)\n-F93D0 Filename Length       0075 (117)\n-F93D2 Extra Length          0000 (0)\n-F93D4 Comment Length        0000 (0)\n-F93D6 Disk Start            0000 (0)\n-F93D8 Int File Attributes   0000 (0)\n+FA02F Compression Method    0008 (8) 'Deflated'\n+FA031 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+FA035 CRC                   6B96B8CE (1805039822)\n+FA039 Compressed Size       00001EEB (7915)\n+FA03D Uncompressed Size     00008944 (35140)\n+FA041 Filename Length       0075 (117)\n+FA043 Extra Length          0000 (0)\n+FA045 Comment Length        0000 (0)\n+FA047 Disk Start            0000 (0)\n+FA049 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F93DA Ext File Attributes   81A40000 (2175008768)\n+FA04B Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-F93DE Local Header Offset   00044D32 (281906)\n-F93E2 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+FA04F Local Header Offset   00045509 (283913)\n+FA053 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF93E2: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xFA053: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-F9457 CENTRAL HEADER #411   02014B50 (33639248)\n-F945B Created Zip Spec      14 (20) '2.0'\n-F945C Created OS            03 (3) 'Unix'\n-F945D Extract Zip Spec      14 (20) '2.0'\n-F945E Extract OS            00 (0) 'MS-DOS'\n-F945F General Purpose Flag  0800 (2048)\n+FA0C8 CENTRAL HEADER #411   02014B50 (33639248)\n+FA0CC Created Zip Spec      14 (20) '2.0'\n+FA0CD Created OS            03 (3) 'Unix'\n+FA0CE Extract Zip Spec      14 (20) '2.0'\n+FA0CF Extract OS            00 (0) 'MS-DOS'\n+FA0D0 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-F9461 Compression Method    0008 (8) 'Deflated'\n-F9463 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F9467 CRC                   DB2A8543 (3676996931)\n-F946B Compressed Size       000009EE (2542)\n-F946F Uncompressed Size     00001C3A (7226)\n-F9473 Filename Length       007C (124)\n-F9475 Extra Length          0000 (0)\n-F9477 Comment Length        0000 (0)\n-F9479 Disk Start            0000 (0)\n-F947B Int File Attributes   0000 (0)\n+FA0D2 Compression Method    0008 (8) 'Deflated'\n+FA0D4 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+FA0D8 CRC                   DB2A8543 (3676996931)\n+FA0DC Compressed Size       000009EE (2542)\n+FA0E0 Uncompressed Size     00001C3A (7226)\n+FA0E4 Filename Length       007C (124)\n+FA0E6 Extra Length          0000 (0)\n+FA0E8 Comment Length        0000 (0)\n+FA0EA Disk Start            0000 (0)\n+FA0EC Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F947D Ext File Attributes   81A40000 (2175008768)\n+FA0EE Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-F9481 Local Header Offset   00046CB0 (289968)\n-F9485 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+FA0F2 Local Header Offset   00047487 (291975)\n+FA0F6 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF9485: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xFA0F6: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-F9501 CENTRAL HEADER #412   02014B50 (33639248)\n-F9505 Created Zip Spec      14 (20) '2.0'\n-F9506 Created OS            03 (3) 'Unix'\n-F9507 Extract Zip Spec      14 (20) '2.0'\n-F9508 Extract OS            00 (0) 'MS-DOS'\n-F9509 General Purpose Flag  0800 (2048)\n+FA172 CENTRAL HEADER #412   02014B50 (33639248)\n+FA176 Created Zip Spec      14 (20) '2.0'\n+FA177 Created OS            03 (3) 'Unix'\n+FA178 Extract Zip Spec      14 (20) '2.0'\n+FA179 Extract OS            00 (0) 'MS-DOS'\n+FA17A General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-F950B Compression Method    0008 (8) 'Deflated'\n-F950D Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F9511 CRC                   FF5BC4DC (4284204252)\n-F9515 Compressed Size       00000883 (2179)\n-F9519 Uncompressed Size     00001552 (5458)\n-F951D Filename Length       007F (127)\n-F951F Extra Length          0000 (0)\n-F9521 Comment Length        0000 (0)\n-F9523 Disk Start            0000 (0)\n-F9525 Int File Attributes   0000 (0)\n+FA17C Compression Method    0008 (8) 'Deflated'\n+FA17E Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+FA182 CRC                   FF5BC4DC (4284204252)\n+FA186 Compressed Size       00000883 (2179)\n+FA18A Uncompressed Size     00001552 (5458)\n+FA18E Filename Length       007F (127)\n+FA190 Extra Length          0000 (0)\n+FA192 Comment Length        0000 (0)\n+FA194 Disk Start            0000 (0)\n+FA196 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F9527 Ext File Attributes   81A40000 (2175008768)\n+FA198 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-F952B Local Header Offset   00047738 (292664)\n-F952F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+FA19C Local Header Offset   00047F0F (294671)\n+FA1A0 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF952F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xFA1A0: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-F95AE CENTRAL HEADER #413   02014B50 (33639248)\n-F95B2 Created Zip Spec      14 (20) '2.0'\n-F95B3 Created OS            03 (3) 'Unix'\n-F95B4 Extract Zip Spec      14 (20) '2.0'\n-F95B5 Extract OS            00 (0) 'MS-DOS'\n-F95B6 General Purpose Flag  0800 (2048)\n+FA21F CENTRAL HEADER #413   02014B50 (33639248)\n+FA223 Created Zip Spec      14 (20) '2.0'\n+FA224 Created OS            03 (3) 'Unix'\n+FA225 Extract Zip Spec      14 (20) '2.0'\n+FA226 Extract OS            00 (0) 'MS-DOS'\n+FA227 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-F95B8 Compression Method    0008 (8) 'Deflated'\n-F95BA Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F95BE CRC                   D6140D51 (3591638353)\n-F95C2 Compressed Size       00001350 (4944)\n-F95C6 Uncompressed Size     00003C2C (15404)\n-F95CA Filename Length       007F (127)\n-F95CC Extra Length          0000 (0)\n-F95CE Comment Length        0000 (0)\n-F95D0 Disk Start            0000 (0)\n-F95D2 Int File Attributes   0000 (0)\n+FA229 Compression Method    0008 (8) 'Deflated'\n+FA22B Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+FA22F CRC                   D6140D51 (3591638353)\n+FA233 Compressed Size       00001350 (4944)\n+FA237 Uncompressed Size     00003C2C (15404)\n+FA23B Filename Length       007F (127)\n+FA23D Extra Length          0000 (0)\n+FA23F Comment Length        0000 (0)\n+FA241 Disk Start            0000 (0)\n+FA243 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F95D4 Ext File Attributes   81A40000 (2175008768)\n+FA245 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-F95D8 Local Header Offset   00048058 (295000)\n-F95DC Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+FA249 Local Header Offset   0004882F (297007)\n+FA24D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF95DC: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xFA24D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-F965B CENTRAL HEADER #414   02014B50 (33639248)\n-F965F Created Zip Spec      14 (20) '2.0'\n-F9660 Created OS            03 (3) 'Unix'\n-F9661 Extract Zip Spec      14 (20) '2.0'\n-F9662 Extract OS            00 (0) 'MS-DOS'\n-F9663 General Purpose Flag  0800 (2048)\n+FA2CC CENTRAL HEADER #414   02014B50 (33639248)\n+FA2D0 Created Zip Spec      14 (20) '2.0'\n+FA2D1 Created OS            03 (3) 'Unix'\n+FA2D2 Extract Zip Spec      14 (20) '2.0'\n+FA2D3 Extract OS            00 (0) 'MS-DOS'\n+FA2D4 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-F9665 Compression Method    0008 (8) 'Deflated'\n-F9667 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F966B CRC                   86CE2079 (2261655673)\n-F966F Compressed Size       00000AC2 (2754)\n-F9673 Uncompressed Size     00002162 (8546)\n-F9677 Filename Length       007E (126)\n-F9679 Extra Length          0000 (0)\n-F967B Comment Length        0000 (0)\n-F967D Disk Start            0000 (0)\n-F967F Int File Attributes   0000 (0)\n+FA2D6 Compression Method    0008 (8) 'Deflated'\n+FA2D8 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+FA2DC CRC                   86CE2079 (2261655673)\n+FA2E0 Compressed Size       00000AC2 (2754)\n+FA2E4 Uncompressed Size     00002162 (8546)\n+FA2E8 Filename Length       007E (126)\n+FA2EA Extra Length          0000 (0)\n+FA2EC Comment Length        0000 (0)\n+FA2EE Disk Start            0000 (0)\n+FA2F0 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F9681 Ext File Attributes   81A40000 (2175008768)\n+FA2F2 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-F9685 Local Header Offset   00049445 (300101)\n-F9689 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+FA2F6 Local Header Offset   00049C1C (302108)\n+FA2FA Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF9689: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xFA2FA: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-F9707 CENTRAL HEADER #415   02014B50 (33639248)\n-F970B Created Zip Spec      14 (20) '2.0'\n-F970C Created OS            03 (3) 'Unix'\n-F970D Extract Zip Spec      14 (20) '2.0'\n-F970E Extract OS            00 (0) 'MS-DOS'\n-F970F General Purpose Flag  0800 (2048)\n+FA378 CENTRAL HEADER #415   02014B50 (33639248)\n+FA37C Created Zip Spec      14 (20) '2.0'\n+FA37D Created OS            03 (3) 'Unix'\n+FA37E Extract Zip Spec      14 (20) '2.0'\n+FA37F Extract OS            00 (0) 'MS-DOS'\n+FA380 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-F9711 Compression Method    0008 (8) 'Deflated'\n-F9713 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F9717 CRC                   B12610E6 (2972061926)\n-F971B Compressed Size       00000441 (1089)\n-F971F Uncompressed Size     00000A5B (2651)\n-F9723 Filename Length       0071 (113)\n-F9725 Extra Length          0000 (0)\n-F9727 Comment Length        0000 (0)\n-F9729 Disk Start            0000 (0)\n-F972B Int File Attributes   0000 (0)\n+FA382 Compression Method    0008 (8) 'Deflated'\n+FA384 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+FA388 CRC                   B12610E6 (2972061926)\n+FA38C Compressed Size       00000441 (1089)\n+FA390 Uncompressed Size     00000A5B (2651)\n+FA394 Filename Length       0071 (113)\n+FA396 Extra Length          0000 (0)\n+FA398 Comment Length        0000 (0)\n+FA39A Disk Start            0000 (0)\n+FA39C Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F972D Ext File Attributes   81A40000 (2175008768)\n+FA39E Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-F9731 Local Header Offset   00049FA3 (303011)\n-F9735 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+FA3A2 Local Header Offset   0004A77A (305018)\n+FA3A6 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF9735: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xFA3A6: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-F97A6 CENTRAL HEADER #416   02014B50 (33639248)\n-F97AA Created Zip Spec      14 (20) '2.0'\n-F97AB Created OS            03 (3) 'Unix'\n-F97AC Extract Zip Spec      14 (20) '2.0'\n-F97AD Extract OS            00 (0) 'MS-DOS'\n-F97AE General Purpose Flag  0800 (2048)\n+FA417 CENTRAL HEADER #416   02014B50 (33639248)\n+FA41B Created Zip Spec      14 (20) '2.0'\n+FA41C Created OS            03 (3) 'Unix'\n+FA41D Extract Zip Spec      14 (20) '2.0'\n+FA41E Extract OS            00 (0) 'MS-DOS'\n+FA41F General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-F97B0 Compression Method    0008 (8) 'Deflated'\n-F97B2 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F97B6 CRC                   041CE92B (69003563)\n-F97BA Compressed Size       0000046E (1134)\n-F97BE Uncompressed Size     00000B22 (2850)\n-F97C2 Filename Length       008C (140)\n-F97C4 Extra Length          0000 (0)\n-F97C6 Comment Length        0000 (0)\n-F97C8 Disk Start            0000 (0)\n-F97CA Int File Attributes   0000 (0)\n+FA421 Compression Method    0008 (8) 'Deflated'\n+FA423 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+FA427 CRC                   041CE92B (69003563)\n+FA42B Compressed Size       0000046E (1134)\n+FA42F Uncompressed Size     00000B22 (2850)\n+FA433 Filename Length       008C (140)\n+FA435 Extra Length          0000 (0)\n+FA437 Comment Length        0000 (0)\n+FA439 Disk Start            0000 (0)\n+FA43B Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F97CC Ext File Attributes   81A40000 (2175008768)\n+FA43D Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-F97D0 Local Header Offset   0004A473 (304243)\n-F97D4 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+FA441 Local Header Offset   0004AC4A (306250)\n+FA445 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             XXXXXXXX'\n #\n-# WARNING: Offset 0xF97D4: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xFA445: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-F9860 CENTRAL HEADER #417   02014B50 (33639248)\n-F9864 Created Zip Spec      14 (20) '2.0'\n-F9865 Created OS            03 (3) 'Unix'\n-F9866 Extract Zip Spec      14 (20) '2.0'\n-F9867 Extract OS            00 (0) 'MS-DOS'\n-F9868 General Purpose Flag  0800 (2048)\n+FA4D1 CENTRAL HEADER #417   02014B50 (33639248)\n+FA4D5 Created Zip Spec      14 (20) '2.0'\n+FA4D6 Created OS            03 (3) 'Unix'\n+FA4D7 Extract Zip Spec      14 (20) '2.0'\n+FA4D8 Extract OS            00 (0) 'MS-DOS'\n+FA4D9 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-F986A Compression Method    0008 (8) 'Deflated'\n-F986C Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F9870 CRC                   16A4BA93 (379894419)\n-F9874 Compressed Size       000006D2 (1746)\n-F9878 Uncompressed Size     000016E4 (5860)\n-F987C Filename Length       008B (139)\n-F987E Extra Length          0000 (0)\n-F9880 Comment Length        0000 (0)\n-F9882 Disk Start            0000 (0)\n-F9884 Int File Attributes   0000 (0)\n+FA4DB Compression Method    0008 (8) 'Deflated'\n+FA4DD Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+FA4E1 CRC                   16A4BA93 (379894419)\n+FA4E5 Compressed Size       000006D2 (1746)\n+FA4E9 Uncompressed Size     000016E4 (5860)\n+FA4ED Filename Length       008B (139)\n+FA4EF Extra Length          0000 (0)\n+FA4F1 Comment Length        0000 (0)\n+FA4F3 Disk Start            0000 (0)\n+FA4F5 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F9886 Ext File Attributes   81A40000 (2175008768)\n+FA4F7 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-F988A Local Header Offset   0004A98B (305547)\n-F988E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+FA4FB Local Header Offset   0004B162 (307554)\n+FA4FF Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             XXXXXXX'\n #\n-# WARNING: Offset 0xF988E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xFA4FF: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-F9919 CENTRAL HEADER #418   02014B50 (33639248)\n-F991D Created Zip Spec      14 (20) '2.0'\n-F991E Created OS            03 (3) 'Unix'\n-F991F Extract Zip Spec      14 (20) '2.0'\n-F9920 Extract OS            00 (0) 'MS-DOS'\n-F9921 General Purpose Flag  0800 (2048)\n+FA58A CENTRAL HEADER #418   02014B50 (33639248)\n+FA58E Created Zip Spec      14 (20) '2.0'\n+FA58F Created OS            03 (3) 'Unix'\n+FA590 Extract Zip Spec      14 (20) '2.0'\n+FA591 Extract OS            00 (0) 'MS-DOS'\n+FA592 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-F9923 Compression Method    0008 (8) 'Deflated'\n-F9925 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F9929 CRC                   390AB403 (957002755)\n-F992D Compressed Size       000005D3 (1491)\n-F9931 Uncompressed Size     00001068 (4200)\n-F9935 Filename Length       008E (142)\n-F9937 Extra Length          0000 (0)\n-F9939 Comment Length        0000 (0)\n-F993B Disk Start            0000 (0)\n-F993D Int File Attributes   0000 (0)\n+FA594 Compression Method    0008 (8) 'Deflated'\n+FA596 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+FA59A CRC                   390AB403 (957002755)\n+FA59E Compressed Size       000005D3 (1491)\n+FA5A2 Uncompressed Size     00001068 (4200)\n+FA5A6 Filename Length       008E (142)\n+FA5A8 Extra Length          0000 (0)\n+FA5AA Comment Length        0000 (0)\n+FA5AC Disk Start            0000 (0)\n+FA5AE Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F993F Ext File Attributes   81A40000 (2175008768)\n+FA5B0 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-F9943 Local Header Offset   0004B106 (307462)\n-F9947 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+FA5B4 Local Header Offset   0004B8DD (309469)\n+FA5B8 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             XXXXXXXXXX'\n #\n-# WARNING: Offset 0xF9947: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xFA5B8: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-F99D5 CENTRAL HEADER #419   02014B50 (33639248)\n-F99D9 Created Zip Spec      14 (20) '2.0'\n-F99DA Created OS            03 (3) 'Unix'\n-F99DB Extract Zip Spec      14 (20) '2.0'\n-F99DC Extract OS            00 (0) 'MS-DOS'\n-F99DD General Purpose Flag  0800 (2048)\n+FA646 CENTRAL HEADER #419   02014B50 (33639248)\n+FA64A Created Zip Spec      14 (20) '2.0'\n+FA64B Created OS            03 (3) 'Unix'\n+FA64C Extract Zip Spec      14 (20) '2.0'\n+FA64D Extract OS            00 (0) 'MS-DOS'\n+FA64E General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-F99DF Compression Method    0008 (8) 'Deflated'\n-F99E1 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F99E5 CRC                   3DE98548 (1038714184)\n-F99E9 Compressed Size       0000064F (1615)\n-F99ED Uncompressed Size     000016AA (5802)\n-F99F1 Filename Length       008A (138)\n-F99F3 Extra Length          0000 (0)\n-F99F5 Comment Length        0000 (0)\n-F99F7 Disk Start            0000 (0)\n-F99F9 Int File Attributes   0000 (0)\n+FA650 Compression Method    0008 (8) 'Deflated'\n+FA652 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+FA656 CRC                   3DE98548 (1038714184)\n+FA65A Compressed Size       0000064F (1615)\n+FA65E Uncompressed Size     000016AA (5802)\n+FA662 Filename Length       008A (138)\n+FA664 Extra Length          0000 (0)\n+FA666 Comment Length        0000 (0)\n+FA668 Disk Start            0000 (0)\n+FA66A Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F99FB Ext File Attributes   81A40000 (2175008768)\n+FA66C Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-F99FF Local Header Offset   0004B785 (309125)\n-F9A03 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+FA670 Local Header Offset   0004BF5C (311132)\n+FA674 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             XXXXXX'\n #\n-# WARNING: Offset 0xF9A03: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xFA674: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-F9A8D CENTRAL HEADER #420   02014B50 (33639248)\n-F9A91 Created Zip Spec      14 (20) '2.0'\n-F9A92 Created OS            03 (3) 'Unix'\n-F9A93 Extract Zip Spec      14 (20) '2.0'\n-F9A94 Extract OS            00 (0) 'MS-DOS'\n-F9A95 General Purpose Flag  0800 (2048)\n+FA6FE CENTRAL HEADER #420   02014B50 (33639248)\n+FA702 Created Zip Spec      14 (20) '2.0'\n+FA703 Created OS            03 (3) 'Unix'\n+FA704 Extract Zip Spec      14 (20) '2.0'\n+FA705 Extract OS            00 (0) 'MS-DOS'\n+FA706 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-F9A97 Compression Method    0008 (8) 'Deflated'\n-F9A99 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F9A9D CRC                   F32265E7 (4079117799)\n-F9AA1 Compressed Size       00000776 (1910)\n-F9AA5 Uncompressed Size     00001595 (5525)\n-F9AA9 Filename Length       006C (108)\n-F9AAB Extra Length          0000 (0)\n-F9AAD Comment Length        0000 (0)\n-F9AAF Disk Start            0000 (0)\n-F9AB1 Int File Attributes   0000 (0)\n+FA708 Compression Method    0008 (8) 'Deflated'\n+FA70A Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+FA70E CRC                   F32265E7 (4079117799)\n+FA712 Compressed Size       00000776 (1910)\n+FA716 Uncompressed Size     00001595 (5525)\n+FA71A Filename Length       006C (108)\n+FA71C Extra Length          0000 (0)\n+FA71E Comment Length        0000 (0)\n+FA720 Disk Start            0000 (0)\n+FA722 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F9AB3 Ext File Attributes   81A40000 (2175008768)\n+FA724 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-F9AB7 Local Header Offset   0004BE7C (310908)\n-F9ABB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+FA728 Local Header Offset   0004C653 (312915)\n+FA72C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF9ABB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xFA72C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-F9B27 CENTRAL HEADER #421   02014B50 (33639248)\n-F9B2B Created Zip Spec      14 (20) '2.0'\n-F9B2C Created OS            03 (3) 'Unix'\n-F9B2D Extract Zip Spec      14 (20) '2.0'\n-F9B2E Extract OS            00 (0) 'MS-DOS'\n-F9B2F General Purpose Flag  0800 (2048)\n+FA798 CENTRAL HEADER #421   02014B50 (33639248)\n+FA79C Created Zip Spec      14 (20) '2.0'\n+FA79D Created OS            03 (3) 'Unix'\n+FA79E Extract Zip Spec      14 (20) '2.0'\n+FA79F Extract OS            00 (0) 'MS-DOS'\n+FA7A0 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-F9B31 Compression Method    0008 (8) 'Deflated'\n-F9B33 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F9B37 CRC                   33231FD5 (857939925)\n-F9B3B Compressed Size       0000082D (2093)\n-F9B3F Uncompressed Size     00001399 (5017)\n-F9B43 Filename Length       006F (111)\n-F9B45 Extra Length          0000 (0)\n-F9B47 Comment Length        0000 (0)\n-F9B49 Disk Start            0000 (0)\n-F9B4B Int File Attributes   0000 (0)\n+FA7A2 Compression Method    0008 (8) 'Deflated'\n+FA7A4 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+FA7A8 CRC                   33231FD5 (857939925)\n+FA7AC Compressed Size       0000082D (2093)\n+FA7B0 Uncompressed Size     00001399 (5017)\n+FA7B4 Filename Length       006F (111)\n+FA7B6 Extra Length          0000 (0)\n+FA7B8 Comment Length        0000 (0)\n+FA7BA Disk Start            0000 (0)\n+FA7BC Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F9B4D Ext File Attributes   81A40000 (2175008768)\n+FA7BE Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-F9B51 Local Header Offset   0004C67C (312956)\n-F9B55 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+FA7C2 Local Header Offset   0004CE53 (314963)\n+FA7C6 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF9B55: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xFA7C6: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-F9BC4 CENTRAL HEADER #422   02014B50 (33639248)\n-F9BC8 Created Zip Spec      14 (20) '2.0'\n-F9BC9 Created OS            03 (3) 'Unix'\n-F9BCA Extract Zip Spec      14 (20) '2.0'\n-F9BCB Extract OS            00 (0) 'MS-DOS'\n-F9BCC General Purpose Flag  0800 (2048)\n+FA835 CENTRAL HEADER #422   02014B50 (33639248)\n+FA839 Created Zip Spec      14 (20) '2.0'\n+FA83A Created OS            03 (3) 'Unix'\n+FA83B Extract Zip Spec      14 (20) '2.0'\n+FA83C Extract OS            00 (0) 'MS-DOS'\n+FA83D General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-F9BCE Compression Method    0008 (8) 'Deflated'\n-F9BD0 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F9BD4 CRC                   62A57B9F (1655012255)\n-F9BD8 Compressed Size       000004A9 (1193)\n-F9BDC Uncompressed Size     00000AFB (2811)\n-F9BE0 Filename Length       006B (107)\n-F9BE2 Extra Length          0000 (0)\n-F9BE4 Comment Length        0000 (0)\n-F9BE6 Disk Start            0000 (0)\n-F9BE8 Int File Attributes   0000 (0)\n+FA83F Compression Method    0008 (8) 'Deflated'\n+FA841 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+FA845 CRC                   62A57B9F (1655012255)\n+FA849 Compressed Size       000004A9 (1193)\n+FA84D Uncompressed Size     00000AFB (2811)\n+FA851 Filename Length       006B (107)\n+FA853 Extra Length          0000 (0)\n+FA855 Comment Length        0000 (0)\n+FA857 Disk Start            0000 (0)\n+FA859 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F9BEA Ext File Attributes   81A40000 (2175008768)\n+FA85B Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-F9BEE Local Header Offset   0004CF36 (315190)\n-F9BF2 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+FA85F Local Header Offset   0004D70D (317197)\n+FA863 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF9BF2: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xFA863: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-F9C5D CENTRAL HEADER #423   02014B50 (33639248)\n-F9C61 Created Zip Spec      14 (20) '2.0'\n-F9C62 Created OS            03 (3) 'Unix'\n-F9C63 Extract Zip Spec      14 (20) '2.0'\n-F9C64 Extract OS            00 (0) 'MS-DOS'\n-F9C65 General Purpose Flag  0800 (2048)\n+FA8CE CENTRAL HEADER #423   02014B50 (33639248)\n+FA8D2 Created Zip Spec      14 (20) '2.0'\n+FA8D3 Created OS            03 (3) 'Unix'\n+FA8D4 Extract Zip Spec      14 (20) '2.0'\n+FA8D5 Extract OS            00 (0) 'MS-DOS'\n+FA8D6 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-F9C67 Compression Method    0008 (8) 'Deflated'\n-F9C69 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F9C6D CRC                   63C353AF (1673745327)\n-F9C71 Compressed Size       000005DA (1498)\n-F9C75 Uncompressed Size     00000CF8 (3320)\n-F9C79 Filename Length       0068 (104)\n-F9C7B Extra Length          0000 (0)\n-F9C7D Comment Length        0000 (0)\n-F9C7F Disk Start            0000 (0)\n-F9C81 Int File Attributes   0000 (0)\n+FA8D8 Compression Method    0008 (8) 'Deflated'\n+FA8DA Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+FA8DE CRC                   63C353AF (1673745327)\n+FA8E2 Compressed Size       000005DA (1498)\n+FA8E6 Uncompressed Size     00000CF8 (3320)\n+FA8EA Filename Length       0068 (104)\n+FA8EC Extra Length          0000 (0)\n+FA8EE Comment Length        0000 (0)\n+FA8F0 Disk Start            0000 (0)\n+FA8F2 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F9C83 Ext File Attributes   81A40000 (2175008768)\n+FA8F4 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-F9C87 Local Header Offset   0004D468 (316520)\n-F9C8B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+FA8F8 Local Header Offset   0004DC3F (318527)\n+FA8FC Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF9C8B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xFA8FC: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-F9CF3 CENTRAL HEADER #424   02014B50 (33639248)\n-F9CF7 Created Zip Spec      14 (20) '2.0'\n-F9CF8 Created OS            03 (3) 'Unix'\n-F9CF9 Extract Zip Spec      14 (20) '2.0'\n-F9CFA Extract OS            00 (0) 'MS-DOS'\n-F9CFB General Purpose Flag  0800 (2048)\n+FA964 CENTRAL HEADER #424   02014B50 (33639248)\n+FA968 Created Zip Spec      14 (20) '2.0'\n+FA969 Created OS            03 (3) 'Unix'\n+FA96A Extract Zip Spec      14 (20) '2.0'\n+FA96B Extract OS            00 (0) 'MS-DOS'\n+FA96C General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-F9CFD Compression Method    0008 (8) 'Deflated'\n-F9CFF Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F9D03 CRC                   C64481A5 (3326378405)\n-F9D07 Compressed Size       000003AA (938)\n-F9D0B Uncompressed Size     00000723 (1827)\n-F9D0F Filename Length       006F (111)\n-F9D11 Extra Length          0000 (0)\n-F9D13 Comment Length        0000 (0)\n-F9D15 Disk Start            0000 (0)\n-F9D17 Int File Attributes   0000 (0)\n+FA96E Compression Method    0008 (8) 'Deflated'\n+FA970 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+FA974 CRC                   C64481A5 (3326378405)\n+FA978 Compressed Size       000003AA (938)\n+FA97C Uncompressed Size     00000723 (1827)\n+FA980 Filename Length       006F (111)\n+FA982 Extra Length          0000 (0)\n+FA984 Comment Length        0000 (0)\n+FA986 Disk Start            0000 (0)\n+FA988 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F9D19 Ext File Attributes   81A40000 (2175008768)\n+FA98A Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-F9D1D Local Header Offset   0004DAC8 (318152)\n-F9D21 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+FA98E Local Header Offset   0004E29F (320159)\n+FA992 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF9D21: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xFA992: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-F9D90 CENTRAL HEADER #425   02014B50 (33639248)\n-F9D94 Created Zip Spec      14 (20) '2.0'\n-F9D95 Created OS            03 (3) 'Unix'\n-F9D96 Extract Zip Spec      14 (20) '2.0'\n-F9D97 Extract OS            00 (0) 'MS-DOS'\n-F9D98 General Purpose Flag  0800 (2048)\n+FAA01 CENTRAL HEADER #425   02014B50 (33639248)\n+FAA05 Created Zip Spec      14 (20) '2.0'\n+FAA06 Created OS            03 (3) 'Unix'\n+FAA07 Extract Zip Spec      14 (20) '2.0'\n+FAA08 Extract OS            00 (0) 'MS-DOS'\n+FAA09 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-F9D9A Compression Method    0008 (8) 'Deflated'\n-F9D9C Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F9DA0 CRC                   39649106 (962892038)\n-F9DA4 Compressed Size       0000039E (926)\n-F9DA8 Uncompressed Size     000006E2 (1762)\n-F9DAC Filename Length       006D (109)\n-F9DAE Extra Length          0000 (0)\n-F9DB0 Comment Length        0000 (0)\n-F9DB2 Disk Start            0000 (0)\n-F9DB4 Int File Attributes   0000 (0)\n+FAA0B Compression Method    0008 (8) 'Deflated'\n+FAA0D Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+FAA11 CRC                   39649106 (962892038)\n+FAA15 Compressed Size       0000039E (926)\n+FAA19 Uncompressed Size     000006E2 (1762)\n+FAA1D Filename Length       006D (109)\n+FAA1F Extra Length          0000 (0)\n+FAA21 Comment Length        0000 (0)\n+FAA23 Disk Start            0000 (0)\n+FAA25 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F9DB6 Ext File Attributes   81A40000 (2175008768)\n+FAA27 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-F9DBA Local Header Offset   0004DEFF (319231)\n-F9DBE Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+FAA2B Local Header Offset   0004E6D6 (321238)\n+FAA2F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF9DBE: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xFAA2F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-F9E2B CENTRAL HEADER #426   02014B50 (33639248)\n-F9E2F Created Zip Spec      14 (20) '2.0'\n-F9E30 Created OS            03 (3) 'Unix'\n-F9E31 Extract Zip Spec      14 (20) '2.0'\n-F9E32 Extract OS            00 (0) 'MS-DOS'\n-F9E33 General Purpose Flag  0800 (2048)\n+FAA9C CENTRAL HEADER #426   02014B50 (33639248)\n+FAAA0 Created Zip Spec      14 (20) '2.0'\n+FAAA1 Created OS            03 (3) 'Unix'\n+FAAA2 Extract Zip Spec      14 (20) '2.0'\n+FAAA3 Extract OS            00 (0) 'MS-DOS'\n+FAAA4 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-F9E35 Compression Method    0008 (8) 'Deflated'\n-F9E37 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F9E3B CRC                   8DC8B44C (2378740812)\n-F9E3F Compressed Size       000003E3 (995)\n-F9E43 Uncompressed Size     00000782 (1922)\n-F9E47 Filename Length       0068 (104)\n-F9E49 Extra Length          0000 (0)\n-F9E4B Comment Length        0000 (0)\n-F9E4D Disk Start            0000 (0)\n-F9E4F Int File Attributes   0000 (0)\n+FAAA6 Compression Method    0008 (8) 'Deflated'\n+FAAA8 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+FAAAC CRC                   8DC8B44C (2378740812)\n+FAAB0 Compressed Size       000003E3 (995)\n+FAAB4 Uncompressed Size     00000782 (1922)\n+FAAB8 Filename Length       0068 (104)\n+FAABA Extra Length          0000 (0)\n+FAABC Comment Length        0000 (0)\n+FAABE Disk Start            0000 (0)\n+FAAC0 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F9E51 Ext File Attributes   81A40000 (2175008768)\n+FAAC2 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-F9E55 Local Header Offset   0004E328 (320296)\n-F9E59 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+FAAC6 Local Header Offset   0004EAFF (322303)\n+FAACA Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF9E59: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xFAACA: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-F9EC1 CENTRAL HEADER #427   02014B50 (33639248)\n-F9EC5 Created Zip Spec      14 (20) '2.0'\n-F9EC6 Created OS            03 (3) 'Unix'\n-F9EC7 Extract Zip Spec      14 (20) '2.0'\n-F9EC8 Extract OS            00 (0) 'MS-DOS'\n-F9EC9 General Purpose Flag  0800 (2048)\n+FAB32 CENTRAL HEADER #427   02014B50 (33639248)\n+FAB36 Created Zip Spec      14 (20) '2.0'\n+FAB37 Created OS            03 (3) 'Unix'\n+FAB38 Extract Zip Spec      14 (20) '2.0'\n+FAB39 Extract OS            00 (0) 'MS-DOS'\n+FAB3A General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-F9ECB Compression Method    0008 (8) 'Deflated'\n-F9ECD Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F9ED1 CRC                   605D4301 (1616724737)\n-F9ED5 Compressed Size       0000049B (1179)\n-F9ED9 Uncompressed Size     00000914 (2324)\n-F9EDD Filename Length       0068 (104)\n-F9EDF Extra Length          0000 (0)\n-F9EE1 Comment Length        0000 (0)\n-F9EE3 Disk Start            0000 (0)\n-F9EE5 Int File Attributes   0000 (0)\n+FAB3C Compression Method    0008 (8) 'Deflated'\n+FAB3E Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+FAB42 CRC                   605D4301 (1616724737)\n+FAB46 Compressed Size       0000049B (1179)\n+FAB4A Uncompressed Size     00000914 (2324)\n+FAB4E Filename Length       0068 (104)\n+FAB50 Extra Length          0000 (0)\n+FAB52 Comment Length        0000 (0)\n+FAB54 Disk Start            0000 (0)\n+FAB56 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F9EE7 Ext File Attributes   81A40000 (2175008768)\n+FAB58 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-F9EEB Local Header Offset   0004E791 (321425)\n-F9EEF Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+FAB5C Local Header Offset   0004EF68 (323432)\n+FAB60 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF9EEF: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xFAB60: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-F9F57 CENTRAL HEADER #428   02014B50 (33639248)\n-F9F5B Created Zip Spec      14 (20) '2.0'\n-F9F5C Created OS            03 (3) 'Unix'\n-F9F5D Extract Zip Spec      14 (20) '2.0'\n-F9F5E Extract OS            00 (0) 'MS-DOS'\n-F9F5F General Purpose Flag  0800 (2048)\n+FABC8 CENTRAL HEADER #428   02014B50 (33639248)\n+FABCC Created Zip Spec      14 (20) '2.0'\n+FABCD Created OS            03 (3) 'Unix'\n+FABCE Extract Zip Spec      14 (20) '2.0'\n+FABCF Extract OS            00 (0) 'MS-DOS'\n+FABD0 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-F9F61 Compression Method    0008 (8) 'Deflated'\n-F9F63 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-F9F67 CRC                   A64E298E (2790140302)\n-F9F6B Compressed Size       000003E2 (994)\n-F9F6F Uncompressed Size     000007A5 (1957)\n-F9F73 Filename Length       0075 (117)\n-F9F75 Extra Length          0000 (0)\n-F9F77 Comment Length        0000 (0)\n-F9F79 Disk Start            0000 (0)\n-F9F7B Int File Attributes   0000 (0)\n+FABD2 Compression Method    0008 (8) 'Deflated'\n+FABD4 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+FABD8 CRC                   A64E298E (2790140302)\n+FABDC Compressed Size       000003E2 (994)\n+FABE0 Uncompressed Size     000007A5 (1957)\n+FABE4 Filename Length       0075 (117)\n+FABE6 Extra Length          0000 (0)\n+FABE8 Comment Length        0000 (0)\n+FABEA Disk Start            0000 (0)\n+FABEC Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-F9F7D Ext File Attributes   81A40000 (2175008768)\n+FABEE Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-F9F81 Local Header Offset   0004ECB2 (322738)\n-F9F85 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+FABF2 Local Header Offset   0004F489 (324745)\n+FABF6 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF9F85: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xFABF6: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-F9FFA CENTRAL HEADER #429   02014B50 (33639248)\n-F9FFE Created Zip Spec      14 (20) '2.0'\n-F9FFF Created OS            03 (3) 'Unix'\n-FA000 Extract Zip Spec      14 (20) '2.0'\n-FA001 Extract OS            00 (0) 'MS-DOS'\n-FA002 General Purpose Flag  0800 (2048)\n+FAC6B CENTRAL HEADER #429   02014B50 (33639248)\n+FAC6F Created Zip Spec      14 (20) '2.0'\n+FAC70 Created OS            03 (3) 'Unix'\n+FAC71 Extract Zip Spec      14 (20) '2.0'\n+FAC72 Extract OS            00 (0) 'MS-DOS'\n+FAC73 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-FA004 Compression Method    0008 (8) 'Deflated'\n-FA006 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-FA00A CRC                   937D5C9D (2474466461)\n-FA00E Compressed Size       00000531 (1329)\n-FA012 Uncompressed Size     00000F43 (3907)\n-FA016 Filename Length       006E (110)\n-FA018 Extra Length          0000 (0)\n-FA01A Comment Length        0000 (0)\n-FA01C Disk Start            0000 (0)\n-FA01E Int File Attributes   0000 (0)\n+FAC75 Compression Method    0008 (8) 'Deflated'\n+FAC77 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+FAC7B CRC                   937D5C9D (2474466461)\n+FAC7F Compressed Size       00000531 (1329)\n+FAC83 Uncompressed Size     00000F43 (3907)\n+FAC87 Filename Length       006E (110)\n+FAC89 Extra Length          0000 (0)\n+FAC8B Comment Length        0000 (0)\n+FAC8D Disk Start            0000 (0)\n+FAC8F Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-FA020 Ext File Attributes   81A40000 (2175008768)\n+FAC91 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-FA024 Local Header Offset   0004F127 (323879)\n-FA028 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+FAC95 Local Header Offset   0004F8FE (325886)\n+FAC99 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xFA028: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xFAC99: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-FA096 CENTRAL HEADER #430   02014B50 (33639248)\n-FA09A Created Zip Spec      14 (20) '2.0'\n-FA09B Created OS            03 (3) 'Unix'\n-FA09C Extract Zip Spec      14 (20) '2.0'\n-FA09D Extract OS            00 (0) 'MS-DOS'\n-FA09E General Purpose Flag  0800 (2048)\n+FAD07 CENTRAL HEADER #430   02014B50 (33639248)\n+FAD0B Created Zip Spec      14 (20) '2.0'\n+FAD0C Created OS            03 (3) 'Unix'\n+FAD0D Extract Zip Spec      14 (20) '2.0'\n+FAD0E Extract OS            00 (0) 'MS-DOS'\n+FAD0F General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-FA0A0 Compression Method    0008 (8) 'Deflated'\n-FA0A2 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-FA0A6 CRC                   335CA1CD (861708749)\n-FA0AA Compressed Size       0000068B (1675)\n-FA0AE Uncompressed Size     00000E9A (3738)\n-FA0B2 Filename Length       0072 (114)\n-FA0B4 Extra Length          0000 (0)\n-FA0B6 Comment Length        0000 (0)\n-FA0B8 Disk Start            0000 (0)\n-FA0BA Int File Attributes   0000 (0)\n+FAD11 Compression Method    0008 (8) 'Deflated'\n+FAD13 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+FAD17 CRC                   335CA1CD (861708749)\n+FAD1B Compressed Size       0000068B (1675)\n+FAD1F Uncompressed Size     00000E9A (3738)\n+FAD23 Filename Length       0072 (114)\n+FAD25 Extra Length          0000 (0)\n+FAD27 Comment Length        0000 (0)\n+FAD29 Disk Start            0000 (0)\n+FAD2B Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-FA0BC Ext File Attributes   81A40000 (2175008768)\n+FAD2D Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-FA0C0 Local Header Offset   0004F6E4 (325348)\n-FA0C4 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+FAD31 Local Header Offset   0004FEBB (327355)\n+FAD35 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xFA0C4: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xFAD35: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-FA136 CENTRAL HEADER #431   02014B50 (33639248)\n-FA13A Created Zip Spec      14 (20) '2.0'\n-FA13B Created OS            03 (3) 'Unix'\n-FA13C Extract Zip Spec      14 (20) '2.0'\n-FA13D Extract OS            00 (0) 'MS-DOS'\n-FA13E General Purpose Flag  0800 (2048)\n+FADA7 CENTRAL HEADER #431   02014B50 (33639248)\n+FADAB Created Zip Spec      14 (20) '2.0'\n+FADAC Created OS            03 (3) 'Unix'\n+FADAD Extract Zip Spec      14 (20) '2.0'\n+FADAE Extract OS            00 (0) 'MS-DOS'\n+FADAF General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-FA140 Compression Method    0008 (8) 'Deflated'\n-FA142 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-FA146 CRC                   3EE7FDDD (1055391197)\n-FA14A Compressed Size       00000723 (1827)\n-FA14E Uncompressed Size     00001059 (4185)\n-FA152 Filename Length       007E (126)\n-FA154 Extra Length          0000 (0)\n-FA156 Comment Length        0000 (0)\n-FA158 Disk Start            0000 (0)\n-FA15A Int File Attributes   0000 (0)\n+FADB1 Compression Method    0008 (8) 'Deflated'\n+FADB3 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+FADB7 CRC                   3EE7FDDD (1055391197)\n+FADBB Compressed Size       00000723 (1827)\n+FADBF Uncompressed Size     00001059 (4185)\n+FADC3 Filename Length       007E (126)\n+FADC5 Extra Length          0000 (0)\n+FADC7 Comment Length        0000 (0)\n+FADC9 Disk Start            0000 (0)\n+FADCB Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-FA15C Ext File Attributes   81A40000 (2175008768)\n+FADCD Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-FA160 Local Header Offset   0004FDFF (327167)\n-FA164 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+FADD1 Local Header Offset   000505D6 (329174)\n+FADD5 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xFA164: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xFADD5: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-FA1E2 CENTRAL HEADER #432   02014B50 (33639248)\n-FA1E6 Created Zip Spec      14 (20) '2.0'\n-FA1E7 Created OS            03 (3) 'Unix'\n-FA1E8 Extract Zip Spec      14 (20) '2.0'\n-FA1E9 Extract OS            00 (0) 'MS-DOS'\n-FA1EA General Purpose Flag  0800 (2048)\n+FAE53 CENTRAL HEADER #432   02014B50 (33639248)\n+FAE57 Created Zip Spec      14 (20) '2.0'\n+FAE58 Created OS            03 (3) 'Unix'\n+FAE59 Extract Zip Spec      14 (20) '2.0'\n+FAE5A Extract OS            00 (0) 'MS-DOS'\n+FAE5B General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-FA1EC Compression Method    0008 (8) 'Deflated'\n-FA1EE Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-FA1F2 CRC                   0944969F (155489951)\n-FA1F6 Compressed Size       000008A8 (2216)\n-FA1FA Uncompressed Size     000017C7 (6087)\n-FA1FE Filename Length       0070 (112)\n-FA200 Extra Length          0000 (0)\n-FA202 Comment Length        0000 (0)\n-FA204 Disk Start            0000 (0)\n-FA206 Int File Attributes   0000 (0)\n+FAE5D Compression Method    0008 (8) 'Deflated'\n+FAE5F Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+FAE63 CRC                   0944969F (155489951)\n+FAE67 Compressed Size       000008A8 (2216)\n+FAE6B Uncompressed Size     000017C7 (6087)\n+FAE6F Filename Length       0070 (112)\n+FAE71 Extra Length          0000 (0)\n+FAE73 Comment Length        0000 (0)\n+FAE75 Disk Start            0000 (0)\n+FAE77 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-FA208 Ext File Attributes   81A40000 (2175008768)\n+FAE79 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-FA20C Local Header Offset   000505BE (329150)\n-FA210 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+FAE7D Local Header Offset   00050D95 (331157)\n+FAE81 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xFA210: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xFAE81: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-FA280 CENTRAL HEADER #433   02014B50 (33639248)\n-FA284 Created Zip Spec      14 (20) '2.0'\n-FA285 Created OS            03 (3) 'Unix'\n-FA286 Extract Zip Spec      14 (20) '2.0'\n-FA287 Extract OS            00 (0) 'MS-DOS'\n-FA288 General Purpose Flag  0800 (2048)\n+FAEF1 CENTRAL HEADER #433   02014B50 (33639248)\n+FAEF5 Created Zip Spec      14 (20) '2.0'\n+FAEF6 Created OS            03 (3) 'Unix'\n+FAEF7 Extract Zip Spec      14 (20) '2.0'\n+FAEF8 Extract OS            00 (0) 'MS-DOS'\n+FAEF9 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-FA28A Compression Method    0008 (8) 'Deflated'\n-FA28C Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-FA290 CRC                   67FA3A91 (1744452241)\n-FA294 Compressed Size       000004A5 (1189)\n-FA298 Uncompressed Size     00000C5B (3163)\n-FA29C Filename Length       007D (125)\n-FA29E Extra Length          0000 (0)\n-FA2A0 Comment Length        0000 (0)\n-FA2A2 Disk Start            0000 (0)\n-FA2A4 Int File Attributes   0000 (0)\n+FAEFB Compression Method    0008 (8) 'Deflated'\n+FAEFD Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+FAF01 CRC                   67FA3A91 (1744452241)\n+FAF05 Compressed Size       000004A5 (1189)\n+FAF09 Uncompressed Size     00000C5B (3163)\n+FAF0D Filename Length       007D (125)\n+FAF0F Extra Length          0000 (0)\n+FAF11 Comment Length        0000 (0)\n+FAF13 Disk Start            0000 (0)\n+FAF15 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-FA2A6 Ext File Attributes   81A40000 (2175008768)\n+FAF17 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-FA2AA Local Header Offset   00050EF4 (331508)\n-FA2AE Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+FAF1B Local Header Offset   000516CB (333515)\n+FAF1F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xFA2AE: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xFAF1F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-FA32B CENTRAL HEADER #434   02014B50 (33639248)\n-FA32F Created Zip Spec      14 (20) '2.0'\n-FA330 Created OS            03 (3) 'Unix'\n-FA331 Extract Zip Spec      14 (20) '2.0'\n-FA332 Extract OS            00 (0) 'MS-DOS'\n-FA333 General Purpose Flag  0800 (2048)\n+FAF9C CENTRAL HEADER #434   02014B50 (33639248)\n+FAFA0 Created Zip Spec      14 (20) '2.0'\n+FAFA1 Created OS            03 (3) 'Unix'\n+FAFA2 Extract Zip Spec      14 (20) '2.0'\n+FAFA3 Extract OS            00 (0) 'MS-DOS'\n+FAFA4 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-FA335 Compression Method    0008 (8) 'Deflated'\n-FA337 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-FA33B CRC                   63513D5C (1666268508)\n-FA33F Compressed Size       000003E5 (997)\n-FA343 Uncompressed Size     000007C0 (1984)\n-FA347 Filename Length       007D (125)\n-FA349 Extra Length          0000 (0)\n-FA34B Comment Length        0000 (0)\n-FA34D Disk Start            0000 (0)\n-FA34F Int File Attributes   0000 (0)\n+FAFA6 Compression Method    0008 (8) 'Deflated'\n+FAFA8 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+FAFAC CRC                   63513D5C (1666268508)\n+FAFB0 Compressed Size       000003E5 (997)\n+FAFB4 Uncompressed Size     000007C0 (1984)\n+FAFB8 Filename Length       007D (125)\n+FAFBA Extra Length          0000 (0)\n+FAFBC Comment Length        0000 (0)\n+FAFBE Disk Start            0000 (0)\n+FAFC0 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-FA351 Ext File Attributes   81A40000 (2175008768)\n+FAFC2 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-FA355 Local Header Offset   00051434 (332852)\n-FA359 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+FAFC6 Local Header Offset   00051C0B (334859)\n+FAFCA Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xFA359: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xFAFCA: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-FA3D6 CENTRAL HEADER #435   02014B50 (33639248)\n-FA3DA Created Zip Spec      14 (20) '2.0'\n-FA3DB Created OS            03 (3) 'Unix'\n-FA3DC Extract Zip Spec      14 (20) '2.0'\n-FA3DD Extract OS            00 (0) 'MS-DOS'\n-FA3DE General Purpose Flag  0800 (2048)\n+FB047 CENTRAL HEADER #435   02014B50 (33639248)\n+FB04B Created Zip Spec      14 (20) '2.0'\n+FB04C Created OS            03 (3) 'Unix'\n+FB04D Extract Zip Spec      14 (20) '2.0'\n+FB04E Extract OS            00 (0) 'MS-DOS'\n+FB04F General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-FA3E0 Compression Method    0008 (8) 'Deflated'\n-FA3E2 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-FA3E6 CRC                   99929518 (2576520472)\n-FA3EA Compressed Size       00000586 (1414)\n-FA3EE Uncompressed Size     00000EDA (3802)\n-FA3F2 Filename Length       0074 (116)\n-FA3F4 Extra Length          0000 (0)\n-FA3F6 Comment Length        0000 (0)\n-FA3F8 Disk Start            0000 (0)\n-FA3FA Int File Attributes   0000 (0)\n+FB051 Compression Method    0008 (8) 'Deflated'\n+FB053 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+FB057 CRC                   99929518 (2576520472)\n+FB05B Compressed Size       00000586 (1414)\n+FB05F Uncompressed Size     00000EDA (3802)\n+FB063 Filename Length       0074 (116)\n+FB065 Extra Length          0000 (0)\n+FB067 Comment Length        0000 (0)\n+FB069 Disk Start            0000 (0)\n+FB06B Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-FA3FC Ext File Attributes   81A40000 (2175008768)\n+FB06D Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-FA400 Local Header Offset   000518B4 (334004)\n-FA404 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+FB071 Local Header Offset   0005208B (336011)\n+FB075 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xFA404: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xFB075: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-FA478 CENTRAL HEADER #436   02014B50 (33639248)\n-FA47C Created Zip Spec      14 (20) '2.0'\n-FA47D Created OS            03 (3) 'Unix'\n-FA47E Extract Zip Spec      14 (20) '2.0'\n-FA47F Extract OS            00 (0) 'MS-DOS'\n-FA480 General Purpose Flag  0800 (2048)\n+FB0E9 CENTRAL HEADER #436   02014B50 (33639248)\n+FB0ED Created Zip Spec      14 (20) '2.0'\n+FB0EE Created OS            03 (3) 'Unix'\n+FB0EF Extract Zip Spec      14 (20) '2.0'\n+FB0F0 Extract OS            00 (0) 'MS-DOS'\n+FB0F1 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-FA482 Compression Method    0008 (8) 'Deflated'\n-FA484 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-FA488 CRC                   E6BF62E0 (3871302368)\n-FA48C Compressed Size       000003A3 (931)\n-FA490 Uncompressed Size     000008F8 (2296)\n-FA494 Filename Length       0072 (114)\n-FA496 Extra Length          0000 (0)\n-FA498 Comment Length        0000 (0)\n-FA49A Disk Start            0000 (0)\n-FA49C Int File Attributes   0000 (0)\n+FB0F3 Compression Method    0008 (8) 'Deflated'\n+FB0F5 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+FB0F9 CRC                   E6BF62E0 (3871302368)\n+FB0FD Compressed Size       000003A3 (931)\n+FB101 Uncompressed Size     000008F8 (2296)\n+FB105 Filename Length       0072 (114)\n+FB107 Extra Length          0000 (0)\n+FB109 Comment Length        0000 (0)\n+FB10B Disk Start            0000 (0)\n+FB10D Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-FA49E Ext File Attributes   81A40000 (2175008768)\n+FB10F Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-FA4A2 Local Header Offset   00051ECC (335564)\n-FA4A6 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+FB113 Local Header Offset   000526A3 (337571)\n+FB117 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xFA4A6: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xFB117: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-FA518 CENTRAL HEADER #437   02014B50 (33639248)\n-FA51C Created Zip Spec      14 (20) '2.0'\n-FA51D Created OS            03 (3) 'Unix'\n-FA51E Extract Zip Spec      14 (20) '2.0'\n-FA51F Extract OS            00 (0) 'MS-DOS'\n-FA520 General Purpose Flag  0800 (2048)\n+FB189 CENTRAL HEADER #437   02014B50 (33639248)\n+FB18D Created Zip Spec      14 (20) '2.0'\n+FB18E Created OS            03 (3) 'Unix'\n+FB18F Extract Zip Spec      14 (20) '2.0'\n+FB190 Extract OS            00 (0) 'MS-DOS'\n+FB191 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-FA522 Compression Method    0008 (8) 'Deflated'\n-FA524 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-FA528 CRC                   01130591 (18023825)\n-FA52C Compressed Size       000002F0 (752)\n-FA530 Uncompressed Size     00000594 (1428)\n-FA534 Filename Length       0077 (119)\n-FA536 Extra Length          0000 (0)\n-FA538 Comment Length        0000 (0)\n-FA53A Disk Start            0000 (0)\n-FA53C Int File Attributes   0000 (0)\n+FB193 Compression Method    0008 (8) 'Deflated'\n+FB195 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+FB199 CRC                   01130591 (18023825)\n+FB19D Compressed Size       000002F0 (752)\n+FB1A1 Uncompressed Size     00000594 (1428)\n+FB1A5 Filename Length       0077 (119)\n+FB1A7 Extra Length          0000 (0)\n+FB1A9 Comment Length        0000 (0)\n+FB1AB Disk Start            0000 (0)\n+FB1AD Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-FA53E Ext File Attributes   81A40000 (2175008768)\n+FB1AF Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-FA542 Local Header Offset   000522FF (336639)\n-FA546 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+FB1B3 Local Header Offset   00052AD6 (338646)\n+FB1B7 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xFA546: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xFB1B7: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-FA5BD CENTRAL HEADER #438   02014B50 (33639248)\n-FA5C1 Created Zip Spec      14 (20) '2.0'\n-FA5C2 Created OS            03 (3) 'Unix'\n-FA5C3 Extract Zip Spec      14 (20) '2.0'\n-FA5C4 Extract OS            00 (0) 'MS-DOS'\n-FA5C5 General Purpose Flag  0800 (2048)\n+FB22E CENTRAL HEADER #438   02014B50 (33639248)\n+FB232 Created Zip Spec      14 (20) '2.0'\n+FB233 Created OS            03 (3) 'Unix'\n+FB234 Extract Zip Spec      14 (20) '2.0'\n+FB235 Extract OS            00 (0) 'MS-DOS'\n+FB236 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-FA5C7 Compression Method    0008 (8) 'Deflated'\n-FA5C9 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-FA5CD CRC                   F05E2331 (4032701233)\n-FA5D1 Compressed Size       00000408 (1032)\n-FA5D5 Uncompressed Size     00000831 (2097)\n-FA5D9 Filename Length       0079 (121)\n-FA5DB Extra Length          0000 (0)\n-FA5DD Comment Length        0000 (0)\n-FA5DF Disk Start            0000 (0)\n-FA5E1 Int File Attributes   0000 (0)\n+FB238 Compression Method    0008 (8) 'Deflated'\n+FB23A Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+FB23E CRC                   F05E2331 (4032701233)\n+FB242 Compressed Size       00000408 (1032)\n+FB246 Uncompressed Size     00000831 (2097)\n+FB24A Filename Length       0079 (121)\n+FB24C Extra Length          0000 (0)\n+FB24E Comment Length        0000 (0)\n+FB250 Disk Start            0000 (0)\n+FB252 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-FA5E3 Ext File Attributes   81A40000 (2175008768)\n+FB254 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-FA5E7 Local Header Offset   00052684 (337540)\n-FA5EB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+FB258 Local Header Offset   00052E5B (339547)\n+FB25C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xFA5EB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xFB25C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-FA664 CENTRAL HEADER #439   02014B50 (33639248)\n-FA668 Created Zip Spec      14 (20) '2.0'\n-FA669 Created OS            03 (3) 'Unix'\n-FA66A Extract Zip Spec      14 (20) '2.0'\n-FA66B Extract OS            00 (0) 'MS-DOS'\n-FA66C General Purpose Flag  0800 (2048)\n+FB2D5 CENTRAL HEADER #439   02014B50 (33639248)\n+FB2D9 Created Zip Spec      14 (20) '2.0'\n+FB2DA Created OS            03 (3) 'Unix'\n+FB2DB Extract Zip Spec      14 (20) '2.0'\n+FB2DC Extract OS            00 (0) 'MS-DOS'\n+FB2DD General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-FA66E Compression Method    0008 (8) 'Deflated'\n-FA670 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-FA674 CRC                   80ED3BA4 (2163030948)\n-FA678 Compressed Size       0000055C (1372)\n-FA67C Uncompressed Size     000015D0 (5584)\n-FA680 Filename Length       0077 (119)\n-FA682 Extra Length          0000 (0)\n-FA684 Comment Length        0000 (0)\n-FA686 Disk Start            0000 (0)\n-FA688 Int File Attributes   0000 (0)\n+FB2DF Compression Method    0008 (8) 'Deflated'\n+FB2E1 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+FB2E5 CRC                   80ED3BA4 (2163030948)\n+FB2E9 Compressed Size       0000055C (1372)\n+FB2ED Uncompressed Size     000015D0 (5584)\n+FB2F1 Filename Length       0077 (119)\n+FB2F3 Extra Length          0000 (0)\n+FB2F5 Comment Length        0000 (0)\n+FB2F7 Disk Start            0000 (0)\n+FB2F9 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-FA68A Ext File Attributes   81A40000 (2175008768)\n+FB2FB Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-FA68E Local Header Offset   00052B23 (338723)\n-FA692 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+FB2FF Local Header Offset   000532FA (340730)\n+FB303 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xFA692: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xFB303: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-FA709 CENTRAL HEADER #440   02014B50 (33639248)\n-FA70D Created Zip Spec      14 (20) '2.0'\n-FA70E Created OS            03 (3) 'Unix'\n-FA70F Extract Zip Spec      14 (20) '2.0'\n-FA710 Extract OS            00 (0) 'MS-DOS'\n-FA711 General Purpose Flag  0800 (2048)\n+FB37A CENTRAL HEADER #440   02014B50 (33639248)\n+FB37E Created Zip Spec      14 (20) '2.0'\n+FB37F Created OS            03 (3) 'Unix'\n+FB380 Extract Zip Spec      14 (20) '2.0'\n+FB381 Extract OS            00 (0) 'MS-DOS'\n+FB382 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-FA713 Compression Method    0008 (8) 'Deflated'\n-FA715 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-FA719 CRC                   7018E446 (1880679494)\n-FA71D Compressed Size       000009A0 (2464)\n-FA721 Uncompressed Size     00001FAE (8110)\n-FA725 Filename Length       007D (125)\n-FA727 Extra Length          0000 (0)\n-FA729 Comment Length        0000 (0)\n-FA72B Disk Start            0000 (0)\n-FA72D Int File Attributes   0000 (0)\n+FB384 Compression Method    0008 (8) 'Deflated'\n+FB386 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+FB38A CRC                   7018E446 (1880679494)\n+FB38E Compressed Size       000009A0 (2464)\n+FB392 Uncompressed Size     00001FAE (8110)\n+FB396 Filename Length       007D (125)\n+FB398 Extra Length          0000 (0)\n+FB39A Comment Length        0000 (0)\n+FB39C Disk Start            0000 (0)\n+FB39E Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-FA72F Ext File Attributes   81A40000 (2175008768)\n+FB3A0 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-FA733 Local Header Offset   00053114 (340244)\n-FA737 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+FB3A4 Local Header Offset   000538EB (342251)\n+FB3A8 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xFA737: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xFB3A8: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-FA7B4 CENTRAL HEADER #441   02014B50 (33639248)\n-FA7B8 Created Zip Spec      14 (20) '2.0'\n-FA7B9 Created OS            03 (3) 'Unix'\n-FA7BA Extract Zip Spec      14 (20) '2.0'\n-FA7BB Extract OS            00 (0) 'MS-DOS'\n-FA7BC General Purpose Flag  0800 (2048)\n+FB425 CENTRAL HEADER #441   02014B50 (33639248)\n+FB429 Created Zip Spec      14 (20) '2.0'\n+FB42A Created OS            03 (3) 'Unix'\n+FB42B Extract Zip Spec      14 (20) '2.0'\n+FB42C Extract OS            00 (0) 'MS-DOS'\n+FB42D General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-FA7BE Compression Method    0008 (8) 'Deflated'\n-FA7C0 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-FA7C4 CRC                   61A0CE5A (1637928538)\n-FA7C8 Compressed Size       0000049F (1183)\n-FA7CC Uncompressed Size     000012FA (4858)\n-FA7D0 Filename Length       0074 (116)\n-FA7D2 Extra Length          0000 (0)\n-FA7D4 Comment Length        0000 (0)\n-FA7D6 Disk Start            0000 (0)\n-FA7D8 Int File Attributes   0000 (0)\n+FB42F Compression Method    0008 (8) 'Deflated'\n+FB431 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+FB435 CRC                   61A0CE5A (1637928538)\n+FB439 Compressed Size       0000049F (1183)\n+FB43D Uncompressed Size     000012FA (4858)\n+FB441 Filename Length       0074 (116)\n+FB443 Extra Length          0000 (0)\n+FB445 Comment Length        0000 (0)\n+FB447 Disk Start            0000 (0)\n+FB449 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-FA7DA Ext File Attributes   81A40000 (2175008768)\n+FB44B Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-FA7DE Local Header Offset   00053B4F (342863)\n-FA7E2 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+FB44F Local Header Offset   00054326 (344870)\n+FB453 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xFA7E2: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xFB453: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-FA856 CENTRAL HEADER #442   02014B50 (33639248)\n-FA85A Created Zip Spec      14 (20) '2.0'\n-FA85B Created OS            03 (3) 'Unix'\n-FA85C Extract Zip Spec      14 (20) '2.0'\n-FA85D Extract OS            00 (0) 'MS-DOS'\n-FA85E General Purpose Flag  0800 (2048)\n+FB4C7 CENTRAL HEADER #442   02014B50 (33639248)\n+FB4CB Created Zip Spec      14 (20) '2.0'\n+FB4CC Created OS            03 (3) 'Unix'\n+FB4CD Extract Zip Spec      14 (20) '2.0'\n+FB4CE Extract OS            00 (0) 'MS-DOS'\n+FB4CF General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-FA860 Compression Method    0008 (8) 'Deflated'\n-FA862 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-FA866 CRC                   624BE63E (1649141310)\n-FA86A Compressed Size       0000075A (1882)\n-FA86E Uncompressed Size     00001315 (4885)\n-FA872 Filename Length       0077 (119)\n-FA874 Extra Length          0000 (0)\n-FA876 Comment Length        0000 (0)\n-FA878 Disk Start            0000 (0)\n-FA87A Int File Attributes   0000 (0)\n+FB4D1 Compression Method    0008 (8) 'Deflated'\n+FB4D3 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+FB4D7 CRC                   624BE63E (1649141310)\n+FB4DB Compressed Size       0000075A (1882)\n+FB4DF Uncompressed Size     00001315 (4885)\n+FB4E3 Filename Length       0077 (119)\n+FB4E5 Extra Length          0000 (0)\n+FB4E7 Comment Length        0000 (0)\n+FB4E9 Disk Start            0000 (0)\n+FB4EB Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-FA87C Ext File Attributes   81A40000 (2175008768)\n+FB4ED Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-FA880 Local Header Offset   00054080 (344192)\n-FA884 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+FB4F1 Local Header Offset   00054857 (346199)\n+FB4F5 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xFA884: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xFB4F5: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-FA8FB CENTRAL HEADER #443   02014B50 (33639248)\n-FA8FF Created Zip Spec      14 (20) '2.0'\n-FA900 Created OS            03 (3) 'Unix'\n-FA901 Extract Zip Spec      14 (20) '2.0'\n-FA902 Extract OS            00 (0) 'MS-DOS'\n-FA903 General Purpose Flag  0800 (2048)\n+FB56C CENTRAL HEADER #443   02014B50 (33639248)\n+FB570 Created Zip Spec      14 (20) '2.0'\n+FB571 Created OS            03 (3) 'Unix'\n+FB572 Extract Zip Spec      14 (20) '2.0'\n+FB573 Extract OS            00 (0) 'MS-DOS'\n+FB574 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-FA905 Compression Method    0008 (8) 'Deflated'\n-FA907 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-FA90B CRC                   F4A07CA3 (4104158371)\n-FA90F Compressed Size       00000978 (2424)\n-FA913 Uncompressed Size     000027E4 (10212)\n-FA917 Filename Length       0073 (115)\n-FA919 Extra Length          0000 (0)\n-FA91B Comment Length        0000 (0)\n-FA91D Disk Start            0000 (0)\n-FA91F Int File Attributes   0000 (0)\n+FB576 Compression Method    0008 (8) 'Deflated'\n+FB578 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+FB57C CRC                   F4A07CA3 (4104158371)\n+FB580 Compressed Size       00000978 (2424)\n+FB584 Uncompressed Size     000027E4 (10212)\n+FB588 Filename Length       0073 (115)\n+FB58A Extra Length          0000 (0)\n+FB58C Comment Length        0000 (0)\n+FB58E Disk Start            0000 (0)\n+FB590 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-FA921 Ext File Attributes   81A40000 (2175008768)\n+FB592 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-FA925 Local Header Offset   0005486F (346223)\n-FA929 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+FB596 Local Header Offset   00055046 (348230)\n+FB59A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xFA929: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xFB59A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-FA99C CENTRAL HEADER #444   02014B50 (33639248)\n-FA9A0 Created Zip Spec      14 (20) '2.0'\n-FA9A1 Created OS            03 (3) 'Unix'\n-FA9A2 Extract Zip Spec      14 (20) '2.0'\n-FA9A3 Extract OS            00 (0) 'MS-DOS'\n-FA9A4 General Purpose Flag  0800 (2048)\n+FB60D CENTRAL HEADER #444   02014B50 (33639248)\n+FB611 Created Zip Spec      14 (20) '2.0'\n+FB612 Created OS            03 (3) 'Unix'\n+FB613 Extract Zip Spec      14 (20) '2.0'\n+FB614 Extract OS            00 (0) 'MS-DOS'\n+FB615 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-FA9A6 Compression Method    0008 (8) 'Deflated'\n-FA9A8 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-FA9AC CRC                   6E031E40 (1845698112)\n-FA9B0 Compressed Size       0000075F (1887)\n-FA9B4 Uncompressed Size     00001276 (4726)\n-FA9B8 Filename Length       007B (123)\n-FA9BA Extra Length          0000 (0)\n-FA9BC Comment Length        0000 (0)\n-FA9BE Disk Start            0000 (0)\n-FA9C0 Int File Attributes   0000 (0)\n+FB617 Compression Method    0008 (8) 'Deflated'\n+FB619 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+FB61D CRC                   6E031E40 (1845698112)\n+FB621 Compressed Size       0000075F (1887)\n+FB625 Uncompressed Size     00001276 (4726)\n+FB629 Filename Length       007B (123)\n+FB62B Extra Length          0000 (0)\n+FB62D Comment Length        0000 (0)\n+FB62F Disk Start            0000 (0)\n+FB631 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-FA9C2 Ext File Attributes   81A40000 (2175008768)\n+FB633 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-FA9C6 Local Header Offset   00055278 (348792)\n-FA9CA Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+FB637 Local Header Offset   00055A4F (350799)\n+FB63B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xFA9CA: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xFB63B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-FAA45 CENTRAL HEADER #445   02014B50 (33639248)\n-FAA49 Created Zip Spec      14 (20) '2.0'\n-FAA4A Created OS            03 (3) 'Unix'\n-FAA4B Extract Zip Spec      14 (20) '2.0'\n-FAA4C Extract OS            00 (0) 'MS-DOS'\n-FAA4D General Purpose Flag  0800 (2048)\n+FB6B6 CENTRAL HEADER #445   02014B50 (33639248)\n+FB6BA Created Zip Spec      14 (20) '2.0'\n+FB6BB Created OS            03 (3) 'Unix'\n+FB6BC Extract Zip Spec      14 (20) '2.0'\n+FB6BD Extract OS            00 (0) 'MS-DOS'\n+FB6BE General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-FAA4F Compression Method    0008 (8) 'Deflated'\n-FAA51 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-FAA55 CRC                   5987930A (1502057226)\n-FAA59 Compressed Size       00000501 (1281)\n-FAA5D Uncompressed Size     00000BDE (3038)\n-FAA61 Filename Length       007A (122)\n-FAA63 Extra Length          0000 (0)\n-FAA65 Comment Length        0000 (0)\n-FAA67 Disk Start            0000 (0)\n-FAA69 Int File Attributes   0000 (0)\n+FB6C0 Compression Method    0008 (8) 'Deflated'\n+FB6C2 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+FB6C6 CRC                   5987930A (1502057226)\n+FB6CA Compressed Size       00000501 (1281)\n+FB6CE Uncompressed Size     00000BDE (3038)\n+FB6D2 Filename Length       007A (122)\n+FB6D4 Extra Length          0000 (0)\n+FB6D6 Comment Length        0000 (0)\n+FB6D8 Disk Start            0000 (0)\n+FB6DA Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-FAA6B Ext File Attributes   81A40000 (2175008768)\n+FB6DC Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-FAA6F Local Header Offset   00055A70 (350832)\n-FAA73 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+FB6E0 Local Header Offset   00056247 (352839)\n+FB6E4 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xFAA73: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xFB6E4: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-FAAED CENTRAL HEADER #446   02014B50 (33639248)\n-FAAF1 Created Zip Spec      14 (20) '2.0'\n-FAAF2 Created OS            03 (3) 'Unix'\n-FAAF3 Extract Zip Spec      14 (20) '2.0'\n-FAAF4 Extract OS            00 (0) 'MS-DOS'\n-FAAF5 General Purpose Flag  0800 (2048)\n+FB75E CENTRAL HEADER #446   02014B50 (33639248)\n+FB762 Created Zip Spec      14 (20) '2.0'\n+FB763 Created OS            03 (3) 'Unix'\n+FB764 Extract Zip Spec      14 (20) '2.0'\n+FB765 Extract OS            00 (0) 'MS-DOS'\n+FB766 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-FAAF7 Compression Method    0008 (8) 'Deflated'\n-FAAF9 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-FAAFD CRC                   CA93F7B9 (3398694841)\n-FAB01 Compressed Size       000003F5 (1013)\n-FAB05 Uncompressed Size     000008CF (2255)\n-FAB09 Filename Length       007B (123)\n-FAB0B Extra Length          0000 (0)\n-FAB0D Comment Length        0000 (0)\n-FAB0F Disk Start            0000 (0)\n-FAB11 Int File Attributes   0000 (0)\n+FB768 Compression Method    0008 (8) 'Deflated'\n+FB76A Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+FB76E CRC                   CA93F7B9 (3398694841)\n+FB772 Compressed Size       000003F5 (1013)\n+FB776 Uncompressed Size     000008CF (2255)\n+FB77A Filename Length       007B (123)\n+FB77C Extra Length          0000 (0)\n+FB77E Comment Length        0000 (0)\n+FB780 Disk Start            0000 (0)\n+FB782 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-FAB13 Ext File Attributes   81A40000 (2175008768)\n+FB784 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-FAB17 Local Header Offset   00056009 (352265)\n-FAB1B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+FB788 Local Header Offset   000567E0 (354272)\n+FB78C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xFAB1B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xFB78C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-FAB96 CENTRAL HEADER #447   02014B50 (33639248)\n-FAB9A Created Zip Spec      14 (20) '2.0'\n-FAB9B Created OS            03 (3) 'Unix'\n-FAB9C Extract Zip Spec      14 (20) '2.0'\n-FAB9D Extract OS            00 (0) 'MS-DOS'\n-FAB9E General Purpose Flag  0800 (2048)\n+FB807 CENTRAL HEADER #447   02014B50 (33639248)\n+FB80B Created Zip Spec      14 (20) '2.0'\n+FB80C Created OS            03 (3) 'Unix'\n+FB80D Extract Zip Spec      14 (20) '2.0'\n+FB80E Extract OS            00 (0) 'MS-DOS'\n+FB80F General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-FABA0 Compression Method    0008 (8) 'Deflated'\n-FABA2 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-FABA6 CRC                   673E5975 (1732139381)\n-FABAA Compressed Size       00000507 (1287)\n-FABAE Uncompressed Size     00000CA9 (3241)\n-FABB2 Filename Length       0079 (121)\n-FABB4 Extra Length          0000 (0)\n-FABB6 Comment Length        0000 (0)\n-FABB8 Disk Start            0000 (0)\n-FABBA Int File Attributes   0000 (0)\n+FB811 Compression Method    0008 (8) 'Deflated'\n+FB813 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+FB817 CRC                   673E5975 (1732139381)\n+FB81B Compressed Size       00000507 (1287)\n+FB81F Uncompressed Size     00000CA9 (3241)\n+FB823 Filename Length       0079 (121)\n+FB825 Extra Length          0000 (0)\n+FB827 Comment Length        0000 (0)\n+FB829 Disk Start            0000 (0)\n+FB82B Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-FABBC Ext File Attributes   81A40000 (2175008768)\n+FB82D Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-FABC0 Local Header Offset   00056497 (353431)\n-FABC4 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+FB831 Local Header Offset   00056C6E (355438)\n+FB835 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xFABC4: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xFB835: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-FAC3D CENTRAL HEADER #448   02014B50 (33639248)\n-FAC41 Created Zip Spec      14 (20) '2.0'\n-FAC42 Created OS            03 (3) 'Unix'\n-FAC43 Extract Zip Spec      14 (20) '2.0'\n-FAC44 Extract OS            00 (0) 'MS-DOS'\n-FAC45 General Purpose Flag  0800 (2048)\n+FB8AE CENTRAL HEADER #448   02014B50 (33639248)\n+FB8B2 Created Zip Spec      14 (20) '2.0'\n+FB8B3 Created OS            03 (3) 'Unix'\n+FB8B4 Extract Zip Spec      14 (20) '2.0'\n+FB8B5 Extract OS            00 (0) 'MS-DOS'\n+FB8B6 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-FAC47 Compression Method    0008 (8) 'Deflated'\n-FAC49 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-FAC4D CRC                   33033645 (855848517)\n-FAC51 Compressed Size       00001774 (6004)\n-FAC55 Uncompressed Size     0000503C (20540)\n-FAC59 Filename Length       0077 (119)\n-FAC5B Extra Length          0000 (0)\n-FAC5D Comment Length        0000 (0)\n-FAC5F Disk Start            0000 (0)\n-FAC61 Int File Attributes   0000 (0)\n+FB8B8 Compression Method    0008 (8) 'Deflated'\n+FB8BA Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+FB8BE CRC                   33033645 (855848517)\n+FB8C2 Compressed Size       00001774 (6004)\n+FB8C6 Uncompressed Size     0000503C (20540)\n+FB8CA Filename Length       0077 (119)\n+FB8CC Extra Length          0000 (0)\n+FB8CE Comment Length        0000 (0)\n+FB8D0 Disk Start            0000 (0)\n+FB8D2 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-FAC63 Ext File Attributes   81A40000 (2175008768)\n+FB8D4 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-FAC67 Local Header Offset   00056A35 (354869)\n-FAC6B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+FB8D8 Local Header Offset   0005720C (356876)\n+FB8DC Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xFAC6B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xFB8DC: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-FACE2 CENTRAL HEADER #449   02014B50 (33639248)\n-FACE6 Created Zip Spec      14 (20) '2.0'\n-FACE7 Created OS            03 (3) 'Unix'\n-FACE8 Extract Zip Spec      14 (20) '2.0'\n-FACE9 Extract OS            00 (0) 'MS-DOS'\n-FACEA General Purpose Flag  0800 (2048)\n+FB953 CENTRAL HEADER #449   02014B50 (33639248)\n+FB957 Created Zip Spec      14 (20) '2.0'\n+FB958 Created OS            03 (3) 'Unix'\n+FB959 Extract Zip Spec      14 (20) '2.0'\n+FB95A Extract OS            00 (0) 'MS-DOS'\n+FB95B General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-FACEC Compression Method    0008 (8) 'Deflated'\n-FACEE Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-FACF2 CRC                   F5037A64 (4110645860)\n-FACF6 Compressed Size       0000042D (1069)\n-FACFA Uncompressed Size     0000080E (2062)\n-FACFE Filename Length       007A (122)\n-FAD00 Extra Length          0000 (0)\n-FAD02 Comment Length        0000 (0)\n-FAD04 Disk Start            0000 (0)\n-FAD06 Int File Attributes   0000 (0)\n+FB95D Compression Method    0008 (8) 'Deflated'\n+FB95F Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+FB963 CRC                   F5037A64 (4110645860)\n+FB967 Compressed Size       0000042D (1069)\n+FB96B Uncompressed Size     0000080E (2062)\n+FB96F Filename Length       007A (122)\n+FB971 Extra Length          0000 (0)\n+FB973 Comment Length        0000 (0)\n+FB975 Disk Start            0000 (0)\n+FB977 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-FAD08 Ext File Attributes   81A40000 (2175008768)\n+FB979 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-FAD0C Local Header Offset   0005823E (361022)\n-FAD10 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+FB97D Local Header Offset   00058A15 (363029)\n+FB981 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xFAD10: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xFB981: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-FAD8A CENTRAL HEADER #450   02014B50 (33639248)\n-FAD8E Created Zip Spec      14 (20) '2.0'\n-FAD8F Created OS            03 (3) 'Unix'\n-FAD90 Extract Zip Spec      14 (20) '2.0'\n-FAD91 Extract OS            00 (0) 'MS-DOS'\n-FAD92 General Purpose Flag  0800 (2048)\n+FB9FB CENTRAL HEADER #450   02014B50 (33639248)\n+FB9FF Created Zip Spec      14 (20) '2.0'\n+FBA00 Created OS            03 (3) 'Unix'\n+FBA01 Extract Zip Spec      14 (20) '2.0'\n+FBA02 Extract OS            00 (0) 'MS-DOS'\n+FBA03 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-FAD94 Compression Method    0008 (8) 'Deflated'\n-FAD96 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-FAD9A CRC                   DB187B38 (3675814712)\n-FAD9E Compressed Size       00000A58 (2648)\n-FADA2 Uncompressed Size     00001A85 (6789)\n-FADA6 Filename Length       0070 (112)\n-FADA8 Extra Length          0000 (0)\n-FADAA Comment Length        0000 (0)\n-FADAC Disk Start            0000 (0)\n-FADAE Int File Attributes   0000 (0)\n+FBA05 Compression Method    0008 (8) 'Deflated'\n+FBA07 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+FBA0B CRC                   DB187B38 (3675814712)\n+FBA0F Compressed Size       00000A58 (2648)\n+FBA13 Uncompressed Size     00001A85 (6789)\n+FBA17 Filename Length       0070 (112)\n+FBA19 Extra Length          0000 (0)\n+FBA1B Comment Length        0000 (0)\n+FBA1D Disk Start            0000 (0)\n+FBA1F Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-FADB0 Ext File Attributes   81A40000 (2175008768)\n+FBA21 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-FADB4 Local Header Offset   00058703 (362243)\n-FADB8 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+FBA25 Local Header Offset   00058EDA (364250)\n+FBA29 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xFADB8: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xFBA29: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-FAE28 CENTRAL HEADER #451   02014B50 (33639248)\n-FAE2C Created Zip Spec      14 (20) '2.0'\n-FAE2D Created OS            03 (3) 'Unix'\n-FAE2E Extract Zip Spec      14 (20) '2.0'\n-FAE2F Extract OS            00 (0) 'MS-DOS'\n-FAE30 General Purpose Flag  0800 (2048)\n+FBA99 CENTRAL HEADER #451   02014B50 (33639248)\n+FBA9D Created Zip Spec      14 (20) '2.0'\n+FBA9E Created OS            03 (3) 'Unix'\n+FBA9F Extract Zip Spec      14 (20) '2.0'\n+FBAA0 Extract OS            00 (0) 'MS-DOS'\n+FBAA1 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-FAE32 Compression Method    0008 (8) 'Deflated'\n-FAE34 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-FAE38 CRC                   CD183667 (3440916071)\n-FAE3C Compressed Size       00000A45 (2629)\n-FAE40 Uncompressed Size     00001A6E (6766)\n-FAE44 Filename Length       0071 (113)\n-FAE46 Extra Length          0000 (0)\n-FAE48 Comment Length        0000 (0)\n-FAE4A Disk Start            0000 (0)\n-FAE4C Int File Attributes   0000 (0)\n+FBAA3 Compression Method    0008 (8) 'Deflated'\n+FBAA5 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+FBAA9 CRC                   CD183667 (3440916071)\n+FBAAD Compressed Size       00000A45 (2629)\n+FBAB1 Uncompressed Size     00001A6E (6766)\n+FBAB5 Filename Length       0071 (113)\n+FBAB7 Extra Length          0000 (0)\n+FBAB9 Comment Length        0000 (0)\n+FBABB Disk Start            0000 (0)\n+FBABD Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-FAE4E Ext File Attributes   81A40000 (2175008768)\n+FBABF Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-FAE52 Local Header Offset   000591E9 (365033)\n-FAE56 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+FBAC3 Local Header Offset   000599C0 (367040)\n+FBAC7 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xFAE56: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xFBAC7: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-FAEC7 CENTRAL HEADER #452   02014B50 (33639248)\n-FAECB Created Zip Spec      14 (20) '2.0'\n-FAECC Created OS            03 (3) 'Unix'\n-FAECD Extract Zip Spec      14 (20) '2.0'\n-FAECE Extract OS            00 (0) 'MS-DOS'\n-FAECF General Purpose Flag  0800 (2048)\n+FBB38 CENTRAL HEADER #452   02014B50 (33639248)\n+FBB3C Created Zip Spec      14 (20) '2.0'\n+FBB3D Created OS            03 (3) 'Unix'\n+FBB3E Extract Zip Spec      14 (20) '2.0'\n+FBB3F Extract OS            00 (0) 'MS-DOS'\n+FBB40 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-FAED1 Compression Method    0008 (8) 'Deflated'\n-FAED3 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-FAED7 CRC                   0C7DD276 (209572470)\n-FAEDB Compressed Size       00000A5A (2650)\n-FAEDF Uncompressed Size     00001A92 (6802)\n-FAEE3 Filename Length       0071 (113)\n-FAEE5 Extra Length          0000 (0)\n-FAEE7 Comment Length        0000 (0)\n-FAEE9 Disk Start            0000 (0)\n-FAEEB Int File Attributes   0000 (0)\n+FBB42 Compression Method    0008 (8) 'Deflated'\n+FBB44 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+FBB48 CRC                   0C7DD276 (209572470)\n+FBB4C Compressed Size       00000A5A (2650)\n+FBB50 Uncompressed Size     00001A92 (6802)\n+FBB54 Filename Length       0071 (113)\n+FBB56 Extra Length          0000 (0)\n+FBB58 Comment Length        0000 (0)\n+FBB5A Disk Start            0000 (0)\n+FBB5C Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-FAEED Ext File Attributes   81A40000 (2175008768)\n+FBB5E Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-FAEF1 Local Header Offset   00059CBD (367805)\n-FAEF5 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+FBB62 Local Header Offset   0005A494 (369812)\n+FBB66 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xFAEF5: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xFBB66: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-FAF66 CENTRAL HEADER #453   02014B50 (33639248)\n-FAF6A Created Zip Spec      14 (20) '2.0'\n-FAF6B Created OS            03 (3) 'Unix'\n-FAF6C Extract Zip Spec      14 (20) '2.0'\n-FAF6D Extract OS            00 (0) 'MS-DOS'\n-FAF6E General Purpose Flag  0800 (2048)\n+FBBD7 CENTRAL HEADER #453   02014B50 (33639248)\n+FBBDB Created Zip Spec      14 (20) '2.0'\n+FBBDC Created OS            03 (3) 'Unix'\n+FBBDD Extract Zip Spec      14 (20) '2.0'\n+FBBDE Extract OS            00 (0) 'MS-DOS'\n+FBBDF General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-FAF70 Compression Method    0008 (8) 'Deflated'\n-FAF72 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-FAF76 CRC                   60EA12C2 (1625952962)\n-FAF7A Compressed Size       000008AB (2219)\n-FAF7E Uncompressed Size     00001733 (5939)\n-FAF82 Filename Length       0072 (114)\n-FAF84 Extra Length          0000 (0)\n-FAF86 Comment Length        0000 (0)\n-FAF88 Disk Start            0000 (0)\n-FAF8A Int File Attributes   0000 (0)\n+FBBE1 Compression Method    0008 (8) 'Deflated'\n+FBBE3 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+FBBE7 CRC                   60EA12C2 (1625952962)\n+FBBEB Compressed Size       000008AB (2219)\n+FBBEF Uncompressed Size     00001733 (5939)\n+FBBF3 Filename Length       0072 (114)\n+FBBF5 Extra Length          0000 (0)\n+FBBF7 Comment Length        0000 (0)\n+FBBF9 Disk Start            0000 (0)\n+FBBFB Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-FAF8C Ext File Attributes   81A40000 (2175008768)\n+FBBFD Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-FAF90 Local Header Offset   0005A7A6 (370598)\n-FAF94 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+FBC01 Local Header Offset   0005AF7D (372605)\n+FBC05 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xFAF94: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xFBC05: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-FB006 CENTRAL HEADER #454   02014B50 (33639248)\n-FB00A Created Zip Spec      14 (20) '2.0'\n-FB00B Created OS            03 (3) 'Unix'\n-FB00C Extract Zip Spec      14 (20) '2.0'\n-FB00D Extract OS            00 (0) 'MS-DOS'\n-FB00E General Purpose Flag  0800 (2048)\n+FBC77 CENTRAL HEADER #454   02014B50 (33639248)\n+FBC7B Created Zip Spec      14 (20) '2.0'\n+FBC7C Created OS            03 (3) 'Unix'\n+FBC7D Extract Zip Spec      14 (20) '2.0'\n+FBC7E Extract OS            00 (0) 'MS-DOS'\n+FBC7F General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-FB010 Compression Method    0008 (8) 'Deflated'\n-FB012 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-FB016 CRC                   4BB1EABD (1269951165)\n-FB01A Compressed Size       00000764 (1892)\n-FB01E Uncompressed Size     0000167D (5757)\n-FB022 Filename Length       0075 (117)\n-FB024 Extra Length          0000 (0)\n-FB026 Comment Length        0000 (0)\n-FB028 Disk Start            0000 (0)\n-FB02A Int File Attributes   0000 (0)\n+FBC81 Compression Method    0008 (8) 'Deflated'\n+FBC83 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+FBC87 CRC                   4BB1EABD (1269951165)\n+FBC8B Compressed Size       00000764 (1892)\n+FBC8F Uncompressed Size     0000167D (5757)\n+FBC93 Filename Length       0075 (117)\n+FBC95 Extra Length          0000 (0)\n+FBC97 Comment Length        0000 (0)\n+FBC99 Disk Start            0000 (0)\n+FBC9B Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-FB02C Ext File Attributes   81A40000 (2175008768)\n+FBC9D Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-FB030 Local Header Offset   0005B0E1 (372961)\n-FB034 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+FBCA1 Local Header Offset   0005B8B8 (374968)\n+FBCA5 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xFB034: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xFBCA5: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-FB0A9 CENTRAL HEADER #455   02014B50 (33639248)\n-FB0AD Created Zip Spec      14 (20) '2.0'\n-FB0AE Created OS            03 (3) 'Unix'\n-FB0AF Extract Zip Spec      14 (20) '2.0'\n-FB0B0 Extract OS            00 (0) 'MS-DOS'\n-FB0B1 General Purpose Flag  0800 (2048)\n+FBD1A CENTRAL HEADER #455   02014B50 (33639248)\n+FBD1E Created Zip Spec      14 (20) '2.0'\n+FBD1F Created OS            03 (3) 'Unix'\n+FBD20 Extract Zip Spec      14 (20) '2.0'\n+FBD21 Extract OS            00 (0) 'MS-DOS'\n+FBD22 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-FB0B3 Compression Method    0008 (8) 'Deflated'\n-FB0B5 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-FB0B9 CRC                   A18A8EB9 (2710212281)\n-FB0BD Compressed Size       000011B4 (4532)\n-FB0C1 Uncompressed Size     0000328A (12938)\n-FB0C5 Filename Length       0075 (117)\n-FB0C7 Extra Length          0000 (0)\n-FB0C9 Comment Length        0000 (0)\n-FB0CB Disk Start            0000 (0)\n-FB0CD Int File Attributes   0000 (0)\n+FBD24 Compression Method    0008 (8) 'Deflated'\n+FBD26 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+FBD2A CRC                   A18A8EB9 (2710212281)\n+FBD2E Compressed Size       000011B4 (4532)\n+FBD32 Uncompressed Size     0000328A (12938)\n+FBD36 Filename Length       0075 (117)\n+FBD38 Extra Length          0000 (0)\n+FBD3A Comment Length        0000 (0)\n+FBD3C Disk Start            0000 (0)\n+FBD3E Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-FB0CF Ext File Attributes   81A40000 (2175008768)\n+FBD40 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-FB0D3 Local Header Offset   0005B8D8 (375000)\n-FB0D7 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+FBD44 Local Header Offset   0005C0AF (377007)\n+FBD48 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xFB0D7: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xFBD48: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-FB14C CENTRAL HEADER #456   02014B50 (33639248)\n-FB150 Created Zip Spec      14 (20) '2.0'\n-FB151 Created OS            03 (3) 'Unix'\n-FB152 Extract Zip Spec      14 (20) '2.0'\n-FB153 Extract OS            00 (0) 'MS-DOS'\n-FB154 General Purpose Flag  0800 (2048)\n+FBDBD CENTRAL HEADER #456   02014B50 (33639248)\n+FBDC1 Created Zip Spec      14 (20) '2.0'\n+FBDC2 Created OS            03 (3) 'Unix'\n+FBDC3 Extract Zip Spec      14 (20) '2.0'\n+FBDC4 Extract OS            00 (0) 'MS-DOS'\n+FBDC5 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-FB156 Compression Method    0008 (8) 'Deflated'\n-FB158 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-FB15C CRC                   B7B762D6 (3082248918)\n-FB160 Compressed Size       0000132C (4908)\n-FB164 Uncompressed Size     00003879 (14457)\n-FB168 Filename Length       0074 (116)\n-FB16A Extra Length          0000 (0)\n-FB16C Comment Length        0000 (0)\n-FB16E Disk Start            0000 (0)\n-FB170 Int File Attributes   0000 (0)\n+FBDC7 Compression Method    0008 (8) 'Deflated'\n+FBDC9 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+FBDCD CRC                   B7B762D6 (3082248918)\n+FBDD1 Compressed Size       0000132C (4908)\n+FBDD5 Uncompressed Size     00003879 (14457)\n+FBDD9 Filename Length       0074 (116)\n+FBDDB Extra Length          0000 (0)\n+FBDDD Comment Length        0000 (0)\n+FBDDF Disk Start            0000 (0)\n+FBDE1 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-FB172 Ext File Attributes   81A40000 (2175008768)\n+FBDE3 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-FB176 Local Header Offset   0005CB1F (379679)\n-FB17A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+FBDE7 Local Header Offset   0005D2F6 (381686)\n+FBDEB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xFB17A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xFBDEB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-FB1EE CENTRAL HEADER #457   02014B50 (33639248)\n-FB1F2 Created Zip Spec      14 (20) '2.0'\n-FB1F3 Created OS            03 (3) 'Unix'\n-FB1F4 Extract Zip Spec      14 (20) '2.0'\n-FB1F5 Extract OS            00 (0) 'MS-DOS'\n-FB1F6 General Purpose Flag  0800 (2048)\n+FBE5F CENTRAL HEADER #457   02014B50 (33639248)\n+FBE63 Created Zip Spec      14 (20) '2.0'\n+FBE64 Created OS            03 (3) 'Unix'\n+FBE65 Extract Zip Spec      14 (20) '2.0'\n+FBE66 Extract OS            00 (0) 'MS-DOS'\n+FBE67 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-FB1F8 Compression Method    0008 (8) 'Deflated'\n-FB1FA Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-FB1FE CRC                   A2B9D29A (2730087066)\n-FB202 Compressed Size       00000B19 (2841)\n-FB206 Uncompressed Size     00002150 (8528)\n-FB20A Filename Length       0078 (120)\n-FB20C Extra Length          0000 (0)\n-FB20E Comment Length        0000 (0)\n-FB210 Disk Start            0000 (0)\n-FB212 Int File Attributes   0000 (0)\n+FBE69 Compression Method    0008 (8) 'Deflated'\n+FBE6B Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+FBE6F CRC                   A2B9D29A (2730087066)\n+FBE73 Compressed Size       00000B19 (2841)\n+FBE77 Uncompressed Size     00002150 (8528)\n+FBE7B Filename Length       0078 (120)\n+FBE7D Extra Length          0000 (0)\n+FBE7F Comment Length        0000 (0)\n+FBE81 Disk Start            0000 (0)\n+FBE83 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-FB214 Ext File Attributes   81A40000 (2175008768)\n+FBE85 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-FB218 Local Header Offset   0005DEDD (384733)\n-FB21C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+FBE89 Local Header Offset   0005E6B4 (386740)\n+FBE8D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xFB21C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xFBE8D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-FB294 CENTRAL HEADER #458   02014B50 (33639248)\n-FB298 Created Zip Spec      14 (20) '2.0'\n-FB299 Created OS            03 (3) 'Unix'\n-FB29A Extract Zip Spec      14 (20) '2.0'\n-FB29B Extract OS            00 (0) 'MS-DOS'\n-FB29C General Purpose Flag  0800 (2048)\n+FBF05 CENTRAL HEADER #458   02014B50 (33639248)\n+FBF09 Created Zip Spec      14 (20) '2.0'\n+FBF0A Created OS            03 (3) 'Unix'\n+FBF0B Extract Zip Spec      14 (20) '2.0'\n+FBF0C Extract OS            00 (0) 'MS-DOS'\n+FBF0D General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-FB29E Compression Method    0008 (8) 'Deflated'\n-FB2A0 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-FB2A4 CRC                   C4FC7EA2 (3304881826)\n-FB2A8 Compressed Size       00000790 (1936)\n-FB2AC Uncompressed Size     000011DC (4572)\n-FB2B0 Filename Length       0071 (113)\n-FB2B2 Extra Length          0000 (0)\n-FB2B4 Comment Length        0000 (0)\n-FB2B6 Disk Start            0000 (0)\n-FB2B8 Int File Attributes   0000 (0)\n+FBF0F Compression Method    0008 (8) 'Deflated'\n+FBF11 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+FBF15 CRC                   C4FC7EA2 (3304881826)\n+FBF19 Compressed Size       00000790 (1936)\n+FBF1D Uncompressed Size     000011DC (4572)\n+FBF21 Filename Length       0071 (113)\n+FBF23 Extra Length          0000 (0)\n+FBF25 Comment Length        0000 (0)\n+FBF27 Disk Start            0000 (0)\n+FBF29 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-FB2BA Ext File Attributes   81A40000 (2175008768)\n+FBF2B Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-FB2BE Local Header Offset   0005EA8C (387724)\n-FB2C2 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+FBF2F Local Header Offset   0005F263 (389731)\n+FBF33 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xFB2C2: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xFBF33: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-FB333 CENTRAL HEADER #459   02014B50 (33639248)\n-FB337 Created Zip Spec      14 (20) '2.0'\n-FB338 Created OS            03 (3) 'Unix'\n-FB339 Extract Zip Spec      14 (20) '2.0'\n-FB33A Extract OS            00 (0) 'MS-DOS'\n-FB33B General Purpose Flag  0800 (2048)\n+FBFA4 CENTRAL HEADER #459   02014B50 (33639248)\n+FBFA8 Created Zip Spec      14 (20) '2.0'\n+FBFA9 Created OS            03 (3) 'Unix'\n+FBFAA Extract Zip Spec      14 (20) '2.0'\n+FBFAB Extract OS            00 (0) 'MS-DOS'\n+FBFAC General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-FB33D Compression Method    0008 (8) 'Deflated'\n-FB33F Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-FB343 CRC                   EE30A8D8 (3996166360)\n-FB347 Compressed Size       00001911 (6417)\n-FB34B Uncompressed Size     000072FB (29435)\n-FB34F Filename Length       0074 (116)\n-FB351 Extra Length          0000 (0)\n-FB353 Comment Length        0000 (0)\n-FB355 Disk Start            0000 (0)\n-FB357 Int File Attributes   0000 (0)\n+FBFAE Compression Method    0008 (8) 'Deflated'\n+FBFB0 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+FBFB4 CRC                   EE30A8D8 (3996166360)\n+FBFB8 Compressed Size       00001911 (6417)\n+FBFBC Uncompressed Size     000072FB (29435)\n+FBFC0 Filename Length       0074 (116)\n+FBFC2 Extra Length          0000 (0)\n+FBFC4 Comment Length        0000 (0)\n+FBFC6 Disk Start            0000 (0)\n+FBFC8 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-FB359 Ext File Attributes   81A40000 (2175008768)\n+FBFCA Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-FB35D Local Header Offset   0005F2AB (389803)\n-FB361 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+FBFCE Local Header Offset   0005FA82 (391810)\n+FBFD2 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xFB361: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xFBFD2: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-FB3D5 CENTRAL HEADER #460   02014B50 (33639248)\n-FB3D9 Created Zip Spec      14 (20) '2.0'\n-FB3DA Created OS            03 (3) 'Unix'\n-FB3DB Extract Zip Spec      14 (20) '2.0'\n-FB3DC Extract OS            00 (0) 'MS-DOS'\n-FB3DD General Purpose Flag  0800 (2048)\n+FC046 CENTRAL HEADER #460   02014B50 (33639248)\n+FC04A Created Zip Spec      14 (20) '2.0'\n+FC04B Created OS            03 (3) 'Unix'\n+FC04C Extract Zip Spec      14 (20) '2.0'\n+FC04D Extract OS            00 (0) 'MS-DOS'\n+FC04E General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-FB3DF Compression Method    0008 (8) 'Deflated'\n-FB3E1 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-FB3E5 CRC                   EA36353C (3929421116)\n-FB3E9 Compressed Size       0000104B (4171)\n-FB3ED Uncompressed Size     0000480E (18446)\n-FB3F1 Filename Length       007A (122)\n-FB3F3 Extra Length          0000 (0)\n-FB3F5 Comment Length        0000 (0)\n-FB3F7 Disk Start            0000 (0)\n-FB3F9 Int File Attributes   0000 (0)\n+FC050 Compression Method    0008 (8) 'Deflated'\n+FC052 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+FC056 CRC                   EA36353C (3929421116)\n+FC05A Compressed Size       0000104B (4171)\n+FC05E Uncompressed Size     0000480E (18446)\n+FC062 Filename Length       007A (122)\n+FC064 Extra Length          0000 (0)\n+FC066 Comment Length        0000 (0)\n+FC068 Disk Start            0000 (0)\n+FC06A Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-FB3FB Ext File Attributes   81A40000 (2175008768)\n+FC06C Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-FB3FF Local Header Offset   00060C4E (396366)\n-FB403 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+FC070 Local Header Offset   00061425 (398373)\n+FC074 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xFB403: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xFC074: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-FB47D CENTRAL HEADER #461   02014B50 (33639248)\n-FB481 Created Zip Spec      14 (20) '2.0'\n-FB482 Created OS            03 (3) 'Unix'\n-FB483 Extract Zip Spec      14 (20) '2.0'\n-FB484 Extract OS            00 (0) 'MS-DOS'\n-FB485 General Purpose Flag  0800 (2048)\n+FC0EE CENTRAL HEADER #461   02014B50 (33639248)\n+FC0F2 Created Zip Spec      14 (20) '2.0'\n+FC0F3 Created OS            03 (3) 'Unix'\n+FC0F4 Extract Zip Spec      14 (20) '2.0'\n+FC0F5 Extract OS            00 (0) 'MS-DOS'\n+FC0F6 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-FB487 Compression Method    0008 (8) 'Deflated'\n-FB489 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-FB48D CRC                   CA474DE0 (3393670624)\n-FB491 Compressed Size       0000039D (925)\n-FB495 Uncompressed Size     000007B6 (1974)\n-FB499 Filename Length       0079 (121)\n-FB49B Extra Length          0000 (0)\n-FB49D Comment Length        0000 (0)\n-FB49F Disk Start            0000 (0)\n-FB4A1 Int File Attributes   0000 (0)\n+FC0F8 Compression Method    0008 (8) 'Deflated'\n+FC0FA Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+FC0FE CRC                   CA474DE0 (3393670624)\n+FC102 Compressed Size       0000039D (925)\n+FC106 Uncompressed Size     000007B6 (1974)\n+FC10A Filename Length       0079 (121)\n+FC10C Extra Length          0000 (0)\n+FC10E Comment Length        0000 (0)\n+FC110 Disk Start            0000 (0)\n+FC112 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-FB4A3 Ext File Attributes   81A40000 (2175008768)\n+FC114 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-FB4A7 Local Header Offset   00061D31 (400689)\n-FB4AB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+FC118 Local Header Offset   00062508 (402696)\n+FC11C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xFB4AB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xFC11C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-FB524 CENTRAL HEADER #462   02014B50 (33639248)\n-FB528 Created Zip Spec      14 (20) '2.0'\n-FB529 Created OS            03 (3) 'Unix'\n-FB52A Extract Zip Spec      14 (20) '2.0'\n-FB52B Extract OS            00 (0) 'MS-DOS'\n-FB52C General Purpose Flag  0800 (2048)\n+FC195 CENTRAL HEADER #462   02014B50 (33639248)\n+FC199 Created Zip Spec      14 (20) '2.0'\n+FC19A Created OS            03 (3) 'Unix'\n+FC19B Extract Zip Spec      14 (20) '2.0'\n+FC19C Extract OS            00 (0) 'MS-DOS'\n+FC19D General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-FB52E Compression Method    0008 (8) 'Deflated'\n-FB530 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-FB534 CRC                   A19F99D4 (2711591380)\n-FB538 Compressed Size       0000065E (1630)\n-FB53C Uncompressed Size     000011CB (4555)\n-FB540 Filename Length       0075 (117)\n-FB542 Extra Length          0000 (0)\n-FB544 Comment Length        0000 (0)\n-FB546 Disk Start            0000 (0)\n-FB548 Int File Attributes   0000 (0)\n+FC19F Compression Method    0008 (8) 'Deflated'\n+FC1A1 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+FC1A5 CRC                   A19F99D4 (2711591380)\n+FC1A9 Compressed Size       0000065E (1630)\n+FC1AD Uncompressed Size     000011CB (4555)\n+FC1B1 Filename Length       0075 (117)\n+FC1B3 Extra Length          0000 (0)\n+FC1B5 Comment Length        0000 (0)\n+FC1B7 Disk Start            0000 (0)\n+FC1B9 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-FB54A Ext File Attributes   81A40000 (2175008768)\n+FC1BB Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-FB54E Local Header Offset   00062165 (401765)\n-FB552 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+FC1BF Local Header Offset   0006293C (403772)\n+FC1C3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xFB552: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xFC1C3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-FB5C7 CENTRAL HEADER #463   02014B50 (33639248)\n-FB5CB Created Zip Spec      14 (20) '2.0'\n-FB5CC Created OS            03 (3) 'Unix'\n-FB5CD Extract Zip Spec      14 (20) '2.0'\n-FB5CE Extract OS            00 (0) 'MS-DOS'\n-FB5CF General Purpose Flag  0800 (2048)\n+FC238 CENTRAL HEADER #463   02014B50 (33639248)\n+FC23C Created Zip Spec      14 (20) '2.0'\n+FC23D Created OS            03 (3) 'Unix'\n+FC23E Extract Zip Spec      14 (20) '2.0'\n+FC23F Extract OS            00 (0) 'MS-DOS'\n+FC240 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-FB5D1 Compression Method    0008 (8) 'Deflated'\n-FB5D3 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-FB5D7 CRC                   7573E84B (1970530379)\n-FB5DB Compressed Size       00000ED9 (3801)\n-FB5DF Uncompressed Size     0000284F (10319)\n-FB5E3 Filename Length       0071 (113)\n-FB5E5 Extra Length          0000 (0)\n-FB5E7 Comment Length        0000 (0)\n-FB5E9 Disk Start            0000 (0)\n-FB5EB Int File Attributes   0000 (0)\n+FC242 Compression Method    0008 (8) 'Deflated'\n+FC244 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+FC248 CRC                   7573E84B (1970530379)\n+FC24C Compressed Size       00000ED9 (3801)\n+FC250 Uncompressed Size     0000284F (10319)\n+FC254 Filename Length       0071 (113)\n+FC256 Extra Length          0000 (0)\n+FC258 Comment Length        0000 (0)\n+FC25A Disk Start            0000 (0)\n+FC25C Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-FB5ED Ext File Attributes   81A40000 (2175008768)\n+FC25E Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-FB5F1 Local Header Offset   00062856 (403542)\n-FB5F5 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+FC262 Local Header Offset   0006302D (405549)\n+FC266 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xFB5F5: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xFC266: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-FB666 CENTRAL HEADER #464   02014B50 (33639248)\n-FB66A Created Zip Spec      14 (20) '2.0'\n-FB66B Created OS            03 (3) 'Unix'\n-FB66C Extract Zip Spec      14 (20) '2.0'\n-FB66D Extract OS            00 (0) 'MS-DOS'\n-FB66E General Purpose Flag  0800 (2048)\n+FC2D7 CENTRAL HEADER #464   02014B50 (33639248)\n+FC2DB Created Zip Spec      14 (20) '2.0'\n+FC2DC Created OS            03 (3) 'Unix'\n+FC2DD Extract Zip Spec      14 (20) '2.0'\n+FC2DE Extract OS            00 (0) 'MS-DOS'\n+FC2DF General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-FB670 Compression Method    0008 (8) 'Deflated'\n-FB672 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-FB676 CRC                   131CB9D8 (320649688)\n-FB67A Compressed Size       00000B4D (2893)\n-FB67E Uncompressed Size     00002777 (10103)\n-FB682 Filename Length       0075 (117)\n-FB684 Extra Length          0000 (0)\n-FB686 Comment Length        0000 (0)\n-FB688 Disk Start            0000 (0)\n-FB68A Int File Attributes   0000 (0)\n+FC2E1 Compression Method    0008 (8) 'Deflated'\n+FC2E3 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+FC2E7 CRC                   131CB9D8 (320649688)\n+FC2EB Compressed Size       00000B4D (2893)\n+FC2EF Uncompressed Size     00002777 (10103)\n+FC2F3 Filename Length       0075 (117)\n+FC2F5 Extra Length          0000 (0)\n+FC2F7 Comment Length        0000 (0)\n+FC2F9 Disk Start            0000 (0)\n+FC2FB Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-FB68C Ext File Attributes   81A40000 (2175008768)\n+FC2FD Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-FB690 Local Header Offset   000637BE (407486)\n-FB694 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+FC301 Local Header Offset   00063F95 (409493)\n+FC305 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xFB694: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xFC305: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-FB709 CENTRAL HEADER #465   02014B50 (33639248)\n-FB70D Created Zip Spec      14 (20) '2.0'\n-FB70E Created OS            03 (3) 'Unix'\n-FB70F Extract Zip Spec      14 (20) '2.0'\n-FB710 Extract OS            00 (0) 'MS-DOS'\n-FB711 General Purpose Flag  0800 (2048)\n+FC37A CENTRAL HEADER #465   02014B50 (33639248)\n+FC37E Created Zip Spec      14 (20) '2.0'\n+FC37F Created OS            03 (3) 'Unix'\n+FC380 Extract Zip Spec      14 (20) '2.0'\n+FC381 Extract OS            00 (0) 'MS-DOS'\n+FC382 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-FB713 Compression Method    0008 (8) 'Deflated'\n-FB715 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-FB719 CRC                   95FAB1DA (2516234714)\n-FB71D Compressed Size       00000678 (1656)\n-FB721 Uncompressed Size     0000110D (4365)\n-FB725 Filename Length       0074 (116)\n-FB727 Extra Length          0000 (0)\n-FB729 Comment Length        0000 (0)\n-FB72B Disk Start            0000 (0)\n-FB72D Int File Attributes   0000 (0)\n+FC384 Compression Method    0008 (8) 'Deflated'\n+FC386 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+FC38A CRC                   95FAB1DA (2516234714)\n+FC38E Compressed Size       00000678 (1656)\n+FC392 Uncompressed Size     0000110D (4365)\n+FC396 Filename Length       0074 (116)\n+FC398 Extra Length          0000 (0)\n+FC39A Comment Length        0000 (0)\n+FC39C Disk Start            0000 (0)\n+FC39E Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-FB72F Ext File Attributes   81A40000 (2175008768)\n+FC3A0 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-FB733 Local Header Offset   0006439E (410526)\n-FB737 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+FC3A4 Local Header Offset   00064B75 (412533)\n+FC3A8 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xFB737: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xFC3A8: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-FB7AB CENTRAL HEADER #466   02014B50 (33639248)\n-FB7AF Created Zip Spec      14 (20) '2.0'\n-FB7B0 Created OS            03 (3) 'Unix'\n-FB7B1 Extract Zip Spec      14 (20) '2.0'\n-FB7B2 Extract OS            00 (0) 'MS-DOS'\n-FB7B3 General Purpose Flag  0800 (2048)\n+FC41C CENTRAL HEADER #466   02014B50 (33639248)\n+FC420 Created Zip Spec      14 (20) '2.0'\n+FC421 Created OS            03 (3) 'Unix'\n+FC422 Extract Zip Spec      14 (20) '2.0'\n+FC423 Extract OS            00 (0) 'MS-DOS'\n+FC424 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-FB7B5 Compression Method    0008 (8) 'Deflated'\n-FB7B7 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-FB7BB CRC                   B1E82858 (2984781912)\n-FB7BF Compressed Size       000007DE (2014)\n-FB7C3 Uncompressed Size     000019D6 (6614)\n-FB7C7 Filename Length       0077 (119)\n-FB7C9 Extra Length          0000 (0)\n-FB7CB Comment Length        0000 (0)\n-FB7CD Disk Start            0000 (0)\n-FB7CF Int File Attributes   0000 (0)\n+FC426 Compression Method    0008 (8) 'Deflated'\n+FC428 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+FC42C CRC                   B1E82858 (2984781912)\n+FC430 Compressed Size       000007DE (2014)\n+FC434 Uncompressed Size     000019D6 (6614)\n+FC438 Filename Length       0077 (119)\n+FC43A Extra Length          0000 (0)\n+FC43C Comment Length        0000 (0)\n+FC43E Disk Start            0000 (0)\n+FC440 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-FB7D1 Ext File Attributes   81A40000 (2175008768)\n+FC442 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-FB7D5 Local Header Offset   00064AA8 (412328)\n-FB7D9 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+FC446 Local Header Offset   0006527F (414335)\n+FC44A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xFB7D9: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xFC44A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-FB850 CENTRAL HEADER #467   02014B50 (33639248)\n-FB854 Created Zip Spec      14 (20) '2.0'\n-FB855 Created OS            03 (3) 'Unix'\n-FB856 Extract Zip Spec      14 (20) '2.0'\n-FB857 Extract OS            00 (0) 'MS-DOS'\n-FB858 General Purpose Flag  0800 (2048)\n+FC4C1 CENTRAL HEADER #467   02014B50 (33639248)\n+FC4C5 Created Zip Spec      14 (20) '2.0'\n+FC4C6 Created OS            03 (3) 'Unix'\n+FC4C7 Extract Zip Spec      14 (20) '2.0'\n+FC4C8 Extract OS            00 (0) 'MS-DOS'\n+FC4C9 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-FB85A Compression Method    0008 (8) 'Deflated'\n-FB85C Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-FB860 CRC                   EA13965E (3927152222)\n-FB864 Compressed Size       00000529 (1321)\n-FB868 Uncompressed Size     00000F7E (3966)\n-FB86C Filename Length       0074 (116)\n-FB86E Extra Length          0000 (0)\n-FB870 Comment Length        0000 (0)\n-FB872 Disk Start            0000 (0)\n-FB874 Int File Attributes   0000 (0)\n+FC4CB Compression Method    0008 (8) 'Deflated'\n+FC4CD Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+FC4D1 CRC                   EA13965E (3927152222)\n+FC4D5 Compressed Size       00000529 (1321)\n+FC4D9 Uncompressed Size     00000F7E (3966)\n+FC4DD Filename Length       0074 (116)\n+FC4DF Extra Length          0000 (0)\n+FC4E1 Comment Length        0000 (0)\n+FC4E3 Disk Start            0000 (0)\n+FC4E5 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-FB876 Ext File Attributes   81A40000 (2175008768)\n+FC4E7 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-FB87A Local Header Offset   0006531B (414491)\n-FB87E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+FC4EB Local Header Offset   00065AF2 (416498)\n+FC4EF Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xFB87E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xFC4EF: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-FB8F2 CENTRAL HEADER #468   02014B50 (33639248)\n-FB8F6 Created Zip Spec      14 (20) '2.0'\n-FB8F7 Created OS            03 (3) 'Unix'\n-FB8F8 Extract Zip Spec      14 (20) '2.0'\n-FB8F9 Extract OS            00 (0) 'MS-DOS'\n-FB8FA General Purpose Flag  0800 (2048)\n+FC563 CENTRAL HEADER #468   02014B50 (33639248)\n+FC567 Created Zip Spec      14 (20) '2.0'\n+FC568 Created OS            03 (3) 'Unix'\n+FC569 Extract Zip Spec      14 (20) '2.0'\n+FC56A Extract OS            00 (0) 'MS-DOS'\n+FC56B General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-FB8FC Compression Method    0008 (8) 'Deflated'\n-FB8FE Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-FB902 CRC                   C8903588 (3364894088)\n-FB906 Compressed Size       00000D5E (3422)\n-FB90A Uncompressed Size     00002CD6 (11478)\n-FB90E Filename Length       006D (109)\n-FB910 Extra Length          0000 (0)\n-FB912 Comment Length        0000 (0)\n-FB914 Disk Start            0000 (0)\n-FB916 Int File Attributes   0000 (0)\n+FC56D Compression Method    0008 (8) 'Deflated'\n+FC56F Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+FC573 CRC                   C8903588 (3364894088)\n+FC577 Compressed Size       00000D5E (3422)\n+FC57B Uncompressed Size     00002CD6 (11478)\n+FC57F Filename Length       006D (109)\n+FC581 Extra Length          0000 (0)\n+FC583 Comment Length        0000 (0)\n+FC585 Disk Start            0000 (0)\n+FC587 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-FB918 Ext File Attributes   81A40000 (2175008768)\n+FC589 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-FB91C Local Header Offset   000658D6 (415958)\n-FB920 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+FC58D Local Header Offset   000660AD (417965)\n+FC591 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xFB920: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xFC591: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-FB98D CENTRAL HEADER #469   02014B50 (33639248)\n-FB991 Created Zip Spec      14 (20) '2.0'\n-FB992 Created OS            03 (3) 'Unix'\n-FB993 Extract Zip Spec      14 (20) '2.0'\n-FB994 Extract OS            00 (0) 'MS-DOS'\n-FB995 General Purpose Flag  0800 (2048)\n+FC5FE CENTRAL HEADER #469   02014B50 (33639248)\n+FC602 Created Zip Spec      14 (20) '2.0'\n+FC603 Created OS            03 (3) 'Unix'\n+FC604 Extract Zip Spec      14 (20) '2.0'\n+FC605 Extract OS            00 (0) 'MS-DOS'\n+FC606 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-FB997 Compression Method    0008 (8) 'Deflated'\n-FB999 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-FB99D CRC                   D19560D0 (3516227792)\n-FB9A1 Compressed Size       000003BB (955)\n-FB9A5 Uncompressed Size     00000A2F (2607)\n-FB9A9 Filename Length       007E (126)\n-FB9AB Extra Length          0000 (0)\n-FB9AD Comment Length        0000 (0)\n-FB9AF Disk Start            0000 (0)\n-FB9B1 Int File Attributes   0000 (0)\n+FC608 Compression Method    0008 (8) 'Deflated'\n+FC60A Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+FC60E CRC                   D19560D0 (3516227792)\n+FC612 Compressed Size       000003BB (955)\n+FC616 Uncompressed Size     00000A2F (2607)\n+FC61A Filename Length       007E (126)\n+FC61C Extra Length          0000 (0)\n+FC61E Comment Length        0000 (0)\n+FC620 Disk Start            0000 (0)\n+FC622 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-FB9B3 Ext File Attributes   81A40000 (2175008768)\n+FC624 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-FB9B7 Local Header Offset   000666BF (419519)\n-FB9BB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+FC628 Local Header Offset   00066E96 (421526)\n+FC62C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xFB9BB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xFC62C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-FBA39 CENTRAL HEADER #470   02014B50 (33639248)\n-FBA3D Created Zip Spec      14 (20) '2.0'\n-FBA3E Created OS            03 (3) 'Unix'\n-FBA3F Extract Zip Spec      14 (20) '2.0'\n-FBA40 Extract OS            00 (0) 'MS-DOS'\n-FBA41 General Purpose Flag  0800 (2048)\n+FC6AA CENTRAL HEADER #470   02014B50 (33639248)\n+FC6AE Created Zip Spec      14 (20) '2.0'\n+FC6AF Created OS            03 (3) 'Unix'\n+FC6B0 Extract Zip Spec      14 (20) '2.0'\n+FC6B1 Extract OS            00 (0) 'MS-DOS'\n+FC6B2 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-FBA43 Compression Method    0008 (8) 'Deflated'\n-FBA45 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-FBA49 CRC                   A1414F13 (2705411859)\n-FBA4D Compressed Size       00001BE4 (7140)\n-FBA51 Uncompressed Size     0000521D (21021)\n-FBA55 Filename Length       0085 (133)\n-FBA57 Extra Length          0000 (0)\n-FBA59 Comment Length        0000 (0)\n-FBA5B Disk Start            0000 (0)\n-FBA5D Int File Attributes   0000 (0)\n+FC6B4 Compression Method    0008 (8) 'Deflated'\n+FC6B6 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+FC6BA CRC                   A1414F13 (2705411859)\n+FC6BE Compressed Size       00001BE4 (7140)\n+FC6C2 Uncompressed Size     0000521D (21021)\n+FC6C6 Filename Length       0085 (133)\n+FC6C8 Extra Length          0000 (0)\n+FC6CA Comment Length        0000 (0)\n+FC6CC Disk Start            0000 (0)\n+FC6CE Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-FBA5F Ext File Attributes   81A40000 (2175008768)\n+FC6D0 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-FBA63 Local Header Offset   00066B16 (420630)\n-FBA67 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+FC6D4 Local Header Offset   000672ED (422637)\n+FC6D8 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             X'\n #\n-# WARNING: Offset 0xFBA67: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xFC6D8: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-FBAEC CENTRAL HEADER #471   02014B50 (33639248)\n-FBAF0 Created Zip Spec      14 (20) '2.0'\n-FBAF1 Created OS            03 (3) 'Unix'\n-FBAF2 Extract Zip Spec      14 (20) '2.0'\n-FBAF3 Extract OS            00 (0) 'MS-DOS'\n-FBAF4 General Purpose Flag  0800 (2048)\n+FC75D CENTRAL HEADER #471   02014B50 (33639248)\n+FC761 Created Zip Spec      14 (20) '2.0'\n+FC762 Created OS            03 (3) 'Unix'\n+FC763 Extract Zip Spec      14 (20) '2.0'\n+FC764 Extract OS            00 (0) 'MS-DOS'\n+FC765 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-FBAF6 Compression Method    0008 (8) 'Deflated'\n-FBAF8 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-FBAFC CRC                   CB05D09B (3406155931)\n-FBB00 Compressed Size       000017FC (6140)\n-FBB04 Uncompressed Size     00005230 (21040)\n-FBB08 Filename Length       0082 (130)\n-FBB0A Extra Length          0000 (0)\n-FBB0C Comment Length        0000 (0)\n-FBB0E Disk Start            0000 (0)\n-FBB10 Int File Attributes   0000 (0)\n+FC767 Compression Method    0008 (8) 'Deflated'\n+FC769 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+FC76D CRC                   CB05D09B (3406155931)\n+FC771 Compressed Size       000017FC (6140)\n+FC775 Uncompressed Size     00005230 (21040)\n+FC779 Filename Length       0082 (130)\n+FC77B Extra Length          0000 (0)\n+FC77D Comment Length        0000 (0)\n+FC77F Disk Start            0000 (0)\n+FC781 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-FBB12 Ext File Attributes   81A40000 (2175008768)\n+FC783 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-FBB16 Local Header Offset   0006879D (427933)\n-FBB1A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+FC787 Local Header Offset   00068F74 (429940)\n+FC78B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xFBB1A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xFC78B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-FBB9C CENTRAL HEADER #472   02014B50 (33639248)\n-FBBA0 Created Zip Spec      14 (20) '2.0'\n-FBBA1 Created OS            03 (3) 'Unix'\n-FBBA2 Extract Zip Spec      14 (20) '2.0'\n-FBBA3 Extract OS            00 (0) 'MS-DOS'\n-FBBA4 General Purpose Flag  0800 (2048)\n+FC80D CENTRAL HEADER #472   02014B50 (33639248)\n+FC811 Created Zip Spec      14 (20) '2.0'\n+FC812 Created OS            03 (3) 'Unix'\n+FC813 Extract Zip Spec      14 (20) '2.0'\n+FC814 Extract OS            00 (0) 'MS-DOS'\n+FC815 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-FBBA6 Compression Method    0008 (8) 'Deflated'\n-FBBA8 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-FBBAC CRC                   17E2323C (400699964)\n-FBBB0 Compressed Size       00000487 (1159)\n-FBBB4 Uncompressed Size     00000904 (2308)\n-FBBB8 Filename Length       0086 (134)\n-FBBBA Extra Length          0000 (0)\n-FBBBC Comment Length        0000 (0)\n-FBBBE Disk Start            0000 (0)\n-FBBC0 Int File Attributes   0000 (0)\n+FC817 Compression Method    0008 (8) 'Deflated'\n+FC819 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+FC81D CRC                   17E2323C (400699964)\n+FC821 Compressed Size       00000487 (1159)\n+FC825 Uncompressed Size     00000904 (2308)\n+FC829 Filename Length       0086 (134)\n+FC82B Extra Length          0000 (0)\n+FC82D Comment Length        0000 (0)\n+FC82F Disk Start            0000 (0)\n+FC831 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-FBBC2 Ext File Attributes   81A40000 (2175008768)\n+FC833 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-FBBC6 Local Header Offset   0006A039 (434233)\n-FBBCA Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+FC837 Local Header Offset   0006A810 (436240)\n+FC83B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             XX'\n #\n-# WARNING: Offset 0xFBBCA: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xFC83B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-FBC50 CENTRAL HEADER #473   02014B50 (33639248)\n-FBC54 Created Zip Spec      14 (20) '2.0'\n-FBC55 Created OS            03 (3) 'Unix'\n-FBC56 Extract Zip Spec      14 (20) '2.0'\n-FBC57 Extract OS            00 (0) 'MS-DOS'\n-FBC58 General Purpose Flag  0800 (2048)\n+FC8C1 CENTRAL HEADER #473   02014B50 (33639248)\n+FC8C5 Created Zip Spec      14 (20) '2.0'\n+FC8C6 Created OS            03 (3) 'Unix'\n+FC8C7 Extract Zip Spec      14 (20) '2.0'\n+FC8C8 Extract OS            00 (0) 'MS-DOS'\n+FC8C9 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-FBC5A Compression Method    0008 (8) 'Deflated'\n-FBC5C Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-FBC60 CRC                   CC28EBBC (3425233852)\n-FBC64 Compressed Size       00000776 (1910)\n-FBC68 Uncompressed Size     00001036 (4150)\n-FBC6C Filename Length       0091 (145)\n-FBC6E Extra Length          0000 (0)\n-FBC70 Comment Length        0000 (0)\n-FBC72 Disk Start            0000 (0)\n-FBC74 Int File Attributes   0000 (0)\n+FC8CB Compression Method    0008 (8) 'Deflated'\n+FC8CD Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+FC8D1 CRC                   CC28EBBC (3425233852)\n+FC8D5 Compressed Size       00000776 (1910)\n+FC8D9 Uncompressed Size     00001036 (4150)\n+FC8DD Filename Length       0091 (145)\n+FC8DF Extra Length          0000 (0)\n+FC8E1 Comment Length        0000 (0)\n+FC8E3 Disk Start            0000 (0)\n+FC8E5 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-FBC76 Ext File Attributes   81A40000 (2175008768)\n+FC8E7 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-FBC7A Local Header Offset   0006A564 (435556)\n-FBC7E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+FC8EB Local Header Offset   0006AD3B (437563)\n+FC8EF Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n                             XXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xFBC7E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xFC8EF: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-FBD0F CENTRAL HEADER #474   02014B50 (33639248)\n-FBD13 Created Zip Spec      14 (20) '2.0'\n-FBD14 Created OS            03 (3) 'Unix'\n-FBD15 Extract Zip Spec      14 (20) '2.0'\n-FBD16 Extract OS            00 (0) 'MS-DOS'\n-FBD17 General Purpose Flag  0800 (2048)\n+FC980 CENTRAL HEADER #474   02014B50 (33639248)\n+FC984 Created Zip Spec      14 (20) '2.0'\n+FC985 Created OS            03 (3) 'Unix'\n+FC986 Extract Zip Spec      14 (20) '2.0'\n+FC987 Extract OS            00 (0) 'MS-DOS'\n+FC988 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-FBD19 Compression Method    0008 (8) 'Deflated'\n-FBD1B Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-FBD1F CRC                   3FC95820 (1070159904)\n-FBD23 Compressed Size       000004B8 (1208)\n-FBD27 Uncompressed Size     00000AD4 (2772)\n-FBD2B Filename Length       0082 (130)\n-FBD2D Extra Length          0000 (0)\n-FBD2F Comment Length        0000 (0)\n-FBD31 Disk Start            0000 (0)\n-FBD33 Int File Attributes   0000 (0)\n+FC98A Compression Method    0008 (8) 'Deflated'\n+FC98C Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+FC990 CRC                   3FC95820 (1070159904)\n+FC994 Compressed Size       000004B8 (1208)\n+FC998 Uncompressed Size     00000AD4 (2772)\n+FC99C Filename Length       0082 (130)\n+FC99E Extra Length          0000 (0)\n+FC9A0 Comment Length        0000 (0)\n+FC9A2 Disk Start            0000 (0)\n+FC9A4 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-FBD35 Ext File Attributes   81A40000 (2175008768)\n+FC9A6 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-FBD39 Local Header Offset   0006AD89 (437641)\n-FBD3D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+FC9AA Local Header Offset   0006B560 (439648)\n+FC9AE Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xFBD3D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xFC9AE: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-FBDBF CENTRAL HEADER #475   02014B50 (33639248)\n-FBDC3 Created Zip Spec      14 (20) '2.0'\n-FBDC4 Created OS            03 (3) 'Unix'\n-FBDC5 Extract Zip Spec      14 (20) '2.0'\n-FBDC6 Extract OS            00 (0) 'MS-DOS'\n-FBDC7 General Purpose Flag  0800 (2048)\n+FCA30 CENTRAL HEADER #475   02014B50 (33639248)\n+FCA34 Created Zip Spec      14 (20) '2.0'\n+FCA35 Created OS            03 (3) 'Unix'\n+FCA36 Extract Zip Spec      14 (20) '2.0'\n+FCA37 Extract OS            00 (0) 'MS-DOS'\n+FCA38 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-FBDC9 Compression Method    0008 (8) 'Deflated'\n-FBDCB Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-FBDCF CRC                   41CBDE11 (1103879697)\n-FBDD3 Compressed Size       000005EA (1514)\n-FBDD7 Uncompressed Size     00000D2F (3375)\n-FBDDB Filename Length       0071 (113)\n-FBDDD Extra Length          0000 (0)\n-FBDDF Comment Length        0000 (0)\n-FBDE1 Disk Start            0000 (0)\n-FBDE3 Int File Attributes   0000 (0)\n+FCA3A Compression Method    0008 (8) 'Deflated'\n+FCA3C Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+FCA40 CRC                   41CBDE11 (1103879697)\n+FCA44 Compressed Size       000005EA (1514)\n+FCA48 Uncompressed Size     00000D2F (3375)\n+FCA4C Filename Length       0071 (113)\n+FCA4E Extra Length          0000 (0)\n+FCA50 Comment Length        0000 (0)\n+FCA52 Disk Start            0000 (0)\n+FCA54 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-FBDE5 Ext File Attributes   81A40000 (2175008768)\n+FCA56 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-FBDE9 Local Header Offset   0006B2E1 (439009)\n-FBDED Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+FCA5A Local Header Offset   0006BAB8 (441016)\n+FCA5E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xFBDED: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xFCA5E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-FBE5E CENTRAL HEADER #476   02014B50 (33639248)\n-FBE62 Created Zip Spec      14 (20) '2.0'\n-FBE63 Created OS            03 (3) 'Unix'\n-FBE64 Extract Zip Spec      14 (20) '2.0'\n-FBE65 Extract OS            00 (0) 'MS-DOS'\n-FBE66 General Purpose Flag  0800 (2048)\n+FCACF CENTRAL HEADER #476   02014B50 (33639248)\n+FCAD3 Created Zip Spec      14 (20) '2.0'\n+FCAD4 Created OS            03 (3) 'Unix'\n+FCAD5 Extract Zip Spec      14 (20) '2.0'\n+FCAD6 Extract OS            00 (0) 'MS-DOS'\n+FCAD7 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-FBE68 Compression Method    0008 (8) 'Deflated'\n-FBE6A Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-FBE6E CRC                   1D768ED5 (494309077)\n-FBE72 Compressed Size       00000834 (2100)\n-FBE76 Uncompressed Size     00001C79 (7289)\n-FBE7A Filename Length       0077 (119)\n-FBE7C Extra Length          0000 (0)\n-FBE7E Comment Length        0000 (0)\n-FBE80 Disk Start            0000 (0)\n-FBE82 Int File Attributes   0000 (0)\n+FCAD9 Compression Method    0008 (8) 'Deflated'\n+FCADB Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+FCADF CRC                   1D768ED5 (494309077)\n+FCAE3 Compressed Size       00000834 (2100)\n+FCAE7 Uncompressed Size     00001C79 (7289)\n+FCAEB Filename Length       0077 (119)\n+FCAED Extra Length          0000 (0)\n+FCAEF Comment Length        0000 (0)\n+FCAF1 Disk Start            0000 (0)\n+FCAF3 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-FBE84 Ext File Attributes   81A40000 (2175008768)\n+FCAF5 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-FBE88 Local Header Offset   0006B95A (440666)\n-FBE8C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+FCAF9 Local Header Offset   0006C131 (442673)\n+FCAFD Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xFBE8C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xFCAFD: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-FBF03 CENTRAL HEADER #477   02014B50 (33639248)\n-FBF07 Created Zip Spec      14 (20) '2.0'\n-FBF08 Created OS            03 (3) 'Unix'\n-FBF09 Extract Zip Spec      14 (20) '2.0'\n-FBF0A Extract OS            00 (0) 'MS-DOS'\n-FBF0B General Purpose Flag  0800 (2048)\n+FCB74 CENTRAL HEADER #477   02014B50 (33639248)\n+FCB78 Created Zip Spec      14 (20) '2.0'\n+FCB79 Created OS            03 (3) 'Unix'\n+FCB7A Extract Zip Spec      14 (20) '2.0'\n+FCB7B Extract OS            00 (0) 'MS-DOS'\n+FCB7C General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-FBF0D Compression Method    0008 (8) 'Deflated'\n-FBF0F Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-FBF13 CRC                   7A85C658 (2055587416)\n-FBF17 Compressed Size       0000085F (2143)\n-FBF1B Uncompressed Size     00001D19 (7449)\n-FBF1F Filename Length       007F (127)\n-FBF21 Extra Length          0000 (0)\n-FBF23 Comment Length        0000 (0)\n-FBF25 Disk Start            0000 (0)\n-FBF27 Int File Attributes   0000 (0)\n+FCB7E Compression Method    0008 (8) 'Deflated'\n+FCB80 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+FCB84 CRC                   7A85C658 (2055587416)\n+FCB88 Compressed Size       0000085F (2143)\n+FCB8C Uncompressed Size     00001D19 (7449)\n+FCB90 Filename Length       007F (127)\n+FCB92 Extra Length          0000 (0)\n+FCB94 Comment Length        0000 (0)\n+FCB96 Disk Start            0000 (0)\n+FCB98 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-FBF29 Ext File Attributes   81A40000 (2175008768)\n+FCB9A Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-FBF2D Local Header Offset   0006C223 (442915)\n-FBF31 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+FCB9E Local Header Offset   0006C9FA (444922)\n+FCBA2 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xFBF31: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xFCBA2: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-FBFB0 CENTRAL HEADER #478   02014B50 (33639248)\n-FBFB4 Created Zip Spec      14 (20) '2.0'\n-FBFB5 Created OS            03 (3) 'Unix'\n-FBFB6 Extract Zip Spec      14 (20) '2.0'\n-FBFB7 Extract OS            00 (0) 'MS-DOS'\n-FBFB8 General Purpose Flag  0800 (2048)\n+FCC21 CENTRAL HEADER #478   02014B50 (33639248)\n+FCC25 Created Zip Spec      14 (20) '2.0'\n+FCC26 Created OS            03 (3) 'Unix'\n+FCC27 Extract Zip Spec      14 (20) '2.0'\n+FCC28 Extract OS            00 (0) 'MS-DOS'\n+FCC29 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-FBFBA Compression Method    0008 (8) 'Deflated'\n-FBFBC Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-FBFC0 CRC                   879A3E43 (2275032643)\n-FBFC4 Compressed Size       0007E61F (517663)\n-FBFC8 Uncompressed Size     0050F0E7 (5304551)\n-FBFCC Filename Length       001A (26)\n-FBFCE Extra Length          0000 (0)\n-FBFD0 Comment Length        0000 (0)\n-FBFD2 Disk Start            0000 (0)\n-FBFD4 Int File Attributes   0000 (0)\n+FCC2B Compression Method    0008 (8) 'Deflated'\n+FCC2D Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+FCC31 CRC                   788D733C (2022535996)\n+FCC35 Compressed Size       0007EAB9 (518841)\n+FCC39 Uncompressed Size     0050F344 (5305156)\n+FCC3D Filename Length       001A (26)\n+FCC3F Extra Length          0000 (0)\n+FCC41 Comment Length        0000 (0)\n+FCC43 Disk Start            0000 (0)\n+FCC45 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-FBFD6 Ext File Attributes   81A40000 (2175008768)\n+FCC47 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-FBFDA Local Header Offset   0006CB1F (445215)\n-FBFDE Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXX'\n+FCC4B Local Header Offset   0006D2F6 (447222)\n+FCC4F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xFBFDE: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xFCC4F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-FBFF8 CENTRAL HEADER #479   02014B50 (33639248)\n-FBFFC Created Zip Spec      14 (20) '2.0'\n-FBFFD Created OS            03 (3) 'Unix'\n-FBFFE Extract Zip Spec      14 (20) '2.0'\n-FBFFF Extract OS            00 (0) 'MS-DOS'\n-FC000 General Purpose Flag  0800 (2048)\n+FCC69 CENTRAL HEADER #479   02014B50 (33639248)\n+FCC6D Created Zip Spec      14 (20) '2.0'\n+FCC6E Created OS            03 (3) 'Unix'\n+FCC6F Extract Zip Spec      14 (20) '2.0'\n+FCC70 Extract OS            00 (0) 'MS-DOS'\n+FCC71 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-FC002 Compression Method    0008 (8) 'Deflated'\n-FC004 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-FC008 CRC                   71BCF1C4 (1908208068)\n-FC00C Compressed Size       00000778 (1912)\n-FC010 Uncompressed Size     00001C37 (7223)\n-FC014 Filename Length       003C (60)\n-FC016 Extra Length          0000 (0)\n-FC018 Comment Length        0000 (0)\n-FC01A Disk Start            0000 (0)\n-FC01C Int File Attributes   0000 (0)\n+FCC73 Compression Method    0008 (8) 'Deflated'\n+FCC75 Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+FCC79 CRC                   71BCF1C4 (1908208068)\n+FCC7D Compressed Size       00000778 (1912)\n+FCC81 Uncompressed Size     00001C37 (7223)\n+FCC85 Filename Length       003C (60)\n+FCC87 Extra Length          0000 (0)\n+FCC89 Comment Length        0000 (0)\n+FCC8B Disk Start            0000 (0)\n+FCC8D Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-FC01E Ext File Attributes   81A40000 (2175008768)\n+FCC8F Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-FC022 Local Header Offset   000EB176 (962934)\n-FC026 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+FCC93 Local Header Offset   000EBDE7 (966119)\n+FCC97 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xFC026: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xFCC97: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-FC062 CENTRAL HEADER #480   02014B50 (33639248)\n-FC066 Created Zip Spec      14 (20) '2.0'\n-FC067 Created OS            03 (3) 'Unix'\n-FC068 Extract Zip Spec      14 (20) '2.0'\n-FC069 Extract OS            00 (0) 'MS-DOS'\n-FC06A General Purpose Flag  0800 (2048)\n+FCCD3 CENTRAL HEADER #480   02014B50 (33639248)\n+FCCD7 Created Zip Spec      14 (20) '2.0'\n+FCCD8 Created OS            03 (3) 'Unix'\n+FCCD9 Extract Zip Spec      14 (20) '2.0'\n+FCCDA Extract OS            00 (0) 'MS-DOS'\n+FCCDB General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-FC06C Compression Method    0008 (8) 'Deflated'\n-FC06E Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n-FC072 CRC                   940CFA5E (2483878494)\n-FC076 Compressed Size       00000045 (69)\n-FC07A Uncompressed Size     00000048 (72)\n-FC07E Filename Length       0043 (67)\n-FC080 Extra Length          0000 (0)\n-FC082 Comment Length        0000 (0)\n-FC084 Disk Start            0000 (0)\n-FC086 Int File Attributes   0000 (0)\n+FCCDD Compression Method    0008 (8) 'Deflated'\n+FCCDF Modification Time     58E349A0 (1491290528) 'Wed Jul  3 09:13:00 2024'\n+FCCE3 CRC                   940CFA5E (2483878494)\n+FCCE7 Compressed Size       00000045 (69)\n+FCCEB Uncompressed Size     00000048 (72)\n+FCCEF Filename Length       0043 (67)\n+FCCF1 Extra Length          0000 (0)\n+FCCF3 Comment Length        0000 (0)\n+FCCF5 Disk Start            0000 (0)\n+FCCF7 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-FC088 Ext File Attributes   81A40000 (2175008768)\n+FCCF9 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-FC08C Local Header Offset   000EB948 (964936)\n-FC090 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+FCCFD Local Header Offset   000EC5B9 (968121)\n+FCD01 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xFC090: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xFCD01: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-FC0D3 END CENTRAL HEADER    06054B50 (101010256)\n-FC0D7 Number of this disk   0000 (0)\n-FC0D9 Central Dir Disk no   0000 (0)\n-FC0DB Entries in this disk  01E0 (480)\n-FC0DD Total Entries         01E0 (480)\n-FC0DF Size of Central Dir   000106E5 (67301)\n-FC0E3 Offset to Central Dir 000EB9EE (965102)\n-FC0E7 Comment Length        0000 (0)\n+FCD44 END CENTRAL HEADER    06054B50 (101010256)\n+FCD48 Number of this disk   0000 (0)\n+FCD4A Central Dir Disk no   0000 (0)\n+FCD4C Entries in this disk  01E0 (480)\n+FCD4E Total Entries         01E0 (480)\n+FCD50 Size of Central Dir   000106E5 (67301)\n+FCD54 Offset to Central Dir 000EC65F (968287)\n+FCD58 Comment Length        0000 (0)\n #\n # Error Count: 293\n # Warning Count: 1253\n #\n # Done\n"}, {"source1": "META-INF/DEPENDENCIES", "source2": "META-INF/DEPENDENCIES", "unified_diff": "@@ -61,14 +61,17 @@\n \n   - okio (https://github.com/square/okio/) com.squareup.okio:okio:jar:3.9.0\n     License: The Apache Software License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)\n \n   - okio (https://github.com/square/okio/) com.squareup.okio:okio-jvm:jar:3.9.0\n     License: The Apache Software License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)\n \n+  - dnsjava (http://www.dnsjava.org) dnsjava:dnsjava:jar:2.1.7\n+    License: BSD 2-Clause license  (http://opensource.org/licenses/BSD-2-Clause)\n+\n   - io.grpc:grpc-alts (https://github.com/grpc/grpc-java) io.grpc:grpc-alts:jar:1.58.0\n     License: Apache 2.0  (https://opensource.org/licenses/Apache-2.0)\n \n   - io.grpc:grpc-api (https://github.com/grpc/grpc-java) io.grpc:grpc-api:jar:1.58.0\n     License: Apache 2.0  (https://opensource.org/licenses/Apache-2.0)\n \n   - io.grpc:grpc-auth (https://github.com/grpc/grpc-java) io.grpc:grpc-auth:jar:1.58.0\n@@ -106,26 +109,53 @@\n \n   - io.grpc:grpc-util (https://github.com/grpc/grpc-java) io.grpc:grpc-util:jar:1.58.0\n     License: Apache 2.0  (https://opensource.org/licenses/Apache-2.0)\n \n   - io.grpc:grpc-xds (https://github.com/grpc/grpc-java) io.grpc:grpc-xds:jar:1.58.0\n     License: Apache 2.0  (https://opensource.org/licenses/Apache-2.0)\n \n+  - Netty/TomcatNative [BoringSSL - Static] (https://github.com/netty/netty-tcnative/netty-tcnative-boringssl-static/) io.netty:netty-tcnative-boringssl-static:jar:2.0.65.Final\n+    License: The Apache Software License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)\n+\n+  - Netty/TomcatNative [BoringSSL - Static] (https://github.com/netty/netty-tcnative/netty-tcnative-boringssl-static/) io.netty:netty-tcnative-boringssl-static:jar:2.0.65.Final\n+    License: The Apache Software License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)\n+\n+  - Netty/TomcatNative [BoringSSL - Static] (https://github.com/netty/netty-tcnative/netty-tcnative-boringssl-static/) io.netty:netty-tcnative-boringssl-static:jar:2.0.65.Final\n+    License: The Apache Software License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)\n+\n+  - Netty/TomcatNative [BoringSSL - Static] (https://github.com/netty/netty-tcnative/netty-tcnative-boringssl-static/) io.netty:netty-tcnative-boringssl-static:jar:2.0.65.Final\n+    License: The Apache Software License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)\n+\n+  - Netty/TomcatNative [BoringSSL - Static] (https://github.com/netty/netty-tcnative/netty-tcnative-boringssl-static/) io.netty:netty-tcnative-boringssl-static:jar:2.0.65.Final\n+    License: The Apache Software License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)\n+\n+  - Netty/TomcatNative [BoringSSL - Static] (https://github.com/netty/netty-tcnative/netty-tcnative-boringssl-static/) io.netty:netty-tcnative-boringssl-static:jar:2.0.65.Final\n+    License: The Apache Software License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)\n+\n   - OpenCensus (https://github.com/census-instrumentation/opencensus-java) io.opencensus:opencensus-api:jar:0.31.1\n     License: The Apache License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)\n \n   - OpenCensus (https://github.com/census-instrumentation/opencensus-java) io.opencensus:opencensus-contrib-http-util:jar:0.31.1\n     License: The Apache License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)\n \n   - OpenCensus (https://github.com/census-instrumentation/opencensus-proto) io.opencensus:opencensus-proto:jar:0.2.0\n     License: The Apache License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)\n \n   - perfmark:perfmark-api (https://github.com/perfmark/perfmark) io.perfmark:perfmark-api:jar:0.26.0\n     License: Apache 2.0  (https://opensource.org/licenses/Apache-2.0)\n \n+  - JavaBeans Activation Framework (JAF) (http://java.sun.com/products/javabeans/jaf/index.jsp) javax.activation:activation:jar:1.1\n+    License: Common Development and Distribution License (CDDL) v1.0  (https://glassfish.dev.java.net/public/CDDLv1.0.html)\n+\n+  - jsp-api  javax.servlet.jsp:jsp-api:jar:2.1\n+\n+  - Streaming API for XML  javax.xml.stream:stax-api:jar:1.0-2\n+    License: GNU General Public Library  (http://www.gnu.org/licenses/gpl.txt)\n+    License: COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0  (http://www.sun.com/cddl/cddl.html)\n+\n   - Java Native Access (https://github.com/java-native-access/jna) net.java.dev.jna:jna:jar:5.13.0\n     License: LGPL-2.1-or-later  (https://www.gnu.org/licenses/old-licenses/lgpl-2.1)\n     License: Apache-2.0  (https://www.apache.org/licenses/LICENSE-2.0.txt)\n \n   - Java Native Access Platform (https://github.com/java-native-access/jna) net.java.dev.jna:jna-platform:jar:5.6.0\n     License: LGPL, version 2.1  (http://www.gnu.org/licenses/licenses.html)\n     License: Apache License v2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)\n@@ -141,14 +171,16 @@\n \n   - Bouncy Castle ASN.1 Extension and Utility APIs (https://www.bouncycastle.org/java.html) org.bouncycastle:bcutil-jdk18on:jar:1.78.1\n     License: Bouncy Castle Licence  (https://www.bouncycastle.org/licence.html)\n \n   - Checker Qual (https://checkerframework.org/) org.checkerframework:checker-qual:jar:3.33.0\n     License: The MIT License  (http://opensource.org/licenses/MIT)\n \n+  - Jettison  org.codehaus.jettison:jettison:bundle:1.1\n+\n   - org.conscrypt:conscrypt-openjdk-uber (https://conscrypt.org/) org.conscrypt:conscrypt-openjdk-uber:jar:2.5.2\n     License: Apache 2  (https://www.apache.org/licenses/LICENSE-2.0)\n \n   - IntelliJ IDEA Annotations (http://www.jetbrains.org) org.jetbrains:annotations:jar:13.0\n     License: The Apache Software License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)\n \n   - Kotlin Stdlib (https://kotlinlang.org/) org.jetbrains.kotlin:kotlin-stdlib:jar:1.9.24\n@@ -609,14 +641,20 @@\n \n   - nifi-provenance-repository-nar (https://nifi.apache.org/nifi-nar-bundles/nifi-provenance-repository-bundle/nifi-provenance-repository-nar) org.apache.nifi:nifi-provenance-repository-nar:nar:1.27.0\n     License: Apache License, Version 2.0  (https://www.apache.org/licenses/LICENSE-2.0)\n \n   - nifi-proxy-configuration-nar (https://nifi.apache.org/nifi-nar-bundles/nifi-standard-services/nifi-proxy-configuration-bundle/nifi-proxy-configuration-nar) org.apache.nifi:nifi-proxy-configuration-nar:nar:1.27.0\n     License: Apache License, Version 2.0  (https://www.apache.org/licenses/LICENSE-2.0)\n \n+  - nifi-ranger-nar (https://nifi.apache.org/nifi-nar-bundles/nifi-ranger-bundle/nifi-ranger-nar) org.apache.nifi:nifi-ranger-nar:nar:1.27.0\n+    License: Apache License, Version 2.0  (https://www.apache.org/licenses/LICENSE-2.0)\n+\n+  - nifi-ranger-resources (https://nifi.apache.org/nifi-nar-bundles/nifi-ranger-bundle/nifi-ranger-resources) org.apache.nifi:nifi-ranger-resources:jar:1.27.0\n+    License: Apache License, Version 2.0  (https://www.apache.org/licenses/LICENSE-2.0)\n+\n   - nifi-record-serialization-services-nar (https://nifi.apache.org/nifi-nar-bundles/nifi-standard-shared-bundle/nifi-standard-shared-bom/nifi-record-serialization-services-bundle/nifi-record-serialization-services-nar) org.apache.nifi:nifi-record-serialization-services-nar:nar:1.27.0\n     License: Apache License, Version 2.0  (https://www.apache.org/licenses/LICENSE-2.0)\n \n   - nifi-record-sink-service-nar (https://nifi.apache.org/nifi-nar-bundles/nifi-standard-shared-bundle/nifi-standard-shared-bom/nifi-record-sink-service-bundle/nifi-record-sink-service-nar) org.apache.nifi:nifi-record-sink-service-nar:nar:1.27.0\n     License: Apache License, Version 2.0  (https://www.apache.org/licenses/LICENSE-2.0)\n \n   - nifi-redis-nar (https://nifi.apache.org/nifi-nar-bundles/nifi-standard-shared-bundle/nifi-standard-shared-bom/nifi-redis-bundle/nifi-redis-nar) org.apache.nifi:nifi-redis-nar:nar:1.27.0\n@@ -760,31 +798,49 @@\n   - nifi-zendesk-nar (https://nifi.apache.org/nifi-nar-bundles/nifi-standard-shared-bundle/nifi-standard-shared-bom/nifi-zendesk-bundle/nifi-zendesk-nar) org.apache.nifi:nifi-zendesk-nar:nar:1.27.0\n     License: Apache License, Version 2.0  (https://www.apache.org/licenses/LICENSE-2.0)\n \n   - nifi-zendesk-services-nar (https://nifi.apache.org/nifi-nar-bundles/nifi-standard-shared-bundle/nifi-standard-shared-bom/nifi-zendesk-bundle/nifi-zendesk-services-nar) org.apache.nifi:nifi-zendesk-services-nar:nar:1.27.0\n     License: Apache License, Version 2.0  (https://www.apache.org/licenses/LICENSE-2.0)\n \n \n+From: 'Apache Software Foundation' (https://www.apache.org)\n+\n+  - Apache Hadoop Annotations  org.apache.hadoop:hadoop-annotations:jar:3.3.0\n+    License: Apache License, Version 2.0  (https://www.apache.org/licenses/LICENSE-2.0.txt)\n+\n+  - Apache Hadoop Auth  org.apache.hadoop:hadoop-auth:jar:3.3.0\n+    License: Apache License, Version 2.0  (https://www.apache.org/licenses/LICENSE-2.0.txt)\n+\n+  - Apache Hadoop Common  org.apache.hadoop:hadoop-common:jar:3.3.0\n+    License: Apache License, Version 2.0  (https://www.apache.org/licenses/LICENSE-2.0.txt)\n+\n+  - Apache Hadoop shaded Protobuf 3.7 (https://www.apache.org/hadoop-thirdparty/hadoop-shaded-protobuf_3_7/) org.apache.hadoop.thirdparty:hadoop-shaded-protobuf_3_7:jar:1.0.0\n+    License: Apache License, Version 2.0  (https://www.apache.org/licenses/LICENSE-2.0.txt)\n+\n+\n From: 'Chemouni Uriel' (https://urielch.github.io/)\n \n   - ASM based accessors helper used by json-smart (https://urielch.github.io/) net.minidev:accessors-smart:bundle:2.5.1\n     License: The Apache Software License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)\n \n   - JSON Small and Fast Parser (https://urielch.github.io/) net.minidev:json-smart:bundle:2.5.1\n     License: The Apache Software License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)\n \n \n+From: 'Connect2id Ltd.' (http://connect2id.com)\n+\n+  - Nimbus JOSE+JWT (https://bitbucket.org/connect2id/nimbus-jose-jwt) com.nimbusds:nimbus-jose-jwt:jar:7.9\n+    License: The Apache Software License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)\n+\n+\n From: 'Connect2id Ltd.' (https://connect2id.com)\n \n   - Nimbus Content Type (https://bitbucket.org/connect2id/nimbus-content-type) com.nimbusds:content-type:jar:2.3\n     License: The Apache Software License, Version 2.0  (https://www.apache.org/licenses/LICENSE-2.0.txt)\n \n-  - Nimbus JOSE+JWT (https://bitbucket.org/connect2id/nimbus-jose-jwt) com.nimbusds:nimbus-jose-jwt:jar:9.37.3\n-    License: The Apache Software License, Version 2.0  (https://www.apache.org/licenses/LICENSE-2.0.txt)\n-\n   - OAuth 2.0 SDK with OpenID Connect extensions (https://bitbucket.org/connect2id/oauth-2.0-sdk-with-openid-connect-extensions) com.nimbusds:oauth2-oidc-sdk:jar:11.9.1\n     License: Apache License, version 2.0  (https://www.apache.org/licenses/LICENSE-2.0.html)\n \n \n From: 'Connect2id Ltd.' (https://connect2id.com/)\n \n   - Nimbus LangTag (https://bitbucket.org/connect2id/nimbus-language-tags) com.nimbusds:lang-tag:jar:1.7\n@@ -808,14 +864,34 @@\n   - JAXB Runtime (https://eclipse-ee4j.github.io/jaxb-ri/) org.glassfish.jaxb:jaxb-runtime:jar:2.3.9\n     License: Eclipse Distribution License - v 1.0  (http://www.eclipse.org/org/documents/edl-v10.php)\n \n   - TXW2 Runtime (https://eclipse-ee4j.github.io/jaxb-ri/) org.glassfish.jaxb:txw2:jar:2.3.9\n     License: Eclipse Distribution License - v 1.0  (http://www.eclipse.org/org/documents/edl-v10.php)\n \n \n+From: 'FasterXML' (http://fasterxml.com)\n+\n+  - Woodstox (https://github.com/FasterXML/woodstox) com.fasterxml.woodstox:woodstox-core:bundle:5.0.3\n+    License: The Apache License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)\n+\n+  - Jackson (http://jackson.codehaus.org) org.codehaus.jackson:jackson-core-asl:jar:1.9.2\n+    License: The Apache Software License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)\n+\n+  - JAX-RS provider for JSON content type (http://jackson.codehaus.org) org.codehaus.jackson:jackson-jaxrs:jar:1.9.2\n+    License: The Apache Software License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)\n+    License: GNU Lesser General Public License (LGPL), Version 2.1  (http://www.fsf.org/licensing/licenses/lgpl.txt)\n+\n+  - Data Mapper for Jackson (http://jackson.codehaus.org) org.codehaus.jackson:jackson-mapper-asl:jar:1.9.2\n+    License: The Apache Software License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)\n+\n+  - Xml Compatibility extensions for Jackson (http://jackson.codehaus.org) org.codehaus.jackson:jackson-xc:jar:1.9.2\n+    License: The Apache Software License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)\n+    License: GNU Lesser General Public License (LGPL), Version 2.1  (http://www.fsf.org/licensing/licenses/lgpl.txt)\n+\n+\n From: 'FasterXML' (http://fasterxml.com/)\n \n   - Jackson-annotations (https://github.com/FasterXML/jackson) com.fasterxml.jackson.core:jackson-annotations:jar:2.17.1\n     License: The Apache Software License, Version 2.0  (https://www.apache.org/licenses/LICENSE-2.0.txt)\n \n   - Jackson-core (https://github.com/FasterXML/jackson-core) com.fasterxml.jackson.core:jackson-core:jar:2.17.1\n     License: The Apache Software License, Version 2.0  (https://www.apache.org/licenses/LICENSE-2.0.txt)\n@@ -823,14 +899,20 @@\n   - jackson-databind (https://github.com/FasterXML/jackson) com.fasterxml.jackson.core:jackson-databind:jar:2.17.1\n     License: The Apache Software License, Version 2.0  (https://www.apache.org/licenses/LICENSE-2.0.txt)\n \n   - Jackson datatype: JSR310 (https://github.com/FasterXML/jackson-modules-java8/jackson-datatype-jsr310) com.fasterxml.jackson.datatype:jackson-datatype-jsr310:bundle:2.17.1\n     License: The Apache Software License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)\n \n \n+From: 'fasterxml.com' (http://fasterxml.com)\n+\n+  - Stax2 API (http://wiki.fasterxml.com/WoodstoxStax2) org.codehaus.woodstox:stax2-api:bundle:3.1.4\n+    License: The BSD License  (http://www.opensource.org/licenses/bsd-license.php)\n+\n+\n From: 'GlassFish Community' (https://javaee.github.io/glassfish)\n \n   - javax.annotation API (http://jcp.org/en/jsr/detail?id=250) javax.annotation:javax.annotation-api:jar:1.3.2\n     License: CDDL + GPLv2 with classpath exception  (https://github.com/javaee/javax.annotation/blob/master/LICENSE)\n \n \n From: 'Google' (http://www.google.com/)\n@@ -889,14 +971,20 @@\n   - proto-google-iam-v1 (https://github.com/googleapis/sdk-platform-java) com.google.api.grpc:proto-google-iam-v1:jar:1.21.0\n     License: Apache-2.0  (https://www.apache.org/licenses/LICENSE-2.0.txt)\n \n   - Google Cloud KMS (https://github.com/googleapis/google-cloud-java) com.google.cloud:google-cloud-kms:jar:2.31.0\n     License: Apache-2.0  (https://www.apache.org/licenses/LICENSE-2.0.txt)\n \n \n+From: 'JCraft,Inc.' (http://www.jcraft.com/)\n+\n+  - JSch (http://www.jcraft.com/jsch/) com.jcraft:jsch:jar:0.1.55\n+    License: Revised BSD  (http://www.jcraft.com/jsch/LICENSE.txt)\n+\n+\n From: 'Microsoft Corporation' (http://microsoft.com)\n \n   - Microsoft Azure Java Core Library (https://github.com/Azure/azure-sdk-for-java) com.azure:azure-core:jar:1.46.0\n     License: The MIT License (MIT)  (http://opensource.org/licenses/MIT)\n \n   - Microsoft Azure OkHttp HTTP Client Library (https://github.com/Azure/azure-sdk-for-java) com.azure:azure-core-http-okhttp:jar:1.11.18\n     License: The MIT License (MIT)  (http://opensource.org/licenses/MIT)\n@@ -928,14 +1016,44 @@\n     License: EDL 1.0  (http://www.eclipse.org/org/documents/edl-v10.php)\n \n   - Jakarta Mail API jar (http://eclipse-ee4j.github.io/mail/jakarta.mail-api) jakarta.mail:jakarta.mail-api:jar:1.6.7\n     License: EPL 2.0  (http://www.eclipse.org/legal/epl-2.0)\n     License: GPL2 w/ CPE  (https://www.gnu.org/software/classpath/license.html)\n     License: EDL 1.0  (http://www.eclipse.org/org/documents/edl-v10.php)\n \n+  - JavaBeans Activation Framework API jar (http://java.net/all/javax.activation-api/) javax.activation:javax.activation-api:jar:1.2.0\n+    License: CDDL/GPLv2+CE  (https://github.com/javaee/activation/blob/master/LICENSE.txt)\n+\n+\n+From: 'Oracle Corporation' (http://www.oracle.com/)\n+\n+  - jersey-core (https://jersey.java.net/jersey-core/) com.sun.jersey:jersey-core:jar:1.19\n+    License: CDDL 1.1  (http://glassfish.java.net/public/CDDL+GPL_1_1.html)\n+    License: GPL2 w/ CPE  (http://glassfish.java.net/public/CDDL+GPL_1_1.html)\n+\n+  - jersey-json (https://jersey.java.net/jersey-json/) com.sun.jersey:jersey-json:jar:1.19\n+    License: CDDL 1.1  (http://glassfish.java.net/public/CDDL+GPL_1_1.html)\n+    License: GPL2 w/ CPE  (http://glassfish.java.net/public/CDDL+GPL_1_1.html)\n+\n+  - jersey-server (https://jersey.java.net/jersey-server/) com.sun.jersey:jersey-server:jar:1.19\n+    License: CDDL 1.1  (http://glassfish.java.net/public/CDDL+GPL_1_1.html)\n+    License: GPL2 w/ CPE  (http://glassfish.java.net/public/CDDL+GPL_1_1.html)\n+\n+  - jersey-servlet (https://jersey.java.net/jersey-servlet/) com.sun.jersey:jersey-servlet:jar:1.19\n+    License: CDDL 1.1  (http://glassfish.java.net/public/CDDL+GPL_1_1.html)\n+    License: GPL2 w/ CPE  (http://glassfish.java.net/public/CDDL+GPL_1_1.html)\n+\n+  - JAXB RI (http://jaxb.java.net/) com.sun.xml.bind:jaxb-impl:jar:2.2.3-1\n+    License: CDDL 1.1  (https://glassfish.java.net/public/CDDL+GPL_1_1.html)\n+    License: GPL2 w/ CPE  (https://glassfish.java.net/public/CDDL+GPL_1_1.html)\n+\n+  - JAXB API bundle for GlassFish V3 (https://jaxb.dev.java.net/) javax.xml.bind:jaxb-api:jar:2.2.2\n+    License: CDDL 1.1  (https://glassfish.dev.java.net/public/CDDL+GPL_1_1.html)\n+    License: GPL2 w/ CPE  (https://glassfish.dev.java.net/public/CDDL+GPL_1_1.html)\n+\n \n From: 'OW2' (http://www.ow2.org/)\n \n   - asm (http://asm.ow2.io/) org.ow2.asm:asm:jar:9.6\n     License: BSD-3-Clause  (https://asm.ow2.io/license.html)\n \n \n@@ -971,37 +1089,152 @@\n   - Spring Commons Logging Bridge (https://github.com/spring-projects/spring-framework) org.springframework:spring-jcl:jar:5.3.37\n     License: Apache License, Version 2.0  (https://www.apache.org/licenses/LICENSE-2.0)\n \n   - Spring Web (https://github.com/spring-projects/spring-framework) org.springframework:spring-web:jar:5.3.37\n     License: Apache License, Version 2.0  (https://www.apache.org/licenses/LICENSE-2.0)\n \n \n+From: 'Sun Microsystems, Inc' (http://www.sun.com/)\n+\n+  - jsr311-api (https://jsr311.dev.java.net) javax.ws.rs:jsr311-api:jar:1.1.1\n+    License: CDDL License  (http://www.opensource.org/licenses/cddl1.php)\n+\n+\n From: 'The Apache Software Foundation' (http://www.apache.org/)\n \n+  - Apache Commons Collections (http://commons.apache.org/collections/) commons-collections:commons-collections:jar:3.2.2\n+    License: Apache License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)\n+\n+  - Commons Math (http://commons.apache.org/math/) org.apache.commons:commons-math3:jar:3.1.1\n+    License: The Apache Software License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)\n+\n+  - Curator Client (http://curator.apache.org/curator-client) org.apache.curator:curator-client:bundle:4.2.0\n+    License: The Apache Software License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)\n+\n+  - Curator Framework (http://curator.apache.org/curator-framework) org.apache.curator:curator-framework:bundle:4.2.0\n+    License: The Apache Software License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)\n+\n+  - Curator Recipes (http://curator.apache.org/curator-recipes) org.apache.curator:curator-recipes:bundle:4.2.0\n+    License: The Apache Software License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)\n+\n+  - htrace-core4 (http://incubator.apache.org/projects/htrace.html) org.apache.htrace:htrace-core4:jar:4.1.0-incubating\n+    License: The Apache Software License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)\n+\n   - Apache HttpClient (http://hc.apache.org/httpcomponents-client-ga) org.apache.httpcomponents:httpclient:jar:4.5.14\n     License: Apache License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)\n \n   - Apache HttpCore (http://hc.apache.org/httpcomponents-core-ga) org.apache.httpcomponents:httpcore:jar:4.4.16\n     License: Apache License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)\n \n \n From: 'The Apache Software Foundation' (https://www.apache.org/)\n \n+  - Apache Commons BeanUtils (https://commons.apache.org/proper/commons-beanutils/) commons-beanutils:commons-beanutils:jar:1.9.4\n+    License: Apache License, Version 2.0  (https://www.apache.org/licenses/LICENSE-2.0.txt)\n+\n+  - Apache Commons CLI (https://commons.apache.org/proper/commons-cli/) commons-cli:commons-cli:jar:1.7.0\n+    License: Apache-2.0  (https://www.apache.org/licenses/LICENSE-2.0.txt)\n+\n   - Apache Commons Codec (https://commons.apache.org/proper/commons-codec/) commons-codec:commons-codec:jar:1.17.0\n     License: Apache-2.0  (https://www.apache.org/licenses/LICENSE-2.0.txt)\n \n+  - Apache Commons IO (https://commons.apache.org/proper/commons-io/) commons-io:commons-io:jar:2.16.1\n+    License: Apache-2.0  (https://www.apache.org/licenses/LICENSE-2.0.txt)\n+\n+  - Apache Commons Net (https://commons.apache.org/proper/commons-net/) commons-net:commons-net:jar:3.10.0\n+    License: Apache-2.0  (https://www.apache.org/licenses/LICENSE-2.0.txt)\n+\n+  - Apache Avro (https://avro.apache.org) org.apache.avro:avro:bundle:1.11.3\n+    License: Apache-2.0  (https://www.apache.org/licenses/LICENSE-2.0.txt)\n+\n+  - Apache Commons Compress (https://commons.apache.org/proper/commons-compress/) org.apache.commons:commons-compress:jar:1.26.2\n+    License: Apache-2.0  (https://www.apache.org/licenses/LICENSE-2.0.txt)\n+\n+  - Apache Commons Configuration (https://commons.apache.org/proper/commons-configuration/) org.apache.commons:commons-configuration2:jar:2.10.1\n+    License: Apache-2.0  (https://www.apache.org/licenses/LICENSE-2.0.txt)\n+\n   - Apache Commons Lang (https://commons.apache.org/proper/commons-lang/) org.apache.commons:commons-lang3:jar:3.14.0\n     License: Apache-2.0  (https://www.apache.org/licenses/LICENSE-2.0.txt)\n \n   - Apache Commons Text (https://commons.apache.org/proper/commons-text) org.apache.commons:commons-text:jar:1.12.0\n     License: Apache-2.0  (https://www.apache.org/licenses/LICENSE-2.0.txt)\n \n+  - Kerby-kerb Admin (http://directory.apache.org/kerby/kerby-kerb/kerb-admin) org.apache.kerby:kerb-admin:jar:1.0.1\n+    License: Apache License, Version 2.0  (https://www.apache.org/licenses/LICENSE-2.0.txt)\n+\n+  - Kerby-kerb Client (http://directory.apache.org/kerby/kerby-kerb/kerb-client) org.apache.kerby:kerb-client:jar:1.0.1\n+    License: Apache License, Version 2.0  (https://www.apache.org/licenses/LICENSE-2.0.txt)\n+\n+  - Kerby-kerb Common (http://directory.apache.org/kerby/kerby-kerb/kerb-common) org.apache.kerby:kerb-common:jar:1.0.1\n+    License: Apache License, Version 2.0  (https://www.apache.org/licenses/LICENSE-2.0.txt)\n+\n+  - Kerby-kerb core (http://directory.apache.org/kerby/kerby-kerb/kerb-core) org.apache.kerby:kerb-core:jar:1.0.1\n+    License: Apache License, Version 2.0  (https://www.apache.org/licenses/LICENSE-2.0.txt)\n+\n+  - Kerby-kerb Crypto (http://directory.apache.org/kerby/kerby-kerb/kerb-crypto) org.apache.kerby:kerb-crypto:jar:1.0.1\n+    License: Apache License, Version 2.0  (https://www.apache.org/licenses/LICENSE-2.0.txt)\n+\n+  - Kerby-kerb Identity (http://directory.apache.org/kerby/kerby-kerb/kerb-identity) org.apache.kerby:kerb-identity:jar:1.0.1\n+    License: Apache License, Version 2.0  (https://www.apache.org/licenses/LICENSE-2.0.txt)\n+\n+  - Kerby-kerb Server (http://directory.apache.org/kerby/kerby-kerb/kerb-server) org.apache.kerby:kerb-server:jar:1.0.1\n+    License: Apache License, Version 2.0  (https://www.apache.org/licenses/LICENSE-2.0.txt)\n+\n+  - Kerb Simple Kdc (http://directory.apache.org/kerby/kerby-kerb/kerb-simplekdc) org.apache.kerby:kerb-simplekdc:jar:1.0.1\n+    License: Apache License, Version 2.0  (https://www.apache.org/licenses/LICENSE-2.0.txt)\n+\n+  - Kerby-kerb Util (http://directory.apache.org/kerby/kerby-kerb/kerb-util) org.apache.kerby:kerb-util:jar:1.0.1\n+    License: Apache License, Version 2.0  (https://www.apache.org/licenses/LICENSE-2.0.txt)\n+\n+  - Kerby ASN1 Project (http://directory.apache.org/kerby/kerby-common/kerby-asn1) org.apache.kerby:kerby-asn1:jar:1.0.1\n+    License: Apache License, Version 2.0  (https://www.apache.org/licenses/LICENSE-2.0.txt)\n+\n+  - Kerby Config (http://directory.apache.org/kerby/kerby-common/kerby-config) org.apache.kerby:kerby-config:jar:1.0.1\n+    License: Apache License, Version 2.0  (https://www.apache.org/licenses/LICENSE-2.0.txt)\n+\n+  - Kerby PKIX Project (http://directory.apache.org/kerby/kerby-pkix) org.apache.kerby:kerby-pkix:jar:1.0.1\n+    License: Apache License, Version 2.0  (https://www.apache.org/licenses/LICENSE-2.0.txt)\n+\n+  - Kerby Util (http://directory.apache.org/kerby/kerby-common/kerby-util) org.apache.kerby:kerby-util:jar:1.0.1\n+    License: Apache License, Version 2.0  (https://www.apache.org/licenses/LICENSE-2.0.txt)\n+\n+  - Kerby XDR Project (http://directory.apache.org/kerby/kerby-common/kerby-xdr) org.apache.kerby:kerby-xdr:jar:1.0.1\n+    License: Apache License, Version 2.0  (https://www.apache.org/licenses/LICENSE-2.0.txt)\n+\n+  - Token provider (http://directory.apache.org/kerby/kerby-provider/token-provider) org.apache.kerby:token-provider:jar:1.0.1\n+    License: Apache License, Version 2.0  (https://www.apache.org/licenses/LICENSE-2.0.txt)\n+\n+  - Credential Builder (http://ranger.apache.org/credentialbuilder/) org.apache.ranger:credentialbuilder:jar:2.4.0\n+    License: Apache 2.0 License  (http://www.apache.org/licenses/LICENSE-2.0.html)\n+\n+  - Apache Yetus - Audience Annotations (https://yetus.apache.org/audience-annotations) org.apache.yetus:audience-annotations:jar:0.12.0\n+    License: Apache License, Version 2.0  (https://www.apache.org/licenses/LICENSE-2.0.txt)\n+\n+  - Apache ZooKeeper - Server (http://zookeeper.apache.org/zookeeper) org.apache.zookeeper:zookeeper:jar:3.9.2\n+    License: Apache License, Version 2.0  (https://www.apache.org/licenses/LICENSE-2.0.txt)\n+\n+  - Apache ZooKeeper - Jute (http://zookeeper.apache.org/zookeeper-jute) org.apache.zookeeper:zookeeper-jute:jar:3.9.2\n+    License: Apache License, Version 2.0  (https://www.apache.org/licenses/LICENSE-2.0.txt)\n+\n+\n+From: 'The Netty Project' (https://netty.io/)\n+\n+  - Netty/TomcatNative [OpenSSL - Classes] (https://github.com/netty/netty-tcnative/netty-tcnative-classes/) io.netty:netty-tcnative-classes:jar:2.0.65.Final\n+    License: The Apache Software License, Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0.txt)\n+\n \n From: 'ThreeTen.org' (https://www.threeten.org)\n \n   - ThreeTen backport (https://www.threeten.org/threetenbp) org.threeten:threetenbp:jar:1.6.8\n     License: BSD-3-Clause  (https://raw.githubusercontent.com/ThreeTen/threetenbp/main/LICENSE.txt)\n \n \n+From: 'Webtide' (https://webtide.com)\n+\n+  - Jetty :: Utilities (https://eclipse.org/jetty/jetty-util) org.eclipse.jetty:jetty-util:jar:9.4.54.v20240208\n+    License: Apache Software License - Version 2.0  (http://www.apache.org/licenses/LICENSE-2.0)\n+    License: Eclipse Public License - Version 1.0  (https://www.eclipse.org/org/documents/epl-v10.php)\n+\n+\n \n \n \n"}, {"source1": "build.properties", "source2": "build.properties", "unified_diff": "@@ -12,18 +12,18 @@\n # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n # See the License for the specific language governing permissions and\n # limitations under the License.\n \n Project-Version:1.27.0\n Build-Branch:UNKNOWN\n Build-Revision:e0c4461\n-Build-Timestamp:2024-07-03T10:31:04Z\n-Built-By:pierre\n-Maven-Home:/Users/pierre/.m2/wrapper/dists/apache-maven-3.9.6/a53741d1\n-Maven-Version:3.9.6\n-Created-By:Apache Maven 3.9.6 (bc0240f3c744dd6b6ec2920b3cd08dcc295161ae)\n-Build-Java-Home:/Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home/jre\n-Build-Jdk:1.8.0_302\n-Build-Jdk-Vendor:Azul Systems, Inc.\n-Build-Arch:x86_64\n-Build-Os:Mac OS X\n-Build-Os-Version:10.16\n+Build-Timestamp:2025-01-29T23:26:02Z\n+Built-By:aman\n+Maven-Home:/usr/local/apache-maven\n+Maven-Version:3.9.8\n+Created-By:Apache Maven 3.9.8 (36645f6c9b5079805ea5009217e36f2cffd34256)\n+Build-Java-Home:/usr/lib/jvm/java-8-openjdk-amd64/jre\n+Build-Jdk:1.8.0_422\n+Build-Jdk-Vendor:Private Build\n+Build-Arch:amd64\n+Build-Os:Linux\n+Build-Os-Version:5.15.0-87-generic\n"}, {"source1": "nifi-runtime-manifest.json", "source2": "nifi-runtime-manifest.json", "unified_diff": null, "details": [{"source1": "Pretty-printed", "source2": "Pretty-printed", "comments": ["Similarity: 0.9662139801335909%", "Differences: {\"'buildInfo'\": \"{'timestamp': 1738193162000, 'compiler': 'Private Build 1.8.0_422'}\",", " \"'bundles'\": \"{0: {'artifact': 'nifi-cybersecurity-nar', 'componentManifest': {'processors': {0: \"", "              \"{'artifact': 'nifi-cybersecurity-nar', 'type': \"", "              \"'org.apache.nifi.processors.cybersecurity.CompareFuzzyHash', 'typeDescription': \"", "              \"'Compares an attribute containing a Fuzzy Hash against a file containing a list of \"", "              'fuzzy hashes, appending an attribute to the FlowF [\u2026]"], "unified_diff": "@@ -1,762 +1,295 @@\n {\n     \"agentType\": \"nifi\",\n     \"buildInfo\": {\n-        \"compiler\": \"Azul Systems, Inc. 1.8.0_302\",\n+        \"compiler\": \"Private Build 1.8.0_422\",\n         \"revision\": \"e0c4461\",\n-        \"timestamp\": 1719995464000,\n+        \"timestamp\": 1738193162000,\n         \"version\": \"1.27.0\"\n     },\n     \"bundles\": [\n         {\n-            \"artifact\": \"nifi-amqp-nar\",\n+            \"artifact\": \"nifi-cybersecurity-nar\",\n             \"componentManifest\": {\n                 \"controllerServices\": [],\n                 \"processors\": [\n                     {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-amqp-nar\",\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-cybersecurity-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n+                            \"EVENT_DRIVEN\": 0,\n                             \"TIMER_DRIVEN\": 1\n                         },\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n+                        \"deprecated\": true,\n+                        \"deprecationReason\": \"Unmaintained and planned for removal in version 2.0\",\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"AMQP Version\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"0.9.1\",\n-                                        \"value\": \"0.9.1\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"0.9.1\",\n-                                \"description\": \"AMQP Version. Currently only supports AMQP v0.9.1.\",\n-                                \"displayName\": \"AMQP Version\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"AMQP Version\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Brokers\": {\n-                                \"description\": \"A comma-separated list of known AMQP Brokers in the format <host>:<port> (e.g., localhost:5672). If this is set, Host Name and Port are ignored. Only include hosts from the same AMQP cluster.\",\n-                                \"displayName\": \"Brokers\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Brokers\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Host Name\": {\n-                                \"defaultValue\": \"localhost\",\n-                                \"description\": \"Network address of AMQP broker (e.g., localhost). If Brokers is set, then this property is ignored.\",\n-                                \"displayName\": \"Host Name\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Host Name\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Password\": {\n-                                \"description\": \"Password used for authentication and authorization.\",\n-                                \"displayName\": \"Password\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Password\",\n-                                \"required\": false,\n-                                \"sensitive\": true\n-                            },\n-                            \"Port\": {\n-                                \"defaultValue\": \"5672\",\n-                                \"description\": \"Numeric value identifying Port of AMQP broker (e.g., 5671). If Brokers is set, then this property is ignored.\",\n-                                \"displayName\": \"Port\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Port\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Queue\": {\n-                                \"description\": \"The name of the existing AMQP Queue from which messages will be consumed. Usually pre-defined by AMQP administrator. \",\n-                                \"displayName\": \"Queue\",\n+                            \"ATTRIBUTE_NAME\": {\n+                                \"defaultValue\": \"fuzzyhash.value\",\n+                                \"description\": \"The name of the FlowFile Attribute that should hold the Fuzzy Hash Value\",\n+                                \"displayName\": \"Hash Attribute Name\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Queue\",\n+                                \"name\": \"ATTRIBUTE_NAME\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"User Name\": {\n-                                \"description\": \"User Name used for authentication and authorization.\",\n-                                \"displayName\": \"User Name\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"User Name\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Virtual Host\": {\n-                                \"description\": \"Virtual Host name which segregates AMQP system for enhanced security.\",\n-                                \"displayName\": \"Virtual Host\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Virtual Host\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"auto.acknowledge\": {\n+                            \"HASH_ALGORITHM\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"description\": \"Uses ssdeep / SpamSum 'context triggered piecewise hash'.\",\n+                                        \"displayName\": \"ssdeep\",\n+                                        \"value\": \"ssdeep\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"description\": \"Uses TLSH (Trend 'Locality Sensitive Hash'). Note: FlowFile Content must be at least 512 characters long\",\n+                                        \"displayName\": \"tlsh\",\n+                                        \"value\": \"tlsh\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \" If false (Non-Auto-Acknowledge), the messages will be acknowledged by the processor after transferring the FlowFiles to success and committing the NiFi session. Non-Auto-Acknowledge mode provides 'at-least-once' delivery semantics. If true (Auto-Acknowledge), messages that are delivered to the AMQP Client will be auto-acknowledged by the AMQP Broker just after sending them out. This generally will provide better throughput but will also result in messages being lost upon restart/crash of the AMQP Broker, NiFi or the processor. Auto-Acknowledge mode provides 'at-most-once' delivery semantics and it is recommended only if loosing messages is acceptable.\",\n-                                \"displayName\": \"Auto-Acknowledge Messages\",\n+                                \"description\": \"The hashing algorithm utilised\",\n+                                \"displayName\": \"Hashing Algorithm\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"auto.acknowledge\",\n+                                \"name\": \"HASH_ALGORITHM\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"batch.size\": {\n-                                \"defaultValue\": \"10\",\n-                                \"description\": \"The maximum number of messages that should be processed in a single session. Once this many messages have been received (or once no more messages are readily available), the messages received will be transferred to the 'success' relationship and the messages will be acknowledged to the AMQP Broker. Setting this value to a larger number could result in better performance, particularly for very small messages, but can also result in more messages being duplicated upon sudden restart of NiFi.\",\n-                                \"displayName\": \"Batch Size\",\n+                            \"HASH_LIST_FILE\": {\n+                                \"description\": \"Path to the file containing hashes to be validated against\",\n+                                \"displayName\": \"Hash List Source File\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"batch.size\",\n+                                \"name\": \"HASH_LIST_FILE\",\n                                 \"required\": true,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"SINGLE\",\n+                                    \"resourceTypes\": [\n+                                        \"FILE\"\n+                                    ]\n+                                },\n                                 \"sensitive\": false\n                             },\n-                            \"cert-authentication\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"Authenticate using the SSL certificate rather than user name/password.\",\n-                                \"displayName\": \"Use Client Certificate Authentication\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"cert-authentication\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"header.format\": {\n+                            \"MATCHING_MODE\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Put all headers as a string with the specified separator in the attribute 'amqp$headers'.\",\n-                                        \"displayName\": \"Comma-Separated String\",\n-                                        \"value\": \"Comma-Separated String\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Format all headers as JSON string and output in the attribute 'amqp$headers'. It will include keys with null value as well.\",\n-                                        \"displayName\": \"JSON String\",\n-                                        \"value\": \"JSON String\"\n+                                        \"description\": \"Send FlowFile to matched after the first match above threshold\",\n+                                        \"displayName\": \"single\",\n+                                        \"value\": \"single\"\n                                     },\n                                     {\n-                                        \"description\": \"Put each header as attribute of the flow file with a prefix specified in the properties\",\n-                                        \"displayName\": \"FlowFile Attributes\",\n-                                        \"value\": \"FlowFile Attributes\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"Comma-Separated String\",\n-                                \"description\": \"Defines how to output headers from the received message\",\n-                                \"displayName\": \"Header Output Format\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"header.format\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"header.key.prefix\": {\n-                                \"defaultValue\": \"consume.amqp\",\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"FlowFile Attributes\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Header Output Format\",\n-                                        \"propertyName\": \"header.format\"\n+                                        \"description\": \"Iterate full list of hashes before deciding to send FlowFile to matched or unmatched\",\n+                                        \"displayName\": \"multi-match\",\n+                                        \"value\": \"multi-match\"\n                                     }\n                                 ],\n-                                \"description\": \"Text to be prefixed to header keys as the are added to the FlowFile attributes. Processor will append '.' to the value of this property\",\n-                                \"displayName\": \"Header Key Prefix\",\n+                                \"defaultValue\": \"single\",\n+                                \"description\": \"Defines if the Processor should try to match as many entries as possible (multi-match) or if it should stop after the first match (single)\",\n+                                \"displayName\": \"Matching Mode\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"header.key.prefix\",\n+                                \"name\": \"MATCHING_MODE\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"header.separator\": {\n-                                \"defaultValue\": \",\",\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"Comma-Separated String\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Header Output Format\",\n-                                        \"propertyName\": \"header.format\"\n-                                    }\n-                                ],\n-                                \"description\": \"The character that is used to separate key-value for header in String. The value must be only one character.\",\n-                                \"displayName\": \"Header Separator\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"header.separator\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"prefetch.count\": {\n-                                \"defaultValue\": \"0\",\n-                                \"description\": \"The maximum number of unacknowledged messages for the consumer. If consumer has this number of unacknowledged messages, AMQP broker will no longer send new messages until consumer acknowledges some of the messages already delivered to it.Allowed values: from 0 to 65535. 0 means no limit\",\n-                                \"displayName\": \"Prefetch Count\",\n+                            \"MATCH_THRESHOLD\": {\n+                                \"description\": \"The similarity score must exceed or be equal to in order formatch to be considered true. Refer to Additional Information for differences between TLSH and SSDEEP scores and how they relate to this property.\",\n+                                \"displayName\": \"Match Threshold\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"prefetch.count\",\n+                                \"name\": \"MATCH_THRESHOLD\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n-                            },\n-                            \"remove.curly.braces\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"True\",\n-                                        \"value\": \"True\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"False\",\n-                                        \"value\": \"False\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"False\",\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"Comma-Separated String\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Header Output Format\",\n-                                        \"propertyName\": \"header.format\"\n-                                    }\n-                                ],\n-                                \"description\": \"If true Remove Curly Braces, Curly Braces in the header will be automatically remove.\",\n-                                \"displayName\": \"Remove Curly Braces\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"remove.curly.braces\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"ssl-client-auth\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"WANT\",\n-                                        \"value\": \"WANT\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"REQUIRED\",\n-                                        \"value\": \"REQUIRED\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"NONE\",\n-                                        \"value\": \"NONE\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"NONE\",\n-                                \"description\": \"The property has no effect and therefore deprecated.\",\n-                                \"displayName\": \"Client Auth\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"ssl-client-auth\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"ssl-context-service\": {\n-                                \"description\": \"The SSL Context Service used to provide client certificate information for TLS/SSL connections.\",\n-                                \"displayName\": \"SSL Context Service\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"ssl-context-service\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n                             }\n                         },\n-                        \"sideEffectFree\": false,\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.processors.cybersecurity.FuzzyHashContent\"\n+                        ],\n+                        \"sideEffectFree\": true,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"All FlowFiles that are received from the AMQP queue are routed to this relationship\",\n-                                \"name\": \"success\"\n+                                \"description\": \"Any FlowFile that cannot be matched, e.g. (lacks the attribute) will be sent to this Relationship.\",\n+                                \"name\": \"failure\"\n+                            },\n+                            {\n+                                \"description\": \"Any FlowFile that cannot be matched to an existing hash will be sent to this Relationship.\",\n+                                \"name\": \"not-found\"\n+                            },\n+                            {\n+                                \"description\": \"Any FlowFile that is successfully matched to an existing hash will be sent to this Relationship.\",\n+                                \"name\": \"found\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n+                            \"CRON_DRIVEN\",\n+                            \"EVENT_DRIVEN\"\n                         ],\n-                        \"supportsBatching\": false,\n+                        \"supportsBatching\": true,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": false,\n+                        \"supportsEventDriven\": true,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"amqp\",\n-                            \"consume\",\n-                            \"get\",\n-                            \"message\",\n-                            \"rabbit\",\n-                            \"receive\"\n+                            \"cyber-security\",\n+                            \"fuzzy-hashing\",\n+                            \"hashing\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.amqp.processors.ConsumeAMQP\",\n-                        \"typeDescription\": \"Consumes AMQP Messages from an AMQP Broker using the AMQP 0.9.1 protocol. Each message that is received from the AMQP Broker will be emitted as its own FlowFile to the 'success' relationship.\",\n+                        \"type\": \"org.apache.nifi.processors.cybersecurity.CompareFuzzyHash\",\n+                        \"typeDescription\": \"Compares an attribute containing a Fuzzy Hash against a file containing a list of fuzzy hashes, appending an attribute to the FlowFile in case of a successful match.\",\n                         \"version\": \"1.27.0\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"The App ID field from the AMQP Message\",\n-                                \"name\": \"amqp$appId\"\n-                            },\n-                            {\n-                                \"description\": \"The Content Encoding reported by the AMQP Message\",\n-                                \"name\": \"amqp$contentEncoding\"\n-                            },\n-                            {\n-                                \"description\": \"The Content Type reported by the AMQP Message\",\n-                                \"name\": \"amqp$contentType\"\n-                            },\n-                            {\n-                                \"description\": \"The headers present on the AMQP Message. Added only if processor is configured to output this attribute.\",\n-                                \"name\": \"amqp$headers\"\n-                            },\n-                            {\n-                                \"description\": \"Each message header will be inserted with this attribute name, if processor is configured to output headers as attribute\",\n-                                \"name\": \"<Header Key Prefix>.<attribute>\"\n-                            },\n-                            {\n-                                \"description\": \"The numeric indicator for the Message's Delivery Mode\",\n-                                \"name\": \"amqp$deliveryMode\"\n-                            },\n-                            {\n-                                \"description\": \"The Message priority\",\n-                                \"name\": \"amqp$priority\"\n-                            },\n-                            {\n-                                \"description\": \"The Message's Correlation ID\",\n-                                \"name\": \"amqp$correlationId\"\n-                            },\n-                            {\n-                                \"description\": \"The value of the Message's Reply-To field\",\n-                                \"name\": \"amqp$replyTo\"\n-                            },\n-                            {\n-                                \"description\": \"The Message Expiration\",\n-                                \"name\": \"amqp$expiration\"\n-                            },\n-                            {\n-                                \"description\": \"The unique ID of the Message\",\n-                                \"name\": \"amqp$messageId\"\n-                            },\n-                            {\n-                                \"description\": \"The timestamp of the Message, as the number of milliseconds since epoch\",\n-                                \"name\": \"amqp$timestamp\"\n-                            },\n-                            {\n-                                \"description\": \"The type of message\",\n-                                \"name\": \"amqp$type\"\n-                            },\n-                            {\n-                                \"description\": \"The ID of the user\",\n-                                \"name\": \"amqp$userId\"\n-                            },\n-                            {\n-                                \"description\": \"The ID of the AMQP Cluster\",\n-                                \"name\": \"amqp$clusterId\"\n-                            },\n-                            {\n-                                \"description\": \"The routingKey of the AMQP Message\",\n-                                \"name\": \"amqp$routingKey\"\n+                                \"description\": \"The match that resembles the attribute specified by the <Hash Attribute Name> property. Note that: 'XXX' gets replaced with the <Hash Attribute Name>\",\n+                                \"name\": \"XXXX.N.match\"\n                             },\n                             {\n-                                \"description\": \"The exchange from which AMQP Message was received\",\n-                                \"name\": \"amqp$exchange\"\n+                                \"description\": \"The similarity score between this flowfileand its match of the same number N. Note that: 'XXX' gets replaced with the <Hash Attribute Name>\",\n+                                \"name\": \"XXXX.N.similarity\"\n                             }\n                         ]\n                     },\n                     {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-amqp-nar\",\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-cybersecurity-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n+                            \"EVENT_DRIVEN\": 0,\n                             \"TIMER_DRIVEN\": 1\n                         },\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n+                        \"deprecated\": true,\n+                        \"deprecationReason\": \"Unmaintained and planned for removal in version 2.0\",\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"AMQP Version\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"0.9.1\",\n-                                        \"value\": \"0.9.1\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"0.9.1\",\n-                                \"description\": \"AMQP Version. Currently only supports AMQP v0.9.1.\",\n-                                \"displayName\": \"AMQP Version\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"AMQP Version\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Brokers\": {\n-                                \"description\": \"A comma-separated list of known AMQP Brokers in the format <host>:<port> (e.g., localhost:5672). If this is set, Host Name and Port are ignored. Only include hosts from the same AMQP cluster.\",\n-                                \"displayName\": \"Brokers\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Brokers\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Exchange Name\": {\n-                                \"defaultValue\": \"\",\n-                                \"description\": \"The name of the AMQP Exchange the messages will be sent to. Usually provided by the AMQP administrator (e.g., 'amq.direct'). It is an optional property. If kept empty the messages will be sent to a default AMQP exchange.\",\n-                                \"displayName\": \"Exchange Name\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Exchange Name\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Host Name\": {\n-                                \"defaultValue\": \"localhost\",\n-                                \"description\": \"Network address of AMQP broker (e.g., localhost). If Brokers is set, then this property is ignored.\",\n-                                \"displayName\": \"Host Name\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Host Name\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Password\": {\n-                                \"description\": \"Password used for authentication and authorization.\",\n-                                \"displayName\": \"Password\",\n+                            \"ATTRIBUTE_NAME\": {\n+                                \"defaultValue\": \"fuzzyhash.value\",\n+                                \"description\": \"The name of the FlowFile Attribute that should hold the Fuzzy Hash Value\",\n+                                \"displayName\": \"Hash Attribute Name\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Password\",\n-                                \"required\": false,\n-                                \"sensitive\": true\n-                            },\n-                            \"Port\": {\n-                                \"defaultValue\": \"5672\",\n-                                \"description\": \"Numeric value identifying Port of AMQP broker (e.g., 5671). If Brokers is set, then this property is ignored.\",\n-                                \"displayName\": \"Port\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Port\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Routing Key\": {\n-                                \"description\": \"The name of the Routing Key that will be used by AMQP to route messages from the exchange to a destination queue(s). Usually provided by the administrator (e.g., 'myKey')In the event when messages are sent to a default exchange this property corresponds to a destination queue name, otherwise a binding from the Exchange to a Queue via Routing Key must be set (usually by the AMQP administrator)\",\n-                                \"displayName\": \"Routing Key\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Routing Key\",\n+                                \"name\": \"ATTRIBUTE_NAME\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"User Name\": {\n-                                \"description\": \"User Name used for authentication and authorization.\",\n-                                \"displayName\": \"User Name\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"User Name\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Virtual Host\": {\n-                                \"description\": \"Virtual Host name which segregates AMQP system for enhanced security.\",\n-                                \"displayName\": \"Virtual Host\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Virtual Host\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"cert-authentication\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"Authenticate using the SSL certificate rather than user name/password.\",\n-                                \"displayName\": \"Use Client Certificate Authentication\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"cert-authentication\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"header.separator\": {\n-                                \"defaultValue\": \",\",\n-                                \"description\": \"The character that is used to split key-value for headers. The value must only one character. Otherwise you will get an error message\",\n-                                \"displayName\": \"Header Separator\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"header.separator\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"ssl-client-auth\": {\n+                            \"HASH_ALGORITHM\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"WANT\",\n-                                        \"value\": \"WANT\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"REQUIRED\",\n-                                        \"value\": \"REQUIRED\"\n+                                        \"description\": \"Uses ssdeep / SpamSum 'context triggered piecewise hash'.\",\n+                                        \"displayName\": \"ssdeep\",\n+                                        \"value\": \"ssdeep\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"NONE\",\n-                                        \"value\": \"NONE\"\n+                                        \"description\": \"Uses TLSH (Trend 'Locality Sensitive Hash'). Note: FlowFile Content must be at least 512 characters long\",\n+                                        \"displayName\": \"tlsh\",\n+                                        \"value\": \"tlsh\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"NONE\",\n-                                \"description\": \"The property has no effect and therefore deprecated.\",\n-                                \"displayName\": \"Client Auth\",\n+                                \"description\": \"The hashing algorithm utilised\",\n+                                \"displayName\": \"Hashing Algorithm\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"ssl-client-auth\",\n-                                \"required\": false,\n+                                \"name\": \"HASH_ALGORITHM\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n-                            },\n-                            \"ssl-context-service\": {\n-                                \"description\": \"The SSL Context Service used to provide client certificate information for TLS/SSL connections.\",\n-                                \"displayName\": \"SSL Context Service\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"ssl-context-service\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n                             }\n                         },\n-                        \"readsAttributes\": [\n-                            {\n-                                \"description\": \"The App ID field to set on the AMQP Message\",\n-                                \"name\": \"amqp$appId\"\n-                            },\n-                            {\n-                                \"description\": \"The Content Encoding to set on the AMQP Message\",\n-                                \"name\": \"amqp$contentEncoding\"\n-                            },\n-                            {\n-                                \"description\": \"The Content Type to set on the AMQP Message\",\n-                                \"name\": \"amqp$contentType\"\n-                            },\n-                            {\n-                                \"description\": \"The headers to set on the AMQP Message\",\n-                                \"name\": \"amqp$headers\"\n-                            },\n-                            {\n-                                \"description\": \"The numeric indicator for the Message's Delivery Mode\",\n-                                \"name\": \"amqp$deliveryMode\"\n-                            },\n-                            {\n-                                \"description\": \"The Message priority\",\n-                                \"name\": \"amqp$priority\"\n-                            },\n-                            {\n-                                \"description\": \"The Message's Correlation ID\",\n-                                \"name\": \"amqp$correlationId\"\n-                            },\n-                            {\n-                                \"description\": \"The value of the Message's Reply-To field\",\n-                                \"name\": \"amqp$replyTo\"\n-                            },\n-                            {\n-                                \"description\": \"The Message Expiration\",\n-                                \"name\": \"amqp$expiration\"\n-                            },\n-                            {\n-                                \"description\": \"The unique ID of the Message\",\n-                                \"name\": \"amqp$messageId\"\n-                            },\n-                            {\n-                                \"description\": \"The timestamp of the Message, as the number of milliseconds since epoch\",\n-                                \"name\": \"amqp$timestamp\"\n-                            },\n-                            {\n-                                \"description\": \"The type of message\",\n-                                \"name\": \"amqp$type\"\n-                            },\n-                            {\n-                                \"description\": \"The ID of the user\",\n-                                \"name\": \"amqp$userId\"\n-                            },\n-                            {\n-                                \"description\": \"The ID of the AMQP Cluster\",\n-                                \"name\": \"amqp$clusterId\"\n-                            }\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.processors.cybersecurity.CompareFuzzyHash\",\n+                            \"org.apache.nifi.processors.standard.HashContent\"\n                         ],\n-                        \"sideEffectFree\": false,\n+                        \"sideEffectFree\": true,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"All FlowFiles that are sent to the AMQP destination are routed to this relationship\",\n+                                \"description\": \"Any FlowFile that is successfully hashed will be sent to this Relationship.\",\n                                 \"name\": \"success\"\n                             },\n                             {\n-                                \"description\": \"All FlowFiles that cannot be routed to the AMQP destination are routed to this relationship\",\n+                                \"description\": \"Any FlowFile that is successfully hashed will be sent to this Relationship.\",\n                                 \"name\": \"failure\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n+                            \"CRON_DRIVEN\",\n+                            \"EVENT_DRIVEN\"\n                         ],\n-                        \"supportsBatching\": false,\n+                        \"supportsBatching\": true,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": false,\n+                        \"supportsEventDriven\": true,\n                         \"supportsSensitiveDynamicProperties\": false,\n-                        \"systemResourceConsiderations\": [\n-                            {\n-                                \"description\": \"An instance of this component can cause high usage of this system resource.  Multiple instances or high concurrency settings may result a degradation of performance.\",\n-                                \"resource\": \"MEMORY\"\n-                            }\n-                        ],\n                         \"tags\": [\n-                            \"amqp\",\n-                            \"message\",\n-                            \"publish\",\n-                            \"put\",\n-                            \"rabbit\",\n-                            \"send\"\n+                            \"cyber-security\",\n+                            \"fuzzy-hashing\",\n+                            \"hashing\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.amqp.processors.PublishAMQP\",\n-                        \"typeDescription\": \"Creates an AMQP Message from the contents of a FlowFile and sends the message to an AMQP Exchange. In a typical AMQP exchange model, the message that is sent to the AMQP Exchange will be routed based on the 'Routing Key' to its final destination in the queue (the binding). If due to some misconfiguration the binding between the Exchange, Routing Key and Queue is not set up, the message will have no final destination and will return (i.e., the data will not make it to the queue). If that happens you will see a log in both app-log and bulletin stating to that effect, and the FlowFile will be routed to the 'failure' relationship.\",\n-                        \"version\": \"1.27.0\"\n+                        \"type\": \"org.apache.nifi.processors.cybersecurity.FuzzyHashContent\",\n+                        \"typeDescription\": \"Calculates a fuzzy/locality-sensitive hash value for the Content of a FlowFile and puts that hash value on the FlowFile as an attribute whose name is determined by the <Hash Attribute Name> property.Note: this processor only offers non-cryptographic hash algorithms. And it should be not be seen as a replacement to the HashContent processor.Note: The underlying library loads the entirety of the streamed content into and performs result evaluations in memory. Accordingly, it is important to consider the anticipated profile of content being evaluated by this processor and the hardware supporting it especially when working against large files.\",\n+                        \"version\": \"1.27.0\",\n+                        \"writesAttributes\": [\n+                            {\n+                                \"description\": \"This Processor adds an attribute whose value is the result of Hashing the existing FlowFile content. The name of this attribute is specified by the <Hash Attribute Name> property\",\n+                                \"name\": \"<Hash Attribute Name>\"\n+                            }\n+                        ]\n                     }\n                 ],\n                 \"reportingTasks\": []\n             },\n             \"group\": \"org.apache.nifi\",\n             \"version\": \"1.27.0\"\n         },\n         {\n-            \"artifact\": \"nifi-cipher-nar\",\n+            \"artifact\": \"nifi-pgp-nar\",\n             \"componentManifest\": {\n                 \"controllerServices\": [],\n                 \"processors\": [\n                     {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-cipher-nar\",\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-pgp-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -768,273 +301,124 @@\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"cipher-algorithm-mode\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"Cipher Blocking Chaining Mode\",\n-                                        \"displayName\": \"CBC\",\n-                                        \"value\": \"CBC\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Counter Mode\",\n-                                        \"displayName\": \"CTR\",\n-                                        \"value\": \"CTR\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Galois/Counter Mode supporting Authenticated Encryption with Associated Data\",\n-                                        \"displayName\": \"GCM\",\n-                                        \"value\": \"GCM\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"GCM\",\n-                                \"description\": \"Block cipher mode of operation for decryption using the Advanced Encryption Standard\",\n-                                \"displayName\": \"Cipher Algorithm Mode\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"cipher-algorithm-mode\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"cipher-algorithm-padding\": {\n+                            \"decryption-strategy\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"NoPadding\",\n-                                        \"displayName\": \"NoPadding\",\n-                                        \"value\": \"NoPadding\"\n+                                        \"description\": \"Produce decrypted content read from literal data ignoring signatures\",\n+                                        \"displayName\": \"DECRYPTED\",\n+                                        \"value\": \"DECRYPTED\"\n                                     },\n                                     {\n-                                        \"description\": \"PKCS5Padding\",\n-                                        \"displayName\": \"PKCS5Padding\",\n-                                        \"value\": \"PKCS5Padding\"\n+                                        \"description\": \"Produce decrypted content packaged as an OpenPGP message for additional processing\",\n+                                        \"displayName\": \"PACKAGED\",\n+                                        \"value\": \"PACKAGED\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"NoPadding\",\n-                                \"description\": \"Padding specification used in cipher operation for decryption using the Advanced Encryption Standard\",\n-                                \"displayName\": \"Cipher Algorithm Padding\",\n+                                \"defaultValue\": \"DECRYPTED\",\n+                                \"description\": \"Strategy for writing files to success after decryption\",\n+                                \"displayName\": \"Decryption Strategy\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"cipher-algorithm-padding\",\n+                                \"name\": \"decryption-strategy\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"key-specification\": {\n-                                \"description\": \"Specification providing the raw secret key or a password from which to derive a secret key\",\n-                                \"displayName\": \"Key Specification\",\n+                            \"passphrase\": {\n+                                \"description\": \"Passphrase used for decrypting data encrypted with Password-Based Encryption\",\n+                                \"displayName\": \"Passphrase\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"key-specification\",\n-                                \"required\": true,\n+                                \"name\": \"passphrase\",\n+                                \"required\": false,\n                                 \"sensitive\": true\n                             },\n-                            \"key-specification-format\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"Raw secret key provided as a hexadecimal string\",\n-                                        \"displayName\": \"RAW\",\n-                                        \"value\": \"RAW\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Password string for use with a Key Derivation Function to produce a secret key\",\n-                                        \"displayName\": \"PASSWORD\",\n-                                        \"value\": \"PASSWORD\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"PASSWORD\",\n-                                \"description\": \"Format describing the configured Key Specification\",\n-                                \"displayName\": \"Key Specification Format\",\n+                            \"private-key-service\": {\n+                                \"description\": \"PGP Private Key Service for decrypting data encrypted with Public Key Encryption\",\n+                                \"displayName\": \"Private Key Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"key-specification-format\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n+                                \"name\": \"private-key-service\",\n+                                \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-pgp-service-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.pgp.service.api.PGPPrivateKeyService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n                             }\n                         },\n-                        \"sideEffectFree\": true,\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.processors.pgp.EncryptContentPGP\",\n+                            \"org.apache.nifi.processors.pgp.SignContentPGP\",\n+                            \"org.apache.nifi.processors.pgp.VerifyContentPGP\"\n+                        ],\n+                        \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"Decryption succeeded\",\n+                                \"description\": \"Decryption Succeeded\",\n                                 \"name\": \"success\"\n                             },\n                             {\n-                                \"description\": \"Decryption failed\",\n+                                \"description\": \"Decryption Failed\",\n                                 \"name\": \"failure\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n-                        \"supportsBatching\": true,\n+                        \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"AES\",\n-                            \"Argon2\",\n-                            \"PBKDF2\",\n-                            \"bcrypt\",\n-                            \"cryptography\",\n-                            \"decipher\",\n-                            \"decrypt\",\n-                            \"scrypt\"\n+                            \"Encryption\",\n+                            \"GPG\",\n+                            \"OpenPGP\",\n+                            \"PGP\",\n+                            \"RFC 4880\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.cipher.DecryptContent\",\n-                        \"typeDescription\": \"Decrypt content encrypted with AES and encoded according conventions added in NiFi 0.5.0 for the EncryptContent Processor. The Processor reads the first 256 bytes to determine the presence of a cryptographic salt based on finding the 'NiFiSALT' delimiter. The salt is not present for content encrypted with a raw hexadecimal key. The Processor determines the presence of the initialization vector based on finding the 'NiFiIV' delimiter.The salt format indicates the Key Derivation Function that the Processor uses to generate a secret key based on a configured password. The Processor derives keys with a size of 128 bits according to the conventions implemented in NiFi 0.5.0.\",\n-                        \"version\": \"1.27.0\"\n-                    },\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-cipher-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"e0c4461\"\n-                        },\n-                        \"defaultBulletinLevel\": \"WARN\",\n-                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": 1,\n-                            \"TIMER_DRIVEN\": 1\n-                        },\n-                        \"defaultPenaltyDuration\": \"30 sec\",\n-                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"0 sec\"\n-                        },\n-                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n-                        \"defaultYieldDuration\": \"1 sec\",\n-                        \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_REQUIRED\",\n-                        \"primaryNodeOnly\": false,\n-                        \"propertyDescriptors\": {\n-                            \"Private Key Identities\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"PROPERTIES\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Private Key Source\",\n-                                        \"propertyName\": \"Private Key Source\"\n-                                    }\n-                                ],\n-                                \"description\": \"One or more X25519 Private Key Identities, separated with newlines, encoded according to the age specification, starting with AGE-SECRET-KEY-1\",\n-                                \"displayName\": \"Private Key Identities\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Private Key Identities\",\n-                                \"required\": true,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"SINGLE\",\n-                                    \"resourceTypes\": [\n-                                        \"TEXT\"\n-                                    ]\n-                                },\n-                                \"sensitive\": true\n+                        \"type\": \"org.apache.nifi.processors.pgp.DecryptContentPGP\",\n+                        \"typeDescription\": \"Decrypt contents of OpenPGP messages. Using the Packaged Decryption Strategy preserves OpenPGP encoding to support subsequent signature verification.\",\n+                        \"version\": \"1.27.0\",\n+                        \"writesAttributes\": [\n+                            {\n+                                \"description\": \"Filename from decrypted Literal Data\",\n+                                \"name\": \"pgp.literal.data.filename\"\n                             },\n-                            \"Private Key Identity Resources\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"RESOURCES\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Private Key Source\",\n-                                        \"propertyName\": \"Private Key Source\"\n-                                    }\n-                                ],\n-                                \"description\": \"One or more files or URLs containing X25519 Private Key Identities, separated with newlines, encoded according to the age specification, starting with AGE-SECRET-KEY-1\",\n-                                \"displayName\": \"Private Key Identity Resources\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Private Key Identity Resources\",\n-                                \"required\": true,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"MULTIPLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\",\n-                                        \"URL\"\n-                                    ]\n-                                },\n-                                \"sensitive\": false\n+                            {\n+                                \"description\": \"Modified Date from decrypted Literal Data\",\n+                                \"name\": \"pgp.literal.data.modified\"\n                             },\n-                            \"Private Key Source\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"Load one or more keys from configured properties\",\n-                                        \"displayName\": \"PROPERTIES\",\n-                                        \"value\": \"PROPERTIES\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Load one or more keys from files or URLs\",\n-                                        \"displayName\": \"RESOURCES\",\n-                                        \"value\": \"RESOURCES\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"PROPERTIES\",\n-                                \"description\": \"Source of information determines the loading strategy for X25519 Private Key Identities\",\n-                                \"displayName\": \"Private Key Source\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Private Key Source\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            }\n-                        },\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.processors.cipher.EncryptContentAge\"\n-                        ],\n-                        \"sideEffectFree\": false,\n-                        \"supportedRelationships\": [\n                             {\n-                                \"description\": \"Decryption Completed\",\n-                                \"name\": \"success\"\n+                                \"description\": \"Symmetric-Key Algorithm Block Cipher\",\n+                                \"name\": \"pgp.symmetric.key.algorithm.block.cipher\"\n                             },\n                             {\n-                                \"description\": \"Decryption Failed\",\n-                                \"name\": \"failure\"\n+                                \"description\": \"Symmetric-Key Algorithm Identifier\",\n+                                \"name\": \"pgp.symmetric.key.algorithm.id\"\n                             }\n-                        ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": true,\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": false,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"ChaCha20-Poly1305\",\n-                            \"X25519\",\n-                            \"age\",\n-                            \"age-encryption.org\",\n-                            \"encryption\"\n-                        ],\n-                        \"triggerSerially\": false,\n-                        \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.cipher.DecryptContentAge\",\n-                        \"typeDescription\": \"Decrypt content using the age-encryption.org/v1 specification. Detects binary or ASCII armored content encoding using the initial file header bytes. The age standard uses ChaCha20-Poly1305 for authenticated encryption of the payload. The age-keygen command supports generating X25519 key pairs for encryption and decryption operations.\",\n-                        \"version\": \"1.27.0\"\n+                        ]\n                     },\n                     {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-cipher-nar\",\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-pgp-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -1046,788 +430,462 @@\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"encryption-scheme\": {\n+                            \"compression-algorithm\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"PKCS12 with MD5 digest and Advanced Encryption Standard in Cipher Block Chaining mode using 128 bit keys.\",\n-                                        \"displayName\": \"PBE_WITH_MD5_AND_AES_CBC_128\",\n-                                        \"value\": \"PBEWITHMD5AND128BITAES-CBC-OPENSSL\"\n-                                    },\n-                                    {\n-                                        \"description\": \"PKCS12 with MD5 digest and Advanced Encryption Standard in Cipher Block Chaining mode using 192 bit keys.\",\n-                                        \"displayName\": \"PBE_WITH_MD5_AND_AES_CBC_192\",\n-                                        \"value\": \"PBEWITHMD5AND192BITAES-CBC-OPENSSL\"\n-                                    },\n-                                    {\n-                                        \"description\": \"PKCS12 with MD5 digest and Advanced Encryption Standard in Cipher Block Chaining mode using 256 bit keys.\",\n-                                        \"displayName\": \"PBE_WITH_MD5_AND_AES_CBC_256\",\n-                                        \"value\": \"PBEWITHMD5AND256BITAES-CBC-OPENSSL\"\n-                                    },\n-                                    {\n-                                        \"description\": \"PKCS5 Scheme 1 with MD5 digest and Data Encryption Standard 64 bit keys. OID 1.2.840.113549.1.5.3\",\n-                                        \"displayName\": \"PBE_WITH_MD5_AND_DES\",\n-                                        \"value\": \"PBEWITHMD5ANDDES\"\n-                                    },\n-                                    {\n-                                        \"description\": \"PKCS Scheme 1 with MD5 digest and Rivest Cipher 2. OID 1.2.840.113549.1.5.6\",\n-                                        \"displayName\": \"PBE_WITH_MD5_AND_RC2\",\n-                                        \"value\": \"PBEWITHMD5ANDRC2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"PKCS12 with SHA-1 digest and Advanced Encryption Standard in Cipher Block Chaining mode using 128 bit keys.\",\n-                                        \"displayName\": \"PBE_WITH_SHA1_AND_AES_CBC_128\",\n-                                        \"value\": \"PBEWITHSHAAND128BITAES-CBC-BC\"\n-                                    },\n-                                    {\n-                                        \"description\": \"PKCS12 with SHA-1 digest and Advanced Encryption Standard in Cipher Block Chaining mode using 192 bit keys.\",\n-                                        \"displayName\": \"PBE_WITH_SHA1_AND_AES_CBC_192\",\n-                                        \"value\": \"PBEWITHSHAAND192BITAES-CBC-BC\"\n-                                    },\n-                                    {\n-                                        \"description\": \"PKCS12 with SHA-1 digest and Advanced Encryption Standard in Cipher Block Chaining mode using 256 bit keys.\",\n-                                        \"displayName\": \"PBE_WITH_SHA1_AND_AES_CBC_256\",\n-                                        \"value\": \"PBEWITHSHAAND256BITAES-CBC-BC\"\n-                                    },\n-                                    {\n-                                        \"description\": \"PKCS5 Scheme 1 with SHA-1 digest and Data Encryption Standard. OID 1.2.840.113549.1.5.10\",\n-                                        \"displayName\": \"PBE_WITH_SHA1_AND_DES\",\n-                                        \"value\": \"PBEWITHSHA1ANDDES\"\n-                                    },\n-                                    {\n-                                        \"description\": \"PKCS12 with SHA-1 digest and Triple Data Encryption Standard 128 bit keys. OID 1.2.840.113549.1.12.1.4\",\n-                                        \"displayName\": \"PBE_WITH_SHA1_AND_DESEDE_128\",\n-                                        \"value\": \"PBEWITHSHAAND2-KEYTRIPLEDES-CBC\"\n-                                    },\n-                                    {\n-                                        \"description\": \"PKCS12 with SHA-1 digest and Triple Data Encryption Standard 192 bit keys. OID 1.2.840.113549.1.12.1.3\",\n-                                        \"displayName\": \"PBE_WITH_SHA1_AND_DESEDE_192\",\n-                                        \"value\": \"PBEWITHSHAAND3-KEYTRIPLEDES-CBC\"\n-                                    },\n-                                    {\n-                                        \"description\": \"PKCS5 Scheme 1 with SHA-1 digest and Rivest Cipher 2. OID 1.2.840.113549.1.5.11\",\n-                                        \"displayName\": \"PBE_WITH_SHA1_AND_RC2\",\n-                                        \"value\": \"PBEWITHSHA1ANDRC2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"PKCS12 with SHA-1 digest and Rivest Cipher 2 128 bit keys. OID 1.2.840.113549.1.12.1.5\",\n-                                        \"displayName\": \"PBE_WITH_SHA1_AND_RC2_128\",\n-                                        \"value\": \"PBEWITHSHAAND128BITRC2-CBC\"\n-                                    },\n-                                    {\n-                                        \"description\": \"PKCS12 with SHA-1 digest and Rivest Cipher 2 40 bit keys. OID 1.2.840.113549.1.12.1.6\",\n-                                        \"displayName\": \"PBE_WITH_SHA1_AND_RC2_40\",\n-                                        \"value\": \"PBEWITHSHAAND40BITRC2-CBC\"\n-                                    },\n-                                    {\n-                                        \"description\": \"PKCS12 with SHA-1 digest and Rivest Cipher 4 128 bit keys. OID 1.2.840.113549.1.12.1.1\",\n-                                        \"displayName\": \"PBE_WITH_SHA1_AND_RC4_128\",\n-                                        \"value\": \"PBEWITHSHAAND128BITRC4\"\n-                                    },\n-                                    {\n-                                        \"description\": \"PKCS12 with SHA-1 digest and Rivest Cipher 4 40 bit keys. OID 1.2.840.113549.1.12.1.2\",\n-                                        \"displayName\": \"PBE_WITH_SHA1_AND_RC4_40\",\n-                                        \"value\": \"PBEWITHSHAAND40BITRC4\"\n-                                    },\n-                                    {\n-                                        \"description\": \"PKCS12 with SHA-1 digest and Twofish in Cipher Block Chaining mode using 256 bit keys.\",\n-                                        \"displayName\": \"PBE_WITH_SHA1_AND_TWOFISH\",\n-                                        \"value\": \"PBEWITHSHAANDTWOFISH-CBC\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"UNCOMPRESSED\",\n+                                        \"value\": \"UNCOMPRESSED\"\n                                     },\n                                     {\n-                                        \"description\": \"PKCS12 with SHA-256 digest and Advanced Encryption Standard in Cipher Block Chaining mode using 128 bit keys.\",\n-                                        \"displayName\": \"PBE_WITH_SHA256_AND_AES_CBC_128\",\n-                                        \"value\": \"PBEWITHSHA256AND128BITAES-CBC-BC\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"ZIP\",\n+                                        \"value\": \"ZIP\"\n                                     },\n                                     {\n-                                        \"description\": \"PKCS12 with SHA-256 digest and Advanced Encryption Standard in Cipher Block Chaining mode using 192 bit keys.\",\n-                                        \"displayName\": \"PBE_WITH_SHA256_AND_AES_CBC_192\",\n-                                        \"value\": \"PBEWITHSHA256AND192BITAES-CBC-BC\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"ZLIB\",\n+                                        \"value\": \"ZLIB\"\n                                     },\n                                     {\n-                                        \"description\": \"PKCS12 with SHA-256 digest and Advanced Encryption Standard in Cipher Block Chaining mode using 256 bit keys.\",\n-                                        \"displayName\": \"PBE_WITH_SHA256_AND_AES_CBC_256\",\n-                                        \"value\": \"PBEWITHSHA256AND256BITAES-CBC-BC\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"BZIP2\",\n+                                        \"value\": \"BZIP2\"\n                                     }\n                                 ],\n-                                \"description\": \"Password-Based Encryption Scheme including PBES1 described in RFC 8018, and others defined according to PKCS12 and Bouncy Castle implementations\",\n-                                \"displayName\": \"Encryption Scheme\",\n+                                \"defaultValue\": \"ZIP\",\n+                                \"description\": \"Compression Algorithm for encryption\",\n+                                \"displayName\": \"Compression Algorithm\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"encryption-scheme\",\n+                                \"name\": \"compression-algorithm\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"key-derivation-strategy\": {\n+                            \"file-encoding\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"OpenSSL Envelope BytesToKey using a digest algorithm with one iteration and optional salt of eight bytes\",\n-                                        \"displayName\": \"OPENSSL_EVP_BYTES_TO_KEY\",\n-                                        \"value\": \"OPENSSL_EVP_BYTES_TO_KEY\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"ASCII\",\n+                                        \"value\": \"ASCII\"\n                                     },\n                                     {\n-                                        \"description\": \"Jasypt Java Simplified Encryption using a digest algorithm with 1000 iterations and required salt of eight or sixteen bytes\",\n-                                        \"displayName\": \"JASYPT_STANDARD\",\n-                                        \"value\": \"JASYPT_STANDARD\"\n-                                    }\n-                                ],\n-                                \"description\": \"Strategy for reading salt from encoded contents and deriving the decryption key according to the number of function iterations\",\n-                                \"displayName\": \"Key Derivation Strategy\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"key-derivation-strategy\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"password\": {\n-                                \"description\": \"Password required for Password-Based Encryption Schemes\",\n-                                \"displayName\": \"Password\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"password\",\n-                                \"required\": true,\n-                                \"sensitive\": true\n-                            }\n-                        },\n-                        \"sideEffectFree\": true,\n-                        \"supportedRelationships\": [\n-                            {\n-                                \"description\": \"Decryption succeeded\",\n-                                \"name\": \"success\"\n-                            },\n-                            {\n-                                \"description\": \"Decryption failed\",\n-                                \"name\": \"failure\"\n-                            }\n-                        ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": true,\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": false,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"Jasypt\",\n-                            \"OpenSSL\",\n-                            \"PBES1\",\n-                            \"PKCS5\",\n-                            \"cryptography\",\n-                            \"decipher\",\n-                            \"decrypt\"\n-                        ],\n-                        \"triggerSerially\": false,\n-                        \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.cipher.DecryptContentCompatibility\",\n-                        \"typeDescription\": \"Decrypt content using password-based encryption schemes with legacy algorithms supporting historical compatibility modes.\",\n-                        \"version\": \"1.27.0\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"Password-Based Encryption Scheme\",\n-                                \"name\": \"pbe.scheme\"\n-                            },\n-                            {\n-                                \"description\": \"Password-Based Encryption Block Cipher\",\n-                                \"name\": \"pbe.symmetric.cipher\"\n-                            },\n-                            {\n-                                \"description\": \"Password-Based Encryption Digest Algorithm\",\n-                                \"name\": \"pbe.digest.algorithm\"\n-                            }\n-                        ]\n-                    },\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-cipher-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"e0c4461\"\n-                        },\n-                        \"defaultBulletinLevel\": \"WARN\",\n-                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": 1,\n-                            \"TIMER_DRIVEN\": 1\n-                        },\n-                        \"defaultPenaltyDuration\": \"30 sec\",\n-                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"0 sec\"\n-                        },\n-                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n-                        \"defaultYieldDuration\": \"1 sec\",\n-                        \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_REQUIRED\",\n-                        \"primaryNodeOnly\": false,\n-                        \"propertyDescriptors\": {\n-                            \"File Encoding\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"Binary encoding\",\n+                                        \"description\": \"\",\n                                         \"displayName\": \"BINARY\",\n                                         \"value\": \"BINARY\"\n-                                    },\n-                                    {\n-                                        \"description\": \"ASCII Armor encoding\",\n-                                        \"displayName\": \"ASCII\",\n-                                        \"value\": \"ASCII\"\n                                     }\n                                 ],\n                                 \"defaultValue\": \"BINARY\",\n-                                \"description\": \"Output encoding for encrypted files. Binary encoding provides optimal processing performance.\",\n+                                \"description\": \"File Encoding for encryption\",\n                                 \"displayName\": \"File Encoding\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"File Encoding\",\n+                                \"name\": \"file-encoding\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Public Key Recipient Resources\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"RESOURCES\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Public Key Source\",\n-                                        \"propertyName\": \"Public Key Source\"\n-                                    }\n-                                ],\n-                                \"description\": \"One or more files or URLs containing X25519 Public Key Recipients, separated with newlines, encoded according to the age specification, starting with age1\",\n-                                \"displayName\": \"Public Key Recipient Resources\",\n+                            \"passphrase\": {\n+                                \"description\": \"Passphrase used for encrypting data with Password-Based Encryption\",\n+                                \"displayName\": \"Passphrase\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Public Key Recipient Resources\",\n-                                \"required\": true,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"MULTIPLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\",\n-                                        \"URL\"\n-                                    ]\n-                                },\n-                                \"sensitive\": false\n+                                \"name\": \"passphrase\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n                             },\n-                            \"Public Key Recipients\": {\n+                            \"public-key-search\": {\n                                 \"dependencies\": [\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"PROPERTIES\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Public Key Source\",\n-                                        \"propertyName\": \"Public Key Source\"\n+                                        \"propertyDisplayName\": \"Public Key Service\",\n+                                        \"propertyName\": \"public-key-service\"\n                                     }\n                                 ],\n-                                \"description\": \"One or more X25519 Public Key Recipients, separated with newlines, encoded according to the age specification, starting with age1\",\n-                                \"displayName\": \"Public Key Recipients\",\n+                                \"description\": \"PGP Public Key Search will be used to match against the User ID or Key ID when formatted as uppercase hexadecimal string of 16 characters\",\n+                                \"displayName\": \"Public Key Search\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Public Key Recipients\",\n-                                \"required\": true,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"SINGLE\",\n-                                    \"resourceTypes\": [\n-                                        \"TEXT\"\n-                                    ]\n-                                },\n-                                \"sensitive\": true\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"public-key-search\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n                             },\n-                            \"Public Key Source\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"Load one or more keys from configured properties\",\n-                                        \"displayName\": \"PROPERTIES\",\n-                                        \"value\": \"PROPERTIES\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Load one or more keys from files or URLs\",\n-                                        \"displayName\": \"RESOURCES\",\n-                                        \"value\": \"RESOURCES\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"PROPERTIES\",\n-                                \"description\": \"Source of information determines the loading strategy for X25519 Public Key Recipients\",\n-                                \"displayName\": \"Public Key Source\",\n+                            \"public-key-service\": {\n+                                \"description\": \"PGP Public Key Service for encrypting data with Public Key Encryption\",\n+                                \"displayName\": \"Public Key Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Public Key Source\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            }\n-                        },\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.processors.cipher.DecryptContentAge\"\n-                        ],\n-                        \"sideEffectFree\": false,\n-                        \"supportedRelationships\": [\n-                            {\n-                                \"description\": \"Encryption Completed\",\n-                                \"name\": \"success\"\n+                                \"name\": \"public-key-service\",\n+                                \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-pgp-service-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.pgp.service.api.PGPPublicKeyService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n                             },\n-                            {\n-                                \"description\": \"Encryption Failed\",\n-                                \"name\": \"failure\"\n-                            }\n-                        ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": true,\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": false,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"ChaCha20-Poly1305\",\n-                            \"X25519\",\n-                            \"age\",\n-                            \"age-encryption.org\",\n-                            \"encryption\"\n-                        ],\n-                        \"triggerSerially\": false,\n-                        \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.cipher.EncryptContentAge\",\n-                        \"typeDescription\": \"Encrypt content using the age-encryption.org/v1 specification. Supports binary or ASCII armored content encoding using configurable properties. The age standard uses ChaCha20-Poly1305 for authenticated encryption of the payload. The age-keygen command supports generating X25519 key pairs for encryption and decryption operations.\",\n-                        \"version\": \"1.27.0\"\n-                    },\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-cipher-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"e0c4461\"\n-                        },\n-                        \"defaultBulletinLevel\": \"WARN\",\n-                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": 1,\n-                            \"TIMER_DRIVEN\": 1\n-                        },\n-                        \"defaultPenaltyDuration\": \"30 sec\",\n-                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"0 sec\"\n-                        },\n-                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n-                        \"defaultYieldDuration\": \"1 sec\",\n-                        \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_REQUIRED\",\n-                        \"primaryNodeOnly\": false,\n-                        \"propertyDescriptors\": {\n-                            \"mac-algorithm\": {\n+                            \"symmetric-key-algorithm\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"HmacSHA256\",\n-                                        \"value\": \"HmacSHA256\"\n+                                        \"displayName\": \"AES_128\",\n+                                        \"value\": \"AES_128\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"HmacSHA512\",\n-                                        \"value\": \"HmacSHA512\"\n-                                    }\n-                                ],\n-                                \"description\": \"Hashed Message Authentication Code Function\",\n-                                \"displayName\": \"Message Authentication Code Algorithm\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"mac-algorithm\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"message-authentication-code\": {\n-                                \"description\": \"The MAC to compare with the calculated value\",\n-                                \"displayName\": \"Message Authentication Code\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"message-authentication-code\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"message-authentication-code-encoding\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"HEXADECIMAL\",\n-                                        \"value\": \"HEXADECIMAL\"\n+                                        \"displayName\": \"AES_192\",\n+                                        \"value\": \"AES_192\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"BASE64\",\n-                                        \"value\": \"BASE64\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"HEXADECIMAL\",\n-                                \"description\": \"Encoding of the Message Authentication Code\",\n-                                \"displayName\": \"Message Authentication Code Encoding\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"message-authentication-code-encoding\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"secret-key\": {\n-                                \"description\": \"Secret key to calculate the hash\",\n-                                \"displayName\": \"Secret Key\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"secret-key\",\n-                                \"required\": true,\n-                                \"sensitive\": true\n-                            },\n-                            \"secret-key-encoding\": {\n-                                \"allowableValues\": [\n+                                        \"displayName\": \"AES_256\",\n+                                        \"value\": \"AES_256\"\n+                                    },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"UTF8\",\n-                                        \"value\": \"UTF8\"\n+                                        \"displayName\": \"CAMELLIA_128\",\n+                                        \"value\": \"CAMELLIA_128\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"HEXADECIMAL\",\n-                                        \"value\": \"HEXADECIMAL\"\n+                                        \"displayName\": \"CAMELLIA_192\",\n+                                        \"value\": \"CAMELLIA_192\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"BASE64\",\n-                                        \"value\": \"BASE64\"\n+                                        \"displayName\": \"CAMELLIA_256\",\n+                                        \"value\": \"CAMELLIA_256\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"HEXADECIMAL\",\n-                                \"description\": \"Encoding of the Secret Key\",\n-                                \"displayName\": \"Secret Key Encoding\",\n+                                \"defaultValue\": \"AES_256\",\n+                                \"description\": \"Symmetric-Key Algorithm for encryption\",\n+                                \"displayName\": \"Symmetric-Key Algorithm\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"secret-key-encoding\",\n+                                \"name\": \"symmetric-key-algorithm\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             }\n                         },\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.processors.pgp.DecryptContentPGP\",\n+                            \"org.apache.nifi.processors.pgp.SignContentPGP\",\n+                            \"org.apache.nifi.processors.pgp.VerifyContentPGP\"\n+                        ],\n                         \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"Signature Verification Succeeded\",\n+                                \"description\": \"Encryption Succeeded\",\n                                 \"name\": \"success\"\n                             },\n                             {\n-                                \"description\": \"Signature Verification Failed\",\n+                                \"description\": \"Encryption Failed\",\n                                 \"name\": \"failure\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n-                        \"supportsBatching\": true,\n+                        \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"Authentication\",\n-                            \"HMAC\",\n-                            \"MAC\",\n-                            \"Signing\"\n+                            \"Encryption\",\n+                            \"GPG\",\n+                            \"OpenPGP\",\n+                            \"PGP\",\n+                            \"RFC 4880\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.cipher.VerifyContentMAC\",\n-                        \"typeDescription\": \"Calculates a Message Authentication Code using the provided Secret Key and compares it with the provided MAC property\",\n+                        \"type\": \"org.apache.nifi.processors.pgp.EncryptContentPGP\",\n+                        \"typeDescription\": \"Encrypt contents using OpenPGP. The processor reads input and detects OpenPGP messages to avoid unnecessary additional wrapping in Literal Data packets.\",\n                         \"version\": \"1.27.0\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"Calculated Message Authentication Code encoded by the selected encoding\",\n-                                \"name\": \"mac.calculated\"\n+                                \"description\": \"Symmetric-Key Algorithm\",\n+                                \"name\": \"pgp.symmetric.key.algorithm\"\n                             },\n                             {\n-                                \"description\": \"The Encoding of the Hashed Message Authentication Code\",\n-                                \"name\": \"mac.encoding\"\n+                                \"description\": \"Symmetric-Key Algorithm Block Cipher\",\n+                                \"name\": \"pgp.symmetric.key.algorithm.block.cipher\"\n                             },\n                             {\n-                                \"description\": \"Hashed Message Authentication Code Algorithm\",\n-                                \"name\": \"mac.algorithm\"\n+                                \"description\": \"Symmetric-Key Algorithm Key Size\",\n+                                \"name\": \"pgp.symmetric.key.algorithm.key.size\"\n+                            },\n+                            {\n+                                \"description\": \"Symmetric-Key Algorithm Identifier\",\n+                                \"name\": \"pgp.symmetric.key.algorithm.id\"\n+                            },\n+                            {\n+                                \"description\": \"File Encoding\",\n+                                \"name\": \"pgp.file.encoding\"\n+                            },\n+                            {\n+                                \"description\": \"Compression Algorithm\",\n+                                \"name\": \"pgp.compression.algorithm\"\n+                            },\n+                            {\n+                                \"description\": \"Compression Algorithm Identifier\",\n+                                \"name\": \"pgp.compression.algorithm.id\"\n                             }\n                         ]\n-                    }\n-                ],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"1.27.0\"\n-        },\n-        {\n-            \"artifact\": \"nifi-grpc-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [],\n-                \"processors\": [\n+                    },\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-grpc-nar\",\n+                        \"artifact\": \"nifi-pgp-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n-                            \"EVENT_DRIVEN\": 0,\n                             \"TIMER_DRIVEN\": 1\n                         },\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n-                        \"deprecated\": true,\n-                        \"deprecationReason\": \"No planned alternatives to be offered. Use custom processors instead.\",\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Always Output Response\": {\n+                            \"compression-algorithm\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"displayName\": \"UNCOMPRESSED\",\n+                                        \"value\": \"UNCOMPRESSED\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"displayName\": \"ZIP\",\n+                                        \"value\": \"ZIP\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"ZLIB\",\n+                                        \"value\": \"ZLIB\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"BZIP2\",\n+                                        \"value\": \"BZIP2\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"Will force a response FlowFile to be generated and routed to the 'Response' relationship regardless of what the server status code received is or if the processor is configured to put the server response body in the request attribute. In the later configuration a request FlowFile with the response body in the attribute and a typical response FlowFile will be emitted to their respective relationships.\",\n-                                \"displayName\": \"Always Output Response\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Always Output Response\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Max Message Size\": {\n-                                \"defaultValue\": \"4MB\",\n-                                \"description\": \"The maximum size of FlowFiles that this processor will allow to be received. The default is 4MB. If FlowFiles exceed this size, you should consider using another transport mechanism as gRPC isn't designed for heavy payloads.\",\n-                                \"displayName\": \"Max Message Size\",\n+                                \"defaultValue\": \"ZIP\",\n+                                \"description\": \"Compression Algorithm for signing\",\n+                                \"displayName\": \"Compression Algorithm\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Max Message Size\",\n-                                \"required\": false,\n+                                \"name\": \"compression-algorithm\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Penalize on \\\"No Retry\\\"\": {\n+                            \"file-encoding\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"displayName\": \"ASCII\",\n+                                        \"value\": \"ASCII\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"displayName\": \"BINARY\",\n+                                        \"value\": \"BINARY\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"Enabling this property will penalize FlowFiles that are routed to the \\\"No Retry\\\" relationship.\",\n-                                \"displayName\": \"Penalize on \\\"No Retry\\\"\",\n+                                \"defaultValue\": \"BINARY\",\n+                                \"description\": \"File Encoding for signing\",\n+                                \"displayName\": \"File Encoding\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Penalize on \\\"No Retry\\\"\",\n-                                \"required\": false,\n+                                \"name\": \"file-encoding\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Remote gRPC service hostname\": {\n-                                \"description\": \"Remote host which will be connected to\",\n-                                \"displayName\": \"Remote gRPC service hostname\",\n+                            \"hash-algorithm\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"SHA256\",\n+                                        \"value\": \"SHA256\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"SHA384\",\n+                                        \"value\": \"SHA384\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"SHA512\",\n+                                        \"value\": \"SHA512\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"SHA512\",\n+                                \"description\": \"Hash Algorithm for signing\",\n+                                \"displayName\": \"Hash Algorithm\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Remote gRPC service hostname\",\n+                                \"name\": \"hash-algorithm\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Remote gRPC service port\": {\n-                                \"description\": \"Remote port which will be connected to\",\n-                                \"displayName\": \"Remote gRPC service port\",\n+                            \"private-key-id\": {\n+                                \"description\": \"PGP Private Key Identifier formatted as uppercase hexadecimal string of 16 characters used for signing\",\n+                                \"displayName\": \"Private Key ID\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Remote gRPC service port\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"private-key-id\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"SSL Context Service\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"true\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Use TLS\",\n-                                        \"propertyName\": \"Use SSL/TLS\"\n-                                    }\n-                                ],\n-                                \"description\": \"The SSL Context Service used to provide client certificate information for TLS (https) connections.\",\n-                                \"displayName\": \"SSL Context Service\",\n+                            \"private-key-service\": {\n+                                \"description\": \"PGP Private Key Service for generating content signatures\",\n+                                \"displayName\": \"Private Key Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"SSL Context Service\",\n-                                \"required\": false,\n+                                \"name\": \"private-key-service\",\n+                                \"required\": true,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"artifact\": \"nifi-pgp-service-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n+                                    \"type\": \"org.apache.nifi.pgp.service.api.PGPPrivateKeyService\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             },\n-                            \"Send FlowFile Content\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"true\",\n-                                \"description\": \"Whether or not to include the FlowFile content in the FlowFileRequest to the gRPC service.\",\n-                                \"displayName\": \"Send FlowFile Content\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Send FlowFile Content\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Use SSL/TLS\": {\n+                            \"signing-strategy\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"description\": \"Produce signed content packaged as an OpenPGP message\",\n+                                        \"displayName\": \"SIGNED\",\n+                                        \"value\": \"SIGNED\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"description\": \"Produce detached signature based on associated content packaged according to OpenPGP encoding\",\n+                                        \"displayName\": \"DETACHED\",\n+                                        \"value\": \"DETACHED\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"Whether or not to use TLS to send the contents of the gRPC messages.\",\n-                                \"displayName\": \"Use TLS\",\n+                                \"defaultValue\": \"SIGNED\",\n+                                \"description\": \"Strategy for writing files to success after signing\",\n+                                \"displayName\": \"Signing Strategy\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Use SSL/TLS\",\n-                                \"required\": false,\n+                                \"name\": \"signing-strategy\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             }\n                         },\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.processors.pgp.DecryptContentPGP\",\n+                            \"org.apache.nifi.processors.pgp.EncryptContentPGP\",\n+                            \"org.apache.nifi.processors.pgp.VerifyContentPGP\"\n+                        ],\n                         \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"The original FlowFile will be routed upon success. It will have new attributes detailing the success of the request.\",\n-                                \"name\": \"Original\"\n-                            },\n-                            {\n-                                \"description\": \"The original FlowFile will be routed on any type of connection failure, timeout or general exception. It will have new attributes detailing the request.\",\n-                                \"name\": \"Failure\"\n-                            },\n-                            {\n-                                \"description\": \"The original FlowFile will be routed on any status code that can be retried. It will have new attributes detailing the request.\",\n-                                \"name\": \"Retry\"\n-                            },\n-                            {\n-                                \"description\": \"The original FlowFile will be routed on any status code that should NOT be retried.  It will have new attributes detailing the request.\",\n-                                \"name\": \"No Retry\"\n+                                \"description\": \"Content signing succeeded\",\n+                                \"name\": \"success\"\n                             },\n                             {\n-                                \"description\": \"A Response FlowFile will be routed upon success. If the 'Output Response Regardless' property is true then the response will be sent to this relationship regardless of the status code received.\",\n-                                \"name\": \"Response\"\n+                                \"description\": \"Content signing failed\",\n+                                \"name\": \"failure\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\",\n-                            \"EVENT_DRIVEN\"\n+                            \"CRON_DRIVEN\"\n                         ],\n-                        \"supportsBatching\": true,\n+                        \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": true,\n+                        \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"client\",\n-                            \"grpc\",\n-                            \"rpc\"\n+                            \"Encryption\",\n+                            \"GPG\",\n+                            \"OpenPGP\",\n+                            \"PGP\",\n+                            \"RFC 4880\",\n+                            \"Signing\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.grpc.InvokeGRPC\",\n-                        \"typeDescription\": \"Sends FlowFiles, optionally with content, to a configurable remote gRPC service endpoint. The remote gRPC service must abide by the service IDL defined in NiFi.  gRPC isn't intended to carry large payloads,  so this processor should be used only when FlowFile sizes are on the order of megabytes. The default maximum message size is 4MB.\",\n+                        \"type\": \"org.apache.nifi.processors.pgp.SignContentPGP\",\n+                        \"typeDescription\": \"Sign content using OpenPGP Private Keys\",\n                         \"version\": \"1.27.0\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"The response code that is returned (0 = ERROR, 1 = SUCCESS, 2 = RETRY)\",\n-                                \"name\": \"invokegrpc.response.code\"\n+                                \"description\": \"Compression Algorithm\",\n+                                \"name\": \"pgp.compression.algorithm\"\n                             },\n                             {\n-                                \"description\": \"The response message that is returned\",\n-                                \"name\": \"invokegrpc.response.body\"\n+                                \"description\": \"Compression Algorithm Identifier\",\n+                                \"name\": \"pgp.compression.algorithm.id\"\n                             },\n                             {\n-                                \"description\": \"The remote gRPC service hostname\",\n-                                \"name\": \"invokegrpc.service.host\"\n+                                \"description\": \"File Encoding\",\n+                                \"name\": \"pgp.file.encoding\"\n                             },\n                             {\n-                                \"description\": \"The remote gRPC service port\",\n-                                \"name\": \"invokegrpc.service.port\"\n+                                \"description\": \"Signature Algorithm including key and hash algorithm names\",\n+                                \"name\": \"pgp.signature.algorithm\"\n                             },\n                             {\n-                                \"description\": \"The Java exception class raised when the processor fails\",\n-                                \"name\": \"invokegrpc.java.exception.class\"\n+                                \"description\": \"Signature Hash Algorithm Identifier\",\n+                                \"name\": \"pgp.signature.hash.algorithm.id\"\n                             },\n                             {\n-                                \"description\": \"The Java exception message raised when the processor fails\",\n-                                \"name\": \"invokegrpc.java.exception.message\"\n+                                \"description\": \"Signature Key Algorithm Identifier\",\n+                                \"name\": \"pgp.signature.key.algorithm.id\"\n+                            },\n+                            {\n+                                \"description\": \"Signature Public Key Identifier\",\n+                                \"name\": \"pgp.signature.key.id\"\n+                            },\n+                            {\n+                                \"description\": \"Signature Type Identifier\",\n+                                \"name\": \"pgp.signature.type.id\"\n+                            },\n+                            {\n+                                \"description\": \"Signature Version Number\",\n+                                \"name\": \"pgp.signature.version\"\n                             }\n                         ]\n                     },\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-grpc-nar\",\n+                        \"artifact\": \"nifi-pgp-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -1835,1161 +893,934 @@\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n-                        \"deprecated\": true,\n-                        \"deprecationReason\": \"No planned alternatives to be offered. Use custom processors instead.\",\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Authorized DN Pattern\": {\n-                                \"defaultValue\": \".*\",\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"true\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Use TLS\",\n-                                        \"propertyName\": \"Use TLS\"\n-                                    }\n-                                ],\n-                                \"description\": \"A Regular Expression to apply against the Distinguished Name of incoming connections. If the Pattern does not match the DN, the connection will be refused. The property will only be used if client certificate authentication (Mutual TLS) has been configured on SSL Context Service, otherwise it will be ignored.\",\n-                                \"displayName\": \"Authorized DN Pattern\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Authorized DN Pattern\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Flow Control Window\": {\n-                                \"defaultValue\": \"1MB\",\n-                                \"description\": \"The initial HTTP/2 flow control window for both new streams and overall connection. Flow-control schemes ensure that streams on the same connection do not destructively interfere with each other. The default is 1MB.\",\n-                                \"displayName\": \"Flow Control Window\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Flow Control Window\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Local gRPC service port\": {\n-                                \"description\": \"The local port that the gRPC service will listen on.\",\n-                                \"displayName\": \"Local gRPC Service Port\",\n+                            \"public-key-service\": {\n+                                \"description\": \"PGP Public Key Service for verifying signatures with Public Key Encryption\",\n+                                \"displayName\": \"Public Key Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Local gRPC service port\",\n+                                \"name\": \"public-key-service\",\n                                 \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Max Message Size\": {\n-                                \"defaultValue\": \"4MB\",\n-                                \"description\": \"The maximum size of FlowFiles that this processor will allow to be received. The default is 4MB. If FlowFiles exceed this size, you should consider using another transport mechanism as gRPC isn't designed for heavy payloads.\",\n-                                \"displayName\": \"Maximum Message Size\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Max Message Size\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"SSL Context Service\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"true\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Use TLS\",\n-                                        \"propertyName\": \"Use TLS\"\n-                                    }\n-                                ],\n-                                \"description\": \"The SSL Context Service used to provide server certificate information for TLS (https) connections. Keystore must be configured on the service. If truststore is also configured, it will turn on and require client certificate authentication (Mutual TLS).\",\n-                                \"displayName\": \"SSL Context Service\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"SSL Context Service\",\n-                                \"required\": false,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"artifact\": \"nifi-pgp-service-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.ssl.RestrictedSSLContextService\",\n+                                    \"type\": \"org.apache.nifi.pgp.service.api.PGPPublicKeyService\",\n                                     \"version\": \"1.27.0\"\n                                 }\n-                            },\n-                            \"Use TLS\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"Whether or not to use TLS to receive the contents of the gRPC messages.\",\n-                                \"displayName\": \"Use TLS\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Use TLS\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n                             }\n                         },\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.processors.pgp.DecryptContentPGP\",\n+                            \"org.apache.nifi.processors.pgp.EncryptContentPGP\",\n+                            \"org.apache.nifi.processors.pgp.SignContentPGP\"\n+                        ],\n                         \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"The FlowFile was received successfully.\",\n-                                \"name\": \"Success\"\n+                                \"description\": \"Signature Verification Succeeded\",\n+                                \"name\": \"success\"\n+                            },\n+                            {\n+                                \"description\": \"Signature Verification Failed\",\n+                                \"name\": \"failure\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n                         \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"grpc\",\n-                            \"ingest\",\n-                            \"listen\",\n-                            \"rpc\"\n+                            \"Encryption\",\n+                            \"GPG\",\n+                            \"OpenPGP\",\n+                            \"PGP\",\n+                            \"RFC 4880\",\n+                            \"Signing\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.grpc.ListenGRPC\",\n-                        \"typeDescription\": \"Starts a gRPC server and listens on the given port to transform the incoming messages into FlowFiles. The message format is defined by the standard gRPC protobuf IDL provided by NiFi. gRPC isn't intended to carry large payloads, so this processor should be used only when FlowFile sizes are on the order of megabytes. The default maximum message size is 4MB.\",\n+                        \"type\": \"org.apache.nifi.processors.pgp.VerifyContentPGP\",\n+                        \"typeDescription\": \"Verify signatures using OpenPGP Public Keys\",\n                         \"version\": \"1.27.0\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"The DN of the user who sent the FlowFile to this NiFi\",\n-                                \"name\": \"listengrpc.remote.user.dn\"\n+                                \"description\": \"Filename from Literal Data\",\n+                                \"name\": \"pgp.literal.data.filename\"\n                             },\n                             {\n-                                \"description\": \"The IP of the client who sent the FlowFile to this NiFi\",\n-                                \"name\": \"listengrpc.remote.host\"\n+                                \"description\": \"Modified Date Time from Literal Data in milliseconds\",\n+                                \"name\": \"pgp.literal.data.modified\"\n+                            },\n+                            {\n+                                \"description\": \"Signature Creation Time in milliseconds\",\n+                                \"name\": \"pgp.signature.created\"\n+                            },\n+                            {\n+                                \"description\": \"Signature Algorithm including key and hash algorithm names\",\n+                                \"name\": \"pgp.signature.algorithm\"\n+                            },\n+                            {\n+                                \"description\": \"Signature Hash Algorithm Identifier\",\n+                                \"name\": \"pgp.signature.hash.algorithm.id\"\n+                            },\n+                            {\n+                                \"description\": \"Signature Key Algorithm Identifier\",\n+                                \"name\": \"pgp.signature.key.algorithm.id\"\n+                            },\n+                            {\n+                                \"description\": \"Signature Public Key Identifier\",\n+                                \"name\": \"pgp.signature.key.id\"\n+                            },\n+                            {\n+                                \"description\": \"Signature Type Identifier\",\n+                                \"name\": \"pgp.signature.type.id\"\n+                            },\n+                            {\n+                                \"description\": \"Signature Version Number\",\n+                                \"name\": \"pgp.signature.version\"\n                             }\n                         ]\n                     }\n                 ],\n                 \"reportingTasks\": []\n             },\n             \"group\": \"org.apache.nifi\",\n             \"version\": \"1.27.0\"\n         },\n         {\n-            \"artifact\": \"nifi-jetty-bundle\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [],\n-                \"processors\": [],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"1.27.0\"\n-        },\n-        {\n-            \"artifact\": \"nifi-oauth2-provider-nar\",\n+            \"artifact\": \"nifi-cassandra-services-nar\",\n             \"componentManifest\": {\n                 \"controllerServices\": [\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-oauth2-provider-nar\",\n+                        \"artifact\": \"nifi-cassandra-services-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"deprecated\": true,\n-                        \"deprecationAlternatives\": [\n-                            \"org.apache.nifi.oauth2.StandardOauth2AccessTokenProvider\"\n-                        ],\n-                        \"deprecationReason\": \"\",\n+                        \"deprecationReason\": \"DataStax 3 driver for Cassandra is no longer the current version and requires new components.\",\n                         \"group\": \"org.apache.nifi\",\n                         \"propertyDescriptors\": {\n-                            \"oauth2-access-token-url\": {\n-                                \"defaultValue\": \"\",\n-                                \"description\": \"The full endpoint of the URL where access tokens are handled.\",\n-                                \"displayName\": \"Access Token Url\",\n+                            \"cassandra-dmc-key-field-name\": {\n+                                \"description\": \"The name of the field that acts as the unique key. (The CQL type should be \\\"blob\\\")\",\n+                                \"displayName\": \"Key Field Name\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"oauth2-access-token-url\",\n+                                \"name\": \"cassandra-dmc-key-field-name\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"oauth2-ssl-context\": {\n-                                \"description\": \"\",\n-                                \"displayName\": \"SSL Context\",\n+                            \"cassandra-dmc-session-provider\": {\n+                                \"description\": \"The client service that will configure the cassandra client connection.\",\n+                                \"displayName\": \"Session Provider\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"oauth2-ssl-context\",\n-                                \"required\": false,\n+                                \"name\": \"cassandra-dmc-session-provider\",\n+                                \"required\": true,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"artifact\": \"nifi-cassandra-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n+                                    \"type\": \"org.apache.nifi.cassandra.CassandraSessionProviderService\",\n                                     \"version\": \"1.27.0\"\n                                 }\n+                            },\n+                            \"cassandra-dmc-table-name\": {\n+                                \"description\": \"The name of the table where the cache will be stored.\",\n+                                \"displayName\": \"Table Name\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"cassandra-dmc-table-name\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"cassandra-dmc-ttl\": {\n+                                \"description\": \"If configured, this will set a TTL (Time to Live) for each row inserted into the table so that old cache items expire after a certain period of time.\",\n+                                \"displayName\": \"TTL\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"cassandra-dmc-ttl\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"cassandra-dmc-value-field-name\": {\n+                                \"description\": \"The name of the field that will store the value. (The CQL type should be \\\"blob\\\")\",\n+                                \"displayName\": \"Value Field Name\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"cassandra-dmc-value-field-name\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n                             }\n                         },\n                         \"providedApiImplementations\": [\n                             {\n                                 \"artifact\": \"nifi-standard-services-api-nar\",\n                                 \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.oauth2.OAuth2TokenProvider\",\n+                                \"type\": \"org.apache.nifi.distributed.cache.client.DistributedMapCacheClient\",\n                                 \"version\": \"1.27.0\"\n                             }\n                         ],\n                         \"supportsDynamicProperties\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"authorization\",\n-                            \"oauth2\",\n-                            \"provider\"\n+                            \"cache\",\n+                            \"cassandra\",\n+                            \"distributed\",\n+                            \"map\"\n                         ],\n-                        \"type\": \"org.apache.nifi.oauth2.OAuth2TokenProviderImpl\",\n-                        \"typeDescription\": \"This controller service provides a way of working with access and refresh tokens via the password and client_credential grant flows in the OAuth2 specification. It is meant to provide a way for components to get a token from an oauth2 provider and pass that token as a part of a header to another service.\",\n+                        \"type\": \"org.apache.nifi.controller.cassandra.CassandraDistributedMapCache\",\n+                        \"typeDescription\": \"Provides a DistributedMapCache client that is based on Apache Cassandra.\",\n                         \"version\": \"1.27.0\"\n                     },\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-oauth2-provider-nar\",\n+                        \"artifact\": \"nifi-cassandra-services-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n+                        \"deprecated\": true,\n+                        \"deprecationReason\": \"DataStax 3 driver for Cassandra is no longer the current version and requires new components.\",\n                         \"group\": \"org.apache.nifi\",\n                         \"propertyDescriptors\": {\n-                            \"HTTP Protocols\": {\n+                            \"Cassandra Contact Points\": {\n+                                \"description\": \"Contact points are addresses of Cassandra nodes. The list of contact points should be comma-separated and in hostname:port format. Example node1:port,node2:port,.... The default client port for Cassandra is 9042, but the port(s) must be explicitly specified.\",\n+                                \"displayName\": \"Cassandra Contact Points\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Cassandra Contact Points\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Client Auth\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"HTTP/1.1\",\n-                                        \"displayName\": \"http/1.1\",\n-                                        \"value\": \"HTTP_1_1\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"WANT\",\n+                                        \"value\": \"WANT\"\n                                     },\n                                     {\n-                                        \"description\": \"HTTP/2 and HTTP/1.1 negotiated based on requested protocols\",\n-                                        \"displayName\": \"h2 http/1.1\",\n-                                        \"value\": \"H2_HTTP_1_1\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"REQUIRED\",\n+                                        \"value\": \"REQUIRED\"\n                                     },\n                                     {\n-                                        \"description\": \"HTTP/2\",\n-                                        \"displayName\": \"h2\",\n-                                        \"value\": \"H2\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"H2_HTTP_1_1\",\n-                                \"dependencies\": [\n-                                    {\n-                                        \"propertyDisplayName\": \"SSL Context Service\",\n-                                        \"propertyName\": \"ssl-context-service\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"NONE\",\n+                                        \"value\": \"NONE\"\n                                     }\n                                 ],\n-                                \"description\": \"HTTP Protocols supported for Application Layer Protocol Negotiation with TLS\",\n-                                \"displayName\": \"HTTP Protocols\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"HTTP Protocols\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"audience\": {\n-                                \"description\": \"Audience for the access token request defined in RFC 8693 Section 2.1\",\n-                                \"displayName\": \"Audience\",\n+                                \"defaultValue\": \"REQUIRED\",\n+                                \"description\": \"Client authentication policy when connecting to secure (TLS/SSL) cluster. Possible values are REQUIRED, WANT, NONE. This property is only used when an SSL Context has been defined and enabled.\",\n+                                \"displayName\": \"Client Auth\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"audience\",\n+                                \"name\": \"Client Auth\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"authorization-server-url\": {\n-                                \"description\": \"The URL of the authorization server that issues access tokens.\",\n-                                \"displayName\": \"Authorization Server URL\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"authorization-server-url\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"client-authentication-strategy\": {\n+                            \"Compression Type\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Send client authentication in request body. RFC 6749 Section 2.3.1 recommends Basic Authentication instead of request body.\",\n-                                        \"displayName\": \"REQUEST_BODY\",\n-                                        \"value\": \"REQUEST_BODY\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"NONE\",\n+                                        \"value\": \"NONE\"\n                                     },\n                                     {\n-                                        \"description\": \"Send client authentication using HTTP Basic authentication.\",\n-                                        \"displayName\": \"BASIC_AUTHENTICATION\",\n-                                        \"value\": \"BASIC_AUTHENTICATION\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"SNAPPY\",\n+                                        \"value\": \"SNAPPY\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"LZ4\",\n+                                        \"value\": \"LZ4\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"REQUEST_BODY\",\n-                                \"description\": \"Strategy for authenticating the client against the OAuth2 token provider service.\",\n-                                \"displayName\": \"Client Authentication Strategy\",\n+                                \"defaultValue\": \"NONE\",\n+                                \"description\": \"Enable compression at transport-level requests and responses\",\n+                                \"displayName\": \"Compression Type\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"client-authentication-strategy\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"client-id\": {\n-                                \"description\": \"\",\n-                                \"displayName\": \"Client ID\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"client-id\",\n+                                \"name\": \"Compression Type\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"client-secret\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"propertyDisplayName\": \"Client ID\",\n-                                        \"propertyName\": \"client-id\"\n-                                    }\n-                                ],\n-                                \"description\": \"\",\n-                                \"displayName\": \"Client secret\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"client-secret\",\n-                                \"required\": true,\n-                                \"sensitive\": true\n-                            },\n-                            \"grant-type\": {\n+                            \"Consistency Level\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Resource Owner Password Credentials Grant. Used to access resources available to users. Requires username and password and usually Client ID and Client Secret.\",\n-                                        \"displayName\": \"User Password\",\n-                                        \"value\": \"password\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"ANY\",\n+                                        \"value\": \"ANY\"\n                                     },\n                                     {\n-                                        \"description\": \"Client Credentials Grant. Used to access resources available to clients. Requires Client ID and Client Secret.\",\n-                                        \"displayName\": \"Client Credentials\",\n-                                        \"value\": \"client_credentials\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"ONE\",\n+                                        \"value\": \"ONE\"\n                                     },\n                                     {\n-                                        \"description\": \"Refresh Token Grant. Used to get fresh access tokens based on a previously acquired refresh token. Requires Client ID and Client Secret (apart from Refresh Token).\",\n-                                        \"displayName\": \"Refresh Token\",\n-                                        \"value\": \"refresh_token\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"TWO\",\n+                                        \"value\": \"TWO\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"THREE\",\n+                                        \"value\": \"THREE\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"QUORUM\",\n+                                        \"value\": \"QUORUM\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"ALL\",\n+                                        \"value\": \"ALL\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"LOCAL_QUORUM\",\n+                                        \"value\": \"LOCAL_QUORUM\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"EACH_QUORUM\",\n+                                        \"value\": \"EACH_QUORUM\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"SERIAL\",\n+                                        \"value\": \"SERIAL\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"LOCAL_SERIAL\",\n+                                        \"value\": \"LOCAL_SERIAL\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"LOCAL_ONE\",\n+                                        \"value\": \"LOCAL_ONE\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"password\",\n-                                \"description\": \"The OAuth2 Grant Type to be used when acquiring an access token.\",\n-                                \"displayName\": \"Grant Type\",\n+                                \"defaultValue\": \"ONE\",\n+                                \"description\": \"The strategy for how many replicas must respond before results are returned.\",\n+                                \"displayName\": \"Consistency Level\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"grant-type\",\n+                                \"name\": \"Consistency Level\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"proxy-configuration-service\": {\n-                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests. Supported proxies: HTTP + AuthN\",\n-                                \"displayName\": \"Proxy Configuration Service\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"proxy-configuration-service\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.proxy.ProxyConfigurationService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            },\n-                            \"refresh-token\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"refresh_token\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Grant Type\",\n-                                        \"propertyName\": \"grant-type\"\n-                                    }\n-                                ],\n-                                \"description\": \"Refresh Token.\",\n-                                \"displayName\": \"Refresh Token\",\n+                            \"Keyspace\": {\n+                                \"description\": \"The Cassandra Keyspace to connect to. If no keyspace is specified, the query will need to include the keyspace name before any table reference, in case of 'query' native processors or if the processor supports the 'Table' property, the keyspace name has to be provided with the table name in the form of <KEYSPACE>.<TABLE>\",\n+                                \"displayName\": \"Keyspace\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"refresh-token\",\n-                                \"required\": true,\n-                                \"sensitive\": true\n-                            },\n-                            \"refresh-window\": {\n-                                \"defaultValue\": \"0 s\",\n-                                \"description\": \"The service will attempt to refresh tokens expiring within the refresh window, subtracting the configured duration from the token expiration.\",\n-                                \"displayName\": \"Refresh Window\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"refresh-window\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"resource\": {\n-                                \"description\": \"Resource URI for the access token request defined in RFC 8707 Section 2\",\n-                                \"displayName\": \"Resource\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"resource\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"scope\": {\n-                                \"description\": \"Space-delimited, case-sensitive list of scopes of the access request (as per the OAuth 2.0 specification)\",\n-                                \"displayName\": \"Scope\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"scope\",\n+                                \"name\": \"Keyspace\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"service-password\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"password\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Grant Type\",\n-                                        \"propertyName\": \"grant-type\"\n-                                    }\n-                                ],\n-                                \"description\": \"Password for the username on the service that is being accessed.\",\n+                            \"Password\": {\n+                                \"description\": \"Password to access the Cassandra cluster\",\n                                 \"displayName\": \"Password\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"service-password\",\n-                                \"required\": true,\n-                                \"sensitive\": true\n-                            },\n-                            \"service-user-name\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"password\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Grant Type\",\n-                                        \"propertyName\": \"grant-type\"\n-                                    }\n-                                ],\n-                                \"description\": \"Username on the service that is being accessed.\",\n-                                \"displayName\": \"Username\",\n-                                \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"service-user-name\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n+                                \"name\": \"Password\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n                             },\n-                            \"ssl-context-service\": {\n-                                \"description\": \"\",\n+                            \"SSL Context Service\": {\n+                                \"description\": \"The SSL Context Service used to provide client certificate information for TLS/SSL connections.\",\n                                 \"displayName\": \"SSL Context Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"ssl-context-service\",\n+                                \"name\": \"SSL Context Service\",\n                                 \"required\": false,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n                                     \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n                                     \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n                                     \"version\": \"1.27.0\"\n                                 }\n-                            }\n-                        },\n-                        \"providedApiImplementations\": [\n-                            {\n-                                \"artifact\": \"nifi-standard-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.oauth2.OAuth2AccessTokenProvider\",\n-                                \"version\": \"1.27.0\"\n-                            }\n-                        ],\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"access token\",\n-                            \"authorization\",\n-                            \"http\",\n-                            \"oauth2\",\n-                            \"provider\"\n-                        ],\n-                        \"type\": \"org.apache.nifi.oauth2.StandardOauth2AccessTokenProvider\",\n-                        \"typeDescription\": \"Provides OAuth 2.0 access tokens that can be used as Bearer authorization header in HTTP requests. Can use either Resource Owner Password Credentials Grant or Client Credentials Grant. Client authentication can be done with either HTTP Basic authentication or in the request body.\",\n-                        \"version\": \"1.27.0\"\n-                    }\n-                ],\n-                \"processors\": [],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"1.27.0\"\n-        },\n-        {\n-            \"artifact\": \"nifi-groovyx-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [],\n-                \"processors\": [\n-                    {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-groovyx-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"e0c4461\"\n-                        },\n-                        \"defaultBulletinLevel\": \"WARN\",\n-                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": 1,\n-                            \"EVENT_DRIVEN\": 0,\n-                            \"TIMER_DRIVEN\": 1\n-                        },\n-                        \"defaultPenaltyDuration\": \"30 sec\",\n-                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"0 sec\"\n-                        },\n-                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n-                        \"defaultYieldDuration\": \"1 sec\",\n-                        \"dynamicProperties\": [\n-                            {\n-                                \"description\": \"Updates a script engine property specified by the Dynamic Property's key with the value specified by the Dynamic Property's value. Use `CTL.` to access any controller services, `SQL.` to access any DBCPServices, `RecordReader.` to access RecordReaderFactory instances, or `RecordWriter.` to access any RecordSetWriterFactory instances.\",\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"name\": \"A script engine property to update\",\n-                                \"value\": \"The value to set it to\"\n-                            }\n-                        ],\n-                        \"explicitRestrictions\": [\n-                            {\n-                                \"explanation\": \"Provides operator the ability to execute arbitrary code assuming all permissions that NiFi has.\",\n-                                \"requiredPermission\": \"execute code\"\n-                            }\n-                        ],\n-                        \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_ALLOWED\",\n-                        \"primaryNodeOnly\": false,\n-                        \"propertyDescriptors\": {\n-                            \"groovyx-additional-classpath\": {\n-                                \"description\": \"Classpath list separated by semicolon or comma. You can use masks like `*`, `*.jar` in file name.\",\n-                                \"displayName\": \"Additional classpath\",\n+                            },\n+                            \"Username\": {\n+                                \"description\": \"Username to access the Cassandra cluster\",\n+                                \"displayName\": \"Username\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"groovyx-additional-classpath\",\n+                                \"name\": \"Username\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"groovyx-failure-strategy\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"rollback\",\n-                                        \"value\": \"rollback\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"transfer to failure\",\n-                                        \"value\": \"transfer to failure\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"rollback\",\n-                                \"description\": \"What to do with unhandled exceptions. If you want to manage exception by code then keep the default value `rollback`. If `transfer to failure` selected and unhandled exception occurred then all flowFiles received from incoming queues in this session will be transferred to `failure` relationship with additional attributes set: ERROR_MESSAGE and ERROR_STACKTRACE. If `rollback` selected and unhandled exception occurred then all flowFiles received from incoming queues will be penalized and returned. If the processor has no incoming connections then this parameter has no effect.\",\n-                                \"displayName\": \"Failure strategy\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"groovyx-failure-strategy\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"groovyx-script-body\": {\n-                                \"description\": \"Body of script to execute. Only one of Script File or Script Body may be used\",\n-                                \"displayName\": \"Script Body\",\n+                            \"connect-timeout-ms\": {\n+                                \"description\": \"Connection timeout (in milliseconds). 0 means no timeout. If no value is set, the underlying default will be used.\",\n+                                \"displayName\": \"Connect Timout (ms)\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"groovyx-script-body\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"connect-timeout-ms\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"groovyx-script-file\": {\n-                                \"description\": \"Path to script file to execute. Only one of Script File or Script Body may be used\",\n-                                \"displayName\": \"Script File\",\n+                            \"read-timeout-ms\": {\n+                                \"description\": \"Read timeout (in milliseconds). 0 means no timeout. If no value is set, the underlying default will be used.\",\n+                                \"displayName\": \"Read Timout (ms)\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"groovyx-script-file\",\n+                                \"name\": \"read-timeout-ms\",\n                                 \"required\": false,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"SINGLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\"\n-                                    ]\n-                                },\n                                 \"sensitive\": false\n                             }\n                         },\n-                        \"restricted\": true,\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.processors.script.ExecuteScript\"\n-                        ],\n-                        \"sideEffectFree\": false,\n-                        \"supportedRelationships\": [\n-                            {\n-                                \"description\": \"FlowFiles that were successfully processed\",\n-                                \"name\": \"success\"\n-                            },\n+                        \"providedApiImplementations\": [\n                             {\n-                                \"description\": \"FlowFiles that failed to be processed\",\n-                                \"name\": \"failure\"\n+                                \"artifact\": \"nifi-cassandra-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.cassandra.CassandraSessionProviderService\",\n+                                \"version\": \"1.27.0\"\n                             }\n                         ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\",\n-                            \"EVENT_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": false,\n-                        \"supportsDynamicProperties\": true,\n-                        \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": true,\n+                        \"supportsDynamicProperties\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"groovy\",\n-                            \"groovyx\",\n-                            \"script\"\n+                            \"cassandra\",\n+                            \"connection\",\n+                            \"database\",\n+                            \"dbcp\",\n+                            \"pooling\"\n                         ],\n-                        \"triggerSerially\": false,\n-                        \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.groovyx.ExecuteGroovyScript\",\n-                        \"typeDescription\": \"Experimental Extended Groovy script processor. The script is responsible for handling the incoming flow file (transfer to SUCCESS or remove, e.g.) as well as any flow files created by the script. If the handling is incomplete or incorrect, the session will be rolled back.\",\n+                        \"type\": \"org.apache.nifi.service.CassandraSessionProvider\",\n+                        \"typeDescription\": \"Provides connection session for Cassandra processors to work with Apache Cassandra.\",\n                         \"version\": \"1.27.0\"\n                     }\n                 ],\n+                \"processors\": [],\n                 \"reportingTasks\": []\n             },\n             \"group\": \"org.apache.nifi\",\n             \"version\": \"1.27.0\"\n         },\n         {\n-            \"artifact\": \"nifi-couchbase-nar\",\n+            \"artifact\": \"nifi-couchbase-services-api-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [],\n+                \"processors\": [],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"1.27.0\"\n+        },\n+        {\n+            \"artifact\": \"nifi-prometheus-nar\",\n             \"componentManifest\": {\n                 \"controllerServices\": [\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-couchbase-nar\",\n+                        \"artifact\": \"nifi-prometheus-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n-                        \"deprecated\": true,\n-                        \"deprecationReason\": \"This component is deprecated and will be removed in NiFi 2.x.\",\n-                        \"dynamicProperties\": [\n-                            {\n-                                \"description\": \"Specify bucket password if necessary. Couchbase Server 5.0 or later should use 'User Name' and 'User Password' instead.\",\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"name\": \"Bucket Password for BUCKET_NAME\",\n-                                \"value\": \"bucket password\"\n-                            }\n-                        ],\n                         \"group\": \"org.apache.nifi\",\n                         \"propertyDescriptors\": {\n-                            \"Connection String\": {\n-                                \"description\": \"The hostnames or ip addresses of the bootstraping nodes and optional parameters. Syntax) couchbase://node1,node2,nodeN?param1=value1&param2=value2&paramN=valueN\",\n-                                \"displayName\": \"Connection String\",\n+                            \"prometheus-reporting-task-client-auth\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"ReportingTask will not authenticate clients. Anyone can communicate with this ReportingTask anonymously\",\n+                                        \"displayName\": \"No Authentication\",\n+                                        \"value\": \"No Authentication\"\n+                                    },\n+                                    {\n+                                        \"description\": \"ReportingTask will try to verify the client but if unable to verify will allow the client to communicate anonymously\",\n+                                        \"displayName\": \"Want Authentication\",\n+                                        \"value\": \"Want Authentication\"\n+                                    },\n+                                    {\n+                                        \"description\": \"ReportingTask will reject communications from any client unless the client provides a certificate that is trusted by the TrustStorespecified in the SSL Context Service\",\n+                                        \"displayName\": \"Need Authentication\",\n+                                        \"value\": \"Need Authentication\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"No Authentication\",\n+                                \"description\": \"Specifies whether or not the Reporting Task should authenticate clients. This value is ignored if the <SSL Context Service> Property is not specified or the SSL Context provided uses only a KeyStore and not a TrustStore.\",\n+                                \"displayName\": \"Client Authentication\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Connection String\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"prometheus-reporting-task-client-auth\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"user-name\": {\n-                                \"description\": \"The user name to authenticate NiFi as a Couchbase client. This configuration can be used against Couchbase Server 5.0 or later supporting Roll-Based Access Control.\",\n-                                \"displayName\": \"User Name\",\n+                            \"prometheus-reporting-task-instance-id\": {\n+                                \"defaultValue\": \"${hostname(true)}\",\n+                                \"description\": \"Id of this NiFi instance to be included in the metrics sent to Prometheus\",\n+                                \"displayName\": \"Instance ID\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"user-name\",\n-                                \"required\": false,\n+                                \"name\": \"prometheus-reporting-task-instance-id\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"user-password\": {\n-                                \"description\": \"The user password to authenticate NiFi as a Couchbase client. This configuration can be used against Couchbase Server 5.0 or later supporting Roll-Based Access Control.\",\n-                                \"displayName\": \"User Password\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"user-password\",\n-                                \"required\": false,\n-                                \"sensitive\": true\n-                            }\n-                        },\n-                        \"providedApiImplementations\": [\n-                            {\n-                                \"artifact\": \"nifi-couchbase-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.couchbase.CouchbaseClusterControllerService\",\n-                                \"version\": \"1.27.0\"\n-                            }\n-                        ],\n-                        \"supportsDynamicProperties\": true,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"connection\",\n-                            \"couchbase\",\n-                            \"database\",\n-                            \"nosql\"\n-                        ],\n-                        \"type\": \"org.apache.nifi.couchbase.CouchbaseClusterService\",\n-                        \"typeDescription\": \"Provides a centralized Couchbase connection and bucket passwords management. Bucket passwords can be specified via dynamic properties.\",\n-                        \"version\": \"1.27.0\"\n-                    },\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-couchbase-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"e0c4461\"\n-                        },\n-                        \"deprecated\": true,\n-                        \"deprecationReason\": \"This component is deprecated and will be removed in NiFi 2.x.\",\n-                        \"group\": \"org.apache.nifi\",\n-                        \"propertyDescriptors\": {\n-                            \"bucket-name\": {\n-                                \"defaultValue\": \"default\",\n-                                \"description\": \"The name of bucket to access.\",\n-                                \"displayName\": \"Bucket Name\",\n+                            \"prometheus-reporting-task-metrics-endpoint-port\": {\n+                                \"defaultValue\": \"9092\",\n+                                \"description\": \"The Port where prometheus metrics can be accessed\",\n+                                \"displayName\": \"Prometheus Metrics Endpoint Port\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"bucket-name\",\n+                                \"name\": \"prometheus-reporting-task-metrics-endpoint-port\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"cluster-controller-service\": {\n-                                \"description\": \"A Couchbase Cluster Controller Service which manages connections to a Couchbase cluster.\",\n-                                \"displayName\": \"Couchbase Cluster Controller Service\",\n+                            \"prometheus-reporting-task-ssl-context\": {\n+                                \"description\": \"The SSL Context Service to use in order to secure the server. If specified, the server willaccept only HTTPS requests; otherwise, the server will accept only HTTP requests\",\n+                                \"displayName\": \"SSL Context Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"cluster-controller-service\",\n-                                \"required\": true,\n+                                \"name\": \"prometheus-reporting-task-ssl-context\",\n+                                \"required\": false,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-couchbase-services-api-nar\",\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.couchbase.CouchbaseClusterControllerService\",\n+                                    \"type\": \"org.apache.nifi.ssl.RestrictedSSLContextService\",\n                                     \"version\": \"1.27.0\"\n                                 }\n-                            },\n-                            \"lookup-sub-doc-path\": {\n-                                \"description\": \"The Sub-Document lookup path within the target JSON document.\",\n-                                \"displayName\": \"Lookup Sub-Document Path\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"lookup-sub-doc-path\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n                             }\n                         },\n                         \"providedApiImplementations\": [\n                             {\n                                 \"artifact\": \"nifi-standard-services-api-nar\",\n                                 \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.lookup.StringLookupService\",\n-                                \"version\": \"1.27.0\"\n-                            },\n-                            {\n-                                \"artifact\": \"nifi-standard-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.lookup.LookupService\",\n+                                \"type\": \"org.apache.nifi.record.sink.RecordSinkService\",\n                                 \"version\": \"1.27.0\"\n                             }\n                         ],\n                         \"supportsDynamicProperties\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"couchbase\",\n-                            \"enrich\",\n-                            \"key\",\n-                            \"lookup\",\n-                            \"value\"\n+                            \"prometheus\",\n+                            \"record\",\n+                            \"send\",\n+                            \"write\"\n                         ],\n-                        \"type\": \"org.apache.nifi.couchbase.CouchbaseKeyValueLookupService\",\n-                        \"typeDescription\": \"Lookup a string value from Couchbase Server associated with the specified key. The coordinates that are passed to the lookup must contain the key 'key'.\",\n+                        \"type\": \"org.apache.nifi.reporting.prometheus.PrometheusRecordSink\",\n+                        \"typeDescription\": \"Specifies a Record Sink Service that exposes data points to a Prometheus scraping service. Numeric fields are exposed as Gauges, String fields are the label values for the gauges, and all other fields are ignored.\",\n                         \"version\": \"1.27.0\"\n-                    },\n+                    }\n+                ],\n+                \"processors\": [],\n+                \"reportingTasks\": [\n                     {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-couchbase-nar\",\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-prometheus-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n-                        \"deprecated\": true,\n-                        \"deprecationReason\": \"This component is deprecated and will be removed in NiFi 2.x.\",\n+                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": \"* * * * * ?\",\n+                            \"TIMER_DRIVEN\": \"60 sec\"\n+                        },\n+                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"group\": \"org.apache.nifi\",\n                         \"propertyDescriptors\": {\n-                            \"bucket-name\": {\n-                                \"defaultValue\": \"default\",\n-                                \"description\": \"The name of bucket to access.\",\n-                                \"displayName\": \"Bucket Name\",\n+                            \"prometheus-reporting-task-client-auth\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"ReportingTask will not authenticate clients. Anyone can communicate with this ReportingTask anonymously\",\n+                                        \"displayName\": \"No Authentication\",\n+                                        \"value\": \"No Authentication\"\n+                                    },\n+                                    {\n+                                        \"description\": \"ReportingTask will try to verify the client but if unable to verify will allow the client to communicate anonymously\",\n+                                        \"displayName\": \"Want Authentication\",\n+                                        \"value\": \"Want Authentication\"\n+                                    },\n+                                    {\n+                                        \"description\": \"ReportingTask will reject communications from any client unless the client provides a certificate that is trusted by the TrustStorespecified in the SSL Context Service\",\n+                                        \"displayName\": \"Need Authentication\",\n+                                        \"value\": \"Need Authentication\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"No Authentication\",\n+                                \"description\": \"Specifies whether or not the Reporting Task should authenticate clients. This value is ignored if the <SSL Context Service> Property is not specified or the SSL Context provided uses only a KeyStore and not a TrustStore.\",\n+                                \"displayName\": \"Client Authentication\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"bucket-name\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"prometheus-reporting-task-client-auth\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"cluster-controller-service\": {\n-                                \"description\": \"A Couchbase Cluster Controller Service which manages connections to a Couchbase cluster.\",\n-                                \"displayName\": \"Couchbase Cluster Controller Service\",\n+                            \"prometheus-reporting-task-instance-id\": {\n+                                \"defaultValue\": \"${hostname(true)}\",\n+                                \"description\": \"Id of this NiFi instance to be included in the metrics sent to Prometheus\",\n+                                \"displayName\": \"Instance ID\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"cluster-controller-service\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"prometheus-reporting-task-instance-id\",\n                                 \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-couchbase-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.couchbase.CouchbaseClusterControllerService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            }\n-                        },\n-                        \"providedApiImplementations\": [\n-                            {\n-                                \"artifact\": \"nifi-standard-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.distributed.cache.client.DistributedMapCacheClient\",\n-                                \"version\": \"1.27.0\"\n+                                \"sensitive\": false\n                             },\n-                            {\n-                                \"artifact\": \"nifi-standard-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.distributed.cache.client.AtomicDistributedMapCacheClient\",\n-                                \"version\": \"1.27.0\"\n-                            }\n-                        ],\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"cache\",\n-                            \"cluster\",\n-                            \"couchbase\",\n-                            \"distributed\",\n-                            \"map\"\n-                        ],\n-                        \"type\": \"org.apache.nifi.couchbase.CouchbaseMapCacheClient\",\n-                        \"typeDescription\": \"Provides the ability to communicate with a Couchbase Server cluster as a DistributedMapCacheServer. This can be used in order to share a Map between nodes in a NiFi cluster. Couchbase Server cluster can provide a high available and persistent cache storage.\",\n-                        \"version\": \"1.27.0\"\n-                    },\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-couchbase-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"e0c4461\"\n-                        },\n-                        \"deprecated\": true,\n-                        \"deprecationReason\": \"This component is deprecated and will be removed in NiFi 2.x.\",\n-                        \"group\": \"org.apache.nifi\",\n-                        \"propertyDescriptors\": {\n-                            \"bucket-name\": {\n-                                \"defaultValue\": \"default\",\n-                                \"description\": \"The name of bucket to access.\",\n-                                \"displayName\": \"Bucket Name\",\n+                            \"prometheus-reporting-task-metrics-endpoint-port\": {\n+                                \"defaultValue\": \"9092\",\n+                                \"description\": \"The Port where prometheus metrics can be accessed\",\n+                                \"displayName\": \"Prometheus Metrics Endpoint Port\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"bucket-name\",\n+                                \"name\": \"prometheus-reporting-task-metrics-endpoint-port\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"cluster-controller-service\": {\n-                                \"description\": \"A Couchbase Cluster Controller Service which manages connections to a Couchbase cluster.\",\n-                                \"displayName\": \"Couchbase Cluster Controller Service\",\n+                            \"prometheus-reporting-task-metrics-send-jvm\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"Send JVM metrics in addition to the NiFi metrics\",\n+                                \"displayName\": \"Send JVM metrics\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"cluster-controller-service\",\n+                                \"name\": \"prometheus-reporting-task-metrics-send-jvm\",\n                                 \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-couchbase-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.couchbase.CouchbaseClusterControllerService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n+                                \"sensitive\": false\n                             },\n-                            \"document-type\": {\n+                            \"prometheus-reporting-task-metrics-strategy\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Json\",\n-                                        \"value\": \"Json\"\n+                                        \"description\": \"Send rollup metrics for the entire root process group\",\n+                                        \"displayName\": \"Root Process Group\",\n+                                        \"value\": \"Root Process Group\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Binary\",\n-                                        \"value\": \"Binary\"\n+                                        \"description\": \"Send metrics for each process group\",\n+                                        \"displayName\": \"All Process Groups\",\n+                                        \"value\": \"All Process Groups\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Send metrics for each component in the system, to include processors, connections, controller services, etc.\",\n+                                        \"displayName\": \"All Components\",\n+                                        \"value\": \"All Components\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"Json\",\n-                                \"description\": \"The type of contents.\",\n-                                \"displayName\": \"Document Type\",\n+                                \"defaultValue\": \"All Components\",\n+                                \"description\": \"The granularity on which to report metrics. Options include only the root process group, all process groups, or all components\",\n+                                \"displayName\": \"Metrics Reporting Strategy\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"document-type\",\n+                                \"name\": \"prometheus-reporting-task-metrics-strategy\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"record-reader\": {\n-                                \"description\": \"The Record Reader to use for parsing fetched document from Couchbase Server.\",\n-                                \"displayName\": \"Record Reader\",\n+                            \"prometheus-reporting-task-ssl-context\": {\n+                                \"description\": \"The SSL Context Service to use in order to secure the server. If specified, the server willaccept only HTTPS requests; otherwise, the server will accept only HTTP requests\",\n+                                \"displayName\": \"SSL Context Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"record-reader\",\n-                                \"required\": true,\n+                                \"name\": \"prometheus-reporting-task-ssl-context\",\n+                                \"required\": false,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n                                     \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n+                                    \"type\": \"org.apache.nifi.ssl.RestrictedSSLContextService\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             }\n                         },\n-                        \"providedApiImplementations\": [\n-                            {\n-                                \"artifact\": \"nifi-standard-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.lookup.LookupService\",\n-                                \"version\": \"1.27.0\"\n-                            },\n-                            {\n-                                \"artifact\": \"nifi-standard-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.lookup.RecordLookupService\",\n-                                \"version\": \"1.27.0\"\n-                            }\n+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\"\n                         ],\n                         \"supportsDynamicProperties\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"couchbase\",\n-                            \"enrich\",\n-                            \"lookup\"\n+                            \"metrics\",\n+                            \"prometheus\",\n+                            \"reporting\",\n+                            \"time series data\"\n                         ],\n-                        \"type\": \"org.apache.nifi.couchbase.CouchbaseRecordLookupService\",\n-                        \"typeDescription\": \"Lookup a record from Couchbase Server associated with the specified key. The coordinates that are passed to the lookup must contain the key 'key'.\",\n+                        \"type\": \"org.apache.nifi.reporting.prometheus.PrometheusReportingTask\",\n+                        \"typeDescription\": \"Reports metrics in Prometheus format by creating a /metrics HTTP(S) endpoint which can be used for external monitoring of the application. The reporting task reports a set of metrics regarding the JVM (optional) and the NiFi instance. Note that if the underlying Jetty server (i.e. the Prometheus endpoint) cannot be started (for example if two PrometheusReportingTask instances are started on the same port), this may cause a delay in shutting down NiFi while it waits for the server resources to be cleaned up.\",\n                         \"version\": \"1.27.0\"\n                     }\n-                ],\n+                ]\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"1.27.0\"\n+        },\n+        {\n+            \"artifact\": \"nifi-zendesk-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [],\n                 \"processors\": [\n                     {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-couchbase-nar\",\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-zendesk-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n                         },\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"0 sec\"\n+                            \"TIMER_DRIVEN\": \"1 min\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n-                        \"defaultYieldDuration\": \"1 sec\",\n-                        \"deprecated\": true,\n-                        \"deprecationReason\": \"This component is deprecated and will be removed in NiFi 2.x.\",\n+                        \"defaultYieldDuration\": \"20 sec\",\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_REQUIRED\",\n-                        \"primaryNodeOnly\": false,\n+                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n+                        \"primaryNodeOnly\": true,\n                         \"propertyDescriptors\": {\n-                            \"bucket-name\": {\n-                                \"defaultValue\": \"default\",\n-                                \"description\": \"The name of bucket to access.\",\n-                                \"displayName\": \"Bucket Name\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"bucket-name\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"cluster-controller-service\": {\n-                                \"description\": \"A Couchbase Cluster Controller Service which manages connections to a Couchbase cluster.\",\n-                                \"displayName\": \"Couchbase Cluster Controller Service\",\n+                            \"web-client-service-provider\": {\n+                                \"description\": \"Controller service for HTTP client operations.\",\n+                                \"displayName\": \"Web Client Service Provider\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"cluster-controller-service\",\n+                                \"name\": \"web-client-service-provider\",\n                                 \"required\": true,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-couchbase-services-api-nar\",\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.couchbase.CouchbaseClusterControllerService\",\n+                                    \"type\": \"org.apache.nifi.web.client.provider.api.WebClientServiceProvider\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             },\n-                            \"document-id\": {\n-                                \"description\": \"A static, fixed Couchbase document id, or an expression to construct the Couchbase document id.\",\n-                                \"displayName\": \"Document Id\",\n+                            \"zendesk-authentication-type-name\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"Password of Zendesk login user.\",\n+                                        \"displayName\": \"Password\",\n+                                        \"value\": \"password\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Authentication token generated in Zendesk Admin menu for API access.\",\n+                                        \"displayName\": \"Token\",\n+                                        \"value\": \"token\"\n+                                    }\n+                                ],\n+                                \"description\": \"Type of authentication to Zendesk API.\",\n+                                \"displayName\": \"Authentication Type\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"zendesk-authentication-type-name\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"zendesk-authentication-value-name\": {\n+                                \"description\": \"Password or authentication token for Zendesk login user.\",\n+                                \"displayName\": \"Authentication Credential\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"document-id\",\n-                                \"required\": false,\n+                                \"name\": \"zendesk-authentication-value-name\",\n+                                \"required\": true,\n+                                \"sensitive\": true\n+                            },\n+                            \"zendesk-export-method\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"In cursor-based incremental exports, each page of results includes an \\\"after\\\" cursor pointer to use as the starting cursor for the next page of results.\",\n+                                        \"displayName\": \"Cursor Based\",\n+                                        \"value\": \"cursor\"\n+                                    },\n+                                    {\n+                                        \"description\": \"In time-based incremental exports, each page of results includes an end time to use as the start time for the next page of results.\",\n+                                        \"displayName\": \"Time Based\",\n+                                        \"value\": \"time\"\n+                                    }\n+                                ],\n+                                \"description\": \"Method for incremental export.\",\n+                                \"displayName\": \"Export Method\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"zendesk-export-method\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"document-type\": {\n+                            \"zendesk-query-start-timestamp\": {\n+                                \"description\": \"Initial timestamp to query Zendesk API from in Unix timestamp seconds format.\",\n+                                \"displayName\": \"Query Start Timestamp\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"zendesk-query-start-timestamp\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"zendesk-resource\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Json\",\n-                                        \"value\": \"Json\"\n+                                        \"description\": \"Tickets are the means through which end users (customers) communicate with agents in Zendesk Support.\",\n+                                        \"displayName\": \"Tickets\",\n+                                        \"value\": \"/api/v2/incremental/tickets\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Binary\",\n-                                        \"value\": \"Binary\"\n+                                        \"description\": \"Stream of changes that occurred on tickets. Each event is tied to an update on a ticket and contains all the fields that were updated in that change.\",\n+                                        \"displayName\": \"Ticket Events\",\n+                                        \"value\": \"/api/v2/incremental/ticket_events\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Ticket metric events API can be used to track reply times, agent work times, and requester wait times.\",\n+                                        \"displayName\": \"Ticket Metric Events\",\n+                                        \"value\": \"/api/v2/incremental/ticket_metric_events\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Zendesk Support has three types of users: end users (customers), agents, and administrators.\",\n+                                        \"displayName\": \"Users\",\n+                                        \"value\": \"/api/v2/incremental/users\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Just as agents can be segmented into groups in Zendesk Support, customers (end-users) can be segmented into organizations.\",\n+                                        \"displayName\": \"Organizations\",\n+                                        \"value\": \"/api/v2/incremental/organizations\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Articles are content items such as help topics or tech notes contained in sections.\",\n+                                        \"displayName\": \"Articles\",\n+                                        \"value\": \"/api/v2/help_center/incremental/articles\"\n+                                    },\n+                                    {\n+                                        \"description\": \"When a recipient responds to an NPS survey, their rating, comment, and last survey date are captured.\",\n+                                        \"displayName\": \"NPS - Responses\",\n+                                        \"value\": \"/api/v2/nps/incremental/responses\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Every NPS survey is delivered to one or multiple recipients. For most businesses that use Zendesk Support, the recipients are customers. Agents and admins will never receive surveys.\",\n+                                        \"displayName\": \"NPS - Recipients\",\n+                                        \"value\": \"/api/v2/nps/incremental/recipients\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"Json\",\n-                                \"description\": \"The type of contents.\",\n-                                \"displayName\": \"Document Type\",\n+                                \"description\": \"The particular Zendesk resource which is meant to be exported.\",\n+                                \"displayName\": \"Resource\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"document-type\",\n+                                \"name\": \"zendesk-resource\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"put-to-attribute\": {\n-                                \"description\": \"If set, the retrieved value will be put into an attribute of the FlowFile instead of a the content of the FlowFile. The attribute key to put to is determined by evaluating value of this property.\",\n-                                \"displayName\": \"Put Value to Attribute\",\n+                            \"zendesk-subdomain\": {\n+                                \"description\": \"Name of the Zendesk subdomain.\",\n+                                \"displayName\": \"Subdomain Name\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"put-to-attribute\",\n-                                \"required\": false,\n+                                \"name\": \"zendesk-subdomain\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"zendesk-user\": {\n+                                \"description\": \"Login user to Zendesk subdomain.\",\n+                                \"displayName\": \"User Name\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"zendesk-user\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             }\n                         },\n                         \"sideEffectFree\": false,\n+                        \"stateful\": {\n+                            \"description\": \"Paging cursor for Zendesk API is stored. Cursor is updated after each successful request.\",\n+                            \"scopes\": [\n+                                \"CLUSTER\"\n+                            ]\n+                        },\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"All FlowFiles failed to fetch from Couchbase Server but can be retried are routed to this relationship.\",\n-                                \"name\": \"retry\"\n-                            },\n-                            {\n-                                \"description\": \"Values retrieved from Couchbase Server are written as outgoing FlowFiles content or put into an attribute of the incoming FlowFile and routed to this relationship.\",\n+                                \"description\": \"For FlowFiles created as a result of a successful HTTP request.\",\n                                 \"name\": \"success\"\n-                            },\n-                            {\n-                                \"description\": \"All FlowFiles failed to fetch from Couchbase Server and not retry-able are routed to this relationship.\",\n-                                \"name\": \"failure\"\n-                            },\n-                            {\n-                                \"description\": \"The original input FlowFile is routed to this relationship when the value is retrieved from Couchbase Server and routed to 'success'.\",\n-                                \"name\": \"original\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n                         \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n-                        \"systemResourceConsiderations\": [\n-                            {\n-                                \"description\": \"An instance of this component can cause high usage of this system resource.  Multiple instances or high concurrency settings may result a degradation of performance.\",\n-                                \"resource\": \"MEMORY\"\n-                            }\n-                        ],\n                         \"tags\": [\n-                            \"couchbase\",\n-                            \"database\",\n-                            \"get\",\n-                            \"nosql\"\n+                            \"zendesk\"\n                         ],\n-                        \"triggerSerially\": false,\n+                        \"triggerSerially\": true,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.couchbase.GetCouchbaseKey\",\n-                        \"typeDescription\": \"Get a document from Couchbase Server via Key/Value access. The ID of the document to fetch may be supplied by setting the <Document Id> property. NOTE: if the Document Id property is not set, the contents of the FlowFile will be read to determine the Document Id, which means that the contents of the entire FlowFile will be buffered in memory.\",\n+                        \"type\": \"org.apache.nifi.processors.zendesk.GetZendesk\",\n+                        \"typeDescription\": \"Incrementally fetches data from Zendesk API.\",\n                         \"version\": \"1.27.0\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"Cluster where the document was retrieved from.\",\n-                                \"name\": \"couchbase.cluster\"\n-                            },\n-                            {\n-                                \"description\": \"Bucket where the document was retrieved from.\",\n-                                \"name\": \"couchbase.bucket\"\n-                            },\n-                            {\n-                                \"description\": \"Id of the document.\",\n-                                \"name\": \"couchbase.doc.id\"\n-                            },\n-                            {\n-                                \"description\": \"CAS of the document.\",\n-                                \"name\": \"couchbase.doc.cas\"\n-                            },\n-                            {\n-                                \"description\": \"Expiration of the document.\",\n-                                \"name\": \"couchbase.doc.expiry\"\n-                            },\n-                            {\n-                                \"description\": \"If Couchbase related error occurs the CouchbaseException class name will be captured here.\",\n-                                \"name\": \"couchbase.exception\"\n+                                \"description\": \"The number of records fetched by the processor.\",\n+                                \"name\": \"record.count\"\n                             }\n                         ]\n                     },\n                     {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-couchbase-nar\",\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-zendesk-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -2997,716 +1828,655 @@\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n-                        \"deprecated\": true,\n-                        \"deprecationReason\": \"This component is deprecated and will be removed in NiFi 2.x.\",\n+                        \"dynamicProperties\": [\n+                            {\n+                                \"description\": \"Additional property to be added to the Zendesk request object.\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"name\": \"The path in the request object to add. The value needs be a valid JsonPointer.\",\n+                                \"value\": \"The path in the incoming record to get the value from.\"\n+                            }\n+                        ],\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"bucket-name\": {\n-                                \"defaultValue\": \"default\",\n-                                \"description\": \"The name of bucket to access.\",\n-                                \"displayName\": \"Bucket Name\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"bucket-name\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"cluster-controller-service\": {\n-                                \"description\": \"A Couchbase Cluster Controller Service which manages connections to a Couchbase cluster.\",\n-                                \"displayName\": \"Couchbase Cluster Controller Service\",\n+                            \"web-client-service-provider\": {\n+                                \"description\": \"Controller service for HTTP client operations.\",\n+                                \"displayName\": \"Web Client Service Provider\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"cluster-controller-service\",\n+                                \"name\": \"web-client-service-provider\",\n                                 \"required\": true,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-couchbase-services-api-nar\",\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.couchbase.CouchbaseClusterControllerService\",\n+                                    \"type\": \"org.apache.nifi.web.client.provider.api.WebClientServiceProvider\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             },\n-                            \"document-id\": {\n-                                \"description\": \"A static, fixed Couchbase document id, or an expression to construct the Couchbase document id.\",\n-                                \"displayName\": \"Document Id\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"document-id\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"document-type\": {\n+                            \"zendesk-authentication-type-name\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Json\",\n-                                        \"value\": \"Json\"\n+                                        \"description\": \"Password of Zendesk login user.\",\n+                                        \"displayName\": \"Password\",\n+                                        \"value\": \"password\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Binary\",\n-                                        \"value\": \"Binary\"\n+                                        \"description\": \"Authentication token generated in Zendesk Admin menu for API access.\",\n+                                        \"displayName\": \"Token\",\n+                                        \"value\": \"token\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"Json\",\n-                                \"description\": \"The type of contents.\",\n-                                \"displayName\": \"Document Type\",\n+                                \"description\": \"Type of authentication to Zendesk API.\",\n+                                \"displayName\": \"Authentication Type\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"document-type\",\n+                                \"name\": \"zendesk-authentication-type-name\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"persist-to\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"MASTER\",\n-                                        \"value\": \"MASTER\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"NONE\",\n-                                        \"value\": \"NONE\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"ONE\",\n-                                        \"value\": \"ONE\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"TWO\",\n-                                        \"value\": \"TWO\"\n-                                    },\n+                            \"zendesk-authentication-value-name\": {\n+                                \"description\": \"Password or authentication token for Zendesk login user.\",\n+                                \"displayName\": \"Authentication Credential\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"zendesk-authentication-value-name\",\n+                                \"required\": true,\n+                                \"sensitive\": true\n+                            },\n+                            \"zendesk-comment-body\": {\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"THREE\",\n-                                        \"value\": \"THREE\"\n-                                    },\n+                                        \"propertyDisplayName\": \"Record Reader\",\n+                                        \"propertyName\": \"zendesk-record-reader\"\n+                                    }\n+                                ],\n+                                \"description\": \"The content or the path to the comment body in the incoming record.\",\n+                                \"displayName\": \"Comment Body\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"zendesk-comment-body\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"zendesk-priority\": {\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"FOUR\",\n-                                        \"value\": \"FOUR\"\n+                                        \"propertyDisplayName\": \"Record Reader\",\n+                                        \"propertyName\": \"zendesk-record-reader\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"NONE\",\n-                                \"description\": \"Durability constraint about disk persistence.\",\n-                                \"displayName\": \"Persist To\",\n+                                \"description\": \"The content or the path to the priority in the incoming record.\",\n+                                \"displayName\": \"Priority\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"zendesk-priority\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"zendesk-record-reader\": {\n+                                \"description\": \"Specifies the Controller Service to use for parsing incoming data and determining the data's schema.\",\n+                                \"displayName\": \"Record Reader\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"persist-to\",\n+                                \"name\": \"zendesk-record-reader\",\n+                                \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"zendesk-subdomain\": {\n+                                \"description\": \"Name of the Zendesk subdomain.\",\n+                                \"displayName\": \"Subdomain Name\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"zendesk-subdomain\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"replicate-to\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"NONE\",\n-                                        \"value\": \"NONE\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"ONE\",\n-                                        \"value\": \"ONE\"\n-                                    },\n+                            \"zendesk-subject\": {\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"TWO\",\n-                                        \"value\": \"TWO\"\n-                                    },\n+                                        \"propertyDisplayName\": \"Record Reader\",\n+                                        \"propertyName\": \"zendesk-record-reader\"\n+                                    }\n+                                ],\n+                                \"description\": \"The content or the path to the subject in the incoming record.\",\n+                                \"displayName\": \"Subject\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"zendesk-subject\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"zendesk-type\": {\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"THREE\",\n-                                        \"value\": \"THREE\"\n+                                        \"propertyDisplayName\": \"Record Reader\",\n+                                        \"propertyName\": \"zendesk-record-reader\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"NONE\",\n-                                \"description\": \"Durability constraint about replication.\",\n-                                \"displayName\": \"Replicate To\",\n+                                \"description\": \"The content or the path to the type in the incoming record.\",\n+                                \"displayName\": \"Type\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"replicate-to\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"zendesk-type\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"zendesk-user\": {\n+                                \"description\": \"Login user to Zendesk subdomain.\",\n+                                \"displayName\": \"User Name\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"zendesk-user\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             }\n                         },\n-                        \"readsAttributes\": [\n-                            {\n-                                \"description\": \"Used as a document id if 'Document Id' is not specified\",\n-                                \"name\": \"uuid\"\n-                            }\n-                        ],\n                         \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"All FlowFiles failed to be written to Couchbase Server but can be retried are routed to this relationship.\",\n-                                \"name\": \"retry\"\n-                            },\n-                            {\n-                                \"description\": \"All FlowFiles that are written to Couchbase Server are routed to this relationship.\",\n+                                \"description\": \"For FlowFiles created as a result of a successful HTTP request.\",\n                                 \"name\": \"success\"\n                             },\n                             {\n-                                \"description\": \"All FlowFiles failed to be written to Couchbase Server and not retry-able are routed to this relationship.\",\n+                                \"description\": \"A FlowFile is routed to this relationship if the operation failed and retrying the operation will also fail, such as an invalid data or schema.\",\n                                 \"name\": \"failure\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n                         \"supportsBatching\": false,\n-                        \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicProperties\": true,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n-                        \"systemResourceConsiderations\": [\n-                            {\n-                                \"description\": \"An instance of this component can cause high usage of this system resource.  Multiple instances or high concurrency settings may result a degradation of performance.\",\n-                                \"resource\": \"MEMORY\"\n-                            }\n-                        ],\n                         \"tags\": [\n-                            \"couchbase\",\n-                            \"database\",\n-                            \"nosql\",\n-                            \"put\"\n+                            \"zendesk, ticket\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.couchbase.PutCouchbaseKey\",\n-                        \"typeDescription\": \"Put a document to Couchbase Server via Key/Value access.\",\n+                        \"type\": \"org.apache.nifi.processors.zendesk.PutZendeskTicket\",\n+                        \"typeDescription\": \"Create Zendesk tickets using the Zendesk API.\",\n                         \"version\": \"1.27.0\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"Cluster where the document was stored.\",\n-                                \"name\": \"couchbase.cluster\"\n-                            },\n-                            {\n-                                \"description\": \"Bucket where the document was stored.\",\n-                                \"name\": \"couchbase.bucket\"\n-                            },\n-                            {\n-                                \"description\": \"Id of the document.\",\n-                                \"name\": \"couchbase.doc.id\"\n-                            },\n-                            {\n-                                \"description\": \"CAS of the document.\",\n-                                \"name\": \"couchbase.doc.cas\"\n+                                \"description\": \"The number of records processed.\",\n+                                \"name\": \"record.count\"\n                             },\n                             {\n-                                \"description\": \"Expiration of the document.\",\n-                                \"name\": \"couchbase.doc.expiry\"\n+                                \"description\": \"The error code of from the response.\",\n+                                \"name\": \"error.code\"\n                             },\n                             {\n-                                \"description\": \"If Couchbase related error occurs the CouchbaseException class name will be captured here.\",\n-                                \"name\": \"couchbase.exception\"\n+                                \"description\": \"The error message of from the response.\",\n+                                \"name\": \"error.message\"\n                             }\n                         ]\n                     }\n                 ],\n                 \"reportingTasks\": []\n             },\n             \"group\": \"org.apache.nifi\",\n             \"version\": \"1.27.0\"\n         },\n         {\n-            \"artifact\": \"nifi-enrich-nar\",\n+            \"artifact\": \"nifi-language-translation-nar\",\n             \"componentManifest\": {\n                 \"controllerServices\": [],\n                 \"processors\": [\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-enrich-nar\",\n+                        \"artifact\": \"nifi-language-translation-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n-                            \"EVENT_DRIVEN\": 0,\n                             \"TIMER_DRIVEN\": 1\n                         },\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n+                        \"dynamicProperties\": [\n+                            {\n+                                \"description\": \"User-defined properties are used to translate arbitrary text based on attributes.\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"name\": \"The name of an attribute to set that will contain the translated text of the value\",\n+                                \"value\": \"The value to translate\"\n+                            }\n+                        ],\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Geo Database File\": {\n-                                \"description\": \"Path to Maxmind IP Enrichment Database File\",\n-                                \"displayName\": \"MaxMind Database File\",\n+                            \"Character Set\": {\n+                                \"defaultValue\": \"UTF-8\",\n+                                \"description\": \"Specifies the character set of the data to be translated\",\n+                                \"displayName\": \"Character Set\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Geo Database File\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Character Set\",\n                                 \"required\": true,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"SINGLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\",\n-                                        \"DIRECTORY\"\n-                                    ]\n-                                },\n                                 \"sensitive\": false\n                             },\n-                            \"IP Address Attribute\": {\n-                                \"description\": \"The name of an attribute whose value is a dotted decimal IP address for which enrichment should occur\",\n-                                \"displayName\": \"IP Address Attribute\",\n+                            \"Input Language\": {\n+                                \"description\": \"The language of incoming data. If no language is set, Yandex will attempt to detect the incoming language automatically.\",\n+                                \"displayName\": \"Input Language\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"IP Address Attribute\",\n-                                \"required\": true,\n+                                \"name\": \"Input Language\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Log Level\": {\n-                                \"defaultValue\": \"WARN\",\n-                                \"description\": \"The Log Level to use when an IP is not found in the database. Accepted values: INFO, DEBUG, WARN, ERROR.\",\n-                                \"displayName\": \"Log Level\",\n+                            \"Target Language\": {\n+                                \"defaultValue\": \"en\",\n+                                \"description\": \"The language to translate the text into\",\n+                                \"displayName\": \"Target Language\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Log Level\",\n+                                \"name\": \"Target Language\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Translate Content\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"Specifies whether or not the content should be translated. If false, only the text specified by user-defined properties will be translated.\",\n+                                \"displayName\": \"Translate Content\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Translate Content\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Yandex API Key\": {\n+                                \"description\": \"The API Key that is registered with Yandex\",\n+                                \"displayName\": \"Yandex API Key\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Yandex API Key\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             }\n                         },\n-                        \"sideEffectFree\": true,\n+                        \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"Where to route flow files after unsuccessfully enriching attributes because no data was found\",\n-                                \"name\": \"not found\"\n+                                \"description\": \"This relationship is used if the translation cannot be performed for some reason other than communications failure\",\n+                                \"name\": \"translation.failure\"\n                             },\n                             {\n-                                \"description\": \"Where to route flow files after successfully enriching attributes with data provided by database\",\n-                                \"name\": \"found\"\n+                                \"description\": \"This relationship is used when the translation is successful\",\n+                                \"name\": \"success\"\n+                            },\n+                            {\n+                                \"description\": \"This relationship is used when the translation fails due to a problem such as a network failure, and for which the translation should be attempted again\",\n+                                \"name\": \"comms.failure\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\",\n-                            \"EVENT_DRIVEN\"\n+                            \"CRON_DRIVEN\"\n                         ],\n                         \"supportsBatching\": true,\n-                        \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicProperties\": true,\n                         \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": true,\n+                        \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"enrich\",\n-                            \"geo\",\n-                            \"ip\",\n-                            \"maxmind\"\n+                            \"language\",\n+                            \"translate\",\n+                            \"translation\",\n+                            \"yandex\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.GeoEnrichIP\",\n-                        \"typeDescription\": \"Looks up geolocation information for an IP address and adds the geo information to FlowFile attributes. The geo data is provided as a MaxMind database. The attribute that contains the IP address to lookup is provided by the 'IP Address Attribute' property. If the name of the attribute provided is 'X', then the the attributes added by enrichment will take the form X.geo.<fieldName>\",\n+                        \"type\": \"org.apache.nifi.processors.yandex.YandexTranslate\",\n+                        \"typeDescription\": \"Translates content and attributes from one language to another\",\n                         \"version\": \"1.27.0\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"The number of microseconds that the geo lookup took\",\n-                                \"name\": \"X.geo.lookup.micros\"\n-                            },\n-                            {\n-                                \"description\": \"The city identified for the IP address\",\n-                                \"name\": \"X.geo.city\"\n-                            },\n-                            {\n-                                \"description\": \"The accuracy radius if provided by the database (in Kilometers)\",\n-                                \"name\": \"X.geo.accuracy\"\n-                            },\n-                            {\n-                                \"description\": \"The latitude identified for this IP address\",\n-                                \"name\": \"X.geo.latitude\"\n-                            },\n-                            {\n-                                \"description\": \"The longitude identified for this IP address\",\n-                                \"name\": \"X.geo.longitude\"\n-                            },\n-                            {\n-                                \"description\": \"Each subdivision that is identified for this IP address is added with a one-up number appended to the attribute name, starting with 0\",\n-                                \"name\": \"X.geo.subdivision.N\"\n-                            },\n-                            {\n-                                \"description\": \"The ISO code for the subdivision that is identified by X.geo.subdivision.N\",\n-                                \"name\": \"X.geo.subdivision.isocode.N\"\n-                            },\n-                            {\n-                                \"description\": \"The country identified for this IP address\",\n-                                \"name\": \"X.geo.country\"\n-                            },\n-                            {\n-                                \"description\": \"The ISO Code for the country identified\",\n-                                \"name\": \"X.geo.country.isocode\"\n+                                \"description\": \"If the text cannot be translated, this attribute will be set indicating the reason for the failure\",\n+                                \"name\": \"yandex.translate.failure.reason\"\n                             },\n                             {\n-                                \"description\": \"The postal code for the country identified\",\n-                                \"name\": \"X.geo.postalcode\"\n+                                \"description\": \"When the translation succeeds, if the content was translated, this attribute will be set indicating the new language of the content\",\n+                                \"name\": \"language\"\n                             }\n                         ]\n-                    },\n+                    }\n+                ],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"1.27.0\"\n+        },\n+        {\n+            \"artifact\": \"nifi-elasticsearch-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [],\n+                \"processors\": [\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-enrich-nar\",\n+                        \"artifact\": \"nifi-elasticsearch-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n+                            \"EVENT_DRIVEN\": 0,\n                             \"TIMER_DRIVEN\": 1\n                         },\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n+                        \"deprecated\": true,\n+                        \"deprecationAlternatives\": [\n+                            \"org.apache.nifi.processors.elasticsearch.GetElasticsearch\"\n+                        ],\n+                        \"deprecationReason\": \"This processor is deprecated and may be removed in future releases.\",\n+                        \"dynamicProperties\": [\n+                            {\n+                                \"description\": \"Adds the specified property name/value as a query parameter in the Elasticsearch URL used for processing\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"name\": \"A URL query parameter\",\n+                                \"value\": \"The value to set it to\"\n+                            }\n+                        ],\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_REQUIRED\",\n+                        \"inputRequirement\": \"INPUT_ALLOWED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Geo Database File\": {\n-                                \"description\": \"Path to Maxmind IP Enrichment Database File\",\n-                                \"displayName\": \"MaxMind Database File\",\n+                            \"Character Set\": {\n+                                \"defaultValue\": \"UTF-8\",\n+                                \"description\": \"Specifies the character set of the document data.\",\n+                                \"displayName\": \"Character Set\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Character Set\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Password\": {\n+                                \"description\": \"Password to access the Elasticsearch cluster\",\n+                                \"displayName\": \"Password\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Geo Database File\",\n-                                \"required\": true,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"SINGLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\",\n-                                        \"DIRECTORY\"\n-                                    ]\n-                                },\n+                                \"name\": \"Password\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n+                            },\n+                            \"SSL Context Service\": {\n+                                \"description\": \"The SSL Context Service used to provide client certificate information for TLS/SSL connections. This service only applies if the Elasticsearch endpoint(s) have been secured with TLS/SSL.\",\n+                                \"displayName\": \"SSL Context Service\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"SSL Context Service\",\n+                                \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"Username\": {\n+                                \"description\": \"Username to access the Elasticsearch cluster\",\n+                                \"displayName\": \"Username\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Username\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Log Level\": {\n-                                \"defaultValue\": \"WARN\",\n-                                \"description\": \"The Log Level to use when an IP is not found in the database. Accepted values: INFO, DEBUG, WARN, ERROR.\",\n-                                \"displayName\": \"Log Level\",\n+                            \"elasticsearch-http-connect-timeout\": {\n+                                \"defaultValue\": \"5 secs\",\n+                                \"description\": \"Max wait time for the connection to the Elasticsearch REST API.\",\n+                                \"displayName\": \"Connection Timeout\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Log Level\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"elasticsearch-http-connect-timeout\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"geo-enrich-ip-city-record-path\": {\n-                                \"description\": \"Record path for putting the city identified for the IP address\",\n-                                \"displayName\": \"City Record Path\",\n+                            \"elasticsearch-http-proxy-host\": {\n+                                \"description\": \"The fully qualified hostname or IP address of the proxy server\",\n+                                \"displayName\": \"Proxy Host\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"geo-enrich-ip-city-record-path\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"elasticsearch-http-proxy-host\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"geo-enrich-ip-country-iso-record-path\": {\n-                                \"description\": \"Record path for putting the ISO Code for the country identified\",\n-                                \"displayName\": \"Country ISO Code Record Path\",\n+                            \"elasticsearch-http-proxy-port\": {\n+                                \"description\": \"The port of the proxy server\",\n+                                \"displayName\": \"Proxy Port\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"geo-enrich-ip-country-iso-record-path\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"elasticsearch-http-proxy-port\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"geo-enrich-ip-country-postal-record-path\": {\n-                                \"description\": \"Record path for putting the postal code for the country identified\",\n-                                \"displayName\": \"Country Postal Code Record Path\",\n+                            \"elasticsearch-http-response-timeout\": {\n+                                \"defaultValue\": \"15 secs\",\n+                                \"description\": \"Max wait time for a response from the Elasticsearch REST API.\",\n+                                \"displayName\": \"Response Timeout\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"geo-enrich-ip-country-postal-record-path\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"elasticsearch-http-response-timeout\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"geo-enrich-ip-country-record-path\": {\n-                                \"description\": \"Record path for putting the country identified for this IP address\",\n-                                \"displayName\": \"Country Record Path\",\n+                            \"elasticsearch-http-url\": {\n+                                \"description\": \"Elasticsearch URL which will be connected to, including scheme (http, e.g.), host, and port. The default port for the REST API is 9200.\",\n+                                \"displayName\": \"Elasticsearch URL\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"geo-enrich-ip-country-record-path\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"elasticsearch-http-url\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"geo-enrich-ip-ip-record-path\": {\n-                                \"description\": \"The record path to retrieve the IP address for doing the lookup.\",\n-                                \"displayName\": \"IP Address Record Path\",\n+                            \"fetch-es-doc-id\": {\n+                                \"description\": \"The identifier of the document to be fetched\",\n+                                \"displayName\": \"Document Identifier\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"geo-enrich-ip-ip-record-path\",\n+                                \"name\": \"fetch-es-doc-id\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"geo-enrich-ip-latitude-record-path\": {\n-                                \"description\": \"Record path for putting the latitude identified for this IP address\",\n-                                \"displayName\": \"Latitude Record Path\",\n+                            \"fetch-es-fields\": {\n+                                \"description\": \"A comma-separated list of fields to retrieve from the document. If the Fields property is left blank, then the entire document's source will be retrieved.\",\n+                                \"displayName\": \"Fields\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"geo-enrich-ip-latitude-record-path\",\n+                                \"name\": \"fetch-es-fields\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"geo-enrich-ip-longitude-record-path\": {\n-                                \"description\": \"Record path for putting the longitude identified for this IP address\",\n-                                \"displayName\": \"Longitude Record Path\",\n+                            \"fetch-es-index\": {\n+                                \"description\": \"The name of the index to read from.\",\n+                                \"displayName\": \"Index\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"geo-enrich-ip-longitude-record-path\",\n+                                \"name\": \"fetch-es-index\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"fetch-es-type\": {\n+                                \"description\": \"The type of document/fetch (if unset, the first document matching the identifier across _all types will be retrieved). This should be unset, '_doc' or '_source' for Elasticsearch 7.0+.\",\n+                                \"displayName\": \"Type\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"fetch-es-type\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"geo-enrich-ip-record-reader\": {\n-                                \"description\": \"Record reader service to use for reading the flowfile contents.\",\n-                                \"displayName\": \"Record Reader\",\n+                            \"proxy-configuration-service\": {\n+                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests. If set, it supersedes proxy settings configured per component. Supported proxies: SOCKS, HTTP + AuthN In case of SOCKS, it is not guaranteed that the selected SOCKS Version will be used by the processor.\",\n+                                \"displayName\": \"Proxy Configuration Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"geo-enrich-ip-record-reader\",\n-                                \"required\": true,\n+                                \"name\": \"proxy-configuration-service\",\n+                                \"required\": false,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n                                     \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n+                                    \"type\": \"org.apache.nifi.proxy.ProxyConfigurationService\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             },\n-                            \"geo-enrich-ip-record-writer\": {\n-                                \"description\": \"Record writer service to use for enriching the flowfile contents.\",\n-                                \"displayName\": \"Record Writer\",\n+                            \"proxy-password\": {\n+                                \"description\": \"Proxy Password\",\n+                                \"displayName\": \"Proxy Password\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"geo-enrich-ip-record-writer\",\n-                                \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"proxy-password\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n                             },\n-                            \"geo-enrich-ip-split-found-not-found\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"Separate records that have been enriched from ones that have not. Default behavior is to send everything to the found relationship if even one record is enriched.\",\n-                                \"displayName\": \"Separate Enriched From Not Enriched\",\n+                            \"proxy-username\": {\n+                                \"description\": \"Proxy Username\",\n+                                \"displayName\": \"Proxy Username\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"geo-enrich-ip-split-found-not-found\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"proxy-username\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             }\n                         },\n                         \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"Where to route flow files after unsuccessfully enriching attributes because no data was found\",\n-                                \"name\": \"not found\"\n+                                \"description\": \"A FlowFile is routed to this relationship if the document cannot be fetched but attempting the operation again may succeed. Note that if the processor has no incoming connections, flow files may still be sent to this relationship based on the processor properties and the results of the fetch operation.\",\n+                                \"name\": \"retry\"\n                             },\n                             {\n-                                \"description\": \"The original input flowfile goes to this relationship regardless of whether the content was enriched or not.\",\n-                                \"name\": \"original\"\n+                                \"description\": \"All FlowFiles that are read from Elasticsearch are routed to this relationship.\",\n+                                \"name\": \"success\"\n                             },\n                             {\n-                                \"description\": \"Where to route flow files after successfully enriching attributes with data provided by database\",\n-                                \"name\": \"found\"\n-                            }\n-                        ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": false,\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": false,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"enrich\",\n-                            \"geo\",\n-                            \"ip\",\n-                            \"maxmind\",\n-                            \"record\"\n-                        ],\n-                        \"triggerSerially\": false,\n-                        \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.GeoEnrichIPRecord\",\n-                        \"typeDescription\": \"Looks up geolocation information for an IP address and adds the geo information to FlowFile attributes. The geo data is provided as a MaxMind database. This version uses the NiFi Record API to allow large scale enrichment of record-oriented data sets. Each field provided by the MaxMind database can be directed to a field of the user's choosing by providing a record path for that field configuration. \",\n-                        \"version\": \"1.27.0\"\n-                    },\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-enrich-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"e0c4461\"\n-                        },\n-                        \"defaultBulletinLevel\": \"WARN\",\n-                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": 1,\n-                            \"EVENT_DRIVEN\": 0,\n-                            \"TIMER_DRIVEN\": 1\n-                        },\n-                        \"defaultPenaltyDuration\": \"30 sec\",\n-                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"0 sec\"\n-                        },\n-                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n-                        \"defaultYieldDuration\": \"1 sec\",\n-                        \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_REQUIRED\",\n-                        \"primaryNodeOnly\": false,\n-                        \"propertyDescriptors\": {\n-                            \"Geo Database File\": {\n-                                \"description\": \"Path to Maxmind IP Enrichment Database File\",\n-                                \"displayName\": \"MaxMind Database File\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Geo Database File\",\n-                                \"required\": true,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"SINGLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\",\n-                                        \"DIRECTORY\"\n-                                    ]\n-                                },\n-                                \"sensitive\": false\n-                            },\n-                            \"IP Address Attribute\": {\n-                                \"description\": \"The name of an attribute whose value is a dotted decimal IP address for which enrichment should occur\",\n-                                \"displayName\": \"IP Address Attribute\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"IP Address Attribute\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n+                                \"description\": \"All FlowFiles that cannot be read from Elasticsearch are routed to this relationship. Note that only incoming flow files will be routed to failure.\",\n+                                \"name\": \"failure\"\n                             },\n-                            \"Log Level\": {\n-                                \"defaultValue\": \"WARN\",\n-                                \"description\": \"The Log Level to use when an IP is not found in the database. Accepted values: INFO, DEBUG, WARN, ERROR.\",\n-                                \"displayName\": \"Log Level\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Log Level\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            }\n-                        },\n-                        \"sideEffectFree\": true,\n-                        \"supportedRelationships\": [\n                             {\n-                                \"description\": \"Where to route flow files after unsuccessfully enriching attributes because no data was found\",\n+                                \"description\": \"A FlowFile is routed to this relationship if the specified document does not exist in the Elasticsearch cluster. Note that if the processor has no incoming connections, flow files may still be sent to this relationship based on the processor properties and the results of the fetch operation.\",\n                                 \"name\": \"not found\"\n-                            },\n-                            {\n-                                \"description\": \"Where to route flow files after successfully enriching attributes with data provided by database\",\n-                                \"name\": \"found\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\",\n                             \"EVENT_DRIVEN\"\n                         ],\n                         \"supportsBatching\": true,\n-                        \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicProperties\": true,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsEventDriven\": true,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"ISP\",\n-                            \"enrich\",\n-                            \"ip\",\n-                            \"maxmind\"\n+                            \"elasticsearch\",\n+                            \"fetch\",\n+                            \"get\",\n+                            \"http\",\n+                            \"read\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.ISPEnrichIP\",\n-                        \"typeDescription\": \"Looks up ISP information for an IP address and adds the information to FlowFile attributes. The ISP data is provided as a MaxMind ISP database. (Note that this is NOT the same as the GeoLite database utilized by some geo enrichment tools). The attribute that contains the IP address to lookup is provided by the 'IP Address Attribute' property. If the name of the attribute provided is 'X', then the the attributes added by enrichment will take the form X.isp.<fieldName>\",\n+                        \"type\": \"org.apache.nifi.processors.elasticsearch.FetchElasticsearchHttp\",\n+                        \"typeDescription\": \"Retrieves a document from Elasticsearch using the specified connection properties and the identifier of the document to retrieve. Note that the full body of the document will be read into memory before being written to a Flow File for transfer.\",\n                         \"version\": \"1.27.0\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"The number of microseconds that the geo lookup took\",\n-                                \"name\": \"X.isp.lookup.micros\"\n-                            },\n-                            {\n-                                \"description\": \"The Autonomous System Number (ASN) identified for the IP address\",\n-                                \"name\": \"X.isp.asn\"\n-                            },\n-                            {\n-                                \"description\": \"The Organization Associated with the ASN identified\",\n-                                \"name\": \"X.isp.asn.organization\"\n+                                \"description\": \"The filename attribute is set to the document identifier\",\n+                                \"name\": \"filename\"\n                             },\n                             {\n-                                \"description\": \"The name of the ISP associated with the IP address provided\",\n-                                \"name\": \"X.isp.name\"\n+                                \"description\": \"The Elasticsearch index containing the document\",\n+                                \"name\": \"es.index\"\n                             },\n                             {\n-                                \"description\": \"The Organization associated with the IP address provided\",\n-                                \"name\": \"X.isp.organization\"\n+                                \"description\": \"The Elasticsearch document type\",\n+                                \"name\": \"es.type\"\n                             }\n                         ]\n                     },\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-enrich-nar\",\n+                        \"artifact\": \"nifi-elasticsearch-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"EVENT_DRIVEN\": 0,\n@@ -3715,439 +2485,270 @@\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n+                        \"deprecated\": true,\n+                        \"deprecationAlternatives\": [\n+                            \"org.apache.nifi.processors.elasticsearch.PutElasticsearchJson\"\n+                        ],\n+                        \"deprecationReason\": \"This processor is deprecated and may be removed in future releases.\",\n+                        \"dynamicProperties\": [\n+                            {\n+                                \"description\": \"Adds the specified property name/value as a query parameter in the Elasticsearch URL used for processing\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"name\": \"A URL query parameter\",\n+                                \"value\": \"The value to set it to\"\n+                            }\n+                        ],\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"DNS_QUERY_TYPE\": {\n-                                \"defaultValue\": \"TXT\",\n-                                \"description\": \"The DNS query type to be used by the processor (e.g. TXT, A)\",\n-                                \"displayName\": \"DNS Query Type\",\n+                            \"Character Set\": {\n+                                \"defaultValue\": \"UTF-8\",\n+                                \"description\": \"Specifies the character set of the document data.\",\n+                                \"displayName\": \"Character Set\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"DNS_QUERY_TYPE\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Character Set\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"DNS_RETRIES\": {\n-                                \"defaultValue\": \"1\",\n-                                \"description\": \"The number of attempts before giving up and moving on\",\n-                                \"displayName\": \"DNS Query Retries\",\n+                            \"Password\": {\n+                                \"description\": \"Password to access the Elasticsearch cluster\",\n+                                \"displayName\": \"Password\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Password\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n+                            },\n+                            \"SSL Context Service\": {\n+                                \"description\": \"The SSL Context Service used to provide client certificate information for TLS/SSL connections. This service only applies if the Elasticsearch endpoint(s) have been secured with TLS/SSL.\",\n+                                \"displayName\": \"SSL Context Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"DNS_RETRIES\",\n+                                \"name\": \"SSL Context Service\",\n+                                \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"Username\": {\n+                                \"description\": \"Username to access the Elasticsearch cluster\",\n+                                \"displayName\": \"Username\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Username\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"elasticsearch-http-connect-timeout\": {\n+                                \"defaultValue\": \"5 secs\",\n+                                \"description\": \"Max wait time for the connection to the Elasticsearch REST API.\",\n+                                \"displayName\": \"Connection Timeout\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"elasticsearch-http-connect-timeout\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"DNS_SERVER\": {\n-                                \"description\": \"A comma separated list of  DNS servers to be used. (Defaults to system wide if none is used)\",\n-                                \"displayName\": \"DNS Servers\",\n+                            \"elasticsearch-http-proxy-host\": {\n+                                \"description\": \"The fully qualified hostname or IP address of the proxy server\",\n+                                \"displayName\": \"Proxy Host\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"DNS_SERVER\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"elasticsearch-http-proxy-host\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"DNS_TIMEOUT\": {\n-                                \"defaultValue\": \"1500 ms\",\n-                                \"description\": \"The amount of time to wait until considering a query as failed\",\n-                                \"displayName\": \"DNS Query Timeout\",\n+                            \"elasticsearch-http-proxy-port\": {\n+                                \"description\": \"The port of the proxy server\",\n+                                \"displayName\": \"Proxy Port\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"DNS_TIMEOUT\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"elasticsearch-http-proxy-port\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"QUERY_INPUT\": {\n-                                \"description\": \"The value that should be used to populate the query\",\n-                                \"displayName\": \"Lookup value\",\n+                            \"elasticsearch-http-response-timeout\": {\n+                                \"defaultValue\": \"15 secs\",\n+                                \"description\": \"Max wait time for a response from the Elasticsearch REST API.\",\n+                                \"displayName\": \"Response Timeout\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"QUERY_INPUT\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"elasticsearch-http-response-timeout\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"QUERY_PARSER\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"Use a delimiter character or RegEx  to split the results into attributes\",\n-                                        \"displayName\": \"Split\",\n-                                        \"value\": \"Split\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Use a regular expression to split the results into attributes \",\n-                                        \"displayName\": \"RegEx\",\n-                                        \"value\": \"RegEx\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Do not split results\",\n-                                        \"displayName\": \"None\",\n-                                        \"value\": \"None\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"None\",\n-                                \"description\": \"The method used to slice the results into attribute groups\",\n-                                \"displayName\": \"Results Parser\",\n+                            \"elasticsearch-http-url\": {\n+                                \"description\": \"Elasticsearch URL which will be connected to, including scheme (http, e.g.), host, and port. The default port for the REST API is 9200.\",\n+                                \"displayName\": \"Elasticsearch URL\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"QUERY_PARSER\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"elasticsearch-http-url\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"QUERY_PARSER_INPUT\": {\n-                                \"description\": \"Choice between a splitter and regex matcher used to parse the results of the query into attribute groups.\\nNOTE: This is a multiline regular expression, therefore, the DFM should decide how to handle trailing new line characters.\",\n-                                \"displayName\": \"Parser RegEx\",\n+                            \"proxy-configuration-service\": {\n+                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests. If set, it supersedes proxy settings configured per component. Supported proxies: SOCKS, HTTP + AuthN In case of SOCKS, it is not guaranteed that the selected SOCKS Version will be used by the processor.\",\n+                                \"displayName\": \"Proxy Configuration Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"QUERY_PARSER_INPUT\",\n+                                \"name\": \"proxy-configuration-service\",\n                                 \"required\": false,\n-                                \"sensitive\": false\n-                            }\n-                        },\n-                        \"sideEffectFree\": true,\n-                        \"supportedRelationships\": [\n-                            {\n-                                \"description\": \"Where to route flow files if data enrichment query rendered no results\",\n-                                \"name\": \"not found\"\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.proxy.ProxyConfigurationService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n                             },\n-                            {\n-                                \"description\": \"Where to route flow files after successfully enriching attributes with data\",\n-                                \"name\": \"found\"\n-                            }\n-                        ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\",\n-                            \"EVENT_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": true,\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": true,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"dns\",\n-                            \"enrich\",\n-                            \"ip\"\n-                        ],\n-                        \"triggerSerially\": false,\n-                        \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.enrich.QueryDNS\",\n-                        \"typeDescription\": \"A powerful DNS query processor primary designed to enrich DataFlows with DNS based APIs (e.g. RBLs, ShadowServer's ASN lookup) but that can be also used to perform regular DNS lookups.\",\n-                        \"version\": \"1.27.0\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"The captured fields of the DNS query response for each of the records received\",\n-                                \"name\": \"enrich.dns.record*.group*\"\n-                            }\n-                        ]\n-                    },\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-enrich-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"e0c4461\"\n-                        },\n-                        \"defaultBulletinLevel\": \"WARN\",\n-                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": 1,\n-                            \"EVENT_DRIVEN\": 0,\n-                            \"TIMER_DRIVEN\": 1\n-                        },\n-                        \"defaultPenaltyDuration\": \"30 sec\",\n-                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"0 sec\"\n-                        },\n-                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n-                        \"defaultYieldDuration\": \"1 sec\",\n-                        \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_REQUIRED\",\n-                        \"primaryNodeOnly\": false,\n-                        \"propertyDescriptors\": {\n-                            \"BATCH_SIZE\": {\n-                                \"defaultValue\": \"25\",\n-                                \"description\": \"The number of incoming FlowFiles to process in a single execution of this processor. \",\n-                                \"displayName\": \"Batch Size\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"BATCH_SIZE\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"BULK_PROTOCOL\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"The evaluated input of each flowfile is enclosed within begin and end tags. Each row contains a delimited set of fields\",\n-                                        \"displayName\": \"Begin/End\",\n-                                        \"value\": \"Begin/End\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Queries are made without any particular dialect\",\n-                                        \"displayName\": \"None\",\n-                                        \"value\": \"None\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"None\",\n-                                \"description\": \"The protocol used to perform the bulk query. \",\n-                                \"displayName\": \"Bulk Protocol\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"BULK_PROTOCOL\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"KEY_GROUP\": {\n-                                \"description\": \"When performing a batched lookup, the following RegEx numbered capture group or Column number will be used to match the whois server response with the lookup field\",\n-                                \"displayName\": \"Key lookup group (multiline / batch)\",\n+                            \"proxy-password\": {\n+                                \"description\": \"Proxy Password\",\n+                                \"displayName\": \"Proxy Password\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"KEY_GROUP\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"proxy-password\",\n                                 \"required\": false,\n-                                \"sensitive\": false\n+                                \"sensitive\": true\n                             },\n-                            \"QUERY_INPUT\": {\n-                                \"description\": \"The value that should be used to populate the query\",\n-                                \"displayName\": \"Lookup value\",\n+                            \"proxy-username\": {\n+                                \"description\": \"Proxy Username\",\n+                                \"displayName\": \"Proxy Username\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"QUERY_INPUT\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"proxy-username\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"QUERY_PARSER\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"Use a delimiter character or RegEx  to split the results into attributes\",\n-                                        \"displayName\": \"Split\",\n-                                        \"value\": \"Split\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Use a regular expression to split the results into attributes \",\n-                                        \"displayName\": \"RegEx\",\n-                                        \"value\": \"RegEx\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Do not split results\",\n-                                        \"displayName\": \"None\",\n-                                        \"value\": \"None\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"None\",\n-                                \"description\": \"The method used to slice the results into attribute groups\",\n-                                \"displayName\": \"Results Parser\",\n+                            \"put-es-batch-size\": {\n+                                \"defaultValue\": \"100\",\n+                                \"description\": \"The preferred number of flow files to put to the database in a single transaction. Note that the contents of the flow files will be stored in memory until the bulk operation is performed. Also the results should be returned in the same order the flow files were received.\",\n+                                \"displayName\": \"Batch Size\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"QUERY_PARSER\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"put-es-batch-size\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"QUERY_PARSER_INPUT\": {\n-                                \"description\": \"Choice between a splitter and regex matcher used to parse the results of the query into attribute groups.\\nNOTE: This is a multiline regular expression, therefore, the DFM should decide how to handle trailing new line characters.\",\n-                                \"displayName\": \"Parser RegEx\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"QUERY_PARSER_INPUT\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"WHOIS_QUERY_TYPE\": {\n-                                \"description\": \"The Whois query type to be used by the processor (if used)\",\n-                                \"displayName\": \"Whois Query Type\",\n+                            \"put-es-id-attr\": {\n+                                \"description\": \"The name of the FlowFile attribute containing the identifier for the document. If the Index Operation is \\\"index\\\", this property may be left empty or evaluate to an empty value, in which case the document's identifier will be auto-generated by Elasticsearch. For all other Index Operations, the attribute must evaluate to a non-empty value.\",\n+                                \"displayName\": \"Identifier Attribute\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"WHOIS_QUERY_TYPE\",\n+                                \"name\": \"put-es-id-attr\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"WHOIS_SERVER\": {\n-                                \"description\": \"The Whois server to be used\",\n-                                \"displayName\": \"Whois Server\",\n+                            \"put-es-index\": {\n+                                \"description\": \"The name of the index to insert into\",\n+                                \"displayName\": \"Index\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"WHOIS_SERVER\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"put-es-index\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"WHOIS_SERVER_PORT\": {\n-                                \"defaultValue\": \"43\",\n-                                \"description\": \"The TCP port of the remote Whois server\",\n-                                \"displayName\": \"Whois Server Port\",\n+                            \"put-es-index-op\": {\n+                                \"defaultValue\": \"index\",\n+                                \"description\": \"The type of the operation used to index (create, index, update, upsert, delete)\",\n+                                \"displayName\": \"Index Operation\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"WHOIS_SERVER_PORT\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"put-es-index-op\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"WHOIS_TIMEOUT\": {\n-                                \"defaultValue\": \"1500 ms\",\n-                                \"description\": \"The amount of time to wait until considering a query as failed\",\n-                                \"displayName\": \"Whois Query Timeout\",\n+                            \"put-es-type\": {\n+                                \"description\": \"The type of this document (required by Elasticsearch versions < 7.0 for indexing and searching). This must be unset or '_doc' for Elasticsearch 7.0+.\",\n+                                \"displayName\": \"Type\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"WHOIS_TIMEOUT\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"put-es-type\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             }\n                         },\n-                        \"sideEffectFree\": true,\n+                        \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"Where to route flow files if data enrichment query rendered no results\",\n-                                \"name\": \"not found\"\n+                                \"description\": \"A FlowFile is routed to this relationship if the database cannot be updated but attempting the operation again may succeed\",\n+                                \"name\": \"retry\"\n                             },\n                             {\n-                                \"description\": \"Where to route flow files after successfully enriching attributes with data\",\n-                                \"name\": \"found\"\n+                                \"description\": \"All FlowFiles that are written to Elasticsearch are routed to this relationship\",\n+                                \"name\": \"success\"\n+                            },\n+                            {\n+                                \"description\": \"All FlowFiles that cannot be written to Elasticsearch are routed to this relationship\",\n+                                \"name\": \"failure\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\",\n                             \"EVENT_DRIVEN\"\n                         ],\n                         \"supportsBatching\": true,\n-                        \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicProperties\": true,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsEventDriven\": true,\n                         \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"enrich\",\n-                            \"ip\",\n-                            \"whois\"\n-                        ],\n-                        \"triggerSerially\": false,\n-                        \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.enrich.QueryWhois\",\n-                        \"typeDescription\": \"A powerful whois query processor primary designed to enrich DataFlows with whois based APIs (e.g. ShadowServer's ASN lookup) but that can be also used to perform regular whois lookups.\",\n-                        \"version\": \"1.27.0\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"The captured fields of the Whois query response for each of the records received\",\n-                                \"name\": \"enrich.dns.record*.group*\"\n-                            }\n-                        ]\n-                    }\n-                ],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"1.27.0\"\n-        },\n-        {\n-            \"artifact\": \"nifi-dropbox-services-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [\n-                    {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-dropbox-services-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"e0c4461\"\n-                        },\n-                        \"group\": \"org.apache.nifi\",\n-                        \"propertyDescriptors\": {\n-                            \"access-token\": {\n-                                \"description\": \"Access Token of the user's Dropbox app. See Additional Details for more information about Access Token generation.\",\n-                                \"displayName\": \"Access Token\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"access-token\",\n-                                \"required\": true,\n-                                \"sensitive\": true\n-                            },\n-                            \"app-key\": {\n-                                \"description\": \"App Key of the user's Dropbox app. See Additional Details for more information.\",\n-                                \"displayName\": \"App Key\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"app-key\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"app-secret\": {\n-                                \"description\": \"App Secret of the user's Dropbox app. See Additional Details for more information.\",\n-                                \"displayName\": \"App Secret\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"app-secret\",\n-                                \"required\": true,\n-                                \"sensitive\": true\n-                            },\n-                            \"refresh-token\": {\n-                                \"description\": \"Refresh Token of the user's Dropbox app. See Additional Details for more information about Refresh Token generation.\",\n-                                \"displayName\": \"Refresh Token\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"refresh-token\",\n-                                \"required\": true,\n-                                \"sensitive\": true\n-                            }\n-                        },\n-                        \"providedApiImplementations\": [\n+                        \"systemResourceConsiderations\": [\n                             {\n-                                \"artifact\": \"nifi-dropbox-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.dropbox.credentials.service.DropboxCredentialService\",\n-                                \"version\": \"1.27.0\"\n+                                \"description\": \"An instance of this component can cause high usage of this system resource.  Multiple instances or high concurrency settings may result a degradation of performance.\",\n+                                \"resource\": \"MEMORY\"\n                             }\n                         ],\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"credentials\",\n-                            \"dropbox\",\n-                            \"provider\"\n+                            \"delete\",\n+                            \"elasticsearch\",\n+                            \"http\",\n+                            \"insert\",\n+                            \"put\",\n+                            \"update\",\n+                            \"upsert\",\n+                            \"write\"\n                         ],\n-                        \"type\": \"org.apache.nifi.services.dropbox.StandardDropboxCredentialService\",\n-                        \"typeDescription\": \"Defines credentials for Dropbox processors.\",\n+                        \"triggerSerially\": false,\n+                        \"triggerWhenAnyDestinationAvailable\": false,\n+                        \"triggerWhenEmpty\": false,\n+                        \"type\": \"org.apache.nifi.processors.elasticsearch.PutElasticsearchHttp\",\n+                        \"typeDescription\": \"Writes the contents of a FlowFile to Elasticsearch, using the specified parameters such as the index to insert into and the type of the document.\",\n                         \"version\": \"1.27.0\"\n-                    }\n-                ],\n-                \"processors\": [],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"1.27.0\"\n-        },\n-        {\n-            \"artifact\": \"nifi-update-attribute-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [],\n-                \"processors\": [\n+                    },\n                     {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-update-attribute-nar\",\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-elasticsearch-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"EVENT_DRIVEN\": 0,\n@@ -4156,1878 +2757,1464 @@\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n+                        \"deprecated\": true,\n+                        \"deprecationAlternatives\": [\n+                            \"org.apache.nifi.processors.elasticsearch.PutElasticsearchRecord\"\n+                        ],\n+                        \"deprecationReason\": \"This processor is deprecated and may be removed in future releases.\",\n                         \"dynamicProperties\": [\n                             {\n-                                \"description\": \"Updates a FlowFile attribute specified by the Dynamic Property's key with the value specified by the Dynamic Property's value\",\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"name\": \"A FlowFile attribute to update\",\n+                                \"description\": \"Adds the specified property name/value as a query parameter in the Elasticsearch URL used for processing\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"name\": \"A URL query parameter\",\n                                 \"value\": \"The value to set it to\"\n                             }\n                         ],\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Delete Attributes Expression\": {\n-                                \"description\": \"Regular expression for attributes to be deleted from FlowFiles.  Existing attributes that match will be deleted regardless of whether they are updated by this processor.\",\n-                                \"displayName\": \"Delete Attributes Expression\",\n+                            \"Character Set\": {\n+                                \"defaultValue\": \"UTF-8\",\n+                                \"description\": \"Specifies the character set of the document data.\",\n+                                \"displayName\": \"Character Set\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Delete Attributes Expression\",\n-                                \"required\": false,\n+                                \"name\": \"Character Set\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Stateful Variables Initial Value\": {\n-                                \"description\": \"If using state to set/reference variables then this value is used to set the initial value of the stateful variable. This will only be used in the @OnScheduled method when state does not contain a value for the variable. This is required if running statefully but can be empty if needed.\",\n-                                \"displayName\": \"Stateful Variables Initial Value\",\n+                            \"Date Format\": {\n+                                \"description\": \"Specifies the format to use when reading/writing Date fields. If not specified, the default format 'yyyy-MM-dd' is used. If specified, the value must match the Java Simple Date Format (for example, MM/dd/yyyy for a two-digit month, followed by a two-digit day, followed by a four-digit year, all separated by '/' characters, as in 01/25/2017).\",\n+                                \"displayName\": \"Date Format\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Stateful Variables Initial Value\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Date Format\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Store State\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Do not store state\",\n-                                        \"value\": \"Do not store state\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Store state locally\",\n-                                        \"value\": \"Store state locally\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"Do not store state\",\n-                                \"description\": \"Select whether or not state will be stored. Selecting 'Stateless' will offer the default functionality of purely updating the attributes on a FlowFile in a stateless manner. Selecting a stateful option will not only store the attributes on the FlowFile but also in the Processors state. See the 'Stateful Usage' topic of the 'Additional Details' section of this processor's documentation for more information\",\n-                                \"displayName\": \"Store State\",\n+                            \"Password\": {\n+                                \"description\": \"Password to access the Elasticsearch cluster\",\n+                                \"displayName\": \"Password\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Store State\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Password\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n                             },\n-                            \"canonical-value-lookup-cache-size\": {\n-                                \"defaultValue\": \"100\",\n-                                \"description\": \"Specifies how many canonical lookup values should be stored in the cache\",\n-                                \"displayName\": \"Cache Value Lookup Cache Size\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"canonical-value-lookup-cache-size\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            }\n-                        },\n-                        \"sideEffectFree\": true,\n-                        \"stateful\": {\n-                            \"description\": \"Gives the option to store values not only on the FlowFile but as stateful variables to be referenced in a recursive manner.\",\n-                            \"scopes\": [\n-                                \"LOCAL\"\n-                            ]\n-                        },\n-                        \"supportedRelationships\": [\n-                            {\n-                                \"description\": \"All successful FlowFiles are routed to this relationship\",\n-                                \"name\": \"success\"\n-                            }\n-                        ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\",\n-                            \"EVENT_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": true,\n-                        \"supportsDynamicProperties\": true,\n-                        \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": true,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"Attribute Expression Language\",\n-                            \"attributes\",\n-                            \"delete\",\n-                            \"modification\",\n-                            \"state\",\n-                            \"update\"\n-                        ],\n-                        \"triggerSerially\": false,\n-                        \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.attributes.UpdateAttribute\",\n-                        \"typeDescription\": \"Updates the Attributes for a FlowFile by using the Attribute Expression Language and/or deletes the attributes based on a regular expression\",\n-                        \"version\": \"1.27.0\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"This processor may write or remove zero or more attributes as described in additional details\",\n-                                \"name\": \"See additional details\"\n-                            }\n-                        ]\n-                    }\n-                ],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"1.27.0\"\n-        },\n-        {\n-            \"artifact\": \"nifi-airtable-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [],\n-                \"processors\": [\n-                    {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-airtable-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"e0c4461\"\n-                        },\n-                        \"defaultBulletinLevel\": \"WARN\",\n-                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": 1,\n-                            \"TIMER_DRIVEN\": 1\n-                        },\n-                        \"defaultPenaltyDuration\": \"30 sec\",\n-                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"1 min\"\n-                        },\n-                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n-                        \"defaultYieldDuration\": \"15 sec\",\n-                        \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n-                        \"primaryNodeOnly\": true,\n-                        \"propertyDescriptors\": {\n-                            \"api-key\": {\n-                                \"description\": \"The REST API key to use in queries. Should be generated on Airtable's account page.\",\n-                                \"displayName\": \"API Key\",\n+                            \"SSL Context Service\": {\n+                                \"description\": \"The SSL Context Service used to provide client certificate information for TLS/SSL connections. This service only applies if the Elasticsearch endpoint(s) have been secured with TLS/SSL.\",\n+                                \"displayName\": \"SSL Context Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"api-key\",\n-                                \"required\": true,\n-                                \"sensitive\": true\n+                                \"name\": \"SSL Context Service\",\n+                                \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n                             },\n-                            \"api-url\": {\n-                                \"defaultValue\": \"https://api.airtable.com/v0\",\n-                                \"description\": \"The URL for the Airtable REST API including the domain and the path to the API (e.g. https://api.airtable.com/v0).\",\n-                                \"displayName\": \"API URL\",\n+                            \"Time Format\": {\n+                                \"description\": \"Specifies the format to use when reading/writing Time fields. If not specified, the default format 'HH:mm:ss' is used. If specified, the value must match the Java Simple Date Format (for example, HH:mm:ss for a two-digit hour in 24-hour format, followed by a two-digit minute, followed by a two-digit second, all separated by ':' characters, as in 18:04:15).\",\n+                                \"displayName\": \"Time Format\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"api-url\",\n-                                \"required\": true,\n+                                \"name\": \"Time Format\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"base-id\": {\n-                                \"description\": \"The ID of the Airtable base to be queried.\",\n-                                \"displayName\": \"Base ID\",\n+                            \"Timestamp Format\": {\n+                                \"description\": \"Specifies the format to use when reading/writing Timestamp fields. If not specified, the default format 'yyyy-MM-dd HH:mm:ss' is used. If specified, the value must match the Java Simple Date Format (for example, MM/dd/yyyy HH:mm:ss for a two-digit month, followed by a two-digit day, followed by a four-digit year, all separated by '/' characters; and then followed by a two-digit hour in 24-hour format, followed by a two-digit minute, followed by a two-digit second, all separated by ':' characters, as in 01/25/2017 18:04:15).\",\n+                                \"displayName\": \"Timestamp Format\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"base-id\",\n-                                \"required\": true,\n+                                \"name\": \"Timestamp Format\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"custom-filter\": {\n-                                \"description\": \"Filter records by Airtable's formulas.\",\n-                                \"displayName\": \"Custom Filter\",\n+                            \"Username\": {\n+                                \"description\": \"Username to access the Elasticsearch cluster\",\n+                                \"displayName\": \"Username\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"custom-filter\",\n+                                \"name\": \"Username\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"fields\": {\n-                                \"description\": \"Comma-separated list of fields to query from the table. Both the field's name and ID can be used.\",\n-                                \"displayName\": \"Fields\",\n+                            \"elasticsearch-http-connect-timeout\": {\n+                                \"defaultValue\": \"5 secs\",\n+                                \"description\": \"Max wait time for the connection to the Elasticsearch REST API.\",\n+                                \"displayName\": \"Connection Timeout\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"fields\",\n-                                \"required\": false,\n+                                \"name\": \"elasticsearch-http-connect-timeout\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"max-records-per-flowfile\": {\n-                                \"description\": \"The maximum number of result records that will be included in a single FlowFile. This will allow you to break up very large result sets into multiple FlowFiles. If no value specified, then all records are returned in a single FlowFile.\",\n-                                \"displayName\": \"Max Records Per FlowFile\",\n+                            \"elasticsearch-http-proxy-host\": {\n+                                \"description\": \"The fully qualified hostname or IP address of the proxy server\",\n+                                \"displayName\": \"Proxy Host\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"max-records-per-flowfile\",\n+                                \"name\": \"elasticsearch-http-proxy-host\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"query-page-size\": {\n-                                \"description\": \"Number of records to be fetched in a page. Should be between 1 and 100 inclusively.\",\n-                                \"displayName\": \"Query Page Size\",\n+                            \"elasticsearch-http-proxy-port\": {\n+                                \"description\": \"The port of the proxy server\",\n+                                \"displayName\": \"Proxy Port\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"query-page-size\",\n+                                \"name\": \"elasticsearch-http-proxy-port\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"query-time-window-lag\": {\n-                                \"defaultValue\": \"3 s\",\n-                                \"description\": \"The amount of lag to be applied to the query time window's end point. Set this property to avoid missing records when the clock of your local machines and Airtable servers' clock are not in sync. Must be greater than or equal to 1 second.\",\n-                                \"displayName\": \"Query Time Window Lag\",\n+                            \"elasticsearch-http-response-timeout\": {\n+                                \"defaultValue\": \"15 secs\",\n+                                \"description\": \"Max wait time for a response from the Elasticsearch REST API.\",\n+                                \"displayName\": \"Response Timeout\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"query-time-window-lag\",\n+                                \"name\": \"elasticsearch-http-response-timeout\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"table-id\": {\n-                                \"description\": \"The name or the ID of the Airtable table to be queried.\",\n-                                \"displayName\": \"Table ID\",\n+                            \"elasticsearch-http-url\": {\n+                                \"description\": \"Elasticsearch URL which will be connected to, including scheme (http, e.g.), host, and port. The default port for the REST API is 9200.\",\n+                                \"displayName\": \"Elasticsearch URL\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"table-id\",\n+                                \"name\": \"elasticsearch-http-url\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"web-client-service-provider\": {\n-                                \"description\": \"Web Client Service Provider to use for Airtable REST API requests\",\n-                                \"displayName\": \"Web Client Service Provider\",\n+                            \"proxy-configuration-service\": {\n+                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests. If set, it supersedes proxy settings configured per component. Supported proxies: SOCKS, HTTP + AuthN In case of SOCKS, it is not guaranteed that the selected SOCKS Version will be used by the processor.\",\n+                                \"displayName\": \"Proxy Configuration Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"web-client-service-provider\",\n-                                \"required\": true,\n+                                \"name\": \"proxy-configuration-service\",\n+                                \"required\": false,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n                                     \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.web.client.provider.api.WebClientServiceProvider\",\n+                                    \"type\": \"org.apache.nifi.proxy.ProxyConfigurationService\",\n                                     \"version\": \"1.27.0\"\n                                 }\n-                            }\n-                        },\n-                        \"sideEffectFree\": false,\n-                        \"stateful\": {\n-                            \"description\": \"The last successful query's time is stored in order to enable incremental loading. The initial query returns all the records in the table and each subsequent query filters the records by their last modified time. In other words, if a record is updated after the last successful query only the updated records will be returned in the next query. State is stored across the cluster, so this Processor can run only on the Primary Node and if a new Primary Node is selected, the new node can pick up where the previous one left off without duplicating the data.\",\n-                            \"scopes\": [\n-                                \"CLUSTER\"\n-                            ]\n-                        },\n-                        \"supportedRelationships\": [\n-                            {\n-                                \"description\": \"For FlowFiles created as a result of a successful query.\",\n-                                \"name\": \"success\"\n-                            }\n-                        ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": false,\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": false,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"airtable\",\n-                            \"database\",\n-                            \"query\"\n-                        ],\n-                        \"triggerSerially\": true,\n-                        \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": true,\n-                        \"type\": \"org.apache.nifi.processors.airtable.QueryAirtableTable\",\n-                        \"typeDescription\": \"Query records from an Airtable table. Records are incrementally retrieved based on the last modified time of the records. Records can also be further filtered by setting the 'Custom Filter' property which supports the formulas provided by the Airtable API. This processor is intended to be run on the Primary Node only.\",\n-                        \"version\": \"1.27.0\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"Sets the number of records in the FlowFile.\",\n-                                \"name\": \"record.count\"\n-                            },\n-                            {\n-                                \"description\": \"If 'Max Records Per FlowFile' is set then all FlowFiles from the same query result set will have the same value for the fragment.identifier attribute. This can then be used to correlate the results.\",\n-                                \"name\": \"fragment.identifier\"\n-                            },\n-                            {\n-                                \"description\": \"If 'Max Records Per FlowFile' is set then this is the total number of FlowFiles produced by a single ResultSet. This can be used in conjunction with the fragment.identifier attribute in order to know how many FlowFiles belonged to the same incoming ResultSet.\",\n-                                \"name\": \"fragment.count\"\n                             },\n-                            {\n-                                \"description\": \"If 'Max Records Per FlowFile' is set then the position of this FlowFile in the list of outgoing FlowFiles that were all derived from the same result set FlowFile. This can be used in conjunction with the fragment.identifier attribute to know which FlowFiles originated from the same query result set and in what order FlowFiles were produced\",\n-                                \"name\": \"fragment.index\"\n-                            }\n-                        ]\n-                    }\n-                ],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"1.27.0\"\n-        },\n-        {\n-            \"artifact\": \"nifi-mqtt-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [],\n-                \"processors\": [\n-                    {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-mqtt-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"e0c4461\"\n-                        },\n-                        \"defaultBulletinLevel\": \"WARN\",\n-                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": 1,\n-                            \"TIMER_DRIVEN\": 1\n-                        },\n-                        \"defaultPenaltyDuration\": \"30 sec\",\n-                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"0 sec\"\n-                        },\n-                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n-                        \"defaultYieldDuration\": \"1 sec\",\n-                        \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n-                        \"primaryNodeOnly\": false,\n-                        \"propertyDescriptors\": {\n-                            \"Broker URI\": {\n-                                \"description\": \"The URI(s) to use to connect to the MQTT broker (e.g., tcp://localhost:1883). The 'tcp', 'ssl', 'ws' and 'wss' schemes are supported. In order to use 'ssl', the SSL Context Service property must be set. When a comma-separated URI list is set (e.g., tcp://localhost:1883,tcp://localhost:1884), the processor will use a round-robin algorithm to connect to the brokers on connection failure.\",\n-                                \"displayName\": \"Broker URI\",\n+                            \"proxy-password\": {\n+                                \"description\": \"Proxy Password\",\n+                                \"displayName\": \"Proxy Password\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Broker URI\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n+                                \"name\": \"proxy-password\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n                             },\n-                            \"Client ID\": {\n-                                \"description\": \"MQTT client ID to use. If not set, a UUID will be generated.\",\n-                                \"displayName\": \"Client ID\",\n+                            \"proxy-username\": {\n+                                \"description\": \"Proxy Username\",\n+                                \"displayName\": \"Proxy Username\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Client ID\",\n+                                \"name\": \"proxy-username\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Connection Timeout (seconds)\": {\n-                                \"defaultValue\": \"30\",\n-                                \"description\": \"Maximum time interval the client will wait for the network connection to the MQTT server to be established. The default timeout is 30 seconds. A value of 0 disables timeout processing meaning the client will wait until the network connection is made successfully or fails.\",\n-                                \"displayName\": \"Connection Timeout (seconds)\",\n+                            \"put-es-record-at-timestamp\": {\n+                                \"description\": \"The value to use as the @timestamp field (required for Elasticsearch Data Streams)\",\n+                                \"displayName\": \"@timestamp Value\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Connection Timeout (seconds)\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"put-es-record-at-timestamp\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Group ID\": {\n-                                \"description\": \"MQTT consumer group ID to use. If group ID not set, client will connect as individual consumer.\",\n-                                \"displayName\": \"Group ID\",\n+                            \"put-es-record-at-timestamp-path\": {\n+                                \"description\": \"A RecordPath pointing to a field in the record(s) that contains the @timestamp for the document. If left blank the @timestamp will be determined using the main @timestamp property\",\n+                                \"displayName\": \"@timestamp Record Path\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Group ID\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"put-es-record-at-timestamp-path\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Keep Alive Interval (seconds)\": {\n-                                \"defaultValue\": \"60\",\n-                                \"description\": \"Defines the maximum time interval between messages sent or received. It enables the client to detect if the server is no longer available, without having to wait for the TCP/IP timeout. The client will ensure that at least one message travels across the network within each keep alive period. In the absence of a data-related message during the time period, the client sends a very small \\\"ping\\\" message, which the server will acknowledge. A value of 0 disables keepalive processing in the client.\",\n-                                \"displayName\": \"Keep Alive Interval (seconds)\",\n+                            \"put-es-record-id-path\": {\n+                                \"description\": \"A RecordPath pointing to a field in the record(s) that contains the identifier for the document. If the Index Operation is \\\"index\\\" or \\\"create\\\", this property may be left empty or evaluate to an empty value, in which case the document's identifier will be auto-generated by Elasticsearch. For all other Index Operations, the field's value must be non-empty.\",\n+                                \"displayName\": \"Identifier Record Path\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Keep Alive Interval (seconds)\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"put-es-record-id-path\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Last Will Message\": {\n-                                \"description\": \"The message to send as the client's Last Will.\",\n-                                \"displayName\": \"Last Will Message\",\n+                            \"put-es-record-index\": {\n+                                \"description\": \"The name of the index to insert into\",\n+                                \"displayName\": \"Index\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Last Will Message\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"put-es-record-index\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Last Will QoS Level\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"Best effort delivery. A message won\\u2019t be acknowledged by the receiver or stored and redelivered by the sender. This is often called \\u201cfire and forget\\u201d and provides the same guarantee as the underlying TCP protocol.\",\n-                                        \"displayName\": \"0 - At most once\",\n-                                        \"value\": \"0\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Guarantees that a message will be delivered at least once to the receiver. The message can also be delivered more than once\",\n-                                        \"displayName\": \"1 - At least once\",\n-                                        \"value\": \"1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Guarantees that each message is received only once by the counterpart. It is the safest and also the slowest quality of service level. The guarantee is provided by two round-trip flows between sender and receiver.\",\n-                                        \"displayName\": \"2 - Exactly once\",\n-                                        \"value\": \"2\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"0\",\n-                                \"dependencies\": [\n-                                    {\n-                                        \"propertyDisplayName\": \"Last Will Message\",\n-                                        \"propertyName\": \"Last Will Message\"\n-                                    }\n-                                ],\n-                                \"description\": \"QoS level to be used when publishing the Last Will Message.\",\n-                                \"displayName\": \"Last Will QoS Level\",\n+                            \"put-es-record-index-op\": {\n+                                \"defaultValue\": \"index\",\n+                                \"description\": \"The type of the operation used to index (create, index, update, upsert, delete)\",\n+                                \"displayName\": \"Index Operation\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Last Will QoS Level\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"put-es-record-index-op\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Last Will Retain\": {\n+                            \"put-es-record-log-all-errors\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"true\",\n                                         \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"false\",\n                                         \"value\": \"false\"\n                                     }\n                                 ],\n                                 \"defaultValue\": \"false\",\n-                                \"dependencies\": [\n-                                    {\n-                                        \"propertyDisplayName\": \"Last Will Message\",\n-                                        \"propertyName\": \"Last Will Message\"\n-                                    }\n-                                ],\n-                                \"description\": \"Whether to retain the client's Last Will.\",\n-                                \"displayName\": \"Last Will Retain\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Last Will Retain\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Last Will Topic\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"propertyDisplayName\": \"Last Will Message\",\n-                                        \"propertyName\": \"Last Will Message\"\n-                                    }\n-                                ],\n-                                \"description\": \"The topic to send the client's Last Will to.\",\n-                                \"displayName\": \"Last Will Topic\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Last Will Topic\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"MQTT Specification Version\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"Start with v3.1.1 and fallback to v3.1.0 if not supported by a broker\",\n-                                        \"displayName\": \"v3 AUTO\",\n-                                        \"value\": \"0\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"v5.0\",\n-                                        \"value\": \"5\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"v3.1.1\",\n-                                        \"value\": \"4\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"v3.1.0\",\n-                                        \"value\": \"3\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"0\",\n-                                \"description\": \"The MQTT specification version when connecting with the broker. See the allowable value descriptions for more details.\",\n-                                \"displayName\": \"MQTT Specification Version\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"MQTT Specification Version\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Max Queue Size\": {\n-                                \"description\": \"The MQTT messages are always being sent to subscribers on a topic regardless of how frequently the processor is scheduled to run. If the 'Run Schedule' is significantly behind the rate at which the messages are arriving to this processor, then a back up can occur in the internal queue of this processor. This property specifies the maximum number of messages this processor will hold in memory at one time in the internal queue. This data would be lost in case of a NiFi restart.\",\n-                                \"displayName\": \"Max Queue Size\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Max Queue Size\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Password\": {\n-                                \"description\": \"Password to use when connecting to the broker\",\n-                                \"displayName\": \"Password\",\n+                                \"description\": \"After sending a batch of records, Elasticsearch will report if individual records failed to insert. As an example, this can happen if the record doesn't match the mapping for the index it is being inserted into. If this is set to true, the processor will log the failure reason for the every failed record. When set to false only the first error in the batch will be logged.\",\n+                                \"displayName\": \"Log all errors in batch\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Password\",\n+                                \"name\": \"put-es-record-log-all-errors\",\n                                 \"required\": false,\n-                                \"sensitive\": true\n+                                \"sensitive\": false\n                             },\n-                            \"Quality of Service(QoS)\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"Best effort delivery. A message won\\u2019t be acknowledged by the receiver or stored and redelivered by the sender. This is often called \\u201cfire and forget\\u201d and provides the same guarantee as the underlying TCP protocol.\",\n-                                        \"displayName\": \"0 - At most once\",\n-                                        \"value\": \"0\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Guarantees that a message will be delivered at least once to the receiver. The message can also be delivered more than once\",\n-                                        \"displayName\": \"1 - At least once\",\n-                                        \"value\": \"1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Guarantees that each message is received only once by the counterpart. It is the safest and also the slowest quality of service level. The guarantee is provided by two round-trip flows between sender and receiver.\",\n-                                        \"displayName\": \"2 - Exactly once\",\n-                                        \"value\": \"2\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"0\",\n-                                \"description\": \"The Quality of Service (QoS) to receive the message with. Accepts values '0', '1' or '2'; '0' for 'at most once', '1' for 'at least once', '2' for 'exactly once'.\",\n-                                \"displayName\": \"Quality of Service (QoS)\",\n+                            \"put-es-record-record-reader\": {\n+                                \"description\": \"Specifies the Controller Service to use for parsing incoming data and determining the data's schema.\",\n+                                \"displayName\": \"Record Reader\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Quality of Service(QoS)\",\n+                                \"name\": \"put-es-record-record-reader\",\n                                 \"required\": true,\n-                                \"sensitive\": false\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n                             },\n-                            \"SSL Context Service\": {\n-                                \"description\": \"The SSL Context Service used to provide client certificate information for TLS/SSL connections.\",\n-                                \"displayName\": \"SSL Context Service\",\n+                            \"put-es-record-record-writer\": {\n+                                \"description\": \"After sending a batch of records, Elasticsearch will report if individual records failed to insert. As an example, this can happen if the record doesn't match the mappingfor the index it is being inserted into. This property specifies the Controller Service to use for writing out those individual records sent to 'failure'. If this is not set, then the whole FlowFile will be routed to failure (including any records which may have been inserted successfully). Note that this will only be used if Elasticsearch reports that individual records failed and that in the event that the entire FlowFile fails (e.g. in the event ES is down), the FF will be routed to failure without being interpreted by this record writer. If there is an error while attempting to route the failures, the entire FlowFile will be routed to Failure. Also if every record failed individually, the entire FlowFile will be routed to Failure without being parsed by the writer.\",\n+                                \"displayName\": \"Record Writer\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"SSL Context Service\",\n+                                \"name\": \"put-es-record-record-writer\",\n                                 \"required\": false,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n                                     \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n+                                    \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             },\n-                            \"Session Expiry Interval\": {\n-                                \"defaultValue\": \"24 hrs\",\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"5\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"MQTT Specification Version\",\n-                                        \"propertyName\": \"MQTT Specification Version\"\n-                                    },\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"false\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Session state\",\n-                                        \"propertyName\": \"Session state\"\n-                                    }\n-                                ],\n-                                \"description\": \"After this interval the broker will expire the client and clear the session state.\",\n-                                \"displayName\": \"Session Expiry Interval\",\n+                            \"put-es-record-type\": {\n+                                \"description\": \"The type of this document (required by Elasticsearch versions < 7.0 for indexing and searching). This must be unset or '_doc' for Elasticsearch 7.0+.\",\n+                                \"displayName\": \"Type\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Session Expiry Interval\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"put-es-record-type\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Session state\": {\n+                            \"suppress-nulls\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Client and Server discard any previous session and start a new one. This session lasts as long as the network connection. State data associated with this session is not reused in any subsequent session\",\n-                                        \"displayName\": \"Clean Session\",\n-                                        \"value\": \"true\"\n+                                        \"description\": \"Fields that are missing (present in the schema but not in the record), or that have a value of null, will be written out as a null value\",\n+                                        \"displayName\": \"Never Suppress\",\n+                                        \"value\": \"never-suppress\"\n                                     },\n                                     {\n-                                        \"description\": \"Server resumes communications with the client based on state from the current session (as identified by the ClientID). The client and server store the session after the client and server are disconnected. After the disconnection of a session that was not a clean session, the server stores further QoS 1 and QoS 2 messages that match any subscriptions that the client had at the time of disconnection as part of the session state\",\n-                                        \"displayName\": \"Resume Session\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"true\",\n-                                \"description\": \"Whether to start a fresh or resume previous flows. See the allowable value descriptions for more details.\",\n-                                \"displayName\": \"Session state\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Session state\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Topic Filter\": {\n-                                \"description\": \"The MQTT topic filter to designate the topics to subscribe to.\",\n-                                \"displayName\": \"Topic Filter\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Topic Filter\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Username\": {\n-                                \"description\": \"Username to use when connecting to the broker\",\n-                                \"displayName\": \"Username\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Username\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"add-attributes-as-fields\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"description\": \"Fields that are missing (present in the schema but not in the record), or that have a value of null, will not be written out\",\n+                                        \"displayName\": \"Always Suppress\",\n+                                        \"value\": \"always-suppress\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"true\",\n-                                \"dependencies\": [\n-                                    {\n-                                        \"propertyDisplayName\": \"Record Reader\",\n-                                        \"propertyName\": \"record-reader\"\n+                                        \"description\": \"When a field has a value of null, it will be written out. However, if a field is defined in the schema and not present in the record, the field will not be written out.\",\n+                                        \"displayName\": \"Suppress Missing Values\",\n+                                        \"value\": \"suppress-missing\"\n                                     }\n                                 ],\n-                                \"description\": \"If setting this property to true, default fields are going to be added in each record: _topic, _qos, _isDuplicate, _isRetained.\",\n-                                \"displayName\": \"Add attributes as fields\",\n+                                \"defaultValue\": \"never-suppress\",\n+                                \"description\": \"Specifies how the writer should handle a null field\",\n+                                \"displayName\": \"Suppress Null Values\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"add-attributes-as-fields\",\n+                                \"name\": \"suppress-nulls\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n-                            },\n-                            \"message-demarcator\": {\n-                                \"description\": \"With this property, you have an option to output FlowFiles which contains multiple messages. This property allows you to provide a string (interpreted as UTF-8) to use for demarcating apart multiple messages. This is an optional property ; if not provided, and if not defining a Record Reader/Writer, each message received will result in a single FlowFile. To enter special character such as 'new line' use CTRL+Enter or Shift+Enter depending on the OS.\",\n-                                \"displayName\": \"Message Demarcator\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"message-demarcator\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"record-reader\": {\n-                                \"description\": \"The Record Reader to use for parsing received MQTT Messages into Records.\",\n-                                \"displayName\": \"Record Reader\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"record-reader\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            },\n-                            \"record-writer\": {\n-                                \"description\": \"The Record Writer to use for serializing Records before writing them to a FlowFile.\",\n-                                \"displayName\": \"Record Writer\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"record-writer\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n                             }\n                         },\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.processors.mqtt.PublishMQTT\"\n-                        ],\n                         \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"If a message cannot be parsed using the configured Record Reader, the contents of the message will be routed to this Relationship as its own individual FlowFile.\",\n-                                \"name\": \"parse.failure\"\n+                                \"description\": \"A FlowFile is routed to this relationship if the database cannot be updated but attempting the operation again may succeed\",\n+                                \"name\": \"retry\"\n                             },\n                             {\n-                                \"description\": \"The MQTT message output\",\n-                                \"name\": \"Message\"\n+                                \"description\": \"All FlowFiles that are written to Elasticsearch are routed to this relationship\",\n+                                \"name\": \"success\"\n+                            },\n+                            {\n+                                \"description\": \"All FlowFiles that cannot be written to Elasticsearch are routed to this relationship\",\n+                                \"name\": \"failure\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n+                            \"CRON_DRIVEN\",\n+                            \"EVENT_DRIVEN\"\n                         ],\n                         \"supportsBatching\": false,\n-                        \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicProperties\": true,\n                         \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": false,\n+                        \"supportsEventDriven\": true,\n                         \"supportsSensitiveDynamicProperties\": false,\n-                        \"systemResourceConsiderations\": [\n-                            {\n-                                \"description\": \"The 'Max Queue Size' specifies the maximum number of messages that can be hold in memory by NiFi by a single instance of this processor. A high value for this property could represent a lot of data being stored in memory.\",\n-                                \"resource\": \"MEMORY\"\n-                            }\n-                        ],\n                         \"tags\": [\n-                            \"IOT\",\n-                            \"MQTT\",\n-                            \"consume\",\n-                            \"listen\",\n-                            \"subscribe\"\n+                            \"delete\",\n+                            \"elasticsearch\",\n+                            \"http\",\n+                            \"insert\",\n+                            \"put\",\n+                            \"record\",\n+                            \"update\",\n+                            \"upsert\",\n+                            \"write\"\n                         ],\n-                        \"triggerSerially\": true,\n+                        \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.mqtt.ConsumeMQTT\",\n-                        \"typeDescription\": \"Subscribes to a topic and receives messages from an MQTT broker\",\n+                        \"type\": \"org.apache.nifi.processors.elasticsearch.PutElasticsearchHttpRecord\",\n+                        \"typeDescription\": \"Writes the records from a FlowFile into to Elasticsearch, using the specified parameters such as the index to insert into and the type of the document, as well as the operation type (index, upsert, delete, etc.). Note: The Bulk API is used to send the records. This means that the entire contents of the incoming flow file are read into memory, and each record is transformed into a JSON document which is added to a single HTTP request body. For very large flow files (files with a large number of records, e.g.), this could cause memory usage issues.\",\n                         \"version\": \"1.27.0\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"The number of records received\",\n+                                \"description\": \"The number of records in an outgoing FlowFile. This is only populated on the 'success' relationship.\",\n                                 \"name\": \"record.count\"\n                             },\n                             {\n-                                \"description\": \"MQTT broker that was the message source\",\n-                                \"name\": \"mqtt.broker\"\n-                            },\n-                            {\n-                                \"description\": \"MQTT topic on which message was received\",\n-                                \"name\": \"mqtt.topic\"\n-                            },\n-                            {\n-                                \"description\": \"The quality of service for this message.\",\n-                                \"name\": \"mqtt.qos\"\n-                            },\n-                            {\n-                                \"description\": \"Whether or not this message might be a duplicate of one which has already been received.\",\n-                                \"name\": \"mqtt.isDuplicate\"\n-                            },\n-                            {\n-                                \"description\": \"Whether or not this message was from a current publisher, or was \\\"retained\\\" by the server as the last message published on the topic.\",\n-                                \"name\": \"mqtt.isRetained\"\n+                                \"description\": \"The number of records found by Elasticsearch to have errors. This is only populated on the 'failure' relationship.\",\n+                                \"name\": \"failure.count\"\n                             }\n                         ]\n                     },\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-mqtt-nar\",\n+                        \"artifact\": \"nifi-elasticsearch-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n+                            \"EVENT_DRIVEN\": 0,\n                             \"TIMER_DRIVEN\": 1\n                         },\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n+                        \"deprecated\": true,\n+                        \"deprecationAlternatives\": [\n+                            \"org.apache.nifi.processors.elasticsearch.PaginatedJsonQueryElasticsearch\"\n+                        ],\n+                        \"deprecationReason\": \"This processor is deprecated and may be removed in future releases.\",\n+                        \"dynamicProperties\": [\n+                            {\n+                                \"description\": \"Adds the specified property name/value as a query parameter in the Elasticsearch URL used for processing\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"name\": \"A URL query parameter\",\n+                                \"value\": \"The value to set it to\"\n+                            }\n+                        ],\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_REQUIRED\",\n+                        \"inputRequirement\": \"INPUT_ALLOWED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Broker URI\": {\n-                                \"description\": \"The URI(s) to use to connect to the MQTT broker (e.g., tcp://localhost:1883). The 'tcp', 'ssl', 'ws' and 'wss' schemes are supported. In order to use 'ssl', the SSL Context Service property must be set. When a comma-separated URI list is set (e.g., tcp://localhost:1883,tcp://localhost:1884), the processor will use a round-robin algorithm to connect to the brokers on connection failure.\",\n-                                \"displayName\": \"Broker URI\",\n+                            \"Character Set\": {\n+                                \"defaultValue\": \"UTF-8\",\n+                                \"description\": \"Specifies the character set of the document data.\",\n+                                \"displayName\": \"Character Set\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Broker URI\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Character Set\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Client ID\": {\n-                                \"description\": \"MQTT client ID to use. If not set, a UUID will be generated.\",\n-                                \"displayName\": \"Client ID\",\n+                            \"Password\": {\n+                                \"description\": \"Password to access the Elasticsearch cluster\",\n+                                \"displayName\": \"Password\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Client ID\",\n+                                \"name\": \"Password\",\n                                 \"required\": false,\n-                                \"sensitive\": false\n+                                \"sensitive\": true\n                             },\n-                            \"Connection Timeout (seconds)\": {\n-                                \"defaultValue\": \"30\",\n-                                \"description\": \"Maximum time interval the client will wait for the network connection to the MQTT server to be established. The default timeout is 30 seconds. A value of 0 disables timeout processing meaning the client will wait until the network connection is made successfully or fails.\",\n-                                \"displayName\": \"Connection Timeout (seconds)\",\n+                            \"SSL Context Service\": {\n+                                \"description\": \"The SSL Context Service used to provide client certificate information for TLS/SSL connections. This service only applies if the Elasticsearch endpoint(s) have been secured with TLS/SSL.\",\n+                                \"displayName\": \"SSL Context Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Connection Timeout (seconds)\",\n+                                \"name\": \"SSL Context Service\",\n                                 \"required\": false,\n-                                \"sensitive\": false\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n                             },\n-                            \"Keep Alive Interval (seconds)\": {\n-                                \"defaultValue\": \"60\",\n-                                \"description\": \"Defines the maximum time interval between messages sent or received. It enables the client to detect if the server is no longer available, without having to wait for the TCP/IP timeout. The client will ensure that at least one message travels across the network within each keep alive period. In the absence of a data-related message during the time period, the client sends a very small \\\"ping\\\" message, which the server will acknowledge. A value of 0 disables keepalive processing in the client.\",\n-                                \"displayName\": \"Keep Alive Interval (seconds)\",\n+                            \"Username\": {\n+                                \"description\": \"Username to access the Elasticsearch cluster\",\n+                                \"displayName\": \"Username\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Keep Alive Interval (seconds)\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Username\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Last Will Message\": {\n-                                \"description\": \"The message to send as the client's Last Will.\",\n-                                \"displayName\": \"Last Will Message\",\n+                            \"elasticsearch-http-connect-timeout\": {\n+                                \"defaultValue\": \"5 secs\",\n+                                \"description\": \"Max wait time for the connection to the Elasticsearch REST API.\",\n+                                \"displayName\": \"Connection Timeout\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Last Will Message\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"elasticsearch-http-connect-timeout\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Last Will QoS Level\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"Best effort delivery. A message won\\u2019t be acknowledged by the receiver or stored and redelivered by the sender. This is often called \\u201cfire and forget\\u201d and provides the same guarantee as the underlying TCP protocol.\",\n-                                        \"displayName\": \"0 - At most once\",\n-                                        \"value\": \"0\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Guarantees that a message will be delivered at least once to the receiver. The message can also be delivered more than once\",\n-                                        \"displayName\": \"1 - At least once\",\n-                                        \"value\": \"1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Guarantees that each message is received only once by the counterpart. It is the safest and also the slowest quality of service level. The guarantee is provided by two round-trip flows between sender and receiver.\",\n-                                        \"displayName\": \"2 - Exactly once\",\n-                                        \"value\": \"2\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"0\",\n-                                \"dependencies\": [\n-                                    {\n-                                        \"propertyDisplayName\": \"Last Will Message\",\n-                                        \"propertyName\": \"Last Will Message\"\n-                                    }\n-                                ],\n-                                \"description\": \"QoS level to be used when publishing the Last Will Message.\",\n-                                \"displayName\": \"Last Will QoS Level\",\n+                            \"elasticsearch-http-proxy-host\": {\n+                                \"description\": \"The fully qualified hostname or IP address of the proxy server\",\n+                                \"displayName\": \"Proxy Host\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Last Will QoS Level\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"elasticsearch-http-proxy-host\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Last Will Retain\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"false\",\n-                                \"dependencies\": [\n-                                    {\n-                                        \"propertyDisplayName\": \"Last Will Message\",\n-                                        \"propertyName\": \"Last Will Message\"\n-                                    }\n-                                ],\n-                                \"description\": \"Whether to retain the client's Last Will.\",\n-                                \"displayName\": \"Last Will Retain\",\n+                            \"elasticsearch-http-proxy-port\": {\n+                                \"description\": \"The port of the proxy server\",\n+                                \"displayName\": \"Proxy Port\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Last Will Retain\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"elasticsearch-http-proxy-port\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Last Will Topic\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"propertyDisplayName\": \"Last Will Message\",\n-                                        \"propertyName\": \"Last Will Message\"\n-                                    }\n-                                ],\n-                                \"description\": \"The topic to send the client's Last Will to.\",\n-                                \"displayName\": \"Last Will Topic\",\n+                            \"elasticsearch-http-response-timeout\": {\n+                                \"defaultValue\": \"15 secs\",\n+                                \"description\": \"Max wait time for a response from the Elasticsearch REST API.\",\n+                                \"displayName\": \"Response Timeout\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Last Will Topic\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"elasticsearch-http-response-timeout\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"MQTT Specification Version\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"Start with v3.1.1 and fallback to v3.1.0 if not supported by a broker\",\n-                                        \"displayName\": \"v3 AUTO\",\n-                                        \"value\": \"0\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"v5.0\",\n-                                        \"value\": \"5\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"v3.1.1\",\n-                                        \"value\": \"4\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"v3.1.0\",\n-                                        \"value\": \"3\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"0\",\n-                                \"description\": \"The MQTT specification version when connecting with the broker. See the allowable value descriptions for more details.\",\n-                                \"displayName\": \"MQTT Specification Version\",\n+                            \"elasticsearch-http-url\": {\n+                                \"description\": \"Elasticsearch URL which will be connected to, including scheme (http, e.g.), host, and port. The default port for the REST API is 9200.\",\n+                                \"displayName\": \"Elasticsearch URL\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"MQTT Specification Version\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"elasticsearch-http-url\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Password\": {\n-                                \"description\": \"Password to use when connecting to the broker\",\n-                                \"displayName\": \"Password\",\n+                            \"proxy-configuration-service\": {\n+                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests. If set, it supersedes proxy settings configured per component. Supported proxies: SOCKS, HTTP + AuthN In case of SOCKS, it is not guaranteed that the selected SOCKS Version will be used by the processor.\",\n+                                \"displayName\": \"Proxy Configuration Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Password\",\n+                                \"name\": \"proxy-configuration-service\",\n+                                \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.proxy.ProxyConfigurationService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"proxy-password\": {\n+                                \"description\": \"Proxy Password\",\n+                                \"displayName\": \"Proxy Password\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"proxy-password\",\n                                 \"required\": false,\n                                 \"sensitive\": true\n                             },\n-                            \"Quality of Service(QoS)\": {\n-                                \"description\": \"The Quality of Service (QoS) to send the message with. Accepts three values '0', '1' and '2'; '0' for 'at most once', '1' for 'at least once', '2' for 'exactly once'. Expression language is allowed in order to support publishing messages with different QoS but the end value of the property must be either '0', '1' or '2'. \",\n-                                \"displayName\": \"Quality of Service (QoS)\",\n+                            \"proxy-username\": {\n+                                \"description\": \"Proxy Username\",\n+                                \"displayName\": \"Proxy Username\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"proxy-username\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"query-es-fields\": {\n+                                \"description\": \"A comma-separated list of fields to retrieve from the document. If the Fields property is left blank, then the entire document's source will be retrieved.\",\n+                                \"displayName\": \"Fields\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Quality of Service(QoS)\",\n-                                \"required\": true,\n+                                \"name\": \"query-es-fields\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Retain Message\": {\n-                                \"description\": \"Whether or not the retain flag should be set on the MQTT message.\",\n-                                \"displayName\": \"Retain Message\",\n+                            \"query-es-index\": {\n+                                \"description\": \"The name of the index to read from. If the property is unset or set to _all, the query will match across all indexes.\",\n+                                \"displayName\": \"Index\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Retain Message\",\n+                                \"name\": \"query-es-index\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"SSL Context Service\": {\n-                                \"description\": \"The SSL Context Service used to provide client certificate information for TLS/SSL connections.\",\n-                                \"displayName\": \"SSL Context Service\",\n+                            \"query-es-limit\": {\n+                                \"description\": \"If set, limits the number of results that will be returned.\",\n+                                \"displayName\": \"Limit\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"SSL Context Service\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"query-es-limit\",\n                                 \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n+                                \"sensitive\": false\n                             },\n-                            \"Session Expiry Interval\": {\n-                                \"defaultValue\": \"24 hrs\",\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"5\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"MQTT Specification Version\",\n-                                        \"propertyName\": \"MQTT Specification Version\"\n-                                    },\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"false\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Session state\",\n-                                        \"propertyName\": \"Session state\"\n-                                    }\n-                                ],\n-                                \"description\": \"After this interval the broker will expire the client and clear the session state.\",\n-                                \"displayName\": \"Session Expiry Interval\",\n+                            \"query-es-query\": {\n+                                \"description\": \"The Lucene-style query to run against ElasticSearch (e.g., genre:blues AND -artist:muddy)\",\n+                                \"displayName\": \"Query\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Session Expiry Interval\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"query-es-query\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"query-es-size\": {\n+                                \"defaultValue\": \"20\",\n+                                \"description\": \"Determines how many documents to return per page during scrolling.\",\n+                                \"displayName\": \"Page Size\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"query-es-size\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"query-es-sort\": {\n+                                \"description\": \"A sort parameter (e.g., timestamp:asc). If the Sort property is left blank, then the results will be retrieved in document order.\",\n+                                \"displayName\": \"Sort\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"query-es-sort\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Session state\": {\n+                            \"query-es-target\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Client and Server discard any previous session and start a new one. This session lasts as long as the network connection. State data associated with this session is not reused in any subsequent session\",\n-                                        \"displayName\": \"Clean Session\",\n-                                        \"value\": \"true\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Flow file content\",\n+                                        \"value\": \"Flow file content\"\n                                     },\n                                     {\n-                                        \"description\": \"Server resumes communications with the client based on state from the current session (as identified by the ClientID). The client and server store the session after the client and server are disconnected. After the disconnection of a session that was not a clean session, the server stores further QoS 1 and QoS 2 messages that match any subscriptions that the client had at the time of disconnection as part of the session state\",\n-                                        \"displayName\": \"Resume Session\",\n-                                        \"value\": \"false\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Flow file attributes\",\n+                                        \"value\": \"Flow file attributes\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"true\",\n-                                \"description\": \"Whether to start a fresh or resume previous flows. See the allowable value descriptions for more details.\",\n-                                \"displayName\": \"Session state\",\n+                                \"defaultValue\": \"Flow file content\",\n+                                \"description\": \"Indicates where the results should be placed.  In the case of 'Flow file content', the JSON response will be written as the content of the flow file.  In the case of 'Flow file attributes', the original flow file (if applicable) will be cloned for each result, and all return fields will be placed in a flow file attribute of the same name, but prefixed by 'es.result.'\",\n+                                \"displayName\": \"Target\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Session state\",\n+                                \"name\": \"query-es-target\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Topic\": {\n-                                \"description\": \"The topic to publish the message to.\",\n-                                \"displayName\": \"Topic\",\n+                            \"query-es-type\": {\n+                                \"description\": \"The type of document (if unset, the query will be against all types in the _index). This should be unset or '_doc' for Elasticsearch 7.0+.\",\n+                                \"displayName\": \"Type\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Topic\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Username\": {\n-                                \"description\": \"Username to use when connecting to the broker\",\n-                                \"displayName\": \"Username\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Username\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"message-demarcator\": {\n-                                \"description\": \"With this property, you have an option to publish multiple messages from a single FlowFile. This property allows you to provide a string (interpreted as UTF-8) to use for demarcating apart the FlowFile content. This is an optional property ; if not provided, and if not defining a Record Reader/Writer, each FlowFile will be published as a single message. To enter special character such as 'new line' use CTRL+Enter or Shift+Enter depending on the OS.\",\n-                                \"displayName\": \"Message Demarcator\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"message-demarcator\",\n+                                \"name\": \"query-es-type\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"record-reader\": {\n-                                \"description\": \"The Record Reader to use for parsing the incoming FlowFile into Records.\",\n-                                \"displayName\": \"Record Reader\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"record-reader\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            },\n-                            \"record-writer\": {\n-                                \"description\": \"The Record Writer to use for serializing Records before publishing them as an MQTT Message.\",\n-                                \"displayName\": \"Record Writer\",\n+                            \"routing-query-info-strategy\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"Always route Query Info\",\n+                                        \"displayName\": \"Always\",\n+                                        \"value\": \"ALWAYS\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Never route Query Info\",\n+                                        \"displayName\": \"Never\",\n+                                        \"value\": \"NEVER\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Route Query Info if the Query returns no hits\",\n+                                        \"displayName\": \"No Hits\",\n+                                        \"value\": \"NOHIT\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Always append Query Info as attributes, using the existing relationships (does not add the Query Info relationship).\",\n+                                        \"displayName\": \"Append as Attributes\",\n+                                        \"value\": \"APPEND_AS_ATTRIBUTES\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"NEVER\",\n+                                \"description\": \"Specifies when to generate and route Query Info after a successful query\",\n+                                \"displayName\": \"Routing Strategy for Query Info\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"record-writer\",\n+                                \"name\": \"routing-query-info-strategy\",\n                                 \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n+                                \"sensitive\": false\n                             }\n                         },\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.processors.mqtt.ConsumeMQTT\"\n-                        ],\n                         \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"FlowFiles that are sent successfully to the destination are transferred to this relationship.\",\n+                                \"description\": \"A FlowFile is routed to this relationship if the document cannot be fetched but attempting the operation again may succeed. Note that if the processor has no incoming connections, flow files may still be sent to this relationship based on the processor properties and the results of the fetch operation.\",\n+                                \"name\": \"retry\"\n+                            },\n+                            {\n+                                \"description\": \"All FlowFiles that are read from Elasticsearch are routed to this relationship.\",\n                                 \"name\": \"success\"\n                             },\n                             {\n-                                \"description\": \"FlowFiles that failed to send to the destination are transferred to this relationship.\",\n+                                \"description\": \"All FlowFiles that cannot be read from Elasticsearch are routed to this relationship. Note that only incoming flow files will be routed to failure.\",\n                                 \"name\": \"failure\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n+                            \"CRON_DRIVEN\",\n+                            \"EVENT_DRIVEN\"\n                         ],\n                         \"supportsBatching\": true,\n-                        \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicProperties\": true,\n                         \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": false,\n+                        \"supportsEventDriven\": true,\n                         \"supportsSensitiveDynamicProperties\": false,\n-                        \"systemResourceConsiderations\": [\n-                            {\n-                                \"description\": \"An instance of this component can cause high usage of this system resource.  Multiple instances or high concurrency settings may result a degradation of performance.\",\n-                                \"resource\": \"MEMORY\"\n-                            }\n-                        ],\n                         \"tags\": [\n-                            \"IOT\",\n-                            \"MQTT\",\n-                            \"publish\"\n+                            \"elasticsearch\",\n+                            \"get\",\n+                            \"http\",\n+                            \"query\",\n+                            \"read\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.mqtt.PublishMQTT\",\n-                        \"typeDescription\": \"Publishes a message to an MQTT topic\",\n-                        \"version\": \"1.27.0\"\n-                    }\n-                ],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"1.27.0\"\n-        },\n-        {\n-            \"artifact\": \"nifi-hubspot-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [],\n-                \"processors\": [\n+                        \"type\": \"org.apache.nifi.processors.elasticsearch.QueryElasticsearchHttp\",\n+                        \"typeDescription\": \"Queries Elasticsearch using the specified connection properties. Note that the full body of each page of documents will be read into memory before being written to Flow Files for transfer.  Also note that the Elasticsearch max_result_window index setting is the upper bound on the number of records that can be retrieved using this query.  To retrieve more records, use the ScrollElasticsearchHttp processor.\",\n+                        \"version\": \"1.27.0\",\n+                        \"writesAttributes\": [\n+                            {\n+                                \"description\": \"The filename attribute is set to the document identifier\",\n+                                \"name\": \"filename\"\n+                            },\n+                            {\n+                                \"description\": \"The number of hits for a query\",\n+                                \"name\": \"es.query.hitcount\"\n+                            },\n+                            {\n+                                \"description\": \"The Elasticsearch document identifier\",\n+                                \"name\": \"es.id\"\n+                            },\n+                            {\n+                                \"description\": \"The Elasticsearch index containing the document\",\n+                                \"name\": \"es.index\"\n+                            },\n+                            {\n+                                \"description\": \"The Elasticsearch query that was built\",\n+                                \"name\": \"es.query.url\"\n+                            },\n+                            {\n+                                \"description\": \"The Elasticsearch document type\",\n+                                \"name\": \"es.type\"\n+                            },\n+                            {\n+                                \"description\": \"If Target is 'Flow file attributes', the JSON attributes of each result will be placed into corresponding attributes with this prefix.\",\n+                                \"name\": \"es.result.*\"\n+                            }\n+                        ]\n+                    },\n                     {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-hubspot-nar\",\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-elasticsearch-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n+                            \"EVENT_DRIVEN\": 0,\n                             \"TIMER_DRIVEN\": 1\n                         },\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"1 min\"\n+                            \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n-                        \"defaultYieldDuration\": \"10 sec\",\n+                        \"defaultYieldDuration\": \"1 sec\",\n+                        \"deprecated\": true,\n+                        \"deprecationAlternatives\": [\n+                            \"org.apache.nifi.processors.elasticsearch.SearchElasticsearch\"\n+                        ],\n+                        \"deprecationReason\": \"This processor is deprecated and may be removed in future releases.\",\n+                        \"dynamicProperties\": [\n+                            {\n+                                \"description\": \"Adds the specified property name/value as a query parameter in the Elasticsearch URL used for processing\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"name\": \"A URL query parameter\",\n+                                \"value\": \"The value to set it to\"\n+                            }\n+                        ],\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_FORBIDDEN\",\n-                        \"primaryNodeOnly\": true,\n+                        \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"access-token\": {\n-                                \"description\": \"Access Token to authenticate requests\",\n-                                \"displayName\": \"Access Token\",\n+                            \"Character Set\": {\n+                                \"defaultValue\": \"UTF-8\",\n+                                \"description\": \"Specifies the character set of the document data.\",\n+                                \"displayName\": \"Character Set\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"access-token\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Character Set\",\n                                 \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Password\": {\n+                                \"description\": \"Password to access the Elasticsearch cluster\",\n+                                \"displayName\": \"Password\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Password\",\n+                                \"required\": false,\n                                 \"sensitive\": true\n                             },\n-                            \"incremental-delay\": {\n-                                \"defaultValue\": \"30 sec\",\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"true\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Incremental Loading\",\n-                                        \"propertyName\": \"is-incremental\"\n-                                    }\n-                                ],\n-                                \"description\": \"The ending timestamp of the time window will be adjusted earlier by the amount configured in this property. For example, with a property value of 10 seconds, an ending timestamp of 12:30:45 would be changed to 12:30:35. Set this property to avoid missing objects when the clock of your local machines and HubSpot servers' clock are not in sync and to protect against HubSpot's mechanism that changes last updated timestamps after object creation.\",\n-                                \"displayName\": \"Incremental Delay\",\n+                            \"SSL Context Service\": {\n+                                \"description\": \"The SSL Context Service used to provide client certificate information for TLS/SSL connections. This service only applies if the Elasticsearch endpoint(s) have been secured with TLS/SSL.\",\n+                                \"displayName\": \"SSL Context Service\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"SSL Context Service\",\n+                                \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"Username\": {\n+                                \"description\": \"Username to access the Elasticsearch cluster\",\n+                                \"displayName\": \"Username\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"incremental-delay\",\n+                                \"name\": \"Username\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"elasticsearch-http-connect-timeout\": {\n+                                \"defaultValue\": \"5 secs\",\n+                                \"description\": \"Max wait time for the connection to the Elasticsearch REST API.\",\n+                                \"displayName\": \"Connection Timeout\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"elasticsearch-http-connect-timeout\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"incremental-initial-start-time\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"true\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Incremental Loading\",\n-                                        \"propertyName\": \"is-incremental\"\n-                                    }\n-                                ],\n-                                \"description\": \"This property specifies the start time that the processor applies when running the first request. The expected format is a UTC date-time such as '2011-12-03T10:15:30Z'\",\n-                                \"displayName\": \"Incremental Initial Start Time\",\n+                            \"elasticsearch-http-proxy-host\": {\n+                                \"description\": \"The fully qualified hostname or IP address of the proxy server\",\n+                                \"displayName\": \"Proxy Host\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"incremental-initial-start-time\",\n+                                \"name\": \"elasticsearch-http-proxy-host\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"is-incremental\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"true\",\n-                                \"description\": \"The processor can incrementally load the queried objects so that each object is queried exactly once. For each query, the processor queries objects within a time window where the objects were modified between the previous run time and the current time (optionally adjusted by the Incremental Delay property).\",\n-                                \"displayName\": \"Incremental Loading\",\n+                            \"elasticsearch-http-proxy-port\": {\n+                                \"description\": \"The port of the proxy server\",\n+                                \"displayName\": \"Proxy Port\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"is-incremental\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"elasticsearch-http-proxy-port\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"object-type\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"In HubSpot, the companies object is a standard CRM object. Individual company records can be used to store information about businesses and organizations within company properties.\",\n-                                        \"displayName\": \"Companies\",\n-                                        \"value\": \"/crm/v3/objects/companies\"\n-                                    },\n-                                    {\n-                                        \"description\": \"In HubSpot, contacts store information about individuals. From marketing automation to smart content, the lead-specific data found in contact records helps users leverage much of HubSpot's functionality.\",\n-                                        \"displayName\": \"Contacts\",\n-                                        \"value\": \"/crm/v3/objects/contacts\"\n-                                    },\n-                                    {\n-                                        \"description\": \"In HubSpot, a deal represents an ongoing transaction that a sales team is pursuing with a contact or company. It\\u2019s tracked through pipeline stages until won or lost.\",\n-                                        \"displayName\": \"Deals\",\n-                                        \"value\": \"/crm/v3/objects/deals\"\n-                                    },\n-                                    {\n-                                        \"description\": \"In HubSpot, line items can be thought of as a subset of products. When a product is attached to a deal, it becomes a line item. Line items can be created that are unique to an individual quote, but they will not be added to the product library.\",\n-                                        \"displayName\": \"Line Items\",\n-                                        \"value\": \"/crm/v3/objects/line_items\"\n-                                    },\n-                                    {\n-                                        \"description\": \"In HubSpot, products represent the goods or services to be sold. Building a product library allows the user to quickly add products to deals, generate quotes, and report on product performance.\",\n-                                        \"displayName\": \"Products\",\n-                                        \"value\": \"/crm/v3/objects/products\"\n-                                    },\n-                                    {\n-                                        \"description\": \"In HubSpot, a ticket represents a customer request for help or support.\",\n-                                        \"displayName\": \"Tickets\",\n-                                        \"value\": \"/crm/v3/objects/tickets\"\n-                                    },\n-                                    {\n-                                        \"description\": \"In HubSpot, quotes are used to share pricing information with potential buyers.\",\n-                                        \"displayName\": \"Quotes\",\n-                                        \"value\": \"/crm/v3/objects/quotes\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Get calls on CRM records and on the calls index page.\",\n-                                        \"displayName\": \"Calls\",\n-                                        \"value\": \"/crm/v3/objects/calls\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Get emails on CRM records.\",\n-                                        \"displayName\": \"Emails\",\n-                                        \"value\": \"/crm/v3/objects/emails\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Get meetings on CRM records.\",\n-                                        \"displayName\": \"Meetings\",\n-                                        \"value\": \"/crm/v3/objects/meetings\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Get notes on CRM records.\",\n-                                        \"displayName\": \"Notes\",\n-                                        \"value\": \"/crm/v3/objects/notes\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Get tasks on CRM records.\",\n-                                        \"displayName\": \"Tasks\",\n-                                        \"value\": \"/crm/v3/objects/tasks\"\n-                                    }\n-                                ],\n-                                \"description\": \"The HubSpot Object Type requested\",\n-                                \"displayName\": \"Object Type\",\n+                            \"elasticsearch-http-response-timeout\": {\n+                                \"defaultValue\": \"15 secs\",\n+                                \"description\": \"Max wait time for a response from the Elasticsearch REST API.\",\n+                                \"displayName\": \"Response Timeout\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"object-type\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"elasticsearch-http-response-timeout\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"result-limit\": {\n-                                \"description\": \"The maximum number of results to request for each invocation of the Processor\",\n-                                \"displayName\": \"Result Limit\",\n+                            \"elasticsearch-http-url\": {\n+                                \"description\": \"Elasticsearch URL which will be connected to, including scheme (http, e.g.), host, and port. The default port for the REST API is 9200.\",\n+                                \"displayName\": \"Elasticsearch URL\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"result-limit\",\n-                                \"required\": false,\n+                                \"name\": \"elasticsearch-http-url\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"web-client-service-provider\": {\n-                                \"description\": \"Controller service for HTTP client operations\",\n-                                \"displayName\": \"Web Client Service Provider\",\n+                            \"proxy-configuration-service\": {\n+                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests. If set, it supersedes proxy settings configured per component. Supported proxies: SOCKS, HTTP + AuthN In case of SOCKS, it is not guaranteed that the selected SOCKS Version will be used by the processor.\",\n+                                \"displayName\": \"Proxy Configuration Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"web-client-service-provider\",\n-                                \"required\": true,\n+                                \"name\": \"proxy-configuration-service\",\n+                                \"required\": false,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n                                     \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.web.client.provider.api.WebClientServiceProvider\",\n+                                    \"type\": \"org.apache.nifi.proxy.ProxyConfigurationService\",\n                                     \"version\": \"1.27.0\"\n                                 }\n-                            }\n-                        },\n-                        \"sideEffectFree\": false,\n-                        \"stateful\": {\n-                            \"description\": \"In case of incremental loading, the start and end timestamps of the last query time window are stored in the state. When the 'Result Limit' property is set, the paging cursor is saved after executing a request. Only the objects after the paging cursor will be retrieved. The maximum number of retrieved objects can be set in the 'Result Limit' property.\",\n-                            \"scopes\": [\n-                                \"CLUSTER\"\n-                            ]\n-                        },\n-                        \"supportedRelationships\": [\n-                            {\n-                                \"description\": \"For FlowFiles created as a result of a successful HTTP request.\",\n-                                \"name\": \"success\"\n-                            }\n-                        ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": false,\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": false,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"hubspot\"\n-                        ],\n-                        \"triggerSerially\": true,\n-                        \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.hubspot.GetHubSpot\",\n-                        \"typeDescription\": \"Retrieves JSON data from a private HubSpot application. This processor is intended to be run on the Primary Node only.\",\n-                        \"version\": \"1.27.0\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"Sets the MIME type to application/json\",\n-                                \"name\": \"mime.type\"\n-                            }\n-                        ]\n-                    }\n-                ],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"1.27.0\"\n-        },\n-        {\n-            \"artifact\": \"nifi-workday-processors-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [],\n-                \"processors\": [\n-                    {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-workday-processors-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"e0c4461\"\n-                        },\n-                        \"defaultBulletinLevel\": \"WARN\",\n-                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": 1,\n-                            \"TIMER_DRIVEN\": 1\n-                        },\n-                        \"defaultPenaltyDuration\": \"30 sec\",\n-                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"0 sec\"\n-                        },\n-                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n-                        \"defaultYieldDuration\": \"1 sec\",\n-                        \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_ALLOWED\",\n-                        \"primaryNodeOnly\": false,\n-                        \"propertyDescriptors\": {\n-                            \"Web Client Service Provider\": {\n-                                \"description\": \"Web client which is used to communicate with the Workday API.\",\n-                                \"displayName\": \"Web Client Service Provider\",\n+                            },\n+                            \"proxy-password\": {\n+                                \"description\": \"Proxy Password\",\n+                                \"displayName\": \"Proxy Password\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Web Client Service Provider\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"proxy-password\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n+                            },\n+                            \"proxy-username\": {\n+                                \"description\": \"Proxy Username\",\n+                                \"displayName\": \"Proxy Username\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"proxy-username\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"scroll-es-fields\": {\n+                                \"description\": \"A comma-separated list of fields to retrieve from the document. If the Fields property is left blank, then the entire document's source will be retrieved.\",\n+                                \"displayName\": \"Fields\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"scroll-es-fields\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"scroll-es-index\": {\n+                                \"description\": \"The name of the index to read from. If the property is set to _all, the query will match across all indexes.\",\n+                                \"displayName\": \"Index\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"scroll-es-index\",\n                                 \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.web.client.provider.api.WebClientServiceProvider\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n+                                \"sensitive\": false\n                             },\n-                            \"Workday Password\": {\n-                                \"description\": \"The password provided for authentication of Workday requests. Encoded using Base64 for HTTP Basic Authentication as described in RFC 7617.\",\n-                                \"displayName\": \"Workday Password\",\n+                            \"scroll-es-query\": {\n+                                \"description\": \"The Lucene-style query to run against ElasticSearch (e.g., genre:blues AND -artist:muddy)\",\n+                                \"displayName\": \"Query\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Workday Password\",\n+                                \"name\": \"scroll-es-query\",\n                                 \"required\": true,\n-                                \"sensitive\": true\n+                                \"sensitive\": false\n                             },\n-                            \"Workday Report URL\": {\n-                                \"description\": \"HTTP remote URL of Workday report including a scheme of http or https, as well as a hostname or IP address with optional port and path elements.\",\n-                                \"displayName\": \"Workday Report URL\",\n+                            \"scroll-es-scroll\": {\n+                                \"defaultValue\": \"1m\",\n+                                \"description\": \"The scroll duration is how long each search context is kept in memory.\",\n+                                \"displayName\": \"Scroll Duration\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Workday Report URL\",\n+                                \"name\": \"scroll-es-scroll\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Workday Username\": {\n-                                \"description\": \"The username provided for authentication of Workday requests. Encoded using Base64 for HTTP Basic Authentication as described in RFC 7617.\",\n-                                \"displayName\": \"Workday Username\",\n+                            \"scroll-es-size\": {\n+                                \"defaultValue\": \"20\",\n+                                \"description\": \"Determines how many documents to return per page during scrolling.\",\n+                                \"displayName\": \"Page Size\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Workday Username\",\n+                                \"name\": \"scroll-es-size\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"record-reader\": {\n-                                \"description\": \"Specifies the Controller Service to use for parsing incoming data and determining the data's schema.\",\n-                                \"displayName\": \"Record Reader\",\n+                            \"scroll-es-sort\": {\n+                                \"description\": \"A sort parameter (e.g., timestamp:asc). If the Sort property is left blank, then the results will be retrieved in document order.\",\n+                                \"displayName\": \"Sort\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"record-reader\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"scroll-es-sort\",\n                                 \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n+                                \"sensitive\": false\n                             },\n-                            \"record-writer\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"propertyDisplayName\": \"Record Reader\",\n-                                        \"propertyName\": \"record-reader\"\n-                                    }\n-                                ],\n-                                \"description\": \"The Record Writer to use for serializing Records to an output FlowFile.\",\n-                                \"displayName\": \"Record Writer\",\n+                            \"scroll-es-type\": {\n+                                \"description\": \"The type of document (if unset, the query will be against all types in the _index). This should be unset or '_doc' for Elasticsearch 7.0+.\",\n+                                \"displayName\": \"Type\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"record-writer\",\n-                                \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"scroll-es-type\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n                             }\n                         },\n-                        \"sideEffectFree\": true,\n+                        \"sideEffectFree\": false,\n+                        \"stateful\": {\n+                            \"description\": \"After each successful scroll page, the latest scroll_id is persisted in scrollId as input for the next scroll call.  Once the entire query is complete, finishedQuery state will be set to true, and the processor will not execute unless this is cleared.\",\n+                            \"scopes\": [\n+                                \"LOCAL\"\n+                            ]\n+                        },\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"Response FlowFiles transferred when receiving HTTP responses with a status code between 200 and 299.\",\n+                                \"description\": \"All FlowFiles that are read from Elasticsearch are routed to this relationship.\",\n                                 \"name\": \"success\"\n                             },\n                             {\n-                                \"description\": \"Request FlowFiles transferred when receiving socket communication errors.\",\n+                                \"description\": \"All FlowFiles that cannot be read from Elasticsearch are routed to this relationship. Note that only incoming flow files will be routed to failure.\",\n                                 \"name\": \"failure\"\n-                            },\n-                            {\n-                                \"description\": \"Request FlowFiles transferred when receiving HTTP responses with a status code between 200 and 299.\",\n-                                \"name\": \"original\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n+                            \"CRON_DRIVEN\",\n+                            \"EVENT_DRIVEN\"\n                         ],\n                         \"supportsBatching\": true,\n-                        \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicProperties\": true,\n                         \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": false,\n+                        \"supportsEventDriven\": true,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"Workday\",\n-                            \"report\"\n+                            \"elasticsearch\",\n+                            \"get\",\n+                            \"http\",\n+                            \"query\",\n+                            \"read\",\n+                            \"scroll\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.workday.GetWorkdayReport\",\n-                        \"typeDescription\": \"A processor which can interact with a configurable Workday Report. The processor can forward the content without modification, or you can transform it by providing the specific Record Reader and Record Writer services based on your needs. You can also remove fields by defining schema in the Record Writer. Supported Workday report formats are: csv, simplexml, json\",\n+                        \"type\": \"org.apache.nifi.processors.elasticsearch.ScrollElasticsearchHttp\",\n+                        \"typeDescription\": \"Scrolls through an Elasticsearch query using the specified connection properties. This processor is intended to be run on the primary node, and is designed for scrolling through huge result sets, as in the case of a reindex.  The state must be cleared before another query can be run.  Each page of results is returned, wrapped in a JSON object like so: { \\\"hits\\\" : [ <doc1>, <doc2>, <docn> ] }.  Note that the full body of each page of documents will be read into memory before being written to a Flow File for transfer.\",\n                         \"version\": \"1.27.0\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"The Java exception class raised when the processor fails\",\n-                                \"name\": \"getworkdayreport.java.exception.class\"\n-                            },\n-                            {\n-                                \"description\": \"The Java exception message raised when the processor fails\",\n-                                \"name\": \"getworkdayreport.java.exception.message\"\n-                            },\n-                            {\n-                                \"description\": \"Sets the mime.type attribute to the MIME Type specified by the Source / Record Writer\",\n-                                \"name\": \"mime.type\"\n+                                \"description\": \"The Elasticsearch index containing the document\",\n+                                \"name\": \"es.index\"\n                             },\n                             {\n-                                \"description\": \"The number of records in an outgoing FlowFile. This is only populated on the 'success' relationship when Record Reader and Writer is set.\",\n-                                \"name\": \"record.count\"\n+                                \"description\": \"The Elasticsearch document type\",\n+                                \"name\": \"es.type\"\n                             }\n                         ]\n                     }\n                 ],\n                 \"reportingTasks\": []\n             },\n             \"group\": \"org.apache.nifi\",\n             \"version\": \"1.27.0\"\n         },\n         {\n-            \"artifact\": \"nifi-prometheus-nar\",\n+            \"artifact\": \"nifi-metrics-reporter-service-api-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [],\n+                \"processors\": [],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"1.27.0\"\n+        },\n+        {\n+            \"artifact\": \"nifi-hashicorp-vault-nar\",\n             \"componentManifest\": {\n                 \"controllerServices\": [\n                     {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-prometheus-nar\",\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-hashicorp-vault-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n+                        \"dynamicProperties\": [\n+                            {\n+                                \"description\": \"Allows any Spring Vault property keys to be specified, as described in (https://docs.spring.io/spring-vault/docs/2.3.x/reference/html/#vault.core.environment-vault-configuration). See Additional Details for more information.\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"name\": \"A Spring Vault configuration property name\",\n+                                \"value\": \"The property value\"\n+                            }\n+                        ],\n                         \"group\": \"org.apache.nifi\",\n                         \"propertyDescriptors\": {\n-                            \"prometheus-reporting-task-client-auth\": {\n+                            \"configuration-strategy\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"ReportingTask will not authenticate clients. Anyone can communicate with this ReportingTask anonymously\",\n-                                        \"displayName\": \"No Authentication\",\n-                                        \"value\": \"No Authentication\"\n+                                        \"description\": \"Use properties, including dynamic properties, configured directly in the Controller Service to configure the client\",\n+                                        \"displayName\": \"Direct Properties\",\n+                                        \"value\": \"direct-properties\"\n                                     },\n                                     {\n-                                        \"description\": \"ReportingTask will try to verify the client but if unable to verify will allow the client to communicate anonymously\",\n-                                        \"displayName\": \"Want Authentication\",\n-                                        \"value\": \"Want Authentication\"\n+                                        \"description\": \"Use one or more '.properties' files to configure the client\",\n+                                        \"displayName\": \"Properties Files\",\n+                                        \"value\": \"properties-files\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"direct-properties\",\n+                                \"description\": \"Specifies the source of the configuration properties.\",\n+                                \"displayName\": \"Configuration Strategy\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"configuration-strategy\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"vault.authentication\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"TOKEN\",\n+                                        \"value\": \"TOKEN\"\n                                     },\n                                     {\n-                                        \"description\": \"ReportingTask will reject communications from any client unless the client provides a certificate that is trusted by the TrustStorespecified in the SSL Context Service\",\n-                                        \"displayName\": \"Need Authentication\",\n-                                        \"value\": \"Need Authentication\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"APPID\",\n+                                        \"value\": \"APPID\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"APPROLE\",\n+                                        \"value\": \"APPROLE\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"AWS_EC2\",\n+                                        \"value\": \"AWS_EC2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"AZURE\",\n+                                        \"value\": \"AZURE\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"CERT\",\n+                                        \"value\": \"CERT\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"CUBBYHOLE\",\n+                                        \"value\": \"CUBBYHOLE\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"KUBERNETES\",\n+                                        \"value\": \"KUBERNETES\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"No Authentication\",\n-                                \"description\": \"Specifies whether or not the Reporting Task should authenticate clients. This value is ignored if the <SSL Context Service> Property is not specified or the SSL Context provided uses only a KeyStore and not a TrustStore.\",\n-                                \"displayName\": \"Client Authentication\",\n+                                \"defaultValue\": \"TOKEN\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"direct-properties\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Configuration Strategy\",\n+                                        \"propertyName\": \"configuration-strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"Vault authentication method, as described in the Spring Vault Environment Configuration documentation (https://docs.spring.io/spring-vault/docs/2.3.x/reference/html/#vault.core.environment-vault-configuration).\",\n+                                \"displayName\": \"Vault Authentication\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"prometheus-reporting-task-client-auth\",\n+                                \"name\": \"vault.authentication\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"prometheus-reporting-task-instance-id\": {\n-                                \"defaultValue\": \"${hostname(true)}\",\n-                                \"description\": \"Id of this NiFi instance to be included in the metrics sent to Prometheus\",\n-                                \"displayName\": \"Instance ID\",\n+                            \"vault.connection.timeout\": {\n+                                \"defaultValue\": \"5 sec\",\n+                                \"description\": \"The connection timeout for the HashiCorp Vault client\",\n+                                \"displayName\": \"Connection Timeout\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"prometheus-reporting-task-instance-id\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"vault.connection.timeout\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"prometheus-reporting-task-metrics-endpoint-port\": {\n-                                \"defaultValue\": \"9092\",\n-                                \"description\": \"The Port where prometheus metrics can be accessed\",\n-                                \"displayName\": \"Prometheus Metrics Endpoint Port\",\n+                            \"vault.properties.files\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"properties-files\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Configuration Strategy\",\n+                                        \"propertyName\": \"configuration-strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"A comma-separated list of files containing HashiCorp Vault configuration properties, as described in the Spring Vault Environment Configuration documentation (https://docs.spring.io/spring-vault/docs/2.3.x/reference/html/#vault.core.environment-vault-configuration). All of the Spring property keys and authentication-specific property keys are supported.\",\n+                                \"displayName\": \"Vault Properties Files\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"prometheus-reporting-task-metrics-endpoint-port\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"vault.properties.files\",\n                                 \"required\": true,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"MULTIPLE\",\n+                                    \"resourceTypes\": [\n+                                        \"FILE\"\n+                                    ]\n+                                },\n                                 \"sensitive\": false\n                             },\n-                            \"prometheus-reporting-task-ssl-context\": {\n-                                \"description\": \"The SSL Context Service to use in order to secure the server. If specified, the server willaccept only HTTPS requests; otherwise, the server will accept only HTTP requests\",\n+                            \"vault.read.timeout\": {\n+                                \"defaultValue\": \"15 sec\",\n+                                \"description\": \"The read timeout for the HashiCorp Vault client\",\n+                                \"displayName\": \"Read Timeout\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"vault.read.timeout\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"vault.ssl.context.service\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"direct-properties\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Configuration Strategy\",\n+                                        \"propertyName\": \"configuration-strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"The SSL Context Service used to provide client certificate information for TLS/SSL connections to the HashiCorp Vault server.\",\n                                 \"displayName\": \"SSL Context Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"prometheus-reporting-task-ssl-context\",\n+                                \"name\": \"vault.ssl.context.service\",\n                                 \"required\": false,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n                                     \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.ssl.RestrictedSSLContextService\",\n+                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n                                     \"version\": \"1.27.0\"\n                                 }\n+                            },\n+                            \"vault.uri\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"direct-properties\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Configuration Strategy\",\n+                                        \"propertyName\": \"configuration-strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"The URI of the HashiCorp Vault server (e.g., http://localhost:8200).  Required if not specified in the Bootstrap HashiCorp Vault Configuration File.\",\n+                                \"displayName\": \"Vault URI\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"vault.uri\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n                             }\n                         },\n                         \"providedApiImplementations\": [\n                             {\n-                                \"artifact\": \"nifi-standard-services-api-nar\",\n+                                \"artifact\": \"nifi-hashicorp-vault-client-service-api-nar\",\n                                 \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.record.sink.RecordSinkService\",\n+                                \"type\": \"org.apache.nifi.vault.hashicorp.HashiCorpVaultClientService\",\n                                 \"version\": \"1.27.0\"\n                             }\n                         ],\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"supportsDynamicProperties\": true,\n+                        \"supportsSensitiveDynamicProperties\": true,\n                         \"tags\": [\n-                            \"prometheus\",\n-                            \"record\",\n-                            \"send\",\n-                            \"write\"\n+                            \"client\",\n+                            \"hashicorp\",\n+                            \"vault\"\n                         ],\n-                        \"type\": \"org.apache.nifi.reporting.prometheus.PrometheusRecordSink\",\n-                        \"typeDescription\": \"Specifies a Record Sink Service that exposes data points to a Prometheus scraping service. Numeric fields are exposed as Gauges, String fields are the label values for the gauges, and all other fields are ignored.\",\n+                        \"type\": \"org.apache.nifi.vault.hashicorp.StandardHashiCorpVaultClientService\",\n+                        \"typeDescription\": \"A controller service for interacting with HashiCorp Vault.\",\n                         \"version\": \"1.27.0\"\n                     }\n                 ],\n                 \"processors\": [],\n-                \"reportingTasks\": [\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"1.27.0\"\n+        },\n+        {\n+            \"artifact\": \"nifi-hwx-schema-registry-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-prometheus-nar\",\n+                        \"artifact\": \"nifi-hwx-schema-registry-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n-                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"60 sec\"\n-                        },\n-                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n+                        \"deprecated\": true,\n+                        \"deprecationReason\": \"This controller service is deprecated and will be removed in NiFi 2.x.\",\n                         \"group\": \"org.apache.nifi\",\n                         \"propertyDescriptors\": {\n-                            \"prometheus-reporting-task-client-auth\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"ReportingTask will not authenticate clients. Anyone can communicate with this ReportingTask anonymously\",\n-                                        \"displayName\": \"No Authentication\",\n-                                        \"value\": \"No Authentication\"\n-                                    },\n+                            \"basic-auth-password\": {\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"ReportingTask will try to verify the client but if unable to verify will allow the client to communicate anonymously\",\n-                                        \"displayName\": \"Want Authentication\",\n-                                        \"value\": \"Want Authentication\"\n-                                    },\n+                                        \"propertyDisplayName\": \"SSL Context Service\",\n+                                        \"propertyName\": \"ssl-context-service\"\n+                                    }\n+                                ],\n+                                \"description\": \"The password to use for basic authentication when the Schema Registry is behind a proxy such as Apache Knox.\",\n+                                \"displayName\": \"Basic Authentication Password\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"basic-auth-password\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n+                            },\n+                            \"basic-auth-username\": {\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"ReportingTask will reject communications from any client unless the client provides a certificate that is trusted by the TrustStorespecified in the SSL Context Service\",\n-                                        \"displayName\": \"Need Authentication\",\n-                                        \"value\": \"Need Authentication\"\n+                                        \"propertyDisplayName\": \"SSL Context Service\",\n+                                        \"propertyName\": \"ssl-context-service\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"No Authentication\",\n-                                \"description\": \"Specifies whether or not the Reporting Task should authenticate clients. This value is ignored if the <SSL Context Service> Property is not specified or the SSL Context provided uses only a KeyStore and not a TrustStore.\",\n-                                \"displayName\": \"Client Authentication\",\n+                                \"description\": \"The username to use for basic authentication when the Schema Registry is behind a proxy such as Apache Knox.\",\n+                                \"displayName\": \"Basic Authentication Username\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"prometheus-reporting-task-client-auth\",\n-                                \"required\": true,\n+                                \"name\": \"basic-auth-username\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"prometheus-reporting-task-instance-id\": {\n-                                \"defaultValue\": \"${hostname(true)}\",\n-                                \"description\": \"Id of this NiFi instance to be included in the metrics sent to Prometheus\",\n-                                \"displayName\": \"Instance ID\",\n+                            \"cache-expiration\": {\n+                                \"defaultValue\": \"1 hour\",\n+                                \"description\": \"Specifies how long a Schema that is cached should remain in the cache. Once this time period elapses, a cached version of a schema will no longer be used, and the service will have to communicate with the Hortonworks Schema Registry again in order to obtain the schema.\",\n+                                \"displayName\": \"Cache Expiration\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"prometheus-reporting-task-instance-id\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"cache-expiration\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"prometheus-reporting-task-metrics-endpoint-port\": {\n-                                \"defaultValue\": \"9092\",\n-                                \"description\": \"The Port where prometheus metrics can be accessed\",\n-                                \"displayName\": \"Prometheus Metrics Endpoint Port\",\n+                            \"cache-size\": {\n+                                \"defaultValue\": \"1000\",\n+                                \"description\": \"Specifies how many Schemas should be cached from the Hortonworks Schema Registry\",\n+                                \"displayName\": \"Cache Size\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"prometheus-reporting-task-metrics-endpoint-port\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"cache-size\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"prometheus-reporting-task-metrics-send-jvm\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"Send JVM metrics in addition to the NiFi metrics\",\n-                                \"displayName\": \"Send JVM metrics\",\n+                            \"kerberos-credentials-service\": {\n+                                \"description\": \"Specifies the Kerberos Credentials Controller Service that should be used for authenticating with Kerberos\",\n+                                \"displayName\": \"Kerberos Credentials Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"prometheus-reporting-task-metrics-send-jvm\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n+                                \"name\": \"kerberos-credentials-service\",\n+                                \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.kerberos.KerberosCredentialsService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n                             },\n-                            \"prometheus-reporting-task-metrics-strategy\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"Send rollup metrics for the entire root process group\",\n-                                        \"displayName\": \"Root Process Group\",\n-                                        \"value\": \"Root Process Group\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Send metrics for each process group\",\n-                                        \"displayName\": \"All Process Groups\",\n-                                        \"value\": \"All Process Groups\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Send metrics for each component in the system, to include processors, connections, controller services, etc.\",\n-                                        \"displayName\": \"All Components\",\n-                                        \"value\": \"All Components\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"All Components\",\n-                                \"description\": \"The granularity on which to report metrics. Options include only the root process group, all process groups, or all components\",\n-                                \"displayName\": \"Metrics Reporting Strategy\",\n+                            \"kerberos-password\": {\n+                                \"description\": \"The password for the kerberos principal when not using the kerberos credentials service\",\n+                                \"displayName\": \"Kerberos Password\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"prometheus-reporting-task-metrics-strategy\",\n-                                \"required\": true,\n+                                \"name\": \"kerberos-password\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n+                            },\n+                            \"kerberos-principal\": {\n+                                \"description\": \"The kerberos principal to authenticate with when not using the kerberos credentials service\",\n+                                \"displayName\": \"Kerberos Principal\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"kerberos-principal\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"prometheus-reporting-task-ssl-context\": {\n-                                \"description\": \"The SSL Context Service to use in order to secure the server. If specified, the server willaccept only HTTPS requests; otherwise, the server will accept only HTTP requests\",\n+                            \"ssl-context-service\": {\n+                                \"description\": \"Specifies the SSL Context Service to use for communicating with Schema Registry.\",\n                                 \"displayName\": \"SSL Context Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"prometheus-reporting-task-ssl-context\",\n+                                \"name\": \"ssl-context-service\",\n                                 \"required\": false,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n                                     \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.ssl.RestrictedSSLContextService\",\n+                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n                                     \"version\": \"1.27.0\"\n                                 }\n+                            },\n+                            \"url\": {\n+                                \"description\": \"URL of the schema registry that this Controller Service should connect to, including version. For example, http://localhost:9090/api/v1\",\n+                                \"displayName\": \"Schema Registry URL\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"url\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n                             }\n                         },\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n+                        \"providedApiImplementations\": [\n+                            {\n+                                \"artifact\": \"nifi-standard-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.schemaregistry.services.SchemaRegistry\",\n+                                \"version\": \"1.27.0\"\n+                            }\n                         ],\n                         \"supportsDynamicProperties\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"metrics\",\n-                            \"prometheus\",\n-                            \"reporting\",\n-                            \"time series data\"\n+                            \"avro\",\n+                            \"hortonworks\",\n+                            \"hwx\",\n+                            \"registry\",\n+                            \"schema\"\n                         ],\n-                        \"type\": \"org.apache.nifi.reporting.prometheus.PrometheusReportingTask\",\n-                        \"typeDescription\": \"Reports metrics in Prometheus format by creating a /metrics HTTP(S) endpoint which can be used for external monitoring of the application. The reporting task reports a set of metrics regarding the JVM (optional) and the NiFi instance. Note that if the underlying Jetty server (i.e. the Prometheus endpoint) cannot be started (for example if two PrometheusReportingTask instances are started on the same port), this may cause a delay in shutting down NiFi while it waits for the server resources to be cleaned up.\",\n+                        \"type\": \"org.apache.nifi.schemaregistry.hortonworks.HortonworksSchemaRegistry\",\n+                        \"typeDescription\": \"Provides a Schema Registry Service that interacts with a Hortonworks Schema Registry, available at https://github.com/hortonworks/registry\",\n                         \"version\": \"1.27.0\"\n                     }\n-                ]\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"1.27.0\"\n-        },\n-        {\n-            \"artifact\": \"nifi-websocket-services-api-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [],\n+                ],\n                 \"processors\": [],\n                 \"reportingTasks\": []\n             },\n             \"group\": \"org.apache.nifi\",\n             \"version\": \"1.27.0\"\n         },\n         {\n-            \"artifact\": \"nifi-avro-nar\",\n+            \"artifact\": \"nifi-websocket-processors-nar\",\n             \"componentManifest\": {\n                 \"controllerServices\": [],\n                 \"processors\": [\n                     {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-avro-nar\",\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-websocket-processors-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -6035,123 +4222,119 @@\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n-                        \"deprecated\": true,\n-                        \"deprecationAlternatives\": [\n-                            \"org.apache.nifi.avro.AvroReader\",\n-                            \"org.apache.nifi.json.JsonRecordSetWriter\",\n-                            \"org.apache.nifi.processors.standard.ConvertRecord\"\n-                        ],\n-                        \"deprecationReason\": \"ConvertAvroToJSON is no longer needed since there is the AvroReader which along with JsonRecordSetWriter can be used in ConvertRecord to achieve the same thing.\",\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_REQUIRED\",\n+                        \"inputRequirement\": \"INPUT_ALLOWED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Avro schema\": {\n-                                \"description\": \"If the Avro records do not contain the schema (datum only), it must be specified here.\",\n-                                \"displayName\": \"Avro schema\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Avro schema\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"JSON container options\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"none\",\n-                                        \"value\": \"none\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"array\",\n-                                        \"value\": \"array\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"array\",\n-                                \"description\": \"Determines how stream of records is exposed: either as a sequence of single Objects (none) (i.e. writing every Object to a new line), or as an array of Objects (array).\",\n-                                \"displayName\": \"JSON container options\",\n+                            \"websocket-client-controller-service\": {\n+                                \"description\": \"A WebSocket CLIENT Controller Service which can connect to a WebSocket server.\",\n+                                \"displayName\": \"WebSocket Client ControllerService\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"JSON container options\",\n+                                \"name\": \"websocket-client-controller-service\",\n                                 \"required\": true,\n-                                \"sensitive\": false\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-websocket-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.websocket.WebSocketClientService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n                             },\n-                            \"Wrap Single Record\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"Determines if the resulting output for empty records or a single record should be wrapped in a container array as specified by 'JSON container options'\",\n-                                \"displayName\": \"Wrap Single Record\",\n+                            \"websocket-client-id\": {\n+                                \"description\": \"The client ID to identify WebSocket session. It should be unique within the WebSocket Client Controller Service. Otherwise, it throws WebSocketConfigurationException when it gets started.\",\n+                                \"displayName\": \"WebSocket Client Id\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Wrap Single Record\",\n+                                \"name\": \"websocket-client-id\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             }\n                         },\n-                        \"sideEffectFree\": true,\n+                        \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"A FlowFile is routed to this relationship after it has been converted to JSON\",\n+                                \"description\": \"FlowFile holding connection configuration attributes (like URL or HTTP headers) in case of successful connection\",\n                                 \"name\": \"success\"\n                             },\n                             {\n-                                \"description\": \"A FlowFile is routed to this relationship if it cannot be parsed as Avro or cannot be converted to JSON for any reason\",\n+                                \"description\": \"The WebSocket text message output\",\n+                                \"name\": \"text message\"\n+                            },\n+                            {\n+                                \"description\": \"The WebSocket binary message output\",\n+                                \"name\": \"binary message\"\n+                            },\n+                            {\n+                                \"description\": \"FlowFile holding connection configuration attributes (like URL or HTTP headers) in case of connection failure\",\n                                 \"name\": \"failure\"\n+                            },\n+                            {\n+                                \"description\": \"The WebSocket session is established\",\n+                                \"name\": \"connected\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n-                        \"supportsBatching\": true,\n+                        \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"avro\",\n-                            \"convert\",\n-                            \"json\"\n+                            \"WebSocket\",\n+                            \"consume\",\n+                            \"listen\",\n+                            \"subscribe\"\n                         ],\n-                        \"triggerSerially\": false,\n+                        \"triggerSerially\": true,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.avro.ConvertAvroToJSON\",\n-                        \"typeDescription\": \"Converts a Binary Avro record into a JSON object. This processor provides a direct mapping of an Avro field to a JSON field, such that the resulting JSON will have the same hierarchical structure as the Avro document. Note that the Avro schema information will be lost, as this is not a translation from binary Avro to JSON formatted Avro. The output JSON is encoded the UTF-8 encoding. If an incoming FlowFile contains a stream of multiple Avro records, the resultant FlowFile will contain a JSON Array containing all of the Avro records or a sequence of JSON Objects.  If an incoming FlowFile does not contain any records, an empty JSON object is the output. Empty/Single Avro record FlowFile inputs are optionally wrapped in a container as dictated by 'Wrap Single Record'\",\n+                        \"type\": \"org.apache.nifi.processors.websocket.ConnectWebSocket\",\n+                        \"typeDescription\": \"Acts as a WebSocket client endpoint to interact with a remote WebSocket server. FlowFiles are transferred to downstream relationships according to received message types as WebSocket client configured with this processor receives messages from remote WebSocket server. If a new flowfile is passed to the processor, the previous sessions will be closed and any data being sent will be aborted.\",\n                         \"version\": \"1.27.0\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"Sets the mime type to application/json\",\n-                                \"name\": \"mime.type\"\n+                                \"description\": \"WebSocket Controller Service id.\",\n+                                \"name\": \"websocket.controller.service.id\"\n+                            },\n+                            {\n+                                \"description\": \"Established WebSocket session id.\",\n+                                \"name\": \"websocket.session.id\"\n+                            },\n+                            {\n+                                \"description\": \"WebSocket endpoint id.\",\n+                                \"name\": \"websocket.endpoint.id\"\n+                            },\n+                            {\n+                                \"description\": \"WebSocket client address.\",\n+                                \"name\": \"websocket.local.address\"\n+                            },\n+                            {\n+                                \"description\": \"WebSocket server address.\",\n+                                \"name\": \"websocket.remote.address\"\n+                            },\n+                            {\n+                                \"description\": \"TEXT or BINARY.\",\n+                                \"name\": \"websocket.message.type\"\n                             }\n                         ]\n                     },\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-avro-nar\",\n+                        \"artifact\": \"nifi-websocket-processors-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -6160,132 +4343,110 @@\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_REQUIRED\",\n+                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Count Items\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"If true the number of items in the datafile will be counted and stored in a FlowFile attribute 'item.count'. The counting is done by reading blocks and getting the number of items for each block, thus avoiding de-serializing. The items being counted will be the top-level items in the datafile. For example, with a schema of type record the items will be the records, and for a schema of type Array the items will be the arrays (not the number of entries in each array).\",\n-                                \"displayName\": \"Count Items\",\n+                            \"server-url-path\": {\n+                                \"description\": \"The WetSocket URL Path on which this processor listens to. Must starts with '/', e.g. '/example'.\",\n+                                \"displayName\": \"Server URL Path\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Count Items\",\n+                                \"name\": \"server-url-path\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Fingerprint Algorithm\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"CRC-64-AVRO\",\n-                                        \"value\": \"CRC-64-AVRO\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"MD5\",\n-                                        \"value\": \"MD5\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"SHA-256\",\n-                                        \"value\": \"SHA-256\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"CRC-64-AVRO\",\n-                                \"description\": \"The algorithm used to generate the schema fingerprint. Available choices are based on the Avro recommended practices for fingerprint generation.\",\n-                                \"displayName\": \"Fingerprint Algorithm\",\n+                            \"websocket-server-controller-service\": {\n+                                \"description\": \"A WebSocket SERVER Controller Service which can accept WebSocket requests.\",\n+                                \"displayName\": \"WebSocket Server ControllerService\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Fingerprint Algorithm\",\n+                                \"name\": \"websocket-server-controller-service\",\n                                 \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Metadata Keys\": {\n-                                \"description\": \"A comma-separated list of keys indicating key/value pairs to extract from the Avro file header. The key 'avro.schema' can be used to extract the full schema in JSON format, and 'avro.codec' can be used to extract the codec name if one exists.\",\n-                                \"displayName\": \"Metadata Keys\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Metadata Keys\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-websocket-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.websocket.WebSocketServerService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n                             }\n                         },\n-                        \"sideEffectFree\": true,\n+                        \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"A FlowFile is routed to this relationship after metadata has been extracted.\",\n-                                \"name\": \"success\"\n+                                \"description\": \"The WebSocket text message output\",\n+                                \"name\": \"text message\"\n                             },\n                             {\n-                                \"description\": \"A FlowFile is routed to this relationship if it cannot be parsed as Avro or metadata cannot be extracted for any reason\",\n-                                \"name\": \"failure\"\n+                                \"description\": \"The WebSocket binary message output\",\n+                                \"name\": \"binary message\"\n+                            },\n+                            {\n+                                \"description\": \"The WebSocket session is established\",\n+                                \"name\": \"connected\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n-                        \"supportsBatching\": true,\n+                        \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"avro\",\n-                            \"metadata\",\n-                            \"schema\"\n+                            \"WebSocket\",\n+                            \"consume\",\n+                            \"listen\",\n+                            \"subscribe\"\n                         ],\n-                        \"triggerSerially\": false,\n+                        \"triggerSerially\": true,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.avro.ExtractAvroMetadata\",\n-                        \"typeDescription\": \"Extracts metadata from the header of an Avro datafile.\",\n+                        \"type\": \"org.apache.nifi.processors.websocket.ListenWebSocket\",\n+                        \"typeDescription\": \"Acts as a WebSocket server endpoint to accept client connections. FlowFiles are transferred to downstream relationships according to received message types as the WebSocket server configured with this processor receives client requests\",\n                         \"version\": \"1.27.0\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"The type of the schema (i.e. record, enum, etc.).\",\n-                                \"name\": \"schema.type\"\n+                                \"description\": \"WebSocket Controller Service id.\",\n+                                \"name\": \"websocket.controller.service.id\"\n                             },\n                             {\n-                                \"description\": \"Contains the name when the type is a record, enum or fixed, otherwise contains the name of the primitive type.\",\n-                                \"name\": \"schema.name\"\n+                                \"description\": \"Established WebSocket session id.\",\n+                                \"name\": \"websocket.session.id\"\n                             },\n                             {\n-                                \"description\": \"The result of the Fingerprint Algorithm as a Hex string.\",\n-                                \"name\": \"schema.fingerprint\"\n+                                \"description\": \"WebSocket endpoint id.\",\n+                                \"name\": \"websocket.endpoint.id\"\n                             },\n                             {\n-                                \"description\": \"The total number of items in the datafile, only written if Count Items is set to true.\",\n-                                \"name\": \"item.count\"\n+                                \"description\": \"WebSocket server address.\",\n+                                \"name\": \"websocket.local.address\"\n+                            },\n+                            {\n+                                \"description\": \"WebSocket client address.\",\n+                                \"name\": \"websocket.remote.address\"\n+                            },\n+                            {\n+                                \"description\": \"TEXT or BINARY.\",\n+                                \"name\": \"websocket.message.type\"\n                             }\n                         ]\n                     },\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-avro-nar\",\n+                        \"artifact\": \"nifi-websocket-processors-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -6297,2994 +4458,2434 @@\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Output Size\": {\n-                                \"defaultValue\": \"1\",\n-                                \"description\": \"The number of Avro records to include per split file. In cases where the incoming file has less records than the Output Size, or when the total number of records does not divide evenly by the Output Size, it is possible to get a split file with less records.\",\n-                                \"displayName\": \"Output Size\",\n+                            \"websocket-controller-service-id\": {\n+                                \"defaultValue\": \"${websocket.controller.service.id}\",\n+                                \"description\": \"A NiFi Expression to retrieve the id of a WebSocket ControllerService.\",\n+                                \"displayName\": \"WebSocket ControllerService Id\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Output Size\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"websocket-controller-service-id\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Output Strategy\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"Avro's object container file format\",\n-                                        \"displayName\": \"Datafile\",\n-                                        \"value\": \"Datafile\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Bare Avro records\",\n-                                        \"displayName\": \"Bare Record\",\n-                                        \"value\": \"Bare Record\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"Datafile\",\n-                                \"description\": \"Determines the format of the output. Either Avro Datafile, or bare record. Bare record output is only intended for use with systems that already require it, and shouldn't be needed for normal use.\",\n-                                \"displayName\": \"Output Strategy\",\n+                            \"websocket-endpoint-id\": {\n+                                \"defaultValue\": \"${websocket.endpoint.id}\",\n+                                \"description\": \"A NiFi Expression to retrieve the endpoint id of a WebSocket ControllerService.\",\n+                                \"displayName\": \"WebSocket Endpoint Id\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Output Strategy\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"websocket-endpoint-id\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Split Strategy\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"Split at Record boundaries\",\n-                                        \"displayName\": \"Record\",\n-                                        \"value\": \"Record\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"Record\",\n-                                \"description\": \"The strategy for splitting the incoming datafile. The Record strategy will read the incoming datafile by de-serializing each record.\",\n-                                \"displayName\": \"Split Strategy\",\n+                            \"websocket-message-type\": {\n+                                \"defaultValue\": \"TEXT\",\n+                                \"description\": \"The type of message content: TEXT or BINARY\",\n+                                \"displayName\": \"WebSocket Message Type\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Split Strategy\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"websocket-message-type\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Transfer Metadata\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"true\",\n-                                \"description\": \"Whether or not to transfer metadata from the parent datafile to the children. If the Output Strategy is Bare Record, then the metadata will be stored as FlowFile attributes, otherwise it will be in the Datafile header.\",\n-                                \"displayName\": \"Transfer Metadata\",\n+                            \"websocket-session-id\": {\n+                                \"defaultValue\": \"${websocket.session.id}\",\n+                                \"description\": \"A NiFi Expression to retrieve the session id. If not specified, a message will be sent to all connected WebSocket peers for the WebSocket controller service endpoint.\",\n+                                \"displayName\": \"WebSocket Session Id\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Transfer Metadata\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"websocket-session-id\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             }\n                         },\n-                        \"sideEffectFree\": true,\n+                        \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"If a FlowFile fails processing for any reason (for example, the FlowFile is not valid Avro), it will be routed to this relationship\",\n-                                \"name\": \"failure\"\n-                            },\n-                            {\n-                                \"description\": \"The original FlowFile that was split. If the FlowFile fails processing, nothing will be sent to this relationship\",\n-                                \"name\": \"original\"\n+                                \"description\": \"FlowFiles that are sent successfully to the destination are transferred to this relationship.\",\n+                                \"name\": \"success\"\n                             },\n                             {\n-                                \"description\": \"All new files split from the original FlowFile will be routed to this relationship\",\n-                                \"name\": \"split\"\n+                                \"description\": \"FlowFiles that failed to send to the destination are transferred to this relationship.\",\n+                                \"name\": \"failure\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n-                        \"supportsBatching\": true,\n+                        \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"systemResourceConsiderations\": [\n                             {\n                                 \"description\": \"An instance of this component can cause high usage of this system resource.  Multiple instances or high concurrency settings may result a degradation of performance.\",\n                                 \"resource\": \"MEMORY\"\n                             }\n                         ],\n                         \"tags\": [\n-                            \"avro\",\n-                            \"split\"\n+                            \"WebSocket\",\n+                            \"publish\",\n+                            \"send\"\n                         ],\n-                        \"triggerSerially\": false,\n+                        \"triggerSerially\": true,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.avro.SplitAvro\",\n-                        \"typeDescription\": \"Splits a binary encoded Avro datafile into smaller files based on the configured Output Size. The Output Strategy determines if the smaller files will be Avro datafiles, or bare Avro records with metadata in the FlowFile attributes. The output will always be binary encoded.\",\n+                        \"type\": \"org.apache.nifi.processors.websocket.PutWebSocket\",\n+                        \"typeDescription\": \"Sends messages to a WebSocket remote endpoint using a WebSocket session that is established by either ListenWebSocket or ConnectWebSocket.\",\n                         \"version\": \"1.27.0\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"All split FlowFiles produced from the same parent FlowFile will have the same randomly generated UUID added for this attribute\",\n-                                \"name\": \"fragment.identifier\"\n+                                \"description\": \"WebSocket Controller Service id.\",\n+                                \"name\": \"websocket.controller.service.id\"\n                             },\n                             {\n-                                \"description\": \"A one-up number that indicates the ordering of the split FlowFiles that were created from a single parent FlowFile\",\n-                                \"name\": \"fragment.index\"\n+                                \"description\": \"Established WebSocket session id.\",\n+                                \"name\": \"websocket.session.id\"\n                             },\n                             {\n-                                \"description\": \"The number of split FlowFiles generated from the parent FlowFile\",\n-                                \"name\": \"fragment.count\"\n+                                \"description\": \"WebSocket endpoint id.\",\n+                                \"name\": \"websocket.endpoint.id\"\n                             },\n                             {\n-                                \"description\": \"The filename of the parent FlowFile\",\n-                                \"name\": \"segment.original.filename \"\n+                                \"description\": \"TEXT or BINARY.\",\n+                                \"name\": \"websocket.message.type\"\n+                            },\n+                            {\n+                                \"description\": \"WebSocket server address.\",\n+                                \"name\": \"websocket.local.address\"\n+                            },\n+                            {\n+                                \"description\": \"WebSocket client address.\",\n+                                \"name\": \"websocket.remote.address\"\n+                            },\n+                            {\n+                                \"description\": \"Detail of the failure.\",\n+                                \"name\": \"websocket.failure.detail\"\n                             }\n                         ]\n                     }\n                 ],\n                 \"reportingTasks\": []\n             },\n             \"group\": \"org.apache.nifi\",\n             \"version\": \"1.27.0\"\n         },\n         {\n-            \"artifact\": \"nifi-dropbox-processors-nar\",\n+            \"artifact\": \"nifi-dropbox-services-api-nar\",\n             \"componentManifest\": {\n                 \"controllerServices\": [],\n-                \"processors\": [\n+                \"processors\": [],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"1.27.0\"\n+        },\n+        {\n+            \"artifact\": \"nifi-lookup-services-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-dropbox-processors-nar\",\n+                        \"artifact\": \"nifi-lookup-services-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n-                        \"defaultBulletinLevel\": \"WARN\",\n-                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": 1,\n-                            \"TIMER_DRIVEN\": 1\n-                        },\n-                        \"defaultPenaltyDuration\": \"30 sec\",\n-                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"0 sec\"\n-                        },\n-                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n-                        \"defaultYieldDuration\": \"1 sec\",\n-                        \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_REQUIRED\",\n-                        \"primaryNodeOnly\": false,\n-                        \"propertyDescriptors\": {\n-                            \"dropbox-credential-service\": {\n-                                \"description\": \"Controller Service used to obtain Dropbox credentials (App Key, App Secret, Access Token, Refresh Token). See controller service's Additional Details for more information.\",\n-                                \"displayName\": \"Dropbox Credential Service\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"dropbox-credential-service\",\n-                                \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-dropbox-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.dropbox.credentials.service.DropboxCredentialService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            },\n-                            \"file\": {\n-                                \"defaultValue\": \"${dropbox.id}\",\n-                                \"description\": \"The Dropbox identifier or path of the Dropbox file to fetch. The 'File' should match the following regular expression pattern: /.*|id:.* . When ListDropbox is used for input, either '${dropbox.id}' (identifying files by Dropbox id) or '${path}/${filename}' (identifying files by path) can be used as 'File' value.\",\n-                                \"displayName\": \"File\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"file\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"proxy-configuration-service\": {\n-                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests. Supported proxies: HTTP + AuthN\",\n-                                \"displayName\": \"Proxy Configuration Service\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"proxy-configuration-service\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.proxy.ProxyConfigurationService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            }\n-                        },\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.processors.dropbox.ListDropbox\",\n-                            \"org.apache.nifi.processors.dropbox.PutDropbox\"\n-                        ],\n-                        \"sideEffectFree\": false,\n-                        \"supportedRelationships\": [\n-                            {\n-                                \"description\": \"A FlowFile will be routed here for each successfully fetched File.\",\n-                                \"name\": \"success\"\n-                            },\n+                        \"explicitRestrictions\": [\n                             {\n-                                \"description\": \"A FlowFile will be routed here for each File for which fetch was attempted but failed.\",\n-                                \"name\": \"failure\"\n+                                \"explanation\": \"Provides operator the ability to read from any file that NiFi has access to.\",\n+                                \"requiredPermission\": \"read filesystem\"\n                             }\n                         ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": false,\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": false,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"dropbox\",\n-                            \"fetch\",\n-                            \"storage\"\n-                        ],\n-                        \"triggerSerially\": false,\n-                        \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.dropbox.FetchDropbox\",\n-                        \"typeDescription\": \"Fetches files from Dropbox. Designed to be used in tandem with ListDropbox.\",\n-                        \"version\": \"1.27.0\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"The error message returned by Dropbox\",\n-                                \"name\": \"error.message\"\n-                            },\n-                            {\n-                                \"description\": \"The Dropbox identifier of the file\",\n-                                \"name\": \"dropbox.id\"\n-                            },\n-                            {\n-                                \"description\": \"The folder path where the file is located\",\n-                                \"name\": \"path\"\n-                            },\n-                            {\n-                                \"description\": \"The name of the file\",\n-                                \"name\": \"filename\"\n-                            },\n-                            {\n-                                \"description\": \"The size of the file\",\n-                                \"name\": \"dropbox.size\"\n-                            },\n-                            {\n-                                \"description\": \"The server modified time of the file\",\n-                                \"name\": \"dropbox.timestamp\"\n-                            },\n-                            {\n-                                \"description\": \"Revision of the file\",\n-                                \"name\": \"dropbox.revision\"\n-                            }\n-                        ]\n-                    },\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-dropbox-processors-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"e0c4461\"\n-                        },\n-                        \"defaultBulletinLevel\": \"WARN\",\n-                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": 1,\n-                            \"TIMER_DRIVEN\": 1\n-                        },\n-                        \"defaultPenaltyDuration\": \"30 sec\",\n-                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"1 min\"\n-                        },\n-                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n-                        \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n-                        \"primaryNodeOnly\": true,\n                         \"propertyDescriptors\": {\n-                            \"dropbox-credential-service\": {\n-                                \"description\": \"Controller Service used to obtain Dropbox credentials (App Key, App Secret, Access Token, Refresh Token). See controller service's Additional Details for more information.\",\n-                                \"displayName\": \"Dropbox Credential Service\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"dropbox-credential-service\",\n-                                \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-dropbox-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.dropbox.credentials.service.DropboxCredentialService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            },\n-                            \"et-initial-listing-target\": {\n+                            \"CSV Format\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Ignore entities having timestamp older than the specified 'Tracking Time Window' at the initial listing activity.\",\n-                                        \"displayName\": \"Tracking Time Window\",\n-                                        \"value\": \"window\"\n+                                        \"description\": \"The format of the CSV is configured by using the properties of this Controller Service, such as Value Separator\",\n+                                        \"displayName\": \"Custom Format\",\n+                                        \"value\": \"custom\"\n                                     },\n                                     {\n-                                        \"description\": \"Regardless of entities timestamp, all existing entities will be listed at the initial listing activity.\",\n-                                        \"displayName\": \"All Available\",\n-                                        \"value\": \"all\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"all\",\n-                                \"dependencies\": [\n+                                        \"description\": \"CSV data follows the RFC 4180 Specification defined at https://tools.ietf.org/html/rfc4180\",\n+                                        \"displayName\": \"RFC 4180\",\n+                                        \"value\": \"rfc-4180\"\n+                                    },\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"entities\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Listing Strategy\",\n-                                        \"propertyName\": \"listing-strategy\"\n+                                        \"description\": \"CSV data follows the format used by Microsoft Excel\",\n+                                        \"displayName\": \"Microsoft Excel\",\n+                                        \"value\": \"excel\"\n+                                    },\n+                                    {\n+                                        \"description\": \"CSV data is Tab-Delimited instead of Comma Delimited\",\n+                                        \"displayName\": \"Tab-Delimited\",\n+                                        \"value\": \"tdf\"\n+                                    },\n+                                    {\n+                                        \"description\": \"CSV data follows the format used by MySQL\",\n+                                        \"displayName\": \"MySQL Format\",\n+                                        \"value\": \"mysql\"\n+                                    },\n+                                    {\n+                                        \"description\": \"The format used by Informix when issuing the UNLOAD TO file_name command\",\n+                                        \"displayName\": \"Informix Unload\",\n+                                        \"value\": \"informix-unload\"\n+                                    },\n+                                    {\n+                                        \"description\": \"The format used by Informix when issuing the UNLOAD TO file_name command with escaping disabled\",\n+                                        \"displayName\": \"Informix Unload Escape Disabled\",\n+                                        \"value\": \"informix-unload-csv\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Same as custom format. Available for compatibility reasons.\",\n+                                        \"displayName\": \"Default Format\",\n+                                        \"value\": \"default\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Same as RFC 4180. Available for compatibility reasons.\",\n+                                        \"displayName\": \"RFC4180\",\n+                                        \"value\": \"RFC4180\"\n                                     }\n                                 ],\n-                                \"description\": \"Specify how initial listing should be handled. Used by 'Tracking Entities' strategy.\",\n-                                \"displayName\": \"Entity Tracking Initial Listing Target\",\n+                                \"defaultValue\": \"default\",\n+                                \"description\": \"Specifies which \\\"format\\\" the CSV data is in, or specifies if custom formatting should be used.\",\n+                                \"displayName\": \"CSV Format\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"et-initial-listing-target\",\n-                                \"required\": false,\n+                                \"name\": \"CSV Format\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"et-state-cache\": {\n+                            \"Character Set\": {\n+                                \"defaultValue\": \"UTF-8\",\n+                                \"description\": \"The Character Encoding that is used to decode the CSV file.\",\n+                                \"displayName\": \"Character Set\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Character Set\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Comment Marker\": {\n                                 \"dependencies\": [\n                                     {\n                                         \"dependentValues\": [\n-                                            \"entities\"\n+                                            \"custom\"\n                                         ],\n-                                        \"propertyDisplayName\": \"Listing Strategy\",\n-                                        \"propertyName\": \"listing-strategy\"\n+                                        \"propertyDisplayName\": \"CSV Format\",\n+                                        \"propertyName\": \"CSV Format\"\n                                     }\n                                 ],\n-                                \"description\": \"Listed entities are stored in the specified cache storage so that this processor can resume listing across NiFi restart or in case of primary node change. 'Tracking Entities' strategy require tracking information of all listed entities within the last 'Tracking Time Window'. To support large number of entities, the strategy uses DistributedMapCache instead of managed state. Cache key format is 'ListedEntities::{processorId}(::{nodeId})'. If it tracks per node listed entities, then the optional '::{nodeId}' part is added to manage state separately. E.g. cluster wide cache key = 'ListedEntities::8dda2321-0164-1000-50fa-3042fe7d6a7b', per node cache key = 'ListedEntities::8dda2321-0164-1000-50fa-3042fe7d6a7b::nifi-node3' The stored cache content is Gzipped JSON string. The cache key will be deleted when target listing configuration is changed. Used by 'Tracking Entities' strategy.\",\n-                                \"displayName\": \"Entity Tracking State Cache\",\n+                                \"description\": \"The character that is used to denote the start of a comment. Any line that begins with this comment will be ignored.\",\n+                                \"displayName\": \"Comment Marker\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"et-state-cache\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Comment Marker\",\n                                 \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.distributed.cache.client.DistributedMapCacheClient\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n+                                \"sensitive\": false\n                             },\n-                            \"et-time-window\": {\n-                                \"defaultValue\": \"3 hours\",\n+                            \"Escape Character\": {\n+                                \"defaultValue\": \"\\\\\",\n                                 \"dependencies\": [\n                                     {\n                                         \"dependentValues\": [\n-                                            \"entities\"\n+                                            \"custom\"\n                                         ],\n-                                        \"propertyDisplayName\": \"Listing Strategy\",\n-                                        \"propertyName\": \"listing-strategy\"\n+                                        \"propertyDisplayName\": \"CSV Format\",\n+                                        \"propertyName\": \"CSV Format\"\n                                     }\n                                 ],\n-                                \"description\": \"Specify how long this processor should track already-listed entities. 'Tracking Entities' strategy can pick any entity whose timestamp is inside the specified time window. For example, if set to '30 minutes', any entity having timestamp in recent 30 minutes will be the listing target when this processor runs. A listed entity is considered 'new/updated' and a FlowFile is emitted if one of following condition meets: 1. does not exist in the already-listed entities, 2. has newer timestamp than the cached entity, 3. has different size than the cached entity. If a cached entity's timestamp becomes older than specified time window, that entity will be removed from the cached already-listed entities. Used by 'Tracking Entities' strategy.\",\n-                                \"displayName\": \"Entity Tracking Time Window\",\n+                                \"description\": \"The character that is used to escape characters that would otherwise have a specific meaning to the CSV Parser. If the property has been specified via Expression Language but the expression gets evaluated to an invalid Escape Character at runtime, then it will be skipped and the default Escape Character will be used. Setting it to an empty string means no escape character should be used.\",\n+                                \"displayName\": \"Escape Character\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"et-time-window\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Escape Character\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"folder\": {\n-                                \"defaultValue\": \"/\",\n-                                \"description\": \"The Dropbox identifier or path of the folder from which to pull list of files. 'Folder' should match the following regular expression pattern: /.*|id:.* . Example for folder identifier: id:odTlUvbpIEAAAAAAAAAGGQ. Example for folder path: /Team1/Task1.\",\n-                                \"displayName\": \"Folder\",\n+                            \"Quote Character\": {\n+                                \"defaultValue\": \"\\\"\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"custom\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"CSV Format\",\n+                                        \"propertyName\": \"CSV Format\"\n+                                    }\n+                                ],\n+                                \"description\": \"The character that is used to quote values so that escape characters do not have to be used. If the property has been specified via Expression Language but the expression gets evaluated to an invalid Quote Character at runtime, then it will be skipped and the default Quote Character will be used.\",\n+                                \"displayName\": \"Quote Character\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"folder\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Quote Character\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"listing-strategy\": {\n+                            \"Quote Mode\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"This strategy tracks the latest timestamp of listed entity to determine new/updated entities. Since it only tracks few timestamps, it can manage listing state efficiently. However, any newly added, or updated entity having timestamp older than the tracked latest timestamp can not be picked by this strategy. For example, such situation can happen in a file system if a file with old timestamp is copied or moved into the target directory without its last modified timestamp being updated. Also may miss files when multiple subdirectories are being written at the same time while listing is running.\",\n-                                        \"displayName\": \"Tracking Timestamps\",\n-                                        \"value\": \"timestamps\"\n+                                        \"description\": \"All values will be quoted using the configured quote character.\",\n+                                        \"displayName\": \"Quote All Values\",\n+                                        \"value\": \"ALL\"\n                                     },\n                                     {\n-                                        \"description\": \"This strategy tracks information of all the listed entities within the latest 'Entity Tracking Time Window' to determine new/updated entities. This strategy can pick entities having old timestamp that can be missed with 'Tracking Timestamps'. Works even when multiple subdirectories are being written at the same time while listing is running. However additional DistributedMapCache controller service is required and more JVM heap memory is used. See the description of 'Entity Tracking Time Window' property for further details on how it works.\",\n-                                        \"displayName\": \"Tracking Entities\",\n-                                        \"value\": \"entities\"\n+                                        \"description\": \"Values will be quoted only if they are contain special characters such as newline characters or field separators.\",\n+                                        \"displayName\": \"Quote Minimal\",\n+                                        \"value\": \"MINIMAL\"\n                                     },\n                                     {\n-                                        \"description\": \"This strategy uses a sliding time window. The window starts where the previous window ended and ends with the 'current time'. One cycle will list files with modification time falling within the time window. Works even when multiple subdirectories are being written at the same time while listing is running. IMPORTANT: This strategy works properly only if the time on both the system hosting NiFi and the one hosting the files are accurate.\",\n-                                        \"displayName\": \"Time Window\",\n-                                        \"value\": \"time-window\"\n+                                        \"description\": \"Values will be quoted unless the value is a number.\",\n+                                        \"displayName\": \"Quote Non-Numeric Values\",\n+                                        \"value\": \"NON_NUMERIC\"\n                                     },\n                                     {\n-                                        \"description\": \"This strategy lists an entity without any tracking. The same entity will be listed each time on executing this processor. It is recommended to change the default run schedule value. Any property that related to the persisting state will be disregarded.\",\n-                                        \"displayName\": \"No Tracking\",\n-                                        \"value\": \"none\"\n+                                        \"description\": \"Values will not be quoted. Instead, all special characters will be escaped using the configured escape character.\",\n+                                        \"displayName\": \"Do Not Quote Values\",\n+                                        \"value\": \"NONE\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"timestamps\",\n-                                \"description\": \"Specify how to determine new/updated entities. See each strategy descriptions for detail.\",\n-                                \"displayName\": \"Listing Strategy\",\n+                                \"defaultValue\": \"MINIMAL\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"custom\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"CSV Format\",\n+                                        \"propertyName\": \"CSV Format\"\n+                                    }\n+                                ],\n+                                \"description\": \"Specifies how fields should be quoted when they are written\",\n+                                \"displayName\": \"Quote Mode\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"listing-strategy\",\n+                                \"name\": \"Quote Mode\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"min-age\": {\n-                                \"defaultValue\": \"0 sec\",\n-                                \"description\": \"The minimum age a file must be in order to be considered; any files newer than this will be ignored.\",\n-                                \"displayName\": \"Minimum File Age\",\n+                            \"Trim Fields\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"true\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"custom\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"CSV Format\",\n+                                        \"propertyName\": \"CSV Format\"\n+                                    }\n+                                ],\n+                                \"description\": \"Whether or not white space should be removed from the beginning and end of fields\",\n+                                \"displayName\": \"Trim Fields\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"min-age\",\n+                                \"name\": \"Trim Fields\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"proxy-configuration-service\": {\n-                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests. Supported proxies: HTTP + AuthN\",\n-                                \"displayName\": \"Proxy Configuration Service\",\n+                            \"Value Separator\": {\n+                                \"defaultValue\": \",\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"custom\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"CSV Format\",\n+                                        \"propertyName\": \"CSV Format\"\n+                                    }\n+                                ],\n+                                \"description\": \"The character that is used to separate values/fields in a CSV Record. If the property has been specified via Expression Language but the expression gets evaluated to an invalid Value Separator at runtime, then it will be skipped and the default Value Separator will be used.\",\n+                                \"displayName\": \"Value Separator\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"proxy-configuration-service\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.proxy.ProxyConfigurationService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Value Separator\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n                             },\n-                            \"record-writer\": {\n-                                \"description\": \"Specifies the Record Writer to use for creating the listing. If not specified, one FlowFile will be created for each entity that is listed. If the Record Writer is specified, all entities will be written to a single FlowFile instead of adding attributes to individual FlowFiles.\",\n-                                \"displayName\": \"Record Writer\",\n+                            \"csv-file\": {\n+                                \"description\": \"Path to a CSV File in which the key value pairs can be looked up.\",\n+                                \"displayName\": \"CSV File\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"record-writer\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"csv-file\",\n+                                \"required\": true,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"SINGLE\",\n+                                    \"resourceTypes\": [\n+                                        \"FILE\"\n+                                    ]\n+                                },\n+                                \"sensitive\": false\n                             },\n-                            \"recursive-search\": {\n+                            \"ignore-duplicates\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"true\",\n                                         \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"false\",\n                                         \"value\": \"false\"\n                                     }\n                                 ],\n                                 \"defaultValue\": \"true\",\n-                                \"description\": \"Indicates whether to list files from subfolders of the Dropbox folder.\",\n-                                \"displayName\": \"Search Recursively\",\n+                                \"description\": \"Ignore duplicate keys for records in the CSV file.\",\n+                                \"displayName\": \"Ignore Duplicates\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"recursive-search\",\n+                                \"name\": \"ignore-duplicates\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"lookup-key-column\": {\n+                                \"description\": \"The field in the CSV file that will serve as the lookup key. This is the field that will be matched against the property specified in the lookup processor.\",\n+                                \"displayName\": \"Lookup Key Column\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"lookup-key-column\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             }\n                         },\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.processors.dropbox.FetchDropbox\",\n-                            \"org.apache.nifi.processors.dropbox.PutDropbox\"\n-                        ],\n-                        \"sideEffectFree\": false,\n-                        \"stateful\": {\n-                            \"description\": \"The processor stores necessary data to be able to keep track what files have been listed already. What exactly needs to be stored depends on the 'Listing Strategy'.\",\n-                            \"scopes\": [\n-                                \"CLUSTER\"\n-                            ]\n-                        },\n-                        \"supportedRelationships\": [\n+                        \"providedApiImplementations\": [\n                             {\n-                                \"description\": \"All FlowFiles that are received are routed to success\",\n-                                \"name\": \"success\"\n+                                \"artifact\": \"nifi-standard-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.lookup.LookupService\",\n+                                \"version\": \"1.27.0\"\n+                            },\n+                            {\n+                                \"artifact\": \"nifi-standard-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.lookup.RecordLookupService\",\n+                                \"version\": \"1.27.0\"\n                             }\n                         ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": false,\n+                        \"restricted\": true,\n                         \"supportsDynamicProperties\": false,\n-                        \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"dropbox\",\n-                            \"storage\"\n+                            \"cache\",\n+                            \"csv\",\n+                            \"enrich\",\n+                            \"join\",\n+                            \"key\",\n+                            \"lookup\",\n+                            \"record\",\n+                            \"reloadable\",\n+                            \"value\"\n                         ],\n-                        \"triggerSerially\": true,\n-                        \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.dropbox.ListDropbox\",\n-                        \"typeDescription\": \"Retrieves a listing of files from Dropbox (shortcuts are ignored). Each listed file may result in one FlowFile, the metadata being written as FlowFile attributes. When the 'Record Writer' property is set, the entire result is written as records to a single FlowFile. This Processor is designed to run on Primary Node only in a cluster. If the primary node changes, the new Primary Node will pick up where the previous node left off without duplicating all of the data.\",\n-                        \"version\": \"1.27.0\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"The Dropbox identifier of the file\",\n-                                \"name\": \"dropbox.id\"\n-                            },\n-                            {\n-                                \"description\": \"The folder path where the file is located\",\n-                                \"name\": \"path\"\n-                            },\n-                            {\n-                                \"description\": \"The name of the file\",\n-                                \"name\": \"filename\"\n-                            },\n-                            {\n-                                \"description\": \"The size of the file\",\n-                                \"name\": \"dropbox.size\"\n-                            },\n-                            {\n-                                \"description\": \"The server modified time of the file\",\n-                                \"name\": \"dropbox.timestamp\"\n-                            },\n-                            {\n-                                \"description\": \"Revision of the file\",\n-                                \"name\": \"dropbox.revision\"\n-                            }\n-                        ]\n+                        \"type\": \"org.apache.nifi.lookup.CSVRecordLookupService\",\n+                        \"typeDescription\": \"A reloadable CSV file-based lookup service. When the lookup key is found in the CSV file, the columns are returned as a Record. All returned fields will be strings. The first line of the csv file is considered as header.\",\n+                        \"version\": \"1.27.0\"\n                     },\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-dropbox-processors-nar\",\n+                        \"artifact\": \"nifi-lookup-services-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n-                        \"defaultBulletinLevel\": \"WARN\",\n-                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": 1,\n-                            \"TIMER_DRIVEN\": 1\n-                        },\n-                        \"defaultPenaltyDuration\": \"30 sec\",\n-                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"0 sec\"\n-                        },\n-                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n-                        \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_REQUIRED\",\n-                        \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"chunked-upload-size\": {\n-                                \"defaultValue\": \"8 MB\",\n-                                \"description\": \"Defines the size of a chunk. Used when a FlowFile's size exceeds 'Chunked Upload Threshold' and content is uploaded in smaller chunks. It is recommended to specify chunked upload size smaller than 'Chunked Upload Threshold' and as multiples of 4 MB. Maximum allowed value is 150 MB.\",\n-                                \"displayName\": \"Chunked Upload Size\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"chunked-upload-size\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"chunked-upload-threshold\": {\n-                                \"defaultValue\": \"150 MB\",\n-                                \"description\": \"The maximum size of the content which is uploaded at once. FlowFiles larger than this threshold are uploaded in chunks. Maximum allowed value is 150 MB.\",\n-                                \"displayName\": \"Chunked Upload Threshold\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"chunked-upload-threshold\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"conflict-resolution-strategy\": {\n+                            \"character-encoding\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Handle file conflict as failure.\",\n-                                        \"displayName\": \"fail\",\n-                                        \"value\": \"fail\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"ISO-8859-1\",\n+                                        \"value\": \"ISO-8859-1\"\n                                     },\n                                     {\n-                                        \"description\": \"Ignore conflict, do not change the original file.\",\n-                                        \"displayName\": \"ignore\",\n-                                        \"value\": \"ignore\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"UTF-8\",\n+                                        \"value\": \"UTF-8\"\n                                     },\n                                     {\n-                                        \"description\": \"Replace existing file in case of conflict.\",\n-                                        \"displayName\": \"replace\",\n-                                        \"value\": \"replace\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"UTF-16\",\n+                                        \"value\": \"UTF-16\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"UTF-16LE\",\n+                                        \"value\": \"UTF-16LE\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"UTF-16BE\",\n+                                        \"value\": \"UTF-16BE\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"US-ASCII\",\n+                                        \"value\": \"US-ASCII\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"fail\",\n-                                \"description\": \"Indicates what should happen when a file with the same name already exists in the specified Dropbox folder.\",\n-                                \"displayName\": \"Conflict Resolution Strategy\",\n+                                \"defaultValue\": \"UTF-8\",\n+                                \"description\": \"Specifies a character encoding to use.\",\n+                                \"displayName\": \"Character Encoding\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"conflict-resolution-strategy\",\n+                                \"name\": \"character-encoding\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"dropbox-credential-service\": {\n-                                \"description\": \"Controller Service used to obtain Dropbox credentials (App Key, App Secret, Access Token, Refresh Token). See controller service's Additional Details for more information.\",\n-                                \"displayName\": \"Dropbox Credential Service\",\n+                            \"distributed-map-cache-service\": {\n+                                \"description\": \"The Controller Service that is used to get the cached values.\",\n+                                \"displayName\": \"Distributed Cache Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"dropbox-credential-service\",\n-                                \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-dropbox-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.dropbox.credentials.service.DropboxCredentialService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            },\n-                            \"file-name\": {\n-                                \"defaultValue\": \"${filename}\",\n-                                \"description\": \"The full name of the file to upload.\",\n-                                \"displayName\": \"Filename\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"file-name\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"folder\": {\n-                                \"defaultValue\": \"/\",\n-                                \"description\": \"The path of the Dropbox folder to upload files to. The folder will be created if it does not exist yet.\",\n-                                \"displayName\": \"Folder\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"folder\",\n+                                \"name\": \"distributed-map-cache-service\",\n                                 \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"proxy-configuration-service\": {\n-                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests. Supported proxies: HTTP + AuthN\",\n-                                \"displayName\": \"Proxy Configuration Service\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"proxy-configuration-service\",\n-                                \"required\": false,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n                                     \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.proxy.ProxyConfigurationService\",\n+                                    \"type\": \"org.apache.nifi.distributed.cache.client.DistributedMapCacheClient\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             }\n                         },\n-                        \"readsAttributes\": [\n-                            {\n-                                \"description\": \"Uses the FlowFile's filename as the filename for the Dropbox object.\",\n-                                \"name\": \"filename\"\n-                            }\n-                        ],\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.processors.dropbox.FetchDropbox\",\n-                            \"org.apache.nifi.processors.dropbox.ListDropbox\"\n-                        ],\n-                        \"sideEffectFree\": false,\n-                        \"supportedRelationships\": [\n+                        \"providedApiImplementations\": [\n                             {\n-                                \"description\": \"Files that have been successfully written to Dropbox are transferred to this relationship.\",\n-                                \"name\": \"success\"\n+                                \"artifact\": \"nifi-standard-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.lookup.StringLookupService\",\n+                                \"version\": \"1.27.0\"\n                             },\n                             {\n-                                \"description\": \"Files that could not be written to Dropbox for some reason are transferred to this relationship.\",\n-                                \"name\": \"failure\"\n+                                \"artifact\": \"nifi-standard-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.lookup.LookupService\",\n+                                \"version\": \"1.27.0\"\n                             }\n                         ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n-                        \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"dropbox\",\n-                            \"put\",\n-                            \"storage\"\n+                            \"cache\",\n+                            \"distributed\",\n+                            \"enrich\",\n+                            \"key\",\n+                            \"lookup\",\n+                            \"map\",\n+                            \"value\"\n                         ],\n-                        \"triggerSerially\": false,\n-                        \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.dropbox.PutDropbox\",\n-                        \"typeDescription\": \"Puts content to a Dropbox folder.\",\n-                        \"version\": \"1.27.0\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"The error message returned by Dropbox\",\n-                                \"name\": \"error.message\"\n-                            },\n-                            {\n-                                \"description\": \"The Dropbox identifier of the file\",\n-                                \"name\": \"dropbox.id\"\n-                            },\n-                            {\n-                                \"description\": \"The folder path where the file is located\",\n-                                \"name\": \"path\"\n-                            },\n-                            {\n-                                \"description\": \"The name of the file\",\n-                                \"name\": \"filename\"\n-                            },\n-                            {\n-                                \"description\": \"The size of the file\",\n-                                \"name\": \"dropbox.size\"\n-                            },\n-                            {\n-                                \"description\": \"The server modified time of the file\",\n-                                \"name\": \"dropbox.timestamp\"\n-                            },\n-                            {\n-                                \"description\": \"Revision of the file\",\n-                                \"name\": \"dropbox.revision\"\n-                            }\n-                        ]\n-                    }\n-                ],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"1.27.0\"\n-        },\n-        {\n-            \"artifact\": \"nifi-couchbase-services-api-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [],\n-                \"processors\": [],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"1.27.0\"\n-        },\n-        {\n-            \"artifact\": \"nifi-standard-services-api-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [],\n-                \"processors\": [],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"1.27.0\"\n-        },\n-        {\n-            \"artifact\": \"nifi-cassandra-services-api-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [],\n-                \"processors\": [],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"1.27.0\"\n-        },\n-        {\n-            \"artifact\": \"nifi-rethinkdb-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [],\n-                \"processors\": [\n+                        \"type\": \"org.apache.nifi.lookup.DistributedMapCacheLookupService\",\n+                        \"typeDescription\": \"Allows to choose a distributed map cache client to retrieve the value associated to a key. The coordinates that are passed to the lookup must contain the key 'key'.\",\n+                        \"version\": \"1.27.0\"\n+                    },\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-rethinkdb-nar\",\n+                        \"artifact\": \"nifi-lookup-services-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n-                        \"defaultBulletinLevel\": \"WARN\",\n-                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": 1,\n-                            \"EVENT_DRIVEN\": 0,\n-                            \"TIMER_DRIVEN\": 1\n-                        },\n-                        \"defaultPenaltyDuration\": \"30 sec\",\n-                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"0 sec\"\n-                        },\n-                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n-                        \"defaultYieldDuration\": \"1 sec\",\n-                        \"deprecated\": true,\n-                        \"deprecationReason\": \"RethinkDB 2.4 requires API changes that would alter the configuration and behavior of this Processor\",\n+                        \"explicitRestrictions\": [\n+                            {\n+                                \"explanation\": \"Provides operator the ability to read from any file that NiFi has access to.\",\n+                                \"requiredPermission\": \"read filesystem\"\n+                            }\n+                        ],\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_REQUIRED\",\n-                        \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"rethinkdb-charset\": {\n-                                \"defaultValue\": \"UTF-8\",\n-                                \"description\": \"Specifies the character set of the document data.\",\n-                                \"displayName\": \"Character Set\",\n+                            \"configuration-file\": {\n+                                \"description\": \"A configuration file\",\n+                                \"displayName\": \"Configuration File\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"rethinkdb-charset\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"configuration-file\",\n                                 \"required\": true,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"SINGLE\",\n+                                    \"resourceTypes\": [\n+                                        \"FILE\"\n+                                    ]\n+                                },\n                                 \"sensitive\": false\n+                            }\n+                        },\n+                        \"providedApiImplementations\": [\n+                            {\n+                                \"artifact\": \"nifi-standard-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.lookup.StringLookupService\",\n+                                \"version\": \"1.27.0\"\n                             },\n-                            \"rethinkdb-dbname\": {\n-                                \"description\": \"RethinkDB database to connect to\",\n-                                \"displayName\": \"DB Name\",\n+                            {\n+                                \"artifact\": \"nifi-standard-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.lookup.LookupService\",\n+                                \"version\": \"1.27.0\"\n+                            }\n+                        ],\n+                        \"restricted\": true,\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"cache\",\n+                            \"enrich\",\n+                            \"join\",\n+                            \"key\",\n+                            \"lookup\",\n+                            \"properties\",\n+                            \"reloadable\",\n+                            \"value\"\n+                        ],\n+                        \"type\": \"org.apache.nifi.lookup.PropertiesFileLookupService\",\n+                        \"typeDescription\": \"A reloadable properties file-based lookup service\",\n+                        \"version\": \"1.27.0\"\n+                    },\n+                    {\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-lookup-services-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"e0c4461\"\n+                        },\n+                        \"dynamicProperties\": [\n+                            {\n+                                \"description\": \"All dynamic properties are added as HTTP headers with the name as the header name and the value as the header value.\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"name\": \"*\",\n+                                \"value\": \"*\"\n+                            }\n+                        ],\n+                        \"group\": \"org.apache.nifi\",\n+                        \"propertyDescriptors\": {\n+                            \"proxy-configuration-service\": {\n+                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests. If set, it supersedes proxy settings configured per component. Supported proxies: SOCKS, HTTP + AuthN In case of SOCKS, it is not guaranteed that the selected SOCKS Version will be used by the processor.\",\n+                                \"displayName\": \"Proxy Configuration Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"rethinkdb-dbname\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n+                                \"name\": \"proxy-configuration-service\",\n+                                \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.proxy.ProxyConfigurationService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n                             },\n-                            \"rethinkdb-document-identifier\": {\n-                                \"description\": \"A FlowFile attribute, or attribute expression used for determining RethinkDB key for the Flow File content\",\n-                                \"displayName\": \"Document Identifier\",\n+                            \"rest-lookup-basic-auth-password\": {\n+                                \"description\": \"The password to be used by the client to authenticate against the Remote URL.\",\n+                                \"displayName\": \"Basic Authentication Password\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"rethinkdb-document-identifier\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"rest-lookup-basic-auth-password\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n                             },\n-                            \"rethinkdb-durability\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"Save change to disk before ack\",\n-                                        \"displayName\": \"Hard\",\n-                                        \"value\": \"hard\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Don't save changes to disk before ack\",\n-                                        \"displayName\": \"Soft\",\n-                                        \"value\": \"soft\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"hard\",\n-                                \"description\": \"Durability of documents being inserted\",\n-                                \"displayName\": \"Durablity of documents\",\n+                            \"rest-lookup-basic-auth-username\": {\n+                                \"description\": \"The username to be used by the client to authenticate against the Remote URL.  Cannot include control characters (0-31), ':', or DEL (127).\",\n+                                \"displayName\": \"Basic Authentication Username\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"rethinkdb-durability\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"rest-lookup-basic-auth-username\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"rethinkdb-host\": {\n-                                \"defaultValue\": \"localhost\",\n-                                \"description\": \"RethinkDB hostname\",\n-                                \"displayName\": \"Hostname\",\n+                            \"rest-lookup-connection-timeout\": {\n+                                \"defaultValue\": \"5 secs\",\n+                                \"description\": \"Max wait time for connection to remote service.\",\n+                                \"displayName\": \"Connection Timeout\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"rethinkdb-host\",\n+                                \"name\": \"rest-lookup-connection-timeout\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"rethinkdb-password\": {\n-                                \"description\": \"Password for user\",\n-                                \"displayName\": \"Password\",\n+                            \"rest-lookup-digest-auth\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"Whether to communicate with the website using Digest Authentication. 'Basic Authentication Username' and 'Basic Authentication Password' are used for authentication.\",\n+                                \"displayName\": \"Use Digest Authentication\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"rethinkdb-password\",\n+                                \"name\": \"rest-lookup-digest-auth\",\n                                 \"required\": false,\n-                                \"sensitive\": true\n+                                \"sensitive\": false\n                             },\n-                            \"rethinkdb-port\": {\n-                                \"defaultValue\": \"28015\",\n-                                \"description\": \"RethinkDB database port to connect to\",\n-                                \"displayName\": \"DB Port\",\n+                            \"rest-lookup-read-timeout\": {\n+                                \"defaultValue\": \"15 secs\",\n+                                \"description\": \"Max wait time for response from remote service.\",\n+                                \"displayName\": \"Read Timeout\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"rethinkdb-port\",\n+                                \"name\": \"rest-lookup-read-timeout\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"rethinkdb-return-result\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"Return changed document\",\n-                                        \"displayName\": \"True\",\n-                                        \"value\": \"true\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Do not return changed document\",\n-                                        \"displayName\": \"False\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"true\",\n-                                \"description\": \"Return old value which were deleted\",\n-                                \"displayName\": \"Return deleted value\",\n+                            \"rest-lookup-record-path\": {\n+                                \"description\": \"An optional record path that can be used to define where in a record to get the real data to merge into the record set to be enriched. See documentation for examples of when this might be useful.\",\n+                                \"displayName\": \"Record Path\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"rethinkdb-return-result\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"rest-lookup-record-path\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"rethinkdb-table\": {\n-                                \"description\": \"RethinkDB table to connect to\",\n-                                \"displayName\": \"Table name\",\n+                            \"rest-lookup-record-reader\": {\n+                                \"description\": \"The record reader to use for loading the payload and handling it as a record set.\",\n+                                \"displayName\": \"Record Reader\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"rethinkdb-table\",\n+                                \"name\": \"rest-lookup-record-reader\",\n                                 \"required\": true,\n-                                \"sensitive\": false\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n                             },\n-                            \"rethinkdb-username\": {\n-                                \"description\": \"Username for accessing RethinkDB\",\n-                                \"displayName\": \"Username\",\n+                            \"rest-lookup-ssl-context-service\": {\n+                                \"description\": \"The SSL Context Service used to provide client certificate information for TLS/SSL connections.\",\n+                                \"displayName\": \"SSL Context Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"rethinkdb-username\",\n+                                \"name\": \"rest-lookup-ssl-context-service\",\n                                 \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"rest-lookup-url\": {\n+                                \"description\": \"The URL for the REST endpoint. Expression language is evaluated against the lookup key/value pairs, not flowfile attributes.\",\n+                                \"displayName\": \"URL\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"rest-lookup-url\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             }\n                         },\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.processors.rethinkdb.GetRethinkDB\",\n-                            \"org.apache.nifi.processors.rethinkdb.PutRethinkDB\"\n-                        ],\n-                        \"sideEffectFree\": false,\n-                        \"supportedRelationships\": [\n-                            {\n-                                \"description\": \"Sucessful FlowFiles are routed to this relationship\",\n-                                \"name\": \"success\"\n-                            },\n+                        \"providedApiImplementations\": [\n                             {\n-                                \"description\": \"Document not found are routed to this relationship\",\n-                                \"name\": \"not_found\"\n+                                \"artifact\": \"nifi-standard-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.lookup.LookupService\",\n+                                \"version\": \"1.27.0\"\n                             },\n                             {\n-                                \"description\": \"Failed FlowFiles are routed to this relationship\",\n-                                \"name\": \"failure\"\n+                                \"artifact\": \"nifi-standard-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.lookup.RecordLookupService\",\n+                                \"version\": \"1.27.0\"\n                             }\n                         ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\",\n-                            \"EVENT_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": false,\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": true,\n-                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"supportsDynamicProperties\": true,\n+                        \"supportsSensitiveDynamicProperties\": true,\n                         \"tags\": [\n-                            \"delete\",\n-                            \"remove\",\n-                            \"rethinkdb\"\n+                            \"http\",\n+                            \"json\",\n+                            \"lookup\",\n+                            \"rest\",\n+                            \"xml\"\n                         ],\n-                        \"triggerSerially\": false,\n-                        \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.rethinkdb.DeleteRethinkDB\",\n-                        \"typeDescription\": \"Processor to remove a JSON document from RethinkDB (https://www.rethinkdb.com/) using the document id.\",\n-                        \"version\": \"1.27.0\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"RethinkDB error message\",\n-                                \"name\": \"rethinkdb.error.message\"\n-                            },\n-                            {\n-                                \"description\": \"Error count while delete documents\",\n-                                \"name\": \"rethinkdb.delete.errors\"\n-                            },\n+                        \"type\": \"org.apache.nifi.lookup.RestLookupService\",\n+                        \"typeDescription\": \"Use a REST service to look up values.\",\n+                        \"version\": \"1.27.0\"\n+                    },\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-lookup-services-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"e0c4461\"\n+                        },\n+                        \"explicitRestrictions\": [\n                             {\n-                                \"description\": \"Number of documents deleted\",\n-                                \"name\": \"rethinkdb.delete.deleted\"\n-                            },\n-                            {\n-                                \"description\": \"Number of documents inserted\",\n-                                \"name\": \"rethinkdb.delete.inserted\"\n-                            },\n-                            {\n-                                \"description\": \"Number of documents replaced\",\n-                                \"name\": \"rethinkdb.delete.replaced\"\n-                            },\n-                            {\n-                                \"description\": \"Number of documents skipped\",\n-                                \"name\": \"rethinkdb.delete.skipped\"\n-                            },\n-                            {\n-                                \"description\": \"Number of documents unchanged since they already existed\",\n-                                \"name\": \"rethinkdb.delete.unchanged\"\n+                                \"explanation\": \"Provides operator the ability to read from any file that NiFi has access to.\",\n+                                \"requiredPermission\": \"read filesystem\"\n                             }\n-                        ]\n-                    },\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-rethinkdb-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"e0c4461\"\n-                        },\n-                        \"defaultBulletinLevel\": \"WARN\",\n-                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": 1,\n-                            \"EVENT_DRIVEN\": 0,\n-                            \"TIMER_DRIVEN\": 1\n-                        },\n-                        \"defaultPenaltyDuration\": \"30 sec\",\n-                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"0 sec\"\n-                        },\n-                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n-                        \"defaultYieldDuration\": \"1 sec\",\n-                        \"deprecated\": true,\n-                        \"deprecationReason\": \"RethinkDB 2.4 requires API changes that would alter the configuration and behavior of this Processor\",\n+                        ],\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_REQUIRED\",\n-                        \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"rethinkdb-charset\": {\n-                                \"defaultValue\": \"UTF-8\",\n-                                \"description\": \"Specifies the character set of the document data.\",\n-                                \"displayName\": \"Character Set\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"rethinkdb-charset\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"rethinkdb-dbname\": {\n-                                \"description\": \"RethinkDB database to connect to\",\n-                                \"displayName\": \"DB Name\",\n+                            \"CSV Format\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"The format of the CSV is configured by using the properties of this Controller Service, such as Value Separator\",\n+                                        \"displayName\": \"Custom Format\",\n+                                        \"value\": \"custom\"\n+                                    },\n+                                    {\n+                                        \"description\": \"CSV data follows the RFC 4180 Specification defined at https://tools.ietf.org/html/rfc4180\",\n+                                        \"displayName\": \"RFC 4180\",\n+                                        \"value\": \"rfc-4180\"\n+                                    },\n+                                    {\n+                                        \"description\": \"CSV data follows the format used by Microsoft Excel\",\n+                                        \"displayName\": \"Microsoft Excel\",\n+                                        \"value\": \"excel\"\n+                                    },\n+                                    {\n+                                        \"description\": \"CSV data is Tab-Delimited instead of Comma Delimited\",\n+                                        \"displayName\": \"Tab-Delimited\",\n+                                        \"value\": \"tdf\"\n+                                    },\n+                                    {\n+                                        \"description\": \"CSV data follows the format used by MySQL\",\n+                                        \"displayName\": \"MySQL Format\",\n+                                        \"value\": \"mysql\"\n+                                    },\n+                                    {\n+                                        \"description\": \"The format used by Informix when issuing the UNLOAD TO file_name command\",\n+                                        \"displayName\": \"Informix Unload\",\n+                                        \"value\": \"informix-unload\"\n+                                    },\n+                                    {\n+                                        \"description\": \"The format used by Informix when issuing the UNLOAD TO file_name command with escaping disabled\",\n+                                        \"displayName\": \"Informix Unload Escape Disabled\",\n+                                        \"value\": \"informix-unload-csv\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Same as custom format. Available for compatibility reasons.\",\n+                                        \"displayName\": \"Default Format\",\n+                                        \"value\": \"default\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Same as RFC 4180. Available for compatibility reasons.\",\n+                                        \"displayName\": \"RFC4180\",\n+                                        \"value\": \"RFC4180\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"default\",\n+                                \"description\": \"Specifies which \\\"format\\\" the CSV data is in, or specifies if custom formatting should be used.\",\n+                                \"displayName\": \"CSV Format\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"rethinkdb-dbname\",\n+                                \"name\": \"CSV Format\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"rethinkdb-document-identifier\": {\n-                                \"description\": \"A FlowFile attribute, or attribute expression used for determining RethinkDB key for the Flow File content\",\n-                                \"displayName\": \"Document Identifier\",\n+                            \"Character Set\": {\n+                                \"defaultValue\": \"UTF-8\",\n+                                \"description\": \"The Character Encoding that is used to decode the CSV file.\",\n+                                \"displayName\": \"Character Set\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"rethinkdb-document-identifier\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Character Set\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"rethinkdb-host\": {\n-                                \"defaultValue\": \"localhost\",\n-                                \"description\": \"RethinkDB hostname\",\n-                                \"displayName\": \"Hostname\",\n+                            \"Comment Marker\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"custom\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"CSV Format\",\n+                                        \"propertyName\": \"CSV Format\"\n+                                    }\n+                                ],\n+                                \"description\": \"The character that is used to denote the start of a comment. Any line that begins with this comment will be ignored.\",\n+                                \"displayName\": \"Comment Marker\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"rethinkdb-host\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Comment Marker\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"rethinkdb-max-document-size\": {\n-                                \"defaultValue\": \"1 MB\",\n-                                \"description\": \"Maximum size of documents allowed to be posted in one batch\",\n-                                \"displayName\": \"Max size of documents\",\n+                            \"Escape Character\": {\n+                                \"defaultValue\": \"\\\\\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"custom\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"CSV Format\",\n+                                        \"propertyName\": \"CSV Format\"\n+                                    }\n+                                ],\n+                                \"description\": \"The character that is used to escape characters that would otherwise have a specific meaning to the CSV Parser. If the property has been specified via Expression Language but the expression gets evaluated to an invalid Escape Character at runtime, then it will be skipped and the default Escape Character will be used. Setting it to an empty string means no escape character should be used.\",\n+                                \"displayName\": \"Escape Character\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"rethinkdb-max-document-size\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Escape Character\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"rethinkdb-password\": {\n-                                \"description\": \"Password for user\",\n-                                \"displayName\": \"Password\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"rethinkdb-password\",\n-                                \"required\": false,\n-                                \"sensitive\": true\n-                            },\n-                            \"rethinkdb-port\": {\n-                                \"defaultValue\": \"28015\",\n-                                \"description\": \"RethinkDB database port to connect to\",\n-                                \"displayName\": \"DB Port\",\n+                            \"Quote Character\": {\n+                                \"defaultValue\": \"\\\"\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"custom\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"CSV Format\",\n+                                        \"propertyName\": \"CSV Format\"\n+                                    }\n+                                ],\n+                                \"description\": \"The character that is used to quote values so that escape characters do not have to be used. If the property has been specified via Expression Language but the expression gets evaluated to an invalid Quote Character at runtime, then it will be skipped and the default Quote Character will be used.\",\n+                                \"displayName\": \"Quote Character\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"rethinkdb-port\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Quote Character\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"rethinkdb-read-mode\": {\n+                            \"Quote Mode\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Read values from memory from primary replica (Default)\",\n-                                        \"displayName\": \"Single\",\n-                                        \"value\": \"single\"\n+                                        \"description\": \"All values will be quoted using the configured quote character.\",\n+                                        \"displayName\": \"Quote All Values\",\n+                                        \"value\": \"ALL\"\n                                     },\n                                     {\n-                                        \"description\": \"Read values committed to disk on majority of replicas\",\n-                                        \"displayName\": \"Majority\",\n-                                        \"value\": \"majority\"\n+                                        \"description\": \"Values will be quoted only if they are contain special characters such as newline characters or field separators.\",\n+                                        \"displayName\": \"Quote Minimal\",\n+                                        \"value\": \"MINIMAL\"\n                                     },\n                                     {\n-                                        \"description\": \"Read values from memory from an arbitrary replica \",\n-                                        \"displayName\": \"Outdated\",\n-                                        \"value\": \"outdated\"\n+                                        \"description\": \"Values will be quoted unless the value is a number.\",\n+                                        \"displayName\": \"Quote Non-Numeric Values\",\n+                                        \"value\": \"NON_NUMERIC\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Values will not be quoted. Instead, all special characters will be escaped using the configured escape character.\",\n+                                        \"displayName\": \"Do Not Quote Values\",\n+                                        \"value\": \"NONE\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"single\",\n-                                \"description\": \"Read mode used for consistency\",\n-                                \"displayName\": \"Read Mode\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"rethinkdb-read-mode\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"rethinkdb-table\": {\n-                                \"description\": \"RethinkDB table to connect to\",\n-                                \"displayName\": \"Table name\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"rethinkdb-table\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"rethinkdb-username\": {\n-                                \"description\": \"Username for accessing RethinkDB\",\n-                                \"displayName\": \"Username\",\n+                                \"defaultValue\": \"MINIMAL\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"custom\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"CSV Format\",\n+                                        \"propertyName\": \"CSV Format\"\n+                                    }\n+                                ],\n+                                \"description\": \"Specifies how fields should be quoted when they are written\",\n+                                \"displayName\": \"Quote Mode\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"rethinkdb-username\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            }\n-                        },\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.processors.rethinkdb.DeleteRethinkDB\",\n-                            \"org.apache.nifi.processors.rethinkdb.PutRethinkDB\"\n-                        ],\n-                        \"sideEffectFree\": false,\n-                        \"supportedRelationships\": [\n-                            {\n-                                \"description\": \"Sucessful FlowFiles are routed to this relationship\",\n-                                \"name\": \"success\"\n-                            },\n-                            {\n-                                \"description\": \"Document not found are routed to this relationship\",\n-                                \"name\": \"not_found\"\n-                            },\n-                            {\n-                                \"description\": \"Failed FlowFiles are routed to this relationship\",\n-                                \"name\": \"failure\"\n-                            }\n-                        ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\",\n-                            \"EVENT_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": false,\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": true,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"fetch\",\n-                            \"get\",\n-                            \"read\",\n-                            \"rethinkdb\"\n-                        ],\n-                        \"triggerSerially\": false,\n-                        \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.rethinkdb.GetRethinkDB\",\n-                        \"typeDescription\": \"Processor to get a JSON document from RethinkDB (https://www.rethinkdb.com/) using the document id. The FlowFile will contain the retrieved document\",\n-                        \"version\": \"1.27.0\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"RethinkDB error message\",\n-                                \"name\": \"rethinkdb.error.message\"\n-                            }\n-                        ]\n-                    },\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-rethinkdb-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"e0c4461\"\n-                        },\n-                        \"defaultBulletinLevel\": \"WARN\",\n-                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": 1,\n-                            \"EVENT_DRIVEN\": 0,\n-                            \"TIMER_DRIVEN\": 1\n-                        },\n-                        \"defaultPenaltyDuration\": \"30 sec\",\n-                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"0 sec\"\n-                        },\n-                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n-                        \"defaultYieldDuration\": \"1 sec\",\n-                        \"deprecated\": true,\n-                        \"deprecationReason\": \"RethinkDB 2.4 requires API changes that would alter the configuration and behavior of this Processor\",\n-                        \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_REQUIRED\",\n-                        \"primaryNodeOnly\": false,\n-                        \"propertyDescriptors\": {\n-                            \"rethinkdb-charset\": {\n-                                \"defaultValue\": \"UTF-8\",\n-                                \"description\": \"Specifies the character set of the document data.\",\n-                                \"displayName\": \"Character Set\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"rethinkdb-charset\",\n+                                \"name\": \"Quote Mode\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"rethinkdb-conflict-strategy\": {\n+                            \"Trim Fields\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Update the document having same id with new values\",\n-                                        \"displayName\": \"Update\",\n-                                        \"value\": \"update\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n-                                        \"description\": \"Replace the document with having same id new document\",\n-                                        \"displayName\": \"Replace\",\n-                                        \"value\": \"replace\"\n-                                    },\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"true\",\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"Return error if the document with same id exists\",\n-                                        \"displayName\": \"Error\",\n-                                        \"value\": \"error\"\n+                                        \"dependentValues\": [\n+                                            \"custom\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"CSV Format\",\n+                                        \"propertyName\": \"CSV Format\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"update\",\n-                                \"description\": \"Conflict strategy to be used in case of inserting existing document.\",\n-                                \"displayName\": \"Conflict strategy\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"rethinkdb-conflict-strategy\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"rethinkdb-dbname\": {\n-                                \"description\": \"RethinkDB database to connect to\",\n-                                \"displayName\": \"DB Name\",\n+                                \"description\": \"Whether or not white space should be removed from the beginning and end of fields\",\n+                                \"displayName\": \"Trim Fields\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"rethinkdb-dbname\",\n+                                \"name\": \"Trim Fields\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"rethinkdb-durability\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"Save change to disk before ack\",\n-                                        \"displayName\": \"Hard\",\n-                                        \"value\": \"hard\"\n-                                    },\n+                            \"Value Separator\": {\n+                                \"defaultValue\": \",\",\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"Don't save changes to disk before ack\",\n-                                        \"displayName\": \"Soft\",\n-                                        \"value\": \"soft\"\n+                                        \"dependentValues\": [\n+                                            \"custom\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"CSV Format\",\n+                                        \"propertyName\": \"CSV Format\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"hard\",\n-                                \"description\": \"Durability of documents being inserted\",\n-                                \"displayName\": \"Durablity of documents\",\n+                                \"description\": \"The character that is used to separate values/fields in a CSV Record. If the property has been specified via Expression Language but the expression gets evaluated to an invalid Value Separator at runtime, then it will be skipped and the default Value Separator will be used.\",\n+                                \"displayName\": \"Value Separator\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"rethinkdb-durability\",\n+                                \"name\": \"Value Separator\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"rethinkdb-host\": {\n-                                \"defaultValue\": \"localhost\",\n-                                \"description\": \"RethinkDB hostname\",\n-                                \"displayName\": \"Hostname\",\n+                            \"csv-file\": {\n+                                \"description\": \"Path to a CSV File in which the key value pairs can be looked up.\",\n+                                \"displayName\": \"CSV File\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"rethinkdb-host\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"csv-file\",\n                                 \"required\": true,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"SINGLE\",\n+                                    \"resourceTypes\": [\n+                                        \"FILE\"\n+                                    ]\n+                                },\n                                 \"sensitive\": false\n                             },\n-                            \"rethinkdb-max-document-size\": {\n-                                \"defaultValue\": \"1 MB\",\n-                                \"description\": \"Maximum size of documents allowed to be posted in one batch\",\n-                                \"displayName\": \"Max size of documents\",\n+                            \"ignore-duplicates\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"true\",\n+                                \"description\": \"Ignore duplicate keys for records in the CSV file.\",\n+                                \"displayName\": \"Ignore Duplicates\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"rethinkdb-max-document-size\",\n+                                \"name\": \"ignore-duplicates\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"rethinkdb-password\": {\n-                                \"description\": \"Password for user\",\n-                                \"displayName\": \"Password\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"rethinkdb-password\",\n-                                \"required\": false,\n-                                \"sensitive\": true\n-                            },\n-                            \"rethinkdb-port\": {\n-                                \"defaultValue\": \"28015\",\n-                                \"description\": \"RethinkDB database port to connect to\",\n-                                \"displayName\": \"DB Port\",\n+                            \"lookup-key-column\": {\n+                                \"description\": \"The field in the CSV file that will serve as the lookup key. This is the field that will be matched against the property specified in the lookup processor.\",\n+                                \"displayName\": \"Lookup Key Column\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"rethinkdb-port\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"lookup-key-column\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"rethinkdb-table\": {\n-                                \"description\": \"RethinkDB table to connect to\",\n-                                \"displayName\": \"Table name\",\n+                            \"lookup-value-column\": {\n+                                \"description\": \"Lookup value column.\",\n+                                \"displayName\": \"Lookup Value Column\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"rethinkdb-table\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"lookup-value-column\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n-                            },\n-                            \"rethinkdb-username\": {\n-                                \"description\": \"Username for accessing RethinkDB\",\n-                                \"displayName\": \"Username\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"rethinkdb-username\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n                             }\n                         },\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.processors.rethinkdb.DeleteRethinkDB\",\n-                            \"org.apache.nifi.processors.rethinkdb.GetRethinkDB\"\n-                        ],\n-                        \"sideEffectFree\": false,\n-                        \"supportedRelationships\": [\n+                        \"providedApiImplementations\": [\n                             {\n-                                \"description\": \"Sucessful FlowFiles are routed to this relationship\",\n-                                \"name\": \"success\"\n+                                \"artifact\": \"nifi-standard-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.lookup.StringLookupService\",\n+                                \"version\": \"1.27.0\"\n                             },\n                             {\n-                                \"description\": \"Failed FlowFiles are routed to this relationship\",\n-                                \"name\": \"failure\"\n+                                \"artifact\": \"nifi-standard-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.lookup.LookupService\",\n+                                \"version\": \"1.27.0\"\n                             }\n                         ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\",\n-                            \"EVENT_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": true,\n+                        \"restricted\": true,\n                         \"supportsDynamicProperties\": false,\n-                        \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": true,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"insert\",\n-                            \"put\",\n-                            \"rethinkdb\",\n-                            \"stream\",\n-                            \"update\",\n-                            \"write\"\n+                            \"cache\",\n+                            \"csv\",\n+                            \"enrich\",\n+                            \"join\",\n+                            \"key\",\n+                            \"lookup\",\n+                            \"reloadable\",\n+                            \"value\"\n                         ],\n-                        \"triggerSerially\": false,\n-                        \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.rethinkdb.PutRethinkDB\",\n-                        \"typeDescription\": \"Processor to write the JSON content of a FlowFile to RethinkDB (https://www.rethinkdb.com/). The flow file should contain either JSON Object an array of JSON documents\",\n-                        \"version\": \"1.27.0\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"RethinkDB error message\",\n-                                \"name\": \"rethinkdb.error.message\"\n-                            },\n-                            {\n-                                \"description\": \"Error count while inserting documents\",\n-                                \"name\": \"rethinkdb.insert.errors\"\n-                            },\n-                            {\n-                                \"description\": \"Number of documents deleted\",\n-                                \"name\": \"rethinkdb.insert.deleted\"\n-                            },\n-                            {\n-                                \"description\": \"Keys generated on inserting documents\",\n-                                \"name\": \"rethinkdb.insert.generated_keys\"\n-                            },\n-                            {\n-                                \"description\": \"Number of documents inserted\",\n-                                \"name\": \"rethinkdb.insert.inserted\"\n-                            },\n-                            {\n-                                \"description\": \"Number of documents replaced\",\n-                                \"name\": \"rethinkdb.insert.replaced\"\n-                            },\n-                            {\n-                                \"description\": \"Number of documents skipped because they already existed\",\n-                                \"name\": \"rethinkdb.insert.skipped\"\n-                            },\n+                        \"type\": \"org.apache.nifi.lookup.SimpleCsvFileLookupService\",\n+                        \"typeDescription\": \"A reloadable CSV file-based lookup service. The first line of the csv file is considered as header.\",\n+                        \"version\": \"1.27.0\"\n+                    },\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-lookup-services-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"e0c4461\"\n+                        },\n+                        \"dynamicProperties\": [\n                             {\n-                                \"description\": \"Number of documents unchanged since they already existed\",\n-                                \"name\": \"rethinkdb.insert.unchanged\"\n-                            },\n+                                \"description\": \"Allows users to add key/value pairs as User-defined Properties. Each property that is added can be looked up by Property Name. The coordinates that are passed to the lookup must contain the key 'key'.\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"name\": \"A key that can be looked up\",\n+                                \"value\": \"The value for the key\"\n+                            }\n+                        ],\n+                        \"group\": \"org.apache.nifi\",\n+                        \"providedApiImplementations\": [\n                             {\n-                                \"description\": \"First error while inserting documents\",\n-                                \"name\": \"rethinkdb.insert.first_error\"\n+                                \"artifact\": \"nifi-standard-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.lookup.StringLookupService\",\n+                                \"version\": \"1.27.0\"\n                             },\n                             {\n-                                \"description\": \"Warning message in case of large number of ids being returned on insertion\",\n-                                \"name\": \"rethinkdb.insert.warnings\"\n+                                \"artifact\": \"nifi-standard-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.lookup.LookupService\",\n+                                \"version\": \"1.27.0\"\n                             }\n-                        ]\n-                    }\n-                ],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"1.27.0\"\n-        },\n-        {\n-            \"artifact\": \"nifi-hazelcast-services-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [\n+                        ],\n+                        \"supportsDynamicProperties\": true,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"enrich\",\n+                            \"key\",\n+                            \"lookup\",\n+                            \"value\"\n+                        ],\n+                        \"type\": \"org.apache.nifi.lookup.SimpleKeyValueLookupService\",\n+                        \"typeDescription\": \"Allows users to add key/value pairs as User-defined Properties. Each property that is added can be looked up by Property Name. The coordinates that are passed to the lookup must contain the key 'key'.\",\n+                        \"version\": \"1.27.0\"\n+                    },\n                     {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-hazelcast-services-nar\",\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-lookup-services-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n+                        \"explicitRestrictions\": [\n+                            {\n+                                \"explanation\": \"Provides operator the ability to read from any file that NiFi has access to.\",\n+                                \"requiredPermission\": \"read filesystem\"\n+                            }\n+                        ],\n                         \"group\": \"org.apache.nifi\",\n                         \"propertyDescriptors\": {\n-                            \"hazelcast-cache-manager\": {\n-                                \"description\": \"A Hazelcast Cache Manager which manages connections to Hazelcast and provides cache instances.\",\n-                                \"displayName\": \"Hazelcast Cache Manager\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"hazelcast-cache-manager\",\n-                                \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-hazelcast-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.hazelcast.services.cachemanager.HazelcastCacheManager\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            },\n-                            \"hazelcast-cache-name\": {\n-                                \"description\": \"The name of a given cache. A Hazelcast cluster may handle multiple independent caches, each identified by a name. Clients using caches with the same name are working on the same data structure within Hazelcast.\",\n-                                \"displayName\": \"Hazelcast Cache Name\",\n+                            \"configuration-file\": {\n+                                \"description\": \"A configuration file\",\n+                                \"displayName\": \"Configuration File\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"hazelcast-cache-name\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"hazelcast-entry-ttl\": {\n-                                \"defaultValue\": \"5 min\",\n-                                \"description\": \"Indicates how long the written entries should exist in Hazelcast. Setting it to '0 secs' means that the datawill exists until its deletion or until the Hazelcast server is shut down. Using `EmbeddedHazelcastCacheManager` ascache manager will not provide policies to limit the size of the cache.\",\n-                                \"displayName\": \"Hazelcast Entry Lifetime\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"hazelcast-entry-ttl\",\n+                                \"name\": \"configuration-file\",\n                                 \"required\": true,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"SINGLE\",\n+                                    \"resourceTypes\": [\n+                                        \"FILE\"\n+                                    ]\n+                                },\n                                 \"sensitive\": false\n                             }\n                         },\n                         \"providedApiImplementations\": [\n                             {\n                                 \"artifact\": \"nifi-standard-services-api-nar\",\n                                 \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.distributed.cache.client.AtomicDistributedMapCacheClient\",\n+                                \"type\": \"org.apache.nifi.lookup.StringLookupService\",\n                                 \"version\": \"1.27.0\"\n                             },\n                             {\n                                 \"artifact\": \"nifi-standard-services-api-nar\",\n                                 \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.distributed.cache.client.DistributedMapCacheClient\",\n+                                \"type\": \"org.apache.nifi.lookup.LookupService\",\n                                 \"version\": \"1.27.0\"\n                             }\n                         ],\n+                        \"restricted\": true,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n                             \"cache\",\n-                            \"hazelcast\",\n-                            \"map\"\n+                            \"enrich\",\n+                            \"join\",\n+                            \"key\",\n+                            \"lookup\",\n+                            \"reloadable\",\n+                            \"value\",\n+                            \"xml\"\n                         ],\n-                        \"type\": \"org.apache.nifi.hazelcast.services.cacheclient.HazelcastMapCacheClient\",\n-                        \"typeDescription\": \"An implementation of DistributedMapCacheClient that uses Hazelcast as the backing cache. This service relies on an other controller service, manages the actual Hazelcast calls, set in Hazelcast Cache Manager.\",\n+                        \"type\": \"org.apache.nifi.lookup.XMLFileLookupService\",\n+                        \"typeDescription\": \"A reloadable XML file-based lookup service. This service uses Apache Commons Configuration. Example XML configuration file and how to access specific configuration can be found at http://commons.apache.org/proper/commons-configuration/userguide/howto_hierarchical.html. External entity processing is disabled.\",\n                         \"version\": \"1.27.0\"\n                     },\n                     {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-hazelcast-services-nar\",\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-lookup-services-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"group\": \"org.apache.nifi\",\n                         \"propertyDescriptors\": {\n-                            \"hazelcast-cluster-name\": {\n-                                \"defaultValue\": \"nifi\",\n-                                \"description\": \"Name of the Hazelcast cluster.\",\n-                                \"displayName\": \"Hazelcast Cluster Name\",\n+                            \"Cache Expiration\": {\n+                                \"description\": \"Time interval to clear all cache entries. If the Cache Size is zero then this property is ignored.\",\n+                                \"displayName\": \"Cache Expiration\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"hazelcast-cluster-name\",\n+                                \"name\": \"Cache Expiration\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"dbf-default-precision\": {\n+                                \"defaultValue\": \"10\",\n+                                \"description\": \"When a DECIMAL/NUMBER value is written as a 'decimal' Avro logical type, a specific 'precision' denoting number of available digits is required. Generally, precision is defined by column data type definition or database engines default. However undefined precision (0) can be returned from some database engines. 'Default Decimal Precision' is used when writing those undefined precision numbers.\",\n+                                \"displayName\": \"Default Decimal Precision\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"dbf-default-precision\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"hazelcast-clustering-strategy\": {\n+                            \"dbf-default-scale\": {\n+                                \"defaultValue\": \"0\",\n+                                \"description\": \"When a DECIMAL/NUMBER value is written as a 'decimal' Avro logical type, a specific 'scale' denoting number of available decimal digits is required. Generally, scale is defined by column data type definition or database engines default. However when undefined precision (0) is returned, scale can also be uncertain with some database engines. 'Default Decimal Scale' is used when writing those undefined numbers. If a value has more decimals than specified scale, then the value will be rounded-up, e.g. 1.53 becomes 2 with scale 0, and 1.5 with scale 1.\",\n+                                \"displayName\": \"Default Decimal Scale\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"dbf-default-scale\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"dbrecord-lookup-cache-size\": {\n+                                \"defaultValue\": \"0\",\n+                                \"description\": \"Specifies how many lookup values/records should be cached. The cache is shared for all tables and keeps a map of lookup values to records. Setting this property to zero means no caching will be done and the table will be queried for each lookup value in each record. If the lookup table changes often or the most recent data must be retrieved, do not use the cache.\",\n+                                \"displayName\": \"Cache Size\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"dbrecord-lookup-cache-size\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"dbrecord-lookup-clear-cache-on-enabled\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"No high availability or data replication is provided, every node has access only to the data stored locally.\",\n-                                        \"displayName\": \"None\",\n-                                        \"value\": \"none\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Creates Hazelcast cluster based on the NiFi cluster: It expects every NiFi nodes to have a running Hazelcast instance on the same port as specified in the Hazelcast Port property. No explicit listing of the instances is needed.\",\n-                                        \"displayName\": \"All Nodes\",\n-                                        \"value\": \"all_nodes\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n-                                        \"description\": \"Works with an explicit list of Hazelcast instances, creating a cluster using the listed instances. This provides greater control, making it possible to utilize only certain nodes as Hazelcast servers. The list of Hazelcast instances can be set in the property \\\"Hazelcast Instances\\\". The list items must refer to hosts within the NiFi cluster, no external Hazelcast is allowed. NiFi nodes are not listed will be join to the Hazelcast cluster as clients.\",\n-                                        \"displayName\": \"Explicit\",\n-                                        \"value\": \"explicit\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"none\",\n-                                \"description\": \"Specifies with what strategy the Hazelcast cluster should be created.\",\n-                                \"displayName\": \"Hazelcast Clustering Strategy\",\n+                                \"defaultValue\": \"true\",\n+                                \"description\": \"Whether to clear the cache when this service is enabled. If the Cache Size is zero then this property is ignored. Clearing the cache when the service is enabled ensures that the service will first go to the database to get the most recent data.\",\n+                                \"displayName\": \"Clear Cache on Enabled\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"hazelcast-clustering-strategy\",\n+                                \"name\": \"dbrecord-lookup-clear-cache-on-enabled\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"hazelcast-instances\": {\n-                                \"description\": \"Only used with \\\"Explicit\\\" Clustering Strategy! List of NiFi instance host names which should be part of the Hazelcast cluster. Host names are separated by comma. The port specified in the \\\"Hazelcast Port\\\" property will be used as server port. The list must contain every instance that will be part of the cluster. Other instances will join the Hazelcast cluster as clients.\",\n-                                \"displayName\": \"Hazelcast Instances\",\n+                            \"dbrecord-lookup-dbcp-service\": {\n+                                \"description\": \"The Controller Service that is used to obtain connection to database\",\n+                                \"displayName\": \"Database Connection Pooling Service\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"dbrecord-lookup-dbcp-service\",\n+                                \"required\": true,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.dbcp.DBCPService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"dbrecord-lookup-key-column\": {\n+                                \"description\": \"The column in the table that will serve as the lookup key. This is the column that will be matched against the property specified in the lookup processor. Note that this may be case-sensitive depending on the database.\",\n+                                \"displayName\": \"Lookup Key Column\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"hazelcast-instances\",\n-                                \"required\": false,\n+                                \"name\": \"dbrecord-lookup-key-column\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"hazelcast-port\": {\n-                                \"defaultValue\": \"5701\",\n-                                \"description\": \"Port for the Hazelcast instance to use.\",\n-                                \"displayName\": \"Hazelcast Port\",\n+                            \"dbrecord-lookup-table-name\": {\n+                                \"description\": \"The name of the database table to be queried. Note that this may be case-sensitive depending on the database.\",\n+                                \"displayName\": \"Table Name\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"hazelcast-port\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"dbrecord-lookup-table-name\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n+                            },\n+                            \"dbrecord-lookup-value-columns\": {\n+                                \"description\": \"A comma-delimited list of columns in the table that will be returned when the lookup key matches. Note that this may be case-sensitive depending on the database.\",\n+                                \"displayName\": \"Lookup Value Columns\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"dbrecord-lookup-value-columns\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n                             }\n                         },\n                         \"providedApiImplementations\": [\n                             {\n-                                \"artifact\": \"nifi-hazelcast-services-api-nar\",\n+                                \"artifact\": \"nifi-standard-services-api-nar\",\n                                 \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.hazelcast.services.cachemanager.HazelcastCacheManager\",\n+                                \"type\": \"org.apache.nifi.lookup.LookupService\",\n+                                \"version\": \"1.27.0\"\n+                            },\n+                            {\n+                                \"artifact\": \"nifi-standard-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.lookup.RecordLookupService\",\n                                 \"version\": \"1.27.0\"\n                             }\n                         ],\n                         \"supportsDynamicProperties\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n                             \"cache\",\n-                            \"hazelcast\"\n+                            \"database\",\n+                            \"enrich\",\n+                            \"join\",\n+                            \"key\",\n+                            \"lookup\",\n+                            \"rdbms\",\n+                            \"record\",\n+                            \"reloadable\",\n+                            \"value\"\n                         ],\n-                        \"type\": \"org.apache.nifi.hazelcast.services.cachemanager.EmbeddedHazelcastCacheManager\",\n-                        \"typeDescription\": \"A service that runs embedded Hazelcast and provides cache instances backed by that. The server does not ask for authentication, it is recommended to run it within secured network.\",\n+                        \"type\": \"org.apache.nifi.lookup.db.DatabaseRecordLookupService\",\n+                        \"typeDescription\": \"A relational-database-based lookup service. When the lookup key is found in the database, the specified columns (or all if Lookup Value Columns are not specified) are returned as a Record. Only one row will be returned for each lookup, duplicate database entries are ignored.\",\n                         \"version\": \"1.27.0\"\n                     },\n                     {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-hazelcast-services-nar\",\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-lookup-services-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"group\": \"org.apache.nifi\",\n                         \"propertyDescriptors\": {\n-                            \"hazelcast-cluster-name\": {\n-                                \"defaultValue\": \"nifi\",\n-                                \"description\": \"Name of the Hazelcast cluster.\",\n-                                \"displayName\": \"Hazelcast Cluster Name\",\n+                            \"Cache Expiration\": {\n+                                \"description\": \"Time interval to clear all cache entries. If the Cache Size is zero then this property is ignored.\",\n+                                \"displayName\": \"Cache Expiration\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"hazelcast-cluster-name\",\n-                                \"required\": true,\n+                                \"name\": \"Cache Expiration\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"hazelcast-connection-timeout\": {\n-                                \"defaultValue\": \"20 secs\",\n-                                \"description\": \"The maximum amount of time the client tries to connect or reconnect before giving up.\",\n-                                \"displayName\": \"Hazelcast Connection Timeout\",\n+                            \"dbrecord-lookup-cache-size\": {\n+                                \"defaultValue\": \"0\",\n+                                \"description\": \"Specifies how many lookup values/records should be cached. The cache is shared for all tables and keeps a map of lookup values to records. Setting this property to zero means no caching will be done and the table will be queried for each lookup value in each record. If the lookup table changes often or the most recent data must be retrieved, do not use the cache.\",\n+                                \"displayName\": \"Cache Size\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"hazelcast-connection-timeout\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"dbrecord-lookup-cache-size\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"hazelcast-retry-backoff-initial\": {\n-                                \"defaultValue\": \"1 secs\",\n-                                \"description\": \"The amount of time the client waits before it tries to reestablish connection for the first time.\",\n-                                \"displayName\": \"Hazelcast Initial Backoff\",\n+                            \"dbrecord-lookup-clear-cache-on-enabled\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"true\",\n+                                \"description\": \"Whether to clear the cache when this service is enabled. If the Cache Size is zero then this property is ignored. Clearing the cache when the service is enabled ensures that the service will first go to the database to get the most recent data.\",\n+                                \"displayName\": \"Clear Cache on Enabled\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"hazelcast-retry-backoff-initial\",\n+                                \"name\": \"dbrecord-lookup-clear-cache-on-enabled\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"hazelcast-retry-backoff-maximum\": {\n-                                \"defaultValue\": \"5 secs\",\n-                                \"description\": \"The maximum amount of time the client waits before it tries to reestablish connection.\",\n-                                \"displayName\": \"Hazelcast Maximum Backoff\",\n+                            \"dbrecord-lookup-dbcp-service\": {\n+                                \"description\": \"The Controller Service that is used to obtain connection to database\",\n+                                \"displayName\": \"Database Connection Pooling Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"hazelcast-retry-backoff-maximum\",\n+                                \"name\": \"dbrecord-lookup-dbcp-service\",\n+                                \"required\": true,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.dbcp.DBCPService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"dbrecord-lookup-key-column\": {\n+                                \"description\": \"The column in the table that will serve as the lookup key. This is the column that will be matched against the property specified in the lookup processor. Note that this may be case-sensitive depending on the database.\",\n+                                \"displayName\": \"Lookup Key Column\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"dbrecord-lookup-key-column\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"hazelcast-retry-backoff-multiplier\": {\n-                                \"defaultValue\": \"1.5\",\n-                                \"description\": \"A multiplier by which the wait time is increased before each attempt to reestablish connection.\",\n-                                \"displayName\": \"Hazelcast Backoff Multiplier\",\n+                            \"dbrecord-lookup-table-name\": {\n+                                \"description\": \"The name of the database table to be queried. Note that this may be case-sensitive depending on the database.\",\n+                                \"displayName\": \"Table Name\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"hazelcast-retry-backoff-multiplier\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"dbrecord-lookup-table-name\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"hazelcast-server-address\": {\n-                                \"description\": \"Addresses of one or more the Hazelcast instances, using {host:port} format, separated by comma.\",\n-                                \"displayName\": \"Hazelcast Server Address\",\n+                            \"lookup-value-column\": {\n+                                \"description\": \"The column whose value will be returned when the Lookup value is matched\",\n+                                \"displayName\": \"Lookup Value Column\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"hazelcast-server-address\",\n+                                \"name\": \"lookup-value-column\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             }\n                         },\n                         \"providedApiImplementations\": [\n                             {\n-                                \"artifact\": \"nifi-hazelcast-services-api-nar\",\n+                                \"artifact\": \"nifi-standard-services-api-nar\",\n                                 \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.hazelcast.services.cachemanager.HazelcastCacheManager\",\n+                                \"type\": \"org.apache.nifi.lookup.StringLookupService\",\n+                                \"version\": \"1.27.0\"\n+                            },\n+                            {\n+                                \"artifact\": \"nifi-standard-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.lookup.LookupService\",\n                                 \"version\": \"1.27.0\"\n                             }\n                         ],\n                         \"supportsDynamicProperties\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n                             \"cache\",\n-                            \"hazelcast\"\n+                            \"database\",\n+                            \"enrich\",\n+                            \"join\",\n+                            \"key\",\n+                            \"lookup\",\n+                            \"rdbms\",\n+                            \"reloadable\",\n+                            \"value\"\n                         ],\n-                        \"type\": \"org.apache.nifi.hazelcast.services.cachemanager.ExternalHazelcastCacheManager\",\n-                        \"typeDescription\": \"A service that provides cache instances backed by Hazelcast running outside of NiFi.\",\n+                        \"type\": \"org.apache.nifi.lookup.db.SimpleDatabaseLookupService\",\n+                        \"typeDescription\": \"A relational-database-based lookup service. When the lookup key is found in the database, the specified lookup value column is returned. Only one value will be returned for each lookup, duplicate database entries are ignored.\",\n                         \"version\": \"1.27.0\"\n-                    }\n-                ],\n-                \"processors\": [],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"1.27.0\"\n-        },\n-        {\n-            \"artifact\": \"nifi-asana-services-api-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [],\n-                \"processors\": [],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"1.27.0\"\n-        },\n-        {\n-            \"artifact\": \"nifi-gcp-services-api-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [],\n-                \"processors\": [],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"1.27.0\"\n-        },\n-        {\n-            \"artifact\": \"nifi-proxy-configuration-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [\n+                    },\n                     {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-proxy-configuration-nar\",\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-lookup-services-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"group\": \"org.apache.nifi\",\n                         \"propertyDescriptors\": {\n-                            \"proxy-server-host\": {\n-                                \"description\": \"Proxy server hostname or ip-address.\",\n-                                \"displayName\": \"Proxy Server Host\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"proxy-server-host\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"proxy-server-port\": {\n-                                \"description\": \"Proxy server port number.\",\n-                                \"displayName\": \"Proxy Server Port\",\n+                            \"database-file\": {\n+                                \"description\": \"Path to Maxmind IP Enrichment Database File\",\n+                                \"displayName\": \"MaxMind Database File\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"proxy-server-port\",\n-                                \"required\": false,\n+                                \"name\": \"database-file\",\n+                                \"required\": true,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"SINGLE\",\n+                                    \"resourceTypes\": [\n+                                        \"FILE\"\n+                                    ]\n+                                },\n                                 \"sensitive\": false\n                             },\n-                            \"proxy-type\": {\n+                            \"lookup-anonymous-ip\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"DIRECT\",\n-                                        \"value\": \"DIRECT\"\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"HTTP\",\n-                                        \"value\": \"HTTP\"\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"Specifies whether or not information about whether or not the IP address belongs to an anonymous network should be returned.\",\n+                                \"displayName\": \"Lookup Anonymous IP Information\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"lookup-anonymous-ip\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"lookup-city\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"SOCKS\",\n-                                        \"value\": \"SOCKS\"\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"DIRECT\",\n-                                \"description\": \"Proxy type.\",\n-                                \"displayName\": \"Proxy Type\",\n+                                \"defaultValue\": \"true\",\n+                                \"description\": \"Specifies whether or not information about the geographic information, such as cities, corresponding to the IP address should be returned\",\n+                                \"displayName\": \"Lookup Geo Enrichment\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"proxy-type\",\n+                                \"name\": \"lookup-city\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"proxy-user-name\": {\n-                                \"description\": \"The name of the proxy client for user authentication.\",\n-                                \"displayName\": \"Proxy User Name\",\n+                            \"lookup-connection-type\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"Specifies whether or not information about the Connection Type corresponding to the IP address should be returned. If true, the lookup will contain a 'connectionType' field that (if populated) will contain a value of 'Dialup', 'Cable/DSL', 'Corporate', or 'Cellular'\",\n+                                \"displayName\": \"Lookup Connection Type\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"proxy-user-name\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"lookup-connection-type\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"proxy-user-password\": {\n-                                \"description\": \"The password of the proxy client for user authentication.\",\n-                                \"displayName\": \"Proxy User Password\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"proxy-user-password\",\n-                                \"required\": false,\n-                                \"sensitive\": true\n-                            },\n-                            \"socks-version\": {\n+                            \"lookup-domain\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"SOCKS4\",\n-                                        \"value\": \"SOCKS4\"\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"SOCKS5\",\n-                                        \"value\": \"SOCKS5\"\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"SOCKS5\",\n-                                \"dependencies\": [\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"Specifies whether or not information about the Domain Name corresponding to the IP address should be returned. If true, the lookup will contain second-level domain information, such as foo.com but will not contain bar.foo.com\",\n+                                \"displayName\": \"Lookup Domain Name\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"lookup-domain\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"lookup-isp\": {\n+                                \"allowableValues\": [\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"SOCKS\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Proxy Type\",\n-                                        \"propertyName\": \"proxy-type\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"description\": \"SOCKS Protocol Version\",\n-                                \"displayName\": \"SOCKS Version\",\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"Specifies whether or not information about the Information Service Provider corresponding to the IP address should be returned\",\n+                                \"displayName\": \"Lookup ISP\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"socks-version\",\n+                                \"name\": \"lookup-isp\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             }\n                         },\n                         \"providedApiImplementations\": [\n                             {\n                                 \"artifact\": \"nifi-standard-services-api-nar\",\n                                 \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.proxy.ProxyConfigurationService\",\n+                                \"type\": \"org.apache.nifi.lookup.LookupService\",\n+                                \"version\": \"1.27.0\"\n+                            },\n+                            {\n+                                \"artifact\": \"nifi-standard-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.lookup.RecordLookupService\",\n                                 \"version\": \"1.27.0\"\n                             }\n                         ],\n                         \"supportsDynamicProperties\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"Proxy\"\n+                            \"anonymous\",\n+                            \"cellular\",\n+                            \"domain\",\n+                            \"enrich\",\n+                            \"geo\",\n+                            \"ip\",\n+                            \"ipgeo\",\n+                            \"isp\",\n+                            \"lookup\",\n+                            \"maxmind\",\n+                            \"tor\"\n                         ],\n-                        \"type\": \"org.apache.nifi.proxy.StandardProxyConfigurationService\",\n-                        \"typeDescription\": \"Provides a set of configurations for different NiFi components to use a proxy server.\",\n+                        \"type\": \"org.apache.nifi.lookup.maxmind.IPLookupService\",\n+                        \"typeDescription\": \"A lookup service that provides several types of enrichment information for IP addresses. The service is configured by providing a MaxMind Database file and specifying which types of enrichment should be provided for an IP Address or Hostname. Each type of enrichment is a separate lookup, so configuring the service to provide all of the available enrichment data may be slower than returning only a portion of the available enrichments. In order to use this service, a lookup must be performed using key of 'ip' and a value that is a valid IP address or hostname. View the Usage of this component and choose to view Additional Details for more information, such as the Schema that pertains to the information that is returned.\",\n                         \"version\": \"1.27.0\"\n                     }\n                 ],\n                 \"processors\": [],\n                 \"reportingTasks\": []\n             },\n             \"group\": \"org.apache.nifi\",\n             \"version\": \"1.27.0\"\n         },\n         {\n-            \"artifact\": \"nifi-scripting-nar\",\n+            \"artifact\": \"nifi-poi-nar\",\n             \"componentManifest\": {\n                 \"controllerServices\": [\n                     {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-scripting-nar\",\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-poi-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n-                        \"dynamicProperties\": [\n-                            {\n-                                \"description\": \"Updates a script engine property specified by the Dynamic Property's key with the value specified by the Dynamic Property's value\",\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"name\": \"Script Engine Binding property\",\n-                                \"value\": \"Binding property value passed to Script Runner\"\n-                            }\n-                        ],\n-                        \"explicitRestrictions\": [\n-                            {\n-                                \"explanation\": \"Provides operator the ability to execute arbitrary code assuming all permissions that NiFi has.\",\n-                                \"requiredPermission\": \"execute code\"\n-                            }\n-                        ],\n                         \"group\": \"org.apache.nifi\",\n                         \"propertyDescriptors\": {\n-                            \"Module Directory\": {\n-                                \"description\": \"Comma-separated list of paths to files and/or directories which contain modules required by the script.\",\n-                                \"displayName\": \"Module Directory\",\n+                            \"Date Format\": {\n+                                \"description\": \"Specifies the format to use when reading/writing Date fields. If not specified, Date fields will be assumed to be number of milliseconds since epoch (Midnight, Jan 1, 1970 GMT). If specified, the value must match the Java Simple Date Format (for example, MM/dd/yyyy for a two-digit month, followed by a two-digit day, followed by a four-digit year, all separated by '/' characters, as in 01/01/2017).\",\n+                                \"displayName\": \"Date Format\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Module Directory\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Date Format\",\n                                 \"required\": false,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"MULTIPLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\",\n-                                        \"DIRECTORY\"\n-                                    ]\n-                                },\n                                 \"sensitive\": false\n                             },\n-                            \"Script Body\": {\n-                                \"description\": \"Body of script to execute. Only one of Script File or Script Body may be used\",\n-                                \"displayName\": \"Script Body\",\n+                            \"Password\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"PASSWORD\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Protection Type\",\n+                                        \"propertyName\": \"Protection Type\"\n+                                    }\n+                                ],\n+                                \"description\": \"The password for a password protected Excel spreadsheet\",\n+                                \"displayName\": \"Password\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Script Body\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n+                                \"name\": \"Password\",\n+                                \"required\": true,\n+                                \"sensitive\": true\n                             },\n-                            \"Script Engine\": {\n+                            \"Protection Type\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"ECMAScript ECMA - 262 Edition 5.1 [Oracle Nashorn 1.8.0_302-b08]\",\n-                                        \"displayName\": \"ECMAScript DEPRECATED\",\n-                                        \"value\": \"ECMAScript\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Groovy 3.0.21 [Groovy Scripting Engine 2.0]\",\n-                                        \"displayName\": \"Groovy\",\n-                                        \"value\": \"Groovy\"\n+                                        \"description\": \"An Excel spreadsheet not protected by a password\",\n+                                        \"displayName\": \"Unprotected\",\n+                                        \"value\": \"UNPROTECTED\"\n                                     },\n                                     {\n-                                        \"description\": \"ruby jruby 9.4.2.0 [JSR 223 JRuby Engine 9.4.2.0]\",\n-                                        \"displayName\": \"ruby DEPRECATED\",\n-                                        \"value\": \"ruby\"\n+                                        \"description\": \"An Excel spreadsheet protected by a password\",\n+                                        \"displayName\": \"Password Protected\",\n+                                        \"value\": \"PASSWORD\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"ECMAScript\",\n-                                \"description\": \"Language Engine for executing scripts\",\n-                                \"displayName\": \"Script Engine\",\n+                                \"defaultValue\": \"UNPROTECTED\",\n+                                \"description\": \"Specifies whether an Excel spreadsheet is protected by a password or not.\",\n+                                \"displayName\": \"Protection Type\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Script Engine\",\n+                                \"name\": \"Protection Type\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Script File\": {\n-                                \"description\": \"Path to script file to execute. Only one of Script File or Script Body may be used\",\n-                                \"displayName\": \"Script File\",\n+                            \"Required Sheets\": {\n+                                \"description\": \"Comma-separated list of Excel document sheet names whose rows should be extracted from the excel document. If this property is left blank then all the rows from all the sheets will be extracted from the Excel document. The list of names is case sensitive. Any sheets not specified in this value will be ignored. An exception will be thrown if a specified sheet(s) are not found.\",\n+                                \"displayName\": \"Required Sheets\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Script File\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Required Sheets\",\n                                 \"required\": false,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"SINGLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\"\n-                                    ]\n-                                },\n                                 \"sensitive\": false\n-                            }\n-                        },\n-                        \"providedApiImplementations\": [\n-                            {\n-                                \"artifact\": \"nifi-standard-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.lookup.LookupService\",\n-                                \"version\": \"1.27.0\"\n-                            }\n-                        ],\n-                        \"restricted\": true,\n-                        \"supportsDynamicProperties\": true,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"groovy\",\n-                            \"invoke\",\n-                            \"javascript\",\n-                            \"jruby\",\n-                            \"js\",\n-                            \"jython\",\n-                            \"lookup\",\n-                            \"lua\",\n-                            \"luaj\",\n-                            \"python\",\n-                            \"record\",\n-                            \"ruby\",\n-                            \"script\"\n-                        ],\n-                        \"type\": \"org.apache.nifi.lookup.script.ScriptedLookupService\",\n-                        \"typeDescription\": \"Allows the user to provide a scripted LookupService instance in order to enrich records from an incoming flow file. Please note, that due to a bug in Jython that remains unresolved, it is not possible to use Jython to write a script for this service in Python.\",\n-                        \"version\": \"1.27.0\"\n-                    },\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-scripting-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"e0c4461\"\n-                        },\n-                        \"dynamicProperties\": [\n-                            {\n-                                \"description\": \"Updates a script engine property specified by the Dynamic Property's key with the value specified by the Dynamic Property's value\",\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"name\": \"Script Engine Binding property\",\n-                                \"value\": \"Binding property value passed to Script Runner\"\n-                            }\n-                        ],\n-                        \"explicitRestrictions\": [\n-                            {\n-                                \"explanation\": \"Provides operator the ability to execute arbitrary code assuming all permissions that NiFi has.\",\n-                                \"requiredPermission\": \"execute code\"\n-                            }\n-                        ],\n-                        \"group\": \"org.apache.nifi\",\n-                        \"propertyDescriptors\": {\n-                            \"Module Directory\": {\n-                                \"description\": \"Comma-separated list of paths to files and/or directories which contain modules required by the script.\",\n-                                \"displayName\": \"Module Directory\",\n+                            },\n+                            \"Starting Row\": {\n+                                \"defaultValue\": \"1\",\n+                                \"description\": \"The row number of the first row to start processing (One based). Use this to skip over rows of data at the top of a worksheet that are not part of the dataset.\",\n+                                \"displayName\": \"Starting Row\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Module Directory\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Starting Row\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Time Format\": {\n+                                \"description\": \"Specifies the format to use when reading/writing Time fields. If not specified, Time fields will be assumed to be number of milliseconds since epoch (Midnight, Jan 1, 1970 GMT). If specified, the value must match the Java Simple Date Format (for example, HH:mm:ss for a two-digit hour in 24-hour format, followed by a two-digit minute, followed by a two-digit second, all separated by ':' characters, as in 18:04:15).\",\n+                                \"displayName\": \"Time Format\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Time Format\",\n                                 \"required\": false,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"MULTIPLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\",\n-                                        \"DIRECTORY\"\n-                                    ]\n-                                },\n                                 \"sensitive\": false\n                             },\n-                            \"Script Body\": {\n-                                \"description\": \"Body of script to execute. Only one of Script File or Script Body may be used\",\n-                                \"displayName\": \"Script Body\",\n+                            \"Timestamp Format\": {\n+                                \"description\": \"Specifies the format to use when reading/writing Timestamp fields. If not specified, Timestamp fields will be assumed to be number of milliseconds since epoch (Midnight, Jan 1, 1970 GMT). If specified, the value must match the Java Simple Date Format (for example, MM/dd/yyyy HH:mm:ss for a two-digit month, followed by a two-digit day, followed by a four-digit year, all separated by '/' characters; and then followed by a two-digit hour in 24-hour format, followed by a two-digit minute, followed by a two-digit second, all separated by ':' characters, as in 01/01/2017 18:04:15).\",\n+                                \"displayName\": \"Timestamp Format\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Script Body\",\n+                                \"name\": \"Timestamp Format\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Script Engine\": {\n+                            \"schema-access-strategy\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"ECMAScript ECMA - 262 Edition 5.1 [Oracle Nashorn 1.8.0_302-b08]\",\n-                                        \"displayName\": \"ECMAScript DEPRECATED\",\n-                                        \"value\": \"ECMAScript\"\n+                                        \"description\": \"The name of the Schema to use is specified by the 'Schema Name' Property. The value of this property is used to lookup the Schema in the configured Schema Registry service.\",\n+                                        \"displayName\": \"Use 'Schema Name' Property\",\n+                                        \"value\": \"schema-name\"\n                                     },\n                                     {\n-                                        \"description\": \"Groovy 3.0.21 [Groovy Scripting Engine 2.0]\",\n-                                        \"displayName\": \"Groovy\",\n-                                        \"value\": \"Groovy\"\n+                                        \"description\": \"The text of the Schema itself is specified by the 'Schema Text' Property. The value of this property must be a valid Avro Schema. If Expression Language is used, the value of the 'Schema Text' property must be valid after substituting the expressions.\",\n+                                        \"displayName\": \"Use 'Schema Text' Property\",\n+                                        \"value\": \"schema-text-property\"\n                                     },\n                                     {\n-                                        \"description\": \"ruby jruby 9.4.2.0 [JSR 223 JRuby Engine 9.4.2.0]\",\n-                                        \"displayName\": \"ruby DEPRECATED\",\n-                                        \"value\": \"ruby\"\n+                                        \"description\": \"The FlowFile contains 3 Attributes that will be used to lookup a Schema from the configured Schema Registry: 'schema.identifier', 'schema.version', and 'schema.protocol.version'\",\n+                                        \"displayName\": \"HWX Schema Reference Attributes\",\n+                                        \"value\": \"hwx-schema-ref-attributes\"\n+                                    },\n+                                    {\n+                                        \"description\": \"The content of the FlowFile contains a reference to a schema in the Schema Registry service. The reference is encoded as a single byte indicating the 'protocol version', followed by 8 bytes indicating the schema identifier, and finally 4 bytes indicating the schema version, as per the Hortonworks Schema Registry serializers and deserializers, found at https://github.com/hortonworks/registry\",\n+                                        \"displayName\": \"HWX Content-Encoded Schema Reference\",\n+                                        \"value\": \"hwx-content-encoded-schema\"\n+                                    },\n+                                    {\n+                                        \"description\": \"The content of the FlowFile contains a reference to a schema in the Schema Registry service. The reference is encoded as a single 'Magic Byte' followed by 4 bytes representing the identifier of the schema, as outlined at http://docs.confluent.io/current/schema-registry/docs/serializer-formatter.html. This is based on version 3.2.x of the Confluent Schema Registry.\",\n+                                        \"displayName\": \"Confluent Content-Encoded Schema Reference\",\n+                                        \"value\": \"confluent-encoded\"\n+                                    },\n+                                    {\n+                                        \"description\": \"The Schema of the data will be inferred automatically when the data is read. See component Usage and Additional Details for information about how the schema is inferred.\",\n+                                        \"displayName\": \"Infer Schema\",\n+                                        \"value\": \"infer-schema\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"ECMAScript\",\n-                                \"description\": \"Language Engine for executing scripts\",\n-                                \"displayName\": \"Script Engine\",\n+                                \"defaultValue\": \"infer-schema\",\n+                                \"description\": \"Specifies how to obtain the schema that is to be used for interpreting the data.\",\n+                                \"displayName\": \"Schema Access Strategy\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Script Engine\",\n+                                \"name\": \"schema-access-strategy\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Script File\": {\n-                                \"description\": \"Path to script file to execute. Only one of Script File or Script Body may be used\",\n-                                \"displayName\": \"Script File\",\n+                            \"schema-branch\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"schema-name\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n+                                        \"propertyName\": \"schema-access-strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"Specifies the name of the branch to use when looking up the schema in the Schema Registry property. If the chosen Schema Registry does not support branching, this value will be ignored.\",\n+                                \"displayName\": \"Schema Branch\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Script File\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"schema-branch\",\n                                 \"required\": false,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"SINGLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\"\n-                                    ]\n-                                },\n                                 \"sensitive\": false\n-                            }\n-                        },\n-                        \"providedApiImplementations\": [\n-                            {\n-                                \"artifact\": \"nifi-standard-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.lookup.StringLookupService\",\n-                                \"version\": \"1.27.0\"\n                             },\n-                            {\n-                                \"artifact\": \"nifi-standard-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.lookup.LookupService\",\n-                                \"version\": \"1.27.0\"\n-                            }\n-                        ],\n-                        \"restricted\": true,\n-                        \"supportsDynamicProperties\": true,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"groovy\",\n-                            \"invoke\",\n-                            \"javascript\",\n-                            \"jruby\",\n-                            \"js\",\n-                            \"jython\",\n-                            \"lookup\",\n-                            \"lua\",\n-                            \"luaj\",\n-                            \"python\",\n-                            \"ruby\",\n-                            \"script\"\n-                        ],\n-                        \"type\": \"org.apache.nifi.lookup.script.SimpleScriptedLookupService\",\n-                        \"typeDescription\": \"Allows the user to provide a scripted LookupService instance in order to enrich records from an incoming flow file. The script is expected to return an optional string value rather than an arbitrary object (record, e.g.). Also the scripted lookup service should implement StringLookupService, otherwise the getValueType() method must be implemented even though it will be ignored, as SimpleScriptedLookupService returns String as the value type on the script's behalf. Please note that due to a bug in Jython that remains unresolved, it is not possible to use Jython to write a script for this service in Python.\",\n-                        \"version\": \"1.27.0\"\n-                    },\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-scripting-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"e0c4461\"\n-                        },\n-                        \"dynamicProperties\": [\n-                            {\n-                                \"description\": \"Updates a script engine property specified by the Dynamic Property's key with the value specified by the Dynamic Property's value\",\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"name\": \"Script Engine Binding property\",\n-                                \"value\": \"Binding property value passed to Script Runner\"\n-                            }\n-                        ],\n-                        \"explicitRestrictions\": [\n-                            {\n-                                \"explanation\": \"Provides operator the ability to execute arbitrary code assuming all permissions that NiFi has.\",\n-                                \"requiredPermission\": \"execute code\"\n-                            }\n-                        ],\n-                        \"group\": \"org.apache.nifi\",\n-                        \"propertyDescriptors\": {\n-                            \"Module Directory\": {\n-                                \"description\": \"Comma-separated list of paths to files and/or directories which contain modules required by the script.\",\n-                                \"displayName\": \"Module Directory\",\n+                            \"schema-name\": {\n+                                \"defaultValue\": \"${schema.name}\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"schema-name\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n+                                        \"propertyName\": \"schema-access-strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"Specifies the name of the schema to lookup in the Schema Registry property\",\n+                                \"displayName\": \"Schema Name\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Module Directory\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"schema-name\",\n                                 \"required\": false,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"MULTIPLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\",\n-                                        \"DIRECTORY\"\n-                                    ]\n-                                },\n                                 \"sensitive\": false\n                             },\n-                            \"Script Body\": {\n-                                \"description\": \"Body of script to execute. Only one of Script File or Script Body may be used\",\n-                                \"displayName\": \"Script Body\",\n+                            \"schema-registry\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"confluent-encoded\",\n+                                            \"schema-name\",\n+                                            \"hwx-schema-ref-attributes\",\n+                                            \"hwx-content-encoded-schema\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n+                                        \"propertyName\": \"schema-access-strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"Specifies the Controller Service to use for the Schema Registry\",\n+                                \"displayName\": \"Schema Registry\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Script Body\",\n+                                \"name\": \"schema-registry\",\n                                 \"required\": false,\n-                                \"sensitive\": false\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.schemaregistry.services.SchemaRegistry\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n                             },\n-                            \"Script Engine\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"ECMAScript ECMA - 262 Edition 5.1 [Oracle Nashorn 1.8.0_302-b08]\",\n-                                        \"displayName\": \"ECMAScript DEPRECATED\",\n-                                        \"value\": \"ECMAScript\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Groovy 3.0.21 [Groovy Scripting Engine 2.0]\",\n-                                        \"displayName\": \"Groovy\",\n-                                        \"value\": \"Groovy\"\n-                                    },\n-                                    {\n-                                        \"description\": \"python 2.7 [jython 2.7.3]\",\n-                                        \"displayName\": \"python DEPRECATED\",\n-                                        \"value\": \"python\"\n-                                    },\n+                            \"schema-text\": {\n+                                \"defaultValue\": \"${avro.schema}\",\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"ruby jruby 9.4.2.0 [JSR 223 JRuby Engine 9.4.2.0]\",\n-                                        \"displayName\": \"ruby DEPRECATED\",\n-                                        \"value\": \"ruby\"\n+                                        \"dependentValues\": [\n+                                            \"schema-text-property\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n+                                        \"propertyName\": \"schema-access-strategy\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"ECMAScript\",\n-                                \"description\": \"Language Engine for executing scripts\",\n-                                \"displayName\": \"Script Engine\",\n+                                \"description\": \"The text of an Avro-formatted Schema\",\n+                                \"displayName\": \"Schema Text\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Script Engine\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"schema-text\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Script File\": {\n-                                \"description\": \"Path to script file to execute. Only one of Script File or Script Body may be used\",\n-                                \"displayName\": \"Script File\",\n+                            \"schema-version\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"schema-name\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n+                                        \"propertyName\": \"schema-access-strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"Specifies the version of the schema to lookup in the Schema Registry. If not specified then the latest version of the schema will be retrieved.\",\n+                                \"displayName\": \"Schema Version\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Script File\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"schema-version\",\n                                 \"required\": false,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"SINGLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\"\n-                                    ]\n-                                },\n                                 \"sensitive\": false\n                             }\n                         },\n                         \"providedApiImplementations\": [\n                             {\n                                 \"artifact\": \"nifi-standard-services-api-nar\",\n                                 \"group\": \"org.apache.nifi\",\n                                 \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n                                 \"version\": \"1.27.0\"\n                             }\n                         ],\n-                        \"restricted\": true,\n-                        \"supportsDynamicProperties\": true,\n+                        \"supportsDynamicProperties\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"groovy\",\n-                            \"invoke\",\n-                            \"javascript\",\n-                            \"jruby\",\n-                            \"js\",\n-                            \"jython\",\n-                            \"lua\",\n-                            \"luaj\",\n-                            \"python\",\n+                            \"cell\",\n+                            \"excel\",\n+                            \"parse\",\n+                            \"reader\",\n                             \"record\",\n-                            \"recordFactory\",\n-                            \"ruby\",\n-                            \"script\"\n+                            \"row\",\n+                            \"spreadsheet\",\n+                            \"values\",\n+                            \"xlsx\"\n                         ],\n-                        \"type\": \"org.apache.nifi.record.script.ScriptedReader\",\n-                        \"typeDescription\": \"Allows the user to provide a scripted RecordReaderFactory instance in order to read/parse/generate records from an incoming flow file.\",\n+                        \"type\": \"org.apache.nifi.excel.ExcelReader\",\n+                        \"typeDescription\": \"Parses a Microsoft Excel document returning each row in each sheet as a separate record. This reader allows for inferring a schema from all the required sheets or providing an explicit schema for interpreting the values.See Controller Service's Usage for further documentation. This reader is currently only capable of processing .xlsx (XSSF 2007 OOXML file format) Excel documents and not older .xls (HSSF '97(-2007) file format) documents.\",\n                         \"version\": \"1.27.0\"\n-                    },\n+                    }\n+                ],\n+                \"processors\": [\n                     {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-scripting-nar\",\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-poi-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n-                        \"dynamicProperties\": [\n-                            {\n-                                \"description\": \"Updates a script engine property specified by the Dynamic Property's key with the value specified by the Dynamic Property's value\",\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"name\": \"Script Engine Binding property\",\n-                                \"value\": \"Binding property value passed to Script Runner\"\n-                            }\n-                        ],\n-                        \"explicitRestrictions\": [\n-                            {\n-                                \"explanation\": \"Provides operator the ability to execute arbitrary code assuming all permissions that NiFi has.\",\n-                                \"requiredPermission\": \"execute code\"\n-                            }\n+                        \"defaultBulletinLevel\": \"WARN\",\n+                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": 1,\n+                            \"TIMER_DRIVEN\": 1\n+                        },\n+                        \"defaultPenaltyDuration\": \"30 sec\",\n+                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": \"* * * * * ?\",\n+                            \"TIMER_DRIVEN\": \"0 sec\"\n+                        },\n+                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n+                        \"defaultYieldDuration\": \"1 sec\",\n+                        \"deprecated\": true,\n+                        \"deprecationAlternatives\": [\n+                            \"org.apache.nifi.csv.CSVRecordSetWriter\",\n+                            \"org.apache.nifi.excel.ExcelReader\",\n+                            \"org.apache.nifi.processors.standard.ConvertRecord\"\n                         ],\n+                        \"deprecationReason\": \"ConvertExcelToCSVProcessor is no longer needed since there is now the ExcelReader which along with CSVRecordSetWriter can be used in ConvertRecord to achieve the same thing.\",\n                         \"group\": \"org.apache.nifi\",\n+                        \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Module Directory\": {\n-                                \"description\": \"Comma-separated list of paths to files and/or directories which contain modules required by the script.\",\n-                                \"displayName\": \"Module Directory\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Module Directory\",\n-                                \"required\": false,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"MULTIPLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\",\n-                                        \"DIRECTORY\"\n-                                    ]\n-                                },\n-                                \"sensitive\": false\n-                            },\n-                            \"Script Body\": {\n-                                \"description\": \"Body of script to execute. Only one of Script File or Script Body may be used\",\n-                                \"displayName\": \"Script Body\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Script Body\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Script Engine\": {\n+                            \"CSV Format\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"ECMAScript ECMA - 262 Edition 5.1 [Oracle Nashorn 1.8.0_302-b08]\",\n-                                        \"displayName\": \"ECMAScript DEPRECATED\",\n-                                        \"value\": \"ECMAScript\"\n+                                        \"description\": \"The format of the CSV is configured by using the properties of this Controller Service, such as Value Separator\",\n+                                        \"displayName\": \"Custom Format\",\n+                                        \"value\": \"custom\"\n                                     },\n                                     {\n-                                        \"description\": \"Groovy 3.0.21 [Groovy Scripting Engine 2.0]\",\n-                                        \"displayName\": \"Groovy\",\n-                                        \"value\": \"Groovy\"\n+                                        \"description\": \"CSV data follows the RFC 4180 Specification defined at https://tools.ietf.org/html/rfc4180\",\n+                                        \"displayName\": \"RFC 4180\",\n+                                        \"value\": \"rfc-4180\"\n                                     },\n                                     {\n-                                        \"description\": \"python 2.7 [jython 2.7.3]\",\n-                                        \"displayName\": \"python DEPRECATED\",\n-                                        \"value\": \"python\"\n+                                        \"description\": \"CSV data follows the format used by Microsoft Excel\",\n+                                        \"displayName\": \"Microsoft Excel\",\n+                                        \"value\": \"excel\"\n                                     },\n                                     {\n-                                        \"description\": \"ruby jruby 9.4.2.0 [JSR 223 JRuby Engine 9.4.2.0]\",\n-                                        \"displayName\": \"ruby DEPRECATED\",\n-                                        \"value\": \"ruby\"\n+                                        \"description\": \"CSV data is Tab-Delimited instead of Comma Delimited\",\n+                                        \"displayName\": \"Tab-Delimited\",\n+                                        \"value\": \"tdf\"\n+                                    },\n+                                    {\n+                                        \"description\": \"CSV data follows the format used by MySQL\",\n+                                        \"displayName\": \"MySQL Format\",\n+                                        \"value\": \"mysql\"\n+                                    },\n+                                    {\n+                                        \"description\": \"The format used by Informix when issuing the UNLOAD TO file_name command\",\n+                                        \"displayName\": \"Informix Unload\",\n+                                        \"value\": \"informix-unload\"\n+                                    },\n+                                    {\n+                                        \"description\": \"The format used by Informix when issuing the UNLOAD TO file_name command with escaping disabled\",\n+                                        \"displayName\": \"Informix Unload Escape Disabled\",\n+                                        \"value\": \"informix-unload-csv\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"ECMAScript\",\n-                                \"description\": \"Language Engine for executing scripts\",\n-                                \"displayName\": \"Script Engine\",\n+                                \"defaultValue\": \"custom\",\n+                                \"description\": \"Specifies which \\\"format\\\" the CSV data is in, or specifies if custom formatting should be used.\",\n+                                \"displayName\": \"CSV Format\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Script Engine\",\n+                                \"name\": \"CSV Format\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Script File\": {\n-                                \"description\": \"Path to script file to execute. Only one of Script File or Script Body may be used\",\n-                                \"displayName\": \"Script File\",\n+                            \"Comment Marker\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"custom\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"CSV Format\",\n+                                        \"propertyName\": \"CSV Format\"\n+                                    }\n+                                ],\n+                                \"description\": \"The character that is used to denote the start of a comment. Any line that begins with this comment will be ignored.\",\n+                                \"displayName\": \"Comment Marker\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Script File\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Comment Marker\",\n                                 \"required\": false,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"SINGLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\"\n-                                    ]\n-                                },\n                                 \"sensitive\": false\n-                            }\n-                        },\n-                        \"providedApiImplementations\": [\n-                            {\n-                                \"artifact\": \"nifi-standard-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n-                                \"version\": \"1.27.0\"\n-                            }\n-                        ],\n-                        \"restricted\": true,\n-                        \"supportsDynamicProperties\": true,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"groovy\",\n-                            \"invoke\",\n-                            \"javascript\",\n-                            \"jruby\",\n-                            \"js\",\n-                            \"jython\",\n-                            \"lua\",\n-                            \"luaj\",\n-                            \"python\",\n-                            \"record\",\n-                            \"ruby\",\n-                            \"script\",\n-                            \"writer\"\n-                        ],\n-                        \"type\": \"org.apache.nifi.record.script.ScriptedRecordSetWriter\",\n-                        \"typeDescription\": \"Allows the user to provide a scripted RecordSetWriterFactory instance in order to write records to an outgoing flow file.\",\n-                        \"version\": \"1.27.0\"\n-                    },\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-scripting-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"e0c4461\"\n-                        },\n-                        \"dynamicProperties\": [\n-                            {\n-                                \"description\": \"Updates a script engine property specified by the Dynamic Property's key with the value specified by the Dynamic Property's value\",\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"name\": \"Script Engine Binding property\",\n-                                \"value\": \"Binding property value passed to Script Runner\"\n-                            }\n-                        ],\n-                        \"explicitRestrictions\": [\n-                            {\n-                                \"explanation\": \"Provides operator the ability to execute arbitrary code assuming all permissions that NiFi has.\",\n-                                \"requiredPermission\": \"execute code\"\n-                            }\n-                        ],\n-                        \"group\": \"org.apache.nifi\",\n-                        \"propertyDescriptors\": {\n-                            \"Module Directory\": {\n-                                \"description\": \"Comma-separated list of paths to files and/or directories which contain modules required by the script.\",\n-                                \"displayName\": \"Module Directory\",\n+                            },\n+                            \"Escape Character\": {\n+                                \"defaultValue\": \"\\\\\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"custom\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"CSV Format\",\n+                                        \"propertyName\": \"CSV Format\"\n+                                    }\n+                                ],\n+                                \"description\": \"The character that is used to escape characters that would otherwise have a specific meaning to the CSV Parser. If the property has been specified via Expression Language but the expression gets evaluated to an invalid Escape Character at runtime, then it will be skipped and the default Escape Character will be used. Setting it to an empty string means no escape character should be used.\",\n+                                \"displayName\": \"Escape Character\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Module Directory\",\n-                                \"required\": false,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"MULTIPLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\",\n-                                        \"DIRECTORY\"\n-                                    ]\n-                                },\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Escape Character\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Script Body\": {\n-                                \"description\": \"Body of script to execute. Only one of Script File or Script Body may be used\",\n-                                \"displayName\": \"Script Body\",\n+                            \"Include Header Line\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"true\",\n+                                \"description\": \"Specifies whether or not the CSV column names should be written out as the first line.\",\n+                                \"displayName\": \"Include Header Line\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Script Body\",\n-                                \"required\": false,\n+                                \"name\": \"Include Header Line\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Script Engine\": {\n+                            \"Include Trailing Delimiter\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"ECMAScript ECMA - 262 Edition 5.1 [Oracle Nashorn 1.8.0_302-b08]\",\n-                                        \"displayName\": \"ECMAScript DEPRECATED\",\n-                                        \"value\": \"ECMAScript\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Groovy 3.0.21 [Groovy Scripting Engine 2.0]\",\n-                                        \"displayName\": \"Groovy\",\n-                                        \"value\": \"Groovy\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n-                                        \"description\": \"python 2.7 [jython 2.7.3]\",\n-                                        \"displayName\": \"python DEPRECATED\",\n-                                        \"value\": \"python\"\n-                                    },\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"false\",\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"ruby jruby 9.4.2.0 [JSR 223 JRuby Engine 9.4.2.0]\",\n-                                        \"displayName\": \"ruby DEPRECATED\",\n-                                        \"value\": \"ruby\"\n+                                        \"dependentValues\": [\n+                                            \"custom\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"CSV Format\",\n+                                        \"propertyName\": \"CSV Format\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"ECMAScript\",\n-                                \"description\": \"Language Engine for executing scripts\",\n-                                \"displayName\": \"Script Engine\",\n+                                \"description\": \"If true, a trailing delimiter will be added to each CSV Record that is written. If false, the trailing delimiter will be omitted.\",\n+                                \"displayName\": \"Include Trailing Delimiter\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Script Engine\",\n+                                \"name\": \"Include Trailing Delimiter\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Script File\": {\n-                                \"description\": \"Path to script file to execute. Only one of Script File or Script Body may be used\",\n-                                \"displayName\": \"Script File\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Script File\",\n-                                \"required\": false,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"SINGLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\"\n-                                    ]\n-                                },\n-                                \"sensitive\": false\n-                            }\n-                        },\n-                        \"providedApiImplementations\": [\n-                            {\n-                                \"artifact\": \"nifi-standard-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.record.sink.RecordSinkService\",\n-                                \"version\": \"1.27.0\"\n-                            }\n-                        ],\n-                        \"restricted\": true,\n-                        \"supportsDynamicProperties\": true,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"groovy\",\n-                            \"invoke\",\n-                            \"javascript\",\n-                            \"jruby\",\n-                            \"js\",\n-                            \"jython\",\n-                            \"lua\",\n-                            \"luaj\",\n-                            \"python\",\n-                            \"record\",\n-                            \"record sink\",\n-                            \"ruby\",\n-                            \"script\"\n-                        ],\n-                        \"type\": \"org.apache.nifi.record.sink.script.ScriptedRecordSink\",\n-                        \"typeDescription\": \"Allows the user to provide a scripted RecordSinkService instance in order to transmit records to the desired target. The script must set a variable 'recordSink' to an implementation of RecordSinkService.\",\n-                        \"version\": \"1.27.0\"\n-                    },\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-scripting-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"e0c4461\"\n-                        },\n-                        \"dynamicProperties\": [\n-                            {\n-                                \"description\": \"Updates a script engine property specified by the Dynamic Property's key with the value specified by the Dynamic Property's value\",\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"name\": \"Script Engine Binding property\",\n-                                \"value\": \"Binding property value passed to Script Runner\"\n-                            }\n-                        ],\n-                        \"explicitRestrictions\": [\n-                            {\n-                                \"explanation\": \"Provides operator the ability to execute arbitrary code assuming all permissions that NiFi has.\",\n-                                \"requiredPermission\": \"execute code\"\n-                            }\n-                        ],\n-                        \"group\": \"org.apache.nifi\",\n-                        \"propertyDescriptors\": {\n-                            \"Module Directory\": {\n-                                \"description\": \"Comma-separated list of paths to files and/or directories which contain modules required by the script.\",\n-                                \"displayName\": \"Module Directory\",\n+                            \"Null String\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"custom\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"CSV Format\",\n+                                        \"propertyName\": \"CSV Format\"\n+                                    }\n+                                ],\n+                                \"description\": \"Specifies a String that, if present as a value in the CSV, should be considered a null field instead of using the literal value.\",\n+                                \"displayName\": \"Null String\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Module Directory\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Null String\",\n                                 \"required\": false,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"MULTIPLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\",\n-                                        \"DIRECTORY\"\n-                                    ]\n-                                },\n                                 \"sensitive\": false\n                             },\n-                            \"Script Body\": {\n-                                \"description\": \"Body of script to execute. Only one of Script File or Script Body may be used\",\n-                                \"displayName\": \"Script Body\",\n+                            \"Quote Character\": {\n+                                \"defaultValue\": \"\\\"\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"custom\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"CSV Format\",\n+                                        \"propertyName\": \"CSV Format\"\n+                                    }\n+                                ],\n+                                \"description\": \"The character that is used to quote values so that escape characters do not have to be used. If the property has been specified via Expression Language but the expression gets evaluated to an invalid Quote Character at runtime, then it will be skipped and the default Quote Character will be used.\",\n+                                \"displayName\": \"Quote Character\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Script Body\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Quote Character\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Script Engine\": {\n+                            \"Quote Mode\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"ECMAScript ECMA - 262 Edition 5.1 [Oracle Nashorn 1.8.0_302-b08]\",\n-                                        \"displayName\": \"ECMAScript DEPRECATED\",\n-                                        \"value\": \"ECMAScript\"\n+                                        \"description\": \"All values will be quoted using the configured quote character.\",\n+                                        \"displayName\": \"Quote All Values\",\n+                                        \"value\": \"ALL\"\n                                     },\n                                     {\n-                                        \"description\": \"Groovy 3.0.21 [Groovy Scripting Engine 2.0]\",\n-                                        \"displayName\": \"Groovy\",\n-                                        \"value\": \"Groovy\"\n+                                        \"description\": \"Values will be quoted only if they are contain special characters such as newline characters or field separators.\",\n+                                        \"displayName\": \"Quote Minimal\",\n+                                        \"value\": \"MINIMAL\"\n                                     },\n                                     {\n-                                        \"description\": \"python 2.7 [jython 2.7.3]\",\n-                                        \"displayName\": \"python DEPRECATED\",\n-                                        \"value\": \"python\"\n+                                        \"description\": \"Values will be quoted unless the value is a number.\",\n+                                        \"displayName\": \"Quote Non-Numeric Values\",\n+                                        \"value\": \"NON_NUMERIC\"\n                                     },\n                                     {\n-                                        \"description\": \"ruby jruby 9.4.2.0 [JSR 223 JRuby Engine 9.4.2.0]\",\n-                                        \"displayName\": \"ruby DEPRECATED\",\n-                                        \"value\": \"ruby\"\n+                                        \"description\": \"Values will not be quoted. Instead, all special characters will be escaped using the configured escape character.\",\n+                                        \"displayName\": \"Do Not Quote Values\",\n+                                        \"value\": \"NONE\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"ECMAScript\",\n-                                \"description\": \"Language Engine for executing scripts\",\n-                                \"displayName\": \"Script Engine\",\n+                                \"defaultValue\": \"NONE\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"custom\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"CSV Format\",\n+                                        \"propertyName\": \"CSV Format\"\n+                                    }\n+                                ],\n+                                \"description\": \"Specifies how fields should be quoted when they are written\",\n+                                \"displayName\": \"Quote Mode\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Script Engine\",\n+                                \"name\": \"Quote Mode\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Script File\": {\n-                                \"description\": \"Path to script file to execute. Only one of Script File or Script Body may be used\",\n-                                \"displayName\": \"Script File\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Script File\",\n-                                \"required\": false,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"SINGLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\"\n-                                    ]\n-                                },\n-                                \"sensitive\": false\n-                            }\n-                        },\n-                        \"providedApiImplementations\": [\n-                            {\n-                                \"artifact\": \"nifi-standard-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.rules.engine.RulesEngineService\",\n-                                \"version\": \"1.27.0\"\n-                            }\n-                        ],\n-                        \"restricted\": true,\n-                        \"supportsDynamicProperties\": true,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"groovy\",\n-                            \"invoke\",\n-                            \"javascript\",\n-                            \"jruby\",\n-                            \"js\",\n-                            \"jython\",\n-                            \"lua\",\n-                            \"luaj\",\n-                            \"python\",\n-                            \"ruby\",\n-                            \"rules\",\n-                            \"rules engine\",\n-                            \"script\"\n-                        ],\n-                        \"type\": \"org.apache.nifi.rules.engine.script.ScriptedRulesEngine\",\n-                        \"typeDescription\": \"Allows the user to provide a scripted RulesEngineService for custom firing of rules depending on the supplied facts. The script must set a variable 'rulesEngine' to an implementation of RulesEngineService.\",\n-                        \"version\": \"1.27.0\"\n-                    },\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-scripting-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"e0c4461\"\n-                        },\n-                        \"dynamicProperties\": [\n-                            {\n-                                \"description\": \"Updates a script engine property specified by the Dynamic Property's key with the value specified by the Dynamic Property's value\",\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"name\": \"Script Engine Binding property\",\n-                                \"value\": \"Binding property value passed to Script Runner\"\n-                            }\n-                        ],\n-                        \"explicitRestrictions\": [\n-                            {\n-                                \"explanation\": \"Provides operator the ability to execute arbitrary code assuming all permissions that NiFi has.\",\n-                                \"requiredPermission\": \"execute code\"\n-                            }\n-                        ],\n-                        \"group\": \"org.apache.nifi\",\n-                        \"propertyDescriptors\": {\n-                            \"Module Directory\": {\n-                                \"description\": \"Comma-separated list of paths to files and/or directories which contain modules required by the script.\",\n-                                \"displayName\": \"Module Directory\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Module Directory\",\n-                                \"required\": false,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"MULTIPLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\",\n-                                        \"DIRECTORY\"\n-                                    ]\n-                                },\n-                                \"sensitive\": false\n-                            },\n-                            \"Script Body\": {\n-                                \"description\": \"Body of script to execute. Only one of Script File or Script Body may be used\",\n-                                \"displayName\": \"Script Body\",\n+                            \"Record Separator\": {\n+                                \"defaultValue\": \"\\\\n\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"custom\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"CSV Format\",\n+                                        \"propertyName\": \"CSV Format\"\n+                                    }\n+                                ],\n+                                \"description\": \"Specifies the characters to use in order to separate CSV Records\",\n+                                \"displayName\": \"Record Separator\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Script Body\",\n-                                \"required\": false,\n+                                \"name\": \"Record Separator\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Script Engine\": {\n+                            \"Trim Fields\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"ECMAScript ECMA - 262 Edition 5.1 [Oracle Nashorn 1.8.0_302-b08]\",\n-                                        \"displayName\": \"ECMAScript DEPRECATED\",\n-                                        \"value\": \"ECMAScript\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Groovy 3.0.21 [Groovy Scripting Engine 2.0]\",\n-                                        \"displayName\": \"Groovy\",\n-                                        \"value\": \"Groovy\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n-                                        \"description\": \"python 2.7 [jython 2.7.3]\",\n-                                        \"displayName\": \"python DEPRECATED\",\n-                                        \"value\": \"python\"\n-                                    },\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"true\",\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"ruby jruby 9.4.2.0 [JSR 223 JRuby Engine 9.4.2.0]\",\n-                                        \"displayName\": \"ruby DEPRECATED\",\n-                                        \"value\": \"ruby\"\n+                                        \"dependentValues\": [\n+                                            \"custom\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"CSV Format\",\n+                                        \"propertyName\": \"CSV Format\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"ECMAScript\",\n-                                \"description\": \"Language Engine for executing scripts\",\n-                                \"displayName\": \"Script Engine\",\n+                                \"description\": \"Whether or not white space should be removed from the beginning and end of fields\",\n+                                \"displayName\": \"Trim Fields\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Script Engine\",\n+                                \"name\": \"Trim Fields\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Script File\": {\n-                                \"description\": \"Path to script file to execute. Only one of Script File or Script Body may be used\",\n-                                \"displayName\": \"Script File\",\n+                            \"Value Separator\": {\n+                                \"defaultValue\": \",\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"custom\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"CSV Format\",\n+                                        \"propertyName\": \"CSV Format\"\n+                                    }\n+                                ],\n+                                \"description\": \"The character that is used to separate values/fields in a CSV Record. If the property has been specified via Expression Language but the expression gets evaluated to an invalid Value Separator at runtime, then it will be skipped and the default Value Separator will be used.\",\n+                                \"displayName\": \"Value Separator\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Script File\",\n-                                \"required\": false,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"SINGLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\"\n-                                    ]\n-                                },\n-                                \"sensitive\": false\n-                            }\n-                        },\n-                        \"providedApiImplementations\": [\n-                            {\n-                                \"artifact\": \"nifi-standard-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.rules.PropertyContextActionHandler\",\n-                                \"version\": \"1.27.0\"\n-                            }\n-                        ],\n-                        \"restricted\": true,\n-                        \"supportsDynamicProperties\": true,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"action\",\n-                            \"action handler\",\n-                            \"groovy\",\n-                            \"invoke\",\n-                            \"javascript\",\n-                            \"jruby\",\n-                            \"js\",\n-                            \"jython\",\n-                            \"lua\",\n-                            \"luaj\",\n-                            \"python\",\n-                            \"ruby\",\n-                            \"rules\",\n-                            \"rules engine\",\n-                            \"script\"\n-                        ],\n-                        \"type\": \"org.apache.nifi.rules.handlers.script.ScriptedActionHandler\",\n-                        \"typeDescription\": \"Allows the user to provide a scripted ActionHandler for custom firing of rules depending on the supplied facts. The script must set a variable 'actionHandler' to an implementation of ActionHandler.\",\n-                        \"version\": \"1.27.0\"\n-                    }\n-                ],\n-                \"processors\": [\n-                    {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-scripting-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"e0c4461\"\n-                        },\n-                        \"defaultBulletinLevel\": \"WARN\",\n-                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": 1,\n-                            \"TIMER_DRIVEN\": 1\n-                        },\n-                        \"defaultPenaltyDuration\": \"30 sec\",\n-                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"0 sec\"\n-                        },\n-                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n-                        \"defaultYieldDuration\": \"1 sec\",\n-                        \"dynamicProperties\": [\n-                            {\n-                                \"description\": \"Updates a script engine property specified by the Dynamic Property's key with the value specified by the Dynamic Property's value\",\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"name\": \"Script Engine Binding property\",\n-                                \"value\": \"Binding property value passed to Script Runner\"\n-                            }\n-                        ],\n-                        \"explicitRestrictions\": [\n-                            {\n-                                \"explanation\": \"Provides operator the ability to execute arbitrary code assuming all permissions that NiFi has.\",\n-                                \"requiredPermission\": \"execute code\"\n-                            }\n-                        ],\n-                        \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_ALLOWED\",\n-                        \"primaryNodeOnly\": false,\n-                        \"propertyDescriptors\": {\n-                            \"Module Directory\": {\n-                                \"description\": \"Comma-separated list of paths to files and/or directories which contain modules required by the script.\",\n-                                \"displayName\": \"Module Directory\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Value Separator\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"excel-extract-column-to-skip\": {\n+                                \"description\": \"Comma delimited list of column numbers to skip. Use the columns number and not the letter designation. Use this to skip over columns anywhere in your worksheet that you don't want extracted as part of the record.\",\n+                                \"displayName\": \"Columns To Skip\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Module Directory\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"excel-extract-column-to-skip\",\n                                 \"required\": false,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"MULTIPLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\",\n-                                        \"DIRECTORY\"\n-                                    ]\n-                                },\n                                 \"sensitive\": false\n                             },\n-                            \"Script Body\": {\n-                                \"description\": \"Body of script to execute. Only one of Script File or Script Body may be used\",\n-                                \"displayName\": \"Script Body\",\n+                            \"excel-extract-first-row\": {\n+                                \"defaultValue\": \"0\",\n+                                \"description\": \"The row number of the first row to start processing.Use this to skip over rows of data at the top of your worksheet that are not part of the dataset.Empty rows of data anywhere in the spreadsheet will always be skipped, no matter what this value is set to.\",\n+                                \"displayName\": \"Number of Rows to Skip\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Script Body\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"excel-extract-first-row\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Script Engine\": {\n+                            \"excel-format-booleans\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Clojure 1.8.0 [Clojure UNKNOWN]\",\n-                                        \"displayName\": \"Clojure\",\n-                                        \"value\": \"Clojure\"\n-                                    },\n-                                    {\n-                                        \"description\": \"ECMAScript ECMA - 262 Edition 5.1 [Oracle Nashorn 1.8.0_302-b08]\",\n-                                        \"displayName\": \"ECMAScript DEPRECATED\",\n-                                        \"value\": \"ECMAScript\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Groovy 3.0.21 [Groovy Scripting Engine 2.0]\",\n-                                        \"displayName\": \"Groovy\",\n-                                        \"value\": \"Groovy\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n-                                        \"description\": \"lua 5.2 [Luaj Luaj-jse 3.0.1]\",\n-                                        \"displayName\": \"lua DEPRECATED\",\n-                                        \"value\": \"lua\"\n-                                    },\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"true\",\n+                                \"description\": \"If true, true/false will be represented by TRUE/FALSE. If false, true/false will be represented by 0/1.\",\n+                                \"displayName\": \"Format Booleans\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"excel-format-booleans\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"excel-format-values\": {\n+                                \"allowableValues\": [\n                                     {\n-                                        \"description\": \"python 2.7 [jython 2.7.3]\",\n-                                        \"displayName\": \"python DEPRECATED\",\n-                                        \"value\": \"python\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n-                                        \"description\": \"ruby jruby 9.4.2.0 [JSR 223 JRuby Engine 9.4.2.0]\",\n-                                        \"displayName\": \"ruby DEPRECATED\",\n-                                        \"value\": \"ruby\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"Clojure\",\n-                                \"description\": \"Language Engine for executing scripts\",\n-                                \"displayName\": \"Script Engine\",\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"Should the cell values be written to CSV using the formatting applied in Excel, or should they be printed as raw values.\",\n+                                \"displayName\": \"Format Cell Values\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Script Engine\",\n+                                \"name\": \"excel-format-values\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Script File\": {\n-                                \"description\": \"Path to script file to execute. Only one of Script File or Script Body may be used\",\n-                                \"displayName\": \"Script File\",\n+                            \"extract-sheets\": {\n+                                \"description\": \"Comma separated list of Excel document sheet names that should be extracted from the excel document. If this property is left blank then all of the sheets will be extracted from the Excel document. The list of names is case in-sensitive. Any sheets not specified in this value will be ignored. A bulletin will be generated if a specified sheet(s) are not found.\",\n+                                \"displayName\": \"Sheets to Extract\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Script File\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"extract-sheets\",\n                                 \"required\": false,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"SINGLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\"\n-                                    ]\n-                                },\n                                 \"sensitive\": false\n                             }\n                         },\n-                        \"restricted\": true,\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.processors.script.InvokeScriptedProcessor\"\n-                        ],\n                         \"sideEffectFree\": false,\n-                        \"stateful\": {\n-                            \"description\": \"Scripts can store and retrieve state using the State Management APIs. Consult the State Manager section of the Developer's Guide for more details.\",\n-                            \"scopes\": [\n-                                \"CLUSTER\",\n-                                \"LOCAL\"\n-                            ]\n-                        },\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"FlowFiles that were successfully processed\",\n+                                \"description\": \"Original Excel document received by this processor\",\n+                                \"name\": \"original\"\n+                            },\n+                            {\n+                                \"description\": \"Excel data converted to csv\",\n                                 \"name\": \"success\"\n                             },\n                             {\n-                                \"description\": \"FlowFiles that failed to be processed\",\n+                                \"description\": \"Failed to parse the Excel document\",\n                                 \"name\": \"failure\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n                         \"supportsBatching\": false,\n-                        \"supportsDynamicProperties\": true,\n+                        \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsEventDriven\": false,\n-                        \"supportsSensitiveDynamicProperties\": true,\n+                        \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"clojure\",\n-                            \"execute\",\n-                            \"groovy\",\n-                            \"javascript\",\n-                            \"jruby\",\n-                            \"js\",\n-                            \"jython\",\n-                            \"lua\",\n-                            \"luaj\",\n-                            \"python\",\n-                            \"ruby\",\n-                            \"script\"\n+                            \"csv\",\n+                            \"excel\",\n+                            \"poi\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.script.ExecuteScript\",\n-                        \"typeDescription\": \"Experimental - Executes a script given the flow file and a process session.  The script is responsible for handling the incoming flow file (transfer to SUCCESS or remove, e.g.) as well as any flow files created by the script. If the handling is incomplete or incorrect, the session will be rolled back. Experimental: Impact of sustained usage not yet verified.\",\n-                        \"version\": \"1.27.0\"\n+                        \"type\": \"org.apache.nifi.processors.poi.ConvertExcelToCSVProcessor\",\n+                        \"typeDescription\": \"Consumes a Microsoft Excel document and converts each worksheet to csv. Each sheet from the incoming Excel document will generate a new Flowfile that will be output from this processor. Each output Flowfile's contents will be formatted as a csv file where the each row from the excel sheet is output as a newline in the csv file. This processor is currently only capable of processing .xlsx (XSSF 2007 OOXML file format) Excel documents and not older .xls (HSSF '97(-2007) file format) documents. This processor also expects well formatted CSV content and will not escape cell's containing invalid content such as newlines or additional commas.\",\n+                        \"version\": \"1.27.0\",\n+                        \"writesAttributes\": [\n+                            {\n+                                \"description\": \"The name of the Excel sheet that this particular row of data came from in the Excel document\",\n+                                \"name\": \"sheetname\"\n+                            },\n+                            {\n+                                \"description\": \"The number of rows in this Excel Sheet\",\n+                                \"name\": \"numrows\"\n+                            },\n+                            {\n+                                \"description\": \"The name of the Excel document file that this data originated from\",\n+                                \"name\": \"sourcefilename\"\n+                            },\n+                            {\n+                                \"description\": \"Error message that was encountered on a per Excel sheet basis. This attribute is only populated if an error was occured while processing the particular sheet. Having the error present at the sheet level will allow for the end user to better understand what syntax errors in their excel doc on a larger scale caused the error.\",\n+                                \"name\": \"convertexceltocsvprocessor.error\"\n+                            }\n+                        ]\n                     },\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-scripting-nar\",\n+                        \"artifact\": \"nifi-poi-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -9292,1211 +6893,1698 @@\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n-                        \"dynamicProperties\": [\n-                            {\n-                                \"description\": \"Updates a script engine property specified by the Dynamic Property's key with the value specified by the Dynamic Property's value\",\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"name\": \"Script Engine Binding property\",\n-                                \"value\": \"Binding property value passed to Script Runner\"\n-                            }\n-                        ],\n-                        \"explicitRestrictions\": [\n-                            {\n-                                \"explanation\": \"Provides operator the ability to execute arbitrary code assuming all permissions that NiFi has.\",\n-                                \"requiredPermission\": \"execute code\"\n-                            }\n-                        ],\n                         \"group\": \"org.apache.nifi\",\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Module Directory\": {\n-                                \"description\": \"Comma-separated list of paths to files and/or directories which contain modules required by the script.\",\n-                                \"displayName\": \"Module Directory\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Module Directory\",\n-                                \"required\": false,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"MULTIPLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\",\n-                                        \"DIRECTORY\"\n-                                    ]\n-                                },\n-                                \"sensitive\": false\n-                            },\n-                            \"Script Body\": {\n-                                \"description\": \"Body of script to execute. Only one of Script File or Script Body may be used\",\n-                                \"displayName\": \"Script Body\",\n+                            \"Password\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"PASSWORD\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Protection Type\",\n+                                        \"propertyName\": \"Protection Type\"\n+                                    }\n+                                ],\n+                                \"description\": \"The password for a password protected Excel spreadsheet\",\n+                                \"displayName\": \"Password\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Script Body\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n+                                \"name\": \"Password\",\n+                                \"required\": true,\n+                                \"sensitive\": true\n                             },\n-                            \"Script Engine\": {\n+                            \"Protection Type\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"ECMAScript ECMA - 262 Edition 5.1 [Oracle Nashorn 1.8.0_302-b08]\",\n-                                        \"displayName\": \"ECMAScript DEPRECATED\",\n-                                        \"value\": \"ECMAScript\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Groovy 3.0.21 [Groovy Scripting Engine 2.0]\",\n-                                        \"displayName\": \"Groovy\",\n-                                        \"value\": \"Groovy\"\n-                                    },\n-                                    {\n-                                        \"description\": \"python 2.7 [jython 2.7.3]\",\n-                                        \"displayName\": \"python DEPRECATED\",\n-                                        \"value\": \"python\"\n+                                        \"description\": \"An Excel spreadsheet not protected by a password\",\n+                                        \"displayName\": \"Unprotected\",\n+                                        \"value\": \"UNPROTECTED\"\n                                     },\n                                     {\n-                                        \"description\": \"ruby jruby 9.4.2.0 [JSR 223 JRuby Engine 9.4.2.0]\",\n-                                        \"displayName\": \"ruby DEPRECATED\",\n-                                        \"value\": \"ruby\"\n+                                        \"description\": \"An Excel spreadsheet protected by a password\",\n+                                        \"displayName\": \"Password Protected\",\n+                                        \"value\": \"PASSWORD\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"ECMAScript\",\n-                                \"description\": \"Language Engine for executing scripts\",\n-                                \"displayName\": \"Script Engine\",\n+                                \"defaultValue\": \"UNPROTECTED\",\n+                                \"description\": \"Specifies whether an Excel spreadsheet is protected by a password or not.\",\n+                                \"displayName\": \"Protection Type\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Script Engine\",\n+                                \"name\": \"Protection Type\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n-                            },\n-                            \"Script File\": {\n-                                \"description\": \"Path to script file to execute. Only one of Script File or Script Body may be used\",\n-                                \"displayName\": \"Script File\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Script File\",\n-                                \"required\": false,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"SINGLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\"\n-                                    ]\n-                                },\n-                                \"sensitive\": false\n                             }\n                         },\n-                        \"restricted\": true,\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.processors.script.ExecuteScript\"\n+                        \"sideEffectFree\": true,\n+                        \"supportedRelationships\": [\n+                            {\n+                                \"description\": \"If a FlowFile cannot be transformed from the configured input format to the configured output format, the unchanged FlowFile will be routed to this relationship.\",\n+                                \"name\": \"failure\"\n+                            },\n+                            {\n+                                \"description\": \"The original FlowFile that was split into segments. If the FlowFile fails processing, nothing will be sent to this relationship\",\n+                                \"name\": \"original\"\n+                            },\n+                            {\n+                                \"description\": \"The individual Excel 'segments' of the original Excel FlowFile will be routed to this relationship.\",\n+                                \"name\": \"split\"\n+                            }\n                         ],\n-                        \"sideEffectFree\": false,\n-                        \"stateful\": {\n-                            \"description\": \"Scripts can store and retrieve state using the State Management APIs. Consult the State Manager section of the Developer's Guide for more details.\",\n-                            \"scopes\": [\n-                                \"CLUSTER\",\n-                                \"LOCAL\"\n-                            ]\n-                        },\n-                        \"supportedRelationships\": [],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n-                        \"supportsBatching\": false,\n-                        \"supportsDynamicProperties\": true,\n+                        \"supportsBatching\": true,\n+                        \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsEventDriven\": false,\n-                        \"supportsSensitiveDynamicProperties\": true,\n+                        \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"groovy\",\n-                            \"invoke\",\n-                            \"javascript\",\n-                            \"jruby\",\n-                            \"js\",\n-                            \"jython\",\n-                            \"lua\",\n-                            \"luaj\",\n-                            \"python\",\n-                            \"ruby\",\n-                            \"script\"\n+                            \"split\",\n+                            \"text\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.script.InvokeScriptedProcessor\",\n-                        \"typeDescription\": \"Experimental - Invokes a script engine for a Processor defined in the given script. The script must define a valid class that implements the Processor interface, and it must set a variable 'processor' to an instance of the class. Processor methods such as onTrigger() will be delegated to the scripted Processor instance. Also any Relationships or PropertyDescriptors defined by the scripted processor will be added to the configuration dialog. The scripted processor can implement public void setLogger(ComponentLog logger) to get access to the parent logger, as well as public void onScheduled(ProcessContext context) and public void onStopped(ProcessContext context) methods to be invoked when the parent InvokeScriptedProcessor is scheduled or stopped, respectively.  NOTE: The script will be loaded when the processor is populated with property values, see the Restrictions section for more security implications.  Experimental: Impact of sustained usage not yet verified.\",\n-                        \"version\": \"1.27.0\"\n-                    },\n+                        \"type\": \"org.apache.nifi.processors.poi.SplitExcel\",\n+                        \"typeDescription\": \"Splits a multi sheet Microsoft Excel spreadsheet into multiple Microsoft Excel spreadsheets where each sheet from the original file is converted to an individual spreadsheet in its own flow file.  This processor is currently only capable of processing .xlsx (XSSF 2007 OOXML file format) Excel documents and not older .xls (HSSF '97(-2007) file format) documents.\",\n+                        \"version\": \"1.27.0\",\n+                        \"writesAttributes\": [\n+                            {\n+                                \"description\": \"All split Excel FlowFiles produced from the same parent Excel FlowFile will have the same randomly generated UUID added for this attribute\",\n+                                \"name\": \"fragment.identifier\"\n+                            },\n+                            {\n+                                \"description\": \"A one-up number that indicates the ordering of the split Excel FlowFiles that were created from a single parent Excel FlowFile\",\n+                                \"name\": \"fragment.index\"\n+                            },\n+                            {\n+                                \"description\": \"The number of split Excel FlowFiles generated from the parent Excel FlowFile\",\n+                                \"name\": \"fragment.count\"\n+                            },\n+                            {\n+                                \"description\": \"The filename of the parent Excel FlowFile\",\n+                                \"name\": \"segment.original.filename\"\n+                            },\n+                            {\n+                                \"description\": \"The name of the Excel sheet from the original spreadsheet.\",\n+                                \"name\": \"sheetname\"\n+                            },\n+                            {\n+                                \"description\": \"The number of rows in the Excel sheet from the original spreadsheet.\",\n+                                \"name\": \"total.rows\"\n+                            }\n+                        ]\n+                    }\n+                ],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"1.27.0\"\n+        },\n+        {\n+            \"artifact\": \"nifi-ranger-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [],\n+                \"processors\": [],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"1.27.0\"\n+        },\n+        {\n+            \"artifact\": \"nifi-kafka-1-0-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [\n                     {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-scripting-nar\",\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-kafka-1-0-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n-                        \"defaultBulletinLevel\": \"WARN\",\n-                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": 1,\n-                            \"EVENT_DRIVEN\": 0,\n-                            \"TIMER_DRIVEN\": 1\n-                        },\n-                        \"defaultPenaltyDuration\": \"30 sec\",\n-                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"0 sec\"\n-                        },\n-                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n-                        \"defaultYieldDuration\": \"1 sec\",\n-                        \"explicitRestrictions\": [\n+                        \"deprecated\": true,\n+                        \"deprecationAlternatives\": [\n+                            \"org.apache.nifi.record.sink.kafka.KafkaRecordSink_2_6\"\n+                        ],\n+                        \"deprecationReason\": \"\",\n+                        \"dynamicProperties\": [\n                             {\n-                                \"explanation\": \"Provides operator the ability to execute arbitrary code assuming all permissions that NiFi has.\",\n-                                \"requiredPermission\": \"execute code\"\n+                                \"description\": \"These properties will be added on the Kafka configuration after loading any provided configuration properties. In the event a dynamic property represents a property that was already set, its value will be ignored and WARN message logged. For the list of available Kafka properties please refer to: http://kafka.apache.org/documentation.html#configuration. \",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"name\": \"The name of a Kafka configuration property.\",\n+                                \"value\": \"The value of a given Kafka configuration property.\"\n                             }\n                         ],\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_REQUIRED\",\n-                        \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Module Directory\": {\n-                                \"description\": \"Comma-separated list of paths to files and/or directories which contain modules required by the script.\",\n-                                \"displayName\": \"Module Directory\",\n+                            \"ack.wait.time\": {\n+                                \"defaultValue\": \"5 secs\",\n+                                \"description\": \"After sending a message to Kafka, this indicates the amount of time that we are willing to wait for a response from Kafka. If Kafka does not acknowledge the message within this time period, the FlowFile will be routed to 'failure'.\",\n+                                \"displayName\": \"Acknowledgment Wait Time\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"ack.wait.time\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"acks\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"Records are considered 'transmitted successfully' after successfully writing the content to a Kafka node, without waiting for a response. This provides the best performance but may result in data loss.\",\n+                                        \"displayName\": \"Best Effort\",\n+                                        \"value\": \"0\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Records are considered 'transmitted successfully' if the message is received by a single Kafka node, whether or not it is replicated. This is faster than <Guarantee Replicated Delivery> but can result in data loss if a Kafka node crashes.\",\n+                                        \"displayName\": \"Guarantee Single Node Delivery\",\n+                                        \"value\": \"1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Records are considered 'transmitted unsuccessfully' unless the message is replicated to the appropriate number of Kafka Nodes according to the Topic configuration.\",\n+                                        \"displayName\": \"Guarantee Replicated Delivery\",\n+                                        \"value\": \"all\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"0\",\n+                                \"description\": \"Specifies the requirement for guaranteeing that a message is sent to Kafka. Corresponds to Kafka's 'acks' property.\",\n+                                \"displayName\": \"Delivery Guarantee\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"acks\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"bootstrap.servers\": {\n+                                \"defaultValue\": \"localhost:9092\",\n+                                \"description\": \"Comma-separated list of Kafka Brokers in the format host:port\",\n+                                \"displayName\": \"Kafka Brokers\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Module Directory\",\n-                                \"required\": false,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"MULTIPLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\",\n-                                        \"DIRECTORY\"\n-                                    ]\n-                                },\n+                                \"name\": \"bootstrap.servers\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Record Reader\": {\n-                                \"description\": \"The Record Reader to use parsing the incoming FlowFile into Records\",\n-                                \"displayName\": \"Record Reader\",\n+                            \"compression.type\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"none\",\n+                                        \"value\": \"none\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"gzip\",\n+                                        \"value\": \"gzip\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"snappy\",\n+                                        \"value\": \"snappy\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"lz4\",\n+                                        \"value\": \"lz4\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"none\",\n+                                \"description\": \"This parameter allows you to specify the compression codec for all data generated by this producer.\",\n+                                \"displayName\": \"Compression Type\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Record Reader\",\n+                                \"name\": \"compression.type\",\n                                 \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"kerberos-credentials-service\": {\n+                                \"description\": \"Service supporting generalized credentials authentication with Kerberos\",\n+                                \"displayName\": \"Kerberos Credentials Service\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"kerberos-credentials-service\",\n+                                \"required\": false,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n                                     \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n+                                    \"type\": \"org.apache.nifi.kerberos.KerberosCredentialsService\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             },\n-                            \"Record Writer\": {\n-                                \"description\": \"The Record Writer to use for serializing Records after they have been transformed\",\n+                            \"max.block.ms\": {\n+                                \"defaultValue\": \"5 sec\",\n+                                \"description\": \"The amount of time publisher will wait to obtain metadata or wait for the buffer to flush during the 'send' call before failing the entire 'send' call. Corresponds to Kafka's 'max.block.ms' property\",\n+                                \"displayName\": \"Max Metadata Wait Time\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"max.block.ms\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"max.request.size\": {\n+                                \"defaultValue\": \"1 MB\",\n+                                \"description\": \"The maximum size of a request in bytes. Corresponds to Kafka's 'max.request.size' property and defaults to 1 MB (1048576).\",\n+                                \"displayName\": \"Max Request Size\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"max.request.size\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"message-header-encoding\": {\n+                                \"defaultValue\": \"UTF-8\",\n+                                \"description\": \"For any attribute that is added as a message header, as configured via the <Attributes to Send as Headers> property, this property indicates the Character Encoding to use for serializing the headers.\",\n+                                \"displayName\": \"Message Header Encoding\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"message-header-encoding\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"record-sink-record-writer\": {\n+                                \"description\": \"Specifies the Controller Service to use for writing out the records.\",\n                                 \"displayName\": \"Record Writer\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Record Writer\",\n+                                \"name\": \"record-sink-record-writer\",\n                                 \"required\": true,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n                                     \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n                                     \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             },\n-                            \"Script Body\": {\n-                                \"description\": \"Body of script to execute. Only one of Script File or Script Body may be used\",\n-                                \"displayName\": \"Script Body\",\n+                            \"sasl.kerberos.service.name\": {\n+                                \"description\": \"The service name that matches the primary name of the Kafka server configured in the broker JAAS configuration\",\n+                                \"displayName\": \"Kerberos Service Name\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Script Body\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"sasl.kerberos.service.name\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Script Engine\": {\n+                            \"sasl.mechanism\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Clojure\",\n-                                        \"value\": \"Clojure\"\n+                                        \"description\": \"General Security Services API for Kerberos authentication\",\n+                                        \"displayName\": \"GSSAPI\",\n+                                        \"value\": \"GSSAPI\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"ECMAScript\",\n-                                        \"value\": \"ECMAScript\"\n+                                        \"description\": \"Plain username and password authentication\",\n+                                        \"displayName\": \"PLAIN\",\n+                                        \"value\": \"PLAIN\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Salted Challenge Response Authentication Mechanism using SHA-512 with username and password\",\n+                                        \"displayName\": \"SCRAM-SHA-256\",\n+                                        \"value\": \"SCRAM-SHA-256\"\n                                     },\n                                     {\n+                                        \"description\": \"Salted Challenge Response Authentication Mechanism using SHA-256 with username and password\",\n+                                        \"displayName\": \"SCRAM-SHA-512\",\n+                                        \"value\": \"SCRAM-SHA-512\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"GSSAPI\",\n+                                \"description\": \"SASL mechanism used for authentication. Corresponds to Kafka Client sasl.mechanism property\",\n+                                \"displayName\": \"SASL Mechanism\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"sasl.mechanism\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"security.protocol\": {\n+                                \"allowableValues\": [\n+                                    {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"Groovy\",\n-                                        \"value\": \"Groovy\"\n+                                        \"displayName\": \"PLAINTEXT\",\n+                                        \"value\": \"PLAINTEXT\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"lua\",\n-                                        \"value\": \"lua\"\n+                                        \"displayName\": \"SSL\",\n+                                        \"value\": \"SSL\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"python\",\n-                                        \"value\": \"python\"\n+                                        \"displayName\": \"SASL_PLAINTEXT\",\n+                                        \"value\": \"SASL_PLAINTEXT\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"ruby\",\n-                                        \"value\": \"ruby\"\n+                                        \"displayName\": \"SASL_SSL\",\n+                                        \"value\": \"SASL_SSL\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"Groovy\",\n-                                \"description\": \"The Language to use for the script\",\n-                                \"displayName\": \"Script Language\",\n+                                \"defaultValue\": \"PLAINTEXT\",\n+                                \"description\": \"Security protocol used to communicate with brokers. Corresponds to Kafka Client security.protocol property\",\n+                                \"displayName\": \"Security Protocol\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Script Engine\",\n+                                \"name\": \"security.protocol\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Script File\": {\n-                                \"description\": \"Path to script file to execute. Only one of Script File or Script Body may be used\",\n-                                \"displayName\": \"Script File\",\n+                            \"ssl.context.service\": {\n+                                \"description\": \"Service supporting SSL communication with Kafka brokers\",\n+                                \"displayName\": \"SSL Context Service\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"ssl.context.service\",\n+                                \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"topic\": {\n+                                \"description\": \"The name of the Kafka Topic to publish to.\",\n+                                \"displayName\": \"Topic Name\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Script File\",\n-                                \"required\": false,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"SINGLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\"\n-                                    ]\n-                                },\n+                                \"name\": \"topic\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             }\n                         },\n-                        \"restricted\": true,\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.processors.script.ScriptedPartitionRecord\",\n-                            \"org.apache.nifi.processors.script.ScriptedTransformRecord\",\n-                            \"org.apache.nifi.processors.script.ScriptedValidateRecord\"\n-                        ],\n-                        \"sideEffectFree\": true,\n-                        \"supportedRelationships\": [\n-                            {\n-                                \"description\": \"Matching records of the original FlowFile will be routed to this relationship. If there are no matching records, no FlowFile will be routed here.\",\n-                                \"name\": \"success\"\n-                            },\n-                            {\n-                                \"description\": \"In case of any issue during processing the incoming FlowFile, the incoming FlowFile will be routed to this relationship.\",\n-                                \"name\": \"failure\"\n-                            },\n+                        \"providedApiImplementations\": [\n                             {\n-                                \"description\": \"After successful procession, the incoming FlowFile will be transferred to this relationship. This happens regardless the number of filtered or remaining records.\",\n-                                \"name\": \"original\"\n+                                \"artifact\": \"nifi-standard-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.record.sink.RecordSinkService\",\n+                                \"version\": \"1.27.0\"\n                             }\n                         ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\",\n-                            \"EVENT_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": true,\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": true,\n+                        \"supportsDynamicProperties\": true,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"filter\",\n-                            \"groovy\",\n-                            \"jython\",\n-                            \"python\",\n+                            \"kafka\",\n                             \"record\",\n-                            \"script\"\n+                            \"sink\"\n                         ],\n-                        \"triggerSerially\": false,\n-                        \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.script.ScriptedFilterRecord\",\n-                        \"typeDescription\": \"This processor provides the ability to filter records out from FlowFiles using the user-provided script. Every record will be evaluated by the script which must return with a boolean value. Records with \\\"true\\\" result will be routed to the \\\"matching\\\" relationship in a batch. Other records will be filtered out.\",\n-                        \"version\": \"1.27.0\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"Sets the mime.type attribute to the MIME Type specified by the Record Writer\",\n-                                \"name\": \"mime.type\"\n-                            },\n-                            {\n-                                \"description\": \"The number of records within the flow file.\",\n-                                \"name\": \"record.count\"\n-                            },\n-                            {\n-                                \"description\": \"This attribute provides on failure the error message encountered by the Reader or Writer.\",\n-                                \"name\": \"record.error.message\"\n-                            }\n-                        ]\n-                    },\n+                        \"type\": \"org.apache.nifi.record.sink.kafka.KafkaRecordSink_1_0\",\n+                        \"typeDescription\": \"Provides a service to write records to a Kafka 1.x topic.\",\n+                        \"version\": \"1.27.0\"\n+                    }\n+                ],\n+                \"processors\": [\n                     {\n                         \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-scripting-nar\",\n+                        \"artifact\": \"nifi-kafka-1-0-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n-                            \"EVENT_DRIVEN\": 0,\n                             \"TIMER_DRIVEN\": 1\n                         },\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n-                        \"explicitRestrictions\": [\n+                        \"deprecated\": true,\n+                        \"deprecationAlternatives\": [\n+                            \"org.apache.nifi.processors.kafka.pubsub.ConsumeKafkaRecord_2_6\"\n+                        ],\n+                        \"deprecationReason\": \"\",\n+                        \"dynamicProperties\": [\n                             {\n-                                \"explanation\": \"Provides operator the ability to execute arbitrary code assuming all permissions that NiFi has.\",\n-                                \"requiredPermission\": \"execute code\"\n+                                \"description\": \"These properties will be added on the Kafka configuration after loading any provided configuration properties. In the event a dynamic property represents a property that was already set, its value will be ignored and WARN message logged. For the list of available Kafka properties please refer to: http://kafka.apache.org/documentation.html#configuration. \",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"name\": \"The name of a Kafka configuration property.\",\n+                                \"value\": \"The value of a given Kafka configuration property.\"\n                             }\n                         ],\n                         \"group\": \"org.apache.nifi\",\n+                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Module Directory\": {\n-                                \"description\": \"Comma-separated list of paths to files and/or directories which contain modules required by the script.\",\n-                                \"displayName\": \"Module Directory\",\n+                            \"auto.offset.reset\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"Automatically reset the offset to the earliest offset\",\n+                                        \"displayName\": \"earliest\",\n+                                        \"value\": \"earliest\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Automatically reset the offset to the latest offset\",\n+                                        \"displayName\": \"latest\",\n+                                        \"value\": \"latest\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Throw exception to the consumer if no previous offset is found for the consumer's group\",\n+                                        \"displayName\": \"none\",\n+                                        \"value\": \"none\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"latest\",\n+                                \"description\": \"Allows you to manage the condition when there is no initial offset in Kafka or if the current offset does not exist any more on the server (e.g. because that data has been deleted). Corresponds to Kafka's 'auto.offset.reset' property.\",\n+                                \"displayName\": \"Offset Reset\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"auto.offset.reset\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"bootstrap.servers\": {\n+                                \"defaultValue\": \"localhost:9092\",\n+                                \"description\": \"Comma-separated list of Kafka Brokers in the format host:port\",\n+                                \"displayName\": \"Kafka Brokers\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Module Directory\",\n+                                \"name\": \"bootstrap.servers\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"group.id\": {\n+                                \"description\": \"A Group ID is used to identify consumers that are within the same consumer group. Corresponds to Kafka's 'group.id' property.\",\n+                                \"displayName\": \"Group ID\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"group.id\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"header-name-regex\": {\n+                                \"description\": \"A Regular Expression that is matched against all message headers. Any message header whose name matches the regex will be added to the FlowFile as an Attribute. If not specified, no Header values will be added as FlowFile attributes. If two messages have a different value for the same header and that header is selected by the provided regex, then those two messages must be added to different FlowFiles. As a result, users should be cautious about using a regex like \\\".*\\\" if messages are expected to have header values that are unique per message, such as an identifier or timestamp, because it will prevent NiFi from bundling the messages together efficiently.\",\n+                                \"displayName\": \"Headers to Add as Attributes (Regex)\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"header-name-regex\",\n                                 \"required\": false,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"MULTIPLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\",\n-                                        \"DIRECTORY\"\n-                                    ]\n-                                },\n                                 \"sensitive\": false\n                             },\n-                            \"Record Reader\": {\n-                                \"description\": \"The Record Reader to use parsing the incoming FlowFile into Records\",\n+                            \"honor-transactions\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"true\",\n+                                \"description\": \"Specifies whether or not NiFi should honor transactional guarantees when communicating with Kafka. If false, the Processor will use an \\\"isolation level\\\" of read_uncomitted. This means that messages will be received as soon as they are written to Kafka but will be pulled, even if the producer cancels the transactions. If this value is true, NiFi will not receive any messages for which the producer's transaction was canceled, but this can result in some latency since the consumer must wait for the producer to finish its entire transaction instead of pulling as the messages become available.\",\n+                                \"displayName\": \"Honor Transactions\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"honor-transactions\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"kerberos-credentials-service\": {\n+                                \"description\": \"Service supporting generalized credentials authentication with Kerberos\",\n+                                \"displayName\": \"Kerberos Credentials Service\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"kerberos-credentials-service\",\n+                                \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.kerberos.KerberosCredentialsService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"max-uncommit-offset-wait\": {\n+                                \"defaultValue\": \"1 secs\",\n+                                \"description\": \"Specifies the maximum amount of time allowed to pass before offsets must be committed. This value impacts how often offsets will be committed.  Committing offsets less often increases throughput but also increases the window of potential data duplication in the event of a rebalance or JVM restart between commits.  This value is also related to maximum poll records and the use of a message demarcator.  When using a message demarcator we can have far more uncommitted messages than when we're not as there is much less for us to keep track of in memory.\",\n+                                \"displayName\": \"Max Uncommitted Time\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"max-uncommit-offset-wait\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"max.poll.records\": {\n+                                \"defaultValue\": \"10000\",\n+                                \"description\": \"Specifies the maximum number of records Kafka should return in a single poll.\",\n+                                \"displayName\": \"Max Poll Records\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"max.poll.records\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"message-header-encoding\": {\n+                                \"defaultValue\": \"UTF-8\",\n+                                \"description\": \"Any message header that is found on a Kafka message will be added to the outbound FlowFile as an attribute. This property indicates the Character Encoding to use for deserializing the headers.\",\n+                                \"displayName\": \"Message Header Encoding\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"message-header-encoding\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"record-reader\": {\n+                                \"description\": \"The Record Reader to use for incoming FlowFiles\",\n                                 \"displayName\": \"Record Reader\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Record Reader\",\n+                                \"name\": \"record-reader\",\n                                 \"required\": true,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n                                     \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n                                     \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             },\n-                            \"Record Writer\": {\n-                                \"description\": \"The Record Writer to use for serializing Records after they have been transformed\",\n+                            \"record-writer\": {\n+                                \"description\": \"The Record Writer to use in order to serialize the data before sending to Kafka\",\n                                 \"displayName\": \"Record Writer\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Record Writer\",\n+                                \"name\": \"record-writer\",\n                                 \"required\": true,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n                                     \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n                                     \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             },\n-                            \"Script Body\": {\n-                                \"description\": \"Body of script to execute. Only one of Script File or Script Body may be used\",\n-                                \"displayName\": \"Script Body\",\n+                            \"sasl.kerberos.keytab\": {\n+                                \"description\": \"Keytab credentials used for authentication with Kerberos\",\n+                                \"displayName\": \"Kerberos Keytab\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Script Body\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"sasl.kerberos.keytab\",\n                                 \"required\": false,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"SINGLE\",\n+                                    \"resourceTypes\": [\n+                                        \"FILE\"\n+                                    ]\n+                                },\n                                 \"sensitive\": false\n                             },\n-                            \"Script Engine\": {\n+                            \"sasl.kerberos.principal\": {\n+                                \"description\": \"Principal used for authentication with Kerberos\",\n+                                \"displayName\": \"Kerberos Principal\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"sasl.kerberos.principal\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"sasl.kerberos.service.name\": {\n+                                \"description\": \"The service name that matches the primary name of the Kafka server configured in the broker JAAS configuration\",\n+                                \"displayName\": \"Kerberos Service Name\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"sasl.kerberos.service.name\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"sasl.mechanism\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Clojure\",\n-                                        \"value\": \"Clojure\"\n+                                        \"description\": \"General Security Services API for Kerberos authentication\",\n+                                        \"displayName\": \"GSSAPI\",\n+                                        \"value\": \"GSSAPI\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"ECMAScript\",\n-                                        \"value\": \"ECMAScript\"\n+                                        \"description\": \"Plain username and password authentication\",\n+                                        \"displayName\": \"PLAIN\",\n+                                        \"value\": \"PLAIN\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Salted Challenge Response Authentication Mechanism using SHA-512 with username and password\",\n+                                        \"displayName\": \"SCRAM-SHA-256\",\n+                                        \"value\": \"SCRAM-SHA-256\"\n                                     },\n                                     {\n+                                        \"description\": \"Salted Challenge Response Authentication Mechanism using SHA-256 with username and password\",\n+                                        \"displayName\": \"SCRAM-SHA-512\",\n+                                        \"value\": \"SCRAM-SHA-512\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"GSSAPI\",\n+                                \"description\": \"SASL mechanism used for authentication. Corresponds to Kafka Client sasl.mechanism property\",\n+                                \"displayName\": \"SASL Mechanism\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"sasl.mechanism\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"security.protocol\": {\n+                                \"allowableValues\": [\n+                                    {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"Groovy\",\n-                                        \"value\": \"Groovy\"\n+                                        \"displayName\": \"PLAINTEXT\",\n+                                        \"value\": \"PLAINTEXT\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"lua\",\n-                                        \"value\": \"lua\"\n+                                        \"displayName\": \"SSL\",\n+                                        \"value\": \"SSL\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"python\",\n-                                        \"value\": \"python\"\n+                                        \"displayName\": \"SASL_PLAINTEXT\",\n+                                        \"value\": \"SASL_PLAINTEXT\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"ruby\",\n-                                        \"value\": \"ruby\"\n+                                        \"displayName\": \"SASL_SSL\",\n+                                        \"value\": \"SASL_SSL\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"Groovy\",\n-                                \"description\": \"The Language to use for the script\",\n-                                \"displayName\": \"Script Language\",\n+                                \"defaultValue\": \"PLAINTEXT\",\n+                                \"description\": \"Security protocol used to communicate with brokers. Corresponds to Kafka Client security.protocol property\",\n+                                \"displayName\": \"Security Protocol\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Script Engine\",\n+                                \"name\": \"security.protocol\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Script File\": {\n-                                \"description\": \"Path to script file to execute. Only one of Script File or Script Body may be used\",\n-                                \"displayName\": \"Script File\",\n+                            \"ssl.context.service\": {\n+                                \"description\": \"Service supporting SSL communication with Kafka brokers\",\n+                                \"displayName\": \"SSL Context Service\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"ssl.context.service\",\n+                                \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"topic\": {\n+                                \"description\": \"The name of the Kafka Topic(s) to pull from. More than one can be supplied if comma separated.\",\n+                                \"displayName\": \"Topic Name(s)\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Script File\",\n-                                \"required\": false,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"SINGLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\"\n-                                    ]\n-                                },\n+                                \"name\": \"topic\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"topic_type\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"Topic is a full topic name or comma separated list of names\",\n+                                        \"displayName\": \"names\",\n+                                        \"value\": \"names\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Topic is a regex using the Java Pattern syntax\",\n+                                        \"displayName\": \"pattern\",\n+                                        \"value\": \"pattern\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"names\",\n+                                \"description\": \"Specifies whether the Topic(s) provided are a comma separated list of names or a single regular expression\",\n+                                \"displayName\": \"Topic Name Format\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"topic_type\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             }\n                         },\n-                        \"restricted\": true,\n                         \"seeAlso\": [\n-                            \"org.apache.nifi.processors.script.ScriptedFilterRecord\",\n-                            \"org.apache.nifi.processors.script.ScriptedTransformRecord\",\n-                            \"org.apache.nifi.processors.script.ScriptedValidateRecord\"\n+                            \"org.apache.nifi.processors.kafka.pubsub.ConsumeKafka_1_0\",\n+                            \"org.apache.nifi.processors.kafka.pubsub.PublishKafkaRecord_1_0\",\n+                            \"org.apache.nifi.processors.kafka.pubsub.PublishKafka_1_0\"\n                         ],\n-                        \"sideEffectFree\": true,\n+                        \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"FlowFiles that are successfully partitioned will be routed to this relationship\",\n+                                \"description\": \"FlowFiles received from Kafka.  Depending on demarcation strategy it is a flow file per message or a bundle of messages grouped by topic and partition.\",\n                                 \"name\": \"success\"\n                             },\n                             {\n-                                \"description\": \"If a FlowFile cannot be partitioned from the configured input format to the configured output format, the unchanged FlowFile will be routed to this relationship\",\n-                                \"name\": \"failure\"\n-                            },\n-                            {\n-                                \"description\": \"Once all records in an incoming FlowFile have been partitioned, the original FlowFile is routed to this relationship.\",\n-                                \"name\": \"original\"\n+                                \"description\": \"If a message from Kafka cannot be parsed using the configured Record Reader, the contents of the message will be routed to this Relationship as its own individual FlowFile.\",\n+                                \"name\": \"parse.failure\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\",\n-                            \"EVENT_DRIVEN\"\n+                            \"CRON_DRIVEN\"\n                         ],\n                         \"supportsBatching\": false,\n-                        \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicProperties\": true,\n                         \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": true,\n+                        \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"groovy\",\n-                            \"group\",\n-                            \"jython\",\n-                            \"organize\",\n-                            \"partition\",\n-                            \"python\",\n-                            \"record\",\n-                            \"script\",\n-                            \"segment\",\n-                            \"split\"\n+                            \"1.0\",\n+                            \"Consume\",\n+                            \"Get\",\n+                            \"Ingest\",\n+                            \"Ingress\",\n+                            \"Kafka\",\n+                            \"PubSub\",\n+                            \"Record\",\n+                            \"Topic\",\n+                            \"avro\",\n+                            \"csv\",\n+                            \"json\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.script.ScriptedPartitionRecord\",\n-                        \"typeDescription\": \"Receives Record-oriented data (i.e., data that can be read by the configured Record Reader) and evaluates the user provided script against each record in the incoming flow file. Each record is then grouped with other records sharing the same partition and a FlowFile is created for each groups of records. Two records shares the same partition if the evaluation of the script results the same return value for both. Those will be considered as part of the same partition.\",\n+                        \"type\": \"org.apache.nifi.processors.kafka.pubsub.ConsumeKafkaRecord_1_0\",\n+                        \"typeDescription\": \"Consumes messages from Apache Kafka specifically built against the Kafka 1.0 Consumer API. The complementary NiFi processor for sending messages is PublishKafkaRecord_1_0. Please note that, at this time, the Processor assumes that all records that are retrieved from a given partition have the same schema. If any of the Kafka messages are pulled but cannot be parsed or written with the configured Record Reader or Record Writer, the contents of the message will be written to a separate FlowFile, and that FlowFile will be transferred to the 'parse.failure' relationship. Otherwise, each FlowFile is sent to the 'success' relationship and may contain many individual messages within the single FlowFile. A 'record.count' attribute is added to indicate how many messages are contained in the FlowFile. No two Kafka messages will be placed into the same FlowFile if they have different schemas, or if they have different values for a message header that is included by the <Headers to Add as Attributes> property.\",\n                         \"version\": \"1.27.0\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"The partition of the outgoing flow file. If the script indicates that the partition has a null value, the attribute will be set to the literal string \\\"<null partition>\\\" (without quotes). Otherwise, the attribute is set to the String representation of whatever value is returned by the script.\",\n-                                \"name\": \"partition\"\n+                                \"description\": \"The number of records received\",\n+                                \"name\": \"record.count\"\n                             },\n                             {\n-                                \"description\": \"Sets the mime.type attribute to the MIME Type specified by the Record Writer\",\n+                                \"description\": \"The MIME Type that is provided by the configured Record Writer\",\n                                 \"name\": \"mime.type\"\n                             },\n                             {\n-                                \"description\": \"The number of records within the flow file.\",\n-                                \"name\": \"record.count\"\n-                            },\n-                            {\n-                                \"description\": \"This attribute provides on failure the error message encountered by the Reader or Writer.\",\n-                                \"name\": \"record.error.message\"\n+                                \"description\": \"The partition of the topic the records are from\",\n+                                \"name\": \"kafka.partition\"\n                             },\n                             {\n-                                \"description\": \"A one-up number that indicates the ordering of the partitioned FlowFiles that were created from a single parent FlowFile\",\n-                                \"name\": \"fragment.index\"\n+                                \"description\": \"The timestamp of the message in the partition of the topic.\",\n+                                \"name\": \"kafka.timestamp\"\n                             },\n                             {\n-                                \"description\": \"The number of partitioned FlowFiles generated from the parent FlowFile\",\n-                                \"name\": \"fragment.count\"\n+                                \"description\": \"The topic records are from\",\n+                                \"name\": \"kafka.topic\"\n                             }\n                         ]\n                     },\n                     {\n                         \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-scripting-nar\",\n+                        \"artifact\": \"nifi-kafka-1-0-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n-                            \"EVENT_DRIVEN\": 0,\n                             \"TIMER_DRIVEN\": 1\n                         },\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n-                        \"explicitRestrictions\": [\n+                        \"deprecated\": true,\n+                        \"deprecationAlternatives\": [\n+                            \"org.apache.nifi.processors.kafka.pubsub.ConsumeKafka_2_6\"\n+                        ],\n+                        \"deprecationReason\": \"\",\n+                        \"dynamicProperties\": [\n                             {\n-                                \"explanation\": \"Provides operator the ability to execute arbitrary code assuming all permissions that NiFi has.\",\n-                                \"requiredPermission\": \"execute code\"\n+                                \"description\": \"These properties will be added on the Kafka configuration after loading any provided configuration properties. In the event a dynamic property represents a property that was already set, its value will be ignored and WARN message logged. For the list of available Kafka properties please refer to: http://kafka.apache.org/documentation.html#configuration. \",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"name\": \"The name of a Kafka configuration property.\",\n+                                \"value\": \"The value of a given Kafka configuration property.\"\n                             }\n                         ],\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_REQUIRED\",\n+                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Module Directory\": {\n-                                \"description\": \"Comma-separated list of paths to files and/or directories which contain modules required by the script.\",\n-                                \"displayName\": \"Module Directory\",\n+                            \"auto.offset.reset\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"Automatically reset the offset to the earliest offset\",\n+                                        \"displayName\": \"earliest\",\n+                                        \"value\": \"earliest\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Automatically reset the offset to the latest offset\",\n+                                        \"displayName\": \"latest\",\n+                                        \"value\": \"latest\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Throw exception to the consumer if no previous offset is found for the consumer's group\",\n+                                        \"displayName\": \"none\",\n+                                        \"value\": \"none\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"latest\",\n+                                \"description\": \"Allows you to manage the condition when there is no initial offset in Kafka or if the current offset does not exist any more on the server (e.g. because that data has been deleted). Corresponds to Kafka's 'auto.offset.reset' property.\",\n+                                \"displayName\": \"Offset Reset\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"auto.offset.reset\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"bootstrap.servers\": {\n+                                \"defaultValue\": \"localhost:9092\",\n+                                \"description\": \"Comma-separated list of Kafka Brokers in the format host:port\",\n+                                \"displayName\": \"Kafka Brokers\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Module Directory\",\n+                                \"name\": \"bootstrap.servers\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"group.id\": {\n+                                \"description\": \"A Group ID is used to identify consumers that are within the same consumer group. Corresponds to Kafka's 'group.id' property.\",\n+                                \"displayName\": \"Group ID\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"group.id\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"header-name-regex\": {\n+                                \"description\": \"A Regular Expression that is matched against all message headers. Any message header whose name matches the regex will be added to the FlowFile as an Attribute. If not specified, no Header values will be added as FlowFile attributes. If two messages have a different value for the same header and that header is selected by the provided regex, then those two messages must be added to different FlowFiles. As a result, users should be cautious about using a regex like \\\".*\\\" if messages are expected to have header values that are unique per message, such as an identifier or timestamp, because it will prevent NiFi from bundling the messages together efficiently.\",\n+                                \"displayName\": \"Headers to Add as Attributes (Regex)\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"header-name-regex\",\n                                 \"required\": false,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"MULTIPLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\",\n-                                        \"DIRECTORY\"\n-                                    ]\n-                                },\n                                 \"sensitive\": false\n                             },\n-                            \"Record Reader\": {\n-                                \"description\": \"The Record Reader to use parsing the incoming FlowFile into Records\",\n-                                \"displayName\": \"Record Reader\",\n+                            \"honor-transactions\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"true\",\n+                                \"description\": \"Specifies whether or not NiFi should honor transactional guarantees when communicating with Kafka. If false, the Processor will use an \\\"isolation level\\\" of read_uncomitted. This means that messages will be received as soon as they are written to Kafka but will be pulled, even if the producer cancels the transactions. If this value is true, NiFi will not receive any messages for which the producer's transaction was canceled, but this can result in some latency since the consumer must wait for the producer to finish its entire transaction instead of pulling as the messages become available.\",\n+                                \"displayName\": \"Honor Transactions\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Record Reader\",\n+                                \"name\": \"honor-transactions\",\n                                 \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n+                                \"sensitive\": false\n                             },\n-                            \"Record Writer\": {\n-                                \"description\": \"The Record Writer to use for serializing Records after they have been transformed\",\n-                                \"displayName\": \"Record Writer\",\n+                            \"key-attribute-encoding\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"The key is interpreted as a UTF-8 Encoded string.\",\n+                                        \"displayName\": \"UTF-8 Encoded\",\n+                                        \"value\": \"utf-8\"\n+                                    },\n+                                    {\n+                                        \"description\": \"The key is interpreted as arbitrary binary data and is encoded using hexadecimal characters with uppercase letters\",\n+                                        \"displayName\": \"Hex Encoded\",\n+                                        \"value\": \"hex\"\n+                                    },\n+                                    {\n+                                        \"description\": \"The key will not be added as an Attribute\",\n+                                        \"displayName\": \"Do Not Add Key as Attribute\",\n+                                        \"value\": \"do-not-add\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"utf-8\",\n+                                \"description\": \"FlowFiles that are emitted have an attribute named 'kafka.key'. This property dictates how the value of the attribute should be encoded.\",\n+                                \"displayName\": \"Key Attribute Encoding\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Record Writer\",\n+                                \"name\": \"key-attribute-encoding\",\n                                 \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n+                                \"sensitive\": false\n                             },\n-                            \"Script Body\": {\n-                                \"description\": \"Body of script to execute. Only one of Script File or Script Body may be used\",\n-                                \"displayName\": \"Script Body\",\n+                            \"max-uncommit-offset-wait\": {\n+                                \"defaultValue\": \"1 secs\",\n+                                \"description\": \"Specifies the maximum amount of time allowed to pass before offsets must be committed. This value impacts how often offsets will be committed.  Committing offsets less often increases throughput but also increases the window of potential data duplication in the event of a rebalance or JVM restart between commits.  This value is also related to maximum poll records and the use of a message demarcator.  When using a message demarcator we can have far more uncommitted messages than when we're not as there is much less for us to keep track of in memory.\",\n+                                \"displayName\": \"Max Uncommitted Time\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Script Body\",\n+                                \"name\": \"max-uncommit-offset-wait\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Script Engine\": {\n+                            \"max.poll.records\": {\n+                                \"defaultValue\": \"10000\",\n+                                \"description\": \"Specifies the maximum number of records Kafka should return in a single poll.\",\n+                                \"displayName\": \"Max Poll Records\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"max.poll.records\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"message-demarcator\": {\n+                                \"description\": \"Since KafkaConsumer receives messages in batches, you have an option to output FlowFiles which contains all Kafka messages in a single batch for a given topic and partition and this property allows you to provide a string (interpreted as UTF-8) to use for demarcating apart multiple Kafka messages. This is an optional property and if not provided each Kafka message received will result in a single FlowFile which  time it is triggered. To enter special character such as 'new line' use CTRL+Enter or Shift+Enter depending on the OS\",\n+                                \"displayName\": \"Message Demarcator\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"message-demarcator\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"message-header-encoding\": {\n+                                \"defaultValue\": \"UTF-8\",\n+                                \"description\": \"Any message header that is found on a Kafka message will be added to the outbound FlowFile as an attribute. This property indicates the Character Encoding to use for deserializing the headers.\",\n+                                \"displayName\": \"Message Header Encoding\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"message-header-encoding\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"sasl.kerberos.keytab\": {\n+                                \"description\": \"Keytab credentials used for authentication with Kerberos\",\n+                                \"displayName\": \"Kerberos Keytab\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"sasl.kerberos.keytab\",\n+                                \"required\": false,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"SINGLE\",\n+                                    \"resourceTypes\": [\n+                                        \"FILE\"\n+                                    ]\n+                                },\n+                                \"sensitive\": false\n+                            },\n+                            \"sasl.kerberos.principal\": {\n+                                \"description\": \"Principal used for authentication with Kerberos\",\n+                                \"displayName\": \"Kerberos Principal\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"sasl.kerberos.principal\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"sasl.kerberos.service.name\": {\n+                                \"description\": \"The service name that matches the primary name of the Kafka server configured in the broker JAAS configuration\",\n+                                \"displayName\": \"Kerberos Service Name\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"sasl.kerberos.service.name\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"sasl.mechanism\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Clojure\",\n-                                        \"value\": \"Clojure\"\n+                                        \"description\": \"General Security Services API for Kerberos authentication\",\n+                                        \"displayName\": \"GSSAPI\",\n+                                        \"value\": \"GSSAPI\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"ECMAScript\",\n-                                        \"value\": \"ECMAScript\"\n+                                        \"description\": \"Plain username and password authentication\",\n+                                        \"displayName\": \"PLAIN\",\n+                                        \"value\": \"PLAIN\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Salted Challenge Response Authentication Mechanism using SHA-512 with username and password\",\n+                                        \"displayName\": \"SCRAM-SHA-256\",\n+                                        \"value\": \"SCRAM-SHA-256\"\n                                     },\n                                     {\n+                                        \"description\": \"Salted Challenge Response Authentication Mechanism using SHA-256 with username and password\",\n+                                        \"displayName\": \"SCRAM-SHA-512\",\n+                                        \"value\": \"SCRAM-SHA-512\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"GSSAPI\",\n+                                \"description\": \"SASL mechanism used for authentication. Corresponds to Kafka Client sasl.mechanism property\",\n+                                \"displayName\": \"SASL Mechanism\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"sasl.mechanism\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"security.protocol\": {\n+                                \"allowableValues\": [\n+                                    {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"Groovy\",\n-                                        \"value\": \"Groovy\"\n+                                        \"displayName\": \"PLAINTEXT\",\n+                                        \"value\": \"PLAINTEXT\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"lua\",\n-                                        \"value\": \"lua\"\n+                                        \"displayName\": \"SSL\",\n+                                        \"value\": \"SSL\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"python\",\n-                                        \"value\": \"python\"\n+                                        \"displayName\": \"SASL_PLAINTEXT\",\n+                                        \"value\": \"SASL_PLAINTEXT\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"ruby\",\n-                                        \"value\": \"ruby\"\n+                                        \"displayName\": \"SASL_SSL\",\n+                                        \"value\": \"SASL_SSL\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"Groovy\",\n-                                \"description\": \"The Language to use for the script\",\n-                                \"displayName\": \"Script Language\",\n+                                \"defaultValue\": \"PLAINTEXT\",\n+                                \"description\": \"Security protocol used to communicate with brokers. Corresponds to Kafka Client security.protocol property\",\n+                                \"displayName\": \"Security Protocol\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Script Engine\",\n+                                \"name\": \"security.protocol\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Script File\": {\n-                                \"description\": \"Path to script file to execute. Only one of Script File or Script Body may be used\",\n-                                \"displayName\": \"Script File\",\n+                            \"ssl.context.service\": {\n+                                \"description\": \"Service supporting SSL communication with Kafka brokers\",\n+                                \"displayName\": \"SSL Context Service\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"ssl.context.service\",\n+                                \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"topic\": {\n+                                \"description\": \"The name of the Kafka Topic(s) to pull from. More than one can be supplied if comma separated.\",\n+                                \"displayName\": \"Topic Name(s)\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Script File\",\n-                                \"required\": false,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"SINGLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\"\n-                                    ]\n-                                },\n+                                \"name\": \"topic\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"topic_type\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"Topic is a full topic name or comma separated list of names\",\n+                                        \"displayName\": \"names\",\n+                                        \"value\": \"names\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Topic is a regex using the Java Pattern syntax\",\n+                                        \"displayName\": \"pattern\",\n+                                        \"value\": \"pattern\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"names\",\n+                                \"description\": \"Specifies whether the Topic(s) provided are a comma separated list of names or a single regular expression\",\n+                                \"displayName\": \"Topic Name Format\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"topic_type\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             }\n                         },\n-                        \"restricted\": true,\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.processors.jolt.record.JoltTransformRecord\",\n-                            \"org.apache.nifi.processors.script.ExecuteScript\",\n-                            \"org.apache.nifi.processors.standard.LookupRecord\",\n-                            \"org.apache.nifi.processors.standard.QueryRecord\",\n-                            \"org.apache.nifi.processors.standard.UpdateRecord\"\n-                        ],\n-                        \"sideEffectFree\": true,\n+                        \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"Each FlowFile that were successfully transformed will be routed to this Relationship\",\n+                                \"description\": \"FlowFiles received from Kafka. Depending on demarcation strategy it is a flow file per message or a bundle of messages grouped by topic and partition.\",\n                                 \"name\": \"success\"\n-                            },\n-                            {\n-                                \"description\": \"Any FlowFile that cannot be transformed will be routed to this Relationship\",\n-                                \"name\": \"failure\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\",\n-                            \"EVENT_DRIVEN\"\n+                            \"CRON_DRIVEN\"\n                         ],\n-                        \"supportsBatching\": true,\n-                        \"supportsDynamicProperties\": false,\n+                        \"supportsBatching\": false,\n+                        \"supportsDynamicProperties\": true,\n                         \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": true,\n+                        \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"filter\",\n-                            \"groovy\",\n-                            \"jython\",\n-                            \"modify\",\n-                            \"python\",\n-                            \"record\",\n-                            \"script\",\n-                            \"transform\",\n-                            \"update\"\n+                            \"1.0\",\n+                            \"Consume\",\n+                            \"Get\",\n+                            \"Ingest\",\n+                            \"Ingress\",\n+                            \"Kafka\",\n+                            \"PubSub\",\n+                            \"Topic\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.script.ScriptedTransformRecord\",\n-                        \"typeDescription\": \"Provides the ability to evaluate a simple script against each record in an incoming FlowFile. The script may transform the record in some way, filter the record, or fork additional records. See Processor's Additional Details for more information.\",\n+                        \"type\": \"org.apache.nifi.processors.kafka.pubsub.ConsumeKafka_1_0\",\n+                        \"typeDescription\": \"Consumes messages from Apache Kafka specifically built against the Kafka 1.0 Consumer API. The complementary NiFi processor for sending messages is PublishKafka_1_0.\",\n                         \"version\": \"1.27.0\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"Sets the mime.type attribute to the MIME Type specified by the Record Writer\",\n-                                \"name\": \"mime.type\"\n+                                \"description\": \"The number of messages written if more than one\",\n+                                \"name\": \"kafka.count\"\n                             },\n                             {\n-                                \"description\": \"The number of records in the FlowFile\",\n-                                \"name\": \"record.count\"\n+                                \"description\": \"The key of message if present and if single message. How the key is encoded depends on the value of the 'Key Attribute Encoding' property.\",\n+                                \"name\": \"kafka.key\"\n                             },\n                             {\n-                                \"description\": \"This attribute provides on failure the error message encountered by the Reader or Writer.\",\n-                                \"name\": \"record.error.message\"\n+                                \"description\": \"The offset of the message in the partition of the topic.\",\n+                                \"name\": \"kafka.offset\"\n+                            },\n+                            {\n+                                \"description\": \"The timestamp of the message in the partition of the topic.\",\n+                                \"name\": \"kafka.timestamp\"\n+                            },\n+                            {\n+                                \"description\": \"The partition of the topic the message or message bundle is from\",\n+                                \"name\": \"kafka.partition\"\n+                            },\n+                            {\n+                                \"description\": \"The topic the message or message bundle is from\",\n+                                \"name\": \"kafka.topic\"\n                             }\n                         ]\n                     },\n                     {\n                         \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-scripting-nar\",\n+                        \"artifact\": \"nifi-kafka-1-0-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n-                            \"EVENT_DRIVEN\": 0,\n                             \"TIMER_DRIVEN\": 1\n                         },\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n-                        \"explicitRestrictions\": [\n+                        \"deprecated\": true,\n+                        \"deprecationAlternatives\": [\n+                            \"org.apache.nifi.processors.kafka.pubsub.PublishKafkaRecord_2_6\"\n+                        ],\n+                        \"deprecationReason\": \"\",\n+                        \"dynamicProperties\": [\n                             {\n-                                \"explanation\": \"Provides operator the ability to execute arbitrary code assuming all permissions that NiFi has.\",\n-                                \"requiredPermission\": \"execute code\"\n+                                \"description\": \"These properties will be added on the Kafka configuration after loading any provided configuration properties. In the event a dynamic property represents a property that was already set, its value will be ignored and WARN message logged. For the list of available Kafka properties please refer to: http://kafka.apache.org/documentation.html#configuration. \",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"name\": \"The name of a Kafka configuration property.\",\n+                                \"value\": \"The value of a given Kafka configuration property.\"\n                             }\n                         ],\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Module Directory\": {\n-                                \"description\": \"Comma-separated list of paths to files and/or directories which contain modules required by the script.\",\n-                                \"displayName\": \"Module Directory\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Module Directory\",\n-                                \"required\": false,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"MULTIPLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\",\n-                                        \"DIRECTORY\"\n-                                    ]\n-                                },\n-                                \"sensitive\": false\n-                            },\n-                            \"Record Reader\": {\n-                                \"description\": \"The Record Reader to use parsing the incoming FlowFile into Records\",\n-                                \"displayName\": \"Record Reader\",\n+                            \"ack.wait.time\": {\n+                                \"defaultValue\": \"5 secs\",\n+                                \"description\": \"After sending a message to Kafka, this indicates the amount of time that we are willing to wait for a response from Kafka. If Kafka does not acknowledge the message within this time period, the FlowFile will be routed to 'failure'.\",\n+                                \"displayName\": \"Acknowledgment Wait Time\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Record Reader\",\n+                                \"name\": \"ack.wait.time\",\n                                 \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n+                                \"sensitive\": false\n                             },\n-                            \"Record Writer\": {\n-                                \"description\": \"The Record Writer to use for serializing Records after they have been transformed\",\n-                                \"displayName\": \"Record Writer\",\n+                            \"acks\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"FlowFile will be routed to success after successfully sending the content to a Kafka node, without waiting for any acknowledgment from the node at all. This provides the best performance but may result in data loss.\",\n+                                        \"displayName\": \"Best Effort\",\n+                                        \"value\": \"0\"\n+                                    },\n+                                    {\n+                                        \"description\": \"FlowFile will be routed to success if the message is received by a single Kafka node, whether or not it is replicated. This is faster than <Guarantee Replicated Delivery> but can result in data loss if a Kafka node crashes\",\n+                                        \"displayName\": \"Guarantee Single Node Delivery\",\n+                                        \"value\": \"1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"FlowFile will be routed to failure unless the message is replicated to the appropriate number of Kafka Nodes according to the Topic configuration\",\n+                                        \"displayName\": \"Guarantee Replicated Delivery\",\n+                                        \"value\": \"all\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"0\",\n+                                \"description\": \"Specifies the requirement for guaranteeing that a message is sent to Kafka. Corresponds to Kafka's 'acks' property.\",\n+                                \"displayName\": \"Delivery Guarantee\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Record Writer\",\n+                                \"name\": \"acks\",\n                                 \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n+                                \"sensitive\": false\n                             },\n-                            \"Script Body\": {\n-                                \"description\": \"Body of script to execute. Only one of Script File or Script Body may be used\",\n-                                \"displayName\": \"Script Body\",\n+                            \"attribute-name-regex\": {\n+                                \"description\": \"A Regular Expression that is matched against all FlowFile attribute names. Any attribute whose name matches the regex will be added to the Kafka messages as a Header. If not specified, no FlowFile attributes will be added as headers.\",\n+                                \"displayName\": \"Attributes to Send as Headers (Regex)\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Script Body\",\n+                                \"name\": \"attribute-name-regex\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Script Engine\": {\n+                            \"bootstrap.servers\": {\n+                                \"defaultValue\": \"localhost:9092\",\n+                                \"description\": \"Comma-separated list of Kafka Brokers in the format host:port\",\n+                                \"displayName\": \"Kafka Brokers\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"bootstrap.servers\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"compression.type\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"Clojure\",\n-                                        \"value\": \"Clojure\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"ECMAScript\",\n-                                        \"value\": \"ECMAScript\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Groovy\",\n-                                        \"value\": \"Groovy\"\n+                                        \"displayName\": \"none\",\n+                                        \"value\": \"none\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"lua\",\n-                                        \"value\": \"lua\"\n+                                        \"displayName\": \"gzip\",\n+                                        \"value\": \"gzip\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"python\",\n-                                        \"value\": \"python\"\n+                                        \"displayName\": \"snappy\",\n+                                        \"value\": \"snappy\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"ruby\",\n-                                        \"value\": \"ruby\"\n+                                        \"displayName\": \"lz4\",\n+                                        \"value\": \"lz4\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"Groovy\",\n-                                \"description\": \"The Language to use for the script\",\n-                                \"displayName\": \"Script Language\",\n+                                \"defaultValue\": \"none\",\n+                                \"description\": \"This parameter allows you to specify the compression codec for all data generated by this producer.\",\n+                                \"displayName\": \"Compression Type\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Script Engine\",\n+                                \"name\": \"compression.type\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Script File\": {\n-                                \"description\": \"Path to script file to execute. Only one of Script File or Script Body may be used\",\n-                                \"displayName\": \"Script File\",\n+                            \"kerberos-credentials-service\": {\n+                                \"description\": \"Service supporting generalized credentials authentication with Kerberos\",\n+                                \"displayName\": \"Kerberos Credentials Service\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"kerberos-credentials-service\",\n+                                \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.kerberos.KerberosCredentialsService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"max.block.ms\": {\n+                                \"defaultValue\": \"5 sec\",\n+                                \"description\": \"The amount of time publisher will wait to obtain metadata or wait for the buffer to flush during the 'send' call before failing the entire 'send' call. Corresponds to Kafka's 'max.block.ms' property\",\n+                                \"displayName\": \"Max Metadata Wait Time\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Script File\",\n-                                \"required\": false,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"SINGLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\"\n-                                    ]\n-                                },\n+                                \"name\": \"max.block.ms\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n-                            }\n-                        },\n-                        \"restricted\": true,\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.processors.script.ScriptedFilterRecord\",\n-                            \"org.apache.nifi.processors.script.ScriptedPartitionRecord\",\n-                            \"org.apache.nifi.processors.script.ScriptedTransformRecord\"\n-                        ],\n-                        \"sideEffectFree\": true,\n-                        \"supportedRelationships\": [\n-                            {\n-                                \"description\": \"FlowFile containing the valid records from the incoming FlowFile will be routed to this relationship. If there are no valid records, no FlowFile will be routed to this Relationship.\",\n-                                \"name\": \"valid\"\n                             },\n-                            {\n-                                \"description\": \"FlowFile containing the invalid records from the incoming FlowFile will be routed to this relationship. If there are no invalid records, no FlowFile will be routed to this Relationship.\",\n-                                \"name\": \"invalid\"\n+                            \"max.request.size\": {\n+                                \"defaultValue\": \"1 MB\",\n+                                \"description\": \"The maximum size of a request in bytes. Corresponds to Kafka's 'max.request.size' property and defaults to 1 MB (1048576).\",\n+                                \"displayName\": \"Max Request Size\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"max.request.size\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n                             },\n-                            {\n-                                \"description\": \"In case of any issue during processing the incoming flow file, the incoming FlowFile will be routed to this relationship.\",\n-                                \"name\": \"failure\"\n+                            \"message-header-encoding\": {\n+                                \"defaultValue\": \"UTF-8\",\n+                                \"description\": \"For any attribute that is added as a message header, as configured via the <Attributes to Send as Headers> property, this property indicates the Character Encoding to use for serializing the headers.\",\n+                                \"displayName\": \"Message Header Encoding\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"message-header-encoding\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n                             },\n-                            {\n-                                \"description\": \"After successful procession, the incoming FlowFile will be transferred to this relationship. This happens regardless the FlowFiles might routed to \\\"valid\\\" and \\\"invalid\\\" relationships.\",\n-                                \"name\": \"original\"\n-                            }\n-                        ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\",\n-                            \"EVENT_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": true,\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": true,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"groovy\",\n-                            \"jython\",\n-                            \"python\",\n-                            \"record\",\n-                            \"script\",\n-                            \"validate\"\n-                        ],\n-                        \"triggerSerially\": false,\n-                        \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.script.ScriptedValidateRecord\",\n-                        \"typeDescription\": \"This processor provides the ability to validate records in FlowFiles using the user-provided script. The script is expected to have a record as incoming argument and return with a boolean value. Based on this result, the processor categorizes the records as \\\"valid\\\" or \\\"invalid\\\" and routes them to the respective relationship in batch. Additionally the original FlowFile will be routed to the \\\"original\\\" relationship or in case of unsuccessful processing, to the \\\"failed\\\" relationship.\",\n-                        \"version\": \"1.27.0\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"Sets the mime.type attribute to the MIME Type specified by the Record Writer\",\n-                                \"name\": \"mime.type\"\n-                            },\n-                            {\n-                                \"description\": \"The number of records within the flow file.\",\n-                                \"name\": \"record.count\"\n-                            },\n-                            {\n-                                \"description\": \"This attribute provides on failure the error message encountered by the Reader or Writer.\",\n-                                \"name\": \"record.error.message\"\n-                            }\n-                        ]\n-                    }\n-                ],\n-                \"reportingTasks\": [\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-scripting-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"e0c4461\"\n-                        },\n-                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"0 sec\"\n-                        },\n-                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n-                        \"dynamicProperties\": [\n-                            {\n-                                \"description\": \"Updates a script engine property specified by the Dynamic Property's key with the value specified by the Dynamic Property's value\",\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"name\": \"A script engine property to update\",\n-                                \"value\": \"The value to set it to\"\n-                            }\n-                        ],\n-                        \"explicitRestrictions\": [\n-                            {\n-                                \"explanation\": \"Provides operator the ability to execute arbitrary code assuming all permissions that NiFi has.\",\n-                                \"requiredPermission\": \"execute code\"\n-                            }\n-                        ],\n-                        \"group\": \"org.apache.nifi\",\n-                        \"propertyDescriptors\": {\n-                            \"Module Directory\": {\n-                                \"description\": \"Comma-separated list of paths to files and/or directories which contain modules required by the script.\",\n-                                \"displayName\": \"Module Directory\",\n+                            \"message-key-field\": {\n+                                \"description\": \"The name of a field in the Input Records that should be used as the Key for the Kafka message.\",\n+                                \"displayName\": \"Message Key Field\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Module Directory\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"message-key-field\",\n                                 \"required\": false,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"MULTIPLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\",\n-                                        \"DIRECTORY\"\n-                                    ]\n-                                },\n                                 \"sensitive\": false\n                             },\n-                            \"Script Body\": {\n-                                \"description\": \"Body of script to execute. Only one of Script File or Script Body may be used\",\n-                                \"displayName\": \"Script Body\",\n+                            \"partition\": {\n+                                \"description\": \"Specifies which Partition Records will go to. How this value is interpreted is dictated by the <Partitioner class> property.\",\n+                                \"displayName\": \"Partition\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Script Body\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"partition\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Script Engine\": {\n+                            \"partitioner.class\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"ECMAScript ECMA - 262 Edition 5.1 [Oracle Nashorn 1.8.0_302-b08]\",\n-                                        \"displayName\": \"ECMAScript DEPRECATED\",\n-                                        \"value\": \"ECMAScript\"\n+                                        \"description\": \"Messages will be assigned partitions in a round-robin fashion, sending the first message to Partition 1, the next Partition to Partition 2, and so on, wrapping as necessary.\",\n+                                        \"displayName\": \"RoundRobinPartitioner\",\n+                                        \"value\": \"org.apache.nifi.processors.kafka.pubsub.Partitioners$RoundRobinPartitioner\"\n                                     },\n                                     {\n-                                        \"description\": \"Groovy 3.0.21 [Groovy Scripting Engine 2.0]\",\n-                                        \"displayName\": \"Groovy\",\n-                                        \"value\": \"Groovy\"\n+                                        \"description\": \"Messages will be assigned to random partitions.\",\n+                                        \"displayName\": \"DefaultPartitioner\",\n+                                        \"value\": \"org.apache.kafka.clients.producer.internals.DefaultPartitioner\"\n                                     },\n                                     {\n-                                        \"description\": \"python 2.7 [jython 2.7.3]\",\n-                                        \"displayName\": \"python DEPRECATED\",\n-                                        \"value\": \"python\"\n+                                        \"description\": \"Interprets the <Partition> property as a RecordPath that will be evaluated against each Record to determine which partition the Record will go to. All Records that have the same value for the given RecordPath will go to the same Partition.\",\n+                                        \"displayName\": \"RecordPath Partitioner\",\n+                                        \"value\": \"org.apache.nifi.processors.kafka.pubsub.Partitioners$RecordPathPartitioner\"\n                                     },\n                                     {\n-                                        \"description\": \"ruby jruby 9.4.2.0 [JSR 223 JRuby Engine 9.4.2.0]\",\n-                                        \"displayName\": \"ruby DEPRECATED\",\n-                                        \"value\": \"ruby\"\n+                                        \"description\": \"Interprets the <Partition> property as Expression Language that will be evaluated against each FlowFile. This Expression will be evaluated once against the FlowFile, so all Records in a given FlowFile will go to the same partition.\",\n+                                        \"displayName\": \"Expression Language Partitioner\",\n+                                        \"value\": \"org.apache.nifi.processors.kafka.pubsub.Partitioners$ExpressionLanguagePartitioner\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"ECMAScript\",\n-                                \"description\": \"Language Engine for executing scripts\",\n-                                \"displayName\": \"Script Engine\",\n+                                \"defaultValue\": \"org.apache.kafka.clients.producer.internals.DefaultPartitioner\",\n+                                \"description\": \"Specifies which class to use to compute a partition id for a message. Corresponds to Kafka's 'partitioner.class' property.\",\n+                                \"displayName\": \"Partitioner class\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Script Engine\",\n-                                \"required\": true,\n+                                \"name\": \"partitioner.class\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Script File\": {\n-                                \"description\": \"Path to script file to execute. Only one of Script File or Script Body may be used\",\n-                                \"displayName\": \"Script File\",\n+                            \"record-reader\": {\n+                                \"description\": \"The Record Reader to use for incoming FlowFiles\",\n+                                \"displayName\": \"Record Reader\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"record-reader\",\n+                                \"required\": true,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"record-writer\": {\n+                                \"description\": \"The Record Writer to use in order to serialize the data before sending to Kafka\",\n+                                \"displayName\": \"Record Writer\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"record-writer\",\n+                                \"required\": true,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"sasl.kerberos.keytab\": {\n+                                \"description\": \"Keytab credentials used for authentication with Kerberos\",\n+                                \"displayName\": \"Kerberos Keytab\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Script File\",\n+                                \"name\": \"sasl.kerberos.keytab\",\n                                 \"required\": false,\n                                 \"resourceDefinition\": {\n                                     \"cardinality\": \"SINGLE\",\n                                     \"resourceTypes\": [\n                                         \"FILE\"\n                                     ]\n                                 },\n                                 \"sensitive\": false\n-                            }\n-                        },\n-                        \"restricted\": true,\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n-                        ],\n-                        \"supportsDynamicProperties\": true,\n-                        \"supportsSensitiveDynamicProperties\": true,\n-                        \"tags\": [\n-                            \"execute\",\n-                            \"groovy\",\n-                            \"javascript\",\n-                            \"jruby\",\n-                            \"js\",\n-                            \"jython\",\n-                            \"lua\",\n-                            \"luaj\",\n-                            \"python\",\n-                            \"reporting\",\n-                            \"ruby\",\n-                            \"script\"\n-                        ],\n-                        \"type\": \"org.apache.nifi.reporting.script.ScriptedReportingTask\",\n-                        \"typeDescription\": \"Provides reporting and status information to a script. ReportingContext, ComponentLog, and VirtualMachineMetrics objects are made available as variables (context, log, and vmMetrics, respectively) to the script for further processing. The context makes various information available such as events, provenance, bulletins, controller services, process groups, Java Virtual Machine metrics, etc.\",\n-                        \"version\": \"1.27.0\"\n-                    }\n-                ]\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"1.27.0\"\n-        },\n-        {\n-            \"artifact\": \"nifi-http-context-map-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-http-context-map-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"e0c4461\"\n-                        },\n-                        \"group\": \"org.apache.nifi\",\n-                        \"propertyDescriptors\": {\n-                            \"Maximum Outstanding Requests\": {\n-                                \"defaultValue\": \"5000\",\n-                                \"description\": \"The maximum number of HTTP requests that can be outstanding at any one time. Any attempt to register an additional HTTP Request will cause an error\",\n-                                \"displayName\": \"Maximum Outstanding Requests\",\n+                            },\n+                            \"sasl.kerberos.principal\": {\n+                                \"description\": \"Principal used for authentication with Kerberos\",\n+                                \"displayName\": \"Kerberos Principal\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"sasl.kerberos.principal\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"sasl.kerberos.service.name\": {\n+                                \"description\": \"The service name that matches the primary name of the Kafka server configured in the broker JAAS configuration\",\n+                                \"displayName\": \"Kerberos Service Name\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"sasl.kerberos.service.name\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"security.protocol\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"PLAINTEXT\",\n+                                        \"value\": \"PLAINTEXT\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"SSL\",\n+                                        \"value\": \"SSL\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"SASL_PLAINTEXT\",\n+                                        \"value\": \"SASL_PLAINTEXT\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"SASL_SSL\",\n+                                        \"value\": \"SASL_SSL\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"PLAINTEXT\",\n+                                \"description\": \"Security protocol used to communicate with brokers. Corresponds to Kafka Client security.protocol property\",\n+                                \"displayName\": \"Security Protocol\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Maximum Outstanding Requests\",\n+                                \"name\": \"security.protocol\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Request Expiration\": {\n-                                \"defaultValue\": \"1 min\",\n-                                \"description\": \"Specifies how long an HTTP Request should be left unanswered before being evicted from the cache and being responded to with a Service Unavailable status code\",\n-                                \"displayName\": \"Request Expiration\",\n+                            \"ssl.context.service\": {\n+                                \"description\": \"Service supporting SSL communication with Kafka brokers\",\n+                                \"displayName\": \"SSL Context Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Request Expiration\",\n+                                \"name\": \"ssl.context.service\",\n+                                \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"topic\": {\n+                                \"description\": \"The name of the Kafka Topic to publish to.\",\n+                                \"displayName\": \"Topic Name\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"topic\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"transactional-id-prefix\": {\n+                                \"description\": \"When Use Transaction is set to true, KafkaProducer config 'transactional.id' will be a generated UUID and will be prefixed with this string.\",\n+                                \"displayName\": \"Transactional Id Prefix\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"transactional-id-prefix\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"use-transactions\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"true\",\n+                                \"description\": \"Specifies whether or not NiFi should provide Transactional guarantees when communicating with Kafka. If there is a problem sending data to Kafka, and this property is set to false, then the messages that have already been sent to Kafka will continue on and be delivered to consumers. If this is set to true, then the Kafka transaction will be rolled back so that those messages are not available to consumers. Setting this to true requires that the <Delivery Guarantee> property be set to \\\"Guarantee Replicated Delivery.\\\"\",\n+                                \"displayName\": \"Use Transactions\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"use-transactions\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             }\n                         },\n-                        \"providedApiImplementations\": [\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.processors.kafka.pubsub.ConsumeKafkaRecord_1_0\",\n+                            \"org.apache.nifi.processors.kafka.pubsub.ConsumeKafka_1_0\",\n+                            \"org.apache.nifi.processors.kafka.pubsub.PublishKafka_1_0\"\n+                        ],\n+                        \"sideEffectFree\": false,\n+                        \"supportedRelationships\": [\n                             {\n-                                \"artifact\": \"nifi-standard-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.http.HttpContextMap\",\n-                                \"version\": \"1.27.0\"\n+                                \"description\": \"FlowFiles for which all content was sent to Kafka.\",\n+                                \"name\": \"success\"\n+                            },\n+                            {\n+                                \"description\": \"Any FlowFile that cannot be sent to Kafka will be routed to this Relationship\",\n+                                \"name\": \"failure\"\n                             }\n                         ],\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.processors.standard.HandleHttpRequest\",\n-                            \"org.apache.nifi.processors.standard.HandleHttpResponse\"\n+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\"\n                         ],\n-                        \"supportsDynamicProperties\": false,\n+                        \"supportsBatching\": false,\n+                        \"supportsDynamicProperties\": true,\n+                        \"supportsDynamicRelationships\": false,\n+                        \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"http\",\n-                            \"request\",\n-                            \"response\"\n+                            \"1.0\",\n+                            \"Apache\",\n+                            \"Kafka\",\n+                            \"Message\",\n+                            \"PubSub\",\n+                            \"Put\",\n+                            \"Record\",\n+                            \"Send\",\n+                            \"avro\",\n+                            \"csv\",\n+                            \"json\",\n+                            \"logs\"\n                         ],\n-                        \"type\": \"org.apache.nifi.http.StandardHttpContextMap\",\n-                        \"typeDescription\": \"Provides the ability to store and retrieve HTTP requests and responses external to a Processor, so that multiple Processors can interact with the same HTTP request.\",\n-                        \"version\": \"1.27.0\"\n-                    }\n-                ],\n-                \"processors\": [],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"1.27.0\"\n-        },\n-        {\n-            \"artifact\": \"nifi-compress-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [],\n-                \"processors\": [\n+                        \"triggerSerially\": false,\n+                        \"triggerWhenAnyDestinationAvailable\": false,\n+                        \"triggerWhenEmpty\": false,\n+                        \"type\": \"org.apache.nifi.processors.kafka.pubsub.PublishKafkaRecord_1_0\",\n+                        \"typeDescription\": \"Sends the contents of a FlowFile as individual records to Apache Kafka using the Kafka 1.0 Producer API. The contents of the FlowFile are expected to be record-oriented data that can be read by the configured Record Reader. The complementary NiFi processor for fetching messages is ConsumeKafkaRecord_1_0.\",\n+                        \"version\": \"1.27.0\",\n+                        \"writesAttributes\": [\n+                            {\n+                                \"description\": \"The number of messages that were sent to Kafka for this FlowFile. This attribute is added only to FlowFiles that are routed to success.\",\n+                                \"name\": \"msg.count\"\n+                            }\n+                        ]\n+                    },\n                     {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-compress-nar\",\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-kafka-1-0-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -10504,894 +8592,1317 @@\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n+                        \"deprecated\": true,\n+                        \"deprecationAlternatives\": [\n+                            \"org.apache.nifi.processors.kafka.pubsub.PublishKafka_2_6\"\n+                        ],\n+                        \"deprecationReason\": \"\",\n+                        \"dynamicProperties\": [\n+                            {\n+                                \"description\": \"These properties will be added on the Kafka configuration after loading any provided configuration properties. In the event a dynamic property represents a property that was already set, its value will be ignored and WARN message logged. For the list of available Kafka properties please refer to: http://kafka.apache.org/documentation.html#configuration. \",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"name\": \"The name of a Kafka configuration property.\",\n+                                \"value\": \"The value of a given Kafka configuration property.\"\n+                            }\n+                        ],\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Input Compression Strategy\": {\n+                            \"ack.wait.time\": {\n+                                \"defaultValue\": \"5 secs\",\n+                                \"description\": \"After sending a message to Kafka, this indicates the amount of time that we are willing to wait for a response from Kafka. If Kafka does not acknowledge the message within this time period, the FlowFile will be routed to 'failure'.\",\n+                                \"displayName\": \"Acknowledgment Wait Time\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"ack.wait.time\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"acks\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"No Compression\",\n-                                        \"displayName\": \"no compression\",\n-                                        \"value\": \"no compression\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Use the [mime.type] attribute from the input FlowFile to determine the format\",\n-                                        \"displayName\": \"use mime.type attribute\",\n-                                        \"value\": \"use mime.type attribute\"\n-                                    },\n-                                    {\n-                                        \"description\": \"GZIP\",\n-                                        \"displayName\": \"gzip\",\n-                                        \"value\": \"gzip\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Deflate\",\n-                                        \"displayName\": \"deflate\",\n-                                        \"value\": \"deflate\"\n-                                    },\n-                                    {\n-                                        \"description\": \"BZIP2\",\n-                                        \"displayName\": \"bzip2\",\n-                                        \"value\": \"bzip2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"XZ-LZMA2\",\n-                                        \"displayName\": \"xz-lzma2\",\n-                                        \"value\": \"xz-lzma2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"LZMA\",\n-                                        \"displayName\": \"lzma\",\n-                                        \"value\": \"lzma\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Snappy\",\n-                                        \"displayName\": \"snappy\",\n-                                        \"value\": \"snappy\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Snappy-Framed\",\n-                                        \"displayName\": \"snappy-framed\",\n-                                        \"value\": \"snappy-framed\"\n-                                    },\n-                                    {\n-                                        \"description\": \"LZ4\",\n-                                        \"displayName\": \"lz4-framed\",\n-                                        \"value\": \"lz4-framed\"\n+                                        \"description\": \"FlowFile will be routed to success after successfully sending the content to a Kafka node, without waiting for any acknowledgment from the node at all. This provides the best performance but may result in data loss.\",\n+                                        \"displayName\": \"Best Effort\",\n+                                        \"value\": \"0\"\n                                     },\n                                     {\n-                                        \"description\": \"ZSTD\",\n-                                        \"displayName\": \"zstd\",\n-                                        \"value\": \"zstd\"\n+                                        \"description\": \"FlowFile will be routed to success if the message is received by a single Kafka node, whether or not it is replicated. This is faster than <Guarantee Replicated Delivery> but can result in data loss if a Kafka node crashes\",\n+                                        \"displayName\": \"Guarantee Single Node Delivery\",\n+                                        \"value\": \"1\"\n                                     },\n                                     {\n-                                        \"description\": \"Brotli\",\n-                                        \"displayName\": \"brotli\",\n-                                        \"value\": \"brotli\"\n+                                        \"description\": \"FlowFile will be routed to failure unless the message is replicated to the appropriate number of Kafka Nodes according to the Topic configuration\",\n+                                        \"displayName\": \"Guarantee Replicated Delivery\",\n+                                        \"value\": \"all\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"no compression\",\n-                                \"description\": \"The strategy to use for decompressing input FlowFiles\",\n-                                \"displayName\": \"Input Compression Strategy\",\n+                                \"defaultValue\": \"0\",\n+                                \"description\": \"Specifies the requirement for guaranteeing that a message is sent to Kafka. Corresponds to Kafka's 'acks' property.\",\n+                                \"displayName\": \"Delivery Guarantee\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Input Compression Strategy\",\n+                                \"name\": \"acks\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Output Compression Level\": {\n+                            \"attribute-name-regex\": {\n+                                \"description\": \"A Regular Expression that is matched against all FlowFile attribute names. Any attribute whose name matches the regex will be added to the Kafka messages as a Header. If not specified, no FlowFile attributes will be added as headers.\",\n+                                \"displayName\": \"Attributes to Send as Headers (Regex)\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"attribute-name-regex\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"bootstrap.servers\": {\n+                                \"defaultValue\": \"localhost:9092\",\n+                                \"description\": \"Comma-separated list of Kafka Brokers in the format host:port\",\n+                                \"displayName\": \"Kafka Brokers\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"bootstrap.servers\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"compression.type\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"0\",\n-                                        \"value\": \"0\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"1\",\n-                                        \"value\": \"1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"2\",\n-                                        \"value\": \"2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"3\",\n-                                        \"value\": \"3\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"4\",\n-                                        \"value\": \"4\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"5\",\n-                                        \"value\": \"5\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"6\",\n-                                        \"value\": \"6\"\n+                                        \"displayName\": \"none\",\n+                                        \"value\": \"none\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"7\",\n-                                        \"value\": \"7\"\n+                                        \"displayName\": \"gzip\",\n+                                        \"value\": \"gzip\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"8\",\n-                                        \"value\": \"8\"\n+                                        \"displayName\": \"snappy\",\n+                                        \"value\": \"snappy\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"9\",\n-                                        \"value\": \"9\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"1\",\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"zstd\",\n-                                            \"use mime.type attribute\",\n-                                            \"deflate\",\n-                                            \"brotli\",\n-                                            \"gzip\",\n-                                            \"xz-lzma2\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Output Compression Strategy\",\n-                                        \"propertyName\": \"Output Compression Strategy\"\n+                                        \"displayName\": \"lz4\",\n+                                        \"value\": \"lz4\"\n                                     }\n                                 ],\n-                                \"description\": \"The compression level for output FlowFiles for supported formats. A lower value results in faster processing but less compression; a value of 0 indicates no (that is, simple archiving) for gzip or minimal for xz-lzma2 compression. Higher levels can mean much larger memory usage such as the case with levels 7-9 for xz-lzma/2 so be careful relative to heap size.\",\n-                                \"displayName\": \"Output Compression Level\",\n+                                \"defaultValue\": \"none\",\n+                                \"description\": \"This parameter allows you to specify the compression codec for all data generated by this producer.\",\n+                                \"displayName\": \"Compression Type\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Output Compression Level\",\n+                                \"name\": \"compression.type\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Output Compression Strategy\": {\n+                            \"kafka-key\": {\n+                                \"description\": \"The Key to use for the Message. If not specified, the flow file attribute 'kafka.key' is used as the message key, if it is present.Beware that setting Kafka key and demarcating at the same time may potentially lead to many Kafka messages with the same key.Normally this is not a problem as Kafka does not enforce or assume message and key uniqueness. Still, setting the demarcator and Kafka key at the same time poses a risk of data loss on Kafka. During a topic compaction on Kafka, messages will be deduplicated based on this key.\",\n+                                \"displayName\": \"Kafka Key\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"kafka-key\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"key-attribute-encoding\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"No Compression\",\n-                                        \"displayName\": \"no compression\",\n-                                        \"value\": \"no compression\"\n-                                    },\n-                                    {\n-                                        \"description\": \"GZIP\",\n-                                        \"displayName\": \"gzip\",\n-                                        \"value\": \"gzip\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Deflate\",\n-                                        \"displayName\": \"deflate\",\n-                                        \"value\": \"deflate\"\n+                                        \"description\": \"The key is interpreted as a UTF-8 Encoded string.\",\n+                                        \"displayName\": \"UTF-8 Encoded\",\n+                                        \"value\": \"utf-8\"\n                                     },\n                                     {\n-                                        \"description\": \"BZIP2\",\n-                                        \"displayName\": \"bzip2\",\n-                                        \"value\": \"bzip2\"\n+                                        \"description\": \"The key is interpreted as arbitrary binary data and is encoded using hexadecimal characters with uppercase letters\",\n+                                        \"displayName\": \"Hex Encoded\",\n+                                        \"value\": \"hex\"\n                                     },\n                                     {\n-                                        \"description\": \"XZ-LZMA2\",\n-                                        \"displayName\": \"xz-lzma2\",\n-                                        \"value\": \"xz-lzma2\"\n-                                    },\n+                                        \"description\": \"The key will not be added as an Attribute\",\n+                                        \"displayName\": \"Do Not Add Key as Attribute\",\n+                                        \"value\": \"do-not-add\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"utf-8\",\n+                                \"description\": \"FlowFiles that are emitted have an attribute named 'kafka.key'. This property dictates how the value of the attribute should be encoded.\",\n+                                \"displayName\": \"Key Attribute Encoding\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"key-attribute-encoding\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"max.block.ms\": {\n+                                \"defaultValue\": \"5 sec\",\n+                                \"description\": \"The amount of time publisher will wait to obtain metadata or wait for the buffer to flush during the 'send' call before failing the entire 'send' call. Corresponds to Kafka's 'max.block.ms' property\",\n+                                \"displayName\": \"Max Metadata Wait Time\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"max.block.ms\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"max.request.size\": {\n+                                \"defaultValue\": \"1 MB\",\n+                                \"description\": \"The maximum size of a request in bytes. Corresponds to Kafka's 'max.request.size' property and defaults to 1 MB (1048576).\",\n+                                \"displayName\": \"Max Request Size\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"max.request.size\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"message-demarcator\": {\n+                                \"description\": \"Specifies the string (interpreted as UTF-8) to use for demarcating multiple messages within a single FlowFile. If not specified, the entire content of the FlowFile will be used as a single message. If specified, the contents of the FlowFile will be split on this delimiter and each section sent as a separate Kafka message. To enter special character such as 'new line' use CTRL+Enter or Shift+Enter, depending on your OS.\",\n+                                \"displayName\": \"Message Demarcator\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"message-demarcator\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"message-header-encoding\": {\n+                                \"defaultValue\": \"UTF-8\",\n+                                \"description\": \"For any attribute that is added as a message header, as configured via the <Attributes to Send as Headers> property, this property indicates the Character Encoding to use for serializing the headers.\",\n+                                \"displayName\": \"Message Header Encoding\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"message-header-encoding\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"partition\": {\n+                                \"description\": \"Specifies which Partition Records will go to.\",\n+                                \"displayName\": \"Partition\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"partition\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"partitioner.class\": {\n+                                \"allowableValues\": [\n                                     {\n-                                        \"description\": \"LZMA\",\n-                                        \"displayName\": \"lzma\",\n-                                        \"value\": \"lzma\"\n+                                        \"description\": \"Messages will be assigned partitions in a round-robin fashion, sending the first message to Partition 1, the next Partition to Partition 2, and so on, wrapping as necessary.\",\n+                                        \"displayName\": \"RoundRobinPartitioner\",\n+                                        \"value\": \"org.apache.nifi.processors.kafka.pubsub.Partitioners$RoundRobinPartitioner\"\n                                     },\n                                     {\n-                                        \"description\": \"Snappy\",\n-                                        \"displayName\": \"snappy\",\n-                                        \"value\": \"snappy\"\n+                                        \"description\": \"Messages will be assigned to random partitions.\",\n+                                        \"displayName\": \"DefaultPartitioner\",\n+                                        \"value\": \"org.apache.kafka.clients.producer.internals.DefaultPartitioner\"\n                                     },\n                                     {\n-                                        \"description\": \"Snappy-Hadoop\",\n-                                        \"displayName\": \"snappy-hadoop\",\n-                                        \"value\": \"snappy-hadoop\"\n-                                    },\n+                                        \"description\": \"Interprets the <Partition> property as Expression Language that will be evaluated against each FlowFile. This Expression will be evaluated once against the FlowFile, so all Records in a given FlowFile will go to the same partition.\",\n+                                        \"displayName\": \"Expression Language Partitioner\",\n+                                        \"value\": \"org.apache.nifi.processors.kafka.pubsub.Partitioners$ExpressionLanguagePartitioner\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"org.apache.kafka.clients.producer.internals.DefaultPartitioner\",\n+                                \"description\": \"Specifies which class to use to compute a partition id for a message. Corresponds to Kafka's 'partitioner.class' property.\",\n+                                \"displayName\": \"Partitioner class\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"partitioner.class\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"sasl.kerberos.keytab\": {\n+                                \"description\": \"Keytab credentials used for authentication with Kerberos\",\n+                                \"displayName\": \"Kerberos Keytab\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"sasl.kerberos.keytab\",\n+                                \"required\": false,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"SINGLE\",\n+                                    \"resourceTypes\": [\n+                                        \"FILE\"\n+                                    ]\n+                                },\n+                                \"sensitive\": false\n+                            },\n+                            \"sasl.kerberos.principal\": {\n+                                \"description\": \"Principal used for authentication with Kerberos\",\n+                                \"displayName\": \"Kerberos Principal\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"sasl.kerberos.principal\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"sasl.kerberos.service.name\": {\n+                                \"description\": \"The service name that matches the primary name of the Kafka server configured in the broker JAAS configuration\",\n+                                \"displayName\": \"Kerberos Service Name\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"sasl.kerberos.service.name\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"security.protocol\": {\n+                                \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Snappy-Framed\",\n-                                        \"displayName\": \"snappy-framed\",\n-                                        \"value\": \"snappy-framed\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"PLAINTEXT\",\n+                                        \"value\": \"PLAINTEXT\"\n                                     },\n                                     {\n-                                        \"description\": \"LZ4\",\n-                                        \"displayName\": \"lz4-framed\",\n-                                        \"value\": \"lz4-framed\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"SSL\",\n+                                        \"value\": \"SSL\"\n                                     },\n                                     {\n-                                        \"description\": \"ZSTD\",\n-                                        \"displayName\": \"zstd\",\n-                                        \"value\": \"zstd\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"SASL_PLAINTEXT\",\n+                                        \"value\": \"SASL_PLAINTEXT\"\n                                     },\n                                     {\n-                                        \"description\": \"Brotli\",\n-                                        \"displayName\": \"brotli\",\n-                                        \"value\": \"brotli\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"SASL_SSL\",\n+                                        \"value\": \"SASL_SSL\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"no compression\",\n-                                \"description\": \"The strategy to use for compressing output FlowFiles\",\n-                                \"displayName\": \"Output Compression Strategy\",\n+                                \"defaultValue\": \"PLAINTEXT\",\n+                                \"description\": \"Security protocol used to communicate with brokers. Corresponds to Kafka Client security.protocol property\",\n+                                \"displayName\": \"Security Protocol\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Output Compression Strategy\",\n+                                \"name\": \"security.protocol\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Output Filename Strategy\": {\n+                            \"ssl.context.service\": {\n+                                \"description\": \"Service supporting SSL communication with Kafka brokers\",\n+                                \"displayName\": \"SSL Context Service\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"ssl.context.service\",\n+                                \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"topic\": {\n+                                \"description\": \"The name of the Kafka Topic to publish to.\",\n+                                \"displayName\": \"Topic Name\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"topic\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"transactional-id-prefix\": {\n+                                \"description\": \"When Use Transaction is set to true, KafkaProducer config 'transactional.id' will be a generated UUID and will be prefixed with this string.\",\n+                                \"displayName\": \"Transactional Id Prefix\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"transactional-id-prefix\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"use-transactions\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Retain the filename attribute value from the input FlowFile\",\n-                                        \"displayName\": \"Original\",\n-                                        \"value\": \"ORIGINAL\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n-                                        \"description\": \"Remove the filename extension when decompressing and add a new extension for compressed output FlowFiles\",\n-                                        \"displayName\": \"Updated\",\n-                                        \"value\": \"UPDATED\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"UPDATED\",\n-                                \"description\": \"Processing strategy for filename attribute on output FlowFiles\",\n-                                \"displayName\": \"Output Filename Strategy\",\n+                                \"defaultValue\": \"true\",\n+                                \"description\": \"Specifies whether or not NiFi should provide Transactional guarantees when communicating with Kafka. If there is a problem sending data to Kafka, and this property is set to false, then the messages that have already been sent to Kafka will continue on and be delivered to consumers. If this is set to true, then the Kafka transaction will be rolled back so that those messages are not available to consumers. Setting this to true requires that the <Delivery Guarantee> property be set to \\\"Guarantee Replicated Delivery.\\\"\",\n+                                \"displayName\": \"Use Transactions\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Output Filename Strategy\",\n+                                \"name\": \"use-transactions\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             }\n                         },\n-                        \"readsAttributes\": [\n-                            {\n-                                \"description\": \"If the Decompression Format is set to 'use mime.type attribute', this attribute is used to determine the decompression type. Otherwise, this attribute is ignored.\",\n-                                \"name\": \"mime.type\"\n-                            }\n-                        ],\n-                        \"sideEffectFree\": true,\n+                        \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"FlowFiles will be transferred to the success relationship on compression modification success\",\n+                                \"description\": \"FlowFiles for which all content was sent to Kafka.\",\n                                 \"name\": \"success\"\n                             },\n                             {\n-                                \"description\": \"FlowFiles will be transferred to the failure relationship on compression modification errors\",\n+                                \"description\": \"Any FlowFile that cannot be sent to Kafka will be routed to this Relationship\",\n                                 \"name\": \"failure\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n-                        \"supportsBatching\": true,\n-                        \"supportsDynamicProperties\": false,\n+                        \"supportsBatching\": false,\n+                        \"supportsDynamicProperties\": true,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n-                        \"systemResourceConsiderations\": [\n-                            {\n-                                \"description\": \"An instance of this component can cause high usage of this system resource.  Multiple instances or high concurrency settings may result a degradation of performance.\",\n-                                \"resource\": \"CPU\"\n-                            },\n-                            {\n-                                \"description\": \"An instance of this component can cause high usage of this system resource.  Multiple instances or high concurrency settings may result a degradation of performance.\",\n-                                \"resource\": \"MEMORY\"\n-                            }\n-                        ],\n                         \"tags\": [\n-                            \"brotli\",\n-                            \"bzip2\",\n-                            \"compress\",\n-                            \"content\",\n-                            \"deflate\",\n-                            \"gzip\",\n-                            \"lz4-framed\",\n-                            \"lzma\",\n-                            \"recompress\",\n-                            \"snappy\",\n-                            \"snappy framed\",\n-                            \"snappy-hadoop\",\n-                            \"xz-lzma2\",\n-                            \"zstd\"\n+                            \"1.0\",\n+                            \"Apache\",\n+                            \"Kafka\",\n+                            \"Message\",\n+                            \"PubSub\",\n+                            \"Put\",\n+                            \"Send\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.compress.ModifyCompression\",\n-                        \"typeDescription\": \"Changes the compression algorithm used to compress the contents of a FlowFile by decompressing the contents of FlowFiles using a user-specified compression algorithm and recompressing the contents using the specified compression format properties. This processor operates in a very memory efficient way so very large objects well beyond the heap size are generally fine to process\",\n+                        \"type\": \"org.apache.nifi.processors.kafka.pubsub.PublishKafka_1_0\",\n+                        \"typeDescription\": \"Sends the contents of a FlowFile as a message to Apache Kafka using the Kafka 1.0 Producer API.The messages to send may be individual FlowFiles or may be delimited, using a user-specified delimiter, such as a new-line. The complementary NiFi processor for fetching messages is ConsumeKafka_1_0.\",\n                         \"version\": \"1.27.0\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"The appropriate MIME Type is set based on the value of the Compression Format property. If the Compression Format is 'no compression' this attribute is removed as the MIME Type is no longer known.\",\n-                                \"name\": \"mime.type\"\n+                                \"description\": \"The number of messages that were sent to Kafka for this FlowFile. This attribute is added only to FlowFiles that are routed to success. If the <Message Demarcator> Property is not set, this will always be 1, but if the Property is set, it may be greater than 1.\",\n+                                \"name\": \"msg.count\"\n                             }\n                         ]\n                     }\n                 ],\n                 \"reportingTasks\": []\n             },\n             \"group\": \"org.apache.nifi\",\n             \"version\": \"1.27.0\"\n         },\n         {\n-            \"artifact\": \"nifi-mongodb-client-service-api-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [],\n-                \"processors\": [],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"1.27.0\"\n-        },\n-        {\n-            \"artifact\": \"nifi-file-resource-service-nar\",\n+            \"artifact\": \"nifi-key-service-nar\",\n             \"componentManifest\": {\n                 \"controllerServices\": [\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-file-resource-service-nar\",\n+                        \"artifact\": \"nifi-key-service-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n-                        \"explicitRestrictions\": [\n-                            {\n-                                \"explanation\": \"Provides operator the ability to read from any file that NiFi has access to.\",\n-                                \"requiredPermission\": \"read filesystem\"\n-                            }\n-                        ],\n                         \"group\": \"org.apache.nifi\",\n                         \"propertyDescriptors\": {\n-                            \"file-path\": {\n-                                \"defaultValue\": \"${absolute.path}/${filename}\",\n-                                \"description\": \"Path to a file that can be accessed locally.\",\n-                                \"displayName\": \"File Path\",\n+                            \"key\": {\n+                                \"description\": \"Private Key structured using PKCS8 and encoded as PEM\",\n+                                \"displayName\": \"Key\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"file-path\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"key\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n+                            },\n+                            \"key-file\": {\n+                                \"description\": \"File path to Private Key structured using PKCS8 and encoded as PEM\",\n+                                \"displayName\": \"Key File\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"key-file\",\n+                                \"required\": false,\n                                 \"resourceDefinition\": {\n                                     \"cardinality\": \"SINGLE\",\n                                     \"resourceTypes\": [\n                                         \"FILE\"\n                                     ]\n                                 },\n                                 \"sensitive\": false\n+                            },\n+                            \"key-password\": {\n+                                \"description\": \"Password used for decrypting Private Keys\",\n+                                \"displayName\": \"Key Password\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"key-password\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n                             }\n                         },\n                         \"providedApiImplementations\": [\n                             {\n                                 \"artifact\": \"nifi-standard-services-api-nar\",\n                                 \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.fileresource.service.api.FileResourceService\",\n+                                \"type\": \"org.apache.nifi.key.service.api.PrivateKeyService\",\n                                 \"version\": \"1.27.0\"\n                             }\n                         ],\n-                        \"restricted\": true,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"file\",\n-                            \"resource\"\n+                            \"PEM\",\n+                            \"PKCS8\"\n                         ],\n-                        \"type\": \"org.apache.nifi.fileresource.service.StandardFileResourceService\",\n-                        \"typeDescription\": \"Provides a file resource for other components. The file needs to be available locally by Nifi (e.g. local disk or mounted storage). NiFi needs to have read permission to the file.\",\n+                        \"type\": \"org.apache.nifi.key.service.StandardPrivateKeyService\",\n+                        \"typeDescription\": \"Private Key Service provides access to a Private Key loaded from configured sources\",\n                         \"version\": \"1.27.0\"\n                     }\n                 ],\n                 \"processors\": [],\n                 \"reportingTasks\": []\n             },\n             \"group\": \"org.apache.nifi\",\n             \"version\": \"1.27.0\"\n         },\n         {\n-            \"artifact\": \"nifi-asana-processors-nar\",\n+            \"artifact\": \"nifi-hadoop-libraries-nar\",\n             \"componentManifest\": {\n                 \"controllerServices\": [],\n+                \"processors\": [],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"1.27.0\"\n+        },\n+        {\n+            \"artifact\": \"nifi-kudu-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-kudu-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"e0c4461\"\n+                        },\n+                        \"group\": \"org.apache.nifi\",\n+                        \"propertyDescriptors\": {\n+                            \"kudu-lu-kerberos-credentials-service\": {\n+                                \"description\": \"Specifies the Kerberos Credentials to use for authentication\",\n+                                \"displayName\": \"Kerberos Credentials Service\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"kudu-lu-kerberos-credentials-service\",\n+                                \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.kerberos.KerberosCredentialsService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"kudu-lu-masters\": {\n+                                \"description\": \"Comma separated addresses of the Kudu masters to connect to.\",\n+                                \"displayName\": \"Kudu Masters\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"kudu-lu-masters\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"kudu-lu-operations-timeout-ms\": {\n+                                \"defaultValue\": \"30000ms\",\n+                                \"description\": \"Default timeout used for user operations (using sessions and scanners)\",\n+                                \"displayName\": \"Kudu Operation Timeout\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"kudu-lu-operations-timeout-ms\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"kudu-lu-replica-selection\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"Select the closest replica to the client. Replicas are classified from closest to furthest as follows: 1) Local replicas 2) Replicas whose tablet server has the same location as the client 3) All other replicas\",\n+                                        \"displayName\": \"CLOSEST_REPLICA\",\n+                                        \"value\": \"CLOSEST_REPLICA\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Select the LEADER replica\",\n+                                        \"displayName\": \"LEADER_ONLY\",\n+                                        \"value\": \"LEADER_ONLY\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"CLOSEST_REPLICA\",\n+                                \"description\": \"Policy with which to choose amongst multiple replicas\",\n+                                \"displayName\": \"Kudu Replica Selection\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"kudu-lu-replica-selection\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"kudu-lu-return-cols\": {\n+                                \"defaultValue\": \"*\",\n+                                \"description\": \"A comma-separated list of columns to return when scanning. To return all columns set to \\\"*\\\"\",\n+                                \"displayName\": \"Kudu Return Columns\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"kudu-lu-return-cols\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"kudu-lu-table-name\": {\n+                                \"defaultValue\": \"default\",\n+                                \"description\": \"Name of the table to access.\",\n+                                \"displayName\": \"Kudu Table Name\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"kudu-lu-table-name\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            }\n+                        },\n+                        \"providedApiImplementations\": [\n+                            {\n+                                \"artifact\": \"nifi-standard-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.lookup.LookupService\",\n+                                \"version\": \"1.27.0\"\n+                            },\n+                            {\n+                                \"artifact\": \"nifi-standard-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.lookup.RecordLookupService\",\n+                                \"version\": \"1.27.0\"\n+                            }\n+                        ],\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"enrich\",\n+                            \"key\",\n+                            \"kudu\",\n+                            \"lookup\",\n+                            \"value\"\n+                        ],\n+                        \"type\": \"org.apache.nifi.controller.kudu.KuduLookupService\",\n+                        \"typeDescription\": \"Lookup a record from Kudu Server associated with the specified key. Binary columns are base64 encoded. Only one matched row will be returned\",\n+                        \"version\": \"1.27.0\"\n+                    }\n+                ],\n                 \"processors\": [\n                     {\n                         \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-asana-processors-nar\",\n+                        \"artifact\": \"nifi-kudu-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n+                            \"EVENT_DRIVEN\": 0,\n                             \"TIMER_DRIVEN\": 1\n                         },\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n-                        \"primaryNodeOnly\": true,\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n+                        \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"asana-controller-service\": {\n-                                \"description\": \"Specify which controller service to use for accessing Asana.\",\n-                                \"displayName\": \"Asana Client Service\",\n+                            \"Batch Size\": {\n+                                \"defaultValue\": \"100\",\n+                                \"description\": \"The maximum number of Records to process in a single Kudu-client batch, between 1 - 100000. Depending on your memory size, and data size per row set an appropriate batch size. Gradually increase this number to find out the best one for best performances.\",\n+                                \"displayName\": \"Max Records per Batch\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Batch Size\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Data RecordPath\": {\n+                                \"description\": \"If specified, this property denotes a RecordPath that will be evaluated against each incoming Record and the Record that results from evaluating the RecordPath will be sent to Kudu instead of sending the entire incoming Record. If not specified, the entire incoming Record will be published to Kudu.\",\n+                                \"displayName\": \"Data RecordPath\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"asana-controller-service\",\n-                                \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-asana-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.controller.asana.AsanaClientProviderService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n+                                \"name\": \"Data RecordPath\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n                             },\n-                            \"asana-object-type\": {\n+                            \"Failure Strategy\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Collect tasks matching to the specified conditions.\",\n-                                        \"displayName\": \"Tasks\",\n-                                        \"value\": \"asana-collect-tasks\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Collect attached files of tasks matching to the specified conditions.\",\n-                                        \"displayName\": \"Task Attachments\",\n-                                        \"value\": \"asana-collect-task-attachments\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Collect projects of the workspace.\",\n-                                        \"displayName\": \"Projects\",\n-                                        \"value\": \"asana-collect-projects\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Collect tags of the workspace.\",\n-                                        \"displayName\": \"Tags\",\n-                                        \"value\": \"asana-collect-tags\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Collect users assigned to the workspace.\",\n-                                        \"displayName\": \"Users\",\n-                                        \"value\": \"asana-collect-users\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Collect users assigned to the specified project.\",\n-                                        \"displayName\": \"Members of a Project\",\n-                                        \"value\": \"asana-collect-project-members\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Collect teams of the workspace.\",\n-                                        \"displayName\": \"Teams\",\n-                                        \"value\": \"asana-collect-teams\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Collect users assigned to the specified team.\",\n-                                        \"displayName\": \"Team Members\",\n-                                        \"value\": \"asana-collect-team-members\"\n+                                        \"description\": \"The FlowFile containing the Records that failed to insert will be routed to the 'failure' relationship\",\n+                                        \"displayName\": \"Route to Failure\",\n+                                        \"value\": \"route-to-failure\"\n                                     },\n                                     {\n-                                        \"description\": \"Collect stories (comments) of of tasks matching to the specified conditions.\",\n-                                        \"displayName\": \"Stories of Tasks\",\n-                                        \"value\": \"asana-collect-stories\"\n-                                    },\n+                                        \"description\": \"If any Record cannot be inserted, all FlowFiles in the session will be rolled back to their input queue. This means that if data cannot be pushed, it will block any subsequent data from be pushed to Kudu as well until the issue is resolved. However, this may be advantageous if a strict ordering is required.\",\n+                                        \"displayName\": \"Rollback Session\",\n+                                        \"value\": \"rollback\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"route-to-failure\",\n+                                \"description\": \"If one or more Records in a batch cannot be transferred to Kudu, specifies how to handle the failure\",\n+                                \"displayName\": \"Failure Strategy\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Failure Strategy\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"FlowFiles per Batch\": {\n+                                \"defaultValue\": \"1\",\n+                                \"description\": \"The maximum number of FlowFiles to process in a single execution, between 1 - 100000. Depending on your memory size, and data size per row set an appropriate batch size for the number of FlowFiles to process per client connection setup.Gradually increase this number, only if your FlowFiles typically contain a few records.\",\n+                                \"displayName\": \"FlowFiles per Batch\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"FlowFiles per Batch\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Flush Mode\": {\n+                                \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Collect status updates of the specified project.\",\n-                                        \"displayName\": \"Status Updates of a Project\",\n-                                        \"value\": \"asana-collect-project-status-updates\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"AUTO_FLUSH_SYNC\",\n+                                        \"value\": \"AUTO_FLUSH_SYNC\"\n                                     },\n                                     {\n-                                        \"description\": \"Collect attached files of project status updates.\",\n-                                        \"displayName\": \"Attachments of Status Updates\",\n-                                        \"value\": \"asana-collect-project-status-attachments\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"AUTO_FLUSH_BACKGROUND\",\n+                                        \"value\": \"AUTO_FLUSH_BACKGROUND\"\n                                     },\n                                     {\n-                                        \"description\": \"Collect various events happening on the specified project and on its' tasks.\",\n-                                        \"displayName\": \"Events of a Project\",\n-                                        \"value\": \"asana-collect-project-events\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"MANUAL_FLUSH\",\n+                                        \"value\": \"MANUAL_FLUSH\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"asana-collect-tasks\",\n-                                \"description\": \"Specify what kind of objects to be collected from Asana\",\n-                                \"displayName\": \"Object Type\",\n+                                \"defaultValue\": \"AUTO_FLUSH_BACKGROUND\",\n+                                \"description\": \"Set the new flush mode for a kudu session.\\nAUTO_FLUSH_SYNC: the call returns when the operation is persisted, else it throws an exception.\\nAUTO_FLUSH_BACKGROUND: the call returns when the operation has been added to the buffer. This call should normally perform only fast in-memory operations but it may have to wait when the buffer is full and there's another buffer being flushed.\\nMANUAL_FLUSH: the call returns when the operation has been added to the buffer, else it throws a KuduException if the buffer is full.\",\n+                                \"displayName\": \"Flush Mode\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"asana-object-type\",\n+                                \"name\": \"Flush Mode\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"asana-output-batch-size\": {\n-                                \"defaultValue\": \"1\",\n-                                \"description\": \"The number of items batched together in a single Flow File. If set to 1 (default), then each item is transferred in a separate Flow File and each will have an asana.gid attribute, to help identifying the fetched item on the server side, if needed. If the batch size is greater than 1, then the specified amount of items are batched together in a single Flow File as a Json array, and the Flow Files won't have the asana.gid attribute.\",\n-                                \"displayName\": \"Output Batch Size\",\n+                            \"Handle Schema Drift\": {\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"If set to true, when fields with names that are not in the target Kudu table are encountered, the Kudu table will be altered to include new columns for those fields.\",\n+                                \"displayName\": \"Handle Schema Drift\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Handle Schema Drift\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Ignore NULL\": {\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"Ignore NULL on Kudu Put Operation, Update only non-Null columns if set true\",\n+                                \"displayName\": \"Ignore NULL\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Ignore NULL\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Insert Operation\": {\n+                                \"defaultValue\": \"INSERT\",\n+                                \"description\": \"Specify operationType for this processor.\\nValid values are: INSERT, INSERT_IGNORE, UPSERT, UPDATE, DELETE, UPDATE_IGNORE, DELETE_IGNORE. This Property will be ignored if the <Operation RecordPath> property is set.\",\n+                                \"displayName\": \"Kudu Operation Type\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Insert Operation\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Kudu Masters\": {\n+                                \"description\": \"Comma separated addresses of the Kudu masters to connect to.\",\n+                                \"displayName\": \"Kudu Masters\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Kudu Masters\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Lowercase Field Names\": {\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"Convert column names to lowercase when finding index of Kudu table columns\",\n+                                \"displayName\": \"Lowercase Field Names\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Lowercase Field Names\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Operation RecordPath\": {\n+                                \"description\": \"If specified, this property denotes a RecordPath that will be evaluated against each incoming Record in order to determine the Kudu Operation Type. When evaluated, the RecordPath must evaluate to one of the valid Kudu Operation Types (Debezium style operation types are also supported: \\\"r\\\" and \\\"c\\\" for INSERT, \\\"u\\\" for UPDATE, and \\\"d\\\" for DELETE), or the incoming FlowFile will be routed to failure. If this property is specified, the <Kudu Operation Type> property will be ignored.\",\n+                                \"displayName\": \"Operation RecordPath\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"asana-output-batch-size\",\n-                                \"required\": true,\n+                                \"name\": \"Operation RecordPath\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"asana-project-name\": {\n-                                \"dependencies\": [\n+                            \"Skip head line\": {\n+                                \"allowableValues\": [\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"asana-collect-project-members\",\n-                                            \"asana-collect-project-status-attachments\",\n-                                            \"asana-collect-project-status-updates\",\n-                                            \"asana-collect-task-attachments\",\n-                                            \"asana-collect-stories\",\n-                                            \"asana-collect-tasks\",\n-                                            \"asana-collect-project-events\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Object Type\",\n-                                        \"propertyName\": \"asana-object-type\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"description\": \"Fetch only objects in this project. Case sensitive.\",\n-                                \"displayName\": \"Project Name\",\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"Deprecated. Used to ignore header lines, but this should be handled by a RecordReader (e.g. \\\"Treat First Line as Header\\\" property of CSVReader)\",\n+                                \"displayName\": \"Skip head line\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"asana-project-name\",\n+                                \"name\": \"Skip head line\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"asana-section-name\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"asana-collect-task-attachments\",\n-                                            \"asana-collect-stories\",\n-                                            \"asana-collect-tasks\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Object Type\",\n-                                        \"propertyName\": \"asana-object-type\"\n-                                    }\n-                                ],\n-                                \"description\": \"Fetch only objects in this section. Case sensitive.\",\n-                                \"displayName\": \"Section Name\",\n+                            \"Table Name\": {\n+                                \"description\": \"The name of the Kudu Table to put data into\",\n+                                \"displayName\": \"Table Name\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Table Name\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"kerberos-credentials-service\": {\n+                                \"description\": \"Specifies the Kerberos Credentials to use for authentication\",\n+                                \"displayName\": \"Kerberos Credentials Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"asana-section-name\",\n+                                \"name\": \"kerberos-credentials-service\",\n                                 \"required\": false,\n-                                \"sensitive\": false\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.kerberos.KerberosCredentialsService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n                             },\n-                            \"asana-tag-name\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"asana-collect-task-attachments\",\n-                                            \"asana-collect-stories\",\n-                                            \"asana-collect-tasks\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Object Type\",\n-                                        \"propertyName\": \"asana-object-type\"\n-                                    }\n-                                ],\n-                                \"description\": \"Fetch only objects having this tag. Case sensitive.\",\n-                                \"displayName\": \"Tag\",\n+                            \"kerberos-password\": {\n+                                \"description\": \"The password to use when specifying the principal and password directly in the processor for authenticating via Kerberos.\",\n+                                \"displayName\": \"Kerberos Password\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"asana-tag-name\",\n+                                \"name\": \"kerberos-password\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n+                            },\n+                            \"kerberos-principal\": {\n+                                \"description\": \"The principal to use when specifying the principal and password directly in the processor for authenticating via Kerberos.\",\n+                                \"displayName\": \"Kerberos Principal\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"kerberos-principal\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"asana-team-name\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"asana-collect-team-members\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Object Type\",\n-                                        \"propertyName\": \"asana-object-type\"\n-                                    }\n-                                ],\n-                                \"description\": \"Team name. Case sensitive.\",\n-                                \"displayName\": \"Team\",\n+                            \"kerberos-user-service\": {\n+                                \"description\": \"Specifies the Kerberos User Controller Service that should be used for authenticating with Kerberos\",\n+                                \"displayName\": \"Kerberos User Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"asana-team-name\",\n+                                \"name\": \"kerberos-user-service\",\n+                                \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.kerberos.KerberosUserService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"kudu-keep-alive-period-timeout-ms\": {\n+                                \"defaultValue\": \"15000ms\",\n+                                \"description\": \"Default timeout used for user operations\",\n+                                \"displayName\": \"Kudu Keep Alive Period Timeout\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"kudu-keep-alive-period-timeout-ms\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"distributed-cache-service\": {\n-                                \"description\": \"Cache service to store fetched item fingerprints. These, from the last successful query are stored, in order to enable incremental loading and change detection.\",\n-                                \"displayName\": \"Distributed Cache Service\",\n+                            \"kudu-operations-timeout-ms\": {\n+                                \"defaultValue\": \"30000ms\",\n+                                \"description\": \"Default timeout used for user operations (using sessions and scanners)\",\n+                                \"displayName\": \"Kudu Operation Timeout\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"kudu-operations-timeout-ms\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"kudu-sasl-protocol-name\": {\n+                                \"defaultValue\": \"kudu\",\n+                                \"description\": \"The SASL protocol name to use for authenticating via Kerberos. Must match the service principal name.\",\n+                                \"displayName\": \"Kudu SASL Protocol Name\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"kudu-sasl-protocol-name\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"record-reader\": {\n+                                \"description\": \"The service for reading records from incoming flow files.\",\n+                                \"displayName\": \"Record Reader\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"distributed-cache-service\",\n+                                \"name\": \"record-reader\",\n                                 \"required\": true,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n                                     \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.distributed.cache.client.DistributedMapCacheClient\",\n+                                    \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n                                     \"version\": \"1.27.0\"\n                                 }\n+                            },\n+                            \"worker-count\": {\n+                                \"defaultValue\": \"36\",\n+                                \"description\": \"The maximum number of worker threads handling Kudu client read and write operations. Defaults to the number of available processors.\",\n+                                \"displayName\": \"Kudu Client Worker Count\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"worker-count\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n                             }\n                         },\n                         \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"Notification about deleted objects are routed to this relationship. Flow files will not have any payload. IDs of the resources no longer exist are carried by the asana.gid attribute of the generated FlowFiles.\",\n-                                \"name\": \"removed\"\n-                            },\n-                            {\n-                                \"description\": \"Newly collected objects are routed to this relationship.\",\n-                                \"name\": \"new\"\n+                                \"description\": \"A FlowFile is routed to this relationship after it has been successfully stored in Kudu\",\n+                                \"name\": \"success\"\n                             },\n                             {\n-                                \"description\": \"Objects that have already been collected earlier, but were updated since, are routed to this relationship.\",\n-                                \"name\": \"updated\"\n+                                \"description\": \"A FlowFile is routed to this relationship if it cannot be sent to Kudu\",\n+                                \"name\": \"failure\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n+                            \"CRON_DRIVEN\",\n+                            \"EVENT_DRIVEN\"\n                         ],\n-                        \"supportsBatching\": false,\n+                        \"supportsBatching\": true,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": false,\n+                        \"supportsEventDriven\": true,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"systemResourceConsiderations\": [\n                             {\n                                 \"description\": \"An instance of this component can cause high usage of this system resource.  Multiple instances or high concurrency settings may result a degradation of performance.\",\n                                 \"resource\": \"MEMORY\"\n                             }\n                         ],\n                         \"tags\": [\n-                            \"asana\",\n-                            \"ingest\",\n-                            \"source\"\n+                            \"HDFS\",\n+                            \"NoSQL\",\n+                            \"database\",\n+                            \"kudu\",\n+                            \"put\",\n+                            \"record\"\n                         ],\n-                        \"triggerSerially\": true,\n+                        \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.asana.GetAsanaObject\",\n-                        \"typeDescription\": \"This processor collects data from Asana\",\n+                        \"type\": \"org.apache.nifi.processors.kudu.PutKudu\",\n+                        \"typeDescription\": \"Reads records from an incoming FlowFile using the provided Record Reader, and writes those records to the specified Kudu's table. The schema for the Kudu table is inferred from the schema of the Record Reader. If any error occurs while reading records from the input, or writing records to Kudu, the FlowFile will be routed to failure\",\n                         \"version\": \"1.27.0\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"Global ID of the object in Asana.\",\n-                                \"name\": \"asana.gid\"\n+                                \"description\": \"Number of records written to Kudu\",\n+                                \"name\": \"record.count\"\n                             }\n                         ]\n                     }\n                 ],\n                 \"reportingTasks\": []\n             },\n             \"group\": \"org.apache.nifi\",\n             \"version\": \"1.27.0\"\n         },\n         {\n-            \"artifact\": \"nifi-html-nar\",\n+            \"artifact\": \"nifi-cassandra-nar\",\n             \"componentManifest\": {\n                 \"controllerServices\": [],\n                 \"processors\": [\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-html-nar\",\n+                        \"artifact\": \"nifi-cassandra-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n+                            \"EVENT_DRIVEN\": 0,\n                             \"TIMER_DRIVEN\": 1\n                         },\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n                         \"deprecated\": true,\n-                        \"deprecationReason\": \"Unmaintained and planned for removal in version 2.0\",\n+                        \"deprecationReason\": \"DataStax 3 driver for Cassandra is no longer the current version and requires new components.\",\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Append Element Value\": {\n-                                \"description\": \"Appends the specified value to the resulting Element\",\n-                                \"displayName\": \"Append Element Value\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Append Element Value\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Attribute Name\": {\n-                                \"description\": \"When getting the value of a HTML element attribute this value is used as the key to determine which attribute on the selected element should be retrieved. This value is used when the \\\"Output Type\\\" is set to \\\"Attribute\\\". If this value is prefixed with 'abs:', then the extracted attribute value will be converted into an absolute URL form using the specified base URL.\",\n-                                \"displayName\": \"Attribute Name\",\n+                            \"Cassandra Contact Points\": {\n+                                \"description\": \"Contact points are addresses of Cassandra nodes. The list of contact points should be comma-separated and in hostname:port format. Example node1:port,node2:port,.... The default client port for Cassandra is 9042, but the port(s) must be explicitly specified.\",\n+                                \"displayName\": \"Cassandra Contact Points\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Attribute Name\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Cassandra Contact Points\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"CSS Selector\": {\n-                                \"description\": \"CSS selector syntax string used to extract the desired HTML element(s).\",\n-                                \"displayName\": \"CSS Selector\",\n+                            \"Character Set\": {\n+                                \"defaultValue\": \"UTF-8\",\n+                                \"description\": \"Specifies the character set of the record data.\",\n+                                \"displayName\": \"Character Set\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"CSS Selector\",\n+                                \"name\": \"Character Set\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Destination\": {\n+                            \"Client Auth\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"flowfile-attribute\",\n-                                        \"value\": \"flowfile-attribute\"\n+                                        \"displayName\": \"WANT\",\n+                                        \"value\": \"WANT\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"flowfile-content\",\n-                                        \"value\": \"flowfile-content\"\n+                                        \"displayName\": \"REQUIRED\",\n+                                        \"value\": \"REQUIRED\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"NONE\",\n+                                        \"value\": \"NONE\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"flowfile-attribute\",\n-                                \"description\": \"Control if element extracted is written as a flowfile attribute or as flowfile content.\",\n-                                \"displayName\": \"Destination\",\n+                                \"defaultValue\": \"REQUIRED\",\n+                                \"description\": \"Client authentication policy when connecting to secure (TLS/SSL) cluster. Possible values are REQUIRED, WANT, NONE. This property is only used when an SSL Context has been defined and enabled.\",\n+                                \"displayName\": \"Client Auth\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Destination\",\n-                                \"required\": true,\n+                                \"name\": \"Client Auth\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"HTML Character Encoding\": {\n-                                \"defaultValue\": \"UTF-8\",\n-                                \"description\": \"Character encoding of the input HTML\",\n-                                \"displayName\": \"HTML Character Encoding\",\n+                            \"Compression Type\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"NONE\",\n+                                        \"value\": \"NONE\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"SNAPPY\",\n+                                        \"value\": \"SNAPPY\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"LZ4\",\n+                                        \"value\": \"LZ4\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"NONE\",\n+                                \"description\": \"Enable compression at transport-level requests and responses\",\n+                                \"displayName\": \"Compression Type\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"HTML Character Encoding\",\n-                                \"required\": true,\n+                                \"name\": \"Compression Type\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Output Type\": {\n+                            \"Consistency Level\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"HTML\",\n-                                        \"value\": \"HTML\"\n+                                        \"displayName\": \"ANY\",\n+                                        \"value\": \"ANY\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"Text\",\n-                                        \"value\": \"Text\"\n+                                        \"displayName\": \"ONE\",\n+                                        \"value\": \"ONE\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"Attribute\",\n-                                        \"value\": \"Attribute\"\n+                                        \"displayName\": \"TWO\",\n+                                        \"value\": \"TWO\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"Data\",\n-                                        \"value\": \"Data\"\n+                                        \"displayName\": \"THREE\",\n+                                        \"value\": \"THREE\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"QUORUM\",\n+                                        \"value\": \"QUORUM\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"ALL\",\n+                                        \"value\": \"ALL\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"LOCAL_QUORUM\",\n+                                        \"value\": \"LOCAL_QUORUM\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"EACH_QUORUM\",\n+                                        \"value\": \"EACH_QUORUM\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"SERIAL\",\n+                                        \"value\": \"SERIAL\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"LOCAL_SERIAL\",\n+                                        \"value\": \"LOCAL_SERIAL\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"LOCAL_ONE\",\n+                                        \"value\": \"LOCAL_ONE\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"HTML\",\n-                                \"description\": \"Controls the type of DOM value that is retrieved from the HTML element.\",\n-                                \"displayName\": \"Output Type\",\n+                                \"defaultValue\": \"ONE\",\n+                                \"description\": \"The strategy for how many replicas must respond before results are returned.\",\n+                                \"displayName\": \"Consistency Level\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Output Type\",\n-                                \"required\": true,\n+                                \"name\": \"Consistency Level\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Prepend Element Value\": {\n-                                \"description\": \"Prepends the specified value to the resulting Element\",\n-                                \"displayName\": \"Prepend Element Value\",\n+                            \"Keyspace\": {\n+                                \"description\": \"The Cassandra Keyspace to connect to. If no keyspace is specified, the query will need to include the keyspace name before any table reference, in case of 'query' native processors or if the processor exposes the 'Table' property, the keyspace name has to be provided with the table name in the form of <KEYSPACE>.<TABLE>\",\n+                                \"displayName\": \"Keyspace\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Prepend Element Value\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Keyspace\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"URL\": {\n-                                \"description\": \"Base URL for the HTML page being parsed. This URL will be used to resolve an absolute URL when an attribute value is extracted from a HTML element.\",\n-                                \"displayName\": \"URL\",\n+                            \"Max Wait Time\": {\n+                                \"defaultValue\": \"0 seconds\",\n+                                \"description\": \"The maximum amount of time allowed for a running CQL select query. Must be of format <duration> <TimeUnit> where <duration> is a non-negative integer and TimeUnit is a supported Time Unit, such as: nanos, millis, secs, mins, hrs, days. A value of zero means there is no limit. \",\n+                                \"displayName\": \"Max Wait Time\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"URL\",\n+                                \"name\": \"Max Wait Time\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Password\": {\n+                                \"description\": \"Password to access the Cassandra cluster\",\n+                                \"displayName\": \"Password\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Password\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n+                            },\n+                            \"SSL Context Service\": {\n+                                \"description\": \"The SSL Context Service used to provide client certificate information for TLS/SSL connections.\",\n+                                \"displayName\": \"SSL Context Service\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"SSL Context Service\",\n+                                \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"Username\": {\n+                                \"description\": \"Username to access the Cassandra cluster\",\n+                                \"displayName\": \"Username\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Username\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"cassandra-connection-provider\": {\n+                                \"description\": \"Specifies the Cassandra connection providing controller service to be used to connect to Cassandra cluster.\",\n+                                \"displayName\": \"Cassandra Connection Provider\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"cassandra-connection-provider\",\n+                                \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-cassandra-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.cassandra.CassandraSessionProviderService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"putcql-stmt-cache-size\": {\n+                                \"defaultValue\": \"0\",\n+                                \"description\": \"The maximum number of CQL Prepared Statements to cache. This can improve performance if many incoming flow files have the same CQL statement with different values for the parameters. If this property is set to zero, the cache is effectively disabled.\",\n+                                \"displayName\": \"Statement Cache Size\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"putcql-stmt-cache-size\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             }\n                         },\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.ModifyHTMLElement\",\n-                            \"org.apache.nifi.PutHTMLElement\"\n+                        \"readsAttributes\": [\n+                            {\n+                                \"description\": \"Incoming FlowFiles are expected to be parameterized CQL statements. The type of each parameter is specified as a lowercase string corresponding to the Cassandra data type (text, int, boolean, e.g.). In the case of collections, the primitive type(s) of the elements in the collection should be comma-delimited, follow the collection type, and be enclosed in angle brackets (< and >), for example set<text> or map<timestamp, int>.\",\n+                                \"name\": \"cql.args.N.type\"\n+                            },\n+                            {\n+                                \"description\": \"Incoming FlowFiles are expected to be parameterized CQL statements. The value of the parameters are specified as cql.args.1.value, cql.args.2.value, cql.args.3.value, and so on. The  type of the cql.args.1.value parameter is specified by the cql.args.1.type attribute.\",\n+                                \"name\": \"cql.args.N.value\"\n+                            }\n                         ],\n                         \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"Element could not be found in the HTML document. The original HTML input will remain in the FlowFile content unchanged. Relationship 'original' will not be invoked in this scenario.\",\n-                                \"name\": \"element not found\"\n+                                \"description\": \"A FlowFile is transferred to this relationship if the operation cannot be completed but attempting it again may succeed.\",\n+                                \"name\": \"retry\"\n                             },\n                             {\n-                                \"description\": \"Successfully parsed HTML element\",\n+                                \"description\": \"A FlowFile is transferred to this relationship if the operation completed successfully.\",\n                                 \"name\": \"success\"\n                             },\n                             {\n-                                \"description\": \"The original HTML input\",\n-                                \"name\": \"original\"\n-                            },\n-                            {\n-                                \"description\": \"The input HTML syntax is invalid\",\n-                                \"name\": \"invalid html\"\n+                                \"description\": \"A FlowFile is transferred to this relationship if the operation failed.\",\n+                                \"name\": \"failure\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n+                            \"CRON_DRIVEN\",\n+                            \"EVENT_DRIVEN\"\n                         ],\n                         \"supportsBatching\": true,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": false,\n+                        \"supportsEventDriven\": true,\n                         \"supportsSensitiveDynamicProperties\": false,\n+                        \"systemResourceConsiderations\": [\n+                            {\n+                                \"description\": \"An instance of this component can cause high usage of this system resource.  Multiple instances or high concurrency settings may result a degradation of performance.\",\n+                                \"resource\": \"MEMORY\"\n+                            }\n+                        ],\n                         \"tags\": [\n-                            \"css\",\n-                            \"dom\",\n-                            \"element\",\n-                            \"get\",\n-                            \"html\"\n+                            \"cassandra\",\n+                            \"cql\",\n+                            \"insert\",\n+                            \"put\",\n+                            \"set\",\n+                            \"update\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.GetHTMLElement\",\n-                        \"typeDescription\": \"Extracts HTML element values from the incoming flowfile's content using a CSS selector. The incoming HTML is first converted into a HTML Document Object Model so that HTML elements may be selected in the similar manner that CSS selectors are used to apply styles to HTML. The resulting HTML DOM is then \\\"queried\\\" using the user defined CSS selector string. The result of \\\"querying\\\" the HTML DOM may produce 0-N results. If no results are found the flowfile will be transferred to the \\\"element not found\\\" relationship to indicate so to the end user. If N results are found a new flowfile will be created and emitted for each result. The query result will either be placed in the content of the new flowfile or as an attribute of the new flowfile. By default the result is written to an attribute. This can be controlled by the \\\"Destination\\\" property. Resulting query values may also have data prepended or appended to them by setting the value of property \\\"Prepend Element Value\\\" or \\\"Append Element Value\\\". Prepended and appended values are treated as string values and concatenated to the result retrieved from the HTML DOM query operation. A more thorough reference for the CSS selector syntax can be found at \\\"http://jsoup.org/apidocs/org/jsoup/select/Selector.html\\\"\",\n-                        \"version\": \"1.27.0\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"Flowfile attribute where the element result parsed from the HTML using the CSS selector syntax are placed if the destination is a flowfile attribute.\",\n-                                \"name\": \"HTMLElement\"\n-                            }\n-                        ]\n+                        \"type\": \"org.apache.nifi.processors.cassandra.PutCassandraQL\",\n+                        \"typeDescription\": \"Execute provided Cassandra Query Language (CQL) statement on a Cassandra 1.x, 2.x, or 3.0.x cluster. The content of an incoming FlowFile is expected to be the CQL command to execute. The CQL command may use the ? to escape parameters. In this case, the parameters to use must exist as FlowFile attributes with the naming convention cql.args.N.type and cql.args.N.value, where N is a positive integer. The cql.args.N.type is expected to be a lowercase string indicating the Cassandra type.\",\n+                        \"version\": \"1.27.0\"\n                     },\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-html-nar\",\n+                        \"artifact\": \"nifi-cassandra-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -11400,4216 +9911,5466 @@\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n                         \"deprecated\": true,\n-                        \"deprecationReason\": \"Unmaintained and planned for removal in version 2.0\",\n+                        \"deprecationReason\": \"DataStax 3 driver for Cassandra is no longer the current version and requires new components.\",\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Attribute Name\": {\n-                                \"description\": \"When modifying the value of an element attribute this value is used as the key to determine which attribute on the selected element will be modified with the new value.\",\n-                                \"displayName\": \"Attribute Name\",\n+                            \"Cassandra Contact Points\": {\n+                                \"description\": \"Contact points are addresses of Cassandra nodes. The list of contact points should be comma-separated and in hostname:port format. Example node1:port,node2:port,.... The default client port for Cassandra is 9042, but the port(s) must be explicitly specified.\",\n+                                \"displayName\": \"Cassandra Contact Points\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Attribute Name\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Cassandra Contact Points\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"CSS Selector\": {\n-                                \"description\": \"CSS selector syntax string used to extract the desired HTML element(s).\",\n-                                \"displayName\": \"CSS Selector\",\n+                            \"Client Auth\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"WANT\",\n+                                        \"value\": \"WANT\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"REQUIRED\",\n+                                        \"value\": \"REQUIRED\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"NONE\",\n+                                        \"value\": \"NONE\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"REQUIRED\",\n+                                \"description\": \"Client authentication policy when connecting to secure (TLS/SSL) cluster. Possible values are REQUIRED, WANT, NONE. This property is only used when an SSL Context has been defined and enabled.\",\n+                                \"displayName\": \"Client Auth\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"CSS Selector\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Client Auth\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Consistency Level\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"SERIAL\",\n+                                        \"value\": \"SERIAL\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"LOCAL_SERIAL\",\n+                                        \"value\": \"LOCAL_SERIAL\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"SERIAL\",\n+                                \"description\": \"The strategy for how many replicas must respond before results are returned.\",\n+                                \"displayName\": \"Consistency Level\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Consistency Level\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Keyspace\": {\n+                                \"description\": \"The Cassandra Keyspace to connect to. If no keyspace is specified, the query will need to include the keyspace name before any table reference, in case of 'query' native processors or if the processor exposes the 'Table' property, the keyspace name has to be provided with the table name in the form of <KEYSPACE>.<TABLE>\",\n+                                \"displayName\": \"Keyspace\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Keyspace\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Password\": {\n+                                \"description\": \"Password to access the Cassandra cluster\",\n+                                \"displayName\": \"Password\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Password\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n+                            },\n+                            \"SSL Context Service\": {\n+                                \"description\": \"The SSL Context Service used to provide client certificate information for TLS/SSL connections.\",\n+                                \"displayName\": \"SSL Context Service\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"SSL Context Service\",\n+                                \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"Username\": {\n+                                \"description\": \"Username to access the Cassandra cluster\",\n+                                \"displayName\": \"Username\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Username\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"cassandra-connection-provider\": {\n+                                \"description\": \"Specifies the Cassandra connection providing controller service to be used to connect to Cassandra cluster.\",\n+                                \"displayName\": \"Cassandra Connection Provider\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"cassandra-connection-provider\",\n+                                \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-cassandra-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.cassandra.CassandraSessionProviderService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"put-cassandra-record-batch-size\": {\n+                                \"defaultValue\": \"100\",\n+                                \"description\": \"Specifies the number of 'Insert statements' to be grouped together to execute as a batch (BatchStatement)\",\n+                                \"displayName\": \"Batch size\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"put-cassandra-record-batch-size\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"HTML Character Encoding\": {\n-                                \"defaultValue\": \"UTF-8\",\n-                                \"description\": \"Character encoding of the input HTML\",\n-                                \"displayName\": \"HTML Character Encoding\",\n+                            \"put-cassandra-record-batch-statement-type\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"Use a LOGGED batch statement\",\n+                                        \"displayName\": \"LOGGED\",\n+                                        \"value\": \"LOGGED\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Use an UNLOGGED batch statement\",\n+                                        \"displayName\": \"UNLOGGED\",\n+                                        \"value\": \"UNLOGGED\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Use a COUNTER batch statement\",\n+                                        \"displayName\": \"COUNTER\",\n+                                        \"value\": \"COUNTER\"\n+                                    },\n+                                    {\n+                                        \"description\": \"The value of the cql.batch.statement.type Attribute will be used to determine which type of batch statement (LOGGED, UNLOGGED or COUNTER) will be used to generate and execute the Update statement.\",\n+                                        \"displayName\": \"Use cql.batch.statement.type Attribute\",\n+                                        \"value\": \"USE_ATTR\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"LOGGED\",\n+                                \"description\": \"Specifies the type of 'Batch Statement' to be used.\",\n+                                \"displayName\": \"Batch Statement Type\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"HTML Character Encoding\",\n+                                \"name\": \"put-cassandra-record-batch-statement-type\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"put-cassandra-record-reader\": {\n+                                \"description\": \"Specifies the type of Record Reader controller service to use for parsing the incoming data and determining the schema\",\n+                                \"displayName\": \"Record Reader\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"put-cassandra-record-reader\",\n+                                \"required\": true,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"put-cassandra-record-statement-type\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"Use an UPDATE statement.\",\n+                                        \"displayName\": \"UPDATE\",\n+                                        \"value\": \"UPDATE\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Use an INSERT statement.\",\n+                                        \"displayName\": \"INSERT\",\n+                                        \"value\": \"INSERT\"\n+                                    },\n+                                    {\n+                                        \"description\": \"The value of the cql.statement.type Attribute will be used to determine which type of statement (UPDATE, INSERT) will be generated and executed\",\n+                                        \"displayName\": \"Use cql.statement.type Attribute\",\n+                                        \"value\": \"USE_ATTR\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"INSERT\",\n+                                \"description\": \"Specifies the type of CQL Statement to generate.\",\n+                                \"displayName\": \"Statement Type\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"put-cassandra-record-statement-type\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Modified Value\": {\n-                                \"description\": \"Value to update the found HTML elements with\",\n-                                \"displayName\": \"Modified Value\",\n+                            \"put-cassandra-record-table\": {\n+                                \"description\": \"The name of the Cassandra table to which the records have to be written.\",\n+                                \"displayName\": \"Table name\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Modified Value\",\n+                                \"name\": \"put-cassandra-record-table\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Output Type\": {\n+                            \"put-cassandra-record-update-keys\": {\n+                                \"description\": \"A comma-separated list of column names that uniquely identifies a row in the database for UPDATE statements. If the Statement Type is UPDATE and this property is not set, the conversion to CQL will fail. This property is ignored if the Statement Type is not UPDATE.\",\n+                                \"displayName\": \"Update Keys\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"put-cassandra-record-update-keys\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"put-cassandra-record-update-method\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"HTML\",\n-                                        \"value\": \"HTML\"\n+                                        \"description\": \"Use an increment operation (+=) for the Update statement.\",\n+                                        \"displayName\": \"Increment\",\n+                                        \"value\": \"INCREMENT\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Text\",\n-                                        \"value\": \"Text\"\n+                                        \"description\": \"Use a decrement operation (-=) for the Update statement.\",\n+                                        \"displayName\": \"Decrement\",\n+                                        \"value\": \"DECREMENT\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Attribute\",\n-                                        \"value\": \"Attribute\"\n+                                        \"description\": \"Use a set operation (=) for the Update statement.\",\n+                                        \"displayName\": \"Set\",\n+                                        \"value\": \"SET\"\n+                                    },\n+                                    {\n+                                        \"description\": \"The value of the cql.update.method Attribute will be used to determine which operation (Set, Increment, Decrement) will be used to generate and execute the Update statement.\",\n+                                        \"displayName\": \"Use cql.update.method Attribute\",\n+                                        \"value\": \"USE_ATTR\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"HTML\",\n-                                \"description\": \"Controls whether the HTML element is output as HTML,Text or Data\",\n-                                \"displayName\": \"Output Type\",\n+                                \"defaultValue\": \"SET\",\n+                                \"description\": \"Specifies the method to use to SET the values. This property is used if the Statement Type is UPDATE and ignored otherwise.\",\n+                                \"displayName\": \"Update Method\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Output Type\",\n-                                \"required\": true,\n+                                \"name\": \"put-cassandra-record-update-method\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             }\n                         },\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.GetHTMLElement\",\n-                            \"org.apache.nifi.PutHTMLElement\"\n-                        ],\n-                        \"sideEffectFree\": false,\n-                        \"supportedRelationships\": [\n+                        \"readsAttributes\": [\n                             {\n-                                \"description\": \"Element could not be found in the HTML document. The original HTML input will remain in the FlowFile content unchanged. Relationship 'original' will not be invoked in this scenario.\",\n-                                \"name\": \"element not found\"\n+                                \"description\": \"If 'Use cql.statement.type Attribute' is selected for the Statement Type property, the value of the cql.statement.type Attribute will be used to determine which type of statement (UPDATE, INSERT) will be generated and executed\",\n+                                \"name\": \"cql.statement.type\"\n                             },\n                             {\n-                                \"description\": \"Successfully parsed HTML element\",\n-                                \"name\": \"success\"\n+                                \"description\": \"If 'Use cql.update.method Attribute' is selected for the Update Method property, the value of the cql.update.method Attribute will be used to determine which operation (Set, Increment, Decrement) will be used to generate and execute the Update statement. Ignored if the Statement Type property is not set to UPDATE\",\n+                                \"name\": \"cql.update.method\"\n                             },\n                             {\n-                                \"description\": \"The original HTML input\",\n-                                \"name\": \"original\"\n+                                \"description\": \"If 'Use cql.batch.statement.type Attribute' is selected for the Batch Statement Type property, the value of the cql.batch.statement.type Attribute will be used to determine which type of batch statement (LOGGED, UNLOGGED, COUNTER) will be generated and executed\",\n+                                \"name\": \"cql.batch.statement.type\"\n+                            }\n+                        ],\n+                        \"sideEffectFree\": false,\n+                        \"supportedRelationships\": [\n+                            {\n+                                \"description\": \"A FlowFile is transferred to this relationship if the operation completed successfully.\",\n+                                \"name\": \"success\"\n                             },\n                             {\n-                                \"description\": \"The input HTML syntax is invalid\",\n-                                \"name\": \"invalid html\"\n+                                \"description\": \"A FlowFile is transferred to this relationship if the operation failed.\",\n+                                \"name\": \"failure\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n-                        \"supportsBatching\": true,\n+                        \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"css\",\n-                            \"dom\",\n-                            \"element\",\n-                            \"html\",\n-                            \"modify\"\n+                            \"cassandra\",\n+                            \"cql\",\n+                            \"insert\",\n+                            \"put\",\n+                            \"record\",\n+                            \"set\",\n+                            \"update\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.ModifyHTMLElement\",\n-                        \"typeDescription\": \"Modifies the value of an existing HTML element. The desired element to be modified is located by using CSS selector syntax. The incoming HTML is first converted into a HTML Document Object Model so that HTML elements may be selected in the similar manner that CSS selectors are used to apply styles to HTML. The resulting HTML DOM is then \\\"queried\\\" using the user defined CSS selector string to find the element the user desires to modify. If the HTML element is found the element's value is updated in the DOM using the value specified \\\"Modified Value\\\" property. All DOM elements that match the CSS selector will be updated. Once all of the DOM elements have been updated the DOM is rendered to HTML and the result replaces the flowfile content with the updated HTML. A more thorough reference for the CSS selector syntax can be found at \\\"http://jsoup.org/apidocs/org/jsoup/select/Selector.html\\\"\",\n-                        \"version\": \"1.27.0\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"Total number of HTML element modifications made\",\n-                                \"name\": \"NumElementsModified\"\n-                            }\n-                        ]\n+                        \"type\": \"org.apache.nifi.processors.cassandra.PutCassandraRecord\",\n+                        \"typeDescription\": \"This is a record aware processor that reads the content of the incoming FlowFile as individual records using the configured 'Record Reader' and writes them to Apache Cassandra using native protocol version 3 or higher.\",\n+                        \"version\": \"1.27.0\"\n                     },\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-html-nar\",\n+                        \"artifact\": \"nifi-cassandra-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n+                            \"EVENT_DRIVEN\": 0,\n                             \"TIMER_DRIVEN\": 1\n                         },\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n                         \"deprecated\": true,\n-                        \"deprecationReason\": \"Unmaintained and planned for removal in version 2.0\",\n+                        \"deprecationReason\": \"DataStax 3 driver for Cassandra is no longer the current version and requires new components.\",\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_REQUIRED\",\n+                        \"inputRequirement\": \"INPUT_ALLOWED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"CSS Selector\": {\n-                                \"description\": \"CSS selector syntax string used to extract the desired HTML element(s).\",\n-                                \"displayName\": \"CSS Selector\",\n+                            \"CQL select query\": {\n+                                \"description\": \"CQL select query\",\n+                                \"displayName\": \"CQL select query\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"CSS Selector\",\n+                                \"name\": \"CQL select query\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Element Insert Location Type\": {\n+                            \"Cassandra Contact Points\": {\n+                                \"description\": \"Contact points are addresses of Cassandra nodes. The list of contact points should be comma-separated and in hostname:port format. Example node1:port,node2:port,.... The default client port for Cassandra is 9042, but the port(s) must be explicitly specified.\",\n+                                \"displayName\": \"Cassandra Contact Points\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Cassandra Contact Points\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Character Set\": {\n+                                \"defaultValue\": \"UTF-8\",\n+                                \"description\": \"Specifies the character set of the record data.\",\n+                                \"displayName\": \"Character Set\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Character Set\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Client Auth\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"append-html\",\n-                                        \"value\": \"append-html\"\n+                                        \"displayName\": \"WANT\",\n+                                        \"value\": \"WANT\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"prepend-html\",\n-                                        \"value\": \"prepend-html\"\n+                                        \"displayName\": \"REQUIRED\",\n+                                        \"value\": \"REQUIRED\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"NONE\",\n+                                        \"value\": \"NONE\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"append-html\",\n-                                \"description\": \"Controls whether the new element is prepended or appended to the children of the Element located by the CSS selector. EX: prepended value '<b>Hi</b>' inside of Element (using CSS Selector 'p') '<p>There</p>' would result in '<p><b>Hi</b>There</p>'. Appending the value would result in '<p>There<b>Hi</b></p>'\",\n-                                \"displayName\": \"Element Insert Location Type\",\n+                                \"defaultValue\": \"REQUIRED\",\n+                                \"description\": \"Client authentication policy when connecting to secure (TLS/SSL) cluster. Possible values are REQUIRED, WANT, NONE. This property is only used when an SSL Context has been defined and enabled.\",\n+                                \"displayName\": \"Client Auth\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Element Insert Location Type\",\n-                                \"required\": true,\n+                                \"name\": \"Client Auth\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"HTML Character Encoding\": {\n-                                \"defaultValue\": \"UTF-8\",\n-                                \"description\": \"Character encoding of the input HTML\",\n-                                \"displayName\": \"HTML Character Encoding\",\n+                            \"Compression Type\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"NONE\",\n+                                        \"value\": \"NONE\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"SNAPPY\",\n+                                        \"value\": \"SNAPPY\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"LZ4\",\n+                                        \"value\": \"LZ4\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"NONE\",\n+                                \"description\": \"Enable compression at transport-level requests and responses\",\n+                                \"displayName\": \"Compression Type\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"HTML Character Encoding\",\n+                                \"name\": \"Compression Type\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Consistency Level\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"ANY\",\n+                                        \"value\": \"ANY\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"ONE\",\n+                                        \"value\": \"ONE\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"TWO\",\n+                                        \"value\": \"TWO\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"THREE\",\n+                                        \"value\": \"THREE\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"QUORUM\",\n+                                        \"value\": \"QUORUM\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"ALL\",\n+                                        \"value\": \"ALL\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"LOCAL_QUORUM\",\n+                                        \"value\": \"LOCAL_QUORUM\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"EACH_QUORUM\",\n+                                        \"value\": \"EACH_QUORUM\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"SERIAL\",\n+                                        \"value\": \"SERIAL\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"LOCAL_SERIAL\",\n+                                        \"value\": \"LOCAL_SERIAL\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"LOCAL_ONE\",\n+                                        \"value\": \"LOCAL_ONE\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"ONE\",\n+                                \"description\": \"The strategy for how many replicas must respond before results are returned.\",\n+                                \"displayName\": \"Consistency Level\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Consistency Level\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Fetch size\": {\n+                                \"defaultValue\": \"0\",\n+                                \"description\": \"The number of result rows to be fetched from the result set at a time. Zero is the default and means there is no limit.\",\n+                                \"displayName\": \"Fetch size\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Fetch size\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Put Value\": {\n-                                \"description\": \"Value used when creating the new Element. Value should be a valid HTML element. The text should be supplied unencoded: characters like '<', '>', etc will be properly HTML encoded in the resulting output.\",\n-                                \"displayName\": \"Put Value\",\n+                            \"Keyspace\": {\n+                                \"description\": \"The Cassandra Keyspace to connect to. If no keyspace is specified, the query will need to include the keyspace name before any table reference, in case of 'query' native processors or if the processor exposes the 'Table' property, the keyspace name has to be provided with the table name in the form of <KEYSPACE>.<TABLE>\",\n+                                \"displayName\": \"Keyspace\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Keyspace\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Max Rows Per Flow File\": {\n+                                \"defaultValue\": \"0\",\n+                                \"description\": \"The maximum number of result rows that will be included in a single FlowFile. This will allow you to break up very large result sets into multiple FlowFiles. If the value specified is zero, then all rows are returned in a single FlowFile.\",\n+                                \"displayName\": \"Max Rows Per Flow File\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Max Rows Per Flow File\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Max Wait Time\": {\n+                                \"defaultValue\": \"0 seconds\",\n+                                \"description\": \"The maximum amount of time allowed for a running CQL select query. Must be of format <duration> <TimeUnit> where <duration> is a non-negative integer and TimeUnit is a supported Time Unit, such as: nanos, millis, secs, mins, hrs, days. A value of zero means there is no limit. \",\n+                                \"displayName\": \"Max Wait Time\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Put Value\",\n+                                \"name\": \"Max Wait Time\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Output Format\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Avro\",\n+                                        \"value\": \"Avro\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"JSON\",\n+                                        \"value\": \"JSON\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"Avro\",\n+                                \"description\": \"The format to which the result rows will be converted. If JSON is selected, the output will contain an object with field 'results' containing an array of result rows. Each row in the array is a map of the named column to its value. For example: { \\\"results\\\": [{\\\"userid\\\":1, \\\"name\\\":\\\"Joe Smith\\\"}]}\",\n+                                \"displayName\": \"Output Format\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Output Format\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Password\": {\n+                                \"description\": \"Password to access the Cassandra cluster\",\n+                                \"displayName\": \"Password\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Password\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n+                            },\n+                            \"SSL Context Service\": {\n+                                \"description\": \"The SSL Context Service used to provide client certificate information for TLS/SSL connections.\",\n+                                \"displayName\": \"SSL Context Service\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"SSL Context Service\",\n+                                \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"Username\": {\n+                                \"description\": \"Username to access the Cassandra cluster\",\n+                                \"displayName\": \"Username\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Username\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"cassandra-connection-provider\": {\n+                                \"description\": \"Specifies the Cassandra connection providing controller service to be used to connect to Cassandra cluster.\",\n+                                \"displayName\": \"Cassandra Connection Provider\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"cassandra-connection-provider\",\n+                                \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-cassandra-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.cassandra.CassandraSessionProviderService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"qdbt-output-batch-size\": {\n+                                \"defaultValue\": \"0\",\n+                                \"description\": \"The number of output FlowFiles to queue before committing the process session. When set to zero, the session will be committed when all result set rows have been processed and the output FlowFiles are ready for transfer to the downstream relationship. For large result sets, this can cause a large burst of FlowFiles to be transferred at the end of processor execution. If this property is set, then when the specified number of FlowFiles are ready for transfer, then the session will be committed, thus releasing the FlowFiles to the downstream relationship. NOTE: The maxvalue.* and fragment.count attributes will not be set on FlowFiles when this property is set.\",\n+                                \"displayName\": \"Output Batch Size\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"qdbt-output-batch-size\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"timestamp-format-pattern\": {\n+                                \"defaultValue\": \"yyyy-MM-dd HH:mm:ssZ\",\n+                                \"description\": \"Pattern to use when converting timestamp fields to JSON. Note: the formatted timestamp will be in UTC timezone.\",\n+                                \"displayName\": \"Timestamp Format Pattern for JSON output\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"timestamp-format-pattern\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             }\n                         },\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.GetHTMLElement\",\n-                            \"org.apache.nifi.ModifyHTMLElement\"\n-                        ],\n                         \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"Element could not be found in the HTML document. The original HTML input will remain in the FlowFile content unchanged. Relationship 'original' will not be invoked in this scenario.\",\n-                                \"name\": \"element not found\"\n+                                \"description\": \"A FlowFile is transferred to this relationship if the operation cannot be completed but attempting it again may succeed.\",\n+                                \"name\": \"retry\"\n                             },\n                             {\n-                                \"description\": \"Successfully parsed HTML element\",\n+                                \"description\": \"A FlowFile is transferred to this relationship if the operation completed successfully.\",\n                                 \"name\": \"success\"\n                             },\n                             {\n-                                \"description\": \"The original HTML input\",\n-                                \"name\": \"original\"\n-                            },\n-                            {\n-                                \"description\": \"The input HTML syntax is invalid\",\n-                                \"name\": \"invalid html\"\n+                                \"description\": \"A FlowFile is transferred to this relationship if the operation failed.\",\n+                                \"name\": \"failure\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n+                            \"CRON_DRIVEN\",\n+                            \"EVENT_DRIVEN\"\n                         ],\n-                        \"supportsBatching\": true,\n+                        \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": false,\n+                        \"supportsEventDriven\": true,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"css\",\n-                            \"dom\",\n-                            \"element\",\n-                            \"html\",\n-                            \"put\"\n+                            \"cassandra\",\n+                            \"cql\",\n+                            \"select\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.PutHTMLElement\",\n-                        \"typeDescription\": \"Places a new HTML element in the existing HTML DOM. The desired position for the new HTML element is specified by using CSS selector syntax. The incoming HTML is first converted into a HTML Document Object Model so that HTML DOM location may be located in a similar manner that CSS selectors are used to apply styles to HTML. The resulting HTML DOM is then \\\"queried\\\" using the user defined CSS selector string to find the position where the user desires to add the new HTML element. Once the new HTML element is added to the DOM it is rendered to HTML and the result replaces the flowfile content with the updated HTML. A more thorough reference for the CSS selector syntax can be found at \\\"http://jsoup.org/apidocs/org/jsoup/select/Selector.html\\\"\",\n-                        \"version\": \"1.27.0\"\n+                        \"type\": \"org.apache.nifi.processors.cassandra.QueryCassandra\",\n+                        \"typeDescription\": \"Execute provided Cassandra Query Language (CQL) select query on a Cassandra 1.x, 2.x, or 3.0.x cluster. Query result may be converted to Avro or JSON format. Streaming is used so arbitrarily large result sets are supported. This processor can be scheduled to run on a timer, or cron expression, using the standard scheduling methods, or it can be triggered by an incoming FlowFile. If it is triggered by an incoming FlowFile, then attributes of that FlowFile will be available when evaluating the select query. FlowFile attribute 'executecql.row.count' indicates how many rows were selected.\",\n+                        \"version\": \"1.27.0\",\n+                        \"writesAttributes\": [\n+                            {\n+                                \"description\": \"The number of rows returned by the CQL query\",\n+                                \"name\": \"executecql.row.count\"\n+                            },\n+                            {\n+                                \"description\": \"If 'Max Rows Per Flow File' is set then all FlowFiles from the same query result set will have the same value for the fragment.identifier attribute. This can then be used to correlate the results.\",\n+                                \"name\": \"fragment.identifier\"\n+                            },\n+                            {\n+                                \"description\": \"If 'Max Rows Per Flow File' is set then this is the total number of  FlowFiles produced by a single ResultSet. This can be used in conjunction with the fragment.identifier attribute in order to know how many FlowFiles belonged to the same incoming ResultSet. If Output Batch Size is set, then this attribute will not be populated.\",\n+                                \"name\": \"fragment.count\"\n+                            },\n+                            {\n+                                \"description\": \"If 'Max Rows Per Flow File' is set then the position of this FlowFile in the list of outgoing FlowFiles that were all derived from the same result set FlowFile. This can be used in conjunction with the fragment.identifier attribute to know which FlowFiles originated from the same query result set and in what order  FlowFiles were produced\",\n+                                \"name\": \"fragment.index\"\n+                            }\n+                        ]\n                     }\n                 ],\n                 \"reportingTasks\": []\n             },\n             \"group\": \"org.apache.nifi\",\n             \"version\": \"1.27.0\"\n         },\n         {\n-            \"artifact\": \"nifi-image-viewer-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [],\n-                \"processors\": [],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"1.27.0\"\n-        },\n-        {\n-            \"artifact\": \"nifi-azure-nar\",\n+            \"artifact\": \"nifi-record-serialization-services-nar\",\n             \"componentManifest\": {\n                 \"controllerServices\": [\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-azure-nar\",\n+                        \"artifact\": \"nifi-record-serialization-services-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"group\": \"org.apache.nifi\",\n                         \"propertyDescriptors\": {\n-                            \"credential-configuration-strategy\": {\n+                            \"cache-size\": {\n+                                \"defaultValue\": \"1000\",\n+                                \"description\": \"Specifies how many Schemas should be cached\",\n+                                \"displayName\": \"Cache Size\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"cache-size\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"schema-access-strategy\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Uses default credential chain. It first checks environment variables, before trying managed identity.\",\n-                                        \"displayName\": \"Default Credential\",\n-                                        \"value\": \"default-credential\"\n+                                        \"description\": \"The name of the Schema to use is specified by the 'Schema Name' Property. The value of this property is used to lookup the Schema in the configured Schema Registry service.\",\n+                                        \"displayName\": \"Use 'Schema Name' Property\",\n+                                        \"value\": \"schema-name\"\n                                     },\n                                     {\n-                                        \"description\": \"Azure Virtual Machine Managed Identity (it can only be used when NiFi is running on Azure)\",\n-                                        \"displayName\": \"Managed Identity\",\n-                                        \"value\": \"managed-identity\"\n+                                        \"description\": \"The text of the Schema itself is specified by the 'Schema Text' Property. The value of this property must be a valid Avro Schema. If Expression Language is used, the value of the 'Schema Text' property must be valid after substituting the expressions.\",\n+                                        \"displayName\": \"Use 'Schema Text' Property\",\n+                                        \"value\": \"schema-text-property\"\n+                                    },\n+                                    {\n+                                        \"description\": \"The FlowFile contains 3 Attributes that will be used to lookup a Schema from the configured Schema Registry: 'schema.identifier', 'schema.version', and 'schema.protocol.version'\",\n+                                        \"displayName\": \"HWX Schema Reference Attributes\",\n+                                        \"value\": \"hwx-schema-ref-attributes\"\n+                                    },\n+                                    {\n+                                        \"description\": \"The content of the FlowFile contains a reference to a schema in the Schema Registry service. The reference is encoded as a single byte indicating the 'protocol version', followed by 8 bytes indicating the schema identifier, and finally 4 bytes indicating the schema version, as per the Hortonworks Schema Registry serializers and deserializers, found at https://github.com/hortonworks/registry\",\n+                                        \"displayName\": \"HWX Content-Encoded Schema Reference\",\n+                                        \"value\": \"hwx-content-encoded-schema\"\n+                                    },\n+                                    {\n+                                        \"description\": \"The content of the FlowFile contains a reference to a schema in the Schema Registry service. The reference is encoded as a single 'Magic Byte' followed by 4 bytes representing the identifier of the schema, as outlined at http://docs.confluent.io/current/schema-registry/docs/serializer-formatter.html. This is based on version 3.2.x of the Confluent Schema Registry.\",\n+                                        \"displayName\": \"Confluent Content-Encoded Schema Reference\",\n+                                        \"value\": \"confluent-encoded\"\n+                                    },\n+                                    {\n+                                        \"description\": \"The FlowFile has the Avro Schema embedded within the content, and this schema will be used.\",\n+                                        \"displayName\": \"Use Embedded Avro Schema\",\n+                                        \"value\": \"embedded-avro-schema\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"default-credential\",\n-                                \"description\": \"\",\n-                                \"displayName\": \"Credential Configuration Strategy\",\n+                                \"defaultValue\": \"embedded-avro-schema\",\n+                                \"description\": \"Specifies how to obtain the schema that is to be used for interpreting the data.\",\n+                                \"displayName\": \"Schema Access Strategy\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"credential-configuration-strategy\",\n+                                \"name\": \"schema-access-strategy\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"managed-identity-client-id\": {\n+                            \"schema-branch\": {\n                                 \"dependencies\": [\n                                     {\n                                         \"dependentValues\": [\n-                                            \"managed-identity\"\n+                                            \"schema-name\"\n                                         ],\n-                                        \"propertyDisplayName\": \"Credential Configuration Strategy\",\n-                                        \"propertyName\": \"credential-configuration-strategy\"\n+                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n+                                        \"propertyName\": \"schema-access-strategy\"\n                                     }\n                                 ],\n-                                \"description\": \"Client ID of the managed identity. The property is required when User Assigned Managed Identity is used for authentication. It must be empty in case of System Assigned Managed Identity.\",\n-                                \"displayName\": \"Managed Identity Client ID\",\n+                                \"description\": \"Specifies the name of the branch to use when looking up the schema in the Schema Registry property. If the chosen Schema Registry does not support branching, this value will be ignored.\",\n+                                \"displayName\": \"Schema Branch\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"managed-identity-client-id\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"schema-branch\",\n                                 \"required\": false,\n-                                \"sensitive\": true\n-                            }\n-                        },\n-                        \"providedApiImplementations\": [\n-                            {\n-                                \"artifact\": \"nifi-azure-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.services.azure.AzureCredentialsService\",\n-                                \"version\": \"1.27.0\"\n-                            }\n-                        ],\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"azure\",\n-                            \"credentials\",\n-                            \"provider\",\n-                            \"security\",\n-                            \"session\"\n-                        ],\n-                        \"type\": \"org.apache.nifi.services.azure.StandardAzureCredentialsControllerService\",\n-                        \"typeDescription\": \"Provide credentials to use with an Azure client.\",\n-                        \"version\": \"1.27.0\"\n-                    },\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-azure-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"e0c4461\"\n-                        },\n-                        \"group\": \"org.apache.nifi\",\n-                        \"propertyDescriptors\": {\n-                            \"azure-cosmos-db-consistency-level\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"STRONG\",\n-                                        \"value\": \"STRONG\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"BOUNDED_STALENESS\",\n-                                        \"value\": \"BOUNDED_STALENESS\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"SESSION\",\n-                                        \"value\": \"SESSION\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"CONSISTENT_PREFIX\",\n-                                        \"value\": \"CONSISTENT_PREFIX\"\n-                                    },\n+                                \"sensitive\": false\n+                            },\n+                            \"schema-name\": {\n+                                \"defaultValue\": \"${schema.name}\",\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"EVENTUAL\",\n-                                        \"value\": \"EVENTUAL\"\n+                                        \"dependentValues\": [\n+                                            \"schema-name\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n+                                        \"propertyName\": \"schema-access-strategy\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"SESSION\",\n-                                \"description\": \"Choose from five consistency levels on the consistency spectrum. Refer to Cosmos DB documentation for their differences\",\n-                                \"displayName\": \"Cosmos DB Consistency Level\",\n+                                \"description\": \"Specifies the name of the schema to lookup in the Schema Registry property\",\n+                                \"displayName\": \"Schema Name\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"azure-cosmos-db-consistency-level\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"schema-name\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"azure-cosmos-db-key\": {\n-                                \"description\": \"Cosmos DB Access Key from Azure Portal (Settings->Keys). Choose a read-write key to enable database or container creation at run time\",\n-                                \"displayName\": \"Cosmos DB Access Key\",\n+                            \"schema-registry\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"confluent-encoded\",\n+                                            \"schema-name\",\n+                                            \"hwx-schema-ref-attributes\",\n+                                            \"hwx-content-encoded-schema\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n+                                        \"propertyName\": \"schema-access-strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"Specifies the Controller Service to use for the Schema Registry\",\n+                                \"displayName\": \"Schema Registry\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"azure-cosmos-db-key\",\n+                                \"name\": \"schema-registry\",\n                                 \"required\": false,\n-                                \"sensitive\": true\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.schemaregistry.services.SchemaRegistry\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n                             },\n-                            \"azure-cosmos-db-uri\": {\n-                                \"description\": \"Cosmos DB URI, typically in the form of https://{databaseaccount}.documents.azure.com:443/ Note this host URL is for Cosmos DB with Core SQL API from Azure Portal (Overview->URI)\",\n-                                \"displayName\": \"Cosmos DB URI\",\n+                            \"schema-text\": {\n+                                \"defaultValue\": \"${avro.schema}\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"schema-text-property\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n+                                        \"propertyName\": \"schema-access-strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"The text of an Avro-formatted Schema\",\n+                                \"displayName\": \"Schema Text\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"azure-cosmos-db-uri\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"schema-text\",\n                                 \"required\": false,\n-                                \"sensitive\": true\n+                                \"sensitive\": false\n+                            },\n+                            \"schema-version\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"schema-name\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n+                                        \"propertyName\": \"schema-access-strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"Specifies the version of the schema to lookup in the Schema Registry. If not specified then the latest version of the schema will be retrieved.\",\n+                                \"displayName\": \"Schema Version\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"schema-version\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n                             }\n                         },\n                         \"providedApiImplementations\": [\n                             {\n-                                \"artifact\": \"nifi-azure-services-api-nar\",\n+                                \"artifact\": \"nifi-standard-services-api-nar\",\n                                 \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.services.azure.cosmos.AzureCosmosDBConnectionService\",\n+                                \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n                                 \"version\": \"1.27.0\"\n                             }\n                         ],\n                         \"supportsDynamicProperties\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"azure\",\n-                            \"cosmos\",\n-                            \"document\",\n-                            \"service\"\n+                            \"avro\",\n+                            \"comma\",\n+                            \"delimited\",\n+                            \"parse\",\n+                            \"reader\",\n+                            \"record\",\n+                            \"row\",\n+                            \"separated\",\n+                            \"values\"\n                         ],\n-                        \"type\": \"org.apache.nifi.services.azure.cosmos.document.AzureCosmosDBClientService\",\n-                        \"typeDescription\": \"Provides a controller service that configures a connection to Cosmos DB (Core SQL API)  and provides access to that connection to other Cosmos DB-related components.\",\n+                        \"type\": \"org.apache.nifi.avro.AvroReader\",\n+                        \"typeDescription\": \"Parses Avro data and returns each Avro record as an separate Record object. The Avro data may contain the schema itself, or the schema can be externalized and accessed by one of the methods offered by the 'Schema Access Strategy' property.\",\n                         \"version\": \"1.27.0\"\n                     },\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-azure-nar\",\n+                        \"artifact\": \"nifi-record-serialization-services-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"group\": \"org.apache.nifi\",\n                         \"propertyDescriptors\": {\n-                            \"Authentication Strategy\": {\n+                            \"Schema Write Strategy\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Azure Event Hub shared access key\",\n-                                        \"displayName\": \"Shared Access Key\",\n-                                        \"value\": \"SHARED_ACCESS_KEY\"\n+                                        \"description\": \"The FlowFile will have the Avro schema embedded into the content, as is typical with Avro\",\n+                                        \"displayName\": \"Embed Avro Schema\",\n+                                        \"value\": \"avro-embedded\"\n                                     },\n                                     {\n-                                        \"description\": \"The Default Azure Credential will read credentials from standard environment variables and will also attempt to read Managed Identity credentials when running in Microsoft Azure environments\",\n-                                        \"displayName\": \"Default Azure Credential\",\n-                                        \"value\": \"DEFAULT_AZURE_CREDENTIAL\"\n+                                        \"description\": \"Do not add any schema-related information to the FlowFile.\",\n+                                        \"displayName\": \"Do Not Write Schema\",\n+                                        \"value\": \"no-schema\"\n+                                    },\n+                                    {\n+                                        \"description\": \"The FlowFile will be given an attribute named 'schema.name' and this attribute will indicate the name of the schema in the Schema Registry. Note that ifthe schema for a record is not obtained from a Schema Registry, then no attribute will be added.\",\n+                                        \"displayName\": \"Set 'schema.name' Attribute\",\n+                                        \"value\": \"schema-name\"\n+                                    },\n+                                    {\n+                                        \"description\": \"The FlowFile will be given an attribute named 'avro.schema' and this attribute will contain the Avro Schema that describes the records in the FlowFile. The contents of the FlowFile need not be Avro, but the text of the schema will be used.\",\n+                                        \"displayName\": \"Set 'avro.schema' Attribute\",\n+                                        \"value\": \"full-schema-attribute\"\n+                                    },\n+                                    {\n+                                        \"description\": \"The FlowFile will be given a set of 3 attributes to describe the schema: 'schema.identifier', 'schema.version', and 'schema.protocol.version'. Note that if the schema for a record does not contain the necessary identifier and version, an Exception will be thrown when attempting to write the data.\",\n+                                        \"displayName\": \"HWX Schema Reference Attributes\",\n+                                        \"value\": \"hwx-schema-ref-attributes\"\n+                                    },\n+                                    {\n+                                        \"description\": \"The content of the FlowFile will contain a reference to a schema in the Schema Registry service. The reference is encoded as a single byte indicating the 'protocol version', followed by 8 bytes indicating the schema identifier, and finally 4 bytes indicating the schema version, as per the Hortonworks Schema Registry serializers and deserializers, as found at https://github.com/hortonworks/registry. This will be prepended to each FlowFile. Note that if the schema for a record does not contain the necessary identifier and version, an Exception will be thrown when attempting to write the data.\",\n+                                        \"displayName\": \"HWX Content-Encoded Schema Reference\",\n+                                        \"value\": \"hwx-content-encoded-schema\"\n+                                    },\n+                                    {\n+                                        \"description\": \"The content of the FlowFile will contain a reference to a schema in the Schema Registry service. The reference is encoded as a single 'Magic Byte' followed by 4 bytes representing the identifier of the schema, as outlined at http://docs.confluent.io/current/schema-registry/docs/serializer-formatter.html. This will be prepended to each FlowFile. Note that if the schema for a record does not contain the necessary identifier and version, an Exception will be thrown when attempting to write the data. This is based on the encoding used by version 3.2.x of the Confluent Schema Registry.\",\n+                                        \"displayName\": \"Confluent Schema Registry Reference\",\n+                                        \"value\": \"confluent-encoded\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"DEFAULT_AZURE_CREDENTIAL\",\n-                                \"description\": \"Strategy for authenticating to Azure Event Hubs\",\n-                                \"displayName\": \"Authentication Strategy\",\n+                                \"defaultValue\": \"avro-embedded\",\n+                                \"description\": \"Specifies how the schema for a Record should be added to the data.\",\n+                                \"displayName\": \"Schema Write Strategy\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Authentication Strategy\",\n+                                \"name\": \"Schema Write Strategy\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Event Hub Name\": {\n-                                \"description\": \"Provides the Event Hub Name for connections\",\n-                                \"displayName\": \"Event Hub Name\",\n+                            \"cache-size\": {\n+                                \"defaultValue\": \"1000\",\n+                                \"description\": \"Specifies how many Schemas should be cached\",\n+                                \"displayName\": \"Cache Size\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Event Hub Name\",\n+                                \"name\": \"cache-size\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Event Hub Namespace\": {\n-                                \"description\": \"Provides provides the host for connecting to Azure Event Hubs\",\n-                                \"displayName\": \"Event Hub Namespace\",\n+                            \"compression-format\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"BZIP2\",\n+                                        \"value\": \"BZIP2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"DEFLATE\",\n+                                        \"value\": \"DEFLATE\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"NONE\",\n+                                        \"value\": \"NONE\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"SNAPPY\",\n+                                        \"value\": \"SNAPPY\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"LZO\",\n+                                        \"value\": \"LZO\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"NONE\",\n+                                \"description\": \"Compression type to use when writing Avro files. Default is None.\",\n+                                \"displayName\": \"Compression Format\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Event Hub Namespace\",\n+                                \"name\": \"compression-format\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Partition Key\": {\n-                                \"description\": \"A hint for Azure Event Hub message broker how to distribute messages across one or more partitions\",\n-                                \"displayName\": \"Partition Key\",\n+                            \"encoder-pool-size\": {\n+                                \"defaultValue\": \"32\",\n+                                \"description\": \"Avro Writers require the use of an Encoder. Creation of Encoders is expensive, but once created, they can be reused. This property controls the maximum number of Encoders that can be pooled and reused. Setting this value too small can result in degraded performance, but setting it higher can result in more heap being used. This property is ignored if the Avro Writer is configured with a Schema Write Strategy of 'Embed Avro Schema'.\",\n+                                \"displayName\": \"Encoder Pool Size\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Partition Key\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"encoder-pool-size\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Service Bus Endpoint\": {\n+                            \"schema-access-strategy\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Default Service Bus Endpoint\",\n-                                        \"displayName\": \"Azure\",\n-                                        \"value\": \".servicebus.windows.net\"\n-                                    },\n-                                    {\n-                                        \"description\": \"China Service Bus Endpoint\",\n-                                        \"displayName\": \"Azure China\",\n-                                        \"value\": \".servicebus.chinacloudapi.cn\"\n+                                        \"description\": \"The schema used to write records will be the same schema that was given to the Record when the Record was created.\",\n+                                        \"displayName\": \"Inherit Record Schema\",\n+                                        \"value\": \"inherit-record-schema\"\n                                     },\n                                     {\n-                                        \"description\": \"Germany Service Bus Endpoint\",\n-                                        \"displayName\": \"Azure Germany\",\n-                                        \"value\": \".servicebus.cloudapi.de\"\n+                                        \"description\": \"The name of the Schema to use is specified by the 'Schema Name' Property. The value of this property is used to lookup the Schema in the configured Schema Registry service.\",\n+                                        \"displayName\": \"Use 'Schema Name' Property\",\n+                                        \"value\": \"schema-name\"\n                                     },\n                                     {\n-                                        \"description\": \"United States Government Endpoint\",\n-                                        \"displayName\": \"Azure US Government\",\n-                                        \"value\": \".servicebus.usgovcloudapi.net\"\n+                                        \"description\": \"The text of the Schema itself is specified by the 'Schema Text' Property. The value of this property must be a valid Avro Schema. If Expression Language is used, the value of the 'Schema Text' property must be valid after substituting the expressions.\",\n+                                        \"displayName\": \"Use 'Schema Text' Property\",\n+                                        \"value\": \"schema-text-property\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \".servicebus.windows.net\",\n-                                \"description\": \"Provides the domain for connecting to Azure Event Hubs\",\n-                                \"displayName\": \"Service Bus Endpoint\",\n+                                \"defaultValue\": \"inherit-record-schema\",\n+                                \"description\": \"Specifies how to obtain the schema that is to be used for interpreting the data.\",\n+                                \"displayName\": \"Schema Access Strategy\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Service Bus Endpoint\",\n+                                \"name\": \"schema-access-strategy\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Shared Access Policy\": {\n+                            \"schema-branch\": {\n                                 \"dependencies\": [\n                                     {\n                                         \"dependentValues\": [\n-                                            \"SHARED_ACCESS_KEY\"\n+                                            \"schema-name\"\n                                         ],\n-                                        \"propertyDisplayName\": \"Authentication Strategy\",\n-                                        \"propertyName\": \"Authentication Strategy\"\n+                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n+                                        \"propertyName\": \"schema-access-strategy\"\n                                     }\n                                 ],\n-                                \"description\": \"The name of the shared access policy. This policy must have Send claims\",\n-                                \"displayName\": \"Shared Access Policy\",\n+                                \"description\": \"Specifies the name of the branch to use when looking up the schema in the Schema Registry property. If the chosen Schema Registry does not support branching, this value will be ignored.\",\n+                                \"displayName\": \"Schema Branch\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"schema-branch\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"schema-cache\": {\n+                                \"description\": \"Specifies a Schema Cache to add the Record Schema to so that Record Readers can quickly lookup the schema.\",\n+                                \"displayName\": \"Schema Cache\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Shared Access Policy\",\n+                                \"name\": \"schema-cache\",\n                                 \"required\": false,\n-                                \"sensitive\": false\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.serialization.RecordSchemaCacheService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n                             },\n-                            \"Shared Access Policy Key\": {\n+                            \"schema-name\": {\n+                                \"defaultValue\": \"${schema.name}\",\n                                 \"dependencies\": [\n                                     {\n                                         \"dependentValues\": [\n-                                            \"SHARED_ACCESS_KEY\"\n+                                            \"schema-name\"\n                                         ],\n-                                        \"propertyDisplayName\": \"Authentication Strategy\",\n-                                        \"propertyName\": \"Authentication Strategy\"\n+                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n+                                        \"propertyName\": \"schema-access-strategy\"\n                                     }\n                                 ],\n-                                \"description\": \"The primary or secondary key of the shared access policy\",\n-                                \"displayName\": \"Shared Access Policy Key\",\n+                                \"description\": \"Specifies the name of the schema to lookup in the Schema Registry property\",\n+                                \"displayName\": \"Schema Name\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Shared Access Policy Key\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"schema-name\",\n                                 \"required\": false,\n-                                \"sensitive\": true\n+                                \"sensitive\": false\n                             },\n-                            \"Transport Type\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"AMQP over TCP on ports 5671 and 5672\",\n-                                        \"displayName\": \"AMQP\",\n-                                        \"value\": \"Amqp\"\n-                                    },\n+                            \"schema-protocol-version\": {\n+                                \"defaultValue\": \"1\",\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"AMQP over HTTPS with WebSockets on port 443\",\n-                                        \"displayName\": \"AMQP_WEB_SOCKETS\",\n-                                        \"value\": \"AmqpWebSockets\"\n+                                        \"dependentValues\": [\n+                                            \"hwx-schema-ref-attributes\",\n+                                            \"hwx-content-encoded-schema\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Schema Write Strategy\",\n+                                        \"propertyName\": \"Schema Write Strategy\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"Amqp\",\n-                                \"description\": \"Advanced Message Queuing Protocol Transport Type for communication with Azure Event Hubs\",\n-                                \"displayName\": \"Transport Type\",\n+                                \"description\": \"The protocol version to be used for Schema Write Strategies that require a protocol version, such as Hortonworks Schema Registry strategies. Valid protocol versions for Hortonworks Schema Registry are integer values 1, 2, or 3.\",\n+                                \"displayName\": \"Schema Protocol Version\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Transport Type\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"schema-protocol-version\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"record-sink-record-writer\": {\n-                                \"description\": \"Specifies the Controller Service to use for writing out the records.\",\n-                                \"displayName\": \"Record Writer\",\n+                            \"schema-registry\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"confluent-encoded\",\n+                                            \"schema-name\",\n+                                            \"hwx-schema-ref-attributes\",\n+                                            \"hwx-content-encoded-schema\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n+                                        \"propertyName\": \"schema-access-strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"Specifies the Controller Service to use for the Schema Registry\",\n+                                \"displayName\": \"Schema Registry\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"record-sink-record-writer\",\n-                                \"required\": true,\n+                                \"name\": \"schema-registry\",\n+                                \"required\": false,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n                                     \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n+                                    \"type\": \"org.apache.nifi.schemaregistry.services.SchemaRegistry\",\n                                     \"version\": \"1.27.0\"\n                                 }\n+                            },\n+                            \"schema-text\": {\n+                                \"defaultValue\": \"${avro.schema}\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"schema-text-property\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n+                                        \"propertyName\": \"schema-access-strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"The text of an Avro-formatted Schema\",\n+                                \"displayName\": \"Schema Text\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"schema-text\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"schema-version\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"schema-name\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n+                                        \"propertyName\": \"schema-access-strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"Specifies the version of the schema to lookup in the Schema Registry. If not specified then the latest version of the schema will be retrieved.\",\n+                                \"displayName\": \"Schema Version\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"schema-version\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n                             }\n                         },\n                         \"providedApiImplementations\": [\n                             {\n                                 \"artifact\": \"nifi-standard-services-api-nar\",\n                                 \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.record.sink.RecordSinkService\",\n+                                \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n                                 \"version\": \"1.27.0\"\n                             }\n                         ],\n                         \"supportsDynamicProperties\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"azure\",\n+                            \"avro\",\n                             \"record\",\n-                            \"sink\"\n+                            \"recordset\",\n+                            \"result\",\n+                            \"row\",\n+                            \"serializer\",\n+                            \"set\",\n+                            \"writer\"\n                         ],\n-                        \"type\": \"org.apache.nifi.services.azure.eventhub.AzureEventHubRecordSink\",\n-                        \"typeDescription\": \"Format and send Records to Azure Event Hubs\",\n+                        \"type\": \"org.apache.nifi.avro.AvroRecordSetWriter\",\n+                        \"typeDescription\": \"Writes the contents of a RecordSet in Binary Avro format.\",\n                         \"version\": \"1.27.0\"\n                     },\n                     {\n                         \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-azure-nar\",\n+                        \"artifact\": \"nifi-record-serialization-services-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"group\": \"org.apache.nifi\",\n                         \"propertyDescriptors\": {\n-                            \"managed-identity-client-id\": {\n-                                \"description\": \"Client ID of the managed identity. The property is required when User Assigned Managed Identity is used for authentication. It must be empty in case of System Assigned Managed Identity.\",\n-                                \"displayName\": \"Managed Identity Client ID\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"managed-identity-client-id\",\n-                                \"required\": false,\n-                                \"sensitive\": true\n-                            },\n-                            \"proxy-configuration-service\": {\n-                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests. Supported proxies: SOCKS, HTTP In case of SOCKS, it is not guaranteed that the selected SOCKS Version will be used by the processor.\",\n-                                \"displayName\": \"Proxy Configuration Service\",\n+                            \"accept-empty-extensions\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"If set to true, empty extensions will be accepted and will be associated to a null value.\",\n+                                \"displayName\": \"Accept empty extensions\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"proxy-configuration-service\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.proxy.ProxyConfigurationService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n+                                \"name\": \"accept-empty-extensions\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n                             },\n-                            \"service-principal-client-id\": {\n-                                \"description\": \"Client ID (or Application ID) of the Client/Application having the Service Principal. The property is required when Service Principal authentication is used.\",\n-                                \"displayName\": \"Service Principal Client ID\",\n+                            \"datetime-representation\": {\n+                                \"defaultValue\": \"en-US\",\n+                                \"description\": \"The IETF BCP 47 representation of the Locale to be used when parsing date fields with long or short month names (e.g. may <en-US> vs. mai. <fr-FR>. The defaultvalue is generally safe. Only change if having issues parsing CEF messages\",\n+                                \"displayName\": \"DateTime Locale\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"service-principal-client-id\",\n-                                \"required\": false,\n-                                \"sensitive\": true\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"datetime-representation\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n                             },\n-                            \"service-principal-client-secret\": {\n-                                \"description\": \"Password of the Client/Application. The property is required when Service Principal authentication is used.\",\n-                                \"displayName\": \"Service Principal Client Secret\",\n+                            \"inference-strategy\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"Includes only CEF header fields into the inferred schema.\",\n+                                        \"displayName\": \"Headers only\",\n+                                        \"value\": \"headers-only\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Includes the CEF header and extension fields to the schema, but not the custom extensions.\",\n+                                        \"displayName\": \"Headers and extensions\",\n+                                        \"value\": \"headers-and-extensions\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Includes all fields into the inferred schema, involving custom extension fields as string values.\",\n+                                        \"displayName\": \"With custom extensions as strings\",\n+                                        \"value\": \"custom-extensions-as-string\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Includes all fields into the inferred schema, involving custom extension fields with inferred data types. The inference works based on the values in the FlowFile. In some scenarios this might result unsatisfiable behaviour. In these cases it is suggested to use \\\"With custom extensions as strings\\\" Inference Strategy or predefined schema.\",\n+                                        \"displayName\": \"With custom extensions inferred\",\n+                                        \"value\": \"custom-extensions-inferred\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"custom-extensions-inferred\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"infer-schema\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n+                                        \"propertyName\": \"schema-access-strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"Defines the set of fields should be included in the schema and the way the fields are being interpreted.\",\n+                                \"displayName\": \"Inference Strategy\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"service-principal-client-secret\",\n-                                \"required\": false,\n-                                \"sensitive\": true\n+                                \"name\": \"inference-strategy\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n                             },\n-                            \"service-principal-tenant-id\": {\n-                                \"description\": \"Tenant ID of the Azure Active Directory hosting the Service Principal. The property is required when Service Principal authentication is used.\",\n-                                \"displayName\": \"Service Principal Tenant ID\",\n+                            \"invalid-message-field\": {\n+                                \"description\": \"Used when a line in the FlowFile cannot be parsed by the CEF parser. If set, instead of failing to process the FlowFile, a record is being added with one field. This record contains one field with the name specified by the property and the raw message as value.\",\n+                                \"displayName\": \"Invalid Field\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"service-principal-tenant-id\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"invalid-message-field\",\n                                 \"required\": false,\n-                                \"sensitive\": true\n+                                \"sensitive\": false\n                             },\n-                            \"storage-account-key\": {\n-                                \"description\": \"The storage account key. This is an admin-like password providing access to every container in this account. It is recommended one uses Shared Access Signature (SAS) token instead for fine-grained control with policies. There are certain risks in allowing the account key to be stored as a flowfile attribute. While it does provide for a more flexible flow by allowing the account key to be fetched dynamically from a flowfile attribute, care must be taken to restrict access to the event provenance data (e.g., by strictly controlling the policies governing provenance for this processor). In addition, the provenance repositories may be put on encrypted disk partitions.\",\n-                                \"displayName\": \"Storage Account Key\",\n+                            \"raw-message-field\": {\n+                                \"description\": \"If set the raw message will be added to the record using the property value as field name. This is not the same as the \\\"rawEvent\\\" extension field!\",\n+                                \"displayName\": \"Raw Message Field\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"storage-account-key\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"raw-message-field\",\n                                 \"required\": false,\n-                                \"sensitive\": true\n-                            },\n-                            \"storage-account-name\": {\n-                                \"description\": \"The storage account name. There are certain risks in allowing the account name to be stored as a flowfile attribute. While it does provide for a more flexible flow by allowing the account name to be fetched dynamically from a flowfile attribute, care must be taken to restrict access to the event provenance data (e.g., by strictly controlling the policies governing provenance for this processor). In addition, the provenance repositories may be put on encrypted disk partitions.\",\n-                                \"displayName\": \"Storage Account Name\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"storage-account-name\",\n-                                \"required\": true,\n-                                \"sensitive\": true\n+                                \"sensitive\": false\n                             },\n-                            \"storage-endpoint-suffix\": {\n-                                \"defaultValue\": \"dfs.core.windows.net\",\n-                                \"description\": \"Storage accounts in public Azure always use a common FQDN suffix. Override this endpoint suffix with a different suffix in certain circumstances (like Azure Stack or non-public Azure regions).\",\n-                                \"displayName\": \"Endpoint Suffix\",\n+                            \"schema-access-strategy\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"The name of the Schema to use is specified by the 'Schema Name' Property. The value of this property is used to lookup the Schema in the configured Schema Registry service.\",\n+                                        \"displayName\": \"Use 'Schema Name' Property\",\n+                                        \"value\": \"schema-name\"\n+                                    },\n+                                    {\n+                                        \"description\": \"The text of the Schema itself is specified by the 'Schema Text' Property. The value of this property must be a valid Avro Schema. If Expression Language is used, the value of the 'Schema Text' property must be valid after substituting the expressions.\",\n+                                        \"displayName\": \"Use 'Schema Text' Property\",\n+                                        \"value\": \"schema-text-property\"\n+                                    },\n+                                    {\n+                                        \"description\": \"The FlowFile contains 3 Attributes that will be used to lookup a Schema from the configured Schema Registry: 'schema.identifier', 'schema.version', and 'schema.protocol.version'\",\n+                                        \"displayName\": \"HWX Schema Reference Attributes\",\n+                                        \"value\": \"hwx-schema-ref-attributes\"\n+                                    },\n+                                    {\n+                                        \"description\": \"The content of the FlowFile contains a reference to a schema in the Schema Registry service. The reference is encoded as a single byte indicating the 'protocol version', followed by 8 bytes indicating the schema identifier, and finally 4 bytes indicating the schema version, as per the Hortonworks Schema Registry serializers and deserializers, found at https://github.com/hortonworks/registry\",\n+                                        \"displayName\": \"HWX Content-Encoded Schema Reference\",\n+                                        \"value\": \"hwx-content-encoded-schema\"\n+                                    },\n+                                    {\n+                                        \"description\": \"The content of the FlowFile contains a reference to a schema in the Schema Registry service. The reference is encoded as a single 'Magic Byte' followed by 4 bytes representing the identifier of the schema, as outlined at http://docs.confluent.io/current/schema-registry/docs/serializer-formatter.html. This is based on version 3.2.x of the Confluent Schema Registry.\",\n+                                        \"displayName\": \"Confluent Content-Encoded Schema Reference\",\n+                                        \"value\": \"confluent-encoded\"\n+                                    },\n+                                    {\n+                                        \"description\": \"The Schema of the data will be inferred automatically when the data is read. See component Usage and Additional Details for information about how the schema is inferred.\",\n+                                        \"displayName\": \"Infer Schema\",\n+                                        \"value\": \"infer-schema\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"infer-schema\",\n+                                \"description\": \"Specifies how to obtain the schema that is to be used for interpreting the data.\",\n+                                \"displayName\": \"Schema Access Strategy\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"storage-endpoint-suffix\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"schema-access-strategy\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"storage-sas-token\": {\n-                                \"description\": \"Shared Access Signature token, including the leading '?'. Specify either SAS token (recommended) or Account Key. There are certain risks in allowing the SAS token to be stored as a flowfile attribute. While it does provide for a more flexible flow by allowing the SAS token to be fetched dynamically from a flowfile attribute, care must be taken to restrict access to the event provenance data (e.g., by strictly controlling the policies governing provenance for this processor). In addition, the provenance repositories may be put on encrypted disk partitions.\",\n-                                \"displayName\": \"SAS Token\",\n+                            \"schema-branch\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"schema-name\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n+                                        \"propertyName\": \"schema-access-strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"Specifies the name of the branch to use when looking up the schema in the Schema Registry property. If the chosen Schema Registry does not support branching, this value will be ignored.\",\n+                                \"displayName\": \"Schema Branch\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"storage-sas-token\",\n+                                \"name\": \"schema-branch\",\n                                 \"required\": false,\n-                                \"sensitive\": true\n+                                \"sensitive\": false\n                             },\n-                            \"storage-use-managed-identity\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n+                            \"schema-inference-cache\": {\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"dependentValues\": [\n+                                            \"infer-schema\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n+                                        \"propertyName\": \"schema-access-strategy\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"Choose whether or not to use the managed identity of Azure VM/VMSS\",\n-                                \"displayName\": \"Use Azure Managed Identity\",\n+                                \"description\": \"Specifies a Schema Cache to use when inferring the schema. If not populated, the schema will be inferred each time. However, if a cache is specified, the cache will first be consulted and if the applicable schema can be found, it will be used instead of inferring the schema.\",\n+                                \"displayName\": \"Schema Inference Cache\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"storage-use-managed-identity\",\n+                                \"name\": \"schema-inference-cache\",\n                                 \"required\": false,\n-                                \"sensitive\": false\n-                            }\n-                        },\n-                        \"providedApiImplementations\": [\n-                            {\n-                                \"artifact\": \"nifi-azure-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.services.azure.storage.ADLSCredentialsService\",\n-                                \"version\": \"1.27.0\"\n-                            }\n-                        ],\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"adls\",\n-                            \"azure\",\n-                            \"cloud\",\n-                            \"credentials\",\n-                            \"microsoft\",\n-                            \"storage\"\n-                        ],\n-                        \"type\": \"org.apache.nifi.services.azure.storage.ADLSCredentialsControllerService\",\n-                        \"typeDescription\": \"Defines credentials for ADLS processors.\",\n-                        \"version\": \"1.27.0\"\n-                    },\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-azure-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"e0c4461\"\n-                        },\n-                        \"dynamicProperties\": [\n-                            {\n-                                \"description\": \"If 'adls.credentials.name' attribute contains the name of the dynamic property, then the ADLSCredentialsService (registered in the value) will be selected.\",\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"name\": \"The name to register ADLSCredentialsService\",\n-                                \"value\": \"The ADLSCredentialsService\"\n-                            }\n-                        ],\n-                        \"group\": \"org.apache.nifi\",\n-                        \"providedApiImplementations\": [\n-                            {\n-                                \"artifact\": \"nifi-azure-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.services.azure.storage.ADLSCredentialsService\",\n-                                \"version\": \"1.27.0\"\n-                            }\n-                        ],\n-                        \"supportsDynamicProperties\": true,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"adls\",\n-                            \"azure\",\n-                            \"cloud\",\n-                            \"credentials\",\n-                            \"microsoft\",\n-                            \"storage\"\n-                        ],\n-                        \"type\": \"org.apache.nifi.services.azure.storage.ADLSCredentialsControllerServiceLookup\",\n-                        \"typeDescription\": \"Provides an ADLSCredentialsService that can be used to dynamically select another ADLSCredentialsService. This service requires an attribute named 'adls.credentials.name' to be passed in, and will throw an exception if the attribute is missing. The value of 'adls.credentials.name' will be used to select the ADLSCredentialsService that has been registered with that name. This will allow multiple ADLSCredentialsServices to be defined and registered, and then selected dynamically at runtime by tagging flow files with the appropriate 'adls.credentials.name' attribute.\",\n-                        \"version\": \"1.27.0\"\n-                    },\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-azure-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"e0c4461\"\n-                        },\n-                        \"group\": \"org.apache.nifi\",\n-                        \"propertyDescriptors\": {\n-                            \"storage-account-key\": {\n-                                \"description\": \"The storage account key. This is an admin-like password providing access to every container in this account. It is recommended one uses Shared Access Signature (SAS) token instead for fine-grained control with policies. There are certain risks in allowing the account key to be stored as a flowfile attribute. While it does provide for a more flexible flow by allowing the account key to be fetched dynamically from a flowfile attribute, care must be taken to restrict access to the event provenance data (e.g., by strictly controlling the policies governing provenance for this processor). In addition, the provenance repositories may be put on encrypted disk partitions.\",\n-                                \"displayName\": \"Storage Account Key\",\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.serialization.RecordSchemaCacheService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"schema-name\": {\n+                                \"defaultValue\": \"${schema.name}\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"schema-name\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n+                                        \"propertyName\": \"schema-access-strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"Specifies the name of the schema to lookup in the Schema Registry property\",\n+                                \"displayName\": \"Schema Name\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"storage-account-key\",\n+                                \"name\": \"schema-name\",\n                                 \"required\": false,\n-                                \"sensitive\": true\n+                                \"sensitive\": false\n                             },\n-                            \"storage-account-name\": {\n-                                \"description\": \"The storage account name. There are certain risks in allowing the account name to be stored as a flowfile attribute. While it does provide for a more flexible flow by allowing the account name to be fetched dynamically from a flowfile attribute, care must be taken to restrict access to the event provenance data (e.g., by strictly controlling the policies governing provenance for this processor). In addition, the provenance repositories may be put on encrypted disk partitions.\",\n-                                \"displayName\": \"Storage Account Name\",\n+                            \"schema-registry\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"confluent-encoded\",\n+                                            \"schema-name\",\n+                                            \"hwx-schema-ref-attributes\",\n+                                            \"hwx-content-encoded-schema\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n+                                        \"propertyName\": \"schema-access-strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"Specifies the Controller Service to use for the Schema Registry\",\n+                                \"displayName\": \"Schema Registry\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"storage-account-name\",\n-                                \"required\": true,\n-                                \"sensitive\": true\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"schema-registry\",\n+                                \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.schemaregistry.services.SchemaRegistry\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n                             },\n-                            \"storage-endpoint-suffix\": {\n-                                \"description\": \"Storage accounts in public Azure always use a common FQDN suffix. Override this endpoint suffix with a different suffix in certain circumstances (like Azure Stack or non-public Azure regions). The preferred way is to configure them through a controller service specified in the Storage Credentials property. The controller service can provide a common/shared configuration for multiple/all Azure processors. Furthermore, the credentials can also be looked up dynamically with the 'Lookup' version of the service.\",\n-                                \"displayName\": \"Common Storage Account Endpoint Suffix\",\n+                            \"schema-text\": {\n+                                \"defaultValue\": \"${avro.schema}\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"schema-text-property\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n+                                        \"propertyName\": \"schema-access-strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"The text of an Avro-formatted Schema\",\n+                                \"displayName\": \"Schema Text\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"storage-endpoint-suffix\",\n+                                \"name\": \"schema-text\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"storage-sas-token\": {\n-                                \"description\": \"Shared Access Signature token, including the leading '?'. Specify either SAS token (recommended) or Account Key. There are certain risks in allowing the SAS token to be stored as a flowfile attribute. While it does provide for a more flexible flow by allowing the SAS token to be fetched dynamically from a flowfile attribute, care must be taken to restrict access to the event provenance data (e.g., by strictly controlling the policies governing provenance for this processor). In addition, the provenance repositories may be put on encrypted disk partitions.\",\n-                                \"displayName\": \"SAS Token\",\n+                            \"schema-version\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"schema-name\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n+                                        \"propertyName\": \"schema-access-strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"Specifies the version of the schema to lookup in the Schema Registry. If not specified then the latest version of the schema will be retrieved.\",\n+                                \"displayName\": \"Schema Version\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"storage-sas-token\",\n+                                \"name\": \"schema-version\",\n                                 \"required\": false,\n-                                \"sensitive\": true\n+                                \"sensitive\": false\n                             }\n                         },\n                         \"providedApiImplementations\": [\n                             {\n-                                \"artifact\": \"nifi-azure-services-api-nar\",\n+                                \"artifact\": \"nifi-standard-services-api-nar\",\n                                 \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.services.azure.storage.AzureStorageCredentialsService\",\n+                                \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n                                 \"version\": \"1.27.0\"\n                             }\n                         ],\n                         \"supportsDynamicProperties\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"azure\",\n-                            \"blob\",\n-                            \"cloud\",\n-                            \"credentials\",\n-                            \"microsoft\",\n-                            \"queue\",\n-                            \"storage\"\n-                        ],\n-                        \"type\": \"org.apache.nifi.services.azure.storage.AzureStorageCredentialsControllerService\",\n-                        \"typeDescription\": \"Defines credentials for Azure Storage processors. Uses Account Name with Account Key or Account Name with SAS Token.\",\n-                        \"version\": \"1.27.0\"\n-                    },\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-azure-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"e0c4461\"\n-                        },\n-                        \"dynamicProperties\": [\n-                            {\n-                                \"description\": \"If 'azure.storage.credentials.name' attribute contains the name of the dynamic property, then the AzureStorageCredentialsService (registered in the value) will be selected.\",\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"name\": \"The name to register AzureStorageCredentialsService\",\n-                                \"value\": \"The AzureStorageCredentialsService\"\n-                            }\n-                        ],\n-                        \"group\": \"org.apache.nifi\",\n-                        \"providedApiImplementations\": [\n-                            {\n-                                \"artifact\": \"nifi-azure-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.services.azure.storage.AzureStorageCredentialsService\",\n-                                \"version\": \"1.27.0\"\n-                            }\n-                        ],\n-                        \"supportsDynamicProperties\": true,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"azure\",\n-                            \"blob\",\n-                            \"cloud\",\n-                            \"credentials\",\n-                            \"microsoft\",\n-                            \"queue\",\n-                            \"storage\"\n-                        ],\n-                        \"type\": \"org.apache.nifi.services.azure.storage.AzureStorageCredentialsControllerServiceLookup\",\n-                        \"typeDescription\": \"Provides an AzureStorageCredentialsService that can be used to dynamically select another AzureStorageCredentialsService. This service requires an attribute named 'azure.storage.credentials.name' to be passed in, and will throw an exception if the attribute is missing. The value of 'azure.storage.credentials.name' will be used to select the AzureStorageCredentialsService that has been registered with that name. This will allow multiple AzureStorageCredentialsServices to be defined and registered, and then selected dynamically at runtime by tagging flow files with the appropriate 'azure.storage.credentials.name' attribute.\",\n-                        \"version\": \"1.27.0\"\n-                    },\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-azure-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"e0c4461\"\n-                        },\n-                        \"dynamicProperties\": [\n-                            {\n-                                \"description\": \"If 'azure.storage.credentials.name' attribute contains the name of the dynamic property, then the AzureStorageCredentialsService_v12 (registered in the value) will be selected.\",\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"name\": \"The name to register AzureStorageCredentialsService_v12\",\n-                                \"value\": \"The AzureStorageCredentialsService_v12\"\n-                            }\n-                        ],\n-                        \"group\": \"org.apache.nifi\",\n-                        \"providedApiImplementations\": [\n-                            {\n-                                \"artifact\": \"nifi-azure-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.services.azure.storage.AzureStorageCredentialsService_v12\",\n-                                \"version\": \"1.27.0\"\n-                            }\n-                        ],\n-                        \"supportsDynamicProperties\": true,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"azure\",\n-                            \"blob\",\n-                            \"cloud\",\n-                            \"credentials\",\n-                            \"microsoft\",\n-                            \"queue\",\n-                            \"storage\"\n+                            \"cef\",\n+                            \"parser\",\n+                            \"reader\",\n+                            \"record\"\n                         ],\n-                        \"type\": \"org.apache.nifi.services.azure.storage.AzureStorageCredentialsControllerServiceLookup_v12\",\n-                        \"typeDescription\": \"Provides an AzureStorageCredentialsService_v12 that can be used to dynamically select another AzureStorageCredentialsService_v12. This service requires an attribute named 'azure.storage.credentials.name' to be passed in, and will throw an exception if the attribute is missing. The value of 'azure.storage.credentials.name' will be used to select the AzureStorageCredentialsService_v12 that has been registered with that name. This will allow multiple AzureStorageCredentialsServices_v12 to be defined and registered, and then selected dynamically at runtime by tagging flow files with the appropriate 'azure.storage.credentials.name' attribute.\",\n+                        \"type\": \"org.apache.nifi.cef.CEFReader\",\n+                        \"typeDescription\": \"Parses CEF (Common Event Format) events, returning each row as a record. This reader allows for inferring a schema based on the first event in the FlowFile or providing an explicit schema for interpreting the values.\",\n                         \"version\": \"1.27.0\"\n                     },\n                     {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-azure-nar\",\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-record-serialization-services-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"group\": \"org.apache.nifi\",\n                         \"propertyDescriptors\": {\n-                            \"credentials-type\": {\n+                            \"CSV Format\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"The primary or secondary Account Key of the storage account that provides full access to the resources in the account\",\n-                                        \"displayName\": \"Account Key\",\n-                                        \"value\": \"ACCOUNT_KEY\"\n+                                        \"description\": \"The format of the CSV is configured by using the properties of this Controller Service, such as Value Separator\",\n+                                        \"displayName\": \"Custom Format\",\n+                                        \"value\": \"custom\"\n                                     },\n                                     {\n-                                        \"description\": \"SAS (Shared Access Signature) Token generated for accessing resources in the storage account\",\n-                                        \"displayName\": \"SAS Token\",\n-                                        \"value\": \"SAS_TOKEN\"\n+                                        \"description\": \"CSV data follows the RFC 4180 Specification defined at https://tools.ietf.org/html/rfc4180\",\n+                                        \"displayName\": \"RFC 4180\",\n+                                        \"value\": \"rfc-4180\"\n                                     },\n                                     {\n-                                        \"description\": \"Azure Virtual Machine Managed Identity (it can only be used when NiFi is running on Azure)\",\n-                                        \"displayName\": \"Managed Identity\",\n-                                        \"value\": \"MANAGED_IDENTITY\"\n+                                        \"description\": \"CSV data follows the format used by Microsoft Excel\",\n+                                        \"displayName\": \"Microsoft Excel\",\n+                                        \"value\": \"excel\"\n                                     },\n                                     {\n-                                        \"description\": \"Azure Active Directory Service Principal with Client Id / Client Secret of a registered application\",\n-                                        \"displayName\": \"Service Principal\",\n-                                        \"value\": \"SERVICE_PRINCIPAL\"\n+                                        \"description\": \"CSV data is Tab-Delimited instead of Comma Delimited\",\n+                                        \"displayName\": \"Tab-Delimited\",\n+                                        \"value\": \"tdf\"\n+                                    },\n+                                    {\n+                                        \"description\": \"CSV data follows the format used by MySQL\",\n+                                        \"displayName\": \"MySQL Format\",\n+                                        \"value\": \"mysql\"\n+                                    },\n+                                    {\n+                                        \"description\": \"The format used by Informix when issuing the UNLOAD TO file_name command\",\n+                                        \"displayName\": \"Informix Unload\",\n+                                        \"value\": \"informix-unload\"\n+                                    },\n+                                    {\n+                                        \"description\": \"The format used by Informix when issuing the UNLOAD TO file_name command with escaping disabled\",\n+                                        \"displayName\": \"Informix Unload Escape Disabled\",\n+                                        \"value\": \"informix-unload-csv\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"SAS_TOKEN\",\n-                                \"description\": \"Credentials type to be used for authenticating to Azure\",\n-                                \"displayName\": \"Credentials Type\",\n+                                \"defaultValue\": \"custom\",\n+                                \"description\": \"Specifies which \\\"format\\\" the CSV data is in, or specifies if custom formatting should be used.\",\n+                                \"displayName\": \"CSV Format\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"credentials-type\",\n+                                \"name\": \"CSV Format\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"managed-identity-client-id\": {\n+                            \"Comment Marker\": {\n                                 \"dependencies\": [\n                                     {\n                                         \"dependentValues\": [\n-                                            \"MANAGED_IDENTITY\"\n+                                            \"custom\"\n                                         ],\n-                                        \"propertyDisplayName\": \"Credentials Type\",\n-                                        \"propertyName\": \"credentials-type\"\n+                                        \"propertyDisplayName\": \"CSV Format\",\n+                                        \"propertyName\": \"CSV Format\"\n                                     }\n                                 ],\n-                                \"description\": \"Client ID of the managed identity. The property is required when User Assigned Managed Identity is used for authentication. It must be empty in case of System Assigned Managed Identity.\",\n-                                \"displayName\": \"Managed Identity Client ID\",\n+                                \"description\": \"The character that is used to denote the start of a comment. Any line that begins with this comment will be ignored.\",\n+                                \"displayName\": \"Comment Marker\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Comment Marker\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Date Format\": {\n+                                \"description\": \"Specifies the format to use when reading/writing Date fields. If not specified, Date fields will be assumed to be number of milliseconds since epoch (Midnight, Jan 1, 1970 GMT). If specified, the value must match the Java Simple Date Format (for example, MM/dd/yyyy for a two-digit month, followed by a two-digit day, followed by a four-digit year, all separated by '/' characters, as in 01/01/2017).\",\n+                                \"displayName\": \"Date Format\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"managed-identity-client-id\",\n+                                \"name\": \"Date Format\",\n                                 \"required\": false,\n-                                \"sensitive\": true\n+                                \"sensitive\": false\n                             },\n-                            \"proxy-configuration-service\": {\n+                            \"Escape Character\": {\n+                                \"defaultValue\": \"\\\\\",\n                                 \"dependencies\": [\n                                     {\n                                         \"dependentValues\": [\n-                                            \"SERVICE_PRINCIPAL\",\n-                                            \"MANAGED_IDENTITY\"\n+                                            \"custom\"\n                                         ],\n-                                        \"propertyDisplayName\": \"Credentials Type\",\n-                                        \"propertyName\": \"credentials-type\"\n+                                        \"propertyDisplayName\": \"CSV Format\",\n+                                        \"propertyName\": \"CSV Format\"\n                                     }\n                                 ],\n-                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests. Supported proxies: SOCKS, HTTP In case of SOCKS, it is not guaranteed that the selected SOCKS Version will be used by the processor.\",\n-                                \"displayName\": \"Proxy Configuration Service\",\n+                                \"description\": \"The character that is used to escape characters that would otherwise have a specific meaning to the CSV Parser. If the property has been specified via Expression Language but the expression gets evaluated to an invalid Escape Character at runtime, then it will be skipped and the default Escape Character will be used. Setting it to an empty string means no escape character should be used.\",\n+                                \"displayName\": \"Escape Character\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"proxy-configuration-service\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.proxy.ProxyConfigurationService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Escape Character\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n                             },\n-                            \"service-principal-client-id\": {\n+                            \"Null String\": {\n                                 \"dependencies\": [\n                                     {\n                                         \"dependentValues\": [\n-                                            \"SERVICE_PRINCIPAL\"\n+                                            \"custom\"\n                                         ],\n-                                        \"propertyDisplayName\": \"Credentials Type\",\n-                                        \"propertyName\": \"credentials-type\"\n+                                        \"propertyDisplayName\": \"CSV Format\",\n+                                        \"propertyName\": \"CSV Format\"\n                                     }\n                                 ],\n-                                \"description\": \"Client ID (or Application ID) of the Client/Application having the Service Principal. The property is required when Service Principal authentication is used.\",\n-                                \"displayName\": \"Service Principal Client ID\",\n+                                \"description\": \"Specifies a String that, if present as a value in the CSV, should be considered a null field instead of using the literal value.\",\n+                                \"displayName\": \"Null String\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"service-principal-client-id\",\n-                                \"required\": true,\n-                                \"sensitive\": true\n+                                \"name\": \"Null String\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n                             },\n-                            \"service-principal-client-secret\": {\n+                            \"Quote Character\": {\n+                                \"defaultValue\": \"\\\"\",\n                                 \"dependencies\": [\n                                     {\n                                         \"dependentValues\": [\n-                                            \"SERVICE_PRINCIPAL\"\n+                                            \"custom\"\n                                         ],\n-                                        \"propertyDisplayName\": \"Credentials Type\",\n-                                        \"propertyName\": \"credentials-type\"\n+                                        \"propertyDisplayName\": \"CSV Format\",\n+                                        \"propertyName\": \"CSV Format\"\n                                     }\n                                 ],\n-                                \"description\": \"Password of the Client/Application. The property is required when Service Principal authentication is used.\",\n-                                \"displayName\": \"Service Principal Client Secret\",\n+                                \"description\": \"The character that is used to quote values so that escape characters do not have to be used. If the property has been specified via Expression Language but the expression gets evaluated to an invalid Quote Character at runtime, then it will be skipped and the default Quote Character will be used.\",\n+                                \"displayName\": \"Quote Character\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"service-principal-client-secret\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Quote Character\",\n                                 \"required\": true,\n-                                \"sensitive\": true\n+                                \"sensitive\": false\n                             },\n-                            \"service-principal-tenant-id\": {\n+                            \"Record Separator\": {\n+                                \"defaultValue\": \"\\\\n\",\n                                 \"dependencies\": [\n                                     {\n                                         \"dependentValues\": [\n-                                            \"SERVICE_PRINCIPAL\"\n+                                            \"custom\"\n                                         ],\n-                                        \"propertyDisplayName\": \"Credentials Type\",\n-                                        \"propertyName\": \"credentials-type\"\n+                                        \"propertyDisplayName\": \"CSV Format\",\n+                                        \"propertyName\": \"CSV Format\"\n                                     }\n                                 ],\n-                                \"description\": \"Tenant ID of the Azure Active Directory hosting the Service Principal. The property is required when Service Principal authentication is used.\",\n-                                \"displayName\": \"Service Principal Tenant ID\",\n+                                \"description\": \"Specifies the characters to use in order to separate CSV Records\",\n+                                \"displayName\": \"Record Separator\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"service-principal-tenant-id\",\n+                                \"name\": \"Record Separator\",\n                                 \"required\": true,\n-                                \"sensitive\": true\n+                                \"sensitive\": false\n                             },\n-                            \"storage-account-key\": {\n-                                \"dependencies\": [\n+                            \"Skip Header Line\": {\n+                                \"allowableValues\": [\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"ACCOUNT_KEY\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Credentials Type\",\n-                                        \"propertyName\": \"credentials-type\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"description\": \"The storage account key. This is an admin-like password providing access to every container in this account. It is recommended one uses Shared Access Signature (SAS) token instead for fine-grained control with policies.\",\n-                                \"displayName\": \"Account Key\",\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"Specifies whether or not the first line of CSV should be considered a Header or should be considered a record. If the Schema Access Strategy indicates that the columns must be defined in the header, then this property will be ignored, since the header must always be present and won't be processed as a Record. Otherwise, if 'true', then the first line of CSV data will not be processed as a record and if 'false',then the first line will be interpreted as a record.\",\n+                                \"displayName\": \"Treat First Line as Header\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"storage-account-key\",\n+                                \"name\": \"Skip Header Line\",\n                                 \"required\": true,\n-                                \"sensitive\": true\n+                                \"sensitive\": false\n                             },\n-                            \"storage-account-name\": {\n-                                \"description\": \"The storage account name.\",\n-                                \"displayName\": \"Storage Account Name\",\n+                            \"Time Format\": {\n+                                \"description\": \"Specifies the format to use when reading/writing Time fields. If not specified, Time fields will be assumed to be number of milliseconds since epoch (Midnight, Jan 1, 1970 GMT). If specified, the value must match the Java Simple Date Format (for example, HH:mm:ss for a two-digit hour in 24-hour format, followed by a two-digit minute, followed by a two-digit second, all separated by ':' characters, as in 18:04:15).\",\n+                                \"displayName\": \"Time Format\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"storage-account-name\",\n-                                \"required\": true,\n-                                \"sensitive\": true\n+                                \"name\": \"Time Format\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n                             },\n-                            \"storage-endpoint-suffix\": {\n-                                \"defaultValue\": \"blob.core.windows.net\",\n-                                \"description\": \"Storage accounts in public Azure always use a common FQDN suffix. Override this endpoint suffix with a different suffix in certain circumstances (like Azure Stack or non-public Azure regions).\",\n-                                \"displayName\": \"Endpoint Suffix\",\n+                            \"Timestamp Format\": {\n+                                \"description\": \"Specifies the format to use when reading/writing Timestamp fields. If not specified, Timestamp fields will be assumed to be number of milliseconds since epoch (Midnight, Jan 1, 1970 GMT). If specified, the value must match the Java Simple Date Format (for example, MM/dd/yyyy HH:mm:ss for a two-digit month, followed by a two-digit day, followed by a four-digit year, all separated by '/' characters; and then followed by a two-digit hour in 24-hour format, followed by a two-digit minute, followed by a two-digit second, all separated by ':' characters, as in 01/01/2017 18:04:15).\",\n+                                \"displayName\": \"Timestamp Format\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"storage-endpoint-suffix\",\n-                                \"required\": true,\n+                                \"name\": \"Timestamp Format\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"storage-sas-token\": {\n+                            \"Trim Fields\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"true\",\n                                 \"dependencies\": [\n                                     {\n                                         \"dependentValues\": [\n-                                            \"SAS_TOKEN\"\n+                                            \"custom\"\n                                         ],\n-                                        \"propertyDisplayName\": \"Credentials Type\",\n-                                        \"propertyName\": \"credentials-type\"\n+                                        \"propertyDisplayName\": \"CSV Format\",\n+                                        \"propertyName\": \"CSV Format\"\n                                     }\n                                 ],\n-                                \"description\": \"Shared Access Signature token, including the leading '?'. Specify either SAS token (recommended) or Account Key.\",\n-                                \"displayName\": \"SAS Token\",\n+                                \"description\": \"Whether or not white space should be removed from the beginning and end of fields\",\n+                                \"displayName\": \"Trim Fields\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"storage-sas-token\",\n+                                \"name\": \"Trim Fields\",\n                                 \"required\": true,\n-                                \"sensitive\": true\n-                            }\n-                        },\n-                        \"providedApiImplementations\": [\n-                            {\n-                                \"artifact\": \"nifi-azure-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.services.azure.storage.AzureStorageCredentialsService_v12\",\n-                                \"version\": \"1.27.0\"\n-                            }\n-                        ],\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"azure\",\n-                            \"blob\",\n-                            \"cloud\",\n-                            \"credentials\",\n-                            \"microsoft\",\n-                            \"queue\",\n-                            \"storage\"\n-                        ],\n-                        \"type\": \"org.apache.nifi.services.azure.storage.AzureStorageCredentialsControllerService_v12\",\n-                        \"typeDescription\": \"Provides credentials for Azure Storage processors using Azure Storage client library v12.\",\n-                        \"version\": \"1.27.0\"\n-                    },\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-azure-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"e0c4461\"\n-                        },\n-                        \"group\": \"org.apache.nifi\",\n-                        \"propertyDescriptors\": {\n-                            \"azurite-uri\": {\n-                                \"description\": \"URI to connect to Azure Storage Emulator (Azurite)\",\n-                                \"displayName\": \"Storage Emulator URI\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"azurite-uri\",\n-                                \"required\": false,\n                                 \"sensitive\": false\n-                            }\n-                        },\n-                        \"providedApiImplementations\": [\n-                            {\n-                                \"artifact\": \"nifi-azure-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.services.azure.storage.AzureStorageCredentialsService\",\n-                                \"version\": \"1.27.0\"\n-                            }\n-                        ],\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"azure\",\n-                            \"blob\",\n-                            \"credentials\",\n-                            \"emulator\",\n-                            \"microsoft\",\n-                            \"queue\",\n-                            \"storage\"\n-                        ],\n-                        \"type\": \"org.apache.nifi.services.azure.storage.AzureStorageEmulatorCredentialsControllerService\",\n-                        \"typeDescription\": \"Defines credentials for Azure Storage processors that connects to Azurite emulator.\",\n-                        \"version\": \"1.27.0\"\n-                    }\n-                ],\n-                \"processors\": [\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-azure-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"e0c4461\"\n-                        },\n-                        \"defaultBulletinLevel\": \"WARN\",\n-                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": 1,\n-                            \"EVENT_DRIVEN\": 0,\n-                            \"TIMER_DRIVEN\": 1\n-                        },\n-                        \"defaultPenaltyDuration\": \"30 sec\",\n-                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"0 sec\"\n-                        },\n-                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n-                        \"defaultYieldDuration\": \"1 sec\",\n-                        \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_REQUIRED\",\n-                        \"primaryNodeOnly\": false,\n-                        \"propertyDescriptors\": {\n-                            \"azure-cosmos-db-conflict-handling-strategy\": {\n+                            },\n+                            \"Trim double quote\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Conflicting records will not be inserted, and FlowFile will not be routed to failure\",\n-                                        \"displayName\": \"Ignore\",\n-                                        \"value\": \"IGNORE\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n-                                        \"description\": \"Conflicting records will be upserted, and FlowFile will not be routed to failure\",\n-                                        \"displayName\": \"Upsert\",\n-                                        \"value\": \"UPSERT\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"IGNORE\",\n-                                \"description\": \"Choose whether to ignore or upsert when conflict error occurs during insertion\",\n-                                \"displayName\": \"Cosmos DB Conflict Handling Strategy\",\n+                                \"defaultValue\": \"true\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"rfc-4180\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"CSV Format\",\n+                                        \"propertyName\": \"CSV Format\"\n+                                    }\n+                                ],\n+                                \"description\": \"Whether or not to trim starting and ending double quotes. For example: with trim string '\\\"test\\\"' would be parsed to 'test', without trim would be parsed to '\\\"test\\\"'.If set to 'false' it means full compliance with RFC-4180. Default value is true, with trim.\",\n+                                \"displayName\": \"Trim double quote\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"azure-cosmos-db-conflict-handling-strategy\",\n-                                \"required\": false,\n+                                \"name\": \"Trim double quote\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"azure-cosmos-db-connection-service\": {\n-                                \"description\": \"If configured, the controller service used to obtain the connection string and access key\",\n-                                \"displayName\": \"Cosmos DB Connection Service\",\n+                            \"Value Separator\": {\n+                                \"defaultValue\": \",\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"custom\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"CSV Format\",\n+                                        \"propertyName\": \"CSV Format\"\n+                                    }\n+                                ],\n+                                \"description\": \"The character that is used to separate values/fields in a CSV Record. If the property has been specified via Expression Language but the expression gets evaluated to an invalid Value Separator at runtime, then it will be skipped and the default Value Separator will be used.\",\n+                                \"displayName\": \"Value Separator\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"azure-cosmos-db-connection-service\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-azure-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.services.azure.cosmos.AzureCosmosDBConnectionService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Value Separator\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n                             },\n-                            \"azure-cosmos-db-consistency-level\": {\n+                            \"csv-reader-csv-parser\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"STRONG\",\n-                                        \"value\": \"STRONG\"\n+                                        \"description\": \"The CSV parser implementation from the Apache Commons CSV library.\",\n+                                        \"displayName\": \"Apache Commons CSV\",\n+                                        \"value\": \"commons-csv\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"BOUNDED_STALENESS\",\n-                                        \"value\": \"BOUNDED_STALENESS\"\n-                                    },\n+                                        \"description\": \"The CSV parser implementation from the Jackson Dataformats library.\",\n+                                        \"displayName\": \"Jackson CSV\",\n+                                        \"value\": \"jackson-csv\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"commons-csv\",\n+                                \"description\": \"Specifies which parser to use to read CSV records. NOTE: Different parsers may support different subsets of functionality and may also exhibit different levels of performance.\",\n+                                \"displayName\": \"CSV Parser\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"csv-reader-csv-parser\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"csvutils-allow-duplicate-header-names\": {\n+                                \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"SESSION\",\n-                                        \"value\": \"SESSION\"\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"CONSISTENT_PREFIX\",\n-                                        \"value\": \"CONSISTENT_PREFIX\"\n-                                    },\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"true\",\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"EVENTUAL\",\n-                                        \"value\": \"EVENTUAL\"\n+                                        \"dependentValues\": [\n+                                            \"custom\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"CSV Format\",\n+                                        \"propertyName\": \"CSV Format\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"SESSION\",\n-                                \"description\": \"Choose from five consistency levels on the consistency spectrum. Refer to Cosmos DB documentation for their differences\",\n-                                \"displayName\": \"Cosmos DB Consistency Level\",\n+                                \"description\": \"Whether duplicate header names are allowed. Header names are case-sensitive, for example \\\"name\\\" and \\\"Name\\\" are treated as separate fields. Handling of duplicate header names is CSV Parser specific (where applicable):\\n* Apache Commons CSV - duplicate headers will result in column data \\\"shifting\\\" right with new fields created for \\\"unknown_field_index_X\\\" where \\\"X\\\" is the CSV column index number\\n* Jackson CSV - duplicate headers will be de-duplicated with the field value being that of the right-most duplicate CSV column\",\n+                                \"displayName\": \"Allow Duplicate Header Names\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"azure-cosmos-db-consistency-level\",\n+                                \"name\": \"csvutils-allow-duplicate-header-names\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"azure-cosmos-db-container-id\": {\n-                                \"description\": \"The unique identifier for the container\",\n-                                \"displayName\": \"Cosmos DB Container ID\",\n+                            \"csvutils-character-set\": {\n+                                \"defaultValue\": \"UTF-8\",\n+                                \"description\": \"The Character Encoding that is used to encode/decode the CSV file\",\n+                                \"displayName\": \"Character Set\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"azure-cosmos-db-container-id\",\n+                                \"name\": \"csvutils-character-set\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"azure-cosmos-db-key\": {\n-                                \"description\": \"Cosmos DB Access Key from Azure Portal (Settings->Keys). Choose a read-write key to enable database or container creation at run time\",\n-                                \"displayName\": \"Cosmos DB Access Key\",\n+                            \"ignore-csv-header\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"If the first line of a CSV is a header, and the configured schema does not match the fields named in the header line, this controls how the Reader will interpret the fields. If this property is true, then the field names mapped to each column are driven only by the configured schema and any fields not in the schema will be ignored. If this property is false, then the field names found in the CSV Header will be used as the names of the fields.\",\n+                                \"displayName\": \"Ignore CSV Header Column Names\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"azure-cosmos-db-key\",\n+                                \"name\": \"ignore-csv-header\",\n                                 \"required\": false,\n-                                \"sensitive\": true\n-                            },\n-                            \"azure-cosmos-db-name\": {\n-                                \"description\": \"The database name or id. This is used as the namespace for document collections or containers\",\n-                                \"displayName\": \"Cosmos DB Name\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"azure-cosmos-db-name\",\n-                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"azure-cosmos-db-partition-key\": {\n-                                \"description\": \"The partition key used to distribute data among servers\",\n-                                \"displayName\": \"Cosmos DB Partition Key\",\n+                            \"schema-access-strategy\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"The name of the Schema to use is specified by the 'Schema Name' Property. The value of this property is used to lookup the Schema in the configured Schema Registry service.\",\n+                                        \"displayName\": \"Use 'Schema Name' Property\",\n+                                        \"value\": \"schema-name\"\n+                                    },\n+                                    {\n+                                        \"description\": \"The text of the Schema itself is specified by the 'Schema Text' Property. The value of this property must be a valid Avro Schema. If Expression Language is used, the value of the 'Schema Text' property must be valid after substituting the expressions.\",\n+                                        \"displayName\": \"Use 'Schema Text' Property\",\n+                                        \"value\": \"schema-text-property\"\n+                                    },\n+                                    {\n+                                        \"description\": \"The FlowFile contains 3 Attributes that will be used to lookup a Schema from the configured Schema Registry: 'schema.identifier', 'schema.version', and 'schema.protocol.version'\",\n+                                        \"displayName\": \"HWX Schema Reference Attributes\",\n+                                        \"value\": \"hwx-schema-ref-attributes\"\n+                                    },\n+                                    {\n+                                        \"description\": \"The content of the FlowFile contains a reference to a schema in the Schema Registry service. The reference is encoded as a single byte indicating the 'protocol version', followed by 8 bytes indicating the schema identifier, and finally 4 bytes indicating the schema version, as per the Hortonworks Schema Registry serializers and deserializers, found at https://github.com/hortonworks/registry\",\n+                                        \"displayName\": \"HWX Content-Encoded Schema Reference\",\n+                                        \"value\": \"hwx-content-encoded-schema\"\n+                                    },\n+                                    {\n+                                        \"description\": \"The content of the FlowFile contains a reference to a schema in the Schema Registry service. The reference is encoded as a single 'Magic Byte' followed by 4 bytes representing the identifier of the schema, as outlined at http://docs.confluent.io/current/schema-registry/docs/serializer-formatter.html. This is based on version 3.2.x of the Confluent Schema Registry.\",\n+                                        \"displayName\": \"Confluent Content-Encoded Schema Reference\",\n+                                        \"value\": \"confluent-encoded\"\n+                                    },\n+                                    {\n+                                        \"description\": \"The first non-comment line of the CSV file is a header line that contains the names of the columns. The schema will be derived by using the column names in the header and assuming that all columns are of type String.\",\n+                                        \"displayName\": \"Use String Fields From Header\",\n+                                        \"value\": \"csv-header-derived\"\n+                                    },\n+                                    {\n+                                        \"description\": \"The Schema of the data will be inferred automatically when the data is read. See component Usage and Additional Details for information about how the schema is inferred.\",\n+                                        \"displayName\": \"Infer Schema\",\n+                                        \"value\": \"infer-schema\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"infer-schema\",\n+                                \"description\": \"Specifies how to obtain the schema that is to be used for interpreting the data.\",\n+                                \"displayName\": \"Schema Access Strategy\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"azure-cosmos-db-partition-key\",\n+                                \"name\": \"schema-access-strategy\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"azure-cosmos-db-uri\": {\n-                                \"description\": \"Cosmos DB URI, typically in the form of https://{databaseaccount}.documents.azure.com:443/ Note this host URL is for Cosmos DB with Core SQL API from Azure Portal (Overview->URI)\",\n-                                \"displayName\": \"Cosmos DB URI\",\n+                            \"schema-branch\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"schema-name\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n+                                        \"propertyName\": \"schema-access-strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"Specifies the name of the branch to use when looking up the schema in the Schema Registry property. If the chosen Schema Registry does not support branching, this value will be ignored.\",\n+                                \"displayName\": \"Schema Branch\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"azure-cosmos-db-uri\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"schema-branch\",\n                                 \"required\": false,\n-                                \"sensitive\": true\n+                                \"sensitive\": false\n                             },\n-                            \"insert-batch-size\": {\n-                                \"defaultValue\": \"20\",\n-                                \"description\": \"The number of records to group together for one single insert operation against Cosmos DB\",\n-                                \"displayName\": \"Insert Batch Size\",\n+                            \"schema-name\": {\n+                                \"defaultValue\": \"${schema.name}\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"schema-name\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n+                                        \"propertyName\": \"schema-access-strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"Specifies the name of the schema to lookup in the Schema Registry property\",\n+                                \"displayName\": \"Schema Name\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"insert-batch-size\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"schema-name\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"record-reader\": {\n-                                \"description\": \"Specifies the Controller Service to use for parsing incoming data and determining the data's schema\",\n-                                \"displayName\": \"Record Reader\",\n+                            \"schema-registry\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"confluent-encoded\",\n+                                            \"schema-name\",\n+                                            \"hwx-schema-ref-attributes\",\n+                                            \"hwx-content-encoded-schema\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n+                                        \"propertyName\": \"schema-access-strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"Specifies the Controller Service to use for the Schema Registry\",\n+                                \"displayName\": \"Schema Registry\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"record-reader\",\n-                                \"required\": true,\n+                                \"name\": \"schema-registry\",\n+                                \"required\": false,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n                                     \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n+                                    \"type\": \"org.apache.nifi.schemaregistry.services.SchemaRegistry\",\n                                     \"version\": \"1.27.0\"\n                                 }\n+                            },\n+                            \"schema-text\": {\n+                                \"defaultValue\": \"${avro.schema}\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"schema-text-property\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n+                                        \"propertyName\": \"schema-access-strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"The text of an Avro-formatted Schema\",\n+                                \"displayName\": \"Schema Text\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"schema-text\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"schema-version\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"schema-name\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n+                                        \"propertyName\": \"schema-access-strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"Specifies the version of the schema to lookup in the Schema Registry. If not specified then the latest version of the schema will be retrieved.\",\n+                                \"displayName\": \"Schema Version\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"schema-version\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n                             }\n                         },\n-                        \"sideEffectFree\": false,\n-                        \"supportedRelationships\": [\n-                            {\n-                                \"description\": \"All FlowFiles that are written to Cosmos DB are routed to this relationship\",\n-                                \"name\": \"success\"\n-                            },\n+                        \"providedApiImplementations\": [\n                             {\n-                                \"description\": \"All FlowFiles that cannot be written to Cosmos DB are routed to this relationship\",\n-                                \"name\": \"failure\"\n+                                \"artifact\": \"nifi-standard-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n+                                \"version\": \"1.27.0\"\n                             }\n                         ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\",\n-                            \"EVENT_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n-                        \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": true,\n                         \"supportsSensitiveDynamicProperties\": false,\n-                        \"systemResourceConsiderations\": [\n-                            {\n-                                \"description\": \"An instance of this component can cause high usage of this system resource.  Multiple instances or high concurrency settings may result a degradation of performance.\",\n-                                \"resource\": \"MEMORY\"\n-                            }\n-                        ],\n                         \"tags\": [\n-                            \"azure\",\n-                            \"cosmos\",\n-                            \"insert\",\n-                            \"put\",\n-                            \"record\"\n+                            \"comma\",\n+                            \"csv\",\n+                            \"delimited\",\n+                            \"parse\",\n+                            \"reader\",\n+                            \"record\",\n+                            \"row\",\n+                            \"separated\",\n+                            \"values\"\n                         ],\n-                        \"triggerSerially\": false,\n-                        \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.azure.cosmos.document.PutAzureCosmosDBRecord\",\n-                        \"typeDescription\": \"This processor is a record-aware processor for inserting data into Cosmos DB with Core SQL API. It uses a configured record reader and schema to read an incoming record set from the body of a Flowfile and then inserts those records into a configured Cosmos DB Container.\",\n+                        \"type\": \"org.apache.nifi.csv.CSVReader\",\n+                        \"typeDescription\": \"Parses CSV-formatted data, returning each row in the CSV file as a separate record. This reader allows for inferring a schema based on the first line of the CSV, if a 'header line' is present, or providing an explicit schema for interpreting the values. See Controller Service's Usage for further documentation.\",\n                         \"version\": \"1.27.0\"\n                     },\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-azure-nar\",\n+                        \"artifact\": \"nifi-record-serialization-services-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n-                        \"defaultBulletinLevel\": \"WARN\",\n-                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": 1,\n-                            \"TIMER_DRIVEN\": 1\n-                        },\n-                        \"defaultPenaltyDuration\": \"30 sec\",\n-                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"0 sec\"\n-                        },\n-                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n-                        \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n-                        \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Service Bus Endpoint\": {\n+                            \"CSV Format\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Servicebus endpoint for general use\",\n-                                        \"displayName\": \"Azure\",\n-                                        \"value\": \".servicebus.windows.net\"\n+                                        \"description\": \"The format of the CSV is configured by using the properties of this Controller Service, such as Value Separator\",\n+                                        \"displayName\": \"Custom Format\",\n+                                        \"value\": \"custom\"\n                                     },\n                                     {\n-                                        \"description\": \"Servicebus endpoint for China\",\n-                                        \"displayName\": \"Azure China\",\n-                                        \"value\": \".servicebus.chinacloudapi.cn\"\n+                                        \"description\": \"CSV data follows the RFC 4180 Specification defined at https://tools.ietf.org/html/rfc4180\",\n+                                        \"displayName\": \"RFC 4180\",\n+                                        \"value\": \"rfc-4180\"\n                                     },\n                                     {\n-                                        \"description\": \"Servicebus endpoint for Germany\",\n-                                        \"displayName\": \"Azure Germany\",\n-                                        \"value\": \".servicebus.cloudapi.de\"\n+                                        \"description\": \"CSV data follows the format used by Microsoft Excel\",\n+                                        \"displayName\": \"Microsoft Excel\",\n+                                        \"value\": \"excel\"\n                                     },\n                                     {\n-                                        \"description\": \"Servicebus endpoint for US Government\",\n-                                        \"displayName\": \"Azure US Government\",\n-                                        \"value\": \".servicebus.usgovcloudapi.net\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \".servicebus.windows.net\",\n-                                \"description\": \"To support namespaces not in the default windows.net domain.\",\n-                                \"displayName\": \"Service Bus Endpoint\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Service Bus Endpoint\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Transport Type\": {\n-                                \"allowableValues\": [\n+                                        \"description\": \"CSV data is Tab-Delimited instead of Comma Delimited\",\n+                                        \"displayName\": \"Tab-Delimited\",\n+                                        \"value\": \"tdf\"\n+                                    },\n                                     {\n-                                        \"description\": \"AMQP over TCP on ports 5671 and 5672\",\n-                                        \"displayName\": \"AMQP\",\n-                                        \"value\": \"Amqp\"\n+                                        \"description\": \"CSV data follows the format used by MySQL\",\n+                                        \"displayName\": \"MySQL Format\",\n+                                        \"value\": \"mysql\"\n                                     },\n                                     {\n-                                        \"description\": \"AMQP over HTTPS with WebSockets on port 443\",\n-                                        \"displayName\": \"AMQP_WEB_SOCKETS\",\n-                                        \"value\": \"AmqpWebSockets\"\n+                                        \"description\": \"The format used by Informix when issuing the UNLOAD TO file_name command\",\n+                                        \"displayName\": \"Informix Unload\",\n+                                        \"value\": \"informix-unload\"\n+                                    },\n+                                    {\n+                                        \"description\": \"The format used by Informix when issuing the UNLOAD TO file_name command with escaping disabled\",\n+                                        \"displayName\": \"Informix Unload Escape Disabled\",\n+                                        \"value\": \"informix-unload-csv\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"Amqp\",\n-                                \"description\": \"Advanced Message Queuing Protocol Transport Type for communication with Azure Event Hubs\",\n-                                \"displayName\": \"Transport Type\",\n+                                \"defaultValue\": \"custom\",\n+                                \"description\": \"Specifies which \\\"format\\\" the CSV data is in, or specifies if custom formatting should be used.\",\n+                                \"displayName\": \"CSV Format\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Transport Type\",\n+                                \"name\": \"CSV Format\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"checkpoint-strategy\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"Use Azure Blob Storage to store partition ownership and checkpoint information\",\n-                                        \"displayName\": \"Azure Blob Storage\",\n-                                        \"value\": \"AZURE_BLOB_STORAGE\"\n-                                    },\n+                            \"Comment Marker\": {\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"Use component state to store partition ownership and checkpoint information\",\n-                                        \"displayName\": \"Component State\",\n-                                        \"value\": \"COMPONENT_STATE\"\n+                                        \"dependentValues\": [\n+                                            \"custom\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"CSV Format\",\n+                                        \"propertyName\": \"CSV Format\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"AZURE_BLOB_STORAGE\",\n-                                \"description\": \"Specifies which strategy to use for storing and retrieving partition ownership and checkpoint information for each partition.\",\n-                                \"displayName\": \"Checkpoint Strategy\",\n+                                \"description\": \"The character that is used to denote the start of a comment. Any line that begins with this comment will be ignored.\",\n+                                \"displayName\": \"Comment Marker\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"checkpoint-strategy\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Comment Marker\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"event-hub-batch-size\": {\n-                                \"defaultValue\": \"10\",\n-                                \"description\": \"The number of messages to process within a NiFi session. This parameter affects throughput and consistency. NiFi commits its session and Event Hubs checkpoints after processing this number of messages. If NiFi session is committed, but fails to create an Event Hubs checkpoint, then it is possible that the same messages will be received again. The higher number, the higher throughput, but possibly less consistent.\",\n-                                \"displayName\": \"Batch Size\",\n+                            \"Date Format\": {\n+                                \"description\": \"Specifies the format to use when reading/writing Date fields. If not specified, Date fields will be assumed to be number of milliseconds since epoch (Midnight, Jan 1, 1970 GMT). If specified, the value must match the Java Simple Date Format (for example, MM/dd/yyyy for a two-digit month, followed by a two-digit day, followed by a four-digit year, all separated by '/' characters, as in 01/01/2017).\",\n+                                \"displayName\": \"Date Format\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"event-hub-batch-size\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Date Format\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"event-hub-consumer-group\": {\n-                                \"defaultValue\": \"$Default\",\n-                                \"description\": \"The name of the consumer group to use.\",\n-                                \"displayName\": \"Consumer Group\",\n+                            \"Escape Character\": {\n+                                \"defaultValue\": \"\\\\\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"custom\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"CSV Format\",\n+                                        \"propertyName\": \"CSV Format\"\n+                                    }\n+                                ],\n+                                \"description\": \"The character that is used to escape characters that would otherwise have a specific meaning to the CSV Parser. If the property has been specified via Expression Language but the expression gets evaluated to an invalid Escape Character at runtime, then it will be skipped and the default Escape Character will be used. Setting it to an empty string means no escape character should be used.\",\n+                                \"displayName\": \"Escape Character\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"event-hub-consumer-group\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Escape Character\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"event-hub-consumer-hostname\": {\n-                                \"description\": \"DEPRECATED: This property is no longer used.\",\n-                                \"displayName\": \"Consumer Hostname\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"event-hub-consumer-hostname\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"event-hub-initial-offset\": {\n+                            \"Include Header Line\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Read from the oldest message retained in the stream.\",\n-                                        \"displayName\": \"Start of stream\",\n-                                        \"value\": \"start-of-stream\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n-                                        \"description\": \"Ignore old retained messages even if exist, start reading new ones from now.\",\n-                                        \"displayName\": \"End of stream\",\n-                                        \"value\": \"end-of-stream\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"end-of-stream\",\n-                                \"description\": \"Specify where to start receiving messages if offset is not yet stored in the checkpoint store.\",\n-                                \"displayName\": \"Initial Offset\",\n+                                \"defaultValue\": \"true\",\n+                                \"description\": \"Specifies whether or not the CSV column names should be written out as the first line.\",\n+                                \"displayName\": \"Include Header Line\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"event-hub-initial-offset\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"event-hub-message-receive-timeout\": {\n-                                \"defaultValue\": \"1 min\",\n-                                \"description\": \"The amount of time this consumer should wait to receive the Batch Size before returning.\",\n-                                \"displayName\": \"Message Receive Timeout\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"event-hub-message-receive-timeout\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"event-hub-name\": {\n-                                \"description\": \"The name of the event hub to pull messages from.\",\n-                                \"displayName\": \"Event Hub Name\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"event-hub-name\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"event-hub-namespace\": {\n-                                \"description\": \"The namespace that the Azure Event Hubs is assigned to. This is generally equal to <Event Hub Names>-ns.\",\n-                                \"displayName\": \"Event Hub Namespace\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"event-hub-namespace\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"event-hub-prefetch-count\": {\n-                                \"defaultValue\": \"300\",\n-                                \"description\": \"\",\n-                                \"displayName\": \"Prefetch Count\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"event-hub-prefetch-count\",\n+                                \"name\": \"Include Header Line\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"event-hub-shared-access-policy-name\": {\n-                                \"description\": \"The name of the shared access policy. This policy must have Listen claims.\",\n-                                \"displayName\": \"Shared Access Policy Name\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"event-hub-shared-access-policy-name\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"event-hub-shared-access-policy-primary-key\": {\n-                                \"description\": \"The key of the shared access policy. Either the primary or the secondary key can be used.\",\n-                                \"displayName\": \"Shared Access Policy Key\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"event-hub-shared-access-policy-primary-key\",\n-                                \"required\": false,\n-                                \"sensitive\": true\n-                            },\n-                            \"proxy-configuration-service\": {\n+                            \"Include Trailing Delimiter\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"false\",\n                                 \"dependencies\": [\n                                     {\n                                         \"dependentValues\": [\n-                                            \"AmqpWebSockets\"\n+                                            \"custom\"\n                                         ],\n-                                        \"propertyDisplayName\": \"Transport Type\",\n-                                        \"propertyName\": \"Transport Type\"\n+                                        \"propertyDisplayName\": \"CSV Format\",\n+                                        \"propertyName\": \"CSV Format\"\n                                     }\n                                 ],\n-                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests. Supported proxies: HTTP + AuthN\",\n-                                \"displayName\": \"Proxy Configuration Service\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"proxy-configuration-service\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.proxy.ProxyConfigurationService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            },\n-                            \"record-reader\": {\n-                                \"description\": \"The Record Reader to use for reading received messages. The event hub name can be referred by Expression Language '${eventhub.name}' to access a schema.\",\n-                                \"displayName\": \"Record Reader\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"record-reader\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            },\n-                            \"record-writer\": {\n-                                \"description\": \"The Record Writer to use for serializing Records to an output FlowFile. The event hub name can be referred by Expression Language '${eventhub.name}' to access a schema. If not specified, each message will create a FlowFile.\",\n-                                \"displayName\": \"Record Writer\",\n+                                \"description\": \"If true, a trailing delimiter will be added to each CSV Record that is written. If false, the trailing delimiter will be omitted.\",\n+                                \"displayName\": \"Include Trailing Delimiter\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"record-writer\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n+                                \"name\": \"Include Trailing Delimiter\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n                             },\n-                            \"storage-account-key\": {\n+                            \"Null String\": {\n                                 \"dependencies\": [\n                                     {\n                                         \"dependentValues\": [\n-                                            \"AZURE_BLOB_STORAGE\"\n+                                            \"custom\"\n                                         ],\n-                                        \"propertyDisplayName\": \"Checkpoint Strategy\",\n-                                        \"propertyName\": \"checkpoint-strategy\"\n+                                        \"propertyDisplayName\": \"CSV Format\",\n+                                        \"propertyName\": \"CSV Format\"\n                                     }\n                                 ],\n-                                \"description\": \"The Azure Storage account key to store event hub consumer group state.\",\n-                                \"displayName\": \"Storage Account Key\",\n+                                \"description\": \"Specifies a String that, if present as a value in the CSV, should be considered a null field instead of using the literal value.\",\n+                                \"displayName\": \"Null String\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"storage-account-key\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Null String\",\n                                 \"required\": false,\n-                                \"sensitive\": true\n+                                \"sensitive\": false\n                             },\n-                            \"storage-account-name\": {\n+                            \"Quote Character\": {\n+                                \"defaultValue\": \"\\\"\",\n                                 \"dependencies\": [\n                                     {\n                                         \"dependentValues\": [\n-                                            \"AZURE_BLOB_STORAGE\"\n+                                            \"custom\"\n                                         ],\n-                                        \"propertyDisplayName\": \"Checkpoint Strategy\",\n-                                        \"propertyName\": \"checkpoint-strategy\"\n+                                        \"propertyDisplayName\": \"CSV Format\",\n+                                        \"propertyName\": \"CSV Format\"\n                                     }\n                                 ],\n-                                \"description\": \"Name of the Azure Storage account to store event hub consumer group state.\",\n-                                \"displayName\": \"Storage Account Name\",\n+                                \"description\": \"The character that is used to quote values so that escape characters do not have to be used. If the property has been specified via Expression Language but the expression gets evaluated to an invalid Quote Character at runtime, then it will be skipped and the default Quote Character will be used.\",\n+                                \"displayName\": \"Quote Character\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"storage-account-name\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Quote Character\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"storage-container-name\": {\n+                            \"Quote Mode\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"All values will be quoted using the configured quote character.\",\n+                                        \"displayName\": \"Quote All Values\",\n+                                        \"value\": \"ALL\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Values will be quoted only if they are contain special characters such as newline characters or field separators.\",\n+                                        \"displayName\": \"Quote Minimal\",\n+                                        \"value\": \"MINIMAL\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Values will be quoted unless the value is a number.\",\n+                                        \"displayName\": \"Quote Non-Numeric Values\",\n+                                        \"value\": \"NON_NUMERIC\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Values will not be quoted. Instead, all special characters will be escaped using the configured escape character.\",\n+                                        \"displayName\": \"Do Not Quote Values\",\n+                                        \"value\": \"NONE\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"MINIMAL\",\n                                 \"dependencies\": [\n                                     {\n                                         \"dependentValues\": [\n-                                            \"AZURE_BLOB_STORAGE\"\n+                                            \"custom\"\n                                         ],\n-                                        \"propertyDisplayName\": \"Checkpoint Strategy\",\n-                                        \"propertyName\": \"checkpoint-strategy\"\n+                                        \"propertyDisplayName\": \"CSV Format\",\n+                                        \"propertyName\": \"CSV Format\"\n                                     }\n                                 ],\n-                                \"description\": \"Name of the Azure Storage container to store the event hub consumer group state. If not specified, event hub name is used.\",\n-                                \"displayName\": \"Storage Container Name\",\n+                                \"description\": \"Specifies how fields should be quoted when they are written\",\n+                                \"displayName\": \"Quote Mode\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"storage-container-name\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Quote Mode\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"storage-sas-token\": {\n+                            \"Record Separator\": {\n+                                \"defaultValue\": \"\\\\n\",\n                                 \"dependencies\": [\n                                     {\n                                         \"dependentValues\": [\n-                                            \"AZURE_BLOB_STORAGE\"\n+                                            \"custom\"\n                                         ],\n-                                        \"propertyDisplayName\": \"Checkpoint Strategy\",\n-                                        \"propertyName\": \"checkpoint-strategy\"\n+                                        \"propertyDisplayName\": \"CSV Format\",\n+                                        \"propertyName\": \"CSV Format\"\n                                     }\n                                 ],\n-                                \"description\": \"The Azure Storage SAS token to store Event Hub consumer group state. Always starts with a ? character.\",\n-                                \"displayName\": \"Storage SAS Token\",\n+                                \"description\": \"Specifies the characters to use in order to separate CSV Records\",\n+                                \"displayName\": \"Record Separator\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"storage-sas-token\",\n-                                \"required\": false,\n-                                \"sensitive\": true\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Record Separator\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n                             },\n-                            \"use-managed-identity\": {\n+                            \"Schema Write Strategy\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"description\": \"Do not add any schema-related information to the FlowFile.\",\n+                                        \"displayName\": \"Do Not Write Schema\",\n+                                        \"value\": \"no-schema\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"description\": \"The FlowFile will be given an attribute named 'schema.name' and this attribute will indicate the name of the schema in the Schema Registry. Note that ifthe schema for a record is not obtained from a Schema Registry, then no attribute will be added.\",\n+                                        \"displayName\": \"Set 'schema.name' Attribute\",\n+                                        \"value\": \"schema-name\"\n+                                    },\n+                                    {\n+                                        \"description\": \"The FlowFile will be given an attribute named 'avro.schema' and this attribute will contain the Avro Schema that describes the records in the FlowFile. The contents of the FlowFile need not be Avro, but the text of the schema will be used.\",\n+                                        \"displayName\": \"Set 'avro.schema' Attribute\",\n+                                        \"value\": \"full-schema-attribute\"\n+                                    },\n+                                    {\n+                                        \"description\": \"The FlowFile will be given a set of 3 attributes to describe the schema: 'schema.identifier', 'schema.version', and 'schema.protocol.version'. Note that if the schema for a record does not contain the necessary identifier and version, an Exception will be thrown when attempting to write the data.\",\n+                                        \"displayName\": \"HWX Schema Reference Attributes\",\n+                                        \"value\": \"hwx-schema-ref-attributes\"\n+                                    },\n+                                    {\n+                                        \"description\": \"The content of the FlowFile will contain a reference to a schema in the Schema Registry service. The reference is encoded as a single byte indicating the 'protocol version', followed by 8 bytes indicating the schema identifier, and finally 4 bytes indicating the schema version, as per the Hortonworks Schema Registry serializers and deserializers, as found at https://github.com/hortonworks/registry. This will be prepended to each FlowFile. Note that if the schema for a record does not contain the necessary identifier and version, an Exception will be thrown when attempting to write the data.\",\n+                                        \"displayName\": \"HWX Content-Encoded Schema Reference\",\n+                                        \"value\": \"hwx-content-encoded-schema\"\n+                                    },\n+                                    {\n+                                        \"description\": \"The content of the FlowFile will contain a reference to a schema in the Schema Registry service. The reference is encoded as a single 'Magic Byte' followed by 4 bytes representing the identifier of the schema, as outlined at http://docs.confluent.io/current/schema-registry/docs/serializer-formatter.html. This will be prepended to each FlowFile. Note that if the schema for a record does not contain the necessary identifier and version, an Exception will be thrown when attempting to write the data. This is based on the encoding used by version 3.2.x of the Confluent Schema Registry.\",\n+                                        \"displayName\": \"Confluent Schema Registry Reference\",\n+                                        \"value\": \"confluent-encoded\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"Choose whether or not to use the managed identity of Azure VM/VMSS\",\n-                                \"displayName\": \"Use Azure Managed Identity\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"use-managed-identity\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            }\n-                        },\n-                        \"sideEffectFree\": false,\n-                        \"stateful\": {\n-                            \"description\": \"Local state is used to store the client id. Cluster state is used to store partition ownership and checkpoint information when component state is configured as the checkpointing strategy.\",\n-                            \"scopes\": [\n-                                \"CLUSTER\",\n-                                \"LOCAL\"\n-                            ]\n-                        },\n-                        \"supportedRelationships\": [\n-                            {\n-                                \"description\": \"FlowFiles received from Event Hub.\",\n-                                \"name\": \"success\"\n-                            },\n-                            {\n-                                \"description\": \"If a message from event hub cannot be parsed using the configured Record Reader or failed to be written by the configured Record Writer, the contents of the message will be routed to this Relationship as its own individual FlowFile.\",\n-                                \"name\": \"parse.failure\"\n-                            }\n-                        ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": false,\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": false,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"azure\",\n-                            \"cloud\",\n-                            \"eventhub\",\n-                            \"events\",\n-                            \"microsoft\",\n-                            \"streaming\",\n-                            \"streams\"\n-                        ],\n-                        \"triggerSerially\": true,\n-                        \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.azure.eventhub.ConsumeAzureEventHub\",\n-                        \"typeDescription\": \"Receives messages from Microsoft Azure Event Hubs with checkpointing to ensure consistent event processing. Checkpoint tracking avoids consuming a message multiple times and enables reliable resumption of processing in the event of intermittent network failures. Checkpoint tracking requires external storage and provides the preferred approach to consuming messages from Azure Event Hubs. In clustered environment, ConsumeAzureEventHub processor instances form a consumer group and the messages are distributed among the cluster nodes (each message is processed on one cluster node only).\",\n-                        \"version\": \"1.27.0\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"The time (in milliseconds since epoch, UTC) at which the message was enqueued in the event hub\",\n-                                \"name\": \"eventhub.enqueued.timestamp\"\n-                            },\n-                            {\n-                                \"description\": \"The offset into the partition at which the message was stored\",\n-                                \"name\": \"eventhub.offset\"\n-                            },\n-                            {\n-                                \"description\": \"The sequence number associated with the message\",\n-                                \"name\": \"eventhub.sequence\"\n-                            },\n-                            {\n-                                \"description\": \"The name of the event hub from which the message was pulled\",\n-                                \"name\": \"eventhub.name\"\n-                            },\n-                            {\n-                                \"description\": \"The name of the partition from which the message was pulled\",\n-                                \"name\": \"eventhub.partition\"\n-                            },\n-                            {\n-                                \"description\": \"The application properties of this message. IE: 'application' would be 'eventhub.property.application'\",\n-                                \"name\": \"eventhub.property.*\"\n-                            }\n-                        ]\n-                    },\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-azure-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"e0c4461\"\n-                        },\n-                        \"defaultBulletinLevel\": \"WARN\",\n-                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": 1,\n-                            \"TIMER_DRIVEN\": 1\n-                        },\n-                        \"defaultPenaltyDuration\": \"30 sec\",\n-                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"0 sec\"\n-                        },\n-                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n-                        \"defaultYieldDuration\": \"1 sec\",\n-                        \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n-                        \"primaryNodeOnly\": false,\n-                        \"propertyDescriptors\": {\n-                            \"Event Hub Consumer Group\": {\n-                                \"defaultValue\": \"$Default\",\n-                                \"description\": \"The name of the consumer group to use when pulling events\",\n-                                \"displayName\": \"Consumer Group\",\n+                                \"defaultValue\": \"no-schema\",\n+                                \"description\": \"Specifies how the schema for a Record should be added to the data.\",\n+                                \"displayName\": \"Schema Write Strategy\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Event Hub Consumer Group\",\n+                                \"name\": \"Schema Write Strategy\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Event Hub Message Enqueue Time\": {\n-                                \"description\": \"A timestamp (ISO-8601 Instant) formatted as YYYY-MM-DDThhmmss.sssZ (2016-01-01T01:01:01.000Z) from which messages should have been enqueued in the Event Hub to start reading from\",\n-                                \"displayName\": \"Message Enqueue Time\",\n+                            \"Time Format\": {\n+                                \"description\": \"Specifies the format to use when reading/writing Time fields. If not specified, Time fields will be assumed to be number of milliseconds since epoch (Midnight, Jan 1, 1970 GMT). If specified, the value must match the Java Simple Date Format (for example, HH:mm:ss for a two-digit hour in 24-hour format, followed by a two-digit minute, followed by a two-digit second, all separated by ':' characters, as in 18:04:15).\",\n+                                \"displayName\": \"Time Format\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Event Hub Message Enqueue Time\",\n+                                \"name\": \"Time Format\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Event Hub Name\": {\n-                                \"description\": \"Name of Azure Event Hubs source\",\n-                                \"displayName\": \"Event Hub Name\",\n+                            \"Timestamp Format\": {\n+                                \"description\": \"Specifies the format to use when reading/writing Timestamp fields. If not specified, Timestamp fields will be assumed to be number of milliseconds since epoch (Midnight, Jan 1, 1970 GMT). If specified, the value must match the Java Simple Date Format (for example, MM/dd/yyyy HH:mm:ss for a two-digit month, followed by a two-digit day, followed by a four-digit year, all separated by '/' characters; and then followed by a two-digit hour in 24-hour format, followed by a two-digit minute, followed by a two-digit second, all separated by ':' characters, as in 01/01/2017 18:04:15).\",\n+                                \"displayName\": \"Timestamp Format\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Event Hub Name\",\n-                                \"required\": true,\n+                                \"name\": \"Timestamp Format\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Event Hub Namespace\": {\n-                                \"description\": \"Namespace of Azure Event Hubs prefixed to Service Bus Endpoint domain\",\n-                                \"displayName\": \"Event Hub Namespace\",\n+                            \"Trim Fields\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"true\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"custom\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"CSV Format\",\n+                                        \"propertyName\": \"CSV Format\"\n+                                    }\n+                                ],\n+                                \"description\": \"Whether or not white space should be removed from the beginning and end of fields\",\n+                                \"displayName\": \"Trim Fields\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Event Hub Namespace\",\n+                                \"name\": \"Trim Fields\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Number of Event Hub Partitions\": {\n-                                \"description\": \"This property is deprecated and no longer used.\",\n-                                \"displayName\": \"Number of Event Hub Partitions\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Number of Event Hub Partitions\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Partition Receiver Timeout (millseconds)\": {\n-                                \"description\": \"The amount of time in milliseconds a Partition Receiver should wait to receive the Fetch Size before returning. The default is 60000\",\n-                                \"displayName\": \"Partition Receiver Timeout\",\n+                            \"Value Separator\": {\n+                                \"defaultValue\": \",\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"custom\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"CSV Format\",\n+                                        \"propertyName\": \"CSV Format\"\n+                                    }\n+                                ],\n+                                \"description\": \"The character that is used to separate values/fields in a CSV Record. If the property has been specified via Expression Language but the expression gets evaluated to an invalid Value Separator at runtime, then it will be skipped and the default Value Separator will be used.\",\n+                                \"displayName\": \"Value Separator\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Partition Receiver Timeout (millseconds)\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Value Separator\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Partition Recivier Fetch Size\": {\n-                                \"description\": \"The number of events that a receiver should fetch from an Event Hubs partition before returning. The default is 100\",\n-                                \"displayName\": \"Partition Receiver Fetch Size\",\n+                            \"csvutils-character-set\": {\n+                                \"defaultValue\": \"UTF-8\",\n+                                \"description\": \"The Character Encoding that is used to encode/decode the CSV file\",\n+                                \"displayName\": \"Character Set\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Partition Recivier Fetch Size\",\n-                                \"required\": false,\n+                                \"name\": \"csvutils-character-set\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Service Bus Endpoint\": {\n+                            \"schema-access-strategy\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Servicebus endpoint for general use\",\n-                                        \"displayName\": \"Azure\",\n-                                        \"value\": \".servicebus.windows.net\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Servicebus endpoint for China\",\n-                                        \"displayName\": \"Azure China\",\n-                                        \"value\": \".servicebus.chinacloudapi.cn\"\n+                                        \"description\": \"The schema used to write records will be the same schema that was given to the Record when the Record was created.\",\n+                                        \"displayName\": \"Inherit Record Schema\",\n+                                        \"value\": \"inherit-record-schema\"\n                                     },\n                                     {\n-                                        \"description\": \"Servicebus endpoint for Germany\",\n-                                        \"displayName\": \"Azure Germany\",\n-                                        \"value\": \".servicebus.cloudapi.de\"\n+                                        \"description\": \"The name of the Schema to use is specified by the 'Schema Name' Property. The value of this property is used to lookup the Schema in the configured Schema Registry service.\",\n+                                        \"displayName\": \"Use 'Schema Name' Property\",\n+                                        \"value\": \"schema-name\"\n                                     },\n                                     {\n-                                        \"description\": \"Servicebus endpoint for US Government\",\n-                                        \"displayName\": \"Azure US Government\",\n-                                        \"value\": \".servicebus.usgovcloudapi.net\"\n+                                        \"description\": \"The text of the Schema itself is specified by the 'Schema Text' Property. The value of this property must be a valid Avro Schema. If Expression Language is used, the value of the 'Schema Text' property must be valid after substituting the expressions.\",\n+                                        \"displayName\": \"Use 'Schema Text' Property\",\n+                                        \"value\": \"schema-text-property\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \".servicebus.windows.net\",\n-                                \"description\": \"To support namespaces not in the default windows.net domain.\",\n-                                \"displayName\": \"Service Bus Endpoint\",\n+                                \"defaultValue\": \"inherit-record-schema\",\n+                                \"description\": \"Specifies how to obtain the schema that is to be used for interpreting the data.\",\n+                                \"displayName\": \"Schema Access Strategy\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Service Bus Endpoint\",\n+                                \"name\": \"schema-access-strategy\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Shared Access Policy Name\": {\n-                                \"description\": \"The name of the shared access policy. This policy must have Listen claims.\",\n-                                \"displayName\": \"Shared Access Policy Name\",\n+                            \"schema-branch\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"schema-name\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n+                                        \"propertyName\": \"schema-access-strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"Specifies the name of the branch to use when looking up the schema in the Schema Registry property. If the chosen Schema Registry does not support branching, this value will be ignored.\",\n+                                \"displayName\": \"Schema Branch\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Shared Access Policy Name\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"schema-branch\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Shared Access Policy Primary Key\": {\n-                                \"description\": \"The key of the shared access policy. Either the primary or the secondary key can be used.\",\n-                                \"displayName\": \"Shared Access Policy Key\",\n+                            \"schema-cache\": {\n+                                \"description\": \"Specifies a Schema Cache to add the Record Schema to so that Record Readers can quickly lookup the schema.\",\n+                                \"displayName\": \"Schema Cache\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Shared Access Policy Primary Key\",\n+                                \"name\": \"schema-cache\",\n                                 \"required\": false,\n-                                \"sensitive\": true\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.serialization.RecordSchemaCacheService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n                             },\n-                            \"Transport Type\": {\n-                                \"allowableValues\": [\n+                            \"schema-name\": {\n+                                \"defaultValue\": \"${schema.name}\",\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"AMQP over TCP on ports 5671 and 5672\",\n-                                        \"displayName\": \"AMQP\",\n-                                        \"value\": \"Amqp\"\n-                                    },\n+                                        \"dependentValues\": [\n+                                            \"schema-name\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n+                                        \"propertyName\": \"schema-access-strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"Specifies the name of the schema to lookup in the Schema Registry property\",\n+                                \"displayName\": \"Schema Name\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"schema-name\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"schema-protocol-version\": {\n+                                \"defaultValue\": \"1\",\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"AMQP over HTTPS with WebSockets on port 443\",\n-                                        \"displayName\": \"AMQP_WEB_SOCKETS\",\n-                                        \"value\": \"AmqpWebSockets\"\n+                                        \"dependentValues\": [\n+                                            \"hwx-schema-ref-attributes\",\n+                                            \"hwx-content-encoded-schema\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Schema Write Strategy\",\n+                                        \"propertyName\": \"Schema Write Strategy\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"Amqp\",\n-                                \"description\": \"Advanced Message Queuing Protocol Transport Type for communication with Azure Event Hubs\",\n-                                \"displayName\": \"Transport Type\",\n+                                \"description\": \"The protocol version to be used for Schema Write Strategies that require a protocol version, such as Hortonworks Schema Registry strategies. Valid protocol versions for Hortonworks Schema Registry are integer values 1, 2, or 3.\",\n+                                \"displayName\": \"Schema Protocol Version\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Transport Type\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"schema-protocol-version\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"proxy-configuration-service\": {\n+                            \"schema-registry\": {\n                                 \"dependencies\": [\n                                     {\n                                         \"dependentValues\": [\n-                                            \"AmqpWebSockets\"\n+                                            \"confluent-encoded\",\n+                                            \"schema-name\",\n+                                            \"hwx-schema-ref-attributes\",\n+                                            \"hwx-content-encoded-schema\"\n                                         ],\n-                                        \"propertyDisplayName\": \"Transport Type\",\n-                                        \"propertyName\": \"Transport Type\"\n+                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n+                                        \"propertyName\": \"schema-access-strategy\"\n                                     }\n                                 ],\n-                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests. Supported proxies: HTTP + AuthN\",\n-                                \"displayName\": \"Proxy Configuration Service\",\n+                                \"description\": \"Specifies the Controller Service to use for the Schema Registry\",\n+                                \"displayName\": \"Schema Registry\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"proxy-configuration-service\",\n+                                \"name\": \"schema-registry\",\n                                 \"required\": false,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n                                     \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.proxy.ProxyConfigurationService\",\n+                                    \"type\": \"org.apache.nifi.schemaregistry.services.SchemaRegistry\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             },\n-                            \"use-managed-identity\": {\n-                                \"allowableValues\": [\n+                            \"schema-text\": {\n+                                \"defaultValue\": \"${avro.schema}\",\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n+                                        \"dependentValues\": [\n+                                            \"schema-text-property\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n+                                        \"propertyName\": \"schema-access-strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"The text of an Avro-formatted Schema\",\n+                                \"displayName\": \"Schema Text\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"schema-text\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"schema-version\": {\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"dependentValues\": [\n+                                            \"schema-name\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n+                                        \"propertyName\": \"schema-access-strategy\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"Choose whether or not to use the managed identity of Azure VM/VMSS\",\n-                                \"displayName\": \"Use Azure Managed Identity\",\n+                                \"description\": \"Specifies the version of the schema to lookup in the Schema Registry. If not specified then the latest version of the schema will be retrieved.\",\n+                                \"displayName\": \"Schema Version\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"use-managed-identity\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"schema-version\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             }\n                         },\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.processors.azure.eventhub.ConsumeAzureEventHub\"\n-                        ],\n-                        \"sideEffectFree\": false,\n-                        \"supportedRelationships\": [\n+                        \"providedApiImplementations\": [\n                             {\n-                                \"description\": \"Any FlowFile that is successfully received from the event hub will be transferred to this Relationship.\",\n-                                \"name\": \"success\"\n+                                \"artifact\": \"nifi-standard-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n+                                \"version\": \"1.27.0\"\n                             }\n                         ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n-                        \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"azure\",\n-                            \"cloud\",\n-                            \"eventhub\",\n-                            \"events\",\n-                            \"microsoft\",\n-                            \"streaming\",\n-                            \"streams\"\n+                            \"csv\",\n+                            \"delimited\",\n+                            \"record\",\n+                            \"recordset\",\n+                            \"result\",\n+                            \"row\",\n+                            \"separated\",\n+                            \"serializer\",\n+                            \"set\",\n+                            \"tab\",\n+                            \"tsv\",\n+                            \"writer\"\n                         ],\n-                        \"triggerSerially\": false,\n-                        \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.azure.eventhub.GetAzureEventHub\",\n-                        \"typeDescription\": \"Receives messages from Microsoft Azure Event Hubs without reliable checkpoint tracking. In clustered environment, GetAzureEventHub processor instances work independently and all cluster nodes process all messages (unless running the processor in Primary Only mode). ConsumeAzureEventHub offers the recommended approach to receiving messages from Azure Event Hubs. This processor creates a thread pool for connections to Azure Event Hubs.\",\n-                        \"version\": \"1.27.0\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"The time (in milliseconds since epoch, UTC) at which the message was enqueued in the event hub\",\n-                                \"name\": \"eventhub.enqueued.timestamp\"\n-                            },\n-                            {\n-                                \"description\": \"The offset into the partition at which the message was stored\",\n-                                \"name\": \"eventhub.offset\"\n-                            },\n-                            {\n-                                \"description\": \"The Azure sequence number associated with the message\",\n-                                \"name\": \"eventhub.sequence\"\n-                            },\n-                            {\n-                                \"description\": \"The name of the event hub from which the message was pulled\",\n-                                \"name\": \"eventhub.name\"\n-                            },\n-                            {\n-                                \"description\": \"The name of the event hub partition from which the message was pulled\",\n-                                \"name\": \"eventhub.partition\"\n-                            },\n-                            {\n-                                \"description\": \"The application properties of this message. IE: 'application' would be 'eventhub.property.application'\",\n-                                \"name\": \"eventhub.property.*\"\n-                            }\n-                        ]\n+                        \"type\": \"org.apache.nifi.csv.CSVRecordSetWriter\",\n+                        \"typeDescription\": \"Writes the contents of a RecordSet as CSV data. The first line written will be the column names (unless the 'Include Header Line' property is false). All subsequent lines will be the values corresponding to the record fields.\",\n+                        \"version\": \"1.27.0\"\n                     },\n                     {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-azure-nar\",\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-record-serialization-services-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n-                        \"defaultBulletinLevel\": \"WARN\",\n-                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": 1,\n-                            \"TIMER_DRIVEN\": 1\n-                        },\n-                        \"defaultPenaltyDuration\": \"30 sec\",\n-                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"0 sec\"\n-                        },\n-                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n-                        \"defaultYieldDuration\": \"1 sec\",\n+                        \"explicitRestrictions\": [\n+                            {\n+                                \"explanation\": \"Patterns and Expressions can reference resources over HTTP\",\n+                                \"requiredPermission\": \"reference remote resources\"\n+                            }\n+                        ],\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_REQUIRED\",\n-                        \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Event Hub Name\": {\n-                                \"description\": \"Name of Azure Event Hubs destination\",\n-                                \"displayName\": \"Event Hub Name\",\n+                            \"Grok Expression\": {\n+                                \"description\": \"Specifies the format of a log line in Grok format. This allows the Record Reader to understand how to parse each log line. The property supports one or more Grok expressions. The Reader attempts to parse input lines according to the configured order of the expressions.If a line in the log file does not match any expressions, the line will be assumed to belong to the previous log message.If other Grok patterns are referenced by this expression, they need to be supplied in the Grok Pattern File property.\",\n+                                \"displayName\": \"Grok Expressions\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Event Hub Name\",\n+                                \"name\": \"Grok Expression\",\n                                 \"required\": true,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"SINGLE\",\n+                                    \"resourceTypes\": [\n+                                        \"FILE\",\n+                                        \"URL\",\n+                                        \"TEXT\"\n+                                    ]\n+                                },\n                                 \"sensitive\": false\n                             },\n-                            \"Event Hub Namespace\": {\n-                                \"description\": \"Namespace of Azure Event Hubs prefixed to Service Bus Endpoint domain\",\n-                                \"displayName\": \"Event Hub Namespace\",\n+                            \"Grok Pattern File\": {\n+                                \"description\": \"Grok Patterns to use for parsing logs. If not specified, a built-in default Pattern file will be used. If specified, all patterns specified will override the default patterns. See the Controller Service's Additional Details for a list of pre-defined patterns.\",\n+                                \"displayName\": \"Grok Patterns\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Event Hub Namespace\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Grok Pattern File\",\n+                                \"required\": false,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"SINGLE\",\n+                                    \"resourceTypes\": [\n+                                        \"FILE\",\n+                                        \"URL\",\n+                                        \"TEXT\"\n+                                    ]\n+                                },\n                                 \"sensitive\": false\n                             },\n-                            \"Service Bus Endpoint\": {\n+                            \"no-match-behavior\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Servicebus endpoint for general use\",\n-                                        \"displayName\": \"Azure\",\n-                                        \"value\": \".servicebus.windows.net\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Servicebus endpoint for China\",\n-                                        \"displayName\": \"Azure China\",\n-                                        \"value\": \".servicebus.chinacloudapi.cn\"\n+                                        \"description\": \"The line of text that does not match the Grok Expression will be appended to the last field of the prior message.\",\n+                                        \"displayName\": \"Append to Previous Message\",\n+                                        \"value\": \"append-to-previous-message\"\n                                     },\n                                     {\n-                                        \"description\": \"Servicebus endpoint for Germany\",\n-                                        \"displayName\": \"Azure Germany\",\n-                                        \"value\": \".servicebus.cloudapi.de\"\n+                                        \"description\": \"The line of text that does not match the Grok Expression will be skipped.\",\n+                                        \"displayName\": \"Skip Line\",\n+                                        \"value\": \"skip-line\"\n                                     },\n                                     {\n-                                        \"description\": \"Servicebus endpoint for US Government\",\n-                                        \"displayName\": \"Azure US Government\",\n-                                        \"value\": \".servicebus.usgovcloudapi.net\"\n+                                        \"description\": \"The line of text that does not match the Grok Expression will only be added to the _raw field.\",\n+                                        \"displayName\": \"Raw Line\",\n+                                        \"value\": \"raw-line\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \".servicebus.windows.net\",\n-                                \"description\": \"To support namespaces not in the default windows.net domain.\",\n-                                \"displayName\": \"Service Bus Endpoint\",\n+                                \"defaultValue\": \"append-to-previous-message\",\n+                                \"description\": \"If a line of text is encountered and it does not match the given Grok Expression, and it is not part of a stack trace, this property specifies how the text should be processed.\",\n+                                \"displayName\": \"No Match Behavior\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Service Bus Endpoint\",\n+                                \"name\": \"no-match-behavior\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Shared Access Policy Name\": {\n-                                \"description\": \"The name of the shared access policy. This policy must have Send claims.\",\n-                                \"displayName\": \"Shared Access Policy Name\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Shared Access Policy Name\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Shared Access Policy Primary Key\": {\n-                                \"description\": \"The key of the shared access policy. Either the primary or the secondary key can be used.\",\n-                                \"displayName\": \"Shared Access Policy Key\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Shared Access Policy Primary Key\",\n-                                \"required\": false,\n-                                \"sensitive\": true\n-                            },\n-                            \"Transport Type\": {\n+                            \"schema-access-strategy\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"AMQP over TCP on ports 5671 and 5672\",\n-                                        \"displayName\": \"AMQP\",\n-                                        \"value\": \"Amqp\"\n+                                        \"description\": \"The schema will be derived using the field names present in all configured Grok Expressions. All schema fields will have a String type and will be marked as nullable. The schema will also include a `stackTrace` field, and a `_raw` field containing the input line string.\",\n+                                        \"displayName\": \"Use String Fields From Grok Expression\",\n+                                        \"value\": \"string-fields-from-grok-expression\"\n                                     },\n                                     {\n-                                        \"description\": \"AMQP over HTTPS with WebSockets on port 443\",\n-                                        \"displayName\": \"AMQP_WEB_SOCKETS\",\n-                                        \"value\": \"AmqpWebSockets\"\n+                                        \"description\": \"The name of the Schema to use is specified by the 'Schema Name' Property. The value of this property is used to lookup the Schema in the configured Schema Registry service.\",\n+                                        \"displayName\": \"Use 'Schema Name' Property\",\n+                                        \"value\": \"schema-name\"\n+                                    },\n+                                    {\n+                                        \"description\": \"The text of the Schema itself is specified by the 'Schema Text' Property. The value of this property must be a valid Avro Schema. If Expression Language is used, the value of the 'Schema Text' property must be valid after substituting the expressions.\",\n+                                        \"displayName\": \"Use 'Schema Text' Property\",\n+                                        \"value\": \"schema-text-property\"\n+                                    },\n+                                    {\n+                                        \"description\": \"The FlowFile contains 3 Attributes that will be used to lookup a Schema from the configured Schema Registry: 'schema.identifier', 'schema.version', and 'schema.protocol.version'\",\n+                                        \"displayName\": \"HWX Schema Reference Attributes\",\n+                                        \"value\": \"hwx-schema-ref-attributes\"\n+                                    },\n+                                    {\n+                                        \"description\": \"The content of the FlowFile contains a reference to a schema in the Schema Registry service. The reference is encoded as a single byte indicating the 'protocol version', followed by 8 bytes indicating the schema identifier, and finally 4 bytes indicating the schema version, as per the Hortonworks Schema Registry serializers and deserializers, found at https://github.com/hortonworks/registry\",\n+                                        \"displayName\": \"HWX Content-Encoded Schema Reference\",\n+                                        \"value\": \"hwx-content-encoded-schema\"\n+                                    },\n+                                    {\n+                                        \"description\": \"The content of the FlowFile contains a reference to a schema in the Schema Registry service. The reference is encoded as a single 'Magic Byte' followed by 4 bytes representing the identifier of the schema, as outlined at http://docs.confluent.io/current/schema-registry/docs/serializer-formatter.html. This is based on version 3.2.x of the Confluent Schema Registry.\",\n+                                        \"displayName\": \"Confluent Content-Encoded Schema Reference\",\n+                                        \"value\": \"confluent-encoded\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"Amqp\",\n-                                \"description\": \"Advanced Message Queuing Protocol Transport Type for communication with Azure Event Hubs\",\n-                                \"displayName\": \"Transport Type\",\n+                                \"defaultValue\": \"string-fields-from-grok-expression\",\n+                                \"description\": \"Specifies how to obtain the schema that is to be used for interpreting the data.\",\n+                                \"displayName\": \"Schema Access Strategy\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Transport Type\",\n+                                \"name\": \"schema-access-strategy\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"max-batch-size\": {\n-                                \"defaultValue\": \"100\",\n-                                \"description\": \"Maximum number of FlowFiles processed for each Processor invocation\",\n-                                \"displayName\": \"Maximum Batch Size\",\n+                            \"schema-branch\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"schema-name\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n+                                        \"propertyName\": \"schema-access-strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"Specifies the name of the branch to use when looking up the schema in the Schema Registry property. If the chosen Schema Registry does not support branching, this value will be ignored.\",\n+                                \"displayName\": \"Schema Branch\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"max-batch-size\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"schema-branch\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"partitioning-key-attribute-name\": {\n-                                \"description\": \"If specified, the value from argument named by this field will be used as a partitioning key to be used by event hub.\",\n-                                \"displayName\": \"Partitioning Key Attribute Name\",\n+                            \"schema-name\": {\n+                                \"defaultValue\": \"${schema.name}\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"schema-name\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n+                                        \"propertyName\": \"schema-access-strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"Specifies the name of the schema to lookup in the Schema Registry property\",\n+                                \"displayName\": \"Schema Name\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"partitioning-key-attribute-name\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"schema-name\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"proxy-configuration-service\": {\n+                            \"schema-registry\": {\n                                 \"dependencies\": [\n                                     {\n                                         \"dependentValues\": [\n-                                            \"AmqpWebSockets\"\n+                                            \"confluent-encoded\",\n+                                            \"schema-name\",\n+                                            \"hwx-schema-ref-attributes\",\n+                                            \"hwx-content-encoded-schema\"\n                                         ],\n-                                        \"propertyDisplayName\": \"Transport Type\",\n-                                        \"propertyName\": \"Transport Type\"\n+                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n+                                        \"propertyName\": \"schema-access-strategy\"\n                                     }\n                                 ],\n-                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests. Supported proxies: HTTP + AuthN\",\n-                                \"displayName\": \"Proxy Configuration Service\",\n+                                \"description\": \"Specifies the Controller Service to use for the Schema Registry\",\n+                                \"displayName\": \"Schema Registry\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"proxy-configuration-service\",\n+                                \"name\": \"schema-registry\",\n                                 \"required\": false,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n                                     \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.proxy.ProxyConfigurationService\",\n+                                    \"type\": \"org.apache.nifi.schemaregistry.services.SchemaRegistry\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             },\n-                            \"use-managed-identity\": {\n-                                \"allowableValues\": [\n+                            \"schema-text\": {\n+                                \"defaultValue\": \"${avro.schema}\",\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n+                                        \"dependentValues\": [\n+                                            \"schema-text-property\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n+                                        \"propertyName\": \"schema-access-strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"The text of an Avro-formatted Schema\",\n+                                \"displayName\": \"Schema Text\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"schema-text\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"schema-version\": {\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"dependentValues\": [\n+                                            \"schema-name\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n+                                        \"propertyName\": \"schema-access-strategy\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"Choose whether or not to use the managed identity of Azure VM/VMSS\",\n-                                \"displayName\": \"Use Azure Managed Identity\",\n+                                \"description\": \"Specifies the version of the schema to lookup in the Schema Registry. If not specified then the latest version of the schema will be retrieved.\",\n+                                \"displayName\": \"Schema Version\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"use-managed-identity\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"schema-version\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             }\n                         },\n-                        \"sideEffectFree\": false,\n-                        \"supportedRelationships\": [\n-                            {\n-                                \"description\": \"Any FlowFile that is successfully sent to the event hubs will be transferred to this Relationship.\",\n-                                \"name\": \"success\"\n-                            },\n+                        \"providedApiImplementations\": [\n                             {\n-                                \"description\": \"Any FlowFile that could not be sent to the event hub will be transferred to this Relationship.\",\n-                                \"name\": \"failure\"\n+                                \"artifact\": \"nifi-standard-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n+                                \"version\": \"1.27.0\"\n                             }\n                         ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": true,\n+                        \"restricted\": true,\n                         \"supportsDynamicProperties\": false,\n-                        \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n-                        \"systemResourceConsiderations\": [\n-                            {\n-                                \"description\": \"The Processor buffers FlowFile contents in memory before sending\",\n-                                \"resource\": \"MEMORY\"\n-                            }\n-                        ],\n                         \"tags\": [\n-                            \"azure\",\n-                            \"cloud\",\n-                            \"eventhub\",\n-                            \"events\",\n-                            \"microsoft\",\n-                            \"streaming\",\n-                            \"streams\"\n+                            \"grok\",\n+                            \"logfiles\",\n+                            \"logs\",\n+                            \"logstash\",\n+                            \"parse\",\n+                            \"pattern\",\n+                            \"reader\",\n+                            \"record\",\n+                            \"regex\",\n+                            \"text\",\n+                            \"unstructured\"\n                         ],\n-                        \"triggerSerially\": false,\n-                        \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.azure.eventhub.PutAzureEventHub\",\n-                        \"typeDescription\": \"Send FlowFile contents to Azure Event Hubs\",\n+                        \"type\": \"org.apache.nifi.grok.GrokReader\",\n+                        \"typeDescription\": \"Provides a mechanism for reading unstructured text data, such as log files, and structuring the data so that it can be processed. The service is configured using Grok patterns. The service reads from a stream of data and splits each message that it finds into a separate Record, each containing the fields that are configured. If a line in the input does not match the expected message pattern, the line of text is either considered to be part of the previous message or is skipped, depending on the configuration, with the exception of stack traces. A stack trace that is found at the end of a log message is considered to be part of the previous message but is added to the 'stackTrace' field of the Record. If a record has no stack trace, it will have a NULL value for the stackTrace field (assuming that the schema does in fact include a stackTrace field of type String). Assuming that the schema includes a '_raw' field of type String, the raw message will be included in the Record.\",\n                         \"version\": \"1.27.0\"\n                     },\n                     {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-azure-nar\",\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-record-serialization-services-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n-                        \"defaultBulletinLevel\": \"WARN\",\n-                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": 1,\n-                            \"TIMER_DRIVEN\": 1\n-                        },\n-                        \"defaultPenaltyDuration\": \"30 sec\",\n-                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"0 sec\"\n-                        },\n-                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n-                        \"defaultYieldDuration\": \"1 sec\",\n-                        \"deprecated\": true,\n-                        \"deprecationAlternatives\": [\n-                            \"org.apache.nifi.processors.azure.storage.DeleteAzureBlobStorage_v12\"\n+                        \"dynamicProperties\": [\n+                            {\n+                                \"description\": \"User-defined properties identify how to extract specific fields from a JSON object in order to create a Record\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"name\": \"The field name for the record.\",\n+                                \"value\": \"A JSONPath Expression that will be evaluated against each JSON record. The result of the JSONPath will be the value of the field whose name is the same as the property name.\"\n+                            }\n                         ],\n-                        \"deprecationReason\": \"Processor depends on legacy Microsoft Azure SDK\",\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_REQUIRED\",\n-                        \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"blob\": {\n-                                \"defaultValue\": \"${azure.blobname}\",\n-                                \"description\": \"The filename of the blob\",\n-                                \"displayName\": \"Blob\",\n+                            \"Allow Comments\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"Whether to allow comments when parsing the JSON document\",\n+                                \"displayName\": \"Allow Comments\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"blob\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Allow Comments\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"container-name\": {\n-                                \"description\": \"Name of the Azure storage container. In case of PutAzureBlobStorage processor, container can be created if it does not exist.\",\n-                                \"displayName\": \"Container Name\",\n+                            \"Date Format\": {\n+                                \"description\": \"Specifies the format to use when reading/writing Date fields. If not specified, Date fields will be assumed to be number of milliseconds since epoch (Midnight, Jan 1, 1970 GMT). If specified, the value must match the Java Simple Date Format (for example, MM/dd/yyyy for a two-digit month, followed by a two-digit day, followed by a four-digit year, all separated by '/' characters, as in 01/01/2017).\",\n+                                \"displayName\": \"Date Format\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"container-name\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Date Format\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Max String Length\": {\n+                                \"defaultValue\": \"20 MB\",\n+                                \"description\": \"The maximum allowed length of a string value when parsing the JSON document\",\n+                                \"displayName\": \"Max String Length\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Max String Length\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"delete-snapshots-option\": {\n+                            \"Time Format\": {\n+                                \"description\": \"Specifies the format to use when reading/writing Time fields. If not specified, Time fields will be assumed to be number of milliseconds since epoch (Midnight, Jan 1, 1970 GMT). If specified, the value must match the Java Simple Date Format (for example, HH:mm:ss for a two-digit hour in 24-hour format, followed by a two-digit minute, followed by a two-digit second, all separated by ':' characters, as in 18:04:15).\",\n+                                \"displayName\": \"Time Format\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Time Format\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Timestamp Format\": {\n+                                \"description\": \"Specifies the format to use when reading/writing Timestamp fields. If not specified, Timestamp fields will be assumed to be number of milliseconds since epoch (Midnight, Jan 1, 1970 GMT). If specified, the value must match the Java Simple Date Format (for example, MM/dd/yyyy HH:mm:ss for a two-digit month, followed by a two-digit day, followed by a four-digit year, all separated by '/' characters; and then followed by a two-digit hour in 24-hour format, followed by a two-digit minute, followed by a two-digit second, all separated by ':' characters, as in 01/01/2017 18:04:15).\",\n+                                \"displayName\": \"Timestamp Format\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Timestamp Format\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"schema-access-strategy\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Delete the blob only.\",\n-                                        \"displayName\": \"None\",\n-                                        \"value\": \"NONE\"\n+                                        \"description\": \"The name of the Schema to use is specified by the 'Schema Name' Property. The value of this property is used to lookup the Schema in the configured Schema Registry service.\",\n+                                        \"displayName\": \"Use 'Schema Name' Property\",\n+                                        \"value\": \"schema-name\"\n                                     },\n                                     {\n-                                        \"description\": \"Delete the blob and its snapshots.\",\n-                                        \"displayName\": \"Include Snapshots\",\n-                                        \"value\": \"INCLUDE_SNAPSHOTS\"\n+                                        \"description\": \"The text of the Schema itself is specified by the 'Schema Text' Property. The value of this property must be a valid Avro Schema. If Expression Language is used, the value of the 'Schema Text' property must be valid after substituting the expressions.\",\n+                                        \"displayName\": \"Use 'Schema Text' Property\",\n+                                        \"value\": \"schema-text-property\"\n                                     },\n                                     {\n-                                        \"description\": \"Delete only the blob's snapshots.\",\n-                                        \"displayName\": \"Delete Snapshots Only\",\n-                                        \"value\": \"DELETE_SNAPSHOTS_ONLY\"\n+                                        \"description\": \"The FlowFile contains 3 Attributes that will be used to lookup a Schema from the configured Schema Registry: 'schema.identifier', 'schema.version', and 'schema.protocol.version'\",\n+                                        \"displayName\": \"HWX Schema Reference Attributes\",\n+                                        \"value\": \"hwx-schema-ref-attributes\"\n+                                    },\n+                                    {\n+                                        \"description\": \"The content of the FlowFile contains a reference to a schema in the Schema Registry service. The reference is encoded as a single byte indicating the 'protocol version', followed by 8 bytes indicating the schema identifier, and finally 4 bytes indicating the schema version, as per the Hortonworks Schema Registry serializers and deserializers, found at https://github.com/hortonworks/registry\",\n+                                        \"displayName\": \"HWX Content-Encoded Schema Reference\",\n+                                        \"value\": \"hwx-content-encoded-schema\"\n+                                    },\n+                                    {\n+                                        \"description\": \"The content of the FlowFile contains a reference to a schema in the Schema Registry service. The reference is encoded as a single 'Magic Byte' followed by 4 bytes representing the identifier of the schema, as outlined at http://docs.confluent.io/current/schema-registry/docs/serializer-formatter.html. This is based on version 3.2.x of the Confluent Schema Registry.\",\n+                                        \"displayName\": \"Confluent Content-Encoded Schema Reference\",\n+                                        \"value\": \"confluent-encoded\"\n+                                    },\n+                                    {\n+                                        \"description\": \"The Schema of the data will be inferred automatically when the data is read. See component Usage and Additional Details for information about how the schema is inferred.\",\n+                                        \"displayName\": \"Infer Schema\",\n+                                        \"value\": \"infer-schema\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"NONE\",\n-                                \"description\": \"Specifies the snapshot deletion options to be used when deleting a blob.\",\n-                                \"displayName\": \"Delete Snapshots Option\",\n+                                \"defaultValue\": \"infer-schema\",\n+                                \"description\": \"Specifies how to obtain the schema that is to be used for interpreting the data.\",\n+                                \"displayName\": \"Schema Access Strategy\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"delete-snapshots-option\",\n+                                \"name\": \"schema-access-strategy\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"proxy-configuration-service\": {\n-                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests. Supported proxies: SOCKS, HTTP In case of SOCKS, it is not guaranteed that the selected SOCKS Version will be used by the processor.\",\n-                                \"displayName\": \"Proxy Configuration Service\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"proxy-configuration-service\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.proxy.ProxyConfigurationService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            },\n-                            \"storage-account-key\": {\n-                                \"description\": \"The storage account key. This is an admin-like password providing access to every container in this account. It is recommended one uses Shared Access Signature (SAS) token instead for fine-grained control with policies. There are certain risks in allowing the account key to be stored as a flowfile attribute. While it does provide for a more flexible flow by allowing the account key to be fetched dynamically from a flowfile attribute, care must be taken to restrict access to the event provenance data (e.g., by strictly controlling the policies governing provenance for this processor). In addition, the provenance repositories may be put on encrypted disk partitions.\",\n-                                \"displayName\": \"Storage Account Key\",\n+                            \"schema-branch\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"schema-name\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n+                                        \"propertyName\": \"schema-access-strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"Specifies the name of the branch to use when looking up the schema in the Schema Registry property. If the chosen Schema Registry does not support branching, this value will be ignored.\",\n+                                \"displayName\": \"Schema Branch\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"storage-account-key\",\n+                                \"name\": \"schema-branch\",\n                                 \"required\": false,\n-                                \"sensitive\": true\n+                                \"sensitive\": false\n                             },\n-                            \"storage-account-name\": {\n-                                \"description\": \"The storage account name. There are certain risks in allowing the account name to be stored as a flowfile attribute. While it does provide for a more flexible flow by allowing the account name to be fetched dynamically from a flowfile attribute, care must be taken to restrict access to the event provenance data (e.g., by strictly controlling the policies governing provenance for this processor). In addition, the provenance repositories may be put on encrypted disk partitions. Instead of defining the Storage Account Name, Storage Account Key and SAS Token properties directly on the processor, the preferred way is to configure them through a controller service specified in the Storage Credentials property. The controller service can provide a common/shared configuration for multiple/all Azure processors. Furthermore, the credentials can also be looked up dynamically with the 'Lookup' version of the service.\",\n-                                \"displayName\": \"Storage Account Name\",\n+                            \"schema-name\": {\n+                                \"defaultValue\": \"${schema.name}\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"schema-name\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n+                                        \"propertyName\": \"schema-access-strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"Specifies the name of the schema to lookup in the Schema Registry property\",\n+                                \"displayName\": \"Schema Name\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"storage-account-name\",\n+                                \"name\": \"schema-name\",\n                                 \"required\": false,\n-                                \"sensitive\": true\n+                                \"sensitive\": false\n                             },\n-                            \"storage-credentials-service\": {\n-                                \"description\": \"The Controller Service used to obtain Azure Storage Credentials. Instead of the processor level properties, the credentials can be configured here through a common/shared controller service, which is the preferred way. The 'Lookup' version of the service can also be used to select the credentials dynamically at runtime based on a FlowFile attribute (if the processor has FlowFile input).\",\n-                                \"displayName\": \"Storage Credentials\",\n+                            \"schema-registry\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"confluent-encoded\",\n+                                            \"schema-name\",\n+                                            \"hwx-schema-ref-attributes\",\n+                                            \"hwx-content-encoded-schema\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n+                                        \"propertyName\": \"schema-access-strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"Specifies the Controller Service to use for the Schema Registry\",\n+                                \"displayName\": \"Schema Registry\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"storage-credentials-service\",\n+                                \"name\": \"schema-registry\",\n                                 \"required\": false,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-azure-services-api-nar\",\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.services.azure.storage.AzureStorageCredentialsService\",\n+                                    \"type\": \"org.apache.nifi.schemaregistry.services.SchemaRegistry\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             },\n-                            \"storage-endpoint-suffix\": {\n-                                \"description\": \"Storage accounts in public Azure always use a common FQDN suffix. Override this endpoint suffix with a different suffix in certain circumstances (like Azure Stack or non-public Azure regions). The preferred way is to configure them through a controller service specified in the Storage Credentials property. The controller service can provide a common/shared configuration for multiple/all Azure processors. Furthermore, the credentials can also be looked up dynamically with the 'Lookup' version of the service.\",\n-                                \"displayName\": \"Common Storage Account Endpoint Suffix\",\n+                            \"schema-text\": {\n+                                \"defaultValue\": \"${avro.schema}\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"schema-text-property\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n+                                        \"propertyName\": \"schema-access-strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"The text of an Avro-formatted Schema\",\n+                                \"displayName\": \"Schema Text\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"storage-endpoint-suffix\",\n+                                \"name\": \"schema-text\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"storage-sas-token\": {\n-                                \"description\": \"Shared Access Signature token, including the leading '?'. Specify either SAS token (recommended) or Account Key. There are certain risks in allowing the SAS token to be stored as a flowfile attribute. While it does provide for a more flexible flow by allowing the SAS token to be fetched dynamically from a flowfile attribute, care must be taken to restrict access to the event provenance data (e.g., by strictly controlling the policies governing provenance for this processor). In addition, the provenance repositories may be put on encrypted disk partitions.\",\n-                                \"displayName\": \"SAS Token\",\n+                            \"schema-version\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"schema-name\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n+                                        \"propertyName\": \"schema-access-strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"Specifies the version of the schema to lookup in the Schema Registry. If not specified then the latest version of the schema will be retrieved.\",\n+                                \"displayName\": \"Schema Version\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"storage-sas-token\",\n+                                \"name\": \"schema-version\",\n                                 \"required\": false,\n-                                \"sensitive\": true\n+                                \"sensitive\": false\n                             }\n                         },\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.processors.azure.storage.FetchAzureBlobStorage\",\n-                            \"org.apache.nifi.processors.azure.storage.ListAzureBlobStorage\",\n-                            \"org.apache.nifi.processors.azure.storage.PutAzureBlobStorage\"\n-                        ],\n-                        \"sideEffectFree\": false,\n-                        \"supportedRelationships\": [\n-                            {\n-                                \"description\": \"All successfully processed FlowFiles are routed to this relationship\",\n-                                \"name\": \"success\"\n-                            },\n+                        \"providedApiImplementations\": [\n                             {\n-                                \"description\": \"Unsuccessful operations will be transferred to the failure relationship.\",\n-                                \"name\": \"failure\"\n+                                \"artifact\": \"nifi-standard-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n+                                \"version\": \"1.27.0\"\n                             }\n                         ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.json.JsonTreeReader\"\n                         ],\n-                        \"supportsBatching\": false,\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": false,\n+                        \"supportsDynamicProperties\": true,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"azure\",\n-                            \"blob\",\n-                            \"cloud\",\n-                            \"microsoft\",\n-                            \"storage\"\n+                            \"json\",\n+                            \"jsonpath\",\n+                            \"parser\",\n+                            \"reader\",\n+                            \"record\"\n                         ],\n-                        \"triggerSerially\": false,\n-                        \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.azure.storage.DeleteAzureBlobStorage\",\n-                        \"typeDescription\": \"Deletes the provided blob from Azure Storage\",\n+                        \"type\": \"org.apache.nifi.json.JsonPathReader\",\n+                        \"typeDescription\": \"Parses JSON records and evaluates user-defined JSON Path's against each JSON object. While the reader expects each record to be well-formed JSON, the content of a FlowFile may consist of many records, each as a well-formed JSON array or JSON object with optional whitespace between them, such as the common 'JSON-per-line' format. If an array is encountered, each element in that array will be treated as a separate record. User-defined properties define the fields that should be extracted from the JSON in order to form the fields of a Record. Any JSON field that is not extracted via a JSONPath will not be returned in the JSON Records.\",\n                         \"version\": \"1.27.0\"\n                     },\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-azure-nar\",\n+                        \"artifact\": \"nifi-record-serialization-services-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n-                        \"defaultBulletinLevel\": \"WARN\",\n-                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": 1,\n-                            \"TIMER_DRIVEN\": 1\n-                        },\n-                        \"defaultPenaltyDuration\": \"30 sec\",\n-                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"0 sec\"\n-                        },\n-                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n-                        \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_REQUIRED\",\n-                        \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"blob-name\": {\n-                                \"defaultValue\": \"${azure.blobname}\",\n-                                \"description\": \"The full name of the blob\",\n-                                \"displayName\": \"Blob Name\",\n+                            \"Allow Scientific Notation\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"Specifies whether or not scientific notation should be used when writing numbers\",\n+                                \"displayName\": \"Allow Scientific Notation\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"blob-name\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Allow Scientific Notation\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"container-name\": {\n-                                \"defaultValue\": \"${azure.container}\",\n-                                \"description\": \"Name of the Azure storage container. In case of PutAzureBlobStorage processor, container can be created if it does not exist.\",\n-                                \"displayName\": \"Container Name\",\n+                            \"Date Format\": {\n+                                \"description\": \"Specifies the format to use when reading/writing Date fields. If not specified, Date fields will be assumed to be number of milliseconds since epoch (Midnight, Jan 1, 1970 GMT). If specified, the value must match the Java Simple Date Format (for example, MM/dd/yyyy for a two-digit month, followed by a two-digit day, followed by a four-digit year, all separated by '/' characters, as in 01/01/2017).\",\n+                                \"displayName\": \"Date Format\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"container-name\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Date Format\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Pretty Print JSON\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"Specifies whether or not the JSON should be pretty printed\",\n+                                \"displayName\": \"Pretty Print JSON\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Pretty Print JSON\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"delete-snapshots-option\": {\n+                            \"Schema Write Strategy\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Delete the blob only.\",\n-                                        \"displayName\": \"None\",\n-                                        \"value\": \"NONE\"\n+                                        \"description\": \"Do not add any schema-related information to the FlowFile.\",\n+                                        \"displayName\": \"Do Not Write Schema\",\n+                                        \"value\": \"no-schema\"\n                                     },\n                                     {\n-                                        \"description\": \"Delete the blob and its snapshots.\",\n-                                        \"displayName\": \"Include Snapshots\",\n-                                        \"value\": \"INCLUDE\"\n+                                        \"description\": \"The FlowFile will be given an attribute named 'schema.name' and this attribute will indicate the name of the schema in the Schema Registry. Note that ifthe schema for a record is not obtained from a Schema Registry, then no attribute will be added.\",\n+                                        \"displayName\": \"Set 'schema.name' Attribute\",\n+                                        \"value\": \"schema-name\"\n                                     },\n                                     {\n-                                        \"description\": \"Delete only the blob's snapshots.\",\n-                                        \"displayName\": \"Delete Snapshots Only\",\n-                                        \"value\": \"ONLY\"\n+                                        \"description\": \"The FlowFile will be given an attribute named 'avro.schema' and this attribute will contain the Avro Schema that describes the records in the FlowFile. The contents of the FlowFile need not be Avro, but the text of the schema will be used.\",\n+                                        \"displayName\": \"Set 'avro.schema' Attribute\",\n+                                        \"value\": \"full-schema-attribute\"\n+                                    },\n+                                    {\n+                                        \"description\": \"The FlowFile will be given a set of 3 attributes to describe the schema: 'schema.identifier', 'schema.version', and 'schema.protocol.version'. Note that if the schema for a record does not contain the necessary identifier and version, an Exception will be thrown when attempting to write the data.\",\n+                                        \"displayName\": \"HWX Schema Reference Attributes\",\n+                                        \"value\": \"hwx-schema-ref-attributes\"\n+                                    },\n+                                    {\n+                                        \"description\": \"The content of the FlowFile will contain a reference to a schema in the Schema Registry service. The reference is encoded as a single byte indicating the 'protocol version', followed by 8 bytes indicating the schema identifier, and finally 4 bytes indicating the schema version, as per the Hortonworks Schema Registry serializers and deserializers, as found at https://github.com/hortonworks/registry. This will be prepended to each FlowFile. Note that if the schema for a record does not contain the necessary identifier and version, an Exception will be thrown when attempting to write the data.\",\n+                                        \"displayName\": \"HWX Content-Encoded Schema Reference\",\n+                                        \"value\": \"hwx-content-encoded-schema\"\n+                                    },\n+                                    {\n+                                        \"description\": \"The content of the FlowFile will contain a reference to a schema in the Schema Registry service. The reference is encoded as a single 'Magic Byte' followed by 4 bytes representing the identifier of the schema, as outlined at http://docs.confluent.io/current/schema-registry/docs/serializer-formatter.html. This will be prepended to each FlowFile. Note that if the schema for a record does not contain the necessary identifier and version, an Exception will be thrown when attempting to write the data. This is based on the encoding used by version 3.2.x of the Confluent Schema Registry.\",\n+                                        \"displayName\": \"Confluent Schema Registry Reference\",\n+                                        \"value\": \"confluent-encoded\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"NONE\",\n-                                \"description\": \"Specifies the snapshot deletion options to be used when deleting a blob.\",\n-                                \"displayName\": \"Delete Snapshots Option\",\n+                                \"defaultValue\": \"no-schema\",\n+                                \"description\": \"Specifies how the schema for a Record should be added to the data.\",\n+                                \"displayName\": \"Schema Write Strategy\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"delete-snapshots-option\",\n+                                \"name\": \"Schema Write Strategy\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"proxy-configuration-service\": {\n-                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests. Supported proxies: SOCKS, HTTP In case of SOCKS, it is not guaranteed that the selected SOCKS Version will be used by the processor.\",\n-                                \"displayName\": \"Proxy Configuration Service\",\n+                            \"Time Format\": {\n+                                \"description\": \"Specifies the format to use when reading/writing Time fields. If not specified, Time fields will be assumed to be number of milliseconds since epoch (Midnight, Jan 1, 1970 GMT). If specified, the value must match the Java Simple Date Format (for example, HH:mm:ss for a two-digit hour in 24-hour format, followed by a two-digit minute, followed by a two-digit second, all separated by ':' characters, as in 18:04:15).\",\n+                                \"displayName\": \"Time Format\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"proxy-configuration-service\",\n+                                \"name\": \"Time Format\",\n                                 \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.proxy.ProxyConfigurationService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n+                                \"sensitive\": false\n                             },\n-                            \"storage-credentials-service\": {\n-                                \"description\": \"Controller Service used to obtain Azure Blob Storage Credentials.\",\n-                                \"displayName\": \"Storage Credentials\",\n+                            \"Timestamp Format\": {\n+                                \"description\": \"Specifies the format to use when reading/writing Timestamp fields. If not specified, Timestamp fields will be assumed to be number of milliseconds since epoch (Midnight, Jan 1, 1970 GMT). If specified, the value must match the Java Simple Date Format (for example, MM/dd/yyyy HH:mm:ss for a two-digit month, followed by a two-digit day, followed by a four-digit year, all separated by '/' characters; and then followed by a two-digit hour in 24-hour format, followed by a two-digit minute, followed by a two-digit second, all separated by ':' characters, as in 01/01/2017 18:04:15).\",\n+                                \"displayName\": \"Timestamp Format\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"storage-credentials-service\",\n-                                \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-azure-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.services.azure.storage.AzureStorageCredentialsService_v12\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            }\n-                        },\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.processors.azure.storage.FetchAzureBlobStorage_v12\",\n-                            \"org.apache.nifi.processors.azure.storage.ListAzureBlobStorage_v12\",\n-                            \"org.apache.nifi.processors.azure.storage.PutAzureBlobStorage_v12\"\n-                        ],\n-                        \"sideEffectFree\": false,\n-                        \"supportedRelationships\": [\n-                            {\n-                                \"description\": \"All successfully processed FlowFiles are routed to this relationship\",\n-                                \"name\": \"success\"\n+                                \"name\": \"Timestamp Format\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n                             },\n-                            {\n-                                \"description\": \"Unsuccessful operations will be transferred to the failure relationship.\",\n-                                \"name\": \"failure\"\n-                            }\n-                        ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": false,\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": false,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"azure\",\n-                            \"blob\",\n-                            \"cloud\",\n-                            \"microsoft\",\n-                            \"storage\"\n-                        ],\n-                        \"triggerSerially\": false,\n-                        \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.azure.storage.DeleteAzureBlobStorage_v12\",\n-                        \"typeDescription\": \"Deletes the specified blob from Azure Blob Storage. The processor uses Azure Blob Storage client library v12.\",\n-                        \"version\": \"1.27.0\"\n-                    },\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-azure-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"e0c4461\"\n-                        },\n-                        \"defaultBulletinLevel\": \"WARN\",\n-                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": 1,\n-                            \"TIMER_DRIVEN\": 1\n-                        },\n-                        \"defaultPenaltyDuration\": \"30 sec\",\n-                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"0 sec\"\n-                        },\n-                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n-                        \"defaultYieldDuration\": \"1 sec\",\n-                        \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_REQUIRED\",\n-                        \"primaryNodeOnly\": false,\n-                        \"propertyDescriptors\": {\n-                            \"adls-credentials-service\": {\n-                                \"description\": \"Controller Service used to obtain Azure Credentials.\",\n-                                \"displayName\": \"ADLS Credentials\",\n+                            \"compression-format\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"none\",\n+                                        \"value\": \"none\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"gzip\",\n+                                        \"value\": \"gzip\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"bzip2\",\n+                                        \"value\": \"bzip2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"xz-lzma2\",\n+                                        \"value\": \"xz-lzma2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"snappy\",\n+                                        \"value\": \"snappy\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"snappy framed\",\n+                                        \"value\": \"snappy framed\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"zstd\",\n+                                        \"value\": \"zstd\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"none\",\n+                                \"description\": \"The compression format to use. Valid values are: GZIP, BZIP2, ZSTD, XZ-LZMA2, LZMA, Snappy, and Snappy Framed\",\n+                                \"displayName\": \"Compression Format\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"adls-credentials-service\",\n-                                \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-azure-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.services.azure.storage.ADLSCredentialsService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            },\n-                            \"directory-name\": {\n-                                \"description\": \"Name of the Azure Storage Directory. The Directory Name cannot contain a leading '/'. The root directory can be designated by the empty string value. In case of the PutAzureDataLakeStorage processor, the directory will be created if not already existing.\",\n-                                \"displayName\": \"Directory Name\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"directory-name\",\n+                                \"name\": \"compression-format\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"file-name\": {\n-                                \"defaultValue\": \"${azure.filename}\",\n+                            \"compression-level\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"0\",\n+                                        \"value\": \"0\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"1\",\n+                                        \"value\": \"1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"2\",\n+                                        \"value\": \"2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"3\",\n+                                        \"value\": \"3\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"4\",\n+                                        \"value\": \"4\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"5\",\n+                                        \"value\": \"5\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"6\",\n+                                        \"value\": \"6\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"7\",\n+                                        \"value\": \"7\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"8\",\n+                                        \"value\": \"8\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"9\",\n+                                        \"value\": \"9\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"1\",\n                                 \"dependencies\": [\n                                     {\n                                         \"dependentValues\": [\n-                                            \"file\"\n+                                            \"gzip\"\n                                         ],\n-                                        \"propertyDisplayName\": \"Filesystem Object Type\",\n-                                        \"propertyName\": \"filesystem-object-type\"\n+                                        \"propertyDisplayName\": \"Compression Format\",\n+                                        \"propertyName\": \"compression-format\"\n                                     }\n                                 ],\n-                                \"description\": \"The filename\",\n-                                \"displayName\": \"File Name\",\n+                                \"description\": \"The compression level to use; this is valid only when using GZIP compression. A lower value results in faster processing but less compression; a value of 0 indicates no compression but simply archiving\",\n+                                \"displayName\": \"Compression Level\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"file-name\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"compression-level\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"filesystem-name\": {\n-                                \"description\": \"Name of the Azure Storage File System (also called Container). It is assumed to be already existing.\",\n-                                \"displayName\": \"Filesystem Name\",\n+                            \"output-grouping\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"Output records as a JSON array\",\n+                                        \"displayName\": \"Array\",\n+                                        \"value\": \"output-array\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Output records with one JSON object per line, delimited by a newline character\",\n+                                        \"displayName\": \"One Line Per Object\",\n+                                        \"value\": \"output-oneline\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"output-array\",\n+                                \"description\": \"Specifies how the writer should output the JSON records (as an array or one object per line, e.g.) Note that if 'One Line Per Object' is selected, then Pretty Print JSON must be false.\",\n+                                \"displayName\": \"Output Grouping\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"filesystem-name\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"output-grouping\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"filesystem-object-type\": {\n+                            \"schema-access-strategy\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"The object to be deleted is a file.\",\n-                                        \"displayName\": \"File\",\n-                                        \"value\": \"file\"\n+                                        \"description\": \"The schema used to write records will be the same schema that was given to the Record when the Record was created.\",\n+                                        \"displayName\": \"Inherit Record Schema\",\n+                                        \"value\": \"inherit-record-schema\"\n                                     },\n                                     {\n-                                        \"description\": \"The object to be deleted is a directory.\",\n-                                        \"displayName\": \"Directory\",\n-                                        \"value\": \"directory\"\n+                                        \"description\": \"The name of the Schema to use is specified by the 'Schema Name' Property. The value of this property is used to lookup the Schema in the configured Schema Registry service.\",\n+                                        \"displayName\": \"Use 'Schema Name' Property\",\n+                                        \"value\": \"schema-name\"\n+                                    },\n+                                    {\n+                                        \"description\": \"The text of the Schema itself is specified by the 'Schema Text' Property. The value of this property must be a valid Avro Schema. If Expression Language is used, the value of the 'Schema Text' property must be valid after substituting the expressions.\",\n+                                        \"displayName\": \"Use 'Schema Text' Property\",\n+                                        \"value\": \"schema-text-property\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"file\",\n-                                \"description\": \"They type of the file system object to be deleted. It can be either folder or file.\",\n-                                \"displayName\": \"Filesystem Object Type\",\n+                                \"defaultValue\": \"inherit-record-schema\",\n+                                \"description\": \"Specifies how to obtain the schema that is to be used for interpreting the data.\",\n+                                \"displayName\": \"Schema Access Strategy\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"filesystem-object-type\",\n+                                \"name\": \"schema-access-strategy\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"proxy-configuration-service\": {\n-                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests. Supported proxies: SOCKS, HTTP In case of SOCKS, it is not guaranteed that the selected SOCKS Version will be used by the processor.\",\n-                                \"displayName\": \"Proxy Configuration Service\",\n+                            \"schema-branch\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"schema-name\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n+                                        \"propertyName\": \"schema-access-strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"Specifies the name of the branch to use when looking up the schema in the Schema Registry property. If the chosen Schema Registry does not support branching, this value will be ignored.\",\n+                                \"displayName\": \"Schema Branch\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"schema-branch\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"schema-cache\": {\n+                                \"description\": \"Specifies a Schema Cache to add the Record Schema to so that Record Readers can quickly lookup the schema.\",\n+                                \"displayName\": \"Schema Cache\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"proxy-configuration-service\",\n+                                \"name\": \"schema-cache\",\n                                 \"required\": false,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n                                     \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.proxy.ProxyConfigurationService\",\n+                                    \"type\": \"org.apache.nifi.serialization.RecordSchemaCacheService\",\n                                     \"version\": \"1.27.0\"\n                                 }\n-                            }\n-                        },\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.processors.azure.storage.FetchAzureDataLakeStorage\",\n-                            \"org.apache.nifi.processors.azure.storage.ListAzureDataLakeStorage\",\n-                            \"org.apache.nifi.processors.azure.storage.PutAzureDataLakeStorage\"\n-                        ],\n-                        \"sideEffectFree\": false,\n-                        \"supportedRelationships\": [\n-                            {\n-                                \"description\": \"Files that have been successfully written to Azure storage are transferred to this relationship\",\n-                                \"name\": \"success\"\n-                            },\n-                            {\n-                                \"description\": \"Files that could not be written to Azure storage for some reason are transferred to this relationship\",\n-                                \"name\": \"failure\"\n-                            }\n-                        ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": false,\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": false,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"adlsgen2\",\n-                            \"azure\",\n-                            \"cloud\",\n-                            \"datalake\",\n-                            \"microsoft\",\n-                            \"storage\"\n-                        ],\n-                        \"triggerSerially\": false,\n-                        \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.azure.storage.DeleteAzureDataLakeStorage\",\n-                        \"typeDescription\": \"Deletes the provided file from Azure Data Lake Storage\",\n-                        \"version\": \"1.27.0\"\n-                    },\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-azure-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"e0c4461\"\n-                        },\n-                        \"defaultBulletinLevel\": \"WARN\",\n-                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": 1,\n-                            \"TIMER_DRIVEN\": 1\n-                        },\n-                        \"defaultPenaltyDuration\": \"30 sec\",\n-                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"0 sec\"\n-                        },\n-                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n-                        \"defaultYieldDuration\": \"1 sec\",\n-                        \"deprecated\": true,\n-                        \"deprecationAlternatives\": [\n-                            \"org.apache.nifi.processors.azure.storage.FetchAzureBlobStorage_v12\"\n-                        ],\n-                        \"deprecationReason\": \"Processor depends on legacy Microsoft Azure SDK\",\n-                        \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_REQUIRED\",\n-                        \"primaryNodeOnly\": false,\n-                        \"propertyDescriptors\": {\n-                            \"blob\": {\n-                                \"defaultValue\": \"${azure.blobname}\",\n-                                \"description\": \"The filename of the blob\",\n-                                \"displayName\": \"Blob\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"blob\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"container-name\": {\n-                                \"description\": \"Name of the Azure storage container. In case of PutAzureBlobStorage processor, container can be created if it does not exist.\",\n-                                \"displayName\": \"Container Name\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"container-name\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n                             },\n-                            \"cse-key-id\": {\n+                            \"schema-name\": {\n+                                \"defaultValue\": \"${schema.name}\",\n                                 \"dependencies\": [\n                                     {\n                                         \"dependentValues\": [\n-                                            \"SYMMETRIC\"\n+                                            \"schema-name\"\n                                         ],\n-                                        \"propertyDisplayName\": \"Client-Side Encryption Key Type\",\n-                                        \"propertyName\": \"cse-key-type\"\n+                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n+                                        \"propertyName\": \"schema-access-strategy\"\n                                     }\n                                 ],\n-                                \"description\": \"Specifies the ID of the key to use for client-side encryption.\",\n-                                \"displayName\": \"Client-Side Encryption Key ID\",\n+                                \"description\": \"Specifies the name of the schema to lookup in the Schema Registry property\",\n+                                \"displayName\": \"Schema Name\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"cse-key-id\",\n+                                \"name\": \"schema-name\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"cse-key-type\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"The blobs sent to Azure are not encrypted.\",\n-                                        \"displayName\": \"NONE\",\n-                                        \"value\": \"NONE\"\n-                                    },\n+                            \"schema-protocol-version\": {\n+                                \"defaultValue\": \"1\",\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"The blobs sent to Azure are encrypted using a symmetric algorithm.\",\n-                                        \"displayName\": \"SYMMETRIC\",\n-                                        \"value\": \"SYMMETRIC\"\n+                                        \"dependentValues\": [\n+                                            \"hwx-schema-ref-attributes\",\n+                                            \"hwx-content-encoded-schema\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Schema Write Strategy\",\n+                                        \"propertyName\": \"Schema Write Strategy\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"NONE\",\n-                                \"description\": \"Specifies the key type to use for client-side encryption.\",\n-                                \"displayName\": \"Client-Side Encryption Key Type\",\n+                                \"description\": \"The protocol version to be used for Schema Write Strategies that require a protocol version, such as Hortonworks Schema Registry strategies. Valid protocol versions for Hortonworks Schema Registry are integer values 1, 2, or 3.\",\n+                                \"displayName\": \"Schema Protocol Version\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"cse-key-type\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"schema-protocol-version\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"cse-symmetric-key-hex\": {\n+                            \"schema-registry\": {\n                                 \"dependencies\": [\n                                     {\n                                         \"dependentValues\": [\n-                                            \"SYMMETRIC\"\n+                                            \"confluent-encoded\",\n+                                            \"schema-name\",\n+                                            \"hwx-schema-ref-attributes\",\n+                                            \"hwx-content-encoded-schema\"\n                                         ],\n-                                        \"propertyDisplayName\": \"Client-Side Encryption Key Type\",\n-                                        \"propertyName\": \"cse-key-type\"\n+                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n+                                        \"propertyName\": \"schema-access-strategy\"\n                                     }\n                                 ],\n-                                \"description\": \"When using symmetric client-side encryption, this is the raw key, encoded in hexadecimal\",\n-                                \"displayName\": \"Symmetric Key\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"cse-symmetric-key-hex\",\n-                                \"required\": false,\n-                                \"sensitive\": true\n-                            },\n-                            \"proxy-configuration-service\": {\n-                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests. Supported proxies: SOCKS, HTTP In case of SOCKS, it is not guaranteed that the selected SOCKS Version will be used by the processor.\",\n-                                \"displayName\": \"Proxy Configuration Service\",\n+                                \"description\": \"Specifies the Controller Service to use for the Schema Registry\",\n+                                \"displayName\": \"Schema Registry\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"proxy-configuration-service\",\n+                                \"name\": \"schema-registry\",\n                                 \"required\": false,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n                                     \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.proxy.ProxyConfigurationService\",\n+                                    \"type\": \"org.apache.nifi.schemaregistry.services.SchemaRegistry\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             },\n-                            \"range-length\": {\n-                                \"description\": \"The number of bytes to download from the blob, starting from the Range Start. An empty value or a value that extends beyond the end of the blob will read to the end of the blob.\",\n-                                \"displayName\": \"Range Length\",\n+                            \"schema-text\": {\n+                                \"defaultValue\": \"${avro.schema}\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"schema-text-property\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n+                                        \"propertyName\": \"schema-access-strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"The text of an Avro-formatted Schema\",\n+                                \"displayName\": \"Schema Text\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"range-length\",\n+                                \"name\": \"schema-text\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"range-start\": {\n-                                \"description\": \"The byte position at which to start reading from the blob. An empty value or a value of zero will start reading at the beginning of the blob.\",\n-                                \"displayName\": \"Range Start\",\n+                            \"schema-version\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"schema-name\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n+                                        \"propertyName\": \"schema-access-strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"Specifies the version of the schema to lookup in the Schema Registry. If not specified then the latest version of the schema will be retrieved.\",\n+                                \"displayName\": \"Schema Version\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"range-start\",\n+                                \"name\": \"schema-version\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"storage-account-key\": {\n-                                \"description\": \"The storage account key. This is an admin-like password providing access to every container in this account. It is recommended one uses Shared Access Signature (SAS) token instead for fine-grained control with policies. There are certain risks in allowing the account key to be stored as a flowfile attribute. While it does provide for a more flexible flow by allowing the account key to be fetched dynamically from a flowfile attribute, care must be taken to restrict access to the event provenance data (e.g., by strictly controlling the policies governing provenance for this processor). In addition, the provenance repositories may be put on encrypted disk partitions.\",\n-                                \"displayName\": \"Storage Account Key\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"storage-account-key\",\n-                                \"required\": false,\n-                                \"sensitive\": true\n-                            },\n-                            \"storage-account-name\": {\n-                                \"description\": \"The storage account name. There are certain risks in allowing the account name to be stored as a flowfile attribute. While it does provide for a more flexible flow by allowing the account name to be fetched dynamically from a flowfile attribute, care must be taken to restrict access to the event provenance data (e.g., by strictly controlling the policies governing provenance for this processor). In addition, the provenance repositories may be put on encrypted disk partitions. Instead of defining the Storage Account Name, Storage Account Key and SAS Token properties directly on the processor, the preferred way is to configure them through a controller service specified in the Storage Credentials property. The controller service can provide a common/shared configuration for multiple/all Azure processors. Furthermore, the credentials can also be looked up dynamically with the 'Lookup' version of the service.\",\n-                                \"displayName\": \"Storage Account Name\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"storage-account-name\",\n-                                \"required\": false,\n-                                \"sensitive\": true\n-                            },\n-                            \"storage-credentials-service\": {\n-                                \"description\": \"The Controller Service used to obtain Azure Storage Credentials. Instead of the processor level properties, the credentials can be configured here through a common/shared controller service, which is the preferred way. The 'Lookup' version of the service can also be used to select the credentials dynamically at runtime based on a FlowFile attribute (if the processor has FlowFile input).\",\n-                                \"displayName\": \"Storage Credentials\",\n+                            \"suppress-nulls\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"Fields that are missing (present in the schema but not in the record), or that have a value of null, will be written out as a null value\",\n+                                        \"displayName\": \"Never Suppress\",\n+                                        \"value\": \"never-suppress\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Fields that are missing (present in the schema but not in the record), or that have a value of null, will not be written out\",\n+                                        \"displayName\": \"Always Suppress\",\n+                                        \"value\": \"always-suppress\"\n+                                    },\n+                                    {\n+                                        \"description\": \"When a field has a value of null, it will be written out. However, if a field is defined in the schema and not present in the record, the field will not be written out.\",\n+                                        \"displayName\": \"Suppress Missing Values\",\n+                                        \"value\": \"suppress-missing\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"never-suppress\",\n+                                \"description\": \"Specifies how the writer should handle a null field\",\n+                                \"displayName\": \"Suppress Null Values\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"storage-credentials-service\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-azure-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.services.azure.storage.AzureStorageCredentialsService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            },\n-                            \"storage-endpoint-suffix\": {\n-                                \"description\": \"Storage accounts in public Azure always use a common FQDN suffix. Override this endpoint suffix with a different suffix in certain circumstances (like Azure Stack or non-public Azure regions). The preferred way is to configure them through a controller service specified in the Storage Credentials property. The controller service can provide a common/shared configuration for multiple/all Azure processors. Furthermore, the credentials can also be looked up dynamically with the 'Lookup' version of the service.\",\n-                                \"displayName\": \"Common Storage Account Endpoint Suffix\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"storage-endpoint-suffix\",\n-                                \"required\": false,\n+                                \"name\": \"suppress-nulls\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n-                            },\n-                            \"storage-sas-token\": {\n-                                \"description\": \"Shared Access Signature token, including the leading '?'. Specify either SAS token (recommended) or Account Key. There are certain risks in allowing the SAS token to be stored as a flowfile attribute. While it does provide for a more flexible flow by allowing the SAS token to be fetched dynamically from a flowfile attribute, care must be taken to restrict access to the event provenance data (e.g., by strictly controlling the policies governing provenance for this processor). In addition, the provenance repositories may be put on encrypted disk partitions.\",\n-                                \"displayName\": \"SAS Token\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"storage-sas-token\",\n-                                \"required\": false,\n-                                \"sensitive\": true\n                             }\n                         },\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.processors.azure.storage.DeleteAzureBlobStorage\",\n-                            \"org.apache.nifi.processors.azure.storage.ListAzureBlobStorage\",\n-                            \"org.apache.nifi.processors.azure.storage.PutAzureBlobStorage\"\n-                        ],\n-                        \"sideEffectFree\": false,\n-                        \"supportedRelationships\": [\n-                            {\n-                                \"description\": \"All successfully processed FlowFiles are routed to this relationship\",\n-                                \"name\": \"success\"\n-                            },\n+                        \"providedApiImplementations\": [\n                             {\n-                                \"description\": \"Unsuccessful operations will be transferred to the failure relationship.\",\n-                                \"name\": \"failure\"\n+                                \"artifact\": \"nifi-standard-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n+                                \"version\": \"1.27.0\"\n                             }\n                         ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n-                        \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"azure\",\n-                            \"blob\",\n-                            \"cloud\",\n-                            \"microsoft\",\n-                            \"storage\"\n+                            \"json\",\n+                            \"record\",\n+                            \"recordset\",\n+                            \"resultset\",\n+                            \"row\",\n+                            \"serialize\",\n+                            \"writer\"\n                         ],\n-                        \"triggerSerially\": false,\n-                        \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.azure.storage.FetchAzureBlobStorage\",\n-                        \"typeDescription\": \"Retrieves contents of an Azure Storage Blob, writing the contents to the content of the FlowFile\",\n-                        \"version\": \"1.27.0\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"The length of the blob fetched\",\n-                                \"name\": \"azure.length\"\n-                            }\n-                        ]\n+                        \"type\": \"org.apache.nifi.json.JsonRecordSetWriter\",\n+                        \"typeDescription\": \"Writes the results of a RecordSet as either a JSON Array or one JSON object per line. If using Array output, then even if the RecordSet consists of a single row, it will be written as an array with a single element. If using One Line Per Object output, the JSON objects cannot be pretty-printed.\",\n+                        \"version\": \"1.27.0\"\n                     },\n                     {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-azure-nar\",\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-record-serialization-services-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n-                        \"defaultBulletinLevel\": \"WARN\",\n-                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": 1,\n-                            \"TIMER_DRIVEN\": 1\n-                        },\n-                        \"defaultPenaltyDuration\": \"30 sec\",\n-                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"0 sec\"\n-                        },\n-                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n-                        \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_REQUIRED\",\n-                        \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Client-Side Encryption Key ID\": {\n-                                \"dependencies\": [\n+                            \"Allow Comments\": {\n+                                \"allowableValues\": [\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"LOCAL\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Client-Side Encryption Key Type\",\n-                                        \"propertyName\": \"Client-Side Encryption Key Type\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"description\": \"Specifies the ID of the key to use for client-side encryption.\",\n-                                \"displayName\": \"Client-Side Encryption Key ID\",\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"Whether to allow comments when parsing the JSON document\",\n+                                \"displayName\": \"Allow Comments\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Client-Side Encryption Key ID\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Allow Comments\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Client-Side Encryption Key Type\": {\n+                            \"Date Format\": {\n+                                \"description\": \"Specifies the format to use when reading/writing Date fields. If not specified, Date fields will be assumed to be number of milliseconds since epoch (Midnight, Jan 1, 1970 GMT). If specified, the value must match the Java Simple Date Format (for example, MM/dd/yyyy for a two-digit month, followed by a two-digit day, followed by a four-digit year, all separated by '/' characters, as in 01/01/2017).\",\n+                                \"displayName\": \"Date Format\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Date Format\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Max String Length\": {\n+                                \"defaultValue\": \"20 MB\",\n+                                \"description\": \"The maximum allowed length of a string value when parsing the JSON document\",\n+                                \"displayName\": \"Max String Length\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Max String Length\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Time Format\": {\n+                                \"description\": \"Specifies the format to use when reading/writing Time fields. If not specified, Time fields will be assumed to be number of milliseconds since epoch (Midnight, Jan 1, 1970 GMT). If specified, the value must match the Java Simple Date Format (for example, HH:mm:ss for a two-digit hour in 24-hour format, followed by a two-digit minute, followed by a two-digit second, all separated by ':' characters, as in 18:04:15).\",\n+                                \"displayName\": \"Time Format\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Time Format\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Timestamp Format\": {\n+                                \"description\": \"Specifies the format to use when reading/writing Timestamp fields. If not specified, Timestamp fields will be assumed to be number of milliseconds since epoch (Midnight, Jan 1, 1970 GMT). If specified, the value must match the Java Simple Date Format (for example, MM/dd/yyyy HH:mm:ss for a two-digit month, followed by a two-digit day, followed by a four-digit year, all separated by '/' characters; and then followed by a two-digit hour in 24-hour format, followed by a two-digit minute, followed by a two-digit second, all separated by ':' characters, as in 01/01/2017 18:04:15).\",\n+                                \"displayName\": \"Timestamp Format\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Timestamp Format\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"schema-access-strategy\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Client-Side Encryption disabled\",\n-                                        \"displayName\": \"NONE\",\n-                                        \"value\": \"NONE\"\n+                                        \"description\": \"The Schema of the data will be inferred automatically when the data is read. See component Usage and Additional Details for information about how the schema is inferred.\",\n+                                        \"displayName\": \"Infer Schema\",\n+                                        \"value\": \"infer-schema\"\n                                     },\n                                     {\n-                                        \"description\": \"Client-Side Encryption enabled using local key\",\n-                                        \"displayName\": \"LOCAL\",\n-                                        \"value\": \"LOCAL\"\n+                                        \"description\": \"The name of the Schema to use is specified by the 'Schema Name' Property. The value of this property is used to lookup the Schema in the configured Schema Registry service.\",\n+                                        \"displayName\": \"Use 'Schema Name' Property\",\n+                                        \"value\": \"schema-name\"\n+                                    },\n+                                    {\n+                                        \"description\": \"The text of the Schema itself is specified by the 'Schema Text' Property. The value of this property must be a valid Avro Schema. If Expression Language is used, the value of the 'Schema Text' property must be valid after substituting the expressions.\",\n+                                        \"displayName\": \"Use 'Schema Text' Property\",\n+                                        \"value\": \"schema-text-property\"\n+                                    },\n+                                    {\n+                                        \"description\": \"The FlowFile contains 3 Attributes that will be used to lookup a Schema from the configured Schema Registry: 'schema.identifier', 'schema.version', and 'schema.protocol.version'\",\n+                                        \"displayName\": \"HWX Schema Reference Attributes\",\n+                                        \"value\": \"hwx-schema-ref-attributes\"\n+                                    },\n+                                    {\n+                                        \"description\": \"The content of the FlowFile contains a reference to a schema in the Schema Registry service. The reference is encoded as a single byte indicating the 'protocol version', followed by 8 bytes indicating the schema identifier, and finally 4 bytes indicating the schema version, as per the Hortonworks Schema Registry serializers and deserializers, found at https://github.com/hortonworks/registry\",\n+                                        \"displayName\": \"HWX Content-Encoded Schema Reference\",\n+                                        \"value\": \"hwx-content-encoded-schema\"\n+                                    },\n+                                    {\n+                                        \"description\": \"The content of the FlowFile contains a reference to a schema in the Schema Registry service. The reference is encoded as a single 'Magic Byte' followed by 4 bytes representing the identifier of the schema, as outlined at http://docs.confluent.io/current/schema-registry/docs/serializer-formatter.html. This is based on version 3.2.x of the Confluent Schema Registry.\",\n+                                        \"displayName\": \"Confluent Content-Encoded Schema Reference\",\n+                                        \"value\": \"confluent-encoded\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"NONE\",\n-                                \"description\": \"Specifies the key type to use for client-side encryption.\",\n-                                \"displayName\": \"Client-Side Encryption Key Type\",\n+                                \"defaultValue\": \"infer-schema\",\n+                                \"description\": \"Specifies how to obtain the schema that is to be used for interpreting the data.\",\n+                                \"displayName\": \"Schema Access Strategy\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Client-Side Encryption Key Type\",\n+                                \"name\": \"schema-access-strategy\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Client-Side Encryption Local Key\": {\n+                            \"schema-application-strategy\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"Applies the schema for the whole JSON.\",\n+                                        \"displayName\": \"Whole JSON\",\n+                                        \"value\": \"WHOLE_JSON\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Applies the schema for the selected part starting from the \\\"Starting Field Name\\\".\",\n+                                        \"displayName\": \"Selected Part\",\n+                                        \"value\": \"SELECTED_PART\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"SELECTED_PART\",\n                                 \"dependencies\": [\n                                     {\n                                         \"dependentValues\": [\n-                                            \"LOCAL\"\n+                                            \"confluent-encoded\",\n+                                            \"schema-name\",\n+                                            \"schema-text-property\",\n+                                            \"hwx-schema-ref-attributes\",\n+                                            \"hwx-content-encoded-schema\"\n                                         ],\n-                                        \"propertyDisplayName\": \"Client-Side Encryption Key Type\",\n-                                        \"propertyName\": \"Client-Side Encryption Key Type\"\n+                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n+                                        \"propertyName\": \"schema-access-strategy\"\n+                                    },\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"NESTED_FIELD\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Starting Field Strategy\",\n+                                        \"propertyName\": \"starting-field-strategy\"\n                                     }\n                                 ],\n-                                \"description\": \"When using local client-side encryption, this is the raw key, encoded in hexadecimal\",\n-                                \"displayName\": \"Client-Side Encryption Local Key\",\n+                                \"description\": \"Specifies whether the schema is defined for the whole JSON or for the selected part starting from \\\"Starting Field Name\\\".\",\n+                                \"displayName\": \"Schema Application Strategy\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Client-Side Encryption Local Key\",\n+                                \"name\": \"schema-application-strategy\",\n                                 \"required\": true,\n-                                \"sensitive\": true\n+                                \"sensitive\": false\n                             },\n-                            \"blob-name\": {\n-                                \"defaultValue\": \"${azure.blobname}\",\n-                                \"description\": \"The full name of the blob\",\n-                                \"displayName\": \"Blob Name\",\n+                            \"schema-branch\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"schema-name\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n+                                        \"propertyName\": \"schema-access-strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"Specifies the name of the branch to use when looking up the schema in the Schema Registry property. If the chosen Schema Registry does not support branching, this value will be ignored.\",\n+                                \"displayName\": \"Schema Branch\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"blob-name\",\n-                                \"required\": true,\n+                                \"name\": \"schema-branch\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"container-name\": {\n-                                \"defaultValue\": \"${azure.container}\",\n-                                \"description\": \"Name of the Azure storage container. In case of PutAzureBlobStorage processor, container can be created if it does not exist.\",\n-                                \"displayName\": \"Container Name\",\n+                            \"schema-inference-cache\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"infer-schema\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n+                                        \"propertyName\": \"schema-access-strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"Specifies a Schema Cache to use when inferring the schema. If not populated, the schema will be inferred each time. However, if a cache is specified, the cache will first be consulted and if the applicable schema can be found, it will be used instead of inferring the schema.\",\n+                                \"displayName\": \"Schema Inference Cache\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"schema-inference-cache\",\n+                                \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.serialization.RecordSchemaCacheService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"schema-name\": {\n+                                \"defaultValue\": \"${schema.name}\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"schema-name\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n+                                        \"propertyName\": \"schema-access-strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"Specifies the name of the schema to lookup in the Schema Registry property\",\n+                                \"displayName\": \"Schema Name\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"container-name\",\n-                                \"required\": true,\n+                                \"name\": \"schema-name\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"proxy-configuration-service\": {\n-                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests. Supported proxies: SOCKS, HTTP In case of SOCKS, it is not guaranteed that the selected SOCKS Version will be used by the processor.\",\n-                                \"displayName\": \"Proxy Configuration Service\",\n+                            \"schema-registry\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"confluent-encoded\",\n+                                            \"schema-name\",\n+                                            \"hwx-schema-ref-attributes\",\n+                                            \"hwx-content-encoded-schema\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n+                                        \"propertyName\": \"schema-access-strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"Specifies the Controller Service to use for the Schema Registry\",\n+                                \"displayName\": \"Schema Registry\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"proxy-configuration-service\",\n+                                \"name\": \"schema-registry\",\n                                 \"required\": false,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n                                     \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.proxy.ProxyConfigurationService\",\n+                                    \"type\": \"org.apache.nifi.schemaregistry.services.SchemaRegistry\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             },\n-                            \"range-length\": {\n-                                \"description\": \"The number of bytes to download from the blob, starting from the Range Start. An empty value or a value that extends beyond the end of the blob will read to the end of the blob.\",\n-                                \"displayName\": \"Range Length\",\n+                            \"schema-text\": {\n+                                \"defaultValue\": \"${avro.schema}\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"schema-text-property\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n+                                        \"propertyName\": \"schema-access-strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"The text of an Avro-formatted Schema\",\n+                                \"displayName\": \"Schema Text\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"range-length\",\n+                                \"name\": \"schema-text\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"range-start\": {\n-                                \"description\": \"The byte position at which to start reading from the blob. An empty value or a value of zero will start reading at the beginning of the blob.\",\n-                                \"displayName\": \"Range Start\",\n+                            \"schema-version\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"schema-name\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n+                                        \"propertyName\": \"schema-access-strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"Specifies the version of the schema to lookup in the Schema Registry. If not specified then the latest version of the schema will be retrieved.\",\n+                                \"displayName\": \"Schema Version\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"range-start\",\n+                                \"name\": \"schema-version\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"storage-credentials-service\": {\n-                                \"description\": \"Controller Service used to obtain Azure Blob Storage Credentials.\",\n-                                \"displayName\": \"Storage Credentials\",\n+                            \"starting-field-name\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"NESTED_FIELD\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Starting Field Strategy\",\n+                                        \"propertyName\": \"starting-field-strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"Skips forward to the given nested JSON field (array or object) to begin processing.\",\n+                                \"displayName\": \"Starting Field Name\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"storage-credentials-service\",\n+                                \"name\": \"starting-field-name\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"starting-field-strategy\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"Begins processing from the root node.\",\n+                                        \"displayName\": \"Root Node\",\n+                                        \"value\": \"ROOT_NODE\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Skips forward to the given nested JSON field (array or object) to begin processing.\",\n+                                        \"displayName\": \"Nested Field\",\n+                                        \"value\": \"NESTED_FIELD\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"ROOT_NODE\",\n+                                \"description\": \"Start processing from the root node or from a specified nested node.\",\n+                                \"displayName\": \"Starting Field Strategy\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"starting-field-strategy\",\n                                 \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-azure-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.services.azure.storage.AzureStorageCredentialsService_v12\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n+                                \"sensitive\": false\n                             }\n                         },\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.processors.azure.storage.DeleteAzureBlobStorage_v12\",\n-                            \"org.apache.nifi.processors.azure.storage.ListAzureBlobStorage_v12\",\n-                            \"org.apache.nifi.processors.azure.storage.PutAzureBlobStorage_v12\"\n-                        ],\n-                        \"sideEffectFree\": false,\n-                        \"supportedRelationships\": [\n-                            {\n-                                \"description\": \"All successfully processed FlowFiles are routed to this relationship\",\n-                                \"name\": \"success\"\n-                            },\n+                        \"providedApiImplementations\": [\n                             {\n-                                \"description\": \"Unsuccessful operations will be transferred to the failure relationship.\",\n-                                \"name\": \"failure\"\n+                                \"artifact\": \"nifi-standard-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n+                                \"version\": \"1.27.0\"\n                             }\n                         ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.json.JsonPathReader\"\n                         ],\n-                        \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n-                        \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"azure\",\n-                            \"blob\",\n-                            \"cloud\",\n-                            \"microsoft\",\n-                            \"storage\"\n+                            \"json\",\n+                            \"parser\",\n+                            \"reader\",\n+                            \"record\",\n+                            \"tree\"\n                         ],\n-                        \"triggerSerially\": false,\n-                        \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.azure.storage.FetchAzureBlobStorage_v12\",\n-                        \"typeDescription\": \"Retrieves the specified blob from Azure Blob Storage and writes its content to the content of the FlowFile. The processor uses Azure Blob Storage client library v12.\",\n-                        \"version\": \"1.27.0\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"The name of the Azure Blob Storage container\",\n-                                \"name\": \"azure.container\"\n-                            },\n-                            {\n-                                \"description\": \"The name of the blob on Azure Blob Storage\",\n-                                \"name\": \"azure.blobname\"\n-                            },\n-                            {\n-                                \"description\": \"Primary location of the blob\",\n-                                \"name\": \"azure.primaryUri\"\n-                            },\n-                            {\n-                                \"description\": \"ETag of the blob\",\n-                                \"name\": \"azure.etag\"\n-                            },\n-                            {\n-                                \"description\": \"Type of the blob (either BlockBlob, PageBlob or AppendBlob)\",\n-                                \"name\": \"azure.blobtype\"\n-                            },\n+                        \"type\": \"org.apache.nifi.json.JsonTreeReader\",\n+                        \"typeDescription\": \"Parses JSON into individual Record objects. While the reader expects each record to be well-formed JSON, the content of a FlowFile may consist of many records, each as a well-formed JSON array or JSON object with optional whitespace between them, such as the common 'JSON-per-line' format. If an array is encountered, each element in that array will be treated as a separate record. If the schema that is configured contains a field that is not present in the JSON, a null value will be used. If the JSON contains a field that is not present in the schema, that field will be skipped. See the Usage of the Controller Service for more information and examples.\",\n+                        \"version\": \"1.27.0\"\n+                    },\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-record-serialization-services-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"e0c4461\"\n+                        },\n+                        \"dynamicProperties\": [\n                             {\n-                                \"description\": \"MIME Type of the content\",\n-                                \"name\": \"mime.type\"\n-                            },\n+                                \"description\": \"\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"name\": \"Name of the RecordReader\",\n+                                \"value\": \"A RecordReaderFactory controller service\"\n+                            }\n+                        ],\n+                        \"group\": \"org.apache.nifi\",\n+                        \"propertyDescriptors\": {\n+                            \"Service to Use\": {\n+                                \"defaultValue\": \"${recordreader.name}\",\n+                                \"description\": \"Specifies the name of the user-defined property whose associated Controller Service should be used.\",\n+                                \"displayName\": \"Service to Use\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Service to Use\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            }\n+                        },\n+                        \"providedApiImplementations\": [\n                             {\n-                                \"description\": \"Language code for the content\",\n-                                \"name\": \"lang\"\n-                            },\n+                                \"artifact\": \"nifi-standard-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n+                                \"version\": \"1.27.0\"\n+                            }\n+                        ],\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.lookup.RecordSetWriterLookup\"\n+                        ],\n+                        \"supportsDynamicProperties\": true,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"lookup\",\n+                            \"parse\",\n+                            \"reader\",\n+                            \"record\",\n+                            \"row\"\n+                        ],\n+                        \"type\": \"org.apache.nifi.lookup.ReaderLookup\",\n+                        \"typeDescription\": \"Provides a RecordReaderFactory that can be used to dynamically select another RecordReaderFactory. This will allow multiple RecordReaderFactories to be defined and registered, and then selected dynamically at runtime by referencing a FlowFile attribute in the Service to Use property.\",\n+                        \"version\": \"1.27.0\"\n+                    },\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-record-serialization-services-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"e0c4461\"\n+                        },\n+                        \"dynamicProperties\": [\n                             {\n-                                \"description\": \"Timestamp of the blob\",\n-                                \"name\": \"azure.timestamp\"\n-                            },\n+                                \"description\": \"\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"name\": \"Name of the RecordSetWriter\",\n+                                \"value\": \"A RecordSetWriterFactory controller service\"\n+                            }\n+                        ],\n+                        \"group\": \"org.apache.nifi\",\n+                        \"propertyDescriptors\": {\n+                            \"Service to Use\": {\n+                                \"defaultValue\": \"${recordsetwriter.name}\",\n+                                \"description\": \"Specifies the name of the user-defined property whose associated Controller Service should be used.\",\n+                                \"displayName\": \"Service to Use\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Service to Use\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            }\n+                        },\n+                        \"providedApiImplementations\": [\n                             {\n-                                \"description\": \"Length of the blob\",\n-                                \"name\": \"azure.length\"\n+                                \"artifact\": \"nifi-standard-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n+                                \"version\": \"1.27.0\"\n                             }\n-                        ]\n+                        ],\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.lookup.ReaderLookup\"\n+                        ],\n+                        \"supportsDynamicProperties\": true,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"lookup\",\n+                            \"record\",\n+                            \"recordset\",\n+                            \"result\",\n+                            \"row\",\n+                            \"serializer\",\n+                            \"set\",\n+                            \"writer\"\n+                        ],\n+                        \"type\": \"org.apache.nifi.lookup.RecordSetWriterLookup\",\n+                        \"typeDescription\": \"Provides a RecordSetWriterFactory that can be used to dynamically select another RecordSetWriterFactory. This will allow multiple RecordSetWriterFactory's to be defined and registered, and then selected dynamically at runtime by tagging FlowFiles with the attributes and referencing those attributes in the Service to Use property.\",\n+                        \"version\": \"1.27.0\"\n                     },\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-azure-nar\",\n+                        \"artifact\": \"nifi-record-serialization-services-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n-                        \"defaultBulletinLevel\": \"WARN\",\n-                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": 1,\n-                            \"TIMER_DRIVEN\": 1\n+                        \"group\": \"org.apache.nifi\",\n+                        \"propertyDescriptors\": {\n+                            \"max-cache-size\": {\n+                                \"defaultValue\": \"100\",\n+                                \"description\": \"The maximum number of Schemas to cache.\",\n+                                \"displayName\": \"Maximum Cache Size\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"max-cache-size\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            }\n                         },\n-                        \"defaultPenaltyDuration\": \"30 sec\",\n-                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"0 sec\"\n+                        \"providedApiImplementations\": [\n+                            {\n+                                \"artifact\": \"nifi-standard-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.serialization.RecordSchemaCacheService\",\n+                                \"version\": \"1.27.0\"\n+                            }\n+                        ],\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"cache\",\n+                            \"record\",\n+                            \"schema\"\n+                        ],\n+                        \"type\": \"org.apache.nifi.schema.inference.VolatileSchemaCache\",\n+                        \"typeDescription\": \"Provides a Schema Cache that evicts elements based on a Least-Recently-Used algorithm. This cache is not persisted, so any restart of NiFi will result in the cache being cleared. Additionally, the cache will be cleared any time that the Controller Service is stopped and restarted.\",\n+                        \"version\": \"1.27.0\"\n+                    },\n+                    {\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-record-serialization-services-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"e0c4461\"\n                         },\n-                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n-                        \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_REQUIRED\",\n-                        \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"adls-credentials-service\": {\n-                                \"description\": \"Controller Service used to obtain Azure Credentials.\",\n-                                \"displayName\": \"ADLS Credentials\",\n+                            \"Character Set\": {\n+                                \"defaultValue\": \"UTF-8\",\n+                                \"description\": \"Specifies which character set of the Syslog messages\",\n+                                \"displayName\": \"Character Set\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"adls-credentials-service\",\n-                                \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-azure-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.services.azure.storage.ADLSCredentialsService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            },\n-                            \"directory-name\": {\n-                                \"description\": \"Name of the Azure Storage Directory. The Directory Name cannot contain a leading '/'. The root directory can be designated by the empty string value. In case of the PutAzureDataLakeStorage processor, the directory will be created if not already existing.\",\n-                                \"displayName\": \"Directory Name\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"directory-name\",\n+                                \"name\": \"Character Set\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"file-name\": {\n-                                \"defaultValue\": \"${azure.filename}\",\n-                                \"description\": \"The filename\",\n-                                \"displayName\": \"File Name\",\n+                            \"syslog-5424-reader-raw-message\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"If true, the record will have a _raw field containing the raw message\",\n+                                \"displayName\": \"Raw message\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"file-name\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"syslog-5424-reader-raw-message\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n-                            },\n-                            \"filesystem-name\": {\n-                                \"description\": \"Name of the Azure Storage File System (also called Container). It is assumed to be already existing.\",\n-                                \"displayName\": \"Filesystem Name\",\n+                            }\n+                        },\n+                        \"providedApiImplementations\": [\n+                            {\n+                                \"artifact\": \"nifi-standard-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n+                                \"version\": \"1.27.0\"\n+                            }\n+                        ],\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"logfiles\",\n+                            \"logs\",\n+                            \"parse\",\n+                            \"reader\",\n+                            \"record\",\n+                            \"syslog\",\n+                            \"syslog 5424\",\n+                            \"text\"\n+                        ],\n+                        \"type\": \"org.apache.nifi.syslog.Syslog5424Reader\",\n+                        \"typeDescription\": \"Provides a mechanism for reading RFC 5424 compliant Syslog data, such as log files, and structuring the data so that it can be processed.\",\n+                        \"version\": \"1.27.0\"\n+                    },\n+                    {\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-record-serialization-services-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"e0c4461\"\n+                        },\n+                        \"group\": \"org.apache.nifi\",\n+                        \"propertyDescriptors\": {\n+                            \"Character Set\": {\n+                                \"defaultValue\": \"UTF-8\",\n+                                \"description\": \"Specifies which character set of the Syslog messages\",\n+                                \"displayName\": \"Character Set\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"filesystem-name\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Character Set\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"number-of-retries\": {\n-                                \"defaultValue\": \"0\",\n-                                \"description\": \"The number of automatic retries to perform if the download fails.\",\n-                                \"displayName\": \"Number of Retries\",\n+                            \"syslog-5424-reader-raw-message\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"If true, the record will have a _raw field containing the raw message\",\n+                                \"displayName\": \"Raw message\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"number-of-retries\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"syslog-5424-reader-raw-message\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n-                            },\n-                            \"proxy-configuration-service\": {\n-                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests. Supported proxies: SOCKS, HTTP In case of SOCKS, it is not guaranteed that the selected SOCKS Version will be used by the processor.\",\n-                                \"displayName\": \"Proxy Configuration Service\",\n+                            }\n+                        },\n+                        \"providedApiImplementations\": [\n+                            {\n+                                \"artifact\": \"nifi-standard-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n+                                \"version\": \"1.27.0\"\n+                            }\n+                        ],\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"logfiles\",\n+                            \"logs\",\n+                            \"parse\",\n+                            \"reader\",\n+                            \"record\",\n+                            \"syslog\",\n+                            \"text\"\n+                        ],\n+                        \"type\": \"org.apache.nifi.syslog.SyslogReader\",\n+                        \"typeDescription\": \"Attempts to parses the contents of a Syslog message in accordance to RFC5424 and RFC3164. In the case of RFC5424 formatted messages, structured data is not supported, and will be returned as part of the message.Note: Be mindfull that RFC3164 is informational and a wide range of different implementations are present in the wild.\",\n+                        \"version\": \"1.27.0\"\n+                    },\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-record-serialization-services-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"e0c4461\"\n+                        },\n+                        \"group\": \"org.apache.nifi\",\n+                        \"propertyDescriptors\": {\n+                            \"Character Set\": {\n+                                \"defaultValue\": \"UTF-8\",\n+                                \"description\": \"The Character set to use when writing the data to the FlowFile\",\n+                                \"displayName\": \"Character Set\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"proxy-configuration-service\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.proxy.ProxyConfigurationService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            },\n-                            \"range-length\": {\n-                                \"description\": \"The number of bytes to download from the object, starting from the Range Start. An empty value or a value that extends beyond the end of the object will read to the end of the object.\",\n-                                \"displayName\": \"Range Length\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"range-length\",\n-                                \"required\": false,\n+                                \"name\": \"Character Set\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"range-start\": {\n-                                \"description\": \"The byte position at which to start reading from the object. An empty value or a value of zero will start reading at the beginning of the object.\",\n-                                \"displayName\": \"Range Start\",\n+                            \"Text\": {\n+                                \"description\": \"The text to use when writing the results. This property will evaluate the Expression Language using any of the fields available in a Record.\",\n+                                \"displayName\": \"Text\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"range-start\",\n-                                \"required\": false,\n+                                \"name\": \"Text\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             }\n                         },\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.processors.azure.storage.DeleteAzureDataLakeStorage\",\n-                            \"org.apache.nifi.processors.azure.storage.ListAzureDataLakeStorage\",\n-                            \"org.apache.nifi.processors.azure.storage.PutAzureDataLakeStorage\"\n-                        ],\n-                        \"sideEffectFree\": false,\n-                        \"supportedRelationships\": [\n-                            {\n-                                \"description\": \"Files that have been successfully written to Azure storage are transferred to this relationship\",\n-                                \"name\": \"success\"\n-                            },\n+                        \"providedApiImplementations\": [\n                             {\n-                                \"description\": \"Files that could not be written to Azure storage for some reason are transferred to this relationship\",\n-                                \"name\": \"failure\"\n+                                \"artifact\": \"nifi-standard-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n+                                \"version\": \"1.27.0\"\n                             }\n                         ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n-                        \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"adlsgen2\",\n-                            \"azure\",\n-                            \"cloud\",\n-                            \"datalake\",\n-                            \"microsoft\",\n-                            \"storage\"\n+                            \"el\",\n+                            \"expression\",\n+                            \"freeform\",\n+                            \"language\",\n+                            \"record\",\n+                            \"recordset\",\n+                            \"resultset\",\n+                            \"serialize\",\n+                            \"text\",\n+                            \"writer\"\n                         ],\n-                        \"triggerSerially\": false,\n-                        \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.azure.storage.FetchAzureDataLakeStorage\",\n-                        \"typeDescription\": \"Fetch the provided file from Azure Data Lake Storage\",\n-                        \"version\": \"1.27.0\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"The HTTP error code (if available) from the failed operation\",\n-                                \"name\": \"azure.datalake.storage.statusCode\"\n-                            },\n-                            {\n-                                \"description\": \"The Azure Data Lake Storage moniker of the failed operation\",\n-                                \"name\": \"azure.datalake.storage.errorCode\"\n-                            },\n+                        \"type\": \"org.apache.nifi.text.FreeFormTextRecordSetWriter\",\n+                        \"typeDescription\": \"Writes the contents of a RecordSet as free-form text. The configured text is able to make use of the Expression Language to reference each of the fields that are available in a Record, as well as the attributes in the FlowFile and variables. If there is a name collision, the field name/value is used before attributes or variables. Each record in the RecordSet will be separated by a single newline character.\",\n+                        \"version\": \"1.27.0\"\n+                    },\n+                    {\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-record-serialization-services-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"e0c4461\"\n+                        },\n+                        \"group\": \"org.apache.nifi\",\n+                        \"providedApiImplementations\": [\n                             {\n-                                \"description\": \"The Azure Data Lake Storage error message from the failed operation\",\n-                                \"name\": \"azure.datalake.storage.errorMessage\"\n+                                \"artifact\": \"nifi-standard-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n+                                \"version\": \"1.27.0\"\n                             }\n-                        ]\n+                        ],\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"event\",\n+                            \"log\",\n+                            \"parser\",\n+                            \"reader\",\n+                            \"record\",\n+                            \"windows\",\n+                            \"xml\"\n+                        ],\n+                        \"type\": \"org.apache.nifi.windowsevent.WindowsEventLogReader\",\n+                        \"typeDescription\": \"Reads Windows Event Log data as XML content having been generated by ConsumeWindowsEventLog, ParseEvtx, etc. (see Additional Details) and creates Record object(s). If the root tag of the input XML is 'Events', the child content is expected to be a series of 'Event' tags, each of which will constitute a single record. If the root tag is 'Event', the content is expected to be a single 'Event' and thus a single record. No other root tags are valid. Only events of type 'System' are currently supported.\",\n+                        \"version\": \"1.27.0\"\n                     },\n                     {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-azure-nar\",\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-record-serialization-services-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n-                        \"defaultBulletinLevel\": \"WARN\",\n-                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": 1,\n-                            \"TIMER_DRIVEN\": 1\n-                        },\n-                        \"defaultPenaltyDuration\": \"30 sec\",\n-                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"1 min\"\n-                        },\n-                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n-                        \"defaultYieldDuration\": \"1 sec\",\n-                        \"deprecated\": true,\n-                        \"deprecationAlternatives\": [\n-                            \"org.apache.nifi.processors.azure.storage.ListAzureBlobStorage_v12\"\n-                        ],\n-                        \"deprecationReason\": \"Processor depends on legacy Microsoft Azure SDK\",\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n-                        \"primaryNodeOnly\": true,\n                         \"propertyDescriptors\": {\n-                            \"Maximum File Age\": {\n-                                \"description\": \"The maximum age that a file must be in order to be pulled; any file older than this amount of time (according to last modification date) will be ignored\",\n-                                \"displayName\": \"Maximum File Age\",\n+                            \"Date Format\": {\n+                                \"description\": \"Specifies the format to use when reading/writing Date fields. If not specified, Date fields will be assumed to be number of milliseconds since epoch (Midnight, Jan 1, 1970 GMT). If specified, the value must match the Java Simple Date Format (for example, MM/dd/yyyy for a two-digit month, followed by a two-digit day, followed by a four-digit year, all separated by '/' characters, as in 01/01/2017).\",\n+                                \"displayName\": \"Date Format\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Maximum File Age\",\n+                                \"name\": \"Date Format\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Maximum File Size\": {\n-                                \"description\": \"The maximum size that a file can be in order to be pulled\",\n-                                \"displayName\": \"Maximum File Size\",\n+                            \"Time Format\": {\n+                                \"description\": \"Specifies the format to use when reading/writing Time fields. If not specified, Time fields will be assumed to be number of milliseconds since epoch (Midnight, Jan 1, 1970 GMT). If specified, the value must match the Java Simple Date Format (for example, HH:mm:ss for a two-digit hour in 24-hour format, followed by a two-digit minute, followed by a two-digit second, all separated by ':' characters, as in 18:04:15).\",\n+                                \"displayName\": \"Time Format\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Maximum File Size\",\n+                                \"name\": \"Time Format\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Minimum File Age\": {\n-                                \"defaultValue\": \"0 sec\",\n-                                \"description\": \"The minimum age that a file must be in order to be pulled; any file younger than this amount of time (according to last modification date) will be ignored\",\n-                                \"displayName\": \"Minimum File Age\",\n+                            \"Timestamp Format\": {\n+                                \"description\": \"Specifies the format to use when reading/writing Timestamp fields. If not specified, Timestamp fields will be assumed to be number of milliseconds since epoch (Midnight, Jan 1, 1970 GMT). If specified, the value must match the Java Simple Date Format (for example, MM/dd/yyyy HH:mm:ss for a two-digit month, followed by a two-digit day, followed by a four-digit year, all separated by '/' characters; and then followed by a two-digit hour in 24-hour format, followed by a two-digit minute, followed by a two-digit second, all separated by ':' characters, as in 01/01/2017 18:04:15).\",\n+                                \"displayName\": \"Timestamp Format\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Minimum File Age\",\n-                                \"required\": true,\n+                                \"name\": \"Timestamp Format\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Minimum File Size\": {\n-                                \"defaultValue\": \"0 B\",\n-                                \"description\": \"The minimum size that a file must be in order to be pulled\",\n-                                \"displayName\": \"Minimum File Size\",\n+                            \"attribute_prefix\": {\n+                                \"description\": \"If this property is set, the name of attributes will be prepended with a prefix when they are added to a record.\",\n+                                \"displayName\": \"Attribute Prefix\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Minimum File Size\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"attribute_prefix\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"container-name\": {\n-                                \"description\": \"Name of the Azure storage container. In case of PutAzureBlobStorage processor, container can be created if it does not exist.\",\n-                                \"displayName\": \"Container Name\",\n+                            \"content_field_name\": {\n+                                \"description\": \"If tags with content (e. g. <field>content</field>) are defined as nested records in the schema, the name of the tag will be used as name for the record and the value of this property will be used as name for the field. If tags with content shall be parsed together with attributes (e. g. <field attribute=\\\"123\\\">content</field>), they have to be defined as records. In such a case, the name of the tag will be used as the name for the record and  the value of this property will be used as the name for the field holding the original content. The name of the attribute will be used to create a new record field, the content of which will be the value of the attribute. For more information, see the 'Additional Details...' section of the XMLReader controller service's documentation.\",\n+                                \"displayName\": \"Field Name for Content\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"container-name\",\n-                                \"required\": true,\n+                                \"name\": \"content_field_name\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"et-initial-listing-target\": {\n+                            \"parse_xml_attributes\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Ignore entities having timestamp older than the specified 'Tracking Time Window' at the initial listing activity.\",\n-                                        \"displayName\": \"Tracking Time Window\",\n-                                        \"value\": \"window\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n-                                        \"description\": \"Regardless of entities timestamp, all existing entities will be listed at the initial listing activity.\",\n-                                        \"displayName\": \"All Available\",\n-                                        \"value\": \"all\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"all\",\n-                                \"description\": \"Specify how initial listing should be handled. Used by 'Tracking Entities' strategy.\",\n-                                \"displayName\": \"Entity Tracking Initial Listing Target\",\n+                                \"defaultValue\": \"true\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"infer-schema\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n+                                        \"propertyName\": \"schema-access-strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"When 'Schema Access Strategy' is 'Infer Schema' and this property is 'true' then XML attributes are parsed and added to the record as new fields. When the schema is inferred but this property is 'false', XML attributes and their values are ignored.\",\n+                                \"displayName\": \"Parse XML Attributes\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"et-initial-listing-target\",\n+                                \"name\": \"parse_xml_attributes\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"et-state-cache\": {\n-                                \"description\": \"Listed entities are stored in the specified cache storage so that this processor can resume listing across NiFi restart or in case of primary node change. 'Tracking Entities' strategy require tracking information of all listed entities within the last 'Tracking Time Window'. To support large number of entities, the strategy uses DistributedMapCache instead of managed state. Cache key format is 'ListedEntities::{processorId}(::{nodeId})'. If it tracks per node listed entities, then the optional '::{nodeId}' part is added to manage state separately. E.g. cluster wide cache key = 'ListedEntities::8dda2321-0164-1000-50fa-3042fe7d6a7b', per node cache key = 'ListedEntities::8dda2321-0164-1000-50fa-3042fe7d6a7b::nifi-node3' The stored cache content is Gzipped JSON string. The cache key will be deleted when target listing configuration is changed. Used by 'Tracking Entities' strategy.\",\n-                                \"displayName\": \"Entity Tracking State Cache\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"et-state-cache\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.distributed.cache.client.DistributedMapCacheClient\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            },\n-                            \"et-time-window\": {\n-                                \"defaultValue\": \"3 hours\",\n-                                \"description\": \"Specify how long this processor should track already-listed entities. 'Tracking Entities' strategy can pick any entity whose timestamp is inside the specified time window. For example, if set to '30 minutes', any entity having timestamp in recent 30 minutes will be the listing target when this processor runs. A listed entity is considered 'new/updated' and a FlowFile is emitted if one of following condition meets: 1. does not exist in the already-listed entities, 2. has newer timestamp than the cached entity, 3. has different size than the cached entity. If a cached entity's timestamp becomes older than specified time window, that entity will be removed from the cached already-listed entities. Used by 'Tracking Entities' strategy.\",\n-                                \"displayName\": \"Entity Tracking Time Window\",\n+                            \"record_format\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"Each FlowFile will consist of a single record without any sort of \\\"wrapper\\\".\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Each FlowFile will consist of zero or more records. The outer-most XML element is expected to be a \\\"wrapper\\\" and will be ignored.\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Whether to treat a FlowFile as a single Record or an array of multiple Records is determined by the value of the 'xml.stream.is.array' attribute. If the value of the attribute is 'true' (case-insensitive), then the XML Reader will treat the FlowFile as a series of Records with the outer element being ignored. If the value of the attribute is 'false' (case-insensitive), then the FlowFile is treated as a single Record and no wrapper element is assumed. If the attribute is missing or its value is anything other than 'true' or 'false', then an Exception will be thrown and no records will be parsed.\",\n+                                        \"displayName\": \"Use attribute 'xml.stream.is.array'\",\n+                                        \"value\": \"${xml.stream.is.array}\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"This property defines whether the reader expects a FlowFile to consist of a single Record or a series of Records with a \\\"wrapper element\\\". Because XML does not provide for a way to read a series of XML documents from a stream directly, it is common to combine many XML documents by concatenating them and then wrapping the entire XML blob  with a \\\"wrapper element\\\". This property dictates whether the reader expects a FlowFile to consist of a single Record or a series of Records with a \\\"wrapper element\\\" that will be ignored.\",\n+                                \"displayName\": \"Expect Records as Array\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"et-time-window\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"record_format\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"listing-strategy\": {\n+                            \"schema-access-strategy\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"This strategy tracks the latest timestamp of listed entity to determine new/updated entities. Since it only tracks few timestamps, it can manage listing state efficiently. However, any newly added, or updated entity having timestamp older than the tracked latest timestamp can not be picked by this strategy. For example, such situation can happen in a file system if a file with old timestamp is copied or moved into the target directory without its last modified timestamp being updated. Also may miss files when multiple subdirectories are being written at the same time while listing is running.\",\n-                                        \"displayName\": \"Tracking Timestamps\",\n-                                        \"value\": \"timestamps\"\n+                                        \"description\": \"The name of the Schema to use is specified by the 'Schema Name' Property. The value of this property is used to lookup the Schema in the configured Schema Registry service.\",\n+                                        \"displayName\": \"Use 'Schema Name' Property\",\n+                                        \"value\": \"schema-name\"\n                                     },\n                                     {\n-                                        \"description\": \"This strategy tracks information of all the listed entities within the latest 'Entity Tracking Time Window' to determine new/updated entities. This strategy can pick entities having old timestamp that can be missed with 'Tracking Timestamps'. Works even when multiple subdirectories are being written at the same time while listing is running. However additional DistributedMapCache controller service is required and more JVM heap memory is used. See the description of 'Entity Tracking Time Window' property for further details on how it works.\",\n-                                        \"displayName\": \"Tracking Entities\",\n-                                        \"value\": \"entities\"\n+                                        \"description\": \"The text of the Schema itself is specified by the 'Schema Text' Property. The value of this property must be a valid Avro Schema. If Expression Language is used, the value of the 'Schema Text' property must be valid after substituting the expressions.\",\n+                                        \"displayName\": \"Use 'Schema Text' Property\",\n+                                        \"value\": \"schema-text-property\"\n                                     },\n                                     {\n-                                        \"description\": \"This strategy lists an entity without any tracking. The same entity will be listed each time on executing this processor. It is recommended to change the default run schedule value. Any property that related to the persisting state will be disregarded.\",\n-                                        \"displayName\": \"No Tracking\",\n-                                        \"value\": \"none\"\n+                                        \"description\": \"The FlowFile contains 3 Attributes that will be used to lookup a Schema from the configured Schema Registry: 'schema.identifier', 'schema.version', and 'schema.protocol.version'\",\n+                                        \"displayName\": \"HWX Schema Reference Attributes\",\n+                                        \"value\": \"hwx-schema-ref-attributes\"\n+                                    },\n+                                    {\n+                                        \"description\": \"The content of the FlowFile contains a reference to a schema in the Schema Registry service. The reference is encoded as a single byte indicating the 'protocol version', followed by 8 bytes indicating the schema identifier, and finally 4 bytes indicating the schema version, as per the Hortonworks Schema Registry serializers and deserializers, found at https://github.com/hortonworks/registry\",\n+                                        \"displayName\": \"HWX Content-Encoded Schema Reference\",\n+                                        \"value\": \"hwx-content-encoded-schema\"\n+                                    },\n+                                    {\n+                                        \"description\": \"The content of the FlowFile contains a reference to a schema in the Schema Registry service. The reference is encoded as a single 'Magic Byte' followed by 4 bytes representing the identifier of the schema, as outlined at http://docs.confluent.io/current/schema-registry/docs/serializer-formatter.html. This is based on version 3.2.x of the Confluent Schema Registry.\",\n+                                        \"displayName\": \"Confluent Content-Encoded Schema Reference\",\n+                                        \"value\": \"confluent-encoded\"\n+                                    },\n+                                    {\n+                                        \"description\": \"The Schema of the data will be inferred automatically when the data is read. See component Usage and Additional Details for information about how the schema is inferred.\",\n+                                        \"displayName\": \"Infer Schema\",\n+                                        \"value\": \"infer-schema\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"timestamps\",\n-                                \"description\": \"Specify how to determine new/updated entities. See each strategy descriptions for detail.\",\n-                                \"displayName\": \"Listing Strategy\",\n+                                \"defaultValue\": \"infer-schema\",\n+                                \"description\": \"Specifies how to obtain the schema that is to be used for interpreting the data.\",\n+                                \"displayName\": \"Schema Access Strategy\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"listing-strategy\",\n+                                \"name\": \"schema-access-strategy\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"prefix\": {\n-                                \"description\": \"Search prefix for listing\",\n-                                \"displayName\": \"Prefix\",\n+                            \"schema-branch\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"schema-name\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n+                                        \"propertyName\": \"schema-access-strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"Specifies the name of the branch to use when looking up the schema in the Schema Registry property. If the chosen Schema Registry does not support branching, this value will be ignored.\",\n+                                \"displayName\": \"Schema Branch\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"prefix\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"schema-branch\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"proxy-configuration-service\": {\n-                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests. Supported proxies: SOCKS, HTTP In case of SOCKS, it is not guaranteed that the selected SOCKS Version will be used by the processor.\",\n-                                \"displayName\": \"Proxy Configuration Service\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"proxy-configuration-service\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.proxy.ProxyConfigurationService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            },\n-                            \"record-writer\": {\n-                                \"description\": \"Specifies the Record Writer to use for creating the listing. If not specified, one FlowFile will be created for each entity that is listed. If the Record Writer is specified, all entities will be written to a single FlowFile instead of adding attributes to individual FlowFiles.\",\n-                                \"displayName\": \"Record Writer\",\n+                            \"schema-inference-cache\": {\n+                                \"description\": \"Specifies a Schema Cache to use when inferring the schema. If not populated, the schema will be inferred each time. However, if a cache is specified, the cache will first be consulted and if the applicable schema can be found, it will be used instead of inferring the schema.\",\n+                                \"displayName\": \"Schema Inference Cache\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"record-writer\",\n+                                \"name\": \"schema-inference-cache\",\n                                 \"required\": false,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n                                     \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n+                                    \"type\": \"org.apache.nifi.serialization.RecordSchemaCacheService\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             },\n-                            \"storage-account-key\": {\n-                                \"description\": \"The storage account key. This is an admin-like password providing access to every container in this account. It is recommended one uses Shared Access Signature (SAS) token instead for fine-grained control with policies. There are certain risks in allowing the account key to be stored as a flowfile attribute. While it does provide for a more flexible flow by allowing the account key to be fetched dynamically from a flowfile attribute, care must be taken to restrict access to the event provenance data (e.g., by strictly controlling the policies governing provenance for this processor). In addition, the provenance repositories may be put on encrypted disk partitions.\",\n-                                \"displayName\": \"Storage Account Key\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"storage-account-key\",\n-                                \"required\": false,\n-                                \"sensitive\": true\n-                            },\n-                            \"storage-account-name\": {\n-                                \"description\": \"The storage account name. There are certain risks in allowing the account name to be stored as a flowfile attribute. While it does provide for a more flexible flow by allowing the account name to be fetched dynamically from a flowfile attribute, care must be taken to restrict access to the event provenance data (e.g., by strictly controlling the policies governing provenance for this processor). In addition, the provenance repositories may be put on encrypted disk partitions. Instead of defining the Storage Account Name, Storage Account Key and SAS Token properties directly on the processor, the preferred way is to configure them through a controller service specified in the Storage Credentials property. The controller service can provide a common/shared configuration for multiple/all Azure processors. Furthermore, the credentials can also be looked up dynamically with the 'Lookup' version of the service.\",\n-                                \"displayName\": \"Storage Account Name\",\n+                            \"schema-name\": {\n+                                \"defaultValue\": \"${schema.name}\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"schema-name\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n+                                        \"propertyName\": \"schema-access-strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"Specifies the name of the schema to lookup in the Schema Registry property\",\n+                                \"displayName\": \"Schema Name\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"storage-account-name\",\n+                                \"name\": \"schema-name\",\n                                 \"required\": false,\n-                                \"sensitive\": true\n+                                \"sensitive\": false\n                             },\n-                            \"storage-credentials-service\": {\n-                                \"description\": \"The Controller Service used to obtain Azure Storage Credentials. Instead of the processor level properties, the credentials can be configured here through a common/shared controller service, which is the preferred way. The 'Lookup' version of the service can also be used to select the credentials dynamically at runtime based on a FlowFile attribute (if the processor has FlowFile input).\",\n-                                \"displayName\": \"Storage Credentials\",\n+                            \"schema-registry\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"confluent-encoded\",\n+                                            \"schema-name\",\n+                                            \"hwx-schema-ref-attributes\",\n+                                            \"hwx-content-encoded-schema\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n+                                        \"propertyName\": \"schema-access-strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"Specifies the Controller Service to use for the Schema Registry\",\n+                                \"displayName\": \"Schema Registry\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"storage-credentials-service\",\n+                                \"name\": \"schema-registry\",\n                                 \"required\": false,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-azure-services-api-nar\",\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.services.azure.storage.AzureStorageCredentialsService\",\n+                                    \"type\": \"org.apache.nifi.schemaregistry.services.SchemaRegistry\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             },\n-                            \"storage-endpoint-suffix\": {\n-                                \"description\": \"Storage accounts in public Azure always use a common FQDN suffix. Override this endpoint suffix with a different suffix in certain circumstances (like Azure Stack or non-public Azure regions). The preferred way is to configure them through a controller service specified in the Storage Credentials property. The controller service can provide a common/shared configuration for multiple/all Azure processors. Furthermore, the credentials can also be looked up dynamically with the 'Lookup' version of the service.\",\n-                                \"displayName\": \"Common Storage Account Endpoint Suffix\",\n+                            \"schema-text\": {\n+                                \"defaultValue\": \"${avro.schema}\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"schema-text-property\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n+                                        \"propertyName\": \"schema-access-strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"The text of an Avro-formatted Schema\",\n+                                \"displayName\": \"Schema Text\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"storage-endpoint-suffix\",\n+                                \"name\": \"schema-text\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"storage-sas-token\": {\n-                                \"description\": \"Shared Access Signature token, including the leading '?'. Specify either SAS token (recommended) or Account Key. There are certain risks in allowing the SAS token to be stored as a flowfile attribute. While it does provide for a more flexible flow by allowing the SAS token to be fetched dynamically from a flowfile attribute, care must be taken to restrict access to the event provenance data (e.g., by strictly controlling the policies governing provenance for this processor). In addition, the provenance repositories may be put on encrypted disk partitions.\",\n-                                \"displayName\": \"SAS Token\",\n+                            \"schema-version\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"schema-name\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n+                                        \"propertyName\": \"schema-access-strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"Specifies the version of the schema to lookup in the Schema Registry. If not specified then the latest version of the schema will be retrieved.\",\n+                                \"displayName\": \"Schema Version\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"storage-sas-token\",\n+                                \"name\": \"schema-version\",\n                                 \"required\": false,\n-                                \"sensitive\": true\n+                                \"sensitive\": false\n                             }\n                         },\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.processors.azure.storage.DeleteAzureBlobStorage\",\n-                            \"org.apache.nifi.processors.azure.storage.FetchAzureBlobStorage\",\n-                            \"org.apache.nifi.processors.azure.storage.PutAzureBlobStorage\"\n-                        ],\n-                        \"sideEffectFree\": false,\n-                        \"stateful\": {\n-                            \"description\": \"After performing a listing of blobs, the timestamp of the newest blob is stored. This allows the Processor to list only blobs that have been added or modified after this date the next time that the Processor is run.  State is stored across the cluster so that this Processor can be run on Primary Node only and if a new Primary Node is selected, the new node can pick up where the previous node left off, without duplicating the data.\",\n-                            \"scopes\": [\n-                                \"CLUSTER\"\n-                            ]\n-                        },\n-                        \"supportedRelationships\": [\n+                        \"providedApiImplementations\": [\n                             {\n-                                \"description\": \"All FlowFiles that are received are routed to success\",\n-                                \"name\": \"success\"\n+                                \"artifact\": \"nifi-standard-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n+                                \"version\": \"1.27.0\"\n                             }\n                         ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n-                        \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"azure\",\n-                            \"blob\",\n-                            \"cloud\",\n-                            \"microsoft\",\n-                            \"storage\"\n+                            \"parser\",\n+                            \"reader\",\n+                            \"record\",\n+                            \"xml\"\n                         ],\n-                        \"triggerSerially\": true,\n-                        \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.azure.storage.ListAzureBlobStorage\",\n-                        \"typeDescription\": \"Lists blobs in an Azure Storage container. Listing details are attached to an empty FlowFile for use with FetchAzureBlobStorage.  This Processor is designed to run on Primary Node only in a cluster. If the primary node changes, the new Primary Node will pick up where the previous node left off without duplicating all of the data.\",\n-                        \"version\": \"1.27.0\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"The name of the Azure container\",\n-                                \"name\": \"azure.container\"\n-                            },\n-                            {\n-                                \"description\": \"The name of the Azure blob\",\n-                                \"name\": \"azure.blobname\"\n-                            },\n-                            {\n-                                \"description\": \"Primary location for blob content\",\n-                                \"name\": \"azure.primaryUri\"\n-                            },\n-                            {\n-                                \"description\": \"Secondary location for blob content\",\n-                                \"name\": \"azure.secondaryUri\"\n-                            },\n-                            {\n-                                \"description\": \"Etag for the Azure blob\",\n-                                \"name\": \"azure.etag\"\n-                            },\n-                            {\n-                                \"description\": \"Length of the blob\",\n-                                \"name\": \"azure.length\"\n-                            },\n-                            {\n-                                \"description\": \"The timestamp in Azure for the blob\",\n-                                \"name\": \"azure.timestamp\"\n-                            },\n-                            {\n-                                \"description\": \"MimeType of the content\",\n-                                \"name\": \"mime.type\"\n-                            },\n-                            {\n-                                \"description\": \"Language code for the content\",\n-                                \"name\": \"lang\"\n-                            },\n-                            {\n-                                \"description\": \"This is the type of blob and can be either page or block type\",\n-                                \"name\": \"azure.blobtype\"\n-                            }\n-                        ]\n+                        \"type\": \"org.apache.nifi.xml.XMLReader\",\n+                        \"typeDescription\": \"Reads XML content and creates Record objects. Records are expected in the second level of XML data, embedded in an enclosing root tag.\",\n+                        \"version\": \"1.27.0\"\n                     },\n                     {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-azure-nar\",\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-record-serialization-services-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n-                        \"defaultBulletinLevel\": \"WARN\",\n-                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": 1,\n-                            \"TIMER_DRIVEN\": 1\n-                        },\n-                        \"defaultPenaltyDuration\": \"30 sec\",\n-                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"1 min\"\n-                        },\n-                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n-                        \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n-                        \"primaryNodeOnly\": true,\n                         \"propertyDescriptors\": {\n-                            \"Maximum File Age\": {\n-                                \"description\": \"The maximum age that a file must be in order to be pulled; any file older than this amount of time (according to last modification date) will be ignored\",\n-                                \"displayName\": \"Maximum File Age\",\n+                            \"Character Set\": {\n+                                \"defaultValue\": \"UTF-8\",\n+                                \"description\": \"The Character set to use when writing the data to the FlowFile\",\n+                                \"displayName\": \"Character Set\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Maximum File Age\",\n-                                \"required\": false,\n+                                \"name\": \"Character Set\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Maximum File Size\": {\n-                                \"description\": \"The maximum size that a file can be in order to be pulled\",\n-                                \"displayName\": \"Maximum File Size\",\n+                            \"Date Format\": {\n+                                \"description\": \"Specifies the format to use when reading/writing Date fields. If not specified, Date fields will be assumed to be number of milliseconds since epoch (Midnight, Jan 1, 1970 GMT). If specified, the value must match the Java Simple Date Format (for example, MM/dd/yyyy for a two-digit month, followed by a two-digit day, followed by a four-digit year, all separated by '/' characters, as in 01/01/2017).\",\n+                                \"displayName\": \"Date Format\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Maximum File Size\",\n+                                \"name\": \"Date Format\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Minimum File Age\": {\n-                                \"defaultValue\": \"0 sec\",\n-                                \"description\": \"The minimum age that a file must be in order to be pulled; any file younger than this amount of time (according to last modification date) will be ignored\",\n-                                \"displayName\": \"Minimum File Age\",\n+                            \"Schema Write Strategy\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"Do not add any schema-related information to the FlowFile.\",\n+                                        \"displayName\": \"Do Not Write Schema\",\n+                                        \"value\": \"no-schema\"\n+                                    },\n+                                    {\n+                                        \"description\": \"The FlowFile will be given an attribute named 'schema.name' and this attribute will indicate the name of the schema in the Schema Registry. Note that ifthe schema for a record is not obtained from a Schema Registry, then no attribute will be added.\",\n+                                        \"displayName\": \"Set 'schema.name' Attribute\",\n+                                        \"value\": \"schema-name\"\n+                                    },\n+                                    {\n+                                        \"description\": \"The FlowFile will be given an attribute named 'avro.schema' and this attribute will contain the Avro Schema that describes the records in the FlowFile. The contents of the FlowFile need not be Avro, but the text of the schema will be used.\",\n+                                        \"displayName\": \"Set 'avro.schema' Attribute\",\n+                                        \"value\": \"full-schema-attribute\"\n+                                    },\n+                                    {\n+                                        \"description\": \"The FlowFile will be given a set of 3 attributes to describe the schema: 'schema.identifier', 'schema.version', and 'schema.protocol.version'. Note that if the schema for a record does not contain the necessary identifier and version, an Exception will be thrown when attempting to write the data.\",\n+                                        \"displayName\": \"HWX Schema Reference Attributes\",\n+                                        \"value\": \"hwx-schema-ref-attributes\"\n+                                    },\n+                                    {\n+                                        \"description\": \"The content of the FlowFile will contain a reference to a schema in the Schema Registry service. The reference is encoded as a single byte indicating the 'protocol version', followed by 8 bytes indicating the schema identifier, and finally 4 bytes indicating the schema version, as per the Hortonworks Schema Registry serializers and deserializers, as found at https://github.com/hortonworks/registry. This will be prepended to each FlowFile. Note that if the schema for a record does not contain the necessary identifier and version, an Exception will be thrown when attempting to write the data.\",\n+                                        \"displayName\": \"HWX Content-Encoded Schema Reference\",\n+                                        \"value\": \"hwx-content-encoded-schema\"\n+                                    },\n+                                    {\n+                                        \"description\": \"The content of the FlowFile will contain a reference to a schema in the Schema Registry service. The reference is encoded as a single 'Magic Byte' followed by 4 bytes representing the identifier of the schema, as outlined at http://docs.confluent.io/current/schema-registry/docs/serializer-formatter.html. This will be prepended to each FlowFile. Note that if the schema for a record does not contain the necessary identifier and version, an Exception will be thrown when attempting to write the data. This is based on the encoding used by version 3.2.x of the Confluent Schema Registry.\",\n+                                        \"displayName\": \"Confluent Schema Registry Reference\",\n+                                        \"value\": \"confluent-encoded\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"no-schema\",\n+                                \"description\": \"Specifies how the schema for a Record should be added to the data.\",\n+                                \"displayName\": \"Schema Write Strategy\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Minimum File Age\",\n+                                \"name\": \"Schema Write Strategy\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Minimum File Size\": {\n-                                \"defaultValue\": \"0 B\",\n-                                \"description\": \"The minimum size that a file must be in order to be pulled\",\n-                                \"displayName\": \"Minimum File Size\",\n+                            \"Time Format\": {\n+                                \"description\": \"Specifies the format to use when reading/writing Time fields. If not specified, Time fields will be assumed to be number of milliseconds since epoch (Midnight, Jan 1, 1970 GMT). If specified, the value must match the Java Simple Date Format (for example, HH:mm:ss for a two-digit hour in 24-hour format, followed by a two-digit minute, followed by a two-digit second, all separated by ':' characters, as in 18:04:15).\",\n+                                \"displayName\": \"Time Format\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Minimum File Size\",\n-                                \"required\": true,\n+                                \"name\": \"Time Format\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"blob-name-prefix\": {\n-                                \"description\": \"Search prefix for listing\",\n-                                \"displayName\": \"Blob Name Prefix\",\n+                            \"Timestamp Format\": {\n+                                \"description\": \"Specifies the format to use when reading/writing Timestamp fields. If not specified, Timestamp fields will be assumed to be number of milliseconds since epoch (Midnight, Jan 1, 1970 GMT). If specified, the value must match the Java Simple Date Format (for example, MM/dd/yyyy HH:mm:ss for a two-digit month, followed by a two-digit day, followed by a four-digit year, all separated by '/' characters; and then followed by a two-digit hour in 24-hour format, followed by a two-digit minute, followed by a two-digit second, all separated by ':' characters, as in 01/01/2017 18:04:15).\",\n+                                \"displayName\": \"Timestamp Format\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"blob-name-prefix\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Timestamp Format\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"container-name\": {\n-                                \"description\": \"Name of the Azure storage container. In case of PutAzureBlobStorage processor, container can be created if it does not exist.\",\n-                                \"displayName\": \"Container Name\",\n+                            \"array_tag_name\": {\n+                                \"description\": \"Name of the tag used by property \\\"Wrap Elements of Arrays\\\" to write arrays\",\n+                                \"displayName\": \"Array Tag Name\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"container-name\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"array_tag_name\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"et-initial-listing-target\": {\n+                            \"array_wrapping\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Ignore entities having timestamp older than the specified 'Tracking Time Window' at the initial listing activity.\",\n-                                        \"displayName\": \"Tracking Time Window\",\n-                                        \"value\": \"window\"\n+                                        \"description\": \"The value of the property \\\"Array Tag Name\\\" will be used as the tag name to wrap elements of an array. The field name of the array field will be used for the tag name of the elements.\",\n+                                        \"displayName\": \"Use Property as Wrapper\",\n+                                        \"value\": \"use-property-as-wrapper\"\n                                     },\n                                     {\n-                                        \"description\": \"Regardless of entities timestamp, all existing entities will be listed at the initial listing activity.\",\n-                                        \"displayName\": \"All Available\",\n-                                        \"value\": \"all\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"all\",\n-                                \"dependencies\": [\n+                                        \"description\": \"The value of the property \\\"Array Tag Name\\\" will be used for the tag name of the elements of an array. The field name of the array field will be used as the tag name to wrap elements.\",\n+                                        \"displayName\": \"Use Property for Elements\",\n+                                        \"value\": \"use-property-for-elements\"\n+                                    },\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"entities\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Listing Strategy\",\n-                                        \"propertyName\": \"listing-strategy\"\n+                                        \"description\": \"The elements of an array will not be wrapped\",\n+                                        \"displayName\": \"No Wrapping\",\n+                                        \"value\": \"no-wrapping\"\n                                     }\n                                 ],\n-                                \"description\": \"Specify how initial listing should be handled. Used by 'Tracking Entities' strategy.\",\n-                                \"displayName\": \"Entity Tracking Initial Listing Target\",\n+                                \"defaultValue\": \"no-wrapping\",\n+                                \"description\": \"Specifies how the writer wraps elements of fields of type array\",\n+                                \"displayName\": \"Wrap Elements of Arrays\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"et-initial-listing-target\",\n-                                \"required\": false,\n+                                \"name\": \"array_wrapping\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"et-state-cache\": {\n-                                \"dependencies\": [\n+                            \"omit_xml_declaration\": {\n+                                \"allowableValues\": [\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"entities\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Listing Strategy\",\n-                                        \"propertyName\": \"listing-strategy\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"description\": \"Listed entities are stored in the specified cache storage so that this processor can resume listing across NiFi restart or in case of primary node change. 'Tracking Entities' strategy require tracking information of all listed entities within the last 'Tracking Time Window'. To support large number of entities, the strategy uses DistributedMapCache instead of managed state. Cache key format is 'ListedEntities::{processorId}(::{nodeId})'. If it tracks per node listed entities, then the optional '::{nodeId}' part is added to manage state separately. E.g. cluster wide cache key = 'ListedEntities::8dda2321-0164-1000-50fa-3042fe7d6a7b', per node cache key = 'ListedEntities::8dda2321-0164-1000-50fa-3042fe7d6a7b::nifi-node3' The stored cache content is Gzipped JSON string. The cache key will be deleted when target listing configuration is changed. Used by 'Tracking Entities' strategy.\",\n-                                \"displayName\": \"Entity Tracking State Cache\",\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"Specifies whether or not to include XML declaration\",\n+                                \"displayName\": \"Omit XML Declaration\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"et-state-cache\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.distributed.cache.client.DistributedMapCacheClient\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n+                                \"name\": \"omit_xml_declaration\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n                             },\n-                            \"et-time-window\": {\n-                                \"defaultValue\": \"3 hours\",\n-                                \"dependencies\": [\n+                            \"pretty_print_xml\": {\n+                                \"allowableValues\": [\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"entities\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Listing Strategy\",\n-                                        \"propertyName\": \"listing-strategy\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"description\": \"Specify how long this processor should track already-listed entities. 'Tracking Entities' strategy can pick any entity whose timestamp is inside the specified time window. For example, if set to '30 minutes', any entity having timestamp in recent 30 minutes will be the listing target when this processor runs. A listed entity is considered 'new/updated' and a FlowFile is emitted if one of following condition meets: 1. does not exist in the already-listed entities, 2. has newer timestamp than the cached entity, 3. has different size than the cached entity. If a cached entity's timestamp becomes older than specified time window, that entity will be removed from the cached already-listed entities. Used by 'Tracking Entities' strategy.\",\n-                                \"displayName\": \"Entity Tracking Time Window\",\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"Specifies whether or not the XML should be pretty printed\",\n+                                \"displayName\": \"Pretty Print XML\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"et-time-window\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"pretty_print_xml\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"record_tag_name\": {\n+                                \"description\": \"Specifies the name of the XML record tag wrapping the record fields. If this is not set, the writer will use the record name in the schema.\",\n+                                \"displayName\": \"Name of Record Tag\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"record_tag_name\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"listing-strategy\": {\n+                            \"root_tag_name\": {\n+                                \"description\": \"Specifies the name of the XML root tag wrapping the record set. This property has to be defined if the writer is supposed to write multiple records in a single FlowFile.\",\n+                                \"displayName\": \"Name of Root Tag\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"root_tag_name\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"schema-access-strategy\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"This strategy tracks the latest timestamp of listed entity to determine new/updated entities. Since it only tracks few timestamps, it can manage listing state efficiently. However, any newly added, or updated entity having timestamp older than the tracked latest timestamp can not be picked by this strategy. For example, such situation can happen in a file system if a file with old timestamp is copied or moved into the target directory without its last modified timestamp being updated. Also may miss files when multiple subdirectories are being written at the same time while listing is running.\",\n-                                        \"displayName\": \"Tracking Timestamps\",\n-                                        \"value\": \"timestamps\"\n+                                        \"description\": \"The schema used to write records will be the same schema that was given to the Record when the Record was created.\",\n+                                        \"displayName\": \"Inherit Record Schema\",\n+                                        \"value\": \"inherit-record-schema\"\n                                     },\n                                     {\n-                                        \"description\": \"This strategy tracks information of all the listed entities within the latest 'Entity Tracking Time Window' to determine new/updated entities. This strategy can pick entities having old timestamp that can be missed with 'Tracking Timestamps'. Works even when multiple subdirectories are being written at the same time while listing is running. However additional DistributedMapCache controller service is required and more JVM heap memory is used. See the description of 'Entity Tracking Time Window' property for further details on how it works.\",\n-                                        \"displayName\": \"Tracking Entities\",\n-                                        \"value\": \"entities\"\n+                                        \"description\": \"The name of the Schema to use is specified by the 'Schema Name' Property. The value of this property is used to lookup the Schema in the configured Schema Registry service.\",\n+                                        \"displayName\": \"Use 'Schema Name' Property\",\n+                                        \"value\": \"schema-name\"\n                                     },\n                                     {\n-                                        \"description\": \"This strategy lists an entity without any tracking. The same entity will be listed each time on executing this processor. It is recommended to change the default run schedule value. Any property that related to the persisting state will be disregarded.\",\n-                                        \"displayName\": \"No Tracking\",\n-                                        \"value\": \"none\"\n+                                        \"description\": \"The text of the Schema itself is specified by the 'Schema Text' Property. The value of this property must be a valid Avro Schema. If Expression Language is used, the value of the 'Schema Text' property must be valid after substituting the expressions.\",\n+                                        \"displayName\": \"Use 'Schema Text' Property\",\n+                                        \"value\": \"schema-text-property\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"timestamps\",\n-                                \"description\": \"Specify how to determine new/updated entities. See each strategy descriptions for detail.\",\n-                                \"displayName\": \"Listing Strategy\",\n+                                \"defaultValue\": \"inherit-record-schema\",\n+                                \"description\": \"Specifies how to obtain the schema that is to be used for interpreting the data.\",\n+                                \"displayName\": \"Schema Access Strategy\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"listing-strategy\",\n+                                \"name\": \"schema-access-strategy\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"proxy-configuration-service\": {\n-                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests. Supported proxies: SOCKS, HTTP In case of SOCKS, it is not guaranteed that the selected SOCKS Version will be used by the processor.\",\n-                                \"displayName\": \"Proxy Configuration Service\",\n+                            \"schema-branch\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"schema-name\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n+                                        \"propertyName\": \"schema-access-strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"Specifies the name of the branch to use when looking up the schema in the Schema Registry property. If the chosen Schema Registry does not support branching, this value will be ignored.\",\n+                                \"displayName\": \"Schema Branch\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"schema-branch\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"schema-cache\": {\n+                                \"description\": \"Specifies a Schema Cache to add the Record Schema to so that Record Readers can quickly lookup the schema.\",\n+                                \"displayName\": \"Schema Cache\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"proxy-configuration-service\",\n+                                \"name\": \"schema-cache\",\n                                 \"required\": false,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n                                     \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.proxy.ProxyConfigurationService\",\n+                                    \"type\": \"org.apache.nifi.serialization.RecordSchemaCacheService\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             },\n-                            \"record-writer\": {\n-                                \"description\": \"Specifies the Record Writer to use for creating the listing. If not specified, one FlowFile will be created for each entity that is listed. If the Record Writer is specified, all entities will be written to a single FlowFile instead of adding attributes to individual FlowFiles.\",\n-                                \"displayName\": \"Record Writer\",\n+                            \"schema-name\": {\n+                                \"defaultValue\": \"${schema.name}\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"schema-name\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n+                                        \"propertyName\": \"schema-access-strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"Specifies the name of the schema to lookup in the Schema Registry property\",\n+                                \"displayName\": \"Schema Name\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"schema-name\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"schema-protocol-version\": {\n+                                \"defaultValue\": \"1\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"hwx-schema-ref-attributes\",\n+                                            \"hwx-content-encoded-schema\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Schema Write Strategy\",\n+                                        \"propertyName\": \"Schema Write Strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"The protocol version to be used for Schema Write Strategies that require a protocol version, such as Hortonworks Schema Registry strategies. Valid protocol versions for Hortonworks Schema Registry are integer values 1, 2, or 3.\",\n+                                \"displayName\": \"Schema Protocol Version\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"schema-protocol-version\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"schema-registry\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"confluent-encoded\",\n+                                            \"schema-name\",\n+                                            \"hwx-schema-ref-attributes\",\n+                                            \"hwx-content-encoded-schema\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n+                                        \"propertyName\": \"schema-access-strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"Specifies the Controller Service to use for the Schema Registry\",\n+                                \"displayName\": \"Schema Registry\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"record-writer\",\n+                                \"name\": \"schema-registry\",\n                                 \"required\": false,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n                                     \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n+                                    \"type\": \"org.apache.nifi.schemaregistry.services.SchemaRegistry\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             },\n-                            \"storage-credentials-service\": {\n-                                \"description\": \"Controller Service used to obtain Azure Blob Storage Credentials.\",\n-                                \"displayName\": \"Storage Credentials\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"storage-credentials-service\",\n-                                \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-azure-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.services.azure.storage.AzureStorageCredentialsService_v12\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n+                            \"schema-text\": {\n+                                \"defaultValue\": \"${avro.schema}\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"schema-text-property\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n+                                        \"propertyName\": \"schema-access-strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"The text of an Avro-formatted Schema\",\n+                                \"displayName\": \"Schema Text\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"schema-text\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"schema-version\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"schema-name\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n+                                        \"propertyName\": \"schema-access-strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"Specifies the version of the schema to lookup in the Schema Registry. If not specified then the latest version of the schema will be retrieved.\",\n+                                \"displayName\": \"Schema Version\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"schema-version\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"suppress_nulls\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"Fields that are missing (present in the schema but not in the record), or that have a value of null, will be written out as a null value\",\n+                                        \"displayName\": \"Never Suppress\",\n+                                        \"value\": \"never-suppress\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Fields that are missing (present in the schema but not in the record), or that have a value of null, will not be written out\",\n+                                        \"displayName\": \"Always Suppress\",\n+                                        \"value\": \"always-suppress\"\n+                                    },\n+                                    {\n+                                        \"description\": \"When a field has a value of null, it will be written out. However, if a field is defined in the schema and not present in the record, the field will not be written out.\",\n+                                        \"displayName\": \"Suppress Missing Values\",\n+                                        \"value\": \"suppress-missing\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"never-suppress\",\n+                                \"description\": \"Specifies how the writer should handle a null field\",\n+                                \"displayName\": \"Suppress Null Values\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"suppress_nulls\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n                             }\n                         },\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.processors.azure.storage.DeleteAzureBlobStorage_v12\",\n-                            \"org.apache.nifi.processors.azure.storage.FetchAzureBlobStorage_v12\",\n-                            \"org.apache.nifi.processors.azure.storage.PutAzureBlobStorage_v12\"\n-                        ],\n-                        \"sideEffectFree\": false,\n-                        \"stateful\": {\n-                            \"description\": \"After performing a listing of blobs, the timestamp of the newest blob is stored if 'Tracking Timestamps' Listing Strategy is in use (by default). This allows the Processor to list only blobs that have been added or modified after this date the next time that the Processor is run. State is stored across the cluster so that this Processor can be run on Primary Node only and if a new Primary Node is selected, the new node can pick up where the previous node left off, without duplicating the data.\",\n-                            \"scopes\": [\n-                                \"CLUSTER\"\n-                            ]\n-                        },\n-                        \"supportedRelationships\": [\n+                        \"providedApiImplementations\": [\n                             {\n-                                \"description\": \"All FlowFiles that are received are routed to success\",\n-                                \"name\": \"success\"\n+                                \"artifact\": \"nifi-standard-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n+                                \"version\": \"1.27.0\"\n                             }\n                         ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n-                        \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"azure\",\n-                            \"blob\",\n-                            \"cloud\",\n-                            \"microsoft\",\n-                            \"storage\"\n+                            \"record\",\n+                            \"recordset\",\n+                            \"resultset\",\n+                            \"row\",\n+                            \"serialize\",\n+                            \"writer\",\n+                            \"xml\"\n                         ],\n-                        \"triggerSerially\": true,\n-                        \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.azure.storage.ListAzureBlobStorage_v12\",\n-                        \"typeDescription\": \"Lists blobs in an Azure Blob Storage container. Listing details are attached to an empty FlowFile for use with FetchAzureBlobStorage. This Processor is designed to run on Primary Node only in a cluster. If the primary node changes, the new Primary Node will pick up where the previous node left off without duplicating all of the data. The processor uses Azure Blob Storage client library v12.\",\n-                        \"version\": \"1.27.0\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"The name of the Azure Blob Storage container\",\n-                                \"name\": \"azure.container\"\n+                        \"type\": \"org.apache.nifi.xml.XMLRecordSetWriter\",\n+                        \"typeDescription\": \"Writes a RecordSet to XML. The records are wrapped by a root tag.\",\n+                        \"version\": \"1.27.0\"\n+                    },\n+                    {\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-record-serialization-services-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"e0c4461\"\n+                        },\n+                        \"group\": \"org.apache.nifi\",\n+                        \"propertyDescriptors\": {\n+                            \"Date Format\": {\n+                                \"description\": \"Specifies the format to use when reading/writing Date fields. If not specified, Date fields will be assumed to be number of milliseconds since epoch (Midnight, Jan 1, 1970 GMT). If specified, the value must match the Java Simple Date Format (for example, MM/dd/yyyy for a two-digit month, followed by a two-digit day, followed by a four-digit year, all separated by '/' characters, as in 01/01/2017).\",\n+                                \"displayName\": \"Date Format\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Date Format\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n                             },\n-                            {\n-                                \"description\": \"The name of the blob on Azure Blob Storage\",\n-                                \"name\": \"azure.blobname\"\n+                            \"Time Format\": {\n+                                \"description\": \"Specifies the format to use when reading/writing Time fields. If not specified, Time fields will be assumed to be number of milliseconds since epoch (Midnight, Jan 1, 1970 GMT). If specified, the value must match the Java Simple Date Format (for example, HH:mm:ss for a two-digit hour in 24-hour format, followed by a two-digit minute, followed by a two-digit second, all separated by ':' characters, as in 18:04:15).\",\n+                                \"displayName\": \"Time Format\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Time Format\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n                             },\n-                            {\n-                                \"description\": \"Primary location of the blob\",\n-                                \"name\": \"azure.primaryUri\"\n+                            \"Timestamp Format\": {\n+                                \"description\": \"Specifies the format to use when reading/writing Timestamp fields. If not specified, Timestamp fields will be assumed to be number of milliseconds since epoch (Midnight, Jan 1, 1970 GMT). If specified, the value must match the Java Simple Date Format (for example, MM/dd/yyyy HH:mm:ss for a two-digit month, followed by a two-digit day, followed by a four-digit year, all separated by '/' characters; and then followed by a two-digit hour in 24-hour format, followed by a two-digit minute, followed by a two-digit second, all separated by ':' characters, as in 01/01/2017 18:04:15).\",\n+                                \"displayName\": \"Timestamp Format\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Timestamp Format\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n                             },\n-                            {\n-                                \"description\": \"ETag of the blob\",\n-                                \"name\": \"azure.etag\"\n+                            \"schema-access-strategy\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"The Schema of the data will be inferred automatically when the data is read. See component Usage and Additional Details for information about how the schema is inferred.\",\n+                                        \"displayName\": \"Infer Schema\",\n+                                        \"value\": \"infer-schema\"\n+                                    },\n+                                    {\n+                                        \"description\": \"The name of the Schema to use is specified by the 'Schema Name' Property. The value of this property is used to lookup the Schema in the configured Schema Registry service.\",\n+                                        \"displayName\": \"Use 'Schema Name' Property\",\n+                                        \"value\": \"schema-name\"\n+                                    },\n+                                    {\n+                                        \"description\": \"The text of the Schema itself is specified by the 'Schema Text' Property. The value of this property must be a valid Avro Schema. If Expression Language is used, the value of the 'Schema Text' property must be valid after substituting the expressions.\",\n+                                        \"displayName\": \"Use 'Schema Text' Property\",\n+                                        \"value\": \"schema-text-property\"\n+                                    },\n+                                    {\n+                                        \"description\": \"The FlowFile contains 3 Attributes that will be used to lookup a Schema from the configured Schema Registry: 'schema.identifier', 'schema.version', and 'schema.protocol.version'\",\n+                                        \"displayName\": \"HWX Schema Reference Attributes\",\n+                                        \"value\": \"hwx-schema-ref-attributes\"\n+                                    },\n+                                    {\n+                                        \"description\": \"The content of the FlowFile contains a reference to a schema in the Schema Registry service. The reference is encoded as a single byte indicating the 'protocol version', followed by 8 bytes indicating the schema identifier, and finally 4 bytes indicating the schema version, as per the Hortonworks Schema Registry serializers and deserializers, found at https://github.com/hortonworks/registry\",\n+                                        \"displayName\": \"HWX Content-Encoded Schema Reference\",\n+                                        \"value\": \"hwx-content-encoded-schema\"\n+                                    },\n+                                    {\n+                                        \"description\": \"The content of the FlowFile contains a reference to a schema in the Schema Registry service. The reference is encoded as a single 'Magic Byte' followed by 4 bytes representing the identifier of the schema, as outlined at http://docs.confluent.io/current/schema-registry/docs/serializer-formatter.html. This is based on version 3.2.x of the Confluent Schema Registry.\",\n+                                        \"displayName\": \"Confluent Content-Encoded Schema Reference\",\n+                                        \"value\": \"confluent-encoded\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"infer-schema\",\n+                                \"description\": \"Specifies how to obtain the schema that is to be used for interpreting the data.\",\n+                                \"displayName\": \"Schema Access Strategy\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"schema-access-strategy\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n                             },\n-                            {\n-                                \"description\": \"Type of the blob (either BlockBlob, PageBlob or AppendBlob)\",\n-                                \"name\": \"azure.blobtype\"\n+                            \"schema-application-strategy\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"Applies the schema for the whole JSON.\",\n+                                        \"displayName\": \"Whole JSON\",\n+                                        \"value\": \"WHOLE_JSON\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Applies the schema for the selected part starting from the \\\"Starting Field Name\\\".\",\n+                                        \"displayName\": \"Selected Part\",\n+                                        \"value\": \"SELECTED_PART\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"SELECTED_PART\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"confluent-encoded\",\n+                                            \"schema-name\",\n+                                            \"schema-text-property\",\n+                                            \"hwx-schema-ref-attributes\",\n+                                            \"hwx-content-encoded-schema\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n+                                        \"propertyName\": \"schema-access-strategy\"\n+                                    },\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"NESTED_FIELD\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Starting Field Strategy\",\n+                                        \"propertyName\": \"starting-field-strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"Specifies whether the schema is defined for the whole JSON or for the selected part starting from \\\"Starting Field Name\\\".\",\n+                                \"displayName\": \"Schema Application Strategy\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"schema-application-strategy\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n                             },\n-                            {\n-                                \"description\": \"MIME Type of the content\",\n-                                \"name\": \"mime.type\"\n+                            \"schema-branch\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"schema-name\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n+                                        \"propertyName\": \"schema-access-strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"Specifies the name of the branch to use when looking up the schema in the Schema Registry property. If the chosen Schema Registry does not support branching, this value will be ignored.\",\n+                                \"displayName\": \"Schema Branch\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"schema-branch\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n                             },\n-                            {\n-                                \"description\": \"Language code for the content\",\n-                                \"name\": \"lang\"\n+                            \"schema-inference-cache\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"infer-schema\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n+                                        \"propertyName\": \"schema-access-strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"Specifies a Schema Cache to use when inferring the schema. If not populated, the schema will be inferred each time. However, if a cache is specified, the cache will first be consulted and if the applicable schema can be found, it will be used instead of inferring the schema.\",\n+                                \"displayName\": \"Schema Inference Cache\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"schema-inference-cache\",\n+                                \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.serialization.RecordSchemaCacheService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n                             },\n-                            {\n-                                \"description\": \"Timestamp of the blob\",\n-                                \"name\": \"azure.timestamp\"\n+                            \"schema-name\": {\n+                                \"defaultValue\": \"${schema.name}\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"schema-name\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n+                                        \"propertyName\": \"schema-access-strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"Specifies the name of the schema to lookup in the Schema Registry property\",\n+                                \"displayName\": \"Schema Name\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"schema-name\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"schema-registry\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"confluent-encoded\",\n+                                            \"schema-name\",\n+                                            \"hwx-schema-ref-attributes\",\n+                                            \"hwx-content-encoded-schema\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n+                                        \"propertyName\": \"schema-access-strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"Specifies the Controller Service to use for the Schema Registry\",\n+                                \"displayName\": \"Schema Registry\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"schema-registry\",\n+                                \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.schemaregistry.services.SchemaRegistry\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"schema-text\": {\n+                                \"defaultValue\": \"${avro.schema}\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"schema-text-property\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n+                                        \"propertyName\": \"schema-access-strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"The text of an Avro-formatted Schema\",\n+                                \"displayName\": \"Schema Text\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"schema-text\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"schema-version\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"schema-name\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n+                                        \"propertyName\": \"schema-access-strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"Specifies the version of the schema to lookup in the Schema Registry. If not specified then the latest version of the schema will be retrieved.\",\n+                                \"displayName\": \"Schema Version\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"schema-version\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"starting-field-name\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"NESTED_FIELD\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Starting Field Strategy\",\n+                                        \"propertyName\": \"starting-field-strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"Skips forward to the given nested JSON field (array or object) to begin processing.\",\n+                                \"displayName\": \"Starting Field Name\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"starting-field-name\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n                             },\n+                            \"starting-field-strategy\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"Begins processing from the root node.\",\n+                                        \"displayName\": \"Root Node\",\n+                                        \"value\": \"ROOT_NODE\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Skips forward to the given nested JSON field (array or object) to begin processing.\",\n+                                        \"displayName\": \"Nested Field\",\n+                                        \"value\": \"NESTED_FIELD\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"ROOT_NODE\",\n+                                \"description\": \"Start processing from the root node or from a specified nested node.\",\n+                                \"displayName\": \"Starting Field Strategy\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"starting-field-strategy\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            }\n+                        },\n+                        \"providedApiImplementations\": [\n                             {\n-                                \"description\": \"Length of the blob\",\n-                                \"name\": \"azure.length\"\n+                                \"artifact\": \"nifi-standard-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n+                                \"version\": \"1.27.0\"\n                             }\n-                        ]\n-                    },\n+                        ],\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.json.JsonPathReader\"\n+                        ],\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"parser\",\n+                            \"reader\",\n+                            \"record\",\n+                            \"tree\",\n+                            \"yaml\"\n+                        ],\n+                        \"type\": \"org.apache.nifi.yaml.YamlTreeReader\",\n+                        \"typeDescription\": \"Parses YAML into individual Record objects. While the reader expects each record to be well-formed YAML, the content of a FlowFile may consist of many records, each as a well-formed YAML array or YAML object. If an array is encountered, each element in that array will be treated as a separate record. If the schema that is configured contains a field that is not present in the YAML, a null value will be used. If the YAML contains a field that is not present in the schema, that field will be skipped. Please note this controller service does not support resolving the use of YAML aliases. Any alias present will be treated as a string. See the Usage of the Controller Service for more information and examples.\",\n+                        \"version\": \"1.27.0\"\n+                    }\n+                ],\n+                \"processors\": [],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"1.27.0\"\n+        },\n+        {\n+            \"artifact\": \"nifi-cassandra-services-api-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [],\n+                \"processors\": [],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"1.27.0\"\n+        },\n+        {\n+            \"artifact\": \"nifi-shopify-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [],\n+                \"processors\": [\n                     {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-azure-nar\",\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-shopify-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -15621,550 +15382,808 @@\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_FORBIDDEN\",\n                         \"primaryNodeOnly\": true,\n                         \"propertyDescriptors\": {\n-                            \"Maximum File Age\": {\n-                                \"description\": \"The maximum age that a file must be in order to be pulled; any file older than this amount of time (according to last modification date) will be ignored\",\n-                                \"displayName\": \"Maximum File Age\",\n+                            \"CUSTOMERS\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"The Customer resource stores information about a shop's customers, such as their contact details, their order history, and whether they've agreed to receive email marketing.\",\n+                                        \"displayName\": \"Customers\",\n+                                        \"value\": \"customers\"\n+                                    }\n+                                ],\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"CUSTOMERS\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Object Category\",\n+                                        \"propertyName\": \"object-category\"\n+                                    }\n+                                ],\n+                                \"description\": \"Customer resource to query\",\n+                                \"displayName\": \"Customer Category\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Maximum File Age\",\n-                                \"required\": false,\n+                                \"name\": \"CUSTOMERS\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Maximum File Size\": {\n-                                \"description\": \"The maximum size that a file can be in order to be pulled\",\n-                                \"displayName\": \"Maximum File Size\",\n+                            \"DISCOUNTS\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"The PriceRule resource can be used to get discounts using conditions\",\n+                                        \"displayName\": \"Price Rules\",\n+                                        \"value\": \"price_rules\"\n+                                    }\n+                                ],\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"DISCOUNTS\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Object Category\",\n+                                        \"propertyName\": \"object-category\"\n+                                    }\n+                                ],\n+                                \"description\": \"Discount resource to query\",\n+                                \"displayName\": \"Discount Category\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Maximum File Size\",\n-                                \"required\": false,\n+                                \"name\": \"DISCOUNTS\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Minimum File Age\": {\n-                                \"defaultValue\": \"0 sec\",\n-                                \"description\": \"The minimum age that a file must be in order to be pulled; any file younger than this amount of time (according to last modification date) will be ignored\",\n-                                \"displayName\": \"Minimum File Age\",\n+                            \"INVENTORY\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"A location represents a geographical location where your stores, pop-up stores, headquarters and warehouses exist.\",\n+                                        \"displayName\": \"Locations\",\n+                                        \"value\": \"locations\"\n+                                    }\n+                                ],\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"INVENTORY\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Object Category\",\n+                                        \"propertyName\": \"object-category\"\n+                                    }\n+                                ],\n+                                \"description\": \"Inventory resource to query\",\n+                                \"displayName\": \"Inventory Category\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Minimum File Age\",\n+                                \"name\": \"INVENTORY\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Minimum File Size\": {\n-                                \"defaultValue\": \"0 B\",\n-                                \"description\": \"The minimum size that a file must be in order to be pulled\",\n-                                \"displayName\": \"Minimum File Size\",\n+                            \"ONLINE_STORE\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"Shopify shops come with a built-in blogging engine, allowing a shop to have one or more blogs.\",\n+                                        \"displayName\": \"Blogs\",\n+                                        \"value\": \"blogs\"\n+                                    },\n+                                    {\n+                                        \"description\": \"A comment is a reader's response to an article in a blog.\",\n+                                        \"displayName\": \"Comments\",\n+                                        \"value\": \"comments\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Shopify stores come with a tool for creating basic HTML web pages.\",\n+                                        \"displayName\": \"Pages\",\n+                                        \"value\": \"pages\"\n+                                    },\n+                                    {\n+                                        \"description\": \"A redirect causes a visitor on a specific path on the shop's site to be automatically sent to a different location.\",\n+                                        \"displayName\": \"Redirects\",\n+                                        \"value\": \"redirects\"\n+                                    },\n+                                    {\n+                                        \"description\": \"The ScriptTag resource represents remote JavaScript code that is loaded into the pages of a shop's storefront or the order status page of checkout.\",\n+                                        \"displayName\": \"Script Tags\",\n+                                        \"value\": \"script_tags\"\n+                                    },\n+                                    {\n+                                        \"description\": \"A theme controls the look and feel of a Shopify online store.\",\n+                                        \"displayName\": \"Themes\",\n+                                        \"value\": \"themes\"\n+                                    }\n+                                ],\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"ONLINE_STORE\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Object Category\",\n+                                        \"propertyName\": \"object-category\"\n+                                    }\n+                                ],\n+                                \"description\": \"Online Store resource to query\",\n+                                \"displayName\": \"Online Store Category\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Minimum File Size\",\n+                                \"name\": \"ONLINE_STORE\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"adls-credentials-service\": {\n-                                \"description\": \"Controller Service used to obtain Azure Credentials.\",\n-                                \"displayName\": \"ADLS Credentials\",\n+                            \"ORDERS\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"A checkout is considered abandoned after the customer has added contact information, but before the customer has completed their purchase.\",\n+                                        \"displayName\": \"Abandoned Checkouts\",\n+                                        \"value\": \"checkouts\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Merchants can use draft orders to create orders on behalf of their customers.\",\n+                                        \"displayName\": \"Draft Orders\",\n+                                        \"value\": \"draft_orders\"\n+                                    },\n+                                    {\n+                                        \"description\": \"An order is a customer's request to purchase one or more products from a shop.\",\n+                                        \"displayName\": \"Orders\",\n+                                        \"value\": \"orders\"\n+                                    }\n+                                ],\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"ORDERS\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Object Category\",\n+                                        \"propertyName\": \"object-category\"\n+                                    }\n+                                ],\n+                                \"description\": \"Order resource to query\",\n+                                \"displayName\": \"Order Category\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"adls-credentials-service\",\n+                                \"name\": \"ORDERS\",\n                                 \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-azure-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.services.azure.storage.ADLSCredentialsService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n+                                \"sensitive\": false\n                             },\n-                            \"directory-name\": {\n-                                \"description\": \"Name of the Azure Storage Directory. The Directory Name cannot contain a leading '/'. The root directory can be designated by the empty string value. In case of the PutAzureDataLakeStorage processor, the directory will be created if not already existing.\",\n-                                \"displayName\": \"Directory Name\",\n+                            \"PRODUCT\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"Collects are meant for managing the relationship between products and custom collections.\",\n+                                        \"displayName\": \"Collects\",\n+                                        \"value\": \"collects\"\n+                                    },\n+                                    {\n+                                        \"description\": \"A custom collection is a grouping of products that a merchant can create to make their store easier to browse. \",\n+                                        \"displayName\": \"Custom Collections\",\n+                                        \"value\": \"custom_collections\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Get products in a merchant's store \",\n+                                        \"displayName\": \"Products\",\n+                                        \"value\": \"products\"\n+                                    },\n+                                    {\n+                                        \"description\": \"A smart collection is a grouping of products defined by rules that are set by the merchant.\",\n+                                        \"displayName\": \"Smart Collections\",\n+                                        \"value\": \"smart_collections\"\n+                                    }\n+                                ],\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"PRODUCT\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Object Category\",\n+                                        \"propertyName\": \"object-category\"\n+                                    }\n+                                ],\n+                                \"description\": \"Product resource to query\",\n+                                \"displayName\": \"Product Category\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"directory-name\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"PRODUCT\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"et-initial-listing-target\": {\n+                            \"SALES_CHANNELS\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Ignore entities having timestamp older than the specified 'Tracking Time Window' at the initial listing activity.\",\n-                                        \"displayName\": \"Tracking Time Window\",\n-                                        \"value\": \"window\"\n+                                        \"description\": \"A CollectionListing resource represents a product collection that a merchant has made available to your sales channel.\",\n+                                        \"displayName\": \"Collection Listings\",\n+                                        \"value\": \"collection_listings\"\n                                     },\n                                     {\n-                                        \"description\": \"Regardless of entities timestamp, all existing entities will be listed at the initial listing activity.\",\n-                                        \"displayName\": \"All Available\",\n-                                        \"value\": \"all\"\n+                                        \"description\": \"A ProductListing resource represents a Product which is available to your sales channel.\",\n+                                        \"displayName\": \"Product Listings\",\n+                                        \"value\": \"product_listings\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"all\",\n-                                \"description\": \"Specify how initial listing should be handled. Used by 'Tracking Entities' strategy.\",\n-                                \"displayName\": \"Entity Tracking Initial Listing Target\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"SALES_CHANNELS\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Object Category\",\n+                                        \"propertyName\": \"object-category\"\n+                                    }\n+                                ],\n+                                \"description\": \"Sales Channel resource to query\",\n+                                \"displayName\": \"Sales Channel Category\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"et-initial-listing-target\",\n-                                \"required\": false,\n+                                \"name\": \"SALES_CHANNELS\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"et-state-cache\": {\n-                                \"description\": \"Listed entities are stored in the specified cache storage so that this processor can resume listing across NiFi restart or in case of primary node change. 'Tracking Entities' strategy require tracking information of all listed entities within the last 'Tracking Time Window'. To support large number of entities, the strategy uses DistributedMapCache instead of managed state. Cache key format is 'ListedEntities::{processorId}(::{nodeId})'. If it tracks per node listed entities, then the optional '::{nodeId}' part is added to manage state separately. E.g. cluster wide cache key = 'ListedEntities::8dda2321-0164-1000-50fa-3042fe7d6a7b', per node cache key = 'ListedEntities::8dda2321-0164-1000-50fa-3042fe7d6a7b::nifi-node3' The stored cache content is Gzipped JSON string. The cache key will be deleted when target listing configuration is changed. Used by 'Tracking Entities' strategy.\",\n-                                \"displayName\": \"Entity Tracking State Cache\",\n+                            \"STORE_PROPERTIES\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"The Country resource represents the tax rates applied to orders from the different countries where a shop sells its products.\",\n+                                        \"displayName\": \"Countries\",\n+                                        \"value\": \"countries\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Merchants who use Shopify Payments can allow customers to pay in their local currency on the online store.\",\n+                                        \"displayName\": \"Currencies\",\n+                                        \"value\": \"currencies\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Policy resource can be used to access the policies that a merchant has configured for their shop, such as their refund and privacy policies.\",\n+                                        \"displayName\": \"Policies\",\n+                                        \"value\": \"policies\"\n+                                    },\n+                                    {\n+                                        \"description\": \"ShippingZone resource can be used to view shipping zones and their countries, provinces, and shipping rates.\",\n+                                        \"displayName\": \"Shipping Zones\",\n+                                        \"value\": \"shipping_zones\"\n+                                    }\n+                                ],\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"STORE_PROPERTIES\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Object Category\",\n+                                        \"propertyName\": \"object-category\"\n+                                    }\n+                                ],\n+                                \"description\": \"Store Property resource to query\",\n+                                \"displayName\": \"Store Property Category\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"et-state-cache\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.distributed.cache.client.DistributedMapCacheClient\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n+                                \"name\": \"STORE_PROPERTIES\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n                             },\n-                            \"et-time-window\": {\n-                                \"defaultValue\": \"3 hours\",\n-                                \"description\": \"Specify how long this processor should track already-listed entities. 'Tracking Entities' strategy can pick any entity whose timestamp is inside the specified time window. For example, if set to '30 minutes', any entity having timestamp in recent 30 minutes will be the listing target when this processor runs. A listed entity is considered 'new/updated' and a FlowFile is emitted if one of following condition meets: 1. does not exist in the already-listed entities, 2. has newer timestamp than the cached entity, 3. has different size than the cached entity. If a cached entity's timestamp becomes older than specified time window, that entity will be removed from the cached already-listed entities. Used by 'Tracking Entities' strategy.\",\n-                                \"displayName\": \"Entity Tracking Time Window\",\n+                            \"access-token\": {\n+                                \"description\": \"Access Token to authenticate requests\",\n+                                \"displayName\": \"Access Token\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"et-time-window\",\n-                                \"required\": false,\n+                                \"name\": \"access-token\",\n+                                \"required\": true,\n+                                \"sensitive\": true\n+                            },\n+                            \"api-version\": {\n+                                \"defaultValue\": \"2022-10\",\n+                                \"description\": \"The Shopify REST API version\",\n+                                \"displayName\": \"API Version\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"api-version\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"file-filter\": {\n-                                \"description\": \"Only files whose names match the given regular expression will be listed\",\n-                                \"displayName\": \"File Filter\",\n+                            \"incremental-delay\": {\n+                                \"defaultValue\": \"3 sec\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"true\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Incremental Loading\",\n+                                        \"propertyName\": \"is-incremental\"\n+                                    }\n+                                ],\n+                                \"description\": \"The ending timestamp of the time window will be adjusted earlier by the amount configured in this property. For example, with a property value of 10 seconds, an ending timestamp of 12:30:45 would be changed to 12:30:35. Set this property to avoid missing objects when the clock of your local machines and Shopify servers' clock are not in sync.\",\n+                                \"displayName\": \"Incremental Delay\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"file-filter\",\n+                                \"name\": \"incremental-delay\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"filesystem-name\": {\n-                                \"description\": \"Name of the Azure Storage File System (also called Container). It is assumed to be already existing.\",\n-                                \"displayName\": \"Filesystem Name\",\n+                            \"incremental-initial-start-time\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"true\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Incremental Loading\",\n+                                        \"propertyName\": \"is-incremental\"\n+                                    }\n+                                ],\n+                                \"description\": \"This property specifies the start time when running the first request. Represents an ISO 8601-encoded date and time string. For example, 3:50 pm on September 7, 2019 in the time zone of UTC (Coordinated Universal Time) is represented as \\\"2019-09-07T15:50:00Z\\\".\",\n+                                \"displayName\": \"Incremental Initial Start Time\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"filesystem-name\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"incremental-initial-start-time\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"include-temporary-files\": {\n+                            \"is-incremental\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"true\",\n                                         \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"false\",\n                                         \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"Whether to include temporary files when listing the contents of configured directory paths.\",\n-                                \"displayName\": \"Include Temporary Files\",\n+                                \"defaultValue\": \"true\",\n+                                \"description\": \"The processor can incrementally load the queried objects so that each object is queried exactly once. For each query, the processor queries objects which were created or modified after the previous run time but before the current time.\",\n+                                \"displayName\": \"Incremental Loading\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"include-temporary-files\",\n+                                \"name\": \"is-incremental\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"listing-strategy\": {\n+                            \"object-category\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"This strategy tracks the latest timestamp of listed entity to determine new/updated entities. Since it only tracks few timestamps, it can manage listing state efficiently. However, any newly added, or updated entity having timestamp older than the tracked latest timestamp can not be picked by this strategy. For example, such situation can happen in a file system if a file with old timestamp is copied or moved into the target directory without its last modified timestamp being updated. Also may miss files when multiple subdirectories are being written at the same time while listing is running.\",\n-                                        \"displayName\": \"Tracking Timestamps\",\n-                                        \"value\": \"timestamps\"\n+                                        \"description\": \"Query a Customer resource\",\n+                                        \"displayName\": \"Customers\",\n+                                        \"value\": \"CUSTOMERS\"\n                                     },\n                                     {\n-                                        \"description\": \"This strategy tracks information of all the listed entities within the latest 'Entity Tracking Time Window' to determine new/updated entities. This strategy can pick entities having old timestamp that can be missed with 'Tracking Timestamps'. Works even when multiple subdirectories are being written at the same time while listing is running. However additional DistributedMapCache controller service is required and more JVM heap memory is used. See the description of 'Entity Tracking Time Window' property for further details on how it works.\",\n-                                        \"displayName\": \"Tracking Entities\",\n-                                        \"value\": \"entities\"\n+                                        \"description\": \"Query a Discount resource\",\n+                                        \"displayName\": \"Discounts\",\n+                                        \"value\": \"DISCOUNTS\"\n                                     },\n                                     {\n-                                        \"description\": \"This strategy lists an entity without any tracking. The same entity will be listed each time on executing this processor. It is recommended to change the default run schedule value. Any property that related to the persisting state will be disregarded.\",\n-                                        \"displayName\": \"No Tracking\",\n-                                        \"value\": \"none\"\n+                                        \"description\": \"Query an Inventory resource\",\n+                                        \"displayName\": \"Inventory\",\n+                                        \"value\": \"INVENTORY\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Query an Online Store resource\",\n+                                        \"displayName\": \"Online Store\",\n+                                        \"value\": \"ONLINE_STORE\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Query an Order resource\",\n+                                        \"displayName\": \"Orders\",\n+                                        \"value\": \"ORDERS\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Query a Product resource\",\n+                                        \"displayName\": \"Products\",\n+                                        \"value\": \"PRODUCT\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Query a Sales Channel resource\",\n+                                        \"displayName\": \"Sales Channels\",\n+                                        \"value\": \"SALES_CHANNELS\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Query a Store Property resource\",\n+                                        \"displayName\": \"Store Properties\",\n+                                        \"value\": \"STORE_PROPERTIES\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"timestamps\",\n-                                \"description\": \"Specify how to determine new/updated entities. See each strategy descriptions for detail.\",\n-                                \"displayName\": \"Listing Strategy\",\n+                                \"description\": \"Shopify object category\",\n+                                \"displayName\": \"Object Category\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"listing-strategy\",\n+                                \"name\": \"object-category\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"path-filter\": {\n-                                \"description\": \"When 'Recurse Subdirectories' is true, then only subdirectories whose paths match the given regular expression will be scanned\",\n-                                \"displayName\": \"Path Filter\",\n+                            \"result-limit\": {\n+                                \"description\": \"The maximum number of results to request for each invocation of the Processor\",\n+                                \"displayName\": \"Result Limit\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"path-filter\",\n+                                \"name\": \"result-limit\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"proxy-configuration-service\": {\n-                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests. Supported proxies: SOCKS, HTTP In case of SOCKS, it is not guaranteed that the selected SOCKS Version will be used by the processor.\",\n-                                \"displayName\": \"Proxy Configuration Service\",\n+                            \"store-domain\": {\n+                                \"description\": \"The domain of the Shopify store, e.g. nifistore.myshopify.com\",\n+                                \"displayName\": \"Store Domain\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"proxy-configuration-service\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.proxy.ProxyConfigurationService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"store-domain\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n                             },\n-                            \"record-writer\": {\n-                                \"description\": \"Specifies the Record Writer to use for creating the listing. If not specified, one FlowFile will be created for each entity that is listed. If the Record Writer is specified, all entities will be written to a single FlowFile instead of adding attributes to individual FlowFiles.\",\n-                                \"displayName\": \"Record Writer\",\n+                            \"web-client-service-provider\": {\n+                                \"description\": \"Controller service for HTTP client operations\",\n+                                \"displayName\": \"Web Client Service Provider\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"record-writer\",\n-                                \"required\": false,\n+                                \"name\": \"web-client-service-provider\",\n+                                \"required\": true,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n                                     \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n+                                    \"type\": \"org.apache.nifi.web.client.provider.api.WebClientServiceProvider\",\n                                     \"version\": \"1.27.0\"\n                                 }\n-                            },\n-                            \"recurse-subdirectories\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"true\",\n-                                \"description\": \"Indicates whether to list files from subdirectories of the directory\",\n-                                \"displayName\": \"Recurse Subdirectories\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"recurse-subdirectories\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n                             }\n                         },\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.processors.azure.storage.DeleteAzureDataLakeStorage\",\n-                            \"org.apache.nifi.processors.azure.storage.FetchAzureDataLakeStorage\",\n-                            \"org.apache.nifi.processors.azure.storage.PutAzureDataLakeStorage\"\n-                        ],\n                         \"sideEffectFree\": false,\n                         \"stateful\": {\n-                            \"description\": \"After performing a listing of files, the timestamp of the newest file is stored. This allows the Processor to list only files that have been added or modified after this date the next time that the Processor is run. State is stored across the cluster so that this Processor can be run on Primary Node only and if a new Primary Node is selected, the new node can pick up where the previous node left off, without duplicating the data.\",\n+                            \"description\": \"For a few resources the processor supports incremental loading. The list of the resources with the supported parameters can be found in the additional details.\",\n                             \"scopes\": [\n                                 \"CLUSTER\"\n                             ]\n                         },\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"All FlowFiles that are received are routed to success\",\n+                                \"description\": \"For FlowFiles created as a result of a successful query.\",\n                                 \"name\": \"success\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n                         \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"adlsgen2\",\n-                            \"azure\",\n-                            \"cloud\",\n-                            \"datalake\",\n-                            \"microsoft\",\n-                            \"storage\"\n+                            \"shopify\"\n                         ],\n                         \"triggerSerially\": true,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.azure.storage.ListAzureDataLakeStorage\",\n-                        \"typeDescription\": \"Lists directory in an Azure Data Lake Storage Gen 2 filesystem\",\n+                        \"type\": \"org.apache.nifi.processors.shopify.GetShopify\",\n+                        \"typeDescription\": \"Retrieves objects from a custom Shopify store. The processor yield time must be set to the account's rate limit accordingly.\",\n                         \"version\": \"1.27.0\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"The name of the Azure File System\",\n-                                \"name\": \"azure.filesystem\"\n-                            },\n-                            {\n-                                \"description\": \"The full path of the Azure File\",\n-                                \"name\": \"azure.filePath\"\n-                            },\n-                            {\n-                                \"description\": \"The name of the Azure Directory\",\n-                                \"name\": \"azure.directory\"\n-                            },\n-                            {\n-                                \"description\": \"The name of the Azure File\",\n-                                \"name\": \"azure.filename\"\n-                            },\n-                            {\n-                                \"description\": \"The length of the Azure File\",\n-                                \"name\": \"azure.length\"\n-                            },\n-                            {\n-                                \"description\": \"The last modification time of the Azure File\",\n-                                \"name\": \"azure.lastModified\"\n-                            },\n-                            {\n-                                \"description\": \"The ETag of the Azure File\",\n-                                \"name\": \"azure.etag\"\n+                                \"description\": \"Sets the MIME type to application/json\",\n+                                \"name\": \"mime.type\"\n                             }\n                         ]\n-                    },\n+                    }\n+                ],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"1.27.0\"\n+        },\n+        {\n+            \"artifact\": \"nifi-kafka-2-0-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-azure-nar\",\n+                        \"artifact\": \"nifi-kafka-2-0-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n-                        \"defaultBulletinLevel\": \"WARN\",\n-                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": 1,\n-                            \"TIMER_DRIVEN\": 1\n-                        },\n-                        \"defaultPenaltyDuration\": \"30 sec\",\n-                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"0 sec\"\n-                        },\n-                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n-                        \"defaultYieldDuration\": \"1 sec\",\n+                        \"deprecated\": true,\n+                        \"deprecationAlternatives\": [\n+                            \"org.apache.nifi.record.sink.kafka.KafkaRecordSink_2_6\"\n+                        ],\n+                        \"deprecationReason\": \"\",\n+                        \"dynamicProperties\": [\n+                            {\n+                                \"description\": \"These properties will be added on the Kafka configuration after loading any provided configuration properties. In the event a dynamic property represents a property that was already set, its value will be ignored and WARN message logged. For the list of available Kafka properties please refer to: http://kafka.apache.org/documentation.html#configuration. \",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"name\": \"The name of a Kafka configuration property.\",\n+                                \"value\": \"The value of a given Kafka configuration property.\"\n+                            }\n+                        ],\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_REQUIRED\",\n-                        \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"adls-credentials-service\": {\n-                                \"description\": \"Controller Service used to obtain Azure Credentials.\",\n-                                \"displayName\": \"ADLS Credentials\",\n+                            \"ack.wait.time\": {\n+                                \"defaultValue\": \"5 secs\",\n+                                \"description\": \"After sending a message to Kafka, this indicates the amount of time that we are willing to wait for a response from Kafka. If Kafka does not acknowledge the message within this time period, the FlowFile will be routed to 'failure'.\",\n+                                \"displayName\": \"Acknowledgment Wait Time\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"adls-credentials-service\",\n+                                \"name\": \"ack.wait.time\",\n                                 \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-azure-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.services.azure.storage.ADLSCredentialsService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n+                                \"sensitive\": false\n                             },\n-                            \"conflict-resolution-strategy\": {\n+                            \"acks\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"Records are considered 'transmitted successfully' after successfully writing the content to a Kafka node, without waiting for a response. This provides the best performance but may result in data loss.\",\n+                                        \"displayName\": \"Best Effort\",\n+                                        \"value\": \"0\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Records are considered 'transmitted successfully' if the message is received by a single Kafka node, whether or not it is replicated. This is faster than <Guarantee Replicated Delivery> but can result in data loss if a Kafka node crashes.\",\n+                                        \"displayName\": \"Guarantee Single Node Delivery\",\n+                                        \"value\": \"1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Records are considered 'transmitted unsuccessfully' unless the message is replicated to the appropriate number of Kafka Nodes according to the Topic configuration.\",\n+                                        \"displayName\": \"Guarantee Replicated Delivery\",\n+                                        \"value\": \"all\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"0\",\n+                                \"description\": \"Specifies the requirement for guaranteeing that a message is sent to Kafka. Corresponds to Kafka's 'acks' property.\",\n+                                \"displayName\": \"Delivery Guarantee\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"acks\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"bootstrap.servers\": {\n+                                \"defaultValue\": \"localhost:9092\",\n+                                \"description\": \"Comma-separated list of Kafka Brokers in the format host:port\",\n+                                \"displayName\": \"Kafka Brokers\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"bootstrap.servers\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"compression.type\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"fail\",\n-                                        \"value\": \"fail\"\n+                                        \"displayName\": \"none\",\n+                                        \"value\": \"none\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"replace\",\n-                                        \"value\": \"replace\"\n+                                        \"displayName\": \"gzip\",\n+                                        \"value\": \"gzip\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"ignore\",\n-                                        \"value\": \"ignore\"\n+                                        \"displayName\": \"snappy\",\n+                                        \"value\": \"snappy\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"lz4\",\n+                                        \"value\": \"lz4\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"fail\",\n-                                \"description\": \"Indicates what should happen when a file with the same name already exists in the output directory\",\n-                                \"displayName\": \"Conflict Resolution Strategy\",\n+                                \"defaultValue\": \"none\",\n+                                \"description\": \"This parameter allows you to specify the compression codec for all data generated by this producer.\",\n+                                \"displayName\": \"Compression Type\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"conflict-resolution-strategy\",\n+                                \"name\": \"compression.type\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"directory-name\": {\n-                                \"description\": \"Name of the Azure Storage Directory where the files will be moved. The Directory Name cannot contain a leading '/'. The root directory can be designated by the empty string value. Non-existing directories will be created. If the original directory structure should be kept, the full directory path needs to be provided after the destination directory. e.g.: destdir/${azure.directory}\",\n-                                \"displayName\": \"Destination Directory\",\n+                            \"kerberos-credentials-service\": {\n+                                \"description\": \"Service supporting generalized credentials authentication with Kerberos\",\n+                                \"displayName\": \"Kerberos Credentials Service\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"directory-name\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"kerberos-credentials-service\",\n+                                \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.kerberos.KerberosCredentialsService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n                             },\n-                            \"file-name\": {\n-                                \"defaultValue\": \"${azure.filename}\",\n-                                \"description\": \"The filename\",\n-                                \"displayName\": \"File Name\",\n+                            \"max.block.ms\": {\n+                                \"defaultValue\": \"5 sec\",\n+                                \"description\": \"The amount of time publisher will wait to obtain metadata or wait for the buffer to flush during the 'send' call before failing the entire 'send' call. Corresponds to Kafka's 'max.block.ms' property\",\n+                                \"displayName\": \"Max Metadata Wait Time\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"file-name\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"max.block.ms\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"filesystem-name\": {\n-                                \"description\": \"Name of the Azure Storage File System where the files will be moved.\",\n-                                \"displayName\": \"Destination Filesystem\",\n+                            \"max.request.size\": {\n+                                \"defaultValue\": \"1 MB\",\n+                                \"description\": \"The maximum size of a request in bytes. Corresponds to Kafka's 'max.request.size' property and defaults to 1 MB (1048576).\",\n+                                \"displayName\": \"Max Request Size\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"filesystem-name\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"max.request.size\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"proxy-configuration-service\": {\n-                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests. Supported proxies: SOCKS, HTTP In case of SOCKS, it is not guaranteed that the selected SOCKS Version will be used by the processor.\",\n-                                \"displayName\": \"Proxy Configuration Service\",\n+                            \"message-header-encoding\": {\n+                                \"defaultValue\": \"UTF-8\",\n+                                \"description\": \"For any attribute that is added as a message header, as configured via the <Attributes to Send as Headers> property, this property indicates the Character Encoding to use for serializing the headers.\",\n+                                \"displayName\": \"Message Header Encoding\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"proxy-configuration-service\",\n+                                \"name\": \"message-header-encoding\",\n                                 \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"record-sink-record-writer\": {\n+                                \"description\": \"Specifies the Controller Service to use for writing out the records.\",\n+                                \"displayName\": \"Record Writer\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"record-sink-record-writer\",\n+                                \"required\": true,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n                                     \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.proxy.ProxyConfigurationService\",\n+                                    \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             },\n-                            \"source-directory-name\": {\n-                                \"defaultValue\": \"${azure.directory}\",\n-                                \"description\": \"Name of the Azure Storage Directory from where the move should happen. The Directory Name cannot contain a leading '/'. The root directory can be designated by the empty string value.\",\n-                                \"displayName\": \"Source Directory\",\n+                            \"sasl.kerberos.service.name\": {\n+                                \"description\": \"The service name that matches the primary name of the Kafka server configured in the broker JAAS configuration\",\n+                                \"displayName\": \"Kerberos Service Name\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"source-directory-name\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"sasl.kerberos.service.name\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"sasl.mechanism\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"General Security Services API for Kerberos authentication\",\n+                                        \"displayName\": \"GSSAPI\",\n+                                        \"value\": \"GSSAPI\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Plain username and password authentication\",\n+                                        \"displayName\": \"PLAIN\",\n+                                        \"value\": \"PLAIN\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Salted Challenge Response Authentication Mechanism using SHA-512 with username and password\",\n+                                        \"displayName\": \"SCRAM-SHA-256\",\n+                                        \"value\": \"SCRAM-SHA-256\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Salted Challenge Response Authentication Mechanism using SHA-256 with username and password\",\n+                                        \"displayName\": \"SCRAM-SHA-512\",\n+                                        \"value\": \"SCRAM-SHA-512\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"GSSAPI\",\n+                                \"description\": \"SASL mechanism used for authentication. Corresponds to Kafka Client sasl.mechanism property\",\n+                                \"displayName\": \"SASL Mechanism\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"sasl.mechanism\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"source-filesystem-name\": {\n-                                \"defaultValue\": \"${azure.filesystem}\",\n-                                \"description\": \"Name of the Azure Storage File System from where the move should happen.\",\n-                                \"displayName\": \"Source Filesystem\",\n+                            \"security.protocol\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"PLAINTEXT\",\n+                                        \"value\": \"PLAINTEXT\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"SSL\",\n+                                        \"value\": \"SSL\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"SASL_PLAINTEXT\",\n+                                        \"value\": \"SASL_PLAINTEXT\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"SASL_SSL\",\n+                                        \"value\": \"SASL_SSL\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"PLAINTEXT\",\n+                                \"description\": \"Security protocol used to communicate with brokers. Corresponds to Kafka Client security.protocol property\",\n+                                \"displayName\": \"Security Protocol\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"source-filesystem-name\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"security.protocol\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"ssl.context.service\": {\n+                                \"description\": \"Service supporting SSL communication with Kafka brokers\",\n+                                \"displayName\": \"SSL Context Service\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"ssl.context.service\",\n+                                \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"topic\": {\n+                                \"description\": \"The name of the Kafka Topic to publish to.\",\n+                                \"displayName\": \"Topic Name\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"topic\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             }\n                         },\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.processors.azure.storage.DeleteAzureDataLakeStorage\",\n-                            \"org.apache.nifi.processors.azure.storage.FetchAzureDataLakeStorage\",\n-                            \"org.apache.nifi.processors.azure.storage.ListAzureDataLakeStorage\"\n-                        ],\n-                        \"sideEffectFree\": false,\n-                        \"supportedRelationships\": [\n-                            {\n-                                \"description\": \"Files that have been successfully written to Azure storage are transferred to this relationship\",\n-                                \"name\": \"success\"\n-                            },\n+                        \"providedApiImplementations\": [\n                             {\n-                                \"description\": \"Files that could not be written to Azure storage for some reason are transferred to this relationship\",\n-                                \"name\": \"failure\"\n+                                \"artifact\": \"nifi-standard-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.record.sink.RecordSinkService\",\n+                                \"version\": \"1.27.0\"\n                             }\n                         ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": false,\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": false,\n+                        \"supportsDynamicProperties\": true,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"adlsgen2\",\n-                            \"azure\",\n-                            \"cloud\",\n-                            \"datalake\",\n-                            \"microsoft\",\n-                            \"storage\"\n+                            \"kafka\",\n+                            \"record\",\n+                            \"sink\"\n                         ],\n-                        \"triggerSerially\": false,\n-                        \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.azure.storage.MoveAzureDataLakeStorage\",\n-                        \"typeDescription\": \"Moves content within an Azure Data Lake Storage Gen 2. After the move, files will be no longer available on source location.\",\n-                        \"version\": \"1.27.0\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"The name of the source Azure File System\",\n-                                \"name\": \"azure.source.filesystem\"\n-                            },\n-                            {\n-                                \"description\": \"The name of the source Azure Directory\",\n-                                \"name\": \"azure.source.directory\"\n-                            },\n-                            {\n-                                \"description\": \"The name of the Azure File System\",\n-                                \"name\": \"azure.filesystem\"\n-                            },\n-                            {\n-                                \"description\": \"The name of the Azure Directory\",\n-                                \"name\": \"azure.directory\"\n-                            },\n-                            {\n-                                \"description\": \"The name of the Azure File\",\n-                                \"name\": \"azure.filename\"\n-                            },\n-                            {\n-                                \"description\": \"Primary location for file content\",\n-                                \"name\": \"azure.primaryUri\"\n-                            },\n-                            {\n-                                \"description\": \"The length of the Azure File\",\n-                                \"name\": \"azure.length\"\n-                            }\n-                        ]\n-                    },\n+                        \"type\": \"org.apache.nifi.record.sink.kafka.KafkaRecordSink_2_0\",\n+                        \"typeDescription\": \"Provides a service to write records to a Kafka 2.x topic.\",\n+                        \"version\": \"1.27.0\"\n+                    }\n+                ],\n+                \"processors\": [\n                     {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-azure-nar\",\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-kafka-2-0-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -16174,586 +16193,571 @@\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n                         \"deprecated\": true,\n                         \"deprecationAlternatives\": [\n-                            \"org.apache.nifi.processors.azure.storage.PutAzureBlobStorage_v12\"\n+                            \"org.apache.nifi.processors.kafka.pubsub.ConsumeKafkaRecord_2_6\"\n+                        ],\n+                        \"deprecationReason\": \"\",\n+                        \"dynamicProperties\": [\n+                            {\n+                                \"description\": \"These properties will be added on the Kafka configuration after loading any provided configuration properties. In the event a dynamic property represents a property that was already set, its value will be ignored and WARN message logged. For the list of available Kafka properties please refer to: http://kafka.apache.org/documentation.html#configuration.\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"name\": \"The name of a Kafka configuration property.\",\n+                                \"value\": \"The value of a given Kafka configuration property.\"\n+                            }\n                         ],\n-                        \"deprecationReason\": \"Processor depends on legacy Microsoft Azure SDK\",\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_REQUIRED\",\n+                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"azure-create-container\": {\n+                            \"Communications Timeout\": {\n+                                \"defaultValue\": \"60 secs\",\n+                                \"description\": \"Specifies the timeout that the consumer should use when communicating with the Kafka Broker\",\n+                                \"displayName\": \"Communications Timeout\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Communications Timeout\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"auto.offset.reset\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"description\": \"Automatically reset the offset to the earliest offset\",\n+                                        \"displayName\": \"earliest\",\n+                                        \"value\": \"earliest\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"description\": \"Automatically reset the offset to the latest offset\",\n+                                        \"displayName\": \"latest\",\n+                                        \"value\": \"latest\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Throw exception to the consumer if no previous offset is found for the consumer's group\",\n+                                        \"displayName\": \"none\",\n+                                        \"value\": \"none\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"Specifies whether to check if the container exists and to automatically create it if it does not. Permission to list containers is required. If false, this check is not made, but the Put operation will fail if the container does not exist.\",\n-                                \"displayName\": \"Create Container\",\n+                                \"defaultValue\": \"latest\",\n+                                \"description\": \"Allows you to manage the condition when there is no initial offset in Kafka or if the current offset does not exist any more on the server (e.g. because that data has been deleted). Corresponds to Kafka's 'auto.offset.reset' property.\",\n+                                \"displayName\": \"Offset Reset\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"azure-create-container\",\n+                                \"name\": \"auto.offset.reset\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"blob\": {\n-                                \"description\": \"The filename of the blob\",\n-                                \"displayName\": \"Blob\",\n+                            \"aws.profile.name\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"AWS_MSK_IAM\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"SASL Mechanism\",\n+                                        \"propertyName\": \"sasl.mechanism\"\n+                                    }\n+                                ],\n+                                \"description\": \"The Amazon Web Services Profile to select when multiple profiles are available.\",\n+                                \"displayName\": \"AWS Profile Name\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"blob\",\n+                                \"name\": \"aws.profile.name\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"bootstrap.servers\": {\n+                                \"defaultValue\": \"localhost:9092\",\n+                                \"description\": \"Comma-separated list of Kafka Brokers in the format host:port\",\n+                                \"displayName\": \"Kafka Brokers\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"bootstrap.servers\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"container-name\": {\n-                                \"description\": \"Name of the Azure storage container. In case of PutAzureBlobStorage processor, container can be created if it does not exist.\",\n-                                \"displayName\": \"Container Name\",\n+                            \"group.id\": {\n+                                \"description\": \"A Group ID is used to identify consumers that are within the same consumer group. Corresponds to Kafka's 'group.id' property.\",\n+                                \"displayName\": \"Group ID\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"container-name\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"group.id\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"cse-key-id\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"SYMMETRIC\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Client-Side Encryption Key Type\",\n-                                        \"propertyName\": \"cse-key-type\"\n-                                    }\n-                                ],\n-                                \"description\": \"Specifies the ID of the key to use for client-side encryption.\",\n-                                \"displayName\": \"Client-Side Encryption Key ID\",\n+                            \"header-name-regex\": {\n+                                \"description\": \"A Regular Expression that is matched against all message headers. Any message header whose name matches the regex will be added to the FlowFile as an Attribute. If not specified, no Header values will be added as FlowFile attributes. If two messages have a different value for the same header and that header is selected by the provided regex, then those two messages must be added to different FlowFiles. As a result, users should be cautious about using a regex like \\\".*\\\" if messages are expected to have header values that are unique per message, such as an identifier or timestamp, because it will prevent NiFi from bundling the messages together efficiently.\",\n+                                \"displayName\": \"Headers to Add as Attributes (Regex)\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"cse-key-id\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"header-name-regex\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"cse-key-type\": {\n+                            \"honor-transactions\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"The blobs sent to Azure are not encrypted.\",\n-                                        \"displayName\": \"NONE\",\n-                                        \"value\": \"NONE\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n-                                        \"description\": \"The blobs sent to Azure are encrypted using a symmetric algorithm.\",\n-                                        \"displayName\": \"SYMMETRIC\",\n-                                        \"value\": \"SYMMETRIC\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"NONE\",\n-                                \"description\": \"Specifies the key type to use for client-side encryption.\",\n-                                \"displayName\": \"Client-Side Encryption Key Type\",\n+                                \"defaultValue\": \"true\",\n+                                \"description\": \"Specifies whether or not NiFi should honor transactional guarantees when communicating with Kafka. If false, the Processor will use an \\\"isolation level\\\" of read_uncomitted. This means that messages will be received as soon as they are written to Kafka but will be pulled, even if the producer cancels the transactions. If this value is true, NiFi will not receive any messages for which the producer's transaction was canceled, but this can result in some latency since the consumer must wait for the producer to finish its entire transaction instead of pulling as the messages become available.\",\n+                                \"displayName\": \"Honor Transactions\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"cse-key-type\",\n+                                \"name\": \"honor-transactions\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"cse-symmetric-key-hex\": {\n-                                \"dependencies\": [\n+                            \"kerberos-credentials-service\": {\n+                                \"description\": \"Service supporting generalized credentials authentication with Kerberos\",\n+                                \"displayName\": \"Kerberos Credentials Service\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"kerberos-credentials-service\",\n+                                \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.kerberos.KerberosCredentialsService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"key-attribute-encoding\": {\n+                                \"allowableValues\": [\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"SYMMETRIC\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Client-Side Encryption Key Type\",\n-                                        \"propertyName\": \"cse-key-type\"\n+                                        \"description\": \"The key is interpreted as a UTF-8 Encoded string.\",\n+                                        \"displayName\": \"UTF-8 Encoded\",\n+                                        \"value\": \"utf-8\"\n+                                    },\n+                                    {\n+                                        \"description\": \"The key is interpreted as arbitrary binary data and is encoded using hexadecimal characters with uppercase letters\",\n+                                        \"displayName\": \"Hex Encoded\",\n+                                        \"value\": \"hex\"\n+                                    },\n+                                    {\n+                                        \"description\": \"The key will not be added as an Attribute\",\n+                                        \"displayName\": \"Do Not Add Key as Attribute\",\n+                                        \"value\": \"do-not-add\"\n                                     }\n                                 ],\n-                                \"description\": \"When using symmetric client-side encryption, this is the raw key, encoded in hexadecimal\",\n-                                \"displayName\": \"Symmetric Key\",\n+                                \"defaultValue\": \"utf-8\",\n+                                \"description\": \"If the <Separate By Key> property is set to true, FlowFiles that are emitted have an attribute named 'kafka.key'. This property dictates how the value of the attribute should be encoded.\",\n+                                \"displayName\": \"Key Attribute Encoding\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"cse-symmetric-key-hex\",\n+                                \"name\": \"key-attribute-encoding\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"max-uncommit-offset-wait\": {\n+                                \"defaultValue\": \"1 secs\",\n+                                \"description\": \"Specifies the maximum amount of time allowed to pass before offsets must be committed. This value impacts how often offsets will be committed.  Committing offsets less often increases throughput but also increases the window of potential data duplication in the event of a rebalance or JVM restart between commits.  This value is also related to maximum poll records and the use of a message demarcator.  When using a message demarcator we can have far more uncommitted messages than when we're not as there is much less for us to keep track of in memory.\",\n+                                \"displayName\": \"Max Uncommitted Time\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"max-uncommit-offset-wait\",\n                                 \"required\": false,\n-                                \"sensitive\": true\n+                                \"sensitive\": false\n                             },\n-                            \"proxy-configuration-service\": {\n-                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests. Supported proxies: SOCKS, HTTP In case of SOCKS, it is not guaranteed that the selected SOCKS Version will be used by the processor.\",\n-                                \"displayName\": \"Proxy Configuration Service\",\n+                            \"max.poll.records\": {\n+                                \"defaultValue\": \"10000\",\n+                                \"description\": \"Specifies the maximum number of records Kafka should return in a single poll.\",\n+                                \"displayName\": \"Max Poll Records\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"proxy-configuration-service\",\n+                                \"name\": \"max.poll.records\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"message-header-encoding\": {\n+                                \"defaultValue\": \"UTF-8\",\n+                                \"description\": \"Any message header that is found on a Kafka message will be added to the outbound FlowFile as an attribute. This property indicates the Character Encoding to use for deserializing the headers.\",\n+                                \"displayName\": \"Message Header Encoding\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"message-header-encoding\",\n                                 \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"record-reader\": {\n+                                \"description\": \"The Record Reader to use for incoming FlowFiles\",\n+                                \"displayName\": \"Record Reader\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"record-reader\",\n+                                \"required\": true,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n                                     \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.proxy.ProxyConfigurationService\",\n+                                    \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             },\n-                            \"storage-account-key\": {\n-                                \"description\": \"The storage account key. This is an admin-like password providing access to every container in this account. It is recommended one uses Shared Access Signature (SAS) token instead for fine-grained control with policies. There are certain risks in allowing the account key to be stored as a flowfile attribute. While it does provide for a more flexible flow by allowing the account key to be fetched dynamically from a flowfile attribute, care must be taken to restrict access to the event provenance data (e.g., by strictly controlling the policies governing provenance for this processor). In addition, the provenance repositories may be put on encrypted disk partitions.\",\n-                                \"displayName\": \"Storage Account Key\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"storage-account-key\",\n-                                \"required\": false,\n-                                \"sensitive\": true\n-                            },\n-                            \"storage-account-name\": {\n-                                \"description\": \"The storage account name. There are certain risks in allowing the account name to be stored as a flowfile attribute. While it does provide for a more flexible flow by allowing the account name to be fetched dynamically from a flowfile attribute, care must be taken to restrict access to the event provenance data (e.g., by strictly controlling the policies governing provenance for this processor). In addition, the provenance repositories may be put on encrypted disk partitions. Instead of defining the Storage Account Name, Storage Account Key and SAS Token properties directly on the processor, the preferred way is to configure them through a controller service specified in the Storage Credentials property. The controller service can provide a common/shared configuration for multiple/all Azure processors. Furthermore, the credentials can also be looked up dynamically with the 'Lookup' version of the service.\",\n-                                \"displayName\": \"Storage Account Name\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"storage-account-name\",\n-                                \"required\": false,\n-                                \"sensitive\": true\n-                            },\n-                            \"storage-credentials-service\": {\n-                                \"description\": \"The Controller Service used to obtain Azure Storage Credentials. Instead of the processor level properties, the credentials can be configured here through a common/shared controller service, which is the preferred way. The 'Lookup' version of the service can also be used to select the credentials dynamically at runtime based on a FlowFile attribute (if the processor has FlowFile input).\",\n-                                \"displayName\": \"Storage Credentials\",\n+                            \"record-writer\": {\n+                                \"description\": \"The Record Writer to use in order to serialize the data before sending to Kafka\",\n+                                \"displayName\": \"Record Writer\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"storage-credentials-service\",\n-                                \"required\": false,\n+                                \"name\": \"record-writer\",\n+                                \"required\": true,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-azure-services-api-nar\",\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.services.azure.storage.AzureStorageCredentialsService\",\n+                                    \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             },\n-                            \"storage-endpoint-suffix\": {\n-                                \"description\": \"Storage accounts in public Azure always use a common FQDN suffix. Override this endpoint suffix with a different suffix in certain circumstances (like Azure Stack or non-public Azure regions). The preferred way is to configure them through a controller service specified in the Storage Credentials property. The controller service can provide a common/shared configuration for multiple/all Azure processors. Furthermore, the credentials can also be looked up dynamically with the 'Lookup' version of the service.\",\n-                                \"displayName\": \"Common Storage Account Endpoint Suffix\",\n+                            \"sasl.kerberos.keytab\": {\n+                                \"description\": \"Keytab credentials used for authentication with Kerberos\",\n+                                \"displayName\": \"Kerberos Keytab\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"storage-endpoint-suffix\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"sasl.kerberos.keytab\",\n                                 \"required\": false,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"SINGLE\",\n+                                    \"resourceTypes\": [\n+                                        \"FILE\"\n+                                    ]\n+                                },\n                                 \"sensitive\": false\n                             },\n-                            \"storage-sas-token\": {\n-                                \"description\": \"Shared Access Signature token, including the leading '?'. Specify either SAS token (recommended) or Account Key. There are certain risks in allowing the SAS token to be stored as a flowfile attribute. While it does provide for a more flexible flow by allowing the SAS token to be fetched dynamically from a flowfile attribute, care must be taken to restrict access to the event provenance data (e.g., by strictly controlling the policies governing provenance for this processor). In addition, the provenance repositories may be put on encrypted disk partitions.\",\n-                                \"displayName\": \"SAS Token\",\n+                            \"sasl.kerberos.principal\": {\n+                                \"description\": \"Principal used for authentication with Kerberos\",\n+                                \"displayName\": \"Kerberos Principal\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"storage-sas-token\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"sasl.kerberos.principal\",\n                                 \"required\": false,\n-                                \"sensitive\": true\n-                            }\n-                        },\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.processors.azure.storage.DeleteAzureBlobStorage\",\n-                            \"org.apache.nifi.processors.azure.storage.FetchAzureBlobStorage\",\n-                            \"org.apache.nifi.processors.azure.storage.ListAzureBlobStorage\"\n-                        ],\n-                        \"sideEffectFree\": false,\n-                        \"supportedRelationships\": [\n-                            {\n-                                \"description\": \"All successfully processed FlowFiles are routed to this relationship\",\n-                                \"name\": \"success\"\n-                            },\n-                            {\n-                                \"description\": \"Unsuccessful operations will be transferred to the failure relationship.\",\n-                                \"name\": \"failure\"\n-                            }\n-                        ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": false,\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": false,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"azure\",\n-                            \"blob\",\n-                            \"cloud\",\n-                            \"microsoft\",\n-                            \"storage\"\n-                        ],\n-                        \"triggerSerially\": false,\n-                        \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.azure.storage.PutAzureBlobStorage\",\n-                        \"typeDescription\": \"Puts content into an Azure Storage Blob\",\n-                        \"version\": \"1.27.0\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"The name of the Azure container\",\n-                                \"name\": \"azure.container\"\n-                            },\n-                            {\n-                                \"description\": \"The name of the Azure blob\",\n-                                \"name\": \"azure.blobname\"\n-                            },\n-                            {\n-                                \"description\": \"Primary location for blob content\",\n-                                \"name\": \"azure.primaryUri\"\n-                            },\n-                            {\n-                                \"description\": \"Etag for the Azure blob\",\n-                                \"name\": \"azure.etag\"\n-                            },\n-                            {\n-                                \"description\": \"Length of the blob\",\n-                                \"name\": \"azure.length\"\n+                                \"sensitive\": false\n                             },\n-                            {\n-                                \"description\": \"The timestamp in Azure for the blob\",\n-                                \"name\": \"azure.timestamp\"\n-                            }\n-                        ]\n-                    },\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-azure-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"e0c4461\"\n-                        },\n-                        \"defaultBulletinLevel\": \"WARN\",\n-                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": 1,\n-                            \"TIMER_DRIVEN\": 1\n-                        },\n-                        \"defaultPenaltyDuration\": \"30 sec\",\n-                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"0 sec\"\n-                        },\n-                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n-                        \"defaultYieldDuration\": \"1 sec\",\n-                        \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_REQUIRED\",\n-                        \"primaryNodeOnly\": false,\n-                        \"propertyDescriptors\": {\n-                            \"Client-Side Encryption Key ID\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"LOCAL\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Client-Side Encryption Key Type\",\n-                                        \"propertyName\": \"Client-Side Encryption Key Type\"\n-                                    }\n-                                ],\n-                                \"description\": \"Specifies the ID of the key to use for client-side encryption.\",\n-                                \"displayName\": \"Client-Side Encryption Key ID\",\n+                            \"sasl.kerberos.service.name\": {\n+                                \"description\": \"The service name that matches the primary name of the Kafka server configured in the broker JAAS configuration\",\n+                                \"displayName\": \"Kerberos Service Name\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Client-Side Encryption Key ID\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"sasl.kerberos.service.name\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Client-Side Encryption Key Type\": {\n+                            \"sasl.mechanism\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Client-Side Encryption disabled\",\n-                                        \"displayName\": \"NONE\",\n-                                        \"value\": \"NONE\"\n+                                        \"description\": \"General Security Services API for Kerberos authentication\",\n+                                        \"displayName\": \"GSSAPI\",\n+                                        \"value\": \"GSSAPI\"\n                                     },\n                                     {\n-                                        \"description\": \"Client-Side Encryption enabled using local key\",\n-                                        \"displayName\": \"LOCAL\",\n-                                        \"value\": \"LOCAL\"\n+                                        \"description\": \"Plain username and password authentication\",\n+                                        \"displayName\": \"PLAIN\",\n+                                        \"value\": \"PLAIN\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Salted Challenge Response Authentication Mechanism using SHA-512 with username and password\",\n+                                        \"displayName\": \"SCRAM-SHA-256\",\n+                                        \"value\": \"SCRAM-SHA-256\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Salted Challenge Response Authentication Mechanism using SHA-256 with username and password\",\n+                                        \"displayName\": \"SCRAM-SHA-512\",\n+                                        \"value\": \"SCRAM-SHA-512\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"NONE\",\n-                                \"description\": \"Specifies the key type to use for client-side encryption.\",\n-                                \"displayName\": \"Client-Side Encryption Key Type\",\n+                                \"defaultValue\": \"GSSAPI\",\n+                                \"description\": \"SASL mechanism used for authentication. Corresponds to Kafka Client sasl.mechanism property\",\n+                                \"displayName\": \"SASL Mechanism\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Client-Side Encryption Key Type\",\n+                                \"name\": \"sasl.mechanism\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Client-Side Encryption Local Key\": {\n+                            \"sasl.password\": {\n                                 \"dependencies\": [\n                                     {\n                                         \"dependentValues\": [\n-                                            \"LOCAL\"\n+                                            \"PLAIN\",\n+                                            \"SCRAM-SHA-512\",\n+                                            \"SCRAM-SHA-256\"\n                                         ],\n-                                        \"propertyDisplayName\": \"Client-Side Encryption Key Type\",\n-                                        \"propertyName\": \"Client-Side Encryption Key Type\"\n+                                        \"propertyDisplayName\": \"SASL Mechanism\",\n+                                        \"propertyName\": \"sasl.mechanism\"\n                                     }\n                                 ],\n-                                \"description\": \"When using local client-side encryption, this is the raw key, encoded in hexadecimal\",\n-                                \"displayName\": \"Client-Side Encryption Local Key\",\n+                                \"description\": \"Password provided with configured username when using PLAIN or SCRAM SASL Mechanisms\",\n+                                \"displayName\": \"Password\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Client-Side Encryption Local Key\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"sasl.password\",\n+                                \"required\": false,\n                                 \"sensitive\": true\n                             },\n-                            \"File Resource Service\": {\n+                            \"sasl.token.auth\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"false\",\n                                 \"dependencies\": [\n                                     {\n                                         \"dependentValues\": [\n-                                            \"FILE_RESOURCE_SERVICE\"\n+                                            \"SCRAM-SHA-512\",\n+                                            \"SCRAM-SHA-256\"\n                                         ],\n-                                        \"propertyDisplayName\": \"Resource Transfer Source\",\n-                                        \"propertyName\": \"Resource Transfer Source\"\n+                                        \"propertyDisplayName\": \"SASL Mechanism\",\n+                                        \"propertyName\": \"sasl.mechanism\"\n                                     }\n                                 ],\n-                                \"description\": \"File Resource Service providing access to the local resource to be transferred\",\n-                                \"displayName\": \"File Resource Service\",\n+                                \"description\": \"Enables or disables Token authentication when using SCRAM SASL Mechanisms\",\n+                                \"displayName\": \"Token Authentication\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"File Resource Service\",\n-                                \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.fileresource.service.api.FileResourceService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n+                                \"name\": \"sasl.token.auth\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n                             },\n-                            \"Resource Transfer Source\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"The content of the incoming FlowFile provides the source for transfer\",\n-                                        \"displayName\": \"FlowFile Content\",\n-                                        \"value\": \"FLOWFILE_CONTENT\"\n-                                    },\n+                            \"sasl.username\": {\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"The File Resource Service provides the source for transfer\",\n-                                        \"displayName\": \"File Resource Service\",\n-                                        \"value\": \"FILE_RESOURCE_SERVICE\"\n+                                        \"dependentValues\": [\n+                                            \"PLAIN\",\n+                                            \"SCRAM-SHA-512\",\n+                                            \"SCRAM-SHA-256\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"SASL Mechanism\",\n+                                        \"propertyName\": \"sasl.mechanism\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"FLOWFILE_CONTENT\",\n-                                \"description\": \"The source of the content to be transferred\",\n-                                \"displayName\": \"Resource Transfer Source\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Resource Transfer Source\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"blob-name\": {\n-                                \"description\": \"The full name of the blob\",\n-                                \"displayName\": \"Blob Name\",\n+                                \"description\": \"Username provided with configured password when using PLAIN or SCRAM SASL Mechanisms\",\n+                                \"displayName\": \"Username\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"blob-name\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"sasl.username\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"conflict-resolution-strategy\": {\n+                            \"security.protocol\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Fail if the blob already exists\",\n-                                        \"displayName\": \"fail\",\n-                                        \"value\": \"FAIL_RESOLUTION\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"PLAINTEXT\",\n+                                        \"value\": \"PLAINTEXT\"\n                                     },\n                                     {\n-                                        \"description\": \"Ignore if the blob already exists; the 'azure.error' attribute will be set to the value 'BLOB_ALREADY_EXISTS'\",\n-                                        \"displayName\": \"ignore\",\n-                                        \"value\": \"IGNORE_RESOLUTION\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"SSL\",\n+                                        \"value\": \"SSL\"\n                                     },\n                                     {\n-                                        \"description\": \"Replace blob contents if the blob already exist\",\n-                                        \"displayName\": \"replace\",\n-                                        \"value\": \"REPLACE_RESOLUTION\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"SASL_PLAINTEXT\",\n+                                        \"value\": \"SASL_PLAINTEXT\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"SASL_SSL\",\n+                                        \"value\": \"SASL_SSL\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"FAIL_RESOLUTION\",\n-                                \"description\": \"Specifies whether an existing blob will have its contents replaced upon conflict.\",\n-                                \"displayName\": \"Conflict Resolution Strategy\",\n+                                \"defaultValue\": \"PLAINTEXT\",\n+                                \"description\": \"Security protocol used to communicate with brokers. Corresponds to Kafka Client security.protocol property\",\n+                                \"displayName\": \"Security Protocol\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"conflict-resolution-strategy\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"container-name\": {\n-                                \"description\": \"Name of the Azure storage container. In case of PutAzureBlobStorage processor, container can be created if it does not exist.\",\n-                                \"displayName\": \"Container Name\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"container-name\",\n+                                \"name\": \"security.protocol\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"create-container\": {\n+                            \"separate-by-key\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"true\",\n                                         \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"false\",\n                                         \"value\": \"false\"\n                                     }\n                                 ],\n                                 \"defaultValue\": \"false\",\n-                                \"description\": \"Specifies whether to check if the container exists and to automatically create it if it does not. Permission to list containers is required. If false, this check is not made, but the Put operation will fail if the container does not exist.\",\n-                                \"displayName\": \"Create Container\",\n+                                \"description\": \"If true, two Records will only be added to the same FlowFile if both of the Kafka Messages have identical keys.\",\n+                                \"displayName\": \"Separate By Key\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"create-container\",\n-                                \"required\": true,\n+                                \"name\": \"separate-by-key\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"proxy-configuration-service\": {\n-                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests. Supported proxies: SOCKS, HTTP In case of SOCKS, it is not guaranteed that the selected SOCKS Version will be used by the processor.\",\n-                                \"displayName\": \"Proxy Configuration Service\",\n+                            \"ssl.context.service\": {\n+                                \"description\": \"Service supporting SSL communication with Kafka brokers\",\n+                                \"displayName\": \"SSL Context Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"proxy-configuration-service\",\n+                                \"name\": \"ssl.context.service\",\n                                 \"required\": false,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n                                     \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.proxy.ProxyConfigurationService\",\n+                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             },\n-                            \"storage-credentials-service\": {\n-                                \"description\": \"Controller Service used to obtain Azure Blob Storage Credentials.\",\n-                                \"displayName\": \"Storage Credentials\",\n+                            \"topic\": {\n+                                \"description\": \"The name of the Kafka Topic(s) to pull from. More than one can be supplied if comma separated.\",\n+                                \"displayName\": \"Topic Name(s)\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"topic\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"topic_type\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"Topic is a full topic name or comma separated list of names\",\n+                                        \"displayName\": \"names\",\n+                                        \"value\": \"names\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Topic is a regex using the Java Pattern syntax\",\n+                                        \"displayName\": \"pattern\",\n+                                        \"value\": \"pattern\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"names\",\n+                                \"description\": \"Specifies whether the Topic(s) provided are a comma separated list of names or a single regular expression\",\n+                                \"displayName\": \"Topic Name Format\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"storage-credentials-service\",\n+                                \"name\": \"topic_type\",\n                                 \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-azure-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.services.azure.storage.AzureStorageCredentialsService_v12\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n+                                \"sensitive\": false\n                             }\n                         },\n                         \"seeAlso\": [\n-                            \"org.apache.nifi.processors.azure.storage.DeleteAzureBlobStorage_v12\",\n-                            \"org.apache.nifi.processors.azure.storage.FetchAzureBlobStorage_v12\",\n-                            \"org.apache.nifi.processors.azure.storage.ListAzureBlobStorage_v12\"\n+                            \"org.apache.nifi.processors.kafka.pubsub.ConsumeKafka_2_0\",\n+                            \"org.apache.nifi.processors.kafka.pubsub.PublishKafkaRecord_2_0\",\n+                            \"org.apache.nifi.processors.kafka.pubsub.PublishKafka_2_0\"\n                         ],\n                         \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"All successfully processed FlowFiles are routed to this relationship\",\n+                                \"description\": \"FlowFiles received from Kafka.  Depending on demarcation strategy it is a flow file per message or a bundle of messages grouped by topic and partition.\",\n                                 \"name\": \"success\"\n                             },\n                             {\n-                                \"description\": \"Unsuccessful operations will be transferred to the failure relationship.\",\n-                                \"name\": \"failure\"\n+                                \"description\": \"If a message from Kafka cannot be parsed using the configured Record Reader, the contents of the message will be routed to this Relationship as its own individual FlowFile.\",\n+                                \"name\": \"parse.failure\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n                         \"supportsBatching\": false,\n-                        \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicProperties\": true,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"azure\",\n-                            \"blob\",\n-                            \"cloud\",\n-                            \"microsoft\",\n-                            \"storage\"\n+                            \"2.0\",\n+                            \"Consume\",\n+                            \"Get\",\n+                            \"Ingest\",\n+                            \"Ingress\",\n+                            \"Kafka\",\n+                            \"PubSub\",\n+                            \"Record\",\n+                            \"Topic\",\n+                            \"avro\",\n+                            \"csv\",\n+                            \"json\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.azure.storage.PutAzureBlobStorage_v12\",\n-                        \"typeDescription\": \"Puts content into a blob on Azure Blob Storage. The processor uses Azure Blob Storage client library v12.\",\n+                        \"type\": \"org.apache.nifi.processors.kafka.pubsub.ConsumeKafkaRecord_2_0\",\n+                        \"typeDescription\": \"Consumes messages from Apache Kafka specifically built against the Kafka 2.0 Consumer API. The complementary NiFi processor for sending messages is PublishKafkaRecord_2_0. Please note that, at this time, the Processor assumes that all records that are retrieved from a given partition have the same schema. If any of the Kafka messages are pulled but cannot be parsed or written with the configured Record Reader or Record Writer, the contents of the message will be written to a separate FlowFile, and that FlowFile will be transferred to the 'parse.failure' relationship. Otherwise, each FlowFile is sent to the 'success' relationship and may contain many individual messages within the single FlowFile. A 'record.count' attribute is added to indicate how many messages are contained in the FlowFile. No two Kafka messages will be placed into the same FlowFile if they have different schemas, or if they have different values for a message header that is included by the <Headers to Add as Attributes> property.\",\n                         \"version\": \"1.27.0\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"The name of the Azure Blob Storage container\",\n-                                \"name\": \"azure.container\"\n-                            },\n-                            {\n-                                \"description\": \"The name of the blob on Azure Blob Storage\",\n-                                \"name\": \"azure.blobname\"\n-                            },\n-                            {\n-                                \"description\": \"Primary location of the blob\",\n-                                \"name\": \"azure.primaryUri\"\n-                            },\n-                            {\n-                                \"description\": \"ETag of the blob\",\n-                                \"name\": \"azure.etag\"\n-                            },\n-                            {\n-                                \"description\": \"Type of the blob (either BlockBlob, PageBlob or AppendBlob)\",\n-                                \"name\": \"azure.blobtype\"\n+                                \"description\": \"The number of records received\",\n+                                \"name\": \"record.count\"\n                             },\n                             {\n-                                \"description\": \"MIME Type of the content\",\n+                                \"description\": \"The MIME Type that is provided by the configured Record Writer\",\n                                 \"name\": \"mime.type\"\n                             },\n                             {\n-                                \"description\": \"Language code for the content\",\n-                                \"name\": \"lang\"\n-                            },\n-                            {\n-                                \"description\": \"Timestamp of the blob\",\n-                                \"name\": \"azure.timestamp\"\n-                            },\n-                            {\n-                                \"description\": \"Length of the blob\",\n-                                \"name\": \"azure.length\"\n+                                \"description\": \"The partition of the topic the records are from\",\n+                                \"name\": \"kafka.partition\"\n                             },\n                             {\n-                                \"description\": \"Error code reported during blob operation\",\n-                                \"name\": \"azure.error.code\"\n+                                \"description\": \"The timestamp of the message in the partition of the topic.\",\n+                                \"name\": \"kafka.timestamp\"\n                             },\n                             {\n-                                \"description\": \"When Conflict Resolution Strategy is 'ignore', this property will be true/false depending on whether the blob was ignored.\",\n-                                \"name\": \"azure.ignored\"\n+                                \"description\": \"The topic records are from\",\n+                                \"name\": \"kafka.topic\"\n                             }\n                         ]\n                     },\n                     {\n                         \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-azure-nar\",\n+                        \"artifact\": \"nifi-kafka-2-0-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -16761,266 +16765,542 @@\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n+                        \"deprecated\": true,\n+                        \"deprecationAlternatives\": [\n+                            \"org.apache.nifi.processors.kafka.pubsub.ConsumeKafka_2_6\"\n+                        ],\n+                        \"deprecationReason\": \"\",\n+                        \"dynamicProperties\": [\n+                            {\n+                                \"description\": \"These properties will be added on the Kafka configuration after loading any provided configuration properties. In the event a dynamic property represents a property that was already set, its value will be ignored and WARN message logged. For the list of available Kafka properties please refer to: http://kafka.apache.org/documentation.html#configuration. \",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"name\": \"The name of a Kafka configuration property.\",\n+                                \"value\": \"The value of a given Kafka configuration property.\"\n+                            }\n+                        ],\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_REQUIRED\",\n+                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"File Resource Service\": {\n+                            \"Communications Timeout\": {\n+                                \"defaultValue\": \"60 secs\",\n+                                \"description\": \"Specifies the timeout that the consumer should use when communicating with the Kafka Broker\",\n+                                \"displayName\": \"Communications Timeout\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Communications Timeout\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"auto.offset.reset\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"Automatically reset the offset to the earliest offset\",\n+                                        \"displayName\": \"earliest\",\n+                                        \"value\": \"earliest\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Automatically reset the offset to the latest offset\",\n+                                        \"displayName\": \"latest\",\n+                                        \"value\": \"latest\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Throw exception to the consumer if no previous offset is found for the consumer's group\",\n+                                        \"displayName\": \"none\",\n+                                        \"value\": \"none\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"latest\",\n+                                \"description\": \"Allows you to manage the condition when there is no initial offset in Kafka or if the current offset does not exist any more on the server (e.g. because that data has been deleted). Corresponds to Kafka's 'auto.offset.reset' property.\",\n+                                \"displayName\": \"Offset Reset\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"auto.offset.reset\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"aws.profile.name\": {\n                                 \"dependencies\": [\n                                     {\n                                         \"dependentValues\": [\n-                                            \"FILE_RESOURCE_SERVICE\"\n+                                            \"AWS_MSK_IAM\"\n                                         ],\n-                                        \"propertyDisplayName\": \"Resource Transfer Source\",\n-                                        \"propertyName\": \"Resource Transfer Source\"\n+                                        \"propertyDisplayName\": \"SASL Mechanism\",\n+                                        \"propertyName\": \"sasl.mechanism\"\n                                     }\n                                 ],\n-                                \"description\": \"File Resource Service providing access to the local resource to be transferred\",\n-                                \"displayName\": \"File Resource Service\",\n+                                \"description\": \"The Amazon Web Services Profile to select when multiple profiles are available.\",\n+                                \"displayName\": \"AWS Profile Name\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"aws.profile.name\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"bootstrap.servers\": {\n+                                \"defaultValue\": \"localhost:9092\",\n+                                \"description\": \"Comma-separated list of Kafka Brokers in the format host:port\",\n+                                \"displayName\": \"Kafka Brokers\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"bootstrap.servers\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"group.id\": {\n+                                \"description\": \"A Group ID is used to identify consumers that are within the same consumer group. Corresponds to Kafka's 'group.id' property.\",\n+                                \"displayName\": \"Group ID\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"group.id\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"header-name-regex\": {\n+                                \"description\": \"A Regular Expression that is matched against all message headers. Any message header whose name matches the regex will be added to the FlowFile as an Attribute. If not specified, no Header values will be added as FlowFile attributes. If two messages have a different value for the same header and that header is selected by the provided regex, then those two messages must be added to different FlowFiles. As a result, users should be cautious about using a regex like \\\".*\\\" if messages are expected to have header values that are unique per message, such as an identifier or timestamp, because it will prevent NiFi from bundling the messages together efficiently.\",\n+                                \"displayName\": \"Headers to Add as Attributes (Regex)\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"File Resource Service\",\n+                                \"name\": \"header-name-regex\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"honor-transactions\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"true\",\n+                                \"description\": \"Specifies whether or not NiFi should honor transactional guarantees when communicating with Kafka. If false, the Processor will use an \\\"isolation level\\\" of read_uncomitted. This means that messages will be received as soon as they are written to Kafka but will be pulled, even if the producer cancels the transactions. If this value is true, NiFi will not receive any messages for which the producer's transaction was canceled, but this can result in some latency since the consumer must wait for the producer to finish its entire transaction instead of pulling as the messages become available.\",\n+                                \"displayName\": \"Honor Transactions\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"honor-transactions\",\n                                 \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"kerberos-credentials-service\": {\n+                                \"description\": \"Service supporting generalized credentials authentication with Kerberos\",\n+                                \"displayName\": \"Kerberos Credentials Service\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"kerberos-credentials-service\",\n+                                \"required\": false,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n                                     \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.fileresource.service.api.FileResourceService\",\n+                                    \"type\": \"org.apache.nifi.kerberos.KerberosCredentialsService\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             },\n-                            \"Resource Transfer Source\": {\n+                            \"key-attribute-encoding\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"The content of the incoming FlowFile provides the source for transfer\",\n-                                        \"displayName\": \"FlowFile Content\",\n-                                        \"value\": \"FLOWFILE_CONTENT\"\n+                                        \"description\": \"The key is interpreted as a UTF-8 Encoded string.\",\n+                                        \"displayName\": \"UTF-8 Encoded\",\n+                                        \"value\": \"utf-8\"\n                                     },\n                                     {\n-                                        \"description\": \"The File Resource Service provides the source for transfer\",\n-                                        \"displayName\": \"File Resource Service\",\n-                                        \"value\": \"FILE_RESOURCE_SERVICE\"\n+                                        \"description\": \"The key is interpreted as arbitrary binary data and is encoded using hexadecimal characters with uppercase letters\",\n+                                        \"displayName\": \"Hex Encoded\",\n+                                        \"value\": \"hex\"\n+                                    },\n+                                    {\n+                                        \"description\": \"The key will not be added as an Attribute\",\n+                                        \"displayName\": \"Do Not Add Key as Attribute\",\n+                                        \"value\": \"do-not-add\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"FLOWFILE_CONTENT\",\n-                                \"description\": \"The source of the content to be transferred\",\n-                                \"displayName\": \"Resource Transfer Source\",\n+                                \"defaultValue\": \"utf-8\",\n+                                \"description\": \"FlowFiles that are emitted have an attribute named 'kafka.key'. This property dictates how the value of the attribute should be encoded.\",\n+                                \"displayName\": \"Key Attribute Encoding\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Resource Transfer Source\",\n+                                \"name\": \"key-attribute-encoding\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"adls-credentials-service\": {\n-                                \"description\": \"Controller Service used to obtain Azure Credentials.\",\n-                                \"displayName\": \"ADLS Credentials\",\n+                            \"max-uncommit-offset-wait\": {\n+                                \"defaultValue\": \"1 secs\",\n+                                \"description\": \"Specifies the maximum amount of time allowed to pass before offsets must be committed. This value impacts how often offsets will be committed.  Committing offsets less often increases throughput but also increases the window of potential data duplication in the event of a rebalance or JVM restart between commits.  This value is also related to maximum poll records and the use of a message demarcator.  When using a message demarcator we can have far more uncommitted messages than when we're not as there is much less for us to keep track of in memory.\",\n+                                \"displayName\": \"Max Uncommitted Time\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"adls-credentials-service\",\n+                                \"name\": \"max-uncommit-offset-wait\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"max.poll.records\": {\n+                                \"defaultValue\": \"10000\",\n+                                \"description\": \"Specifies the maximum number of records Kafka should return in a single poll.\",\n+                                \"displayName\": \"Max Poll Records\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"max.poll.records\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"message-demarcator\": {\n+                                \"description\": \"Since KafkaConsumer receives messages in batches, you have an option to output FlowFiles which contains all Kafka messages in a single batch for a given topic and partition and this property allows you to provide a string (interpreted as UTF-8) to use for demarcating apart multiple Kafka messages. This is an optional property and if not provided each Kafka message received will result in a single FlowFile which  time it is triggered. To enter special character such as 'new line' use CTRL+Enter or Shift+Enter depending on the OS\",\n+                                \"displayName\": \"Message Demarcator\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"message-demarcator\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"message-header-encoding\": {\n+                                \"defaultValue\": \"UTF-8\",\n+                                \"description\": \"Any message header that is found on a Kafka message will be added to the outbound FlowFile as an attribute. This property indicates the Character Encoding to use for deserializing the headers.\",\n+                                \"displayName\": \"Message Header Encoding\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"message-header-encoding\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"sasl.kerberos.keytab\": {\n+                                \"description\": \"Keytab credentials used for authentication with Kerberos\",\n+                                \"displayName\": \"Kerberos Keytab\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"sasl.kerberos.keytab\",\n+                                \"required\": false,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"SINGLE\",\n+                                    \"resourceTypes\": [\n+                                        \"FILE\"\n+                                    ]\n+                                },\n+                                \"sensitive\": false\n+                            },\n+                            \"sasl.kerberos.principal\": {\n+                                \"description\": \"Principal used for authentication with Kerberos\",\n+                                \"displayName\": \"Kerberos Principal\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"sasl.kerberos.principal\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"sasl.kerberos.service.name\": {\n+                                \"description\": \"The service name that matches the primary name of the Kafka server configured in the broker JAAS configuration\",\n+                                \"displayName\": \"Kerberos Service Name\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"sasl.kerberos.service.name\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"sasl.mechanism\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"General Security Services API for Kerberos authentication\",\n+                                        \"displayName\": \"GSSAPI\",\n+                                        \"value\": \"GSSAPI\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Plain username and password authentication\",\n+                                        \"displayName\": \"PLAIN\",\n+                                        \"value\": \"PLAIN\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Salted Challenge Response Authentication Mechanism using SHA-512 with username and password\",\n+                                        \"displayName\": \"SCRAM-SHA-256\",\n+                                        \"value\": \"SCRAM-SHA-256\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Salted Challenge Response Authentication Mechanism using SHA-256 with username and password\",\n+                                        \"displayName\": \"SCRAM-SHA-512\",\n+                                        \"value\": \"SCRAM-SHA-512\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"GSSAPI\",\n+                                \"description\": \"SASL mechanism used for authentication. Corresponds to Kafka Client sasl.mechanism property\",\n+                                \"displayName\": \"SASL Mechanism\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"sasl.mechanism\",\n                                 \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-azure-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.services.azure.storage.ADLSCredentialsService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n+                                \"sensitive\": false\n                             },\n-                            \"base-temporary-path\": {\n-                                \"defaultValue\": \"\",\n+                            \"sasl.password\": {\n                                 \"dependencies\": [\n                                     {\n                                         \"dependentValues\": [\n-                                            \"WRITE_AND_RENAME\"\n+                                            \"PLAIN\",\n+                                            \"SCRAM-SHA-512\",\n+                                            \"SCRAM-SHA-256\"\n                                         ],\n-                                        \"propertyDisplayName\": \"Writing Strategy\",\n-                                        \"propertyName\": \"writing-strategy\"\n+                                        \"propertyDisplayName\": \"SASL Mechanism\",\n+                                        \"propertyName\": \"sasl.mechanism\"\n                                     }\n                                 ],\n-                                \"description\": \"The Path where the temporary directory will be created. The Path name cannot contain a leading '/'. The root directory can be designated by the empty string value. Non-existing directories will be created.The Temporary File Directory name is _nifitempdirectory\",\n-                                \"displayName\": \"Base Temporary Path\",\n+                                \"description\": \"Password provided with configured username when using PLAIN or SCRAM SASL Mechanisms\",\n+                                \"displayName\": \"Password\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"base-temporary-path\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"sasl.password\",\n                                 \"required\": false,\n-                                \"sensitive\": false\n+                                \"sensitive\": true\n                             },\n-                            \"conflict-resolution-strategy\": {\n+                            \"sasl.token.auth\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"fail\",\n-                                        \"value\": \"fail\"\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"replace\",\n-                                        \"value\": \"replace\"\n-                                    },\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"false\",\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"ignore\",\n-                                        \"value\": \"ignore\"\n+                                        \"dependentValues\": [\n+                                            \"SCRAM-SHA-512\",\n+                                            \"SCRAM-SHA-256\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"SASL Mechanism\",\n+                                        \"propertyName\": \"sasl.mechanism\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"fail\",\n-                                \"description\": \"Indicates what should happen when a file with the same name already exists in the output directory\",\n-                                \"displayName\": \"Conflict Resolution Strategy\",\n+                                \"description\": \"Enables or disables Token authentication when using SCRAM SASL Mechanisms\",\n+                                \"displayName\": \"Token Authentication\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"conflict-resolution-strategy\",\n-                                \"required\": true,\n+                                \"name\": \"sasl.token.auth\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"directory-name\": {\n-                                \"description\": \"Name of the Azure Storage Directory. The Directory Name cannot contain a leading '/'. The root directory can be designated by the empty string value. In case of the PutAzureDataLakeStorage processor, the directory will be created if not already existing.\",\n-                                \"displayName\": \"Directory Name\",\n+                            \"sasl.username\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"PLAIN\",\n+                                            \"SCRAM-SHA-512\",\n+                                            \"SCRAM-SHA-256\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"SASL Mechanism\",\n+                                        \"propertyName\": \"sasl.mechanism\"\n+                                    }\n+                                ],\n+                                \"description\": \"Username provided with configured password when using PLAIN or SCRAM SASL Mechanisms\",\n+                                \"displayName\": \"Username\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"directory-name\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"sasl.username\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"file-name\": {\n-                                \"defaultValue\": \"${azure.filename}\",\n-                                \"description\": \"The filename\",\n-                                \"displayName\": \"File Name\",\n+                            \"security.protocol\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"PLAINTEXT\",\n+                                        \"value\": \"PLAINTEXT\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"SSL\",\n+                                        \"value\": \"SSL\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"SASL_PLAINTEXT\",\n+                                        \"value\": \"SASL_PLAINTEXT\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"SASL_SSL\",\n+                                        \"value\": \"SASL_SSL\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"PLAINTEXT\",\n+                                \"description\": \"Security protocol used to communicate with brokers. Corresponds to Kafka Client security.protocol property\",\n+                                \"displayName\": \"Security Protocol\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"file-name\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"security.protocol\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"filesystem-name\": {\n-                                \"description\": \"Name of the Azure Storage File System (also called Container). It is assumed to be already existing.\",\n-                                \"displayName\": \"Filesystem Name\",\n+                            \"separate-by-key\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"If true, and the <Message Demarcator> property is set, two messages will only be added to the same FlowFile if both of the Kafka Messages have identical keys.\",\n+                                \"displayName\": \"Separate By Key\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"filesystem-name\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"separate-by-key\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"proxy-configuration-service\": {\n-                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests. Supported proxies: SOCKS, HTTP In case of SOCKS, it is not guaranteed that the selected SOCKS Version will be used by the processor.\",\n-                                \"displayName\": \"Proxy Configuration Service\",\n+                            \"ssl.context.service\": {\n+                                \"description\": \"Service supporting SSL communication with Kafka brokers\",\n+                                \"displayName\": \"SSL Context Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"proxy-configuration-service\",\n+                                \"name\": \"ssl.context.service\",\n                                 \"required\": false,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n                                     \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.proxy.ProxyConfigurationService\",\n+                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             },\n-                            \"writing-strategy\": {\n+                            \"topic\": {\n+                                \"description\": \"The name of the Kafka Topic(s) to pull from. More than one can be supplied if comma separated.\",\n+                                \"displayName\": \"Topic Name(s)\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"topic\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"topic_type\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"The processor writes the Azure file into a temporary directory and then renames/moves it to the final destination. This prevents other processes from reading partially written files.\",\n-                                        \"displayName\": \"Write and Rename\",\n-                                        \"value\": \"WRITE_AND_RENAME\"\n+                                        \"description\": \"Topic is a full topic name or comma separated list of names\",\n+                                        \"displayName\": \"names\",\n+                                        \"value\": \"names\"\n                                     },\n                                     {\n-                                        \"description\": \"The processor writes the Azure file directly to the destination. This might result in the reading of partially written files.\",\n-                                        \"displayName\": \"Simple Write\",\n-                                        \"value\": \"SIMPLE_WRITE\"\n+                                        \"description\": \"Topic is a regex using the Java Pattern syntax\",\n+                                        \"displayName\": \"pattern\",\n+                                        \"value\": \"pattern\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"WRITE_AND_RENAME\",\n-                                \"description\": \"Defines the approach for writing the Azure file.\",\n-                                \"displayName\": \"Writing Strategy\",\n+                                \"defaultValue\": \"names\",\n+                                \"description\": \"Specifies whether the Topic(s) provided are a comma separated list of names or a single regular expression\",\n+                                \"displayName\": \"Topic Name Format\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"writing-strategy\",\n+                                \"name\": \"topic_type\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             }\n                         },\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.processors.azure.storage.DeleteAzureDataLakeStorage\",\n-                            \"org.apache.nifi.processors.azure.storage.FetchAzureDataLakeStorage\",\n-                            \"org.apache.nifi.processors.azure.storage.ListAzureDataLakeStorage\"\n-                        ],\n                         \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"Files that have been successfully written to Azure storage are transferred to this relationship\",\n+                                \"description\": \"FlowFiles received from Kafka. Depending on demarcation strategy it is a flow file per message or a bundle of messages grouped by topic and partition.\",\n                                 \"name\": \"success\"\n-                            },\n-                            {\n-                                \"description\": \"Files that could not be written to Azure storage for some reason are transferred to this relationship\",\n-                                \"name\": \"failure\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n                         \"supportsBatching\": false,\n-                        \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicProperties\": true,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"adlsgen2\",\n-                            \"azure\",\n-                            \"cloud\",\n-                            \"datalake\",\n-                            \"microsoft\",\n-                            \"storage\"\n+                            \"2.0\",\n+                            \"Consume\",\n+                            \"Get\",\n+                            \"Ingest\",\n+                            \"Ingress\",\n+                            \"Kafka\",\n+                            \"PubSub\",\n+                            \"Topic\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.azure.storage.PutAzureDataLakeStorage\",\n-                        \"typeDescription\": \"Writes the contents of a FlowFile as a file on Azure Data Lake Storage Gen 2\",\n+                        \"type\": \"org.apache.nifi.processors.kafka.pubsub.ConsumeKafka_2_0\",\n+                        \"typeDescription\": \"Consumes messages from Apache Kafka specifically built against the Kafka 2.0 Consumer API. The complementary NiFi processor for sending messages is PublishKafka_2_0.\",\n                         \"version\": \"1.27.0\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"The name of the Azure File System\",\n-                                \"name\": \"azure.filesystem\"\n+                                \"description\": \"The number of messages written if more than one\",\n+                                \"name\": \"kafka.count\"\n                             },\n                             {\n-                                \"description\": \"The name of the Azure Directory\",\n-                                \"name\": \"azure.directory\"\n+                                \"description\": \"The key of message if present and if single message. How the key is encoded depends on the value of the 'Key Attribute Encoding' property.\",\n+                                \"name\": \"kafka.key\"\n                             },\n                             {\n-                                \"description\": \"The name of the Azure File\",\n-                                \"name\": \"azure.filename\"\n+                                \"description\": \"The offset of the message in the partition of the topic.\",\n+                                \"name\": \"kafka.offset\"\n                             },\n                             {\n-                                \"description\": \"Primary location for file content\",\n-                                \"name\": \"azure.primaryUri\"\n+                                \"description\": \"The timestamp of the message in the partition of the topic.\",\n+                                \"name\": \"kafka.timestamp\"\n                             },\n                             {\n-                                \"description\": \"The length of the Azure File\",\n-                                \"name\": \"azure.length\"\n+                                \"description\": \"The partition of the topic the message or message bundle is from\",\n+                                \"name\": \"kafka.partition\"\n+                            },\n+                            {\n+                                \"description\": \"The topic the message or message bundle is from\",\n+                                \"name\": \"kafka.topic\"\n                             }\n                         ]\n                     },\n                     {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-azure-nar\",\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-kafka-2-0-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -17030,566 +17310,590 @@\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n                         \"deprecated\": true,\n                         \"deprecationAlternatives\": [\n-                            \"org.apache.nifi.processors.azure.storage.queue.GetAzureQueueStorage_v12\"\n+                            \"org.apache.nifi.processors.kafka.pubsub.PublishKafkaRecord_2_6\"\n                         ],\n                         \"deprecationReason\": \"\",\n+                        \"dynamicProperties\": [\n+                            {\n+                                \"description\": \"These properties will be added on the Kafka configuration after loading any provided configuration properties. In the event a dynamic property represents a property that was already set, its value will be ignored and WARN message logged. For the list of available Kafka properties please refer to: http://kafka.apache.org/documentation.html#configuration. \",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"name\": \"The name of a Kafka configuration property.\",\n+                                \"value\": \"The value of a given Kafka configuration property.\"\n+                            }\n+                        ],\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"auto-delete-messages\": {\n+                            \"Failure Strategy\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"description\": \"When unable to publish records to Kafka, the FlowFile will be routed to the failure relationship.\",\n+                                        \"displayName\": \"Route to Failure\",\n+                                        \"value\": \"Route to Failure\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"description\": \"When unable to publish records to Kafka, the FlowFile will be placed back on the queue so that it will be retried. For flows where FlowFile ordering is important, this strategy can be used along with ensuring that the each processor uses only a single Concurrent Task.\",\n+                                        \"displayName\": \"Rollback\",\n+                                        \"value\": \"Rollback\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"true\",\n-                                \"description\": \"Specifies whether the received message is to be automatically deleted from the queue.\",\n-                                \"displayName\": \"Auto Delete Messages\",\n+                                \"defaultValue\": \"Route to Failure\",\n+                                \"description\": \"Specifies how the processor handles a FlowFile if it is unable to publish the data to Kafka\",\n+                                \"displayName\": \"Failure Strategy\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"auto-delete-messages\",\n+                                \"name\": \"Failure Strategy\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"batch-size\": {\n-                                \"defaultValue\": \"32\",\n-                                \"description\": \"The number of messages to be retrieved from the queue.\",\n-                                \"displayName\": \"Batch Size\",\n+                            \"ack.wait.time\": {\n+                                \"defaultValue\": \"5 secs\",\n+                                \"description\": \"After sending a message to Kafka, this indicates the amount of time that we are willing to wait for a response from Kafka. If Kafka does not acknowledge the message within this time period, the FlowFile will be routed to 'failure'.\",\n+                                \"displayName\": \"Acknowledgment Wait Time\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"batch-size\",\n+                                \"name\": \"ack.wait.time\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"proxy-configuration-service\": {\n-                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests. Supported proxies: SOCKS, HTTP In case of SOCKS, it is not guaranteed that the selected SOCKS Version will be used by the processor.\",\n-                                \"displayName\": \"Proxy Configuration Service\",\n+                            \"acks\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"FlowFile will be routed to success after successfully sending the content to a Kafka node, without waiting for any acknowledgment from the node at all. This provides the best performance but may result in data loss.\",\n+                                        \"displayName\": \"Best Effort\",\n+                                        \"value\": \"0\"\n+                                    },\n+                                    {\n+                                        \"description\": \"FlowFile will be routed to success if the message is received by a single Kafka node, whether or not it is replicated. This is faster than <Guarantee Replicated Delivery> but can result in data loss if a Kafka node crashes\",\n+                                        \"displayName\": \"Guarantee Single Node Delivery\",\n+                                        \"value\": \"1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"FlowFile will be routed to failure unless the message is replicated to the appropriate number of Kafka Nodes according to the Topic configuration\",\n+                                        \"displayName\": \"Guarantee Replicated Delivery\",\n+                                        \"value\": \"all\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"all\",\n+                                \"description\": \"Specifies the requirement for guaranteeing that a message is sent to Kafka. Corresponds to Kafka's 'acks' property.\",\n+                                \"displayName\": \"Delivery Guarantee\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"proxy-configuration-service\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.proxy.ProxyConfigurationService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            },\n-                            \"storage-account-key\": {\n-                                \"description\": \"The storage account key. This is an admin-like password providing access to every container in this account. It is recommended one uses Shared Access Signature (SAS) token instead for fine-grained control with policies. There are certain risks in allowing the account key to be stored as a flowfile attribute. While it does provide for a more flexible flow by allowing the account key to be fetched dynamically from a flowfile attribute, care must be taken to restrict access to the event provenance data (e.g., by strictly controlling the policies governing provenance for this processor). In addition, the provenance repositories may be put on encrypted disk partitions.\",\n-                                \"displayName\": \"Storage Account Key\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"storage-account-key\",\n-                                \"required\": false,\n-                                \"sensitive\": true\n-                            },\n-                            \"storage-account-name\": {\n-                                \"description\": \"The storage account name. There are certain risks in allowing the account name to be stored as a flowfile attribute. While it does provide for a more flexible flow by allowing the account name to be fetched dynamically from a flowfile attribute, care must be taken to restrict access to the event provenance data (e.g., by strictly controlling the policies governing provenance for this processor). In addition, the provenance repositories may be put on encrypted disk partitions. Instead of defining the Storage Account Name, Storage Account Key and SAS Token properties directly on the processor, the preferred way is to configure them through a controller service specified in the Storage Credentials property. The controller service can provide a common/shared configuration for multiple/all Azure processors. Furthermore, the credentials can also be looked up dynamically with the 'Lookup' version of the service.\",\n-                                \"displayName\": \"Storage Account Name\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"storage-account-name\",\n-                                \"required\": false,\n-                                \"sensitive\": true\n+                                \"name\": \"acks\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n                             },\n-                            \"storage-credentials-service\": {\n-                                \"description\": \"The Controller Service used to obtain Azure Storage Credentials. Instead of the processor level properties, the credentials can be configured here through a common/shared controller service, which is the preferred way. The 'Lookup' version of the service can also be used to select the credentials dynamically at runtime based on a FlowFile attribute (if the processor has FlowFile input).\",\n-                                \"displayName\": \"Storage Credentials\",\n+                            \"attribute-name-regex\": {\n+                                \"description\": \"A Regular Expression that is matched against all FlowFile attribute names. Any attribute whose name matches the regex will be added to the Kafka messages as a Header. If not specified, no FlowFile attributes will be added as headers.\",\n+                                \"displayName\": \"Attributes to Send as Headers (Regex)\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"storage-credentials-service\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-azure-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.services.azure.storage.AzureStorageCredentialsService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            },\n-                            \"storage-endpoint-suffix\": {\n-                                \"description\": \"Storage accounts in public Azure always use a common FQDN suffix. Override this endpoint suffix with a different suffix in certain circumstances (like Azure Stack or non-public Azure regions). The preferred way is to configure them through a controller service specified in the Storage Credentials property. The controller service can provide a common/shared configuration for multiple/all Azure processors. Furthermore, the credentials can also be looked up dynamically with the 'Lookup' version of the service.\",\n-                                \"displayName\": \"Common Storage Account Endpoint Suffix\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"storage-endpoint-suffix\",\n+                                \"name\": \"attribute-name-regex\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"storage-queue-name\": {\n-                                \"description\": \"Name of the Azure Storage Queue\",\n-                                \"displayName\": \"Queue Name\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"storage-queue-name\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"storage-sas-token\": {\n-                                \"description\": \"Shared Access Signature token, including the leading '?'. Specify either SAS token (recommended) or Account Key. There are certain risks in allowing the SAS token to be stored as a flowfile attribute. While it does provide for a more flexible flow by allowing the SAS token to be fetched dynamically from a flowfile attribute, care must be taken to restrict access to the event provenance data (e.g., by strictly controlling the policies governing provenance for this processor). In addition, the provenance repositories may be put on encrypted disk partitions.\",\n-                                \"displayName\": \"SAS Token\",\n+                            \"aws.profile.name\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"AWS_MSK_IAM\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"SASL Mechanism\",\n+                                        \"propertyName\": \"sasl.mechanism\"\n+                                    }\n+                                ],\n+                                \"description\": \"The Amazon Web Services Profile to select when multiple profiles are available.\",\n+                                \"displayName\": \"AWS Profile Name\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"storage-sas-token\",\n+                                \"name\": \"aws.profile.name\",\n                                 \"required\": false,\n-                                \"sensitive\": true\n+                                \"sensitive\": false\n                             },\n-                            \"visibility-timeout\": {\n-                                \"defaultValue\": \"30 secs\",\n-                                \"description\": \"The duration during which the retrieved message should be invisible to other consumers.\",\n-                                \"displayName\": \"Visibility Timeout\",\n+                            \"bootstrap.servers\": {\n+                                \"defaultValue\": \"localhost:9092\",\n+                                \"description\": \"Comma-separated list of Kafka Brokers in the format host:port\",\n+                                \"displayName\": \"Kafka Brokers\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"visibility-timeout\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"bootstrap.servers\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n-                            }\n-                        },\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.processors.azure.storage.queue.PutAzureQueueStorage\"\n-                        ],\n-                        \"sideEffectFree\": false,\n-                        \"supportedRelationships\": [\n-                            {\n-                                \"description\": \"All successfully processed FlowFiles are routed to this relationship\",\n-                                \"name\": \"success\"\n-                            }\n-                        ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": false,\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": false,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"azure\",\n-                            \"cloud\",\n-                            \"dequeue\",\n-                            \"microsoft\",\n-                            \"queue\",\n-                            \"storage\"\n-                        ],\n-                        \"triggerSerially\": false,\n-                        \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.azure.storage.queue.GetAzureQueueStorage\",\n-                        \"typeDescription\": \"Retrieves the messages from an Azure Queue Storage. The retrieved messages will be deleted from the queue by default. If the requirement is to consume messages without deleting them, set 'Auto Delete Messages' to 'false'. Note: There might be chances of receiving duplicates in situations like when a message is received but was unable to be deleted from the queue due to some unexpected situations.\",\n-                        \"version\": \"1.27.0\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"The absolute URI of the configured Azure Queue Storage\",\n-                                \"name\": \"azure.queue.uri\"\n-                            },\n-                            {\n-                                \"description\": \"The time when the message was inserted into the queue storage\",\n-                                \"name\": \"azure.queue.insertionTime\"\n-                            },\n-                            {\n-                                \"description\": \"The time when the message will expire from the queue storage\",\n-                                \"name\": \"azure.queue.expirationTime\"\n-                            },\n-                            {\n-                                \"description\": \"The ID of the retrieved message\",\n-                                \"name\": \"azure.queue.messageId\"\n                             },\n-                            {\n-                                \"description\": \"The pop receipt of the retrieved message\",\n-                                \"name\": \"azure.queue.popReceipt\"\n-                            }\n-                        ]\n-                    },\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-azure-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"e0c4461\"\n-                        },\n-                        \"defaultBulletinLevel\": \"WARN\",\n-                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": 1,\n-                            \"TIMER_DRIVEN\": 1\n-                        },\n-                        \"defaultPenaltyDuration\": \"30 sec\",\n-                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"0 sec\"\n-                        },\n-                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n-                        \"defaultYieldDuration\": \"1 sec\",\n-                        \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n-                        \"primaryNodeOnly\": false,\n-                        \"propertyDescriptors\": {\n-                            \"Auto Delete Messages\": {\n+                            \"compression.type\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"displayName\": \"none\",\n+                                        \"value\": \"none\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"displayName\": \"gzip\",\n+                                        \"value\": \"gzip\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"snappy\",\n+                                        \"value\": \"snappy\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"lz4\",\n+                                        \"value\": \"lz4\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"true\",\n-                                \"description\": \"Specifies whether the received message is to be automatically deleted from the queue.\",\n-                                \"displayName\": \"Auto Delete Messages\",\n+                                \"defaultValue\": \"none\",\n+                                \"description\": \"This parameter allows you to specify the compression codec for all data generated by this producer.\",\n+                                \"displayName\": \"Compression Type\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Auto Delete Messages\",\n+                                \"name\": \"compression.type\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Credentials Service\": {\n-                                \"description\": \"Controller Service used to obtain Azure Storage Credentials.\",\n-                                \"displayName\": \"Credentials Service\",\n+                            \"kerberos-credentials-service\": {\n+                                \"description\": \"Service supporting generalized credentials authentication with Kerberos\",\n+                                \"displayName\": \"Kerberos Credentials Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Credentials Service\",\n-                                \"required\": true,\n+                                \"name\": \"kerberos-credentials-service\",\n+                                \"required\": false,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-azure-services-api-nar\",\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.services.azure.storage.AzureStorageCredentialsService_v12\",\n+                                    \"type\": \"org.apache.nifi.kerberos.KerberosCredentialsService\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             },\n-                            \"Message Batch Size\": {\n-                                \"defaultValue\": \"32\",\n-                                \"description\": \"The number of messages to be retrieved from the queue.\",\n-                                \"displayName\": \"Message Batch Size\",\n+                            \"max.block.ms\": {\n+                                \"defaultValue\": \"5 sec\",\n+                                \"description\": \"The amount of time publisher will wait to obtain metadata or wait for the buffer to flush during the 'send' call before failing the entire 'send' call. Corresponds to Kafka's 'max.block.ms' property\",\n+                                \"displayName\": \"Max Metadata Wait Time\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"max.block.ms\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"max.request.size\": {\n+                                \"defaultValue\": \"1 MB\",\n+                                \"description\": \"The maximum size of a request in bytes. Corresponds to Kafka's 'max.request.size' property and defaults to 1 MB (1048576).\",\n+                                \"displayName\": \"Max Request Size\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Message Batch Size\",\n+                                \"name\": \"max.request.size\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Queue Name\": {\n-                                \"description\": \"Name of the Azure Storage Queue\",\n-                                \"displayName\": \"Queue Name\",\n+                            \"message-header-encoding\": {\n+                                \"defaultValue\": \"UTF-8\",\n+                                \"description\": \"For any attribute that is added as a message header, as configured via the <Attributes to Send as Headers> property, this property indicates the Character Encoding to use for serializing the headers.\",\n+                                \"displayName\": \"Message Header Encoding\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"message-header-encoding\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"message-key-field\": {\n+                                \"description\": \"The name of a field in the Input Records that should be used as the Key for the Kafka message.\",\n+                                \"displayName\": \"Message Key Field\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Queue Name\",\n-                                \"required\": true,\n+                                \"name\": \"message-key-field\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Request Timeout\": {\n-                                \"defaultValue\": \"10 secs\",\n-                                \"description\": \"The timeout for read or write requests to Azure Queue Storage. Defaults to 1 second.\",\n-                                \"displayName\": \"Request Timeout\",\n+                            \"partition\": {\n+                                \"description\": \"Specifies which Partition Records will go to. How this value is interpreted is dictated by the <Partitioner class> property.\",\n+                                \"displayName\": \"Partition\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Request Timeout\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"partition\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Visibility Timeout\": {\n-                                \"defaultValue\": \"30 secs\",\n-                                \"description\": \"The duration during which the retrieved message should be invisible to other consumers.\",\n-                                \"displayName\": \"Visibility Timeout\",\n+                            \"partitioner.class\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"Messages will be assigned partitions in a round-robin fashion, sending the first message to Partition 1, the next Partition to Partition 2, and so on, wrapping as necessary.\",\n+                                        \"displayName\": \"RoundRobinPartitioner\",\n+                                        \"value\": \"org.apache.nifi.processors.kafka.pubsub.Partitioners$RoundRobinPartitioner\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Messages will be assigned to random partitions.\",\n+                                        \"displayName\": \"DefaultPartitioner\",\n+                                        \"value\": \"org.apache.kafka.clients.producer.internals.DefaultPartitioner\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Interprets the <Partition> property as a RecordPath that will be evaluated against each Record to determine which partition the Record will go to. All Records that have the same value for the given RecordPath will go to the same Partition.\",\n+                                        \"displayName\": \"RecordPath Partitioner\",\n+                                        \"value\": \"org.apache.nifi.processors.kafka.pubsub.Partitioners$RecordPathPartitioner\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Interprets the <Partition> property as Expression Language that will be evaluated against each FlowFile. This Expression will be evaluated once against the FlowFile, so all Records in a given FlowFile will go to the same partition.\",\n+                                        \"displayName\": \"Expression Language Partitioner\",\n+                                        \"value\": \"org.apache.nifi.processors.kafka.pubsub.Partitioners$ExpressionLanguagePartitioner\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"org.apache.kafka.clients.producer.internals.DefaultPartitioner\",\n+                                \"description\": \"Specifies which class to use to compute a partition id for a message. Corresponds to Kafka's 'partitioner.class' property.\",\n+                                \"displayName\": \"Partitioner class\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Visibility Timeout\",\n-                                \"required\": true,\n+                                \"name\": \"partitioner.class\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"proxy-configuration-service\": {\n-                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests. Supported proxies: SOCKS, HTTP In case of SOCKS, it is not guaranteed that the selected SOCKS Version will be used by the processor.\",\n-                                \"displayName\": \"Proxy Configuration Service\",\n+                            \"record-reader\": {\n+                                \"description\": \"The Record Reader to use for incoming FlowFiles\",\n+                                \"displayName\": \"Record Reader\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"proxy-configuration-service\",\n-                                \"required\": false,\n+                                \"name\": \"record-reader\",\n+                                \"required\": true,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n                                     \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.proxy.ProxyConfigurationService\",\n+                                    \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             },\n-                            \"storage-endpoint-suffix\": {\n-                                \"defaultValue\": \"queue.core.windows.net\",\n-                                \"description\": \"Storage accounts in public Azure always use a common FQDN suffix. Override this endpoint suffix with a different suffix in certain circumstances (like Azure Stack or non-public Azure regions).\",\n-                                \"displayName\": \"Endpoint Suffix\",\n+                            \"record-writer\": {\n+                                \"description\": \"The Record Writer to use in order to serialize the data before sending to Kafka\",\n+                                \"displayName\": \"Record Writer\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"storage-endpoint-suffix\",\n+                                \"name\": \"record-writer\",\n                                 \"required\": true,\n-                                \"sensitive\": false\n-                            }\n-                        },\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.processors.azure.storage.queue.PutAzureQueueStorage\"\n-                        ],\n-                        \"sideEffectFree\": false,\n-                        \"supportedRelationships\": [\n-                            {\n-                                \"description\": \"All successfully processed FlowFiles are routed to this relationship\",\n-                                \"name\": \"success\"\n-                            }\n-                        ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": false,\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": false,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"azure\",\n-                            \"cloud\",\n-                            \"dequeue\",\n-                            \"microsoft\",\n-                            \"queue\",\n-                            \"storage\"\n-                        ],\n-                        \"triggerSerially\": false,\n-                        \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.azure.storage.queue.GetAzureQueueStorage_v12\",\n-                        \"typeDescription\": \"Retrieves the messages from an Azure Queue Storage. The retrieved messages will be deleted from the queue by default. If the requirement is to consume messages without deleting them, set 'Auto Delete Messages' to 'false'. Note: There might be chances of receiving duplicates in situations like when a message is received but was unable to be deleted from the queue due to some unexpected situations.\",\n-                        \"version\": \"1.27.0\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"The absolute URI of the configured Azure Queue Storage\",\n-                                \"name\": \"azure.queue.uri\"\n-                            },\n-                            {\n-                                \"description\": \"The time when the message was inserted into the queue storage\",\n-                                \"name\": \"azure.queue.insertionTime\"\n-                            },\n-                            {\n-                                \"description\": \"The time when the message will expire from the queue storage\",\n-                                \"name\": \"azure.queue.expirationTime\"\n-                            },\n-                            {\n-                                \"description\": \"The ID of the retrieved message\",\n-                                \"name\": \"azure.queue.messageId\"\n-                            },\n-                            {\n-                                \"description\": \"The pop receipt of the retrieved message\",\n-                                \"name\": \"azure.queue.popReceipt\"\n-                            }\n-                        ]\n-                    },\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-azure-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"e0c4461\"\n-                        },\n-                        \"defaultBulletinLevel\": \"WARN\",\n-                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": 1,\n-                            \"TIMER_DRIVEN\": 1\n-                        },\n-                        \"defaultPenaltyDuration\": \"30 sec\",\n-                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"0 sec\"\n-                        },\n-                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n-                        \"defaultYieldDuration\": \"1 sec\",\n-                        \"deprecated\": true,\n-                        \"deprecationAlternatives\": [\n-                            \"org.apache.nifi.processors.azure.storage.queue.PutAzureQueueStorage_v12\"\n-                        ],\n-                        \"deprecationReason\": \"\",\n-                        \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_REQUIRED\",\n-                        \"primaryNodeOnly\": false,\n-                        \"propertyDescriptors\": {\n-                            \"proxy-configuration-service\": {\n-                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests. Supported proxies: SOCKS, HTTP In case of SOCKS, it is not guaranteed that the selected SOCKS Version will be used by the processor.\",\n-                                \"displayName\": \"Proxy Configuration Service\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"proxy-configuration-service\",\n-                                \"required\": false,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n                                     \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.proxy.ProxyConfigurationService\",\n+                                    \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             },\n-                            \"storage-account-key\": {\n-                                \"description\": \"The storage account key. This is an admin-like password providing access to every container in this account. It is recommended one uses Shared Access Signature (SAS) token instead for fine-grained control with policies. There are certain risks in allowing the account key to be stored as a flowfile attribute. While it does provide for a more flexible flow by allowing the account key to be fetched dynamically from a flowfile attribute, care must be taken to restrict access to the event provenance data (e.g., by strictly controlling the policies governing provenance for this processor). In addition, the provenance repositories may be put on encrypted disk partitions.\",\n-                                \"displayName\": \"Storage Account Key\",\n+                            \"sasl.kerberos.keytab\": {\n+                                \"description\": \"Keytab credentials used for authentication with Kerberos\",\n+                                \"displayName\": \"Kerberos Keytab\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"storage-account-key\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"sasl.kerberos.keytab\",\n                                 \"required\": false,\n-                                \"sensitive\": true\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"SINGLE\",\n+                                    \"resourceTypes\": [\n+                                        \"FILE\"\n+                                    ]\n+                                },\n+                                \"sensitive\": false\n                             },\n-                            \"storage-account-name\": {\n-                                \"description\": \"The storage account name. There are certain risks in allowing the account name to be stored as a flowfile attribute. While it does provide for a more flexible flow by allowing the account name to be fetched dynamically from a flowfile attribute, care must be taken to restrict access to the event provenance data (e.g., by strictly controlling the policies governing provenance for this processor). In addition, the provenance repositories may be put on encrypted disk partitions. Instead of defining the Storage Account Name, Storage Account Key and SAS Token properties directly on the processor, the preferred way is to configure them through a controller service specified in the Storage Credentials property. The controller service can provide a common/shared configuration for multiple/all Azure processors. Furthermore, the credentials can also be looked up dynamically with the 'Lookup' version of the service.\",\n-                                \"displayName\": \"Storage Account Name\",\n+                            \"sasl.kerberos.principal\": {\n+                                \"description\": \"Principal used for authentication with Kerberos\",\n+                                \"displayName\": \"Kerberos Principal\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"storage-account-name\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"sasl.kerberos.principal\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"sasl.kerberos.service.name\": {\n+                                \"description\": \"The service name that matches the primary name of the Kafka server configured in the broker JAAS configuration\",\n+                                \"displayName\": \"Kerberos Service Name\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"sasl.kerberos.service.name\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"sasl.mechanism\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"General Security Services API for Kerberos authentication\",\n+                                        \"displayName\": \"GSSAPI\",\n+                                        \"value\": \"GSSAPI\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Plain username and password authentication\",\n+                                        \"displayName\": \"PLAIN\",\n+                                        \"value\": \"PLAIN\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Salted Challenge Response Authentication Mechanism using SHA-512 with username and password\",\n+                                        \"displayName\": \"SCRAM-SHA-256\",\n+                                        \"value\": \"SCRAM-SHA-256\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Salted Challenge Response Authentication Mechanism using SHA-256 with username and password\",\n+                                        \"displayName\": \"SCRAM-SHA-512\",\n+                                        \"value\": \"SCRAM-SHA-512\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"GSSAPI\",\n+                                \"description\": \"SASL mechanism used for authentication. Corresponds to Kafka Client sasl.mechanism property\",\n+                                \"displayName\": \"SASL Mechanism\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"sasl.mechanism\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"sasl.password\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"PLAIN\",\n+                                            \"SCRAM-SHA-512\",\n+                                            \"SCRAM-SHA-256\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"SASL Mechanism\",\n+                                        \"propertyName\": \"sasl.mechanism\"\n+                                    }\n+                                ],\n+                                \"description\": \"Password provided with configured username when using PLAIN or SCRAM SASL Mechanisms\",\n+                                \"displayName\": \"Password\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"sasl.password\",\n                                 \"required\": false,\n                                 \"sensitive\": true\n                             },\n-                            \"storage-credentials-service\": {\n-                                \"description\": \"The Controller Service used to obtain Azure Storage Credentials. Instead of the processor level properties, the credentials can be configured here through a common/shared controller service, which is the preferred way. The 'Lookup' version of the service can also be used to select the credentials dynamically at runtime based on a FlowFile attribute (if the processor has FlowFile input).\",\n-                                \"displayName\": \"Storage Credentials\",\n+                            \"sasl.token.auth\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"false\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"SCRAM-SHA-512\",\n+                                            \"SCRAM-SHA-256\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"SASL Mechanism\",\n+                                        \"propertyName\": \"sasl.mechanism\"\n+                                    }\n+                                ],\n+                                \"description\": \"Enables or disables Token authentication when using SCRAM SASL Mechanisms\",\n+                                \"displayName\": \"Token Authentication\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"storage-credentials-service\",\n+                                \"name\": \"sasl.token.auth\",\n                                 \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-azure-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.services.azure.storage.AzureStorageCredentialsService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n+                                \"sensitive\": false\n                             },\n-                            \"storage-endpoint-suffix\": {\n-                                \"description\": \"Storage accounts in public Azure always use a common FQDN suffix. Override this endpoint suffix with a different suffix in certain circumstances (like Azure Stack or non-public Azure regions). The preferred way is to configure them through a controller service specified in the Storage Credentials property. The controller service can provide a common/shared configuration for multiple/all Azure processors. Furthermore, the credentials can also be looked up dynamically with the 'Lookup' version of the service.\",\n-                                \"displayName\": \"Common Storage Account Endpoint Suffix\",\n+                            \"sasl.username\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"PLAIN\",\n+                                            \"SCRAM-SHA-512\",\n+                                            \"SCRAM-SHA-256\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"SASL Mechanism\",\n+                                        \"propertyName\": \"sasl.mechanism\"\n+                                    }\n+                                ],\n+                                \"description\": \"Username provided with configured password when using PLAIN or SCRAM SASL Mechanisms\",\n+                                \"displayName\": \"Username\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"storage-endpoint-suffix\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"sasl.username\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"storage-queue-name\": {\n-                                \"description\": \"Name of the Azure Storage Queue\",\n-                                \"displayName\": \"Queue Name\",\n+                            \"security.protocol\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"PLAINTEXT\",\n+                                        \"value\": \"PLAINTEXT\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"SSL\",\n+                                        \"value\": \"SSL\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"SASL_PLAINTEXT\",\n+                                        \"value\": \"SASL_PLAINTEXT\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"SASL_SSL\",\n+                                        \"value\": \"SASL_SSL\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"PLAINTEXT\",\n+                                \"description\": \"Security protocol used to communicate with brokers. Corresponds to Kafka Client security.protocol property\",\n+                                \"displayName\": \"Security Protocol\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"storage-queue-name\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"security.protocol\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"storage-sas-token\": {\n-                                \"description\": \"Shared Access Signature token, including the leading '?'. Specify either SAS token (recommended) or Account Key. There are certain risks in allowing the SAS token to be stored as a flowfile attribute. While it does provide for a more flexible flow by allowing the SAS token to be fetched dynamically from a flowfile attribute, care must be taken to restrict access to the event provenance data (e.g., by strictly controlling the policies governing provenance for this processor). In addition, the provenance repositories may be put on encrypted disk partitions.\",\n-                                \"displayName\": \"SAS Token\",\n+                            \"ssl.context.service\": {\n+                                \"description\": \"Service supporting SSL communication with Kafka brokers\",\n+                                \"displayName\": \"SSL Context Service\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"ssl.context.service\",\n+                                \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"topic\": {\n+                                \"description\": \"The name of the Kafka Topic to publish to.\",\n+                                \"displayName\": \"Topic Name\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"storage-sas-token\",\n-                                \"required\": false,\n-                                \"sensitive\": true\n+                                \"name\": \"topic\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n                             },\n-                            \"time-to-live\": {\n-                                \"defaultValue\": \"7 days\",\n-                                \"description\": \"Maximum time to allow the message to be in the queue. If left empty, the default value of 7 days will be used.\",\n-                                \"displayName\": \"TTL\",\n+                            \"transactional-id-prefix\": {\n+                                \"description\": \"When Use Transaction is set to true, KafkaProducer config 'transactional.id' will be a generated UUID and will be prefixed with this string.\",\n+                                \"displayName\": \"Transactional Id Prefix\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"time-to-live\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"transactional-id-prefix\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"visibility-delay\": {\n-                                \"defaultValue\": \"0 secs\",\n-                                \"description\": \"The length of time during which the message will be invisible, starting when it is added to the queue. This value must be greater than or equal to 0 and less than the TTL value.\",\n-                                \"displayName\": \"Visibility Delay\",\n+                            \"use-transactions\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"true\",\n+                                \"description\": \"Specifies whether or not NiFi should provide Transactional guarantees when communicating with Kafka. If there is a problem sending data to Kafka, and this property is set to false, then the messages that have already been sent to Kafka will continue on and be delivered to consumers. If this is set to true, then the Kafka transaction will be rolled back so that those messages are not available to consumers. Setting this to true requires that the <Delivery Guarantee> property be set to \\\"Guarantee Replicated Delivery.\\\"\",\n+                                \"displayName\": \"Use Transactions\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"visibility-delay\",\n-                                \"required\": false,\n+                                \"name\": \"use-transactions\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             }\n                         },\n                         \"seeAlso\": [\n-                            \"org.apache.nifi.processors.azure.storage.queue.GetAzureQueueStorage\"\n+                            \"org.apache.nifi.processors.kafka.pubsub.ConsumeKafkaRecord_2_0\",\n+                            \"org.apache.nifi.processors.kafka.pubsub.ConsumeKafka_2_0\",\n+                            \"org.apache.nifi.processors.kafka.pubsub.PublishKafka_2_0\"\n                         ],\n                         \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"All successfully processed FlowFiles are routed to this relationship\",\n+                                \"description\": \"FlowFiles for which all content was sent to Kafka.\",\n                                 \"name\": \"success\"\n                             },\n                             {\n-                                \"description\": \"Unsuccessful operations will be transferred to the failure relationship.\",\n+                                \"description\": \"Any FlowFile that cannot be sent to Kafka will be routed to this Relationship\",\n                                 \"name\": \"failure\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n                         \"supportsBatching\": false,\n-                        \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicProperties\": true,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"azure\",\n-                            \"cloud\",\n-                            \"enqueue\",\n-                            \"microsoft\",\n-                            \"queue\",\n-                            \"storage\"\n+                            \"2.0\",\n+                            \"Apache\",\n+                            \"Kafka\",\n+                            \"Message\",\n+                            \"PubSub\",\n+                            \"Put\",\n+                            \"Record\",\n+                            \"Send\",\n+                            \"avro\",\n+                            \"csv\",\n+                            \"json\",\n+                            \"logs\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.azure.storage.queue.PutAzureQueueStorage\",\n-                        \"typeDescription\": \"Writes the content of the incoming FlowFiles to the configured Azure Queue Storage.\",\n-                        \"version\": \"1.27.0\"\n+                        \"type\": \"org.apache.nifi.processors.kafka.pubsub.PublishKafkaRecord_2_0\",\n+                        \"typeDescription\": \"Sends the contents of a FlowFile as individual records to Apache Kafka using the Kafka 2.0 Producer API. The contents of the FlowFile are expected to be record-oriented data that can be read by the configured Record Reader. The complementary NiFi processor for fetching messages is ConsumeKafkaRecord_2_0.\",\n+                        \"version\": \"1.27.0\",\n+                        \"writesAttributes\": [\n+                            {\n+                                \"description\": \"The number of messages that were sent to Kafka for this FlowFile. This attribute is added only to FlowFiles that are routed to success.\",\n+                                \"name\": \"msg.count\"\n+                            }\n+                        ]\n                     },\n                     {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-azure-nar\",\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-kafka-2-0-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -17597,815 +17901,1228 @@\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n+                        \"deprecated\": true,\n+                        \"deprecationAlternatives\": [\n+                            \"org.apache.nifi.processors.kafka.pubsub.PublishKafka_2_6\"\n+                        ],\n+                        \"deprecationReason\": \"\",\n+                        \"dynamicProperties\": [\n+                            {\n+                                \"description\": \"These properties will be added on the Kafka configuration after loading any provided configuration properties. In the event a dynamic property represents a property that was already set, its value will be ignored and WARN message logged. For the list of available Kafka properties please refer to: http://kafka.apache.org/documentation.html#configuration. \",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"name\": \"The name of a Kafka configuration property.\",\n+                                \"value\": \"The value of a given Kafka configuration property.\"\n+                            }\n+                        ],\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Credentials Service\": {\n-                                \"description\": \"Controller Service used to obtain Azure Storage Credentials.\",\n-                                \"displayName\": \"Credentials Service\",\n+                            \"Failure Strategy\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"When unable to publish records to Kafka, the FlowFile will be routed to the failure relationship.\",\n+                                        \"displayName\": \"Route to Failure\",\n+                                        \"value\": \"Route to Failure\"\n+                                    },\n+                                    {\n+                                        \"description\": \"When unable to publish records to Kafka, the FlowFile will be placed back on the queue so that it will be retried. For flows where FlowFile ordering is important, this strategy can be used along with ensuring that the each processor uses only a single Concurrent Task.\",\n+                                        \"displayName\": \"Rollback\",\n+                                        \"value\": \"Rollback\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"Route to Failure\",\n+                                \"description\": \"Specifies how the processor handles a FlowFile if it is unable to publish the data to Kafka\",\n+                                \"displayName\": \"Failure Strategy\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Credentials Service\",\n+                                \"name\": \"Failure Strategy\",\n                                 \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-azure-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.services.azure.storage.AzureStorageCredentialsService_v12\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n+                                \"sensitive\": false\n                             },\n-                            \"Message Time To Live\": {\n-                                \"defaultValue\": \"7 days\",\n-                                \"description\": \"Maximum time to allow the message to be in the queue\",\n-                                \"displayName\": \"Message Time To Live\",\n+                            \"ack.wait.time\": {\n+                                \"defaultValue\": \"5 secs\",\n+                                \"description\": \"After sending a message to Kafka, this indicates the amount of time that we are willing to wait for a response from Kafka. If Kafka does not acknowledge the message within this time period, the FlowFile will be routed to 'failure'.\",\n+                                \"displayName\": \"Acknowledgment Wait Time\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Message Time To Live\",\n+                                \"name\": \"ack.wait.time\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Queue Name\": {\n-                                \"description\": \"Name of the Azure Storage Queue\",\n-                                \"displayName\": \"Queue Name\",\n+                            \"acks\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"FlowFile will be routed to success after successfully sending the content to a Kafka node, without waiting for any acknowledgment from the node at all. This provides the best performance but may result in data loss.\",\n+                                        \"displayName\": \"Best Effort\",\n+                                        \"value\": \"0\"\n+                                    },\n+                                    {\n+                                        \"description\": \"FlowFile will be routed to success if the message is received by a single Kafka node, whether or not it is replicated. This is faster than <Guarantee Replicated Delivery> but can result in data loss if a Kafka node crashes\",\n+                                        \"displayName\": \"Guarantee Single Node Delivery\",\n+                                        \"value\": \"1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"FlowFile will be routed to failure unless the message is replicated to the appropriate number of Kafka Nodes according to the Topic configuration\",\n+                                        \"displayName\": \"Guarantee Replicated Delivery\",\n+                                        \"value\": \"all\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"all\",\n+                                \"description\": \"Specifies the requirement for guaranteeing that a message is sent to Kafka. Corresponds to Kafka's 'acks' property.\",\n+                                \"displayName\": \"Delivery Guarantee\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Queue Name\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"acks\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Request Timeout\": {\n-                                \"defaultValue\": \"10 secs\",\n-                                \"description\": \"The timeout for read or write requests to Azure Queue Storage. Defaults to 1 second.\",\n-                                \"displayName\": \"Request Timeout\",\n+                            \"attribute-name-regex\": {\n+                                \"description\": \"A Regular Expression that is matched against all FlowFile attribute names. Any attribute whose name matches the regex will be added to the Kafka messages as a Header. If not specified, no FlowFile attributes will be added as headers.\",\n+                                \"displayName\": \"Attributes to Send as Headers (Regex)\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Request Timeout\",\n+                                \"name\": \"attribute-name-regex\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"aws.profile.name\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"AWS_MSK_IAM\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"SASL Mechanism\",\n+                                        \"propertyName\": \"sasl.mechanism\"\n+                                    }\n+                                ],\n+                                \"description\": \"The Amazon Web Services Profile to select when multiple profiles are available.\",\n+                                \"displayName\": \"AWS Profile Name\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"aws.profile.name\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"bootstrap.servers\": {\n+                                \"defaultValue\": \"localhost:9092\",\n+                                \"description\": \"Comma-separated list of Kafka Brokers in the format host:port\",\n+                                \"displayName\": \"Kafka Brokers\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"bootstrap.servers\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Visibility Timeout\": {\n-                                \"defaultValue\": \"30 secs\",\n-                                \"description\": \"The length of time during which the message will be invisible after it is read. If the processing unit fails to delete the message after it is read, then the message will reappear in the queue.\",\n-                                \"displayName\": \"Visibility Timeout\",\n+                            \"compression.type\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"none\",\n+                                        \"value\": \"none\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"gzip\",\n+                                        \"value\": \"gzip\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"snappy\",\n+                                        \"value\": \"snappy\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"lz4\",\n+                                        \"value\": \"lz4\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"none\",\n+                                \"description\": \"This parameter allows you to specify the compression codec for all data generated by this producer.\",\n+                                \"displayName\": \"Compression Type\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Visibility Timeout\",\n+                                \"name\": \"compression.type\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"proxy-configuration-service\": {\n-                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests. Supported proxies: SOCKS, HTTP In case of SOCKS, it is not guaranteed that the selected SOCKS Version will be used by the processor.\",\n-                                \"displayName\": \"Proxy Configuration Service\",\n+                            \"kafka-key\": {\n+                                \"description\": \"The Key to use for the Message. If not specified, the flow file attribute 'kafka.key' is used as the message key, if it is present.Beware that setting Kafka key and demarcating at the same time may potentially lead to many Kafka messages with the same key.Normally this is not a problem as Kafka does not enforce or assume message and key uniqueness. Still, setting the demarcator and Kafka key at the same time poses a risk of data loss on Kafka. During a topic compaction on Kafka, messages will be deduplicated based on this key.\",\n+                                \"displayName\": \"Kafka Key\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"kafka-key\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"kerberos-credentials-service\": {\n+                                \"description\": \"Service supporting generalized credentials authentication with Kerberos\",\n+                                \"displayName\": \"Kerberos Credentials Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"proxy-configuration-service\",\n+                                \"name\": \"kerberos-credentials-service\",\n                                 \"required\": false,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n                                     \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.proxy.ProxyConfigurationService\",\n+                                    \"type\": \"org.apache.nifi.kerberos.KerberosCredentialsService\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             },\n-                            \"storage-endpoint-suffix\": {\n-                                \"defaultValue\": \"queue.core.windows.net\",\n-                                \"description\": \"Storage accounts in public Azure always use a common FQDN suffix. Override this endpoint suffix with a different suffix in certain circumstances (like Azure Stack or non-public Azure regions).\",\n-                                \"displayName\": \"Endpoint Suffix\",\n+                            \"key-attribute-encoding\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"The key is interpreted as a UTF-8 Encoded string.\",\n+                                        \"displayName\": \"UTF-8 Encoded\",\n+                                        \"value\": \"utf-8\"\n+                                    },\n+                                    {\n+                                        \"description\": \"The key is interpreted as arbitrary binary data and is encoded using hexadecimal characters with uppercase letters\",\n+                                        \"displayName\": \"Hex Encoded\",\n+                                        \"value\": \"hex\"\n+                                    },\n+                                    {\n+                                        \"description\": \"The key will not be added as an Attribute\",\n+                                        \"displayName\": \"Do Not Add Key as Attribute\",\n+                                        \"value\": \"do-not-add\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"utf-8\",\n+                                \"description\": \"FlowFiles that are emitted have an attribute named 'kafka.key'. This property dictates how the value of the attribute should be encoded.\",\n+                                \"displayName\": \"Key Attribute Encoding\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"storage-endpoint-suffix\",\n+                                \"name\": \"key-attribute-encoding\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n-                            }\n-                        },\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.processors.azure.storage.queue.GetAzureQueueStorage_v12\"\n-                        ],\n-                        \"sideEffectFree\": false,\n-                        \"supportedRelationships\": [\n-                            {\n-                                \"description\": \"All successfully processed FlowFiles are routed to this relationship\",\n-                                \"name\": \"success\"\n                             },\n-                            {\n-                                \"description\": \"Unsuccessful operations will be transferred to the failure relationship.\",\n-                                \"name\": \"failure\"\n-                            }\n-                        ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": false,\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": false,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"azure\",\n-                            \"cloud\",\n-                            \"enqueue\",\n-                            \"microsoft\",\n-                            \"queue\",\n-                            \"storage\"\n-                        ],\n-                        \"triggerSerially\": false,\n-                        \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.azure.storage.queue.PutAzureQueueStorage_v12\",\n-                        \"typeDescription\": \"Writes the content of the incoming FlowFiles to the configured Azure Queue Storage.\",\n-                        \"version\": \"1.27.0\"\n-                    }\n-                ],\n-                \"reportingTasks\": [\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-azure-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"e0c4461\"\n-                        },\n-                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"0 sec\"\n-                        },\n-                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n-                        \"group\": \"org.apache.nifi\",\n-                        \"propertyDescriptors\": {\n-                            \"Application ID\": {\n-                                \"defaultValue\": \"nifi\",\n-                                \"description\": \"The Application ID to be included in the metrics sent to Azure Log Analytics WS\",\n-                                \"displayName\": \"Application ID\",\n+                            \"max.block.ms\": {\n+                                \"defaultValue\": \"5 sec\",\n+                                \"description\": \"The amount of time publisher will wait to obtain metadata or wait for the buffer to flush during the 'send' call before failing the entire 'send' call. Corresponds to Kafka's 'max.block.ms' property\",\n+                                \"displayName\": \"Max Metadata Wait Time\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Application ID\",\n+                                \"name\": \"max.block.ms\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Batch Size\": {\n-                                \"defaultValue\": \"1000\",\n-                                \"description\": \"Specifies how many records to send in a single batch, at most.\",\n-                                \"displayName\": \"Batch Size\",\n+                            \"max.request.size\": {\n+                                \"defaultValue\": \"1 MB\",\n+                                \"description\": \"The maximum size of a request in bytes. Corresponds to Kafka's 'max.request.size' property and defaults to 1 MB (1048576).\",\n+                                \"displayName\": \"Max Request Size\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Batch Size\",\n+                                \"name\": \"max.request.size\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Instance ID\": {\n-                                \"defaultValue\": \"${hostname(true)}\",\n-                                \"description\": \"Id of this NiFi instance to be included in the metrics sent to Azure Log Analytics WS\",\n-                                \"displayName\": \"Instance ID\",\n+                            \"message-demarcator\": {\n+                                \"description\": \"Specifies the string (interpreted as UTF-8) to use for demarcating multiple messages within a single FlowFile. If not specified, the entire content of the FlowFile will be used as a single message. If specified, the contents of the FlowFile will be split on this delimiter and each section sent as a separate Kafka message. To enter special character such as 'new line' use CTRL+Enter or Shift+Enter, depending on your OS.\",\n+                                \"displayName\": \"Message Demarcator\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Instance ID\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"message-demarcator\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Instance URL\": {\n-                                \"defaultValue\": \"http://${hostname(true)}:8080/nifi\",\n-                                \"description\": \"The URL of this instance to use in the Content URI of each event.\",\n-                                \"displayName\": \"Instance URL\",\n+                            \"message-header-encoding\": {\n+                                \"defaultValue\": \"UTF-8\",\n+                                \"description\": \"For any attribute that is added as a message header, as configured via the <Attributes to Send as Headers> property, this property indicates the Character Encoding to use for serializing the headers.\",\n+                                \"displayName\": \"Message Header Encoding\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Instance URL\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"message-header-encoding\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Job Name\": {\n-                                \"defaultValue\": \"nifi_reporting_job\",\n-                                \"description\": \"The name of the exporting job\",\n-                                \"displayName\": \"Job Name\",\n+                            \"partition\": {\n+                                \"description\": \"Specifies which Partition Records will go to.\",\n+                                \"displayName\": \"Partition\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Job Name\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"partition\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Log Analytics Custom Log Name\": {\n-                                \"defaultValue\": \"nifiprovenance\",\n-                                \"description\": \"Log Analytics Custom Log Name\",\n-                                \"displayName\": \"Log Analytics Custom Log Name\",\n+                            \"partitioner.class\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"Messages will be assigned partitions in a round-robin fashion, sending the first message to Partition 1, the next Partition to Partition 2, and so on, wrapping as necessary.\",\n+                                        \"displayName\": \"RoundRobinPartitioner\",\n+                                        \"value\": \"org.apache.nifi.processors.kafka.pubsub.Partitioners$RoundRobinPartitioner\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Messages will be assigned to random partitions.\",\n+                                        \"displayName\": \"DefaultPartitioner\",\n+                                        \"value\": \"org.apache.kafka.clients.producer.internals.DefaultPartitioner\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Interprets the <Partition> property as Expression Language that will be evaluated against each FlowFile. This Expression will be evaluated once against the FlowFile, so all Records in a given FlowFile will go to the same partition.\",\n+                                        \"displayName\": \"Expression Language Partitioner\",\n+                                        \"value\": \"org.apache.nifi.processors.kafka.pubsub.Partitioners$ExpressionLanguagePartitioner\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"org.apache.kafka.clients.producer.internals.DefaultPartitioner\",\n+                                \"description\": \"Specifies which class to use to compute a partition id for a message. Corresponds to Kafka's 'partitioner.class' property.\",\n+                                \"displayName\": \"Partitioner class\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Log Analytics Custom Log Name\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"partitioner.class\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Log Analytics URL Endpoint Format\": {\n-                                \"defaultValue\": \"https://{0}.ods.opinsights.azure.com/api/logs?api-version=2016-04-01\",\n-                                \"description\": \"Log Analytics URL Endpoint Format\",\n-                                \"displayName\": \"Log Analytics URL Endpoint Format\",\n+                            \"sasl.kerberos.keytab\": {\n+                                \"description\": \"Keytab credentials used for authentication with Kerberos\",\n+                                \"displayName\": \"Kerberos Keytab\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Log Analytics URL Endpoint Format\",\n+                                \"name\": \"sasl.kerberos.keytab\",\n                                 \"required\": false,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"SINGLE\",\n+                                    \"resourceTypes\": [\n+                                        \"FILE\"\n+                                    ]\n+                                },\n                                 \"sensitive\": false\n                             },\n-                            \"Log Analytics Workspace Id\": {\n-                                \"description\": \"Log Analytics Workspace Id\",\n-                                \"displayName\": \"Log Analytics Workspace Id\",\n+                            \"sasl.kerberos.principal\": {\n+                                \"description\": \"Principal used for authentication with Kerberos\",\n+                                \"displayName\": \"Kerberos Principal\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Log Analytics Workspace Id\",\n-                                \"required\": true,\n-                                \"sensitive\": true\n+                                \"name\": \"sasl.kerberos.principal\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n                             },\n-                            \"Log Analytics Workspace Key\": {\n-                                \"description\": \"Azure Log Analytic Worskspace Key\",\n-                                \"displayName\": \"Log Analytics Workspace Key\",\n+                            \"sasl.kerberos.service.name\": {\n+                                \"description\": \"The service name that matches the primary name of the Kafka server configured in the broker JAAS configuration\",\n+                                \"displayName\": \"Kerberos Service Name\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Log Analytics Workspace Key\",\n+                                \"name\": \"sasl.kerberos.service.name\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"sasl.mechanism\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"General Security Services API for Kerberos authentication\",\n+                                        \"displayName\": \"GSSAPI\",\n+                                        \"value\": \"GSSAPI\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Plain username and password authentication\",\n+                                        \"displayName\": \"PLAIN\",\n+                                        \"value\": \"PLAIN\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Salted Challenge Response Authentication Mechanism using SHA-512 with username and password\",\n+                                        \"displayName\": \"SCRAM-SHA-256\",\n+                                        \"value\": \"SCRAM-SHA-256\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Salted Challenge Response Authentication Mechanism using SHA-256 with username and password\",\n+                                        \"displayName\": \"SCRAM-SHA-512\",\n+                                        \"value\": \"SCRAM-SHA-512\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"GSSAPI\",\n+                                \"description\": \"SASL mechanism used for authentication. Corresponds to Kafka Client sasl.mechanism property\",\n+                                \"displayName\": \"SASL Mechanism\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"sasl.mechanism\",\n                                 \"required\": true,\n-                                \"sensitive\": true\n+                                \"sensitive\": false\n                             },\n-                            \"Platform\": {\n-                                \"defaultValue\": \"nifi\",\n-                                \"description\": \"The value to use for the platform field in each event.\",\n-                                \"displayName\": \"Platform\",\n+                            \"sasl.password\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"PLAIN\",\n+                                            \"SCRAM-SHA-512\",\n+                                            \"SCRAM-SHA-256\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"SASL Mechanism\",\n+                                        \"propertyName\": \"sasl.mechanism\"\n+                                    }\n+                                ],\n+                                \"description\": \"Password provided with configured username when using PLAIN or SCRAM SASL Mechanisms\",\n+                                \"displayName\": \"Password\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Platform\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n+                                \"name\": \"sasl.password\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n                             },\n-                            \"include-null-values\": {\n+                            \"sasl.token.auth\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"true\",\n                                         \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"false\",\n                                         \"value\": \"false\"\n                                     }\n                                 ],\n                                 \"defaultValue\": \"false\",\n-                                \"description\": \"Indicate if null values should be included in records. Default will be false\",\n-                                \"displayName\": \"Include Null Values\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"SCRAM-SHA-512\",\n+                                            \"SCRAM-SHA-256\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"SASL Mechanism\",\n+                                        \"propertyName\": \"sasl.mechanism\"\n+                                    }\n+                                ],\n+                                \"description\": \"Enables or disables Token authentication when using SCRAM SASL Mechanisms\",\n+                                \"displayName\": \"Token Authentication\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"include-null-values\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"s2s-prov-task-event-filter\": {\n-                                \"description\": \"Comma-separated list of event types that will be used to filter the provenance events sent by the reporting task. Available event types are [CREATE, RECEIVE, FETCH, SEND, REMOTE_INVOCATION, DOWNLOAD, DROP, EXPIRE, FORK, JOIN, CLONE, CONTENT_MODIFIED, ATTRIBUTES_MODIFIED, ROUTE, ADDINFO, REPLAY, UNKNOWN]. If no filter is set, all the events are sent. If multiple filters are set, the filters are cumulative.\",\n-                                \"displayName\": \"Event Type to Include\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"s2s-prov-task-event-filter\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"s2s-prov-task-event-filter-exclude\": {\n-                                \"description\": \"Comma-separated list of event types that will be used to exclude the provenance events sent by the reporting task. Available event types are [CREATE, RECEIVE, FETCH, SEND, REMOTE_INVOCATION, DOWNLOAD, DROP, EXPIRE, FORK, JOIN, CLONE, CONTENT_MODIFIED, ATTRIBUTES_MODIFIED, ROUTE, ADDINFO, REPLAY, UNKNOWN]. If no filter is set, all the events are sent. If multiple filters are set, the filters are cumulative. If an event type is included in Event Type to Include and excluded here, then the exclusion takes precedence and the event will not be sent.\",\n-                                \"displayName\": \"Event Type to Exclude\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"s2s-prov-task-event-filter-exclude\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"s2s-prov-task-id-filter\": {\n-                                \"description\": \"Comma-separated list of component UUID that will be used to filter the provenance events sent by the reporting task. If no filter is set, all the events are sent. If multiple filters are set, the filters are cumulative.\",\n-                                \"displayName\": \"Component ID to Include\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"s2s-prov-task-id-filter\",\n+                                \"name\": \"sasl.token.auth\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"s2s-prov-task-id-filter-exclude\": {\n-                                \"description\": \"Comma-separated list of component UUID that will be used to exclude the provenance events sent by the reporting task. If no filter is set, all the events are sent. If multiple filters are set, the filters are cumulative. If a component UUID is included in Component ID to Include and excluded here, then the exclusion takes precedence and the event will not be sent.\",\n-                                \"displayName\": \"Component ID to Exclude\",\n+                            \"sasl.username\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"PLAIN\",\n+                                            \"SCRAM-SHA-512\",\n+                                            \"SCRAM-SHA-256\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"SASL Mechanism\",\n+                                        \"propertyName\": \"sasl.mechanism\"\n+                                    }\n+                                ],\n+                                \"description\": \"Username provided with configured password when using PLAIN or SCRAM SASL Mechanisms\",\n+                                \"displayName\": \"Username\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"s2s-prov-task-id-filter-exclude\",\n+                                \"name\": \"sasl.username\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"s2s-prov-task-name-filter\": {\n-                                \"description\": \"Regular expression to filter the provenance events based on the component name. Only the events matching the regular expression will be sent. If no filter is set, all the events are sent. If multiple filters are set, the filters are cumulative.\",\n-                                \"displayName\": \"Component Name to Include\",\n+                            \"security.protocol\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"PLAINTEXT\",\n+                                        \"value\": \"PLAINTEXT\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"SSL\",\n+                                        \"value\": \"SSL\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"SASL_PLAINTEXT\",\n+                                        \"value\": \"SASL_PLAINTEXT\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"SASL_SSL\",\n+                                        \"value\": \"SASL_SSL\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"PLAINTEXT\",\n+                                \"description\": \"Security protocol used to communicate with brokers. Corresponds to Kafka Client security.protocol property\",\n+                                \"displayName\": \"Security Protocol\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"s2s-prov-task-name-filter\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"security.protocol\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"s2s-prov-task-name-filter-exclude\": {\n-                                \"description\": \"Regular expression to exclude the provenance events based on the component name. The events matching the regular expression will not be sent. If no filter is set, all the events are sent. If multiple filters are set, the filters are cumulative. If a component name is included in Component Name to Include and excluded here, then the exclusion takes precedence and the event will not be sent.\",\n-                                \"displayName\": \"Component Name to Exclude\",\n+                            \"ssl.context.service\": {\n+                                \"description\": \"Service supporting SSL communication with Kafka brokers\",\n+                                \"displayName\": \"SSL Context Service\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"s2s-prov-task-name-filter-exclude\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"ssl.context.service\",\n                                 \"required\": false,\n-                                \"sensitive\": false\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n                             },\n-                            \"s2s-prov-task-type-filter\": {\n-                                \"description\": \"Regular expression to filter the provenance events based on the component type. Only the events matching the regular expression will be sent. If no filter is set, all the events are sent. If multiple filters are set, the filters are cumulative.\",\n-                                \"displayName\": \"Component Type to Include\",\n+                            \"topic\": {\n+                                \"description\": \"The name of the Kafka Topic to publish to.\",\n+                                \"displayName\": \"Topic Name\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"s2s-prov-task-type-filter\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"topic\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"s2s-prov-task-type-filter-exclude\": {\n-                                \"description\": \"Regular expression to exclude the provenance events based on the component type. The events matching the regular expression will not be sent. If no filter is set, all the events are sent. If multiple filters are set, the filters are cumulative. If a component type is included in Component Type to Include and excluded here, then the exclusion takes precedence and the event will not be sent.\",\n-                                \"displayName\": \"Component Type to Exclude\",\n+                            \"transactional-id-prefix\": {\n+                                \"description\": \"When Use Transaction is set to true, KafkaProducer config 'transactional.id' will be a generated UUID and will be prefixed with this string.\",\n+                                \"displayName\": \"Transactional Id Prefix\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"s2s-prov-task-type-filter-exclude\",\n+                                \"name\": \"transactional-id-prefix\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"start-position\": {\n+                            \"use-transactions\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Start reading provenance Events from the beginning of the stream (the oldest event first)\",\n-                                        \"displayName\": \"Beginning of Stream\",\n-                                        \"value\": \"beginning-of-stream\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n-                                        \"description\": \"Start reading provenance Events from the end of the stream, ignoring old events\",\n-                                        \"displayName\": \"End of Stream\",\n-                                        \"value\": \"end-of-stream\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"beginning-of-stream\",\n-                                \"description\": \"If the Reporting Task has never been run, or if its state has been reset by a user, specifies where in the stream of Provenance Events the Reporting Task should start\",\n-                                \"displayName\": \"Start Position\",\n+                                \"defaultValue\": \"true\",\n+                                \"description\": \"Specifies whether or not NiFi should provide Transactional guarantees when communicating with Kafka. If there is a problem sending data to Kafka, and this property is set to false, then the messages that have already been sent to Kafka will continue on and be delivered to consumers. If this is set to true, then the Kafka transaction will be rolled back so that those messages are not available to consumers. Setting this to true requires that the <Delivery Guarantee> property be set to \\\"Guarantee Replicated Delivery.\\\"\",\n+                                \"displayName\": \"Use Transactions\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"start-position\",\n+                                \"name\": \"use-transactions\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             }\n                         },\n+                        \"sideEffectFree\": false,\n+                        \"supportedRelationships\": [\n+                            {\n+                                \"description\": \"FlowFiles for which all content was sent to Kafka.\",\n+                                \"name\": \"success\"\n+                            },\n+                            {\n+                                \"description\": \"Any FlowFile that cannot be sent to Kafka will be routed to this Relationship\",\n+                                \"name\": \"failure\"\n+                            }\n+                        ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n-                        \"supportsDynamicProperties\": false,\n+                        \"supportsBatching\": false,\n+                        \"supportsDynamicProperties\": true,\n+                        \"supportsDynamicRelationships\": false,\n+                        \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"azure\",\n-                            \"log analytics\",\n-                            \"provenace\",\n-                            \"reporting\"\n+                            \"2.0\",\n+                            \"Apache\",\n+                            \"Kafka\",\n+                            \"Message\",\n+                            \"PubSub\",\n+                            \"Put\",\n+                            \"Send\"\n                         ],\n-                        \"type\": \"org.apache.nifi.reporting.azure.loganalytics.AzureLogAnalyticsProvenanceReportingTask\",\n-                        \"typeDescription\": \"Publishes Provenance events to to a Azure Log Analytics workspace.\",\n-                        \"version\": \"1.27.0\"\n-                    },\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-azure-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"e0c4461\"\n-                        },\n-                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"1 min\"\n-                        },\n-                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n+                        \"triggerSerially\": false,\n+                        \"triggerWhenAnyDestinationAvailable\": false,\n+                        \"triggerWhenEmpty\": false,\n+                        \"type\": \"org.apache.nifi.processors.kafka.pubsub.PublishKafka_2_0\",\n+                        \"typeDescription\": \"Sends the contents of a FlowFile as a message to Apache Kafka using the Kafka 2.0 Producer API.The messages to send may be individual FlowFiles or may be delimited, using a user-specified delimiter, such as a new-line. The complementary NiFi processor for fetching messages is ConsumeKafka_2_0.\",\n+                        \"version\": \"1.27.0\",\n+                        \"writesAttributes\": [\n+                            {\n+                                \"description\": \"The number of messages that were sent to Kafka for this FlowFile. This attribute is added only to FlowFiles that are routed to success. If the <Message Demarcator> Property is not set, this will always be 1, but if the Property is set, it may be greater than 1.\",\n+                                \"name\": \"msg.count\"\n+                            }\n+                        ]\n+                    }\n+                ],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"1.27.0\"\n+        },\n+        {\n+            \"artifact\": \"nifi-zendesk-services-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [\n+                    {\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-zendesk-services-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"e0c4461\"\n+                        },\n                         \"group\": \"org.apache.nifi\",\n                         \"propertyDescriptors\": {\n-                            \"Application ID\": {\n-                                \"defaultValue\": \"nifi\",\n-                                \"description\": \"The Application ID to be included in the metrics sent to Azure Log Analytics WS\",\n-                                \"displayName\": \"Application ID\",\n+                            \"cache-expiration\": {\n+                                \"defaultValue\": \"1 hour\",\n+                                \"description\": \"Specifies how long a Zendesk ticket that is cached should remain in the cache.\",\n+                                \"displayName\": \"Cache Expiration\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Application ID\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"cache-expiration\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Instance ID\": {\n-                                \"defaultValue\": \"${hostname(true)}\",\n-                                \"description\": \"Id of this NiFi instance to be included in the metrics sent to Azure Log Analytics WS\",\n-                                \"displayName\": \"Instance ID\",\n+                            \"cache-size\": {\n+                                \"defaultValue\": \"1000\",\n+                                \"description\": \"Specifies how many Zendesk ticket should be cached.\",\n+                                \"displayName\": \"Cache Size\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Instance ID\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"cache-size\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Job Name\": {\n-                                \"defaultValue\": \"nifi_reporting_job\",\n-                                \"description\": \"The name of the exporting job\",\n-                                \"displayName\": \"Job Name\",\n+                            \"web-client-service-provider\": {\n+                                \"description\": \"Controller service for HTTP client operations.\",\n+                                \"displayName\": \"Web Client Service Provider\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Job Name\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"web-client-service-provider\",\n+                                \"required\": true,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.web.client.provider.api.WebClientServiceProvider\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"zendesk-authentication-type-name\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"Password of Zendesk login user.\",\n+                                        \"displayName\": \"Password\",\n+                                        \"value\": \"password\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Authentication token generated in Zendesk Admin menu for API access.\",\n+                                        \"displayName\": \"Token\",\n+                                        \"value\": \"token\"\n+                                    }\n+                                ],\n+                                \"description\": \"Type of authentication to Zendesk API.\",\n+                                \"displayName\": \"Authentication Type\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"zendesk-authentication-type-name\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Log Analytics Custom Log Name\": {\n-                                \"defaultValue\": \"nifimetrics\",\n-                                \"description\": \"Log Analytics Custom Log Name\",\n-                                \"displayName\": \"Log Analytics Custom Log Name\",\n+                            \"zendesk-authentication-value-name\": {\n+                                \"description\": \"Password or authentication token for Zendesk login user.\",\n+                                \"displayName\": \"Authentication Credential\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Log Analytics Custom Log Name\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"zendesk-authentication-value-name\",\n+                                \"required\": true,\n+                                \"sensitive\": true\n+                            },\n+                            \"zendesk-comment-body\": {\n+                                \"description\": \"The content or the path to the comment body in the incoming record.\",\n+                                \"displayName\": \"Comment Body\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"zendesk-comment-body\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Log Analytics URL Endpoint Format\": {\n-                                \"defaultValue\": \"https://{0}.ods.opinsights.azure.com/api/logs?api-version=2016-04-01\",\n-                                \"description\": \"Log Analytics URL Endpoint Format\",\n-                                \"displayName\": \"Log Analytics URL Endpoint Format\",\n+                            \"zendesk-priority\": {\n+                                \"description\": \"The content or the path to the priority in the incoming record.\",\n+                                \"displayName\": \"Priority\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Log Analytics URL Endpoint Format\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"zendesk-priority\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Log Analytics Workspace Id\": {\n-                                \"description\": \"Log Analytics Workspace Id\",\n-                                \"displayName\": \"Log Analytics Workspace Id\",\n+                            \"zendesk-subdomain\": {\n+                                \"description\": \"Name of the Zendesk subdomain.\",\n+                                \"displayName\": \"Subdomain Name\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Log Analytics Workspace Id\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"zendesk-subdomain\",\n                                 \"required\": true,\n-                                \"sensitive\": true\n+                                \"sensitive\": false\n                             },\n-                            \"Log Analytics Workspace Key\": {\n-                                \"description\": \"Azure Log Analytic Worskspace Key\",\n-                                \"displayName\": \"Log Analytics Workspace Key\",\n+                            \"zendesk-subject\": {\n+                                \"description\": \"The content or the path to the subject in the incoming record.\",\n+                                \"displayName\": \"Subject\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Log Analytics Workspace Key\",\n-                                \"required\": true,\n-                                \"sensitive\": true\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"zendesk-subject\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n                             },\n-                            \"Process group ID(s)\": {\n-                                \"description\": \"If specified, the reporting task will send metrics the configured ProcessGroup(s) only. Multiple IDs should be separated by a comma. If none of the group-IDs could be found or no IDs are defined, the Root Process Group is used and global metrics are sent.\",\n-                                \"displayName\": \"Process group ID(s)\",\n+                            \"zendesk-type\": {\n+                                \"description\": \"The content or the path to the type in the incoming record.\",\n+                                \"displayName\": \"Type\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Process group ID(s)\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"zendesk-type\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Send JVM Metrics\": {\n+                            \"zendesk-user\": {\n+                                \"description\": \"Login user to Zendesk subdomain.\",\n+                                \"displayName\": \"User Name\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"zendesk-user\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            }\n+                        },\n+                        \"providedApiImplementations\": [\n+                            {\n+                                \"artifact\": \"nifi-standard-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.record.sink.RecordSinkService\",\n+                                \"version\": \"1.27.0\"\n+                            }\n+                        ],\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"record\",\n+                            \"sink\",\n+                            \"zendesk\"\n+                        ],\n+                        \"type\": \"org.apache.nifi.services.zendesk.ZendeskRecordSink\",\n+                        \"typeDescription\": \"Create Zendesk tickets using the Zendesk API.The service requires a Zendesk account with configured access.\",\n+                        \"version\": \"1.27.0\"\n+                    }\n+                ],\n+                \"processors\": [],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"1.27.0\"\n+        },\n+        {\n+            \"artifact\": \"nifi-box-services-api-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [],\n+                \"processors\": [],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"1.27.0\"\n+        },\n+        {\n+            \"artifact\": \"nifi-websocket-services-api-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [],\n+                \"processors\": [],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"1.27.0\"\n+        },\n+        {\n+            \"artifact\": \"nifi-datadog-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [],\n+                \"processors\": [],\n+                \"reportingTasks\": [\n+                    {\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-datadog-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"e0c4461\"\n+                        },\n+                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": \"* * * * * ?\",\n+                            \"TIMER_DRIVEN\": \"0 sec\"\n+                        },\n+                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n+                        \"deprecated\": true,\n+                        \"deprecationReason\": \"This reporting task is deprecated and will be removed in NiFi 2.x.\",\n+                        \"group\": \"org.apache.nifi\",\n+                        \"propertyDescriptors\": {\n+                            \"API key\": {\n+                                \"description\": \"Datadog API key. If specified value is 'agent', local Datadog agent will be used.\",\n+                                \"displayName\": \"API key\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"API key\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n+                            },\n+                            \"Datadog transport\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"description\": \"Metrics will be sent via locally installed Datadog agent. Datadog agent needs to be installed manually before using this option\",\n+                                        \"displayName\": \"Datadog Agent\",\n+                                        \"value\": \"Datadog Agent\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"description\": \"Metrics will be sent via HTTP transport with no need of Agent installed. Datadog API key needs to be set\",\n+                                        \"displayName\": \"Datadog HTTP\",\n+                                        \"value\": \"Datadog HTTP\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"Send JVM Metrics in addition to the NiFi-metrics\",\n-                                \"displayName\": \"Send JVM Metrics\",\n+                                \"defaultValue\": \"Datadog HTTP\",\n+                                \"description\": \"Transport through which metrics will be sent to Datadog\",\n+                                \"displayName\": \"Datadog transport\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Send JVM Metrics\",\n+                                \"name\": \"Datadog transport\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Environment\": {\n+                                \"defaultValue\": \"dev\",\n+                                \"description\": \"Environment, dataflow is running in. This property will be included as metrics tag.\",\n+                                \"displayName\": \"Environment\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Environment\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Metrics prefix\": {\n+                                \"defaultValue\": \"nifi\",\n+                                \"description\": \"Prefix to be added before every metric\",\n+                                \"displayName\": \"Metrics prefix\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Metrics prefix\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             }\n                         },\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n                         \"supportsDynamicProperties\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"azure\",\n-                            \"log analytics\",\n+                            \"datadog\",\n                             \"metrics\",\n                             \"reporting\"\n                         ],\n-                        \"type\": \"org.apache.nifi.reporting.azure.loganalytics.AzureLogAnalyticsReportingTask\",\n-                        \"typeDescription\": \"Sends JVM-metrics as well as Apache NiFi-metrics to a Azure Log Analytics workspace.Apache NiFi-metrics can be either configured global or on process-group level.\",\n+                        \"type\": \"org.apache.nifi.reporting.datadog.DataDogReportingTask\",\n+                        \"typeDescription\": \"Publishes metrics from NiFi to datadog. For accurate and informative reporting, components should have unique names.\",\n                         \"version\": \"1.27.0\"\n                     }\n                 ]\n             },\n             \"group\": \"org.apache.nifi\",\n             \"version\": \"1.27.0\"\n         },\n         {\n-            \"artifact\": \"nifi-social-media-nar\",\n+            \"artifact\": \"nifi-solr-nar\",\n             \"componentManifest\": {\n                 \"controllerServices\": [],\n                 \"processors\": [\n                     {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-social-media-nar\",\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-solr-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n                         },\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"0 sec\"\n+                            \"TIMER_DRIVEN\": \"1 min\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n+                        \"deprecated\": true,\n+                        \"deprecationReason\": \"The SOLR processors are deprecated and will be removed in NiFi 2.x.\",\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_FORBIDDEN\",\n-                        \"primaryNodeOnly\": true,\n+                        \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"backfill-minutes\": {\n-                                \"defaultValue\": \"0\",\n-                                \"description\": \"The number of minutes (up to 5 minutes) of streaming data to be requested after a disconnect. Only available for project with academic research access. See https://developer.twitter.com/en/docs/twitter-api/tweets/filtered-stream/integrate/recovery-and-redundancy-features\",\n-                                \"displayName\": \"Backfill Minutes\",\n+                            \"Batch Size\": {\n+                                \"defaultValue\": \"100\",\n+                                \"description\": \"Number of rows per Solr query\",\n+                                \"displayName\": \"Batch Size\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"backfill-minutes\",\n+                                \"name\": \"Batch Size\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"backoff-attempts\": {\n-                                \"defaultValue\": \"5\",\n-                                \"description\": \"The number of reconnection tries the processor will attempt in the event of a disconnection of the stream for any reason, before throwing an exception. To start a stream after this exception occur and the connection is fixed, please stop and restart the processor. If the valueof this property is 0, then backoff will never occur and the processor will always need to be restartedif the stream fails.\",\n-                                \"displayName\": \"Backoff Attempts\",\n+                            \"Collection\": {\n+                                \"description\": \"The Solr collection name, only used with a Solr Type of Cloud\",\n+                                \"displayName\": \"Collection\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"backoff-attempts\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Collection\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"backoff-time\": {\n-                                \"defaultValue\": \"1 mins\",\n-                                \"description\": \"The duration to backoff before requesting a new stream ifthe current one fails for any reason. Will increase by factor of 2 every time a restart fails\",\n-                                \"displayName\": \"Backoff Time\",\n+                            \"Date Field\": {\n+                                \"description\": \"The name of a date field in Solr used to filter results\",\n+                                \"displayName\": \"Date Field\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"backoff-time\",\n+                                \"name\": \"Date Field\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"base-path\": {\n-                                \"defaultValue\": \"https://api.twitter.com\",\n-                                \"description\": \"The base path that the processor will use for making HTTP requests. The default value should be sufficient for most use cases.\",\n-                                \"displayName\": \"Base Path\",\n+                            \"Initial Date Filter\": {\n+                                \"description\": \"Date value to filter results. Documents with an earlier date will not be fetched. The format has to correspond to the date pattern of Solr 'YYYY-MM-DDThh:mm:ssZ'\",\n+                                \"displayName\": \"Initial Date Filter\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"base-path\",\n-                                \"required\": true,\n+                                \"name\": \"Initial Date Filter\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"batch-size\": {\n-                                \"defaultValue\": \"1000\",\n-                                \"description\": \"The maximum size of the number of Tweets to be written to a single FlowFile. Will write fewer Tweets based on the number available in the queue at the time of processor invocation.\",\n-                                \"displayName\": \"Batch Size\",\n+                            \"Password\": {\n+                                \"description\": \"The password to use when Solr is configured with basic authentication.\",\n+                                \"displayName\": \"Basic Auth Password\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"batch-size\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Password\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n                             },\n-                            \"bearer-token\": {\n-                                \"description\": \"The Bearer Token provided by Twitter.\",\n-                                \"displayName\": \"Bearer Token\",\n+                            \"Record Writer\": {\n+                                \"description\": \"The Record Writer to use in order to write Solr documents to FlowFiles. Must be set if \\\"Records\\\" is used as return type.\",\n+                                \"displayName\": \"Record Writer\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Record Writer\",\n+                                \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"Return Fields\": {\n+                                \"description\": \"Comma-separated list of field names to return\",\n+                                \"displayName\": \"Return Fields\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"bearer-token\",\n-                                \"required\": true,\n-                                \"sensitive\": true\n+                                \"name\": \"Return Fields\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n                             },\n-                            \"connect-timeout\": {\n-                                \"defaultValue\": \"10 secs\",\n-                                \"description\": \"The maximum time in which client should establish a connection with the Twitter API before a time out. Setting the value to 0 disables connection timeouts.\",\n-                                \"displayName\": \"Connect Timeout\",\n+                            \"Return Type\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"XML\",\n+                                        \"value\": \"XML\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Records\",\n+                                        \"value\": \"Records\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"XML\",\n+                                \"description\": \"Write Solr documents to FlowFiles as XML or using a Record Writer\",\n+                                \"displayName\": \"Return Type\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"connect-timeout\",\n+                                \"name\": \"Return Type\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"expansions\": {\n-                                \"description\": \"A comma-separated list of expansions for objects in the returned tweet. See https://developer.twitter.com/en/docs/twitter-api/expansions for proper usage. Possible field values include: author_id, referenced_tweets.id, referenced_tweets.id.author_id, entities.mentions.username, attachments.poll_ids, attachments.media_keys ,in_reply_to_user_id, geo.place_id\",\n-                                \"displayName\": \"Expansions\",\n+                            \"SSL Context Service\": {\n+                                \"description\": \"The Controller Service to use in order to obtain an SSL Context. This property must be set when communicating with a Solr over https.\",\n+                                \"displayName\": \"SSL Context Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"expansions\",\n+                                \"name\": \"SSL Context Service\",\n                                 \"required\": false,\n-                                \"sensitive\": false\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n                             },\n-                            \"maximum-backoff-time\": {\n-                                \"defaultValue\": \"5 mins\",\n-                                \"description\": \"The maximum duration to backoff to start attempting a new stream.It is recommended that this number be much higher than the 'Backoff Time' property\",\n-                                \"displayName\": \"Maximum Backoff Time\",\n+                            \"Solr Connection Timeout\": {\n+                                \"defaultValue\": \"10 seconds\",\n+                                \"description\": \"The amount of time to wait when establishing a connection to Solr. A value of 0 indicates an infinite timeout.\",\n+                                \"displayName\": \"Solr Connection Timeout\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"maximum-backoff-time\",\n+                                \"name\": \"Solr Connection Timeout\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"media-fields\": {\n-                                \"description\": \"A comma-separated list of media fields to be returned as part of the tweet. Refer to https://developer.twitter.com/en/docs/twitter-api/data-dictionary/object-model/media for proper usage. Possible field values include: alt_text, duration_ms, height, media_key, non_public_metrics, organic_metrics, preview_image_url, promoted_metrics, public_metrics, type, url, width\",\n-                                \"displayName\": \"Media Fields\",\n+                            \"Solr Location\": {\n+                                \"description\": \"The Solr url for a Solr Type of Standard (ex: http://localhost:8984/solr/gettingstarted), or the ZooKeeper hosts for a Solr Type of Cloud (ex: localhost:9983).\",\n+                                \"displayName\": \"Solr Location\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"media-fields\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Solr Location\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"place-fields\": {\n-                                \"description\": \"A comma-separated list of place fields to be returned as part of the tweet. Refer to https://developer.twitter.com/en/docs/twitter-api/data-dictionary/object-model/place for proper usage. Possible field values include: contained_within, country, country_code, full_name, geo, id, name, place_type\",\n-                                \"displayName\": \"Place Fields\",\n+                            \"Solr Maximum Connections\": {\n+                                \"defaultValue\": \"10\",\n+                                \"description\": \"The maximum number of total connections allowed from the Solr client to Solr.\",\n+                                \"displayName\": \"Solr Maximum Connections\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"place-fields\",\n-                                \"required\": false,\n+                                \"name\": \"Solr Maximum Connections\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"poll-fields\": {\n-                                \"description\": \"A comma-separated list of poll fields to be returned as part of the tweet. Refer to https://developer.twitter.com/en/docs/twitter-api/data-dictionary/object-model/poll for proper usage. Possible field values include: duration_minutes, end_datetime, id, options, voting_status\",\n-                                \"displayName\": \"Poll Fields\",\n+                            \"Solr Maximum Connections Per Host\": {\n+                                \"defaultValue\": \"5\",\n+                                \"description\": \"The maximum number of connections allowed from the Solr client to a single Solr host.\",\n+                                \"displayName\": \"Solr Maximum Connections Per Host\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"poll-fields\",\n-                                \"required\": false,\n+                                \"name\": \"Solr Maximum Connections Per Host\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"queue-size\": {\n-                                \"defaultValue\": \"10000\",\n-                                \"description\": \"Maximum size of internal queue for streamed messages\",\n-                                \"displayName\": \"Queue Size\",\n+                            \"Solr Query\": {\n+                                \"description\": \"A query to execute against Solr\",\n+                                \"displayName\": \"Solr Query\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"queue-size\",\n-                                \"required\": true,\n+                                \"name\": \"Solr Query\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"read-timeout\": {\n-                                \"defaultValue\": \"10 secs\",\n-                                \"description\": \"The maximum time of inactivity between receiving tweets from Twitter through the API before a timeout. Setting the value to 0 disables read timeouts.\",\n-                                \"displayName\": \"Read Timeout\",\n+                            \"Solr Socket Timeout\": {\n+                                \"defaultValue\": \"10 seconds\",\n+                                \"description\": \"The amount of time to wait for data on a socket connection to Solr. A value of 0 indicates an infinite timeout.\",\n+                                \"displayName\": \"Solr Socket Timeout\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"read-timeout\",\n+                                \"name\": \"Solr Socket Timeout\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"stream-endpoint\": {\n+                            \"Solr Type\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Streams about one percent of all Tweets. https://developer.twitter.com/en/docs/twitter-api/tweets/volume-streams/api-reference/get-tweets-sample-stream\",\n-                                        \"displayName\": \"Sample Stream\",\n-                                        \"value\": \"Sample Endpoint\"\n+                                        \"description\": \"A SolrCloud instance.\",\n+                                        \"displayName\": \"Cloud\",\n+                                        \"value\": \"Cloud\"\n                                     },\n                                     {\n-                                        \"description\": \"The search stream produces Tweets that match filtering rules configured on Twitter services. At least one well-formed filtering rule must be configured. https://developer.twitter.com/en/docs/twitter-api/tweets/filtered-stream/api-reference/get-tweets-search-stream\",\n-                                        \"displayName\": \"Search Stream\",\n-                                        \"value\": \"Search Endpoint\"\n+                                        \"description\": \"A stand-alone Solr instance.\",\n+                                        \"displayName\": \"Standard\",\n+                                        \"value\": \"Standard\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"Sample Endpoint\",\n-                                \"description\": \"The source from which the processor will consume Tweets.\",\n-                                \"displayName\": \"Stream Endpoint\",\n+                                \"defaultValue\": \"Standard\",\n+                                \"description\": \"The type of Solr instance, Cloud or Standard.\",\n+                                \"displayName\": \"Solr Type\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"stream-endpoint\",\n+                                \"name\": \"Solr Type\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"tweet-fields\": {\n-                                \"description\": \"A comma-separated list of tweet fields to be returned as part of the tweet. Refer to https://developer.twitter.com/en/docs/twitter-api/data-dictionary/object-model/tweet for proper usage. Possible field values include: attachments, author_id, context_annotations, conversation_id, created_at, entities, geo, id, in_reply_to_user_id, lang, non_public_metrics, organic_metrics, possibly_sensitive, promoted_metrics, public_metrics, referenced_tweets, reply_settings, source, text, withheld\",\n-                                \"displayName\": \"Tweet Fields\",\n+                            \"Username\": {\n+                                \"description\": \"The username to use when Solr is configured with basic authentication.\",\n+                                \"displayName\": \"Basic Auth Username\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Username\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"ZooKeeper Client Timeout\": {\n+                                \"defaultValue\": \"10 seconds\",\n+                                \"description\": \"The amount of time to wait for data on a connection to ZooKeeper, only used with a Solr Type of Cloud.\",\n+                                \"displayName\": \"ZooKeeper Client Timeout\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"tweet-fields\",\n+                                \"name\": \"ZooKeeper Client Timeout\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"user-fields\": {\n-                                \"description\": \"A comma-separated list of user fields to be returned as part of the tweet. Refer to https://developer.twitter.com/en/docs/twitter-api/data-dictionary/object-model/user for proper usage. Possible field values include: created_at, description, entities, id, location, name, pinned_tweet_id, profile_image_url, protected, public_metrics, url, username, verified, withheld\",\n-                                \"displayName\": \"User Fields\",\n+                            \"ZooKeeper Connection Timeout\": {\n+                                \"defaultValue\": \"10 seconds\",\n+                                \"description\": \"The amount of time to wait when establishing a connection to ZooKeeper, only used with a Solr Type of Cloud.\",\n+                                \"displayName\": \"ZooKeeper Connection Timeout\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"user-fields\",\n+                                \"name\": \"ZooKeeper Connection Timeout\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"kerberos-credentials-service\": {\n+                                \"description\": \"Specifies the Kerberos Credentials Controller Service that should be used for authenticating with Kerberos\",\n+                                \"displayName\": \"Kerberos Credentials Service\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"kerberos-credentials-service\",\n+                                \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.kerberos.KerberosCredentialsService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"kerberos-password\": {\n+                                \"description\": \"The password to use when specifying the principal and password directly in the processor for authenticating to Solr via Kerberos.\",\n+                                \"displayName\": \"Kerberos Password\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"kerberos-password\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n+                            },\n+                            \"kerberos-principal\": {\n+                                \"description\": \"The principal to use when specifying the principal and password directly in the processor for authenticating to Solr via Kerberos.\",\n+                                \"displayName\": \"Kerberos Principal\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"kerberos-principal\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n+                            },\n+                            \"kerberos-user-service\": {\n+                                \"description\": \"Specifies the Kerberos User Controller Service that should be used for authenticating with Kerberos\",\n+                                \"displayName\": \"Kerberos User Service\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"kerberos-user-service\",\n+                                \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.kerberos.KerberosUserService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n                             }\n                         },\n                         \"sideEffectFree\": false,\n+                        \"stateful\": {\n+                            \"description\": \"Stores latest date of Date Field so that the same data will not be fetched multiple times.\",\n+                            \"scopes\": [\n+                                \"CLUSTER\"\n+                            ]\n+                        },\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"FlowFiles containing an array of one or more Tweets\",\n+                                \"description\": \"The results of querying Solr\",\n                                 \"name\": \"success\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n-                        \"supportsBatching\": true,\n+                        \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"json\",\n-                            \"social media\",\n-                            \"status\",\n-                            \"tweets\",\n-                            \"twitter\"\n+                            \"Apache\",\n+                            \"Get\",\n+                            \"Pull\",\n+                            \"Records\",\n+                            \"Solr\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.twitter.ConsumeTwitter\",\n-                        \"typeDescription\": \"Streams tweets from Twitter's streaming API v2. The stream provides a sample stream or a search stream based on previously uploaded rules. This processor also provides a pass through for certain fields of the tweet to be returned as part of the response. See https://developer.twitter.com/en/docs/twitter-api/data-dictionary/introduction for more information regarding the Tweet object model.\",\n-                        \"version\": \"1.27.0\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"The MIME Type set to application/json\",\n-                                \"name\": \"mime.type\"\n-                            },\n-                            {\n-                                \"description\": \"The number of Tweets in the FlowFile\",\n-                                \"name\": \"tweets\"\n-                            }\n-                        ]\n+                        \"type\": \"org.apache.nifi.processors.solr.GetSolr\",\n+                        \"typeDescription\": \"Queries Solr and outputs the results as a FlowFile in the format of XML or using a Record Writer\",\n+                        \"version\": \"1.27.0\"\n                     },\n                     {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-social-media-nar\",\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-solr-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -18414,2032 +19131,2312 @@\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n                         \"deprecated\": true,\n-                        \"deprecationAlternatives\": [\n-                            \"org.apache.nifi.processors.twitter.ConsumeTwitter\"\n-                        ],\n-                        \"deprecationReason\": \"GetTwitter relies on the Twitter Hosebird client, which is not maintained. This processor will be removed in future releases.\",\n+                        \"deprecationReason\": \"The SOLR processors are deprecated and will be removed in NiFi 2.x.\",\n                         \"dynamicProperties\": [\n                             {\n-                                \"description\": \"Allows users to specify the name/value of a query parameter to add to the Twitter query\",\n+                                \"description\": \"These parameters will be passed to Solr on the request\",\n                                 \"expressionLanguageScope\": \"NONE\",\n-                                \"name\": \"The name of a query parameter to add to the Twitter query\",\n-                                \"value\": \"The value of a query parameter to add to the Twitter query\"\n+                                \"name\": \"A Solr request parameter name\",\n+                                \"value\": \"A Solr request parameter value\"\n                             }\n                         ],\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Access Token\": {\n-                                \"description\": \"The Access Token provided by Twitter\",\n-                                \"displayName\": \"Access Token\",\n+                            \"Collection\": {\n+                                \"description\": \"The Solr collection name, only used with a Solr Type of Cloud\",\n+                                \"displayName\": \"Collection\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Access Token\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Collection\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Commit Within\": {\n+                                \"defaultValue\": \"5000\",\n+                                \"description\": \"The number of milliseconds before the given update is committed\",\n+                                \"displayName\": \"Commit Within\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Commit Within\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Content Stream Path\": {\n+                                \"defaultValue\": \"/update/json/docs\",\n+                                \"description\": \"The path in Solr to post the ContentStream\",\n+                                \"displayName\": \"Content Stream Path\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Content Stream Path\",\n                                 \"required\": true,\n-                                \"sensitive\": true\n+                                \"sensitive\": false\n                             },\n-                            \"Access Token Secret\": {\n-                                \"description\": \"The Access Token Secret provided by Twitter\",\n-                                \"displayName\": \"Access Token Secret\",\n+                            \"Content-Type\": {\n+                                \"defaultValue\": \"application/json\",\n+                                \"description\": \"Content-Type being sent to Solr\",\n+                                \"displayName\": \"Content-Type\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Access Token Secret\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Content-Type\",\n                                 \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Password\": {\n+                                \"description\": \"The password to use when Solr is configured with basic authentication.\",\n+                                \"displayName\": \"Basic Auth Password\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Password\",\n+                                \"required\": false,\n                                 \"sensitive\": true\n                             },\n-                            \"Consumer Key\": {\n-                                \"description\": \"The Consumer Key provided by Twitter\",\n-                                \"displayName\": \"Consumer Key\",\n+                            \"SSL Context Service\": {\n+                                \"description\": \"The Controller Service to use in order to obtain an SSL Context. This property must be set when communicating with a Solr over https.\",\n+                                \"displayName\": \"SSL Context Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Consumer Key\",\n-                                \"required\": true,\n-                                \"sensitive\": true\n+                                \"name\": \"SSL Context Service\",\n+                                \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n                             },\n-                            \"Consumer Secret\": {\n-                                \"description\": \"The Consumer Secret provided by Twitter\",\n-                                \"displayName\": \"Consumer Secret\",\n+                            \"Solr Connection Timeout\": {\n+                                \"defaultValue\": \"10 seconds\",\n+                                \"description\": \"The amount of time to wait when establishing a connection to Solr. A value of 0 indicates an infinite timeout.\",\n+                                \"displayName\": \"Solr Connection Timeout\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Consumer Secret\",\n+                                \"name\": \"Solr Connection Timeout\",\n                                 \"required\": true,\n-                                \"sensitive\": true\n+                                \"sensitive\": false\n                             },\n-                            \"IDs to Follow\": {\n-                                \"description\": \"A comma-separated list of Twitter User ID's to follow. Ignored unless Endpoint is set to 'Filter Endpoint'.\",\n-                                \"displayName\": \"IDs to Follow\",\n+                            \"Solr Location\": {\n+                                \"description\": \"The Solr url for a Solr Type of Standard (ex: http://localhost:8984/solr/gettingstarted), or the ZooKeeper hosts for a Solr Type of Cloud (ex: localhost:9983).\",\n+                                \"displayName\": \"Solr Location\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"IDs to Follow\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Solr Location\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Languages\": {\n-                                \"description\": \"A comma-separated list of languages for which tweets should be fetched\",\n-                                \"displayName\": \"Languages\",\n+                            \"Solr Maximum Connections\": {\n+                                \"defaultValue\": \"10\",\n+                                \"description\": \"The maximum number of total connections allowed from the Solr client to Solr.\",\n+                                \"displayName\": \"Solr Maximum Connections\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Languages\",\n-                                \"required\": false,\n+                                \"name\": \"Solr Maximum Connections\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Locations to Filter On\": {\n-                                \"description\": \"A comma-separated list of coordinates specifying one or more bounding boxes to filter on.Each bounding box is specified by a pair of coordinates in the format: swLon,swLat,neLon,neLat. Multiple bounding boxes can be specified as such: swLon1,swLat1,neLon1,neLat1,swLon2,swLat2,neLon2,neLat2.Ignored unless Endpoint is set to 'Filter Endpoint'.\",\n-                                \"displayName\": \"Locations to Filter On\",\n+                            \"Solr Maximum Connections Per Host\": {\n+                                \"defaultValue\": \"5\",\n+                                \"description\": \"The maximum number of connections allowed from the Solr client to a single Solr host.\",\n+                                \"displayName\": \"Solr Maximum Connections Per Host\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Locations to Filter On\",\n-                                \"required\": false,\n+                                \"name\": \"Solr Maximum Connections Per Host\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Terms to Filter On\": {\n-                                \"description\": \"A comma-separated list of terms to filter on. Ignored unless Endpoint is set to 'Filter Endpoint'. The filter works such that if any term matches, the status update will be retrieved; multiple terms separated by a space function as an 'AND'. I.e., 'it was, hello' will retrieve status updates that have either 'hello' or both 'it' AND 'was'\",\n-                                \"displayName\": \"Terms to Filter On\",\n+                            \"Solr Socket Timeout\": {\n+                                \"defaultValue\": \"10 seconds\",\n+                                \"description\": \"The amount of time to wait for data on a socket connection to Solr. A value of 0 indicates an infinite timeout.\",\n+                                \"displayName\": \"Solr Socket Timeout\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Terms to Filter On\",\n-                                \"required\": false,\n+                                \"name\": \"Solr Socket Timeout\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Twitter Endpoint\": {\n+                            \"Solr Type\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"The endpoint that provides public data, aka a 'garden hose'\",\n-                                        \"displayName\": \"Sample Endpoint\",\n-                                        \"value\": \"Sample Endpoint\"\n-                                    },\n-                                    {\n-                                        \"description\": \"The endpoint that provides access to all tweets\",\n-                                        \"displayName\": \"Firehose Endpoint\",\n-                                        \"value\": \"Firehose Endpoint\"\n+                                        \"description\": \"A SolrCloud instance.\",\n+                                        \"displayName\": \"Cloud\",\n+                                        \"value\": \"Cloud\"\n                                     },\n                                     {\n-                                        \"description\": \"Endpoint that allows the stream to be filtered by specific terms or User IDs\",\n-                                        \"displayName\": \"Filter Endpoint\",\n-                                        \"value\": \"Filter Endpoint\"\n+                                        \"description\": \"A stand-alone Solr instance.\",\n+                                        \"displayName\": \"Standard\",\n+                                        \"value\": \"Standard\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"Sample Endpoint\",\n-                                \"description\": \"Specifies which endpoint data should be pulled from\",\n-                                \"displayName\": \"Twitter Endpoint\",\n+                                \"defaultValue\": \"Standard\",\n+                                \"description\": \"The type of Solr instance, Cloud or Standard.\",\n+                                \"displayName\": \"Solr Type\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Twitter Endpoint\",\n+                                \"name\": \"Solr Type\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"max-client-error-retries\": {\n-                                \"defaultValue\": \"5\",\n-                                \"description\": \"The maximum number of retries to attempt when client experience retryable connection errors. Client continues attempting to reconnect using an exponential back-off pattern until it successfully reconnects or until it reaches the retry limit.  It is recommended to raise this value when client is getting rate limited by Twitter API. Default value is 5.\",\n-                                \"displayName\": \"Max Client Error Retries\",\n+                            \"Username\": {\n+                                \"description\": \"The username to use when Solr is configured with basic authentication.\",\n+                                \"displayName\": \"Basic Auth Username\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Username\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"ZooKeeper Client Timeout\": {\n+                                \"defaultValue\": \"10 seconds\",\n+                                \"description\": \"The amount of time to wait for data on a connection to ZooKeeper, only used with a Solr Type of Cloud.\",\n+                                \"displayName\": \"ZooKeeper Client Timeout\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"max-client-error-retries\",\n-                                \"required\": true,\n+                                \"name\": \"ZooKeeper Client Timeout\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n-                            }\n-                        },\n-                        \"sideEffectFree\": false,\n-                        \"supportedRelationships\": [\n-                            {\n-                                \"description\": \"All status updates will be routed to this relationship\",\n-                                \"name\": \"success\"\n-                            }\n-                        ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": true,\n-                        \"supportsDynamicProperties\": true,\n-                        \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": false,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"json\",\n-                            \"social media\",\n-                            \"status\",\n-                            \"tweets\",\n-                            \"twitter\"\n-                        ],\n-                        \"triggerSerially\": false,\n-                        \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.twitter.GetTwitter\",\n-                        \"typeDescription\": \"Pulls status changes from Twitter's streaming API. In versions starting with 1.9.0, the Consumer Key and Access Token are marked as sensitive according to https://developer.twitter.com/en/docs/basics/authentication/guides/securing-keys-and-tokens\",\n-                        \"version\": \"1.27.0\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"Sets mime type to application/json\",\n-                                \"name\": \"mime.type\"\n-                            }\n-                        ]\n-                    }\n-                ],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"1.27.0\"\n-        },\n-        {\n-            \"artifact\": \"nifi-box-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [],\n-                \"processors\": [\n-                    {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-box-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"e0c4461\"\n-                        },\n-                        \"defaultBulletinLevel\": \"WARN\",\n-                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": 1,\n-                            \"TIMER_DRIVEN\": 1\n-                        },\n-                        \"defaultPenaltyDuration\": \"30 sec\",\n-                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"0 sec\"\n-                        },\n-                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n-                        \"defaultYieldDuration\": \"1 sec\",\n-                        \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_REQUIRED\",\n-                        \"primaryNodeOnly\": false,\n-                        \"propertyDescriptors\": {\n-                            \"box-client-service\": {\n-                                \"description\": \"Controller Service used to obtain a Box API connection.\",\n-                                \"displayName\": \"Box Client Service\",\n+                            },\n+                            \"ZooKeeper Connection Timeout\": {\n+                                \"defaultValue\": \"10 seconds\",\n+                                \"description\": \"The amount of time to wait when establishing a connection to ZooKeeper, only used with a Solr Type of Cloud.\",\n+                                \"displayName\": \"ZooKeeper Connection Timeout\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"box-client-service\",\n-                                \"required\": true,\n+                                \"name\": \"ZooKeeper Connection Timeout\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"kerberos-credentials-service\": {\n+                                \"description\": \"Specifies the Kerberos Credentials Controller Service that should be used for authenticating with Kerberos\",\n+                                \"displayName\": \"Kerberos Credentials Service\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"kerberos-credentials-service\",\n+                                \"required\": false,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-box-services-api-nar\",\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.box.controllerservices.BoxClientService\",\n+                                    \"type\": \"org.apache.nifi.kerberos.KerberosCredentialsService\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             },\n-                            \"box-file-id\": {\n-                                \"defaultValue\": \"${box.id}\",\n-                                \"description\": \"The ID of the File to fetch\",\n-                                \"displayName\": \"File ID\",\n+                            \"kerberos-password\": {\n+                                \"description\": \"The password to use when specifying the principal and password directly in the processor for authenticating to Solr via Kerberos.\",\n+                                \"displayName\": \"Kerberos Password\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"box-file-id\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"kerberos-password\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n+                            },\n+                            \"kerberos-principal\": {\n+                                \"description\": \"The principal to use when specifying the principal and password directly in the processor for authenticating to Solr via Kerberos.\",\n+                                \"displayName\": \"Kerberos Principal\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"kerberos-principal\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n+                            },\n+                            \"kerberos-user-service\": {\n+                                \"description\": \"Specifies the Kerberos User Controller Service that should be used for authenticating with Kerberos\",\n+                                \"displayName\": \"Kerberos User Service\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"kerberos-user-service\",\n+                                \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.kerberos.KerberosUserService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n                             }\n                         },\n-                        \"readsAttributes\": [\n-                            {\n-                                \"description\": \"The id of the file\",\n-                                \"name\": \"box.id\"\n-                            }\n-                        ],\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.processors.box.ListBoxFile\",\n-                            \"org.apache.nifi.processors.box.PutBoxFile\"\n-                        ],\n                         \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"A FlowFile will be routed here for each successfully fetched File.\",\n+                                \"description\": \"The original FlowFile\",\n                                 \"name\": \"success\"\n                             },\n                             {\n-                                \"description\": \"A FlowFile will be routed here for each File for which fetch was attempted but failed.\",\n+                                \"description\": \"FlowFiles that failed for any reason other than Solr being unreachable\",\n                                 \"name\": \"failure\"\n+                            },\n+                            {\n+                                \"description\": \"FlowFiles that failed because Solr is unreachable\",\n+                                \"name\": \"connection_failure\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n                         \"supportsBatching\": false,\n-                        \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicProperties\": true,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"box\",\n-                            \"fetch\",\n-                            \"storage\"\n+                            \"Apache\",\n+                            \"Put\",\n+                            \"Send\",\n+                            \"Solr\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.box.FetchBoxFile\",\n-                        \"typeDescription\": \"Fetches files from a Box Folder. Designed to be used in tandem with ListBoxFile.\",\n-                        \"version\": \"1.27.0\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"The id of the file\",\n-                                \"name\": \"box.id\"\n-                            },\n-                            {\n-                                \"description\": \"The name of the file\",\n-                                \"name\": \"filename\"\n-                            },\n-                            {\n-                                \"description\": \"The folder path where the file is located\",\n-                                \"name\": \"path\"\n-                            },\n-                            {\n-                                \"description\": \"The size of the file\",\n-                                \"name\": \"box.size\"\n-                            },\n-                            {\n-                                \"description\": \"The last modified time of the file\",\n-                                \"name\": \"box.timestamp\"\n-                            },\n-                            {\n-                                \"description\": \"The error code returned by Box\",\n-                                \"name\": \"error.code\"\n-                            },\n-                            {\n-                                \"description\": \"The error message returned by Box\",\n-                                \"name\": \"error.message\"\n-                            }\n-                        ]\n+                        \"type\": \"org.apache.nifi.processors.solr.PutSolrContentStream\",\n+                        \"typeDescription\": \"Sends the contents of a FlowFile as a ContentStream to Solr\",\n+                        \"version\": \"1.27.0\"\n                     },\n                     {\n                         \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-box-nar\",\n+                        \"artifact\": \"nifi-solr-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n                         },\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"1 min\"\n+                            \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n+                        \"deprecated\": true,\n+                        \"deprecationReason\": \"The SOLR processors are deprecated and will be removed in NiFi 2.x.\",\n+                        \"dynamicProperties\": [\n+                            {\n+                                \"description\": \"These parameters will be passed to Solr on the request\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"name\": \"A Solr request parameter name\",\n+                                \"value\": \"A Solr request parameter value\"\n+                            }\n+                        ],\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n-                        \"primaryNodeOnly\": true,\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n+                        \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"box-client-service\": {\n-                                \"description\": \"Controller Service used to obtain a Box API connection.\",\n-                                \"displayName\": \"Box Client Service\",\n+                            \"Batch Size\": {\n+                                \"defaultValue\": \"500\",\n+                                \"description\": \"The number of solr documents to index per batch\",\n+                                \"displayName\": \"Batch Size\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Batch Size\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Collection\": {\n+                                \"description\": \"The Solr collection name, only used with a Solr Type of Cloud\",\n+                                \"displayName\": \"Collection\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Collection\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Commit Within\": {\n+                                \"defaultValue\": \"5000\",\n+                                \"description\": \"The number of milliseconds before the given update is committed\",\n+                                \"displayName\": \"Commit Within\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Commit Within\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Fields To Index\": {\n+                                \"description\": \"Comma-separated list of field names to write\",\n+                                \"displayName\": \"Fields To Index\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Fields To Index\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Password\": {\n+                                \"description\": \"The password to use when Solr is configured with basic authentication.\",\n+                                \"displayName\": \"Basic Auth Password\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Password\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n+                            },\n+                            \"SSL Context Service\": {\n+                                \"description\": \"The Controller Service to use in order to obtain an SSL Context. This property must be set when communicating with a Solr over https.\",\n+                                \"displayName\": \"SSL Context Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"box-client-service\",\n-                                \"required\": true,\n+                                \"name\": \"SSL Context Service\",\n+                                \"required\": false,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-box-services-api-nar\",\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.box.controllerservices.BoxClientService\",\n+                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             },\n-                            \"box-folder-id\": {\n-                                \"description\": \"The ID of the folder from which to pull list of files.\",\n-                                \"displayName\": \"Folder ID\",\n+                            \"Solr Connection Timeout\": {\n+                                \"defaultValue\": \"10 seconds\",\n+                                \"description\": \"The amount of time to wait when establishing a connection to Solr. A value of 0 indicates an infinite timeout.\",\n+                                \"displayName\": \"Solr Connection Timeout\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Solr Connection Timeout\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Solr Location\": {\n+                                \"description\": \"The Solr url for a Solr Type of Standard (ex: http://localhost:8984/solr/gettingstarted), or the ZooKeeper hosts for a Solr Type of Cloud (ex: localhost:9983).\",\n+                                \"displayName\": \"Solr Location\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"box-folder-id\",\n+                                \"name\": \"Solr Location\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"et-initial-listing-target\": {\n+                            \"Solr Maximum Connections\": {\n+                                \"defaultValue\": \"10\",\n+                                \"description\": \"The maximum number of total connections allowed from the Solr client to Solr.\",\n+                                \"displayName\": \"Solr Maximum Connections\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Solr Maximum Connections\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Solr Maximum Connections Per Host\": {\n+                                \"defaultValue\": \"5\",\n+                                \"description\": \"The maximum number of connections allowed from the Solr client to a single Solr host.\",\n+                                \"displayName\": \"Solr Maximum Connections Per Host\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Solr Maximum Connections Per Host\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Solr Socket Timeout\": {\n+                                \"defaultValue\": \"10 seconds\",\n+                                \"description\": \"The amount of time to wait for data on a socket connection to Solr. A value of 0 indicates an infinite timeout.\",\n+                                \"displayName\": \"Solr Socket Timeout\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Solr Socket Timeout\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Solr Type\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Ignore entities having timestamp older than the specified 'Tracking Time Window' at the initial listing activity.\",\n-                                        \"displayName\": \"Tracking Time Window\",\n-                                        \"value\": \"window\"\n+                                        \"description\": \"A SolrCloud instance.\",\n+                                        \"displayName\": \"Cloud\",\n+                                        \"value\": \"Cloud\"\n                                     },\n                                     {\n-                                        \"description\": \"Regardless of entities timestamp, all existing entities will be listed at the initial listing activity.\",\n-                                        \"displayName\": \"All Available\",\n-                                        \"value\": \"all\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"all\",\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"entities\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Listing Strategy\",\n-                                        \"propertyName\": \"listing-strategy\"\n+                                        \"description\": \"A stand-alone Solr instance.\",\n+                                        \"displayName\": \"Standard\",\n+                                        \"value\": \"Standard\"\n                                     }\n                                 ],\n-                                \"description\": \"Specify how initial listing should be handled. Used by 'Tracking Entities' strategy.\",\n-                                \"displayName\": \"Entity Tracking Initial Listing Target\",\n+                                \"defaultValue\": \"Standard\",\n+                                \"description\": \"The type of Solr instance, Cloud or Standard.\",\n+                                \"displayName\": \"Solr Type\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"et-initial-listing-target\",\n+                                \"name\": \"Solr Type\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Solr Update Path\": {\n+                                \"defaultValue\": \"/update\",\n+                                \"description\": \"The path in Solr to post the Flowfile Records\",\n+                                \"displayName\": \"Solr Update Path\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Solr Update Path\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Username\": {\n+                                \"description\": \"The username to use when Solr is configured with basic authentication.\",\n+                                \"displayName\": \"Basic Auth Username\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Username\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"et-state-cache\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"entities\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Listing Strategy\",\n-                                        \"propertyName\": \"listing-strategy\"\n-                                    }\n-                                ],\n-                                \"description\": \"Listed entities are stored in the specified cache storage so that this processor can resume listing across NiFi restart or in case of primary node change. 'Tracking Entities' strategy require tracking information of all listed entities within the last 'Tracking Time Window'. To support large number of entities, the strategy uses DistributedMapCache instead of managed state. Cache key format is 'ListedEntities::{processorId}(::{nodeId})'. If it tracks per node listed entities, then the optional '::{nodeId}' part is added to manage state separately. E.g. cluster wide cache key = 'ListedEntities::8dda2321-0164-1000-50fa-3042fe7d6a7b', per node cache key = 'ListedEntities::8dda2321-0164-1000-50fa-3042fe7d6a7b::nifi-node3' The stored cache content is Gzipped JSON string. The cache key will be deleted when target listing configuration is changed. Used by 'Tracking Entities' strategy.\",\n-                                \"displayName\": \"Entity Tracking State Cache\",\n+                            \"ZooKeeper Client Timeout\": {\n+                                \"defaultValue\": \"10 seconds\",\n+                                \"description\": \"The amount of time to wait for data on a connection to ZooKeeper, only used with a Solr Type of Cloud.\",\n+                                \"displayName\": \"ZooKeeper Client Timeout\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"et-state-cache\",\n+                                \"name\": \"ZooKeeper Client Timeout\",\n                                 \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.distributed.cache.client.DistributedMapCacheClient\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n+                                \"sensitive\": false\n                             },\n-                            \"et-time-window\": {\n-                                \"defaultValue\": \"3 hours\",\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"entities\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Listing Strategy\",\n-                                        \"propertyName\": \"listing-strategy\"\n-                                    }\n-                                ],\n-                                \"description\": \"Specify how long this processor should track already-listed entities. 'Tracking Entities' strategy can pick any entity whose timestamp is inside the specified time window. For example, if set to '30 minutes', any entity having timestamp in recent 30 minutes will be the listing target when this processor runs. A listed entity is considered 'new/updated' and a FlowFile is emitted if one of following condition meets: 1. does not exist in the already-listed entities, 2. has newer timestamp than the cached entity, 3. has different size than the cached entity. If a cached entity's timestamp becomes older than specified time window, that entity will be removed from the cached already-listed entities. Used by 'Tracking Entities' strategy.\",\n-                                \"displayName\": \"Entity Tracking Time Window\",\n+                            \"ZooKeeper Connection Timeout\": {\n+                                \"defaultValue\": \"10 seconds\",\n+                                \"description\": \"The amount of time to wait when establishing a connection to ZooKeeper, only used with a Solr Type of Cloud.\",\n+                                \"displayName\": \"ZooKeeper Connection Timeout\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"et-time-window\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"ZooKeeper Connection Timeout\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"listing-strategy\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"This strategy tracks the latest timestamp of listed entity to determine new/updated entities. Since it only tracks few timestamps, it can manage listing state efficiently. However, any newly added, or updated entity having timestamp older than the tracked latest timestamp can not be picked by this strategy. For example, such situation can happen in a file system if a file with old timestamp is copied or moved into the target directory without its last modified timestamp being updated. Also may miss files when multiple subdirectories are being written at the same time while listing is running.\",\n-                                        \"displayName\": \"Tracking Timestamps\",\n-                                        \"value\": \"timestamps\"\n-                                    },\n-                                    {\n-                                        \"description\": \"This strategy tracks information of all the listed entities within the latest 'Entity Tracking Time Window' to determine new/updated entities. This strategy can pick entities having old timestamp that can be missed with 'Tracking Timestamps'. Works even when multiple subdirectories are being written at the same time while listing is running. However additional DistributedMapCache controller service is required and more JVM heap memory is used. See the description of 'Entity Tracking Time Window' property for further details on how it works.\",\n-                                        \"displayName\": \"Tracking Entities\",\n-                                        \"value\": \"entities\"\n-                                    },\n-                                    {\n-                                        \"description\": \"This strategy uses a sliding time window. The window starts where the previous window ended and ends with the 'current time'. One cycle will list files with modification time falling within the time window. Works even when multiple subdirectories are being written at the same time while listing is running. IMPORTANT: This strategy works properly only if the time on both the system hosting NiFi and the one hosting the files are accurate.\",\n-                                        \"displayName\": \"Time Window\",\n-                                        \"value\": \"time-window\"\n-                                    },\n-                                    {\n-                                        \"description\": \"This strategy lists an entity without any tracking. The same entity will be listed each time on executing this processor. It is recommended to change the default run schedule value. Any property that related to the persisting state will be disregarded.\",\n-                                        \"displayName\": \"No Tracking\",\n-                                        \"value\": \"none\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"timestamps\",\n-                                \"description\": \"Specify how to determine new/updated entities. See each strategy descriptions for detail.\",\n-                                \"displayName\": \"Listing Strategy\",\n+                            \"kerberos-credentials-service\": {\n+                                \"description\": \"Specifies the Kerberos Credentials Controller Service that should be used for authenticating with Kerberos\",\n+                                \"displayName\": \"Kerberos Credentials Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"listing-strategy\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n+                                \"name\": \"kerberos-credentials-service\",\n+                                \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.kerberos.KerberosCredentialsService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n                             },\n-                            \"min-age\": {\n-                                \"defaultValue\": \"0 sec\",\n-                                \"description\": \"The minimum age a file must be in order to be considered; any files younger than this will be ignored.\",\n-                                \"displayName\": \"Minimum File Age\",\n+                            \"kerberos-password\": {\n+                                \"description\": \"The password to use when specifying the principal and password directly in the processor for authenticating to Solr via Kerberos.\",\n+                                \"displayName\": \"Kerberos Password\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"min-age\",\n-                                \"required\": true,\n+                                \"name\": \"kerberos-password\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n+                            },\n+                            \"kerberos-principal\": {\n+                                \"description\": \"The principal to use when specifying the principal and password directly in the processor for authenticating to Solr via Kerberos.\",\n+                                \"displayName\": \"Kerberos Principal\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"kerberos-principal\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"record-writer\": {\n-                                \"description\": \"Specifies the Record Writer to use for creating the listing. If not specified, one FlowFile will be created for each entity that is listed. If the Record Writer is specified, all entities will be written to a single FlowFile instead of adding attributes to individual FlowFiles.\",\n-                                \"displayName\": \"Record Writer\",\n+                            \"kerberos-user-service\": {\n+                                \"description\": \"Specifies the Kerberos User Controller Service that should be used for authenticating with Kerberos\",\n+                                \"displayName\": \"Kerberos User Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"record-writer\",\n+                                \"name\": \"kerberos-user-service\",\n                                 \"required\": false,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n                                     \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n+                                    \"type\": \"org.apache.nifi.kerberos.KerberosUserService\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             },\n-                            \"recursive-search\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"true\",\n-                                \"description\": \"When 'true', will include list of files from sub-folders. Otherwise, will return only files that are within the folder defined by the 'Folder ID' property.\",\n-                                \"displayName\": \"Search Recursively\",\n+                            \"put-solr-record-record-reader\": {\n+                                \"description\": \"Specifies the Controller Service to use for parsing incoming data and determining the data's schema.\",\n+                                \"displayName\": \"Record Reader\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"recursive-search\",\n+                                \"name\": \"put-solr-record-record-reader\",\n                                 \"required\": true,\n-                                \"sensitive\": false\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n                             }\n                         },\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.processors.box.FetchBoxFile\",\n-                            \"org.apache.nifi.processors.box.PutBoxFile\"\n-                        ],\n                         \"sideEffectFree\": false,\n-                        \"stateful\": {\n-                            \"description\": \"The processor stores necessary data to be able to keep track what files have been listed already. What exactly needs to be stored depends on the 'Listing Strategy'.\",\n-                            \"scopes\": [\n-                                \"CLUSTER\"\n-                            ]\n-                        },\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"All FlowFiles that are received are routed to success\",\n+                                \"description\": \"The original FlowFile\",\n                                 \"name\": \"success\"\n+                            },\n+                            {\n+                                \"description\": \"FlowFiles that failed for any reason other than Solr being unreachable\",\n+                                \"name\": \"failure\"\n+                            },\n+                            {\n+                                \"description\": \"FlowFiles that failed because Solr is unreachable\",\n+                                \"name\": \"connection_failure\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n                         \"supportsBatching\": false,\n-                        \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicProperties\": true,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"box\",\n-                            \"storage\"\n+                            \"Apache\",\n+                            \"Put\",\n+                            \"Record\",\n+                            \"Send\",\n+                            \"Solr\"\n                         ],\n-                        \"triggerSerially\": true,\n+                        \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.box.ListBoxFile\",\n-                        \"typeDescription\": \"Lists files in a Box folder. Each listed file may result in one FlowFile, the metadata being written as FlowFile attributes. Or - in case the 'Record Writer' property is set - the entire result is written as records to a single FlowFile. This Processor is designed to run on Primary Node only in a cluster. If the primary node changes, the new Primary Node will pick up where the previous node left off without duplicating all of the data.\",\n-                        \"version\": \"1.27.0\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"The id of the file\",\n-                                \"name\": \"box.id\"\n-                            },\n-                            {\n-                                \"description\": \"The name of the file\",\n-                                \"name\": \"filename\"\n-                            },\n-                            {\n-                                \"description\": \"The folder path where the file is located\",\n-                                \"name\": \"path\"\n-                            },\n-                            {\n-                                \"description\": \"The size of the file\",\n-                                \"name\": \"box.size\"\n-                            },\n-                            {\n-                                \"description\": \"The last modified time of the file\",\n-                                \"name\": \"box.timestamp\"\n-                            }\n-                        ]\n+                        \"type\": \"org.apache.nifi.processors.solr.PutSolrRecord\",\n+                        \"typeDescription\": \"Indexes the Records from a FlowFile into Solr\",\n+                        \"version\": \"1.27.0\"\n                     },\n                     {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-box-nar\",\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-solr-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n                         },\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"0 sec\"\n+                            \"TIMER_DRIVEN\": \"1 min\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n+                        \"deprecated\": true,\n+                        \"deprecationReason\": \"The SOLR processors are deprecated and will be removed in NiFi 2.x.\",\n+                        \"dynamicProperties\": [\n+                            {\n+                                \"description\": \"These parameters will be passed to Solr on the request\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"name\": \"A Solr request parameter name\",\n+                                \"value\": \"A Solr request parameter value\"\n+                            }\n+                        ],\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_REQUIRED\",\n+                        \"inputRequirement\": \"INPUT_ALLOWED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"box-client-service\": {\n-                                \"description\": \"Controller Service used to obtain a Box API connection.\",\n-                                \"displayName\": \"Box Client Service\",\n+                            \"Collection\": {\n+                                \"description\": \"The Solr collection name, only used with a Solr Type of Cloud\",\n+                                \"displayName\": \"Collection\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Collection\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Password\": {\n+                                \"description\": \"The password to use when Solr is configured with basic authentication.\",\n+                                \"displayName\": \"Basic Auth Password\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Password\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n+                            },\n+                            \"Record Writer\": {\n+                                \"description\": \"The Record Writer to use in order to write Solr documents to FlowFiles. Must be set if \\\"Records\\\" is used as return type.\",\n+                                \"displayName\": \"Record Writer\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Record Writer\",\n+                                \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"SSL Context Service\": {\n+                                \"description\": \"The Controller Service to use in order to obtain an SSL Context. This property must be set when communicating with a Solr over https.\",\n+                                \"displayName\": \"SSL Context Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"box-client-service\",\n-                                \"required\": true,\n+                                \"name\": \"SSL Context Service\",\n+                                \"required\": false,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-box-services-api-nar\",\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.box.controllerservices.BoxClientService\",\n+                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             },\n-                            \"box-folder-id\": {\n-                                \"description\": \"The ID of the folder where the file is uploaded. Please see Additional Details to obtain Folder ID.\",\n-                                \"displayName\": \"Folder ID\",\n+                            \"Solr Connection Timeout\": {\n+                                \"defaultValue\": \"10 seconds\",\n+                                \"description\": \"The amount of time to wait when establishing a connection to Solr. A value of 0 indicates an infinite timeout.\",\n+                                \"displayName\": \"Solr Connection Timeout\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"box-folder-id\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Solr Connection Timeout\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"chunked-upload-threshold\": {\n-                                \"defaultValue\": \"20 MB\",\n-                                \"description\": \"The maximum size of the content which is uploaded at once. FlowFiles larger than this threshold are uploaded in chunks. Chunked upload is allowed for files larger than 20 MB. It is recommended to use chunked upload for files exceeding 50 MB.\",\n-                                \"displayName\": \"Chunked Upload Threshold\",\n+                            \"Solr Location\": {\n+                                \"description\": \"The Solr url for a Solr Type of Standard (ex: http://localhost:8984/solr/gettingstarted), or the ZooKeeper hosts for a Solr Type of Cloud (ex: localhost:9983).\",\n+                                \"displayName\": \"Solr Location\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Solr Location\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Solr Maximum Connections\": {\n+                                \"defaultValue\": \"10\",\n+                                \"description\": \"The maximum number of total connections allowed from the Solr client to Solr.\",\n+                                \"displayName\": \"Solr Maximum Connections\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"chunked-upload-threshold\",\n-                                \"required\": false,\n+                                \"name\": \"Solr Maximum Connections\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"conflict-resolution-strategy\": {\n+                            \"Solr Maximum Connections Per Host\": {\n+                                \"defaultValue\": \"5\",\n+                                \"description\": \"The maximum number of connections allowed from the Solr client to a single Solr host.\",\n+                                \"displayName\": \"Solr Maximum Connections Per Host\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Solr Maximum Connections Per Host\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Solr Socket Timeout\": {\n+                                \"defaultValue\": \"10 seconds\",\n+                                \"description\": \"The amount of time to wait for data on a socket connection to Solr. A value of 0 indicates an infinite timeout.\",\n+                                \"displayName\": \"Solr Socket Timeout\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Solr Socket Timeout\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Solr Type\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Handle file conflict as failure.\",\n-                                        \"displayName\": \"fail\",\n-                                        \"value\": \"fail\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Ignore conflict, do not change the original file.\",\n-                                        \"displayName\": \"ignore\",\n-                                        \"value\": \"ignore\"\n+                                        \"description\": \"A SolrCloud instance.\",\n+                                        \"displayName\": \"Cloud\",\n+                                        \"value\": \"Cloud\"\n                                     },\n                                     {\n-                                        \"description\": \"Replace existing file in case of conflict.\",\n-                                        \"displayName\": \"replace\",\n-                                        \"value\": \"replace\"\n+                                        \"description\": \"A stand-alone Solr instance.\",\n+                                        \"displayName\": \"Standard\",\n+                                        \"value\": \"Standard\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"fail\",\n-                                \"description\": \"Indicates what should happen when a file with the same name already exists in the specified Box folder.\",\n-                                \"displayName\": \"Conflict Resolution Strategy\",\n+                                \"defaultValue\": \"Standard\",\n+                                \"description\": \"The type of Solr instance, Cloud or Standard.\",\n+                                \"displayName\": \"Solr Type\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"conflict-resolution-strategy\",\n+                                \"name\": \"Solr Type\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"create-folder\": {\n+                            \"Username\": {\n+                                \"description\": \"The username to use when Solr is configured with basic authentication.\",\n+                                \"displayName\": \"Basic Auth Username\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Username\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"ZooKeeper Client Timeout\": {\n+                                \"defaultValue\": \"10 seconds\",\n+                                \"description\": \"The amount of time to wait for data on a connection to ZooKeeper, only used with a Solr Type of Cloud.\",\n+                                \"displayName\": \"ZooKeeper Client Timeout\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"ZooKeeper Client Timeout\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"ZooKeeper Connection Timeout\": {\n+                                \"defaultValue\": \"10 seconds\",\n+                                \"description\": \"The amount of time to wait when establishing a connection to ZooKeeper, only used with a Solr Type of Cloud.\",\n+                                \"displayName\": \"ZooKeeper Connection Timeout\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"ZooKeeper Connection Timeout\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"amount_documents_to_return\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"displayName\": \"Entire results\",\n+                                        \"value\": \"return_all_results\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"displayName\": \"Only top results\",\n+                                        \"value\": \"return_only_top_results\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"false\",\n-                                \"dependencies\": [\n+                                \"defaultValue\": \"return_only_top_results\",\n+                                \"description\": \"Total amount of Solr documents to be returned. If this property is set to \\\"Only top results\\\", only single requests will be sent to Solr and the results will be written into single FlowFiles. If it is set to \\\"Entire results\\\", all results matching to the query are retrieved via multiple Solr requests and returned in multiple FlowFiles. For both options, the number of Solr documents to be returned in a FlowFile depends on the configuration of the \\\"Rows\\\" property\",\n+                                \"displayName\": \"Total amount of returned results\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"amount_documents_to_return\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"kerberos-credentials-service\": {\n+                                \"description\": \"Specifies the Kerberos Credentials Controller Service that should be used for authenticating with Kerberos\",\n+                                \"displayName\": \"Kerberos Credentials Service\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"kerberos-credentials-service\",\n+                                \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.kerberos.KerberosCredentialsService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"kerberos-password\": {\n+                                \"description\": \"The password to use when specifying the principal and password directly in the processor for authenticating to Solr via Kerberos.\",\n+                                \"displayName\": \"Kerberos Password\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"kerberos-password\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n+                            },\n+                            \"kerberos-principal\": {\n+                                \"description\": \"The principal to use when specifying the principal and password directly in the processor for authenticating to Solr via Kerberos.\",\n+                                \"displayName\": \"Kerberos Principal\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"kerberos-principal\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"kerberos-user-service\": {\n+                                \"description\": \"Specifies the Kerberos User Controller Service that should be used for authenticating with Kerberos\",\n+                                \"displayName\": \"Kerberos User Service\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"kerberos-user-service\",\n+                                \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.kerberos.KerberosUserService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"return_type\": {\n+                                \"allowableValues\": [\n                                     {\n-                                        \"propertyDisplayName\": \"Subfolder Name\",\n-                                        \"propertyName\": \"subfolder-name\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"XML\",\n+                                        \"value\": \"XML\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Records\",\n+                                        \"value\": \"Records\"\n                                     }\n                                 ],\n-                                \"description\": \"Specifies whether to check if the subfolder exists and to automatically create it if it does not. Permission to list folders is required. \",\n-                                \"displayName\": \"Create Subfolder\",\n+                                \"defaultValue\": \"XML\",\n+                                \"description\": \"Output format of Solr results. Write Solr documents to FlowFiles as XML or using a Record Writer\",\n+                                \"displayName\": \"Return Type\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"create-folder\",\n+                                \"name\": \"return_type\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"file-name\": {\n-                                \"defaultValue\": \"${filename}\",\n-                                \"description\": \"The name of the file to upload to the specified Box folder.\",\n-                                \"displayName\": \"Filename\",\n+                            \"solr_param_field_list\": {\n+                                \"description\": \"Comma separated list of fields to be included into results, e. g. field1,field2\",\n+                                \"displayName\": \"Field List\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"file-name\",\n+                                \"name\": \"solr_param_field_list\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"solr_param_query\": {\n+                                \"defaultValue\": \"*:*\",\n+                                \"description\": \"Solr Query, e. g. field:value\",\n+                                \"displayName\": \"Solr Query\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"solr_param_query\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"subfolder-name\": {\n-                                \"description\": \"The name (path) of the subfolder where files are uploaded. The subfolder name is relative to the folder specified by 'Folder ID'. Example: subFolder, subFolder1/subfolder2\",\n-                                \"displayName\": \"Subfolder Name\",\n+                            \"solr_param_request_handler\": {\n+                                \"defaultValue\": \"/select\",\n+                                \"description\": \"Define a request handler here, e. g. /query\",\n+                                \"displayName\": \"Request Handler\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"subfolder-name\",\n+                                \"name\": \"solr_param_request_handler\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"solr_param_rows\": {\n+                                \"description\": \"Number of results to be returned for a single request\",\n+                                \"displayName\": \"Rows\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"solr_param_rows\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"solr_param_sort\": {\n+                                \"description\": \"Comma separated sort clauses to define the sorting of results, e. g. field1 asc, field2 desc\",\n+                                \"displayName\": \"Sorting of result list\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"solr_param_sort\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"solr_param_start\": {\n+                                \"description\": \"Offset of result set\",\n+                                \"displayName\": \"Start of results\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"solr_param_start\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             }\n                         },\n-                        \"readsAttributes\": [\n-                            {\n-                                \"description\": \"Uses the FlowFile's filename as the filename for the Box object.\",\n-                                \"name\": \"filename\"\n-                            }\n-                        ],\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.processors.box.FetchBoxFile\",\n-                            \"org.apache.nifi.processors.box.ListBoxFile\"\n-                        ],\n                         \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"Files that have been successfully written to Box are transferred to this relationship.\",\n-                                \"name\": \"success\"\n+                                \"description\": \"Stats about Solr index\",\n+                                \"name\": \"stats\"\n                             },\n                             {\n-                                \"description\": \"Files that could not be written to Box for some reason are transferred to this relationship.\",\n+                                \"description\": \"Results of Solr queries\",\n+                                \"name\": \"results\"\n+                            },\n+                            {\n+                                \"description\": \"Results of faceted search\",\n+                                \"name\": \"facets\"\n+                            },\n+                            {\n+                                \"description\": \"Failure relationship\",\n                                 \"name\": \"failure\"\n+                            },\n+                            {\n+                                \"description\": \"Original flowfile\",\n+                                \"name\": \"original\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n                         \"supportsBatching\": false,\n-                        \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicProperties\": true,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"box\",\n-                            \"put\",\n-                            \"storage\"\n+                            \"Apache\",\n+                            \"Get\",\n+                            \"Query\",\n+                            \"Records\",\n+                            \"Solr\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.box.PutBoxFile\",\n-                        \"typeDescription\": \"Puts content to a Box folder.\",\n+                        \"type\": \"org.apache.nifi.processors.solr.QuerySolr\",\n+                        \"typeDescription\": \"Queries Solr and outputs the results as a FlowFile in the format of XML or using a Record Writer\",\n                         \"version\": \"1.27.0\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"The id of the file\",\n-                                \"name\": \"box.id\"\n+                                \"description\": \"Solr connect string\",\n+                                \"name\": \"solr.connect\"\n                             },\n                             {\n-                                \"description\": \"The name of the file\",\n-                                \"name\": \"filename\"\n+                                \"description\": \"Solr collection\",\n+                                \"name\": \"solr.collection\"\n                             },\n                             {\n-                                \"description\": \"The folder path where the file is located\",\n-                                \"name\": \"path\"\n+                                \"description\": \"Query string sent to Solr\",\n+                                \"name\": \"solr.query\"\n                             },\n                             {\n-                                \"description\": \"The size of the file\",\n-                                \"name\": \"box.size\"\n+                                \"description\": \"Cursor mark can be used for scrolling Solr\",\n+                                \"name\": \"solr.cursor.mark\"\n                             },\n                             {\n-                                \"description\": \"The last modified time of the file\",\n-                                \"name\": \"box.timestamp\"\n+                                \"description\": \"Status code of Solr request. A status code of 0 indicates that the request was successfully processed\",\n+                                \"name\": \"solr.status.code\"\n                             },\n                             {\n-                                \"description\": \"The error code returned by Box\",\n-                                \"name\": \"error.code\"\n+                                \"description\": \"The elapsed time to process the query (in ms)\",\n+                                \"name\": \"solr.query.time\"\n                             },\n                             {\n-                                \"description\": \"The error message returned by Box\",\n-                                \"name\": \"error.message\"\n+                                \"description\": \"Solr start parameter (result offset) for the query\",\n+                                \"name\": \"solr.start\"\n+                            },\n+                            {\n+                                \"description\": \"Number of Solr documents to be returned for the query\",\n+                                \"name\": \"solr.rows\"\n+                            },\n+                            {\n+                                \"description\": \"Number of Solr documents that match the query\",\n+                                \"name\": \"solr.number.results\"\n+                            },\n+                            {\n+                                \"description\": \"The mime type of the data format\",\n+                                \"name\": \"mime.type\"\n+                            },\n+                            {\n+                                \"description\": \"The Java exception class raised when the processor fails\",\n+                                \"name\": \"querysolr.exeption.class\"\n+                            },\n+                            {\n+                                \"description\": \"The Java exception message raised when the processor fails\",\n+                                \"name\": \"querysolr.exeption.message\"\n                             }\n                         ]\n                     }\n                 ],\n                 \"reportingTasks\": []\n             },\n             \"group\": \"org.apache.nifi\",\n             \"version\": \"1.27.0\"\n         },\n         {\n-            \"artifact\": \"nifi-kerberos-user-service-nar\",\n+            \"artifact\": \"nifi-asana-services-api-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [],\n+                \"processors\": [],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"1.27.0\"\n+        },\n+        {\n+            \"artifact\": \"nifi-metrics-reporting-nar\",\n             \"componentManifest\": {\n                 \"controllerServices\": [\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-kerberos-user-service-nar\",\n+                        \"artifact\": \"nifi-metrics-reporting-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n-                        \"explicitRestrictions\": [\n-                            {\n-                                \"explanation\": \"Allows user to define a Keytab and principal that can then be used by other components.\",\n-                                \"requiredPermission\": \"access keytab\"\n-                            }\n-                        ],\n+                        \"deprecated\": true,\n+                        \"deprecationReason\": \"Unmaintained and planned for removal in version 2.0\",\n                         \"group\": \"org.apache.nifi\",\n                         \"propertyDescriptors\": {\n-                            \"Kerberos Keytab\": {\n-                                \"description\": \"Kerberos keytab associated with the principal.\",\n-                                \"displayName\": \"Kerberos Keytab\",\n+                            \"charset\": {\n+                                \"defaultValue\": \"UTF-8\",\n+                                \"description\": \"The charset used by the graphite server\",\n+                                \"displayName\": \"Charset\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"charset\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"host\": {\n+                                \"description\": \"The hostname of the carbon listener\",\n+                                \"displayName\": \"Host\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Kerberos Keytab\",\n+                                \"name\": \"host\",\n                                 \"required\": true,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"SINGLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\"\n-                                    ]\n-                                },\n                                 \"sensitive\": false\n                             },\n-                            \"Kerberos Principal\": {\n-                                \"description\": \"Kerberos principal to authenticate as. Requires nifi.kerberos.krb5.file to be set in your nifi.properties\",\n-                                \"displayName\": \"Kerberos Principal\",\n+                            \"metric name prefix\": {\n+                                \"defaultValue\": \"nifi\",\n+                                \"description\": \"A prefix that will be used for all metric names sent by reporters provided by this service.\",\n+                                \"displayName\": \"Metric Name Prefix\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Kerberos Principal\",\n+                                \"name\": \"metric name prefix\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"port\": {\n+                                \"description\": \"The port on which carbon listens\",\n+                                \"displayName\": \"Port\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"port\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             }\n                         },\n                         \"providedApiImplementations\": [\n                             {\n-                                \"artifact\": \"nifi-standard-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.kerberos.KerberosUserService\",\n-                                \"version\": \"1.27.0\"\n-                            },\n-                            {\n-                                \"artifact\": \"nifi-standard-services-api-nar\",\n+                                \"artifact\": \"nifi-metrics-reporter-service-api-nar\",\n                                 \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.kerberos.SelfContainedKerberosUserService\",\n+                                \"type\": \"org.apache.nifi.metrics.reporting.reporter.service.MetricReporterService\",\n                                 \"version\": \"1.27.0\"\n                             }\n                         ],\n-                        \"restricted\": true,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"Authentication\",\n-                            \"Credentials\",\n-                            \"Kerberos\",\n-                            \"Keytab\",\n-                            \"Principal\",\n-                            \"Security\"\n+                            \"graphite\",\n+                            \"metrics\",\n+                            \"reporting\"\n                         ],\n-                        \"type\": \"org.apache.nifi.kerberos.KerberosKeytabUserService\",\n-                        \"typeDescription\": \"Provides a mechanism for creating a KerberosUser from a principal and keytab that other components are able to use in order to perform authentication using Kerberos. By encapsulating this information into a Controller Service and allowing other components to make use of it (as opposed to specifying the principal and keytab directly in the processor) an administrator is able to choose which users are allowed to use which keytabs and principals. This provides a more robust security model for multi-tenant use cases.\",\n+                        \"type\": \"org.apache.nifi.metrics.reporting.reporter.service.GraphiteMetricReporterService\",\n+                        \"typeDescription\": \"A controller service that provides metric reporters for graphite. Used by MetricsReportingTask.\",\n                         \"version\": \"1.27.0\"\n-                    },\n+                    }\n+                ],\n+                \"processors\": [],\n+                \"reportingTasks\": [\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-kerberos-user-service-nar\",\n+                        \"artifact\": \"nifi-metrics-reporting-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n+                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": \"* * * * * ?\",\n+                            \"TIMER_DRIVEN\": \"0 sec\"\n+                        },\n+                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n+                        \"deprecated\": true,\n+                        \"deprecationReason\": \"Unmaintained and planned for removal in version 2.0\",\n                         \"group\": \"org.apache.nifi\",\n                         \"propertyDescriptors\": {\n-                            \"Kerberos Password\": {\n-                                \"description\": \"Kerberos password associated with the principal.\",\n-                                \"displayName\": \"Kerberos Password\",\n+                            \"metric reporter service\": {\n+                                \"description\": \"The service that provides a reporter for the gathered metrics\",\n+                                \"displayName\": \"Metric Reporter Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Kerberos Password\",\n+                                \"name\": \"metric reporter service\",\n                                 \"required\": true,\n-                                \"sensitive\": true\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-metrics-reporter-service-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.metrics.reporting.reporter.service.MetricReporterService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n                             },\n-                            \"Kerberos Principal\": {\n-                                \"description\": \"Kerberos principal to authenticate as. Requires nifi.kerberos.krb5.file to be set in your nifi.properties\",\n-                                \"displayName\": \"Kerberos Principal\",\n+                            \"process group id\": {\n+                                \"description\": \"The id of the process group to report. If not specified, metrics of the root process groupare reported.\",\n+                                \"displayName\": \"Process Group ID\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Kerberos Principal\",\n-                                \"required\": true,\n+                                \"name\": \"process group id\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             }\n                         },\n-                        \"providedApiImplementations\": [\n-                            {\n-                                \"artifact\": \"nifi-standard-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.kerberos.KerberosUserService\",\n-                                \"version\": \"1.27.0\"\n-                            }\n+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\"\n                         ],\n                         \"supportsDynamicProperties\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"Authentication\",\n-                            \"Credentials\",\n-                            \"Kerberos\",\n-                            \"Password\",\n-                            \"Principal\",\n-                            \"Security\"\n+                            \"metrics\",\n+                            \"reporting\"\n                         ],\n-                        \"type\": \"org.apache.nifi.kerberos.KerberosPasswordUserService\",\n-                        \"typeDescription\": \"Provides a mechanism for creating a KerberosUser from a principal and password that other components are able to use in order to perform authentication using Kerberos.\",\n+                        \"type\": \"org.apache.nifi.metrics.reporting.task.MetricsReportingTask\",\n+                        \"typeDescription\": \"This reporting task reports a set of metrics regarding the JVM and the NiFi instanceto a reporter. The reporter is provided by a MetricReporterService. It can be optionally used for a specificprocess group if a property with the group id is provided.\",\n                         \"version\": \"1.27.0\"\n-                    },\n+                    }\n+                ]\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"1.27.0\"\n+        },\n+        {\n+            \"artifact\": \"nifi-scripting-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-kerberos-user-service-nar\",\n+                        \"artifact\": \"nifi-scripting-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n+                        \"dynamicProperties\": [\n+                            {\n+                                \"description\": \"Updates a script engine property specified by the Dynamic Property's key with the value specified by the Dynamic Property's value\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"name\": \"Script Engine Binding property\",\n+                                \"value\": \"Binding property value passed to Script Runner\"\n+                            }\n+                        ],\n                         \"explicitRestrictions\": [\n                             {\n-                                \"explanation\": \"Allows user to define a ticket cache and principal that can then be used by other components.\",\n-                                \"requiredPermission\": \"access ticket cache\"\n+                                \"explanation\": \"Provides operator the ability to execute arbitrary code assuming all permissions that NiFi has.\",\n+                                \"requiredPermission\": \"execute code\"\n                             }\n                         ],\n                         \"group\": \"org.apache.nifi\",\n                         \"propertyDescriptors\": {\n-                            \"Kerberos Principal\": {\n-                                \"description\": \"Kerberos principal to authenticate as. Requires nifi.kerberos.krb5.file to be set in your nifi.properties\",\n-                                \"displayName\": \"Kerberos Principal\",\n+                            \"Module Directory\": {\n+                                \"description\": \"Comma-separated list of paths to files and/or directories which contain modules required by the script.\",\n+                                \"displayName\": \"Module Directory\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Kerberos Principal\",\n+                                \"name\": \"Module Directory\",\n+                                \"required\": false,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"MULTIPLE\",\n+                                    \"resourceTypes\": [\n+                                        \"DIRECTORY\",\n+                                        \"FILE\"\n+                                    ]\n+                                },\n+                                \"sensitive\": false\n+                            },\n+                            \"Script Body\": {\n+                                \"description\": \"Body of script to execute. Only one of Script File or Script Body may be used\",\n+                                \"displayName\": \"Script Body\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Script Body\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Script Engine\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"ECMAScript ECMA - 262 Edition 5.1 [Oracle Nashorn 1.8.0_422]\",\n+                                        \"displayName\": \"ECMAScript DEPRECATED\",\n+                                        \"value\": \"ECMAScript\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Groovy 3.0.21 [Groovy Scripting Engine 2.0]\",\n+                                        \"displayName\": \"Groovy\",\n+                                        \"value\": \"Groovy\"\n+                                    },\n+                                    {\n+                                        \"description\": \"ruby jruby 9.4.2.0 [JSR 223 JRuby Engine 9.4.2.0]\",\n+                                        \"displayName\": \"ruby DEPRECATED\",\n+                                        \"value\": \"ruby\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"ECMAScript\",\n+                                \"description\": \"Language Engine for executing scripts\",\n+                                \"displayName\": \"Script Engine\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Script Engine\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Kerberos Ticket Cache File\": {\n-                                \"description\": \"Kerberos ticket cache associated with the principal.\",\n-                                \"displayName\": \"Kerberos Ticket Cache File\",\n+                            \"Script File\": {\n+                                \"description\": \"Path to script file to execute. Only one of Script File or Script Body may be used\",\n+                                \"displayName\": \"Script File\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Kerberos Ticket Cache File\",\n-                                \"required\": true,\n+                                \"name\": \"Script File\",\n+                                \"required\": false,\n                                 \"resourceDefinition\": {\n                                     \"cardinality\": \"SINGLE\",\n                                     \"resourceTypes\": [\n                                         \"FILE\"\n                                     ]\n                                 },\n                                 \"sensitive\": false\n                             }\n                         },\n                         \"providedApiImplementations\": [\n                             {\n                                 \"artifact\": \"nifi-standard-services-api-nar\",\n                                 \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.kerberos.KerberosUserService\",\n-                                \"version\": \"1.27.0\"\n-                            },\n-                            {\n-                                \"artifact\": \"nifi-standard-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.kerberos.SelfContainedKerberosUserService\",\n+                                \"type\": \"org.apache.nifi.lookup.LookupService\",\n                                 \"version\": \"1.27.0\"\n                             }\n                         ],\n                         \"restricted\": true,\n-                        \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicProperties\": true,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"Authentication\",\n-                            \"Cache\",\n-                            \"Credentials\",\n-                            \"Kerberos\",\n-                            \"Principal\",\n-                            \"Security\",\n-                            \"Ticket\"\n+                            \"groovy\",\n+                            \"invoke\",\n+                            \"javascript\",\n+                            \"jruby\",\n+                            \"js\",\n+                            \"jython\",\n+                            \"lookup\",\n+                            \"lua\",\n+                            \"luaj\",\n+                            \"python\",\n+                            \"record\",\n+                            \"ruby\",\n+                            \"script\"\n                         ],\n-                        \"type\": \"org.apache.nifi.kerberos.KerberosTicketCacheUserService\",\n-                        \"typeDescription\": \"Provides a mechanism for creating a KerberosUser from a principal and ticket cache that other components are able to use in order to perform authentication using Kerberos. By encapsulating this information into a Controller Service and allowing other components to make use of it an administrator is able to choose which users are allowed to use which ticket caches and principals. This provides a more robust security model for multi-tenant use cases.\",\n+                        \"type\": \"org.apache.nifi.lookup.script.ScriptedLookupService\",\n+                        \"typeDescription\": \"Allows the user to provide a scripted LookupService instance in order to enrich records from an incoming flow file. Please note, that due to a bug in Jython that remains unresolved, it is not possible to use Jython to write a script for this service in Python.\",\n                         \"version\": \"1.27.0\"\n-                    }\n-                ],\n-                \"processors\": [],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"1.27.0\"\n-        },\n-        {\n-            \"artifact\": \"nifi-jolt-record-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [],\n-                \"processors\": [\n+                    },\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-jolt-record-nar\",\n+                        \"artifact\": \"nifi-scripting-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n-                        \"defaultBulletinLevel\": \"WARN\",\n-                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": 1,\n-                            \"EVENT_DRIVEN\": 0,\n-                            \"TIMER_DRIVEN\": 1\n-                        },\n-                        \"defaultPenaltyDuration\": \"30 sec\",\n-                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"0 sec\"\n-                        },\n-                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n-                        \"defaultYieldDuration\": \"1 sec\",\n+                        \"dynamicProperties\": [\n+                            {\n+                                \"description\": \"Updates a script engine property specified by the Dynamic Property's key with the value specified by the Dynamic Property's value\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"name\": \"Script Engine Binding property\",\n+                                \"value\": \"Binding property value passed to Script Runner\"\n+                            }\n+                        ],\n+                        \"explicitRestrictions\": [\n+                            {\n+                                \"explanation\": \"Provides operator the ability to execute arbitrary code assuming all permissions that NiFi has.\",\n+                                \"requiredPermission\": \"execute code\"\n+                            }\n+                        ],\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_REQUIRED\",\n-                        \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"jolt-record-custom-class\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"jolt-transform-custom\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Jolt Transformation DSL\",\n-                                        \"propertyName\": \"jolt-record-transform\"\n-                                    }\n-                                ],\n-                                \"description\": \"Fully Qualified Class Name for Custom Transformation\",\n-                                \"displayName\": \"Custom Transformation Class Name\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"jolt-record-custom-class\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"jolt-record-custom-modules\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"jolt-transform-custom\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Jolt Transformation DSL\",\n-                                        \"propertyName\": \"jolt-record-transform\"\n-                                    }\n-                                ],\n-                                \"description\": \"Comma-separated list of paths to files and/or directories which contain modules containing custom transformations (that are not included on NiFi's classpath).\",\n-                                \"displayName\": \"Custom Module Directory\",\n+                            \"Module Directory\": {\n+                                \"description\": \"Comma-separated list of paths to files and/or directories which contain modules required by the script.\",\n+                                \"displayName\": \"Module Directory\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"jolt-record-custom-modules\",\n+                                \"name\": \"Module Directory\",\n                                 \"required\": false,\n                                 \"resourceDefinition\": {\n                                     \"cardinality\": \"MULTIPLE\",\n                                     \"resourceTypes\": [\n-                                        \"FILE\",\n-                                        \"DIRECTORY\"\n+                                        \"DIRECTORY\",\n+                                        \"FILE\"\n                                     ]\n                                 },\n                                 \"sensitive\": false\n                             },\n-                            \"jolt-record-record-reader\": {\n-                                \"description\": \"Specifies the Controller Service to use for parsing incoming data and determining the data's schema.\",\n-                                \"displayName\": \"Record Reader\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"jolt-record-record-reader\",\n-                                \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            },\n-                            \"jolt-record-record-writer\": {\n-                                \"description\": \"Specifies the Controller Service to use for writing out the records\",\n-                                \"displayName\": \"Record Writer\",\n+                            \"Script Body\": {\n+                                \"description\": \"Body of script to execute. Only one of Script File or Script Body may be used\",\n+                                \"displayName\": \"Script Body\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"jolt-record-record-writer\",\n-                                \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            },\n-                            \"jolt-record-spec\": {\n-                                \"description\": \"Jolt Specification for transform of record data. The value for this property may be the text of a JOLT specification or the path to a file containing a JOLT specification. This value is ignored if the Jolt Sort Transformation is selected.\",\n-                                \"displayName\": \"Jolt Specification\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"jolt-record-spec\",\n+                                \"name\": \"Script Body\",\n                                 \"required\": false,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"SINGLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\",\n-                                        \"TEXT\"\n-                                    ]\n-                                },\n                                 \"sensitive\": false\n                             },\n-                            \"jolt-record-transform\": {\n+                            \"Script Engine\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Change the cardinality of input elements to create the output.\",\n-                                        \"displayName\": \"Cardinality\",\n-                                        \"value\": \"jolt-transform-card\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Execute list of Jolt transformations.\",\n-                                        \"displayName\": \"Chain\",\n-                                        \"value\": \"jolt-transform-chain\"\n-                                    },\n-                                    {\n-                                        \"description\": \" Apply default values to the output.\",\n-                                        \"displayName\": \"Default\",\n-                                        \"value\": \"jolt-transform-default\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Writes when field name is missing or value is null\",\n-                                        \"displayName\": \"Modify - Default\",\n-                                        \"value\": \"jolt-transform-modify-default\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Writes when key is missing\",\n-                                        \"displayName\": \"Modify - Define\",\n-                                        \"value\": \"jolt-transform-modify-define\"\n-                                    },\n-                                    {\n-                                        \"description\": \" Always overwrite value\",\n-                                        \"displayName\": \"Modify - Overwrite\",\n-                                        \"value\": \"jolt-transform-modify-overwrite\"\n-                                    },\n-                                    {\n-                                        \"description\": \" Remove values from input data to create the output.\",\n-                                        \"displayName\": \"Remove\",\n-                                        \"value\": \"jolt-transform-remove\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Shift input data to create the output.\",\n-                                        \"displayName\": \"Shift\",\n-                                        \"value\": \"jolt-transform-shift\"\n+                                        \"description\": \"ECMAScript ECMA - 262 Edition 5.1 [Oracle Nashorn 1.8.0_422]\",\n+                                        \"displayName\": \"ECMAScript DEPRECATED\",\n+                                        \"value\": \"ECMAScript\"\n                                     },\n                                     {\n-                                        \"description\": \"Sort input field name values alphabetically. Any specification set is ignored.\",\n-                                        \"displayName\": \"Sort\",\n-                                        \"value\": \"jolt-transform-sort\"\n+                                        \"description\": \"Groovy 3.0.21 [Groovy Scripting Engine 2.0]\",\n+                                        \"displayName\": \"Groovy\",\n+                                        \"value\": \"Groovy\"\n                                     },\n                                     {\n-                                        \"description\": \"Custom Transformation. Requires Custom Transformation Class Name\",\n-                                        \"displayName\": \"Custom\",\n-                                        \"value\": \"jolt-transform-custom\"\n+                                        \"description\": \"ruby jruby 9.4.2.0 [JSR 223 JRuby Engine 9.4.2.0]\",\n+                                        \"displayName\": \"ruby DEPRECATED\",\n+                                        \"value\": \"ruby\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"jolt-transform-chain\",\n-                                \"description\": \"Specifies the Jolt Transformation that should be used with the provided specification.\",\n-                                \"displayName\": \"Jolt Transformation DSL\",\n+                                \"defaultValue\": \"ECMAScript\",\n+                                \"description\": \"Language Engine for executing scripts\",\n+                                \"displayName\": \"Script Engine\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"jolt-record-transform\",\n+                                \"name\": \"Script Engine\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"jolt-record-transform-cache-size\": {\n-                                \"defaultValue\": \"1\",\n-                                \"description\": \"Compiling a Jolt Transform can be fairly expensive. Ideally, this will be done only once. However, if the Expression Language is used in the transform, we may need a new Transform for each FlowFile. This value controls how many of those Transforms we cache in memory in order to avoid having to compile the Transform each time.\",\n-                                \"displayName\": \"Transform Cache Size\",\n+                            \"Script File\": {\n+                                \"description\": \"Path to script file to execute. Only one of Script File or Script Body may be used\",\n+                                \"displayName\": \"Script File\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"jolt-record-transform-cache-size\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Script File\",\n+                                \"required\": false,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"SINGLE\",\n+                                    \"resourceTypes\": [\n+                                        \"FILE\"\n+                                    ]\n+                                },\n                                 \"sensitive\": false\n                             }\n                         },\n-                        \"sideEffectFree\": true,\n-                        \"supportedRelationships\": [\n-                            {\n-                                \"description\": \"The FlowFile with transformed content will be routed to this relationship\",\n-                                \"name\": \"success\"\n-                            },\n+                        \"providedApiImplementations\": [\n                             {\n-                                \"description\": \"If a FlowFile fails processing for any reason (for example, the FlowFile records cannot be parsed), it will be routed to this relationship\",\n-                                \"name\": \"failure\"\n+                                \"artifact\": \"nifi-standard-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.lookup.StringLookupService\",\n+                                \"version\": \"1.27.0\"\n                             },\n                             {\n-                                \"description\": \"The original FlowFile that was transformed. If the FlowFile fails processing, nothing will be sent to this relationship\",\n-                                \"name\": \"original\"\n+                                \"artifact\": \"nifi-standard-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.lookup.LookupService\",\n+                                \"version\": \"1.27.0\"\n                             }\n                         ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\",\n-                            \"EVENT_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": true,\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": true,\n+                        \"restricted\": true,\n+                        \"supportsDynamicProperties\": true,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"cardinality\",\n-                            \"chainr\",\n-                            \"defaultr\",\n-                            \"jolt\",\n-                            \"record\",\n-                            \"removr\",\n-                            \"shiftr\",\n-                            \"sort\",\n-                            \"transform\"\n+                            \"groovy\",\n+                            \"invoke\",\n+                            \"javascript\",\n+                            \"jruby\",\n+                            \"js\",\n+                            \"jython\",\n+                            \"lookup\",\n+                            \"lua\",\n+                            \"luaj\",\n+                            \"python\",\n+                            \"ruby\",\n+                            \"script\"\n                         ],\n-                        \"triggerSerially\": false,\n-                        \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.jolt.record.JoltTransformRecord\",\n-                        \"typeDescription\": \"Applies a JOLT specification to each record in the FlowFile payload. A new FlowFile is created with transformed content and is routed to the 'success' relationship. If the transform fails, the original FlowFile is routed to the 'failure' relationship.\",\n-                        \"version\": \"1.27.0\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"The number of records in an outgoing FlowFile\",\n-                                \"name\": \"record.count\"\n-                            },\n-                            {\n-                                \"description\": \"The MIME Type that the configured Record Writer indicates is appropriate\",\n-                                \"name\": \"mime.type\"\n-                            }\n-                        ]\n-                    }\n-                ],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"1.27.0\"\n-        },\n-        {\n-            \"artifact\": \"nifi-provenance-repository-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [],\n-                \"processors\": [],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"1.27.0\"\n-        },\n-        {\n-            \"artifact\": \"nifi-hadoop-dbcp-service-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [\n+                        \"type\": \"org.apache.nifi.lookup.script.SimpleScriptedLookupService\",\n+                        \"typeDescription\": \"Allows the user to provide a scripted LookupService instance in order to enrich records from an incoming flow file. The script is expected to return an optional string value rather than an arbitrary object (record, e.g.). Also the scripted lookup service should implement StringLookupService, otherwise the getValueType() method must be implemented even though it will be ignored, as SimpleScriptedLookupService returns String as the value type on the script's behalf. Please note that due to a bug in Jython that remains unresolved, it is not possible to use Jython to write a script for this service in Python.\",\n+                        \"version\": \"1.27.0\"\n+                    },\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-hadoop-dbcp-service-nar\",\n+                        \"artifact\": \"nifi-scripting-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"dynamicProperties\": [\n                             {\n-                                \"description\": \"These properties will be set on the Hadoop configuration after loading any provided configuration files.\",\n+                                \"description\": \"Updates a script engine property specified by the Dynamic Property's key with the value specified by the Dynamic Property's value\",\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"name\": \"The name of a Hadoop configuration property.\",\n-                                \"value\": \"The value of the given Hadoop configuration property.\"\n+                                \"name\": \"Script Engine Binding property\",\n+                                \"value\": \"Binding property value passed to Script Runner\"\n                             }\n                         ],\n                         \"explicitRestrictions\": [\n                             {\n-                                \"explanation\": \"Database Driver Location can reference resources over HTTP\",\n-                                \"requiredPermission\": \"reference remote resources\"\n+                                \"explanation\": \"Provides operator the ability to execute arbitrary code assuming all permissions that NiFi has.\",\n+                                \"requiredPermission\": \"execute code\"\n                             }\n                         ],\n                         \"group\": \"org.apache.nifi\",\n                         \"propertyDescriptors\": {\n-                            \"Database Connection URL\": {\n-                                \"description\": \"A database connection URL used to connect to a database. May contain database system name, host, port, database name and some parameters. The exact syntax of a database connection URL is specified by your DBMS.\",\n-                                \"displayName\": \"Database Connection URL\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Database Connection URL\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Database Driver Class Name\": {\n-                                \"description\": \"Database driver class name\",\n-                                \"displayName\": \"Database Driver Class Name\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Database Driver Class Name\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Database User\": {\n-                                \"description\": \"Database user name\",\n-                                \"displayName\": \"Database User\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Database User\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Kerberos Keytab\": {\n-                                \"description\": \"Kerberos keytab associated with the principal. Requires nifi.kerberos.krb5.file to be set in your nifi.properties\",\n-                                \"displayName\": \"Kerberos Keytab\",\n+                            \"Module Directory\": {\n+                                \"description\": \"Comma-separated list of paths to files and/or directories which contain modules required by the script.\",\n+                                \"displayName\": \"Module Directory\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Kerberos Keytab\",\n+                                \"name\": \"Module Directory\",\n                                 \"required\": false,\n                                 \"resourceDefinition\": {\n-                                    \"cardinality\": \"SINGLE\",\n+                                    \"cardinality\": \"MULTIPLE\",\n                                     \"resourceTypes\": [\n+                                        \"DIRECTORY\",\n                                         \"FILE\"\n                                     ]\n                                 },\n                                 \"sensitive\": false\n                             },\n-                            \"Kerberos Password\": {\n-                                \"description\": \"Kerberos password associated with the principal.\",\n-                                \"displayName\": \"Kerberos Password\",\n+                            \"Script Body\": {\n+                                \"description\": \"Body of script to execute. Only one of Script File or Script Body may be used\",\n+                                \"displayName\": \"Script Body\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Kerberos Password\",\n-                                \"required\": false,\n-                                \"sensitive\": true\n-                            },\n-                            \"Kerberos Principal\": {\n-                                \"description\": \"Kerberos principal to authenticate as. Requires nifi.kerberos.krb5.file to be set in your nifi.properties\",\n-                                \"displayName\": \"Kerberos Principal\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Kerberos Principal\",\n+                                \"name\": \"Script Body\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Max Total Connections\": {\n-                                \"defaultValue\": \"8\",\n-                                \"description\": \"The maximum number of active connections that can be allocated from this pool at the same time,  or negative for no limit.\",\n-                                \"displayName\": \"Max Total Connections\",\n+                            \"Script Engine\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"ECMAScript ECMA - 262 Edition 5.1 [Oracle Nashorn 1.8.0_422]\",\n+                                        \"displayName\": \"ECMAScript DEPRECATED\",\n+                                        \"value\": \"ECMAScript\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Groovy 3.0.21 [Groovy Scripting Engine 2.0]\",\n+                                        \"displayName\": \"Groovy\",\n+                                        \"value\": \"Groovy\"\n+                                    },\n+                                    {\n+                                        \"description\": \"python 2.7 [jython 2.7.3]\",\n+                                        \"displayName\": \"python DEPRECATED\",\n+                                        \"value\": \"python\"\n+                                    },\n+                                    {\n+                                        \"description\": \"ruby jruby 9.4.2.0 [JSR 223 JRuby Engine 9.4.2.0]\",\n+                                        \"displayName\": \"ruby DEPRECATED\",\n+                                        \"value\": \"ruby\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"ECMAScript\",\n+                                \"description\": \"Language Engine for executing scripts\",\n+                                \"displayName\": \"Script Engine\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Max Total Connections\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Script Engine\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Max Wait Time\": {\n-                                \"defaultValue\": \"500 millis\",\n-                                \"description\": \"The maximum amount of time that the pool will wait (when there are no available connections)  for a connection to be returned before failing, or -1 to wait indefinitely. \",\n-                                \"displayName\": \"Max Wait Time\",\n+                            \"Script File\": {\n+                                \"description\": \"Path to script file to execute. Only one of Script File or Script Body may be used\",\n+                                \"displayName\": \"Script File\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Max Wait Time\",\n-                                \"required\": true,\n+                                \"name\": \"Script File\",\n+                                \"required\": false,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"SINGLE\",\n+                                    \"resourceTypes\": [\n+                                        \"FILE\"\n+                                    ]\n+                                },\n                                 \"sensitive\": false\n-                            },\n-                            \"Password\": {\n-                                \"description\": \"The password for the database user\",\n-                                \"displayName\": \"Password\",\n-                                \"dynamic\": false,\n+                            }\n+                        },\n+                        \"providedApiImplementations\": [\n+                            {\n+                                \"artifact\": \"nifi-standard-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n+                                \"version\": \"1.27.0\"\n+                            }\n+                        ],\n+                        \"restricted\": true,\n+                        \"supportsDynamicProperties\": true,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"groovy\",\n+                            \"invoke\",\n+                            \"javascript\",\n+                            \"jruby\",\n+                            \"js\",\n+                            \"jython\",\n+                            \"lua\",\n+                            \"luaj\",\n+                            \"python\",\n+                            \"record\",\n+                            \"recordFactory\",\n+                            \"ruby\",\n+                            \"script\"\n+                        ],\n+                        \"type\": \"org.apache.nifi.record.script.ScriptedReader\",\n+                        \"typeDescription\": \"Allows the user to provide a scripted RecordReaderFactory instance in order to read/parse/generate records from an incoming flow file.\",\n+                        \"version\": \"1.27.0\"\n+                    },\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-scripting-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"e0c4461\"\n+                        },\n+                        \"dynamicProperties\": [\n+                            {\n+                                \"description\": \"Updates a script engine property specified by the Dynamic Property's key with the value specified by the Dynamic Property's value\",\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Password\",\n-                                \"required\": false,\n-                                \"sensitive\": true\n-                            },\n-                            \"Validation-query\": {\n-                                \"description\": \"Validation query used to validate connections before returning them. When connection is invalid, it gets dropped and new valid connection will be returned. Note!! Using validation might have some performance penalty.\",\n-                                \"displayName\": \"Validation query\",\n+                                \"name\": \"Script Engine Binding property\",\n+                                \"value\": \"Binding property value passed to Script Runner\"\n+                            }\n+                        ],\n+                        \"explicitRestrictions\": [\n+                            {\n+                                \"explanation\": \"Provides operator the ability to execute arbitrary code assuming all permissions that NiFi has.\",\n+                                \"requiredPermission\": \"execute code\"\n+                            }\n+                        ],\n+                        \"group\": \"org.apache.nifi\",\n+                        \"propertyDescriptors\": {\n+                            \"Module Directory\": {\n+                                \"description\": \"Comma-separated list of paths to files and/or directories which contain modules required by the script.\",\n+                                \"displayName\": \"Module Directory\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Validation-query\",\n+                                \"name\": \"Module Directory\",\n                                 \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"database-driver-locations\": {\n-                                \"description\": \"Comma-separated list of files/folders and/or URLs containing the driver JAR and its dependencies. For example '/var/tmp/phoenix-client.jar'. NOTE: It is required that the resources specified by this property provide the classes from hadoop-common, such as Configuration and UserGroupInformation.\",\n-                                \"displayName\": \"Database Driver Location(s)\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"database-driver-locations\",\n-                                \"required\": true,\n                                 \"resourceDefinition\": {\n                                     \"cardinality\": \"MULTIPLE\",\n                                     \"resourceTypes\": [\n-                                        \"FILE\",\n                                         \"DIRECTORY\",\n-                                        \"URL\"\n+                                        \"FILE\"\n                                     ]\n                                 },\n                                 \"sensitive\": false\n                             },\n-                            \"dbcp-max-conn-lifetime\": {\n-                                \"defaultValue\": \"-1\",\n-                                \"description\": \"The maximum lifetime of a connection. After this time is exceeded the connection will fail the next activation, passivation or validation test. A value of zero or less means the connection has an infinite lifetime.\",\n-                                \"displayName\": \"Max Connection Lifetime\",\n+                            \"Script Body\": {\n+                                \"description\": \"Body of script to execute. Only one of Script File or Script Body may be used\",\n+                                \"displayName\": \"Script Body\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"dbcp-max-conn-lifetime\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Script Body\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"dbcp-max-idle-conns\": {\n-                                \"defaultValue\": \"8\",\n-                                \"description\": \"The maximum number of connections that can remain idle in the pool without extra ones being released. Set to any negative value to allow unlimited idle connections.\",\n-                                \"displayName\": \"Max Idle Connections\",\n+                            \"Script Engine\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"ECMAScript ECMA - 262 Edition 5.1 [Oracle Nashorn 1.8.0_422]\",\n+                                        \"displayName\": \"ECMAScript DEPRECATED\",\n+                                        \"value\": \"ECMAScript\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Groovy 3.0.21 [Groovy Scripting Engine 2.0]\",\n+                                        \"displayName\": \"Groovy\",\n+                                        \"value\": \"Groovy\"\n+                                    },\n+                                    {\n+                                        \"description\": \"python 2.7 [jython 2.7.3]\",\n+                                        \"displayName\": \"python DEPRECATED\",\n+                                        \"value\": \"python\"\n+                                    },\n+                                    {\n+                                        \"description\": \"ruby jruby 9.4.2.0 [JSR 223 JRuby Engine 9.4.2.0]\",\n+                                        \"displayName\": \"ruby DEPRECATED\",\n+                                        \"value\": \"ruby\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"ECMAScript\",\n+                                \"description\": \"Language Engine for executing scripts\",\n+                                \"displayName\": \"Script Engine\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"dbcp-max-idle-conns\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Script Engine\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"dbcp-min-evictable-idle-time\": {\n-                                \"defaultValue\": \"30 mins\",\n-                                \"description\": \"The minimum amount of time a connection may sit idle in the pool before it is eligible for eviction.\",\n-                                \"displayName\": \"Minimum Evictable Idle Time\",\n+                            \"Script File\": {\n+                                \"description\": \"Path to script file to execute. Only one of Script File or Script Body may be used\",\n+                                \"displayName\": \"Script File\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"dbcp-min-evictable-idle-time\",\n+                                \"name\": \"Script File\",\n                                 \"required\": false,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"SINGLE\",\n+                                    \"resourceTypes\": [\n+                                        \"FILE\"\n+                                    ]\n+                                },\n                                 \"sensitive\": false\n-                            },\n-                            \"dbcp-min-idle-conns\": {\n-                                \"defaultValue\": \"0\",\n-                                \"description\": \"The minimum number of connections that can remain idle in the pool without extra ones being created. Set to or zero to allow no idle connections.\",\n-                                \"displayName\": \"Minimum Idle Connections\",\n+                            }\n+                        },\n+                        \"providedApiImplementations\": [\n+                            {\n+                                \"artifact\": \"nifi-standard-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n+                                \"version\": \"1.27.0\"\n+                            }\n+                        ],\n+                        \"restricted\": true,\n+                        \"supportsDynamicProperties\": true,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"groovy\",\n+                            \"invoke\",\n+                            \"javascript\",\n+                            \"jruby\",\n+                            \"js\",\n+                            \"jython\",\n+                            \"lua\",\n+                            \"luaj\",\n+                            \"python\",\n+                            \"record\",\n+                            \"ruby\",\n+                            \"script\",\n+                            \"writer\"\n+                        ],\n+                        \"type\": \"org.apache.nifi.record.script.ScriptedRecordSetWriter\",\n+                        \"typeDescription\": \"Allows the user to provide a scripted RecordSetWriterFactory instance in order to write records to an outgoing flow file.\",\n+                        \"version\": \"1.27.0\"\n+                    },\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-scripting-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"e0c4461\"\n+                        },\n+                        \"dynamicProperties\": [\n+                            {\n+                                \"description\": \"Updates a script engine property specified by the Dynamic Property's key with the value specified by the Dynamic Property's value\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"name\": \"Script Engine Binding property\",\n+                                \"value\": \"Binding property value passed to Script Runner\"\n+                            }\n+                        ],\n+                        \"explicitRestrictions\": [\n+                            {\n+                                \"explanation\": \"Provides operator the ability to execute arbitrary code assuming all permissions that NiFi has.\",\n+                                \"requiredPermission\": \"execute code\"\n+                            }\n+                        ],\n+                        \"group\": \"org.apache.nifi\",\n+                        \"propertyDescriptors\": {\n+                            \"Module Directory\": {\n+                                \"description\": \"Comma-separated list of paths to files and/or directories which contain modules required by the script.\",\n+                                \"displayName\": \"Module Directory\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"dbcp-min-idle-conns\",\n+                                \"name\": \"Module Directory\",\n                                 \"required\": false,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"MULTIPLE\",\n+                                    \"resourceTypes\": [\n+                                        \"DIRECTORY\",\n+                                        \"FILE\"\n+                                    ]\n+                                },\n                                 \"sensitive\": false\n                             },\n-                            \"dbcp-soft-min-evictable-idle-time\": {\n-                                \"defaultValue\": \"-1\",\n-                                \"description\": \"The minimum amount of time a connection may sit idle in the pool before it is eligible for eviction by the idle connection evictor, with the extra condition that at least a minimum number of idle connections remain in the pool. When the not-soft version of this option is set to a positive value, it is examined first by the idle connection evictor: when idle connections are visited by the evictor, idle time is first compared against it (without considering the number of idle connections in the pool) and then against this soft option, including the minimum idle connections constraint.\",\n-                                \"displayName\": \"Soft Minimum Evictable Idle Time\",\n+                            \"Script Body\": {\n+                                \"description\": \"Body of script to execute. Only one of Script File or Script Body may be used\",\n+                                \"displayName\": \"Script Body\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"dbcp-soft-min-evictable-idle-time\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Script Body\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"dbcp-time-between-eviction-runs\": {\n-                                \"defaultValue\": \"-1\",\n-                                \"description\": \"The time period to sleep between runs of the idle connection evictor thread. When non-positive, no idle connection evictor thread will be run.\",\n-                                \"displayName\": \"Time Between Eviction Runs\",\n+                            \"Script Engine\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"ECMAScript ECMA - 262 Edition 5.1 [Oracle Nashorn 1.8.0_422]\",\n+                                        \"displayName\": \"ECMAScript DEPRECATED\",\n+                                        \"value\": \"ECMAScript\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Groovy 3.0.21 [Groovy Scripting Engine 2.0]\",\n+                                        \"displayName\": \"Groovy\",\n+                                        \"value\": \"Groovy\"\n+                                    },\n+                                    {\n+                                        \"description\": \"python 2.7 [jython 2.7.3]\",\n+                                        \"displayName\": \"python DEPRECATED\",\n+                                        \"value\": \"python\"\n+                                    },\n+                                    {\n+                                        \"description\": \"ruby jruby 9.4.2.0 [JSR 223 JRuby Engine 9.4.2.0]\",\n+                                        \"displayName\": \"ruby DEPRECATED\",\n+                                        \"value\": \"ruby\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"ECMAScript\",\n+                                \"description\": \"Language Engine for executing scripts\",\n+                                \"displayName\": \"Script Engine\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"dbcp-time-between-eviction-runs\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Script Engine\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"hadoop-config-resources\": {\n-                                \"description\": \"A file, or comma separated list of files, which contain the Hadoop configuration (core-site.xml, etc.). Without this, Hadoop will search the classpath, or will revert to a default configuration. Note that to enable authentication with Kerberos, the appropriate properties must be set in the configuration files.\",\n-                                \"displayName\": \"Hadoop Configuration Resources\",\n+                            \"Script File\": {\n+                                \"description\": \"Path to script file to execute. Only one of Script File or Script Body may be used\",\n+                                \"displayName\": \"Script File\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"hadoop-config-resources\",\n+                                \"name\": \"Script File\",\n                                 \"required\": false,\n                                 \"resourceDefinition\": {\n-                                    \"cardinality\": \"MULTIPLE\",\n+                                    \"cardinality\": \"SINGLE\",\n                                     \"resourceTypes\": [\n                                         \"FILE\"\n                                     ]\n                                 },\n                                 \"sensitive\": false\n-                            },\n-                            \"kerberos-credentials-service\": {\n-                                \"description\": \"Specifies the Kerberos Credentials Controller Service that should be used for authenticating with Kerberos\",\n-                                \"displayName\": \"Kerberos Credentials Service\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"kerberos-credentials-service\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.kerberos.KerberosCredentialsService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            },\n-                            \"kerberos-user-service\": {\n-                                \"description\": \"Specifies the Kerberos User Controller Service that should be used for authenticating with Kerberos\",\n-                                \"displayName\": \"Kerberos User Service\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"kerberos-user-service\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.kerberos.KerberosUserService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n                             }\n                         },\n                         \"providedApiImplementations\": [\n                             {\n                                 \"artifact\": \"nifi-standard-services-api-nar\",\n                                 \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.dbcp.DBCPService\",\n+                                \"type\": \"org.apache.nifi.record.sink.RecordSinkService\",\n                                 \"version\": \"1.27.0\"\n                             }\n                         ],\n                         \"restricted\": true,\n                         \"supportsDynamicProperties\": true,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"connection\",\n-                            \"database\",\n-                            \"dbcp\",\n-                            \"hadoop\",\n-                            \"jdbc\",\n-                            \"pooling\",\n-                            \"store\"\n+                            \"groovy\",\n+                            \"invoke\",\n+                            \"javascript\",\n+                            \"jruby\",\n+                            \"js\",\n+                            \"jython\",\n+                            \"lua\",\n+                            \"luaj\",\n+                            \"python\",\n+                            \"record\",\n+                            \"record sink\",\n+                            \"ruby\",\n+                            \"script\"\n                         ],\n-                        \"type\": \"org.apache.nifi.dbcp.HadoopDBCPConnectionPool\",\n-                        \"typeDescription\": \"Provides a Database Connection Pooling Service for Hadoop related JDBC services. This service requires that the Database Driver Location(s) contains some version of a hadoop-common JAR, or a shaded JAR that shades hadoop-common.\",\n+                        \"type\": \"org.apache.nifi.record.sink.script.ScriptedRecordSink\",\n+                        \"typeDescription\": \"Allows the user to provide a scripted RecordSinkService instance in order to transmit records to the desired target. The script must set a variable 'recordSink' to an implementation of RecordSinkService.\",\n                         \"version\": \"1.27.0\"\n-                    }\n-                ],\n-                \"processors\": [],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"1.27.0\"\n-        },\n-        {\n-            \"artifact\": \"nifi-elasticsearch-restapi-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [],\n-                \"processors\": [\n+                    },\n                     {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-elasticsearch-restapi-nar\",\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-scripting-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n-                        \"defaultBulletinLevel\": \"WARN\",\n-                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": 1,\n-                            \"TIMER_DRIVEN\": 1\n-                        },\n-                        \"defaultPenaltyDuration\": \"30 sec\",\n-                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"1 min\"\n-                        },\n-                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n-                        \"defaultYieldDuration\": \"1 sec\",\n                         \"dynamicProperties\": [\n                             {\n-                                \"description\": \"Adds the specified property name/value as a query parameter in the Elasticsearch URL used for processing. These parameters will override any matching parameters in the query request body. For SCROLL type queries, these parameters are only used in the initial (first page) query as the Elasticsearch Scroll API does not support the same query parameters for subsequent pages of data.\",\n+                                \"description\": \"Updates a script engine property specified by the Dynamic Property's key with the value specified by the Dynamic Property's value\",\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"name\": \"The name of a URL query parameter to add\",\n-                                \"value\": \"The value of the URL query parameter\"\n+                                \"name\": \"Script Engine Binding property\",\n+                                \"value\": \"Binding property value passed to Script Runner\"\n+                            }\n+                        ],\n+                        \"explicitRestrictions\": [\n+                            {\n+                                \"explanation\": \"Provides operator the ability to execute arbitrary code assuming all permissions that NiFi has.\",\n+                                \"requiredPermission\": \"execute code\"\n                             }\n                         ],\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n-                        \"primaryNodeOnly\": true,\n                         \"propertyDescriptors\": {\n-                            \"el-query-attribute\": {\n-                                \"description\": \"If set, the executed query will be set on each result flowfile in the specified attribute.\",\n-                                \"displayName\": \"Query Attribute\",\n+                            \"Module Directory\": {\n+                                \"description\": \"Comma-separated list of paths to files and/or directories which contain modules required by the script.\",\n+                                \"displayName\": \"Module Directory\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"el-query-attribute\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Module Directory\",\n                                 \"required\": false,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"MULTIPLE\",\n+                                    \"resourceTypes\": [\n+                                        \"DIRECTORY\",\n+                                        \"FILE\"\n+                                    ]\n+                                },\n                                 \"sensitive\": false\n                             },\n-                            \"el-rest-client-service\": {\n-                                \"description\": \"An Elasticsearch client service to use for running queries.\",\n-                                \"displayName\": \"Client Service\",\n+                            \"Script Body\": {\n+                                \"description\": \"Body of script to execute. Only one of Script File or Script Body may be used\",\n+                                \"displayName\": \"Script Body\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"el-rest-client-service\",\n-                                \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-elasticsearch-client-service-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.elasticsearch.ElasticSearchClientService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            },\n-                            \"el-rest-fetch-index\": {\n-                                \"description\": \"The name of the index to use.\",\n-                                \"displayName\": \"Index\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"el-rest-fetch-index\",\n-                                \"required\": true,\n+                                \"name\": \"Script Body\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"el-rest-format-aggregations\": {\n+                            \"Script Engine\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Contains full Elasticsearch Aggregation, including Buckets and Metadata.\",\n-                                        \"displayName\": \"FULL\",\n-                                        \"value\": \"FULL\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Bucket Content only.\",\n-                                        \"displayName\": \"BUCKETS_ONLY\",\n-                                        \"value\": \"BUCKETS_ONLY\"\n+                                        \"description\": \"ECMAScript ECMA - 262 Edition 5.1 [Oracle Nashorn 1.8.0_422]\",\n+                                        \"displayName\": \"ECMAScript DEPRECATED\",\n+                                        \"value\": \"ECMAScript\"\n                                     },\n                                     {\n-                                        \"description\": \"Aggregation Metadata only.\",\n-                                        \"displayName\": \"METADATA_ONLY\",\n-                                        \"value\": \"METADATA_ONLY\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"FULL\",\n-                                \"description\": \"Format of Aggregation output.\",\n-                                \"displayName\": \"Aggregation Results Format\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"el-rest-format-aggregations\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"el-rest-format-hits\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"Contains full Elasticsearch Hit, including Document Source and Metadata.\",\n-                                        \"displayName\": \"FULL\",\n-                                        \"value\": \"FULL\"\n+                                        \"description\": \"Groovy 3.0.21 [Groovy Scripting Engine 2.0]\",\n+                                        \"displayName\": \"Groovy\",\n+                                        \"value\": \"Groovy\"\n                                     },\n                                     {\n-                                        \"description\": \"Document Source only (where present).\",\n-                                        \"displayName\": \"SOURCE_ONLY\",\n-                                        \"value\": \"SOURCE_ONLY\"\n+                                        \"description\": \"python 2.7 [jython 2.7.3]\",\n+                                        \"displayName\": \"python DEPRECATED\",\n+                                        \"value\": \"python\"\n                                     },\n                                     {\n-                                        \"description\": \"Hit Metadata only.\",\n-                                        \"displayName\": \"METADATA_ONLY\",\n-                                        \"value\": \"METADATA_ONLY\"\n+                                        \"description\": \"ruby jruby 9.4.2.0 [JSR 223 JRuby Engine 9.4.2.0]\",\n+                                        \"displayName\": \"ruby DEPRECATED\",\n+                                        \"value\": \"ruby\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"FULL\",\n-                                \"description\": \"Format of Hits output.\",\n-                                \"displayName\": \"Search Results Format\",\n+                                \"defaultValue\": \"ECMAScript\",\n+                                \"description\": \"Language Engine for executing scripts\",\n+                                \"displayName\": \"Script Engine\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"el-rest-format-hits\",\n+                                \"name\": \"Script Engine\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"el-rest-output-no-hits\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"Output a \\\"hits\\\" flowfile even if no hits found for query. If true, an empty \\\"hits\\\" flowfile will be output even if \\\"aggregations\\\" are output.\",\n-                                \"displayName\": \"Output No Hits\",\n+                            \"Script File\": {\n+                                \"description\": \"Path to script file to execute. Only one of Script File or Script Body may be used\",\n+                                \"displayName\": \"Script File\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"el-rest-output-no-hits\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Script File\",\n+                                \"required\": false,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"SINGLE\",\n+                                    \"resourceTypes\": [\n+                                        \"FILE\"\n+                                    ]\n+                                },\n                                 \"sensitive\": false\n-                            },\n-                            \"el-rest-pagination-keep-alive\": {\n-                                \"defaultValue\": \"10 mins\",\n-                                \"description\": \"Pagination \\\"keep_alive\\\" period. Period Elasticsearch will keep the scroll/pit cursor alive in between requests (this is not the time expected for all pages to be returned, but the maximum allowed time for requests between page retrievals).\",\n-                                \"displayName\": \"Pagination Keep Alive\",\n+                            }\n+                        },\n+                        \"providedApiImplementations\": [\n+                            {\n+                                \"artifact\": \"nifi-standard-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.rules.engine.RulesEngineService\",\n+                                \"version\": \"1.27.0\"\n+                            }\n+                        ],\n+                        \"restricted\": true,\n+                        \"supportsDynamicProperties\": true,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"groovy\",\n+                            \"invoke\",\n+                            \"javascript\",\n+                            \"jruby\",\n+                            \"js\",\n+                            \"jython\",\n+                            \"lua\",\n+                            \"luaj\",\n+                            \"python\",\n+                            \"ruby\",\n+                            \"rules\",\n+                            \"rules engine\",\n+                            \"script\"\n+                        ],\n+                        \"type\": \"org.apache.nifi.rules.engine.script.ScriptedRulesEngine\",\n+                        \"typeDescription\": \"Allows the user to provide a scripted RulesEngineService for custom firing of rules depending on the supplied facts. The script must set a variable 'rulesEngine' to an implementation of RulesEngineService.\",\n+                        \"version\": \"1.27.0\"\n+                    },\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-scripting-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"e0c4461\"\n+                        },\n+                        \"dynamicProperties\": [\n+                            {\n+                                \"description\": \"Updates a script engine property specified by the Dynamic Property's key with the value specified by the Dynamic Property's value\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"name\": \"Script Engine Binding property\",\n+                                \"value\": \"Binding property value passed to Script Runner\"\n+                            }\n+                        ],\n+                        \"explicitRestrictions\": [\n+                            {\n+                                \"explanation\": \"Provides operator the ability to execute arbitrary code assuming all permissions that NiFi has.\",\n+                                \"requiredPermission\": \"execute code\"\n+                            }\n+                        ],\n+                        \"group\": \"org.apache.nifi\",\n+                        \"propertyDescriptors\": {\n+                            \"Module Directory\": {\n+                                \"description\": \"Comma-separated list of paths to files and/or directories which contain modules required by the script.\",\n+                                \"displayName\": \"Module Directory\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"el-rest-pagination-keep-alive\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Module Directory\",\n+                                \"required\": false,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"MULTIPLE\",\n+                                    \"resourceTypes\": [\n+                                        \"DIRECTORY\",\n+                                        \"FILE\"\n+                                    ]\n+                                },\n                                 \"sensitive\": false\n                             },\n-                            \"el-rest-pagination-type\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"Use Elasticsearch \\\"_scroll\\\" API to page results. Does not accept additional query parameters.\",\n-                                        \"displayName\": \"SCROLL\",\n-                                        \"value\": \"pagination-scroll\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Use Elasticsearch \\\"search_after\\\" _search API to page sorted results.\",\n-                                        \"displayName\": \"SEARCH_AFTER\",\n-                                        \"value\": \"pagination-search_after\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Use Elasticsearch (7.10+ with XPack) \\\"point in time\\\" _search API to page sorted results.\",\n-                                        \"displayName\": \"POINT_IN_TIME\",\n-                                        \"value\": \"pagination-pit\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"pagination-scroll\",\n-                                \"description\": \"Pagination method to use. Not all types are available for all Elasticsearch versions, check the Elasticsearch docs to confirm which are applicable and recommended for your service.\",\n-                                \"displayName\": \"Pagination Type\",\n+                            \"Script Body\": {\n+                                \"description\": \"Body of script to execute. Only one of Script File or Script Body may be used\",\n+                                \"displayName\": \"Script Body\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"el-rest-pagination-type\",\n-                                \"required\": true,\n+                                \"name\": \"Script Body\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"el-rest-split-up-aggregations\": {\n+                            \"Script Engine\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Flowfile per hit.\",\n-                                        \"displayName\": \"PER_HIT\",\n-                                        \"value\": \"splitUp-yes\"\n+                                        \"description\": \"ECMAScript ECMA - 262 Edition 5.1 [Oracle Nashorn 1.8.0_422]\",\n+                                        \"displayName\": \"ECMAScript DEPRECATED\",\n+                                        \"value\": \"ECMAScript\"\n                                     },\n                                     {\n-                                        \"description\": \"Flowfile per response.\",\n-                                        \"displayName\": \"PER_RESPONSE\",\n-                                        \"value\": \"splitUp-no\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"splitUp-no\",\n-                                \"description\": \"Output a flowfile containing all aggregations or one flowfile for each individual aggregation.\",\n-                                \"displayName\": \"Aggregation Results Split\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"el-rest-split-up-aggregations\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"el-rest-split-up-hits\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"Flowfile per hit.\",\n-                                        \"displayName\": \"PER_HIT\",\n-                                        \"value\": \"splitUp-yes\"\n+                                        \"description\": \"Groovy 3.0.21 [Groovy Scripting Engine 2.0]\",\n+                                        \"displayName\": \"Groovy\",\n+                                        \"value\": \"Groovy\"\n                                     },\n                                     {\n-                                        \"description\": \"Flowfile per response.\",\n-                                        \"displayName\": \"PER_RESPONSE\",\n-                                        \"value\": \"splitUp-no\"\n+                                        \"description\": \"python 2.7 [jython 2.7.3]\",\n+                                        \"displayName\": \"python DEPRECATED\",\n+                                        \"value\": \"python\"\n                                     },\n                                     {\n-                                        \"description\": \"Combine results from all query responses (one flowfile per entire paginated result set of hits). Note that aggregations cannot be paged, they are generated across the entire result set and returned as part of the first page. Results are output with one JSON object per line (allowing hits to be combined from multiple pages without loading all results into memory).\",\n-                                        \"displayName\": \"PER_QUERY\",\n-                                        \"value\": \"splitUp-query\"\n+                                        \"description\": \"ruby jruby 9.4.2.0 [JSR 223 JRuby Engine 9.4.2.0]\",\n+                                        \"displayName\": \"ruby DEPRECATED\",\n+                                        \"value\": \"ruby\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"splitUp-no\",\n-                                \"description\": \"Output a flowfile containing all hits or one flowfile for each individual hit or one flowfile containing all hits from all paged responses.\",\n-                                \"displayName\": \"Search Results Split\",\n+                                \"defaultValue\": \"ECMAScript\",\n+                                \"description\": \"Language Engine for executing scripts\",\n+                                \"displayName\": \"Script Engine\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"el-rest-split-up-hits\",\n+                                \"name\": \"Script Engine\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"el-rest-type\": {\n-                                \"description\": \"The type of this document (used by Elasticsearch for indexing and searching).\",\n-                                \"displayName\": \"Type\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"el-rest-type\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"es-rest-additional-filters\": {\n-                                \"description\": \"One or more query filters in JSON syntax, not Lucene syntax. Ex: [{\\\"match\\\":{\\\"somefield\\\":\\\"somevalue\\\"}}, {\\\"match\\\":{\\\"anotherfield\\\":\\\"anothervalue\\\"}}]. These filters wil be used as part of a Bool query's filter.\",\n-                                \"displayName\": \"Additional Filters\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"es-rest-additional-filters\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"es-rest-query-aggs\": {\n-                                \"description\": \"One or more query aggregations (or \\\"aggs\\\"), in JSON syntax. Ex: {\\\"items\\\": {\\\"terms\\\": {\\\"field\\\": \\\"product\\\", \\\"size\\\": 10}}}\",\n-                                \"displayName\": \"Aggregations\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"es-rest-query-aggs\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"es-rest-query-fields\": {\n-                                \"description\": \"Fields of indexed documents to be retrieved, in JSON syntax. Ex: [\\\"user.id\\\", \\\"http.response.*\\\", {\\\"field\\\": \\\"@timestamp\\\", \\\"format\\\": \\\"epoch_millis\\\"}]\",\n-                                \"displayName\": \"Fields\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"es-rest-query-fields\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"es-rest-query-script-fields\": {\n-                                \"description\": \"Fields to created using script evaluation at query runtime, in JSON syntax. Ex: {\\\"test1\\\": {\\\"script\\\": {\\\"lang\\\": \\\"painless\\\", \\\"source\\\": \\\"doc['price'].value * 2\\\"}}, \\\"test2\\\": {\\\"script\\\": {\\\"lang\\\": \\\"painless\\\", \\\"source\\\": \\\"doc['price'].value * params.factor\\\", \\\"params\\\": {\\\"factor\\\": 2.0}}}}\",\n-                                \"displayName\": \"Script Fields\",\n+                            \"Script File\": {\n+                                \"description\": \"Path to script file to execute. Only one of Script File or Script Body may be used\",\n+                                \"displayName\": \"Script File\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"es-rest-query-script-fields\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Script File\",\n                                 \"required\": false,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"SINGLE\",\n+                                    \"resourceTypes\": [\n+                                        \"FILE\"\n+                                    ]\n+                                },\n                                 \"sensitive\": false\n-                            },\n-                            \"es-rest-query-sort\": {\n-                                \"description\": \"Sort results by one or more fields, in JSON syntax. Ex: [{\\\"price\\\" : {\\\"order\\\" : \\\"asc\\\", \\\"mode\\\" : \\\"avg\\\"}}, {\\\"post_date\\\" : {\\\"format\\\": \\\"strict_date_optional_time_nanos\\\"}}]\",\n-                                \"displayName\": \"Sort\",\n-                                \"dynamic\": false,\n+                            }\n+                        },\n+                        \"providedApiImplementations\": [\n+                            {\n+                                \"artifact\": \"nifi-standard-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.rules.PropertyContextActionHandler\",\n+                                \"version\": \"1.27.0\"\n+                            }\n+                        ],\n+                        \"restricted\": true,\n+                        \"supportsDynamicProperties\": true,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"action\",\n+                            \"action handler\",\n+                            \"groovy\",\n+                            \"invoke\",\n+                            \"javascript\",\n+                            \"jruby\",\n+                            \"js\",\n+                            \"jython\",\n+                            \"lua\",\n+                            \"luaj\",\n+                            \"python\",\n+                            \"ruby\",\n+                            \"rules\",\n+                            \"rules engine\",\n+                            \"script\"\n+                        ],\n+                        \"type\": \"org.apache.nifi.rules.handlers.script.ScriptedActionHandler\",\n+                        \"typeDescription\": \"Allows the user to provide a scripted ActionHandler for custom firing of rules depending on the supplied facts. The script must set a variable 'actionHandler' to an implementation of ActionHandler.\",\n+                        \"version\": \"1.27.0\"\n+                    }\n+                ],\n+                \"processors\": [\n+                    {\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-scripting-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"e0c4461\"\n+                        },\n+                        \"defaultBulletinLevel\": \"WARN\",\n+                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": 1,\n+                            \"TIMER_DRIVEN\": 1\n+                        },\n+                        \"defaultPenaltyDuration\": \"30 sec\",\n+                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": \"* * * * * ?\",\n+                            \"TIMER_DRIVEN\": \"0 sec\"\n+                        },\n+                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n+                        \"defaultYieldDuration\": \"1 sec\",\n+                        \"dynamicProperties\": [\n+                            {\n+                                \"description\": \"Updates a script engine property specified by the Dynamic Property's key with the value specified by the Dynamic Property's value\",\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"es-rest-query-sort\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"es-rest-range-field\": {\n-                                \"description\": \"Field to be tracked as part of an Elasticsearch Range query using a \\\"gt\\\" bound match. This field must exist within the Elasticsearch document for it to be retrieved.\",\n-                                \"displayName\": \"Range Query Field\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"es-rest-range-field\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"es-rest-range-format\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"propertyDisplayName\": \"Initial Value\",\n-                                        \"propertyName\": \"es-rest-range-initial-value\"\n-                                    }\n-                                ],\n-                                \"description\": \"If the \\\"Range Query Field\\\" is a Date field, convert the \\\"Initial Value\\\" to a date with this format. If not specified, Elasticsearch will use the date format provided by the \\\"Range Query Field\\\"'s mapping. For valid syntax, see https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-date-format.html\",\n-                                \"displayName\": \"Initial Value Date Format\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"es-rest-range-format\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"es-rest-range-initial-value\": {\n-                                \"description\": \"The initial value to use for the query if the processor has not run previously. If the processor has run previously and stored a value in its state, this property will be ignored. If no value is provided, and the processor has not previously run, no Range query bounds will be used, i.e. all documents will be retrieved in the specified \\\"Sort Order\\\".\",\n-                                \"displayName\": \"Initial Value\",\n+                                \"name\": \"Script Engine Binding property\",\n+                                \"value\": \"Binding property value passed to Script Runner\"\n+                            }\n+                        ],\n+                        \"explicitRestrictions\": [\n+                            {\n+                                \"explanation\": \"Provides operator the ability to execute arbitrary code assuming all permissions that NiFi has.\",\n+                                \"requiredPermission\": \"execute code\"\n+                            }\n+                        ],\n+                        \"group\": \"org.apache.nifi\",\n+                        \"inputRequirement\": \"INPUT_ALLOWED\",\n+                        \"primaryNodeOnly\": false,\n+                        \"propertyDescriptors\": {\n+                            \"Module Directory\": {\n+                                \"description\": \"Comma-separated list of paths to files and/or directories which contain modules required by the script.\",\n+                                \"displayName\": \"Module Directory\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"es-rest-range-initial-value\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Module Directory\",\n                                 \"required\": false,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"MULTIPLE\",\n+                                    \"resourceTypes\": [\n+                                        \"DIRECTORY\",\n+                                        \"FILE\"\n+                                    ]\n+                                },\n                                 \"sensitive\": false\n                             },\n-                            \"es-rest-range-time-zone\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"propertyDisplayName\": \"Initial Value\",\n-                                        \"propertyName\": \"es-rest-range-initial-value\"\n-                                    }\n-                                ],\n-                                \"description\": \"If the \\\"Range Query Field\\\" is a Date field, convert the \\\"Initial Value\\\" to UTC with this time zone. Valid values are ISO 8601 UTC offsets, such as \\\"+01:00\\\" or \\\"-08:00\\\", and IANA time zone IDs, such as \\\"Europe/London\\\".\",\n-                                \"displayName\": \"Initial Value Date Time Zone\",\n+                            \"Script Body\": {\n+                                \"description\": \"Body of script to execute. Only one of Script File or Script Body may be used\",\n+                                \"displayName\": \"Script Body\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"es-rest-range-time-zone\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"es-rest-size\": {\n-                                \"description\": \"The maximum number of documents to retrieve in the query. If the query is paginated, this \\\"size\\\" applies to each page of the query, not the \\\"size\\\" of the entire result set.\",\n-                                \"displayName\": \"Size\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"es-rest-size\",\n+                                \"name\": \"Script Body\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"es-rest-sort-order\": {\n+                            \"Script Engine\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"asc\",\n-                                        \"value\": \"asc\"\n+                                        \"description\": \"Clojure 1.8.0 [Clojure UNKNOWN]\",\n+                                        \"displayName\": \"Clojure\",\n+                                        \"value\": \"Clojure\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"desc\",\n-                                        \"value\": \"desc\"\n+                                        \"description\": \"ECMAScript ECMA - 262 Edition 5.1 [Oracle Nashorn 1.8.0_422]\",\n+                                        \"displayName\": \"ECMAScript DEPRECATED\",\n+                                        \"value\": \"ECMAScript\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Groovy 3.0.21 [Groovy Scripting Engine 2.0]\",\n+                                        \"displayName\": \"Groovy\",\n+                                        \"value\": \"Groovy\"\n+                                    },\n+                                    {\n+                                        \"description\": \"lua 5.2 [Luaj Luaj-jse 3.0.1]\",\n+                                        \"displayName\": \"lua DEPRECATED\",\n+                                        \"value\": \"lua\"\n+                                    },\n+                                    {\n+                                        \"description\": \"python 2.7 [jython 2.7.3]\",\n+                                        \"displayName\": \"python DEPRECATED\",\n+                                        \"value\": \"python\"\n+                                    },\n+                                    {\n+                                        \"description\": \"ruby jruby 9.4.2.0 [JSR 223 JRuby Engine 9.4.2.0]\",\n+                                        \"displayName\": \"ruby DEPRECATED\",\n+                                        \"value\": \"ruby\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"asc\",\n-                                \"description\": \"The order in which to sort the \\\"Range Query Field\\\". A \\\"sort\\\" clause for the \\\"Range Query Field\\\" field will be prepended to any provided \\\"Sort\\\" clauses. If a \\\"sort\\\" clause already exists for the \\\"Range Query Field\\\" field, it will not be updated.\",\n-                                \"displayName\": \"Sort Order\",\n+                                \"defaultValue\": \"Clojure\",\n+                                \"description\": \"Language Engine for executing scripts\",\n+                                \"displayName\": \"Script Engine\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"es-rest-sort-order\",\n+                                \"name\": \"Script Engine\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n+                            },\n+                            \"Script File\": {\n+                                \"description\": \"Path to script file to execute. Only one of Script File or Script Body may be used\",\n+                                \"displayName\": \"Script File\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Script File\",\n+                                \"required\": false,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"SINGLE\",\n+                                    \"resourceTypes\": [\n+                                        \"FILE\"\n+                                    ]\n+                                },\n+                                \"sensitive\": false\n                             }\n                         },\n+                        \"restricted\": true,\n                         \"seeAlso\": [\n-                            \"org.apache.nifi.processors.elasticsearch.PaginatedJsonQueryElasticsearch\",\n-                            \"org.apache.nifi.processors.elasticsearch.SearchElasticsearch\"\n+                            \"org.apache.nifi.processors.script.InvokeScriptedProcessor\"\n                         ],\n                         \"sideEffectFree\": false,\n                         \"stateful\": {\n-                            \"description\": \"The pagination state (scrollId, searchAfter, pitId, hitCount, pageCount, pageExpirationTimestamp, trackingRangeValue) is retained in between invocations of this processor until the Scroll/PiT has expired (when the current time is later than the last query execution plus the Pagination Keep Alive interval).\",\n+                            \"description\": \"Scripts can store and retrieve state using the State Management APIs. Consult the State Manager section of the Developer's Guide for more details.\",\n                             \"scopes\": [\n-                                \"CLUSTER\"\n+                                \"CLUSTER\",\n+                                \"LOCAL\"\n                             ]\n                         },\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"Aggregations are routed to this relationship.\",\n-                                \"name\": \"aggregations\"\n+                                \"description\": \"FlowFiles that were successfully processed\",\n+                                \"name\": \"success\"\n                             },\n                             {\n-                                \"description\": \"Search hits are routed to this relationship.\",\n-                                \"name\": \"hits\"\n+                                \"description\": \"FlowFiles that failed to be processed\",\n+                                \"name\": \"failure\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n                         \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": true,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsEventDriven\": false,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"systemResourceConsiderations\": [\n-                            {\n-                                \"description\": \"Care should be taken on the size of each page because each response from Elasticsearch will be loaded into memory all at once and converted into the resulting flowfiles.\",\n-                                \"resource\": \"MEMORY\"\n-                            }\n-                        ],\n+                        \"supportsSensitiveDynamicProperties\": true,\n                         \"tags\": [\n-                            \"elasticsearch\",\n-                            \"elasticsearch5\",\n-                            \"elasticsearch6\",\n-                            \"elasticsearch7\",\n-                            \"elasticsearch8\",\n-                            \"json\",\n-                            \"page\",\n-                            \"query\",\n-                            \"scroll\",\n-                            \"search\"\n+                            \"clojure\",\n+                            \"execute\",\n+                            \"groovy\",\n+                            \"javascript\",\n+                            \"jruby\",\n+                            \"js\",\n+                            \"jython\",\n+                            \"lua\",\n+                            \"luaj\",\n+                            \"python\",\n+                            \"ruby\",\n+                            \"script\"\n                         ],\n-                        \"triggerSerially\": true,\n+                        \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.elasticsearch.ConsumeElasticsearch\",\n-                        \"typeDescription\": \"A processor that repeatedly runs a paginated query against a field using a Range query to consume new Documents from an Elasticsearch index/query. The processor will retrieve multiple pages of results until either no more results are available or the Pagination Keep Alive expiration is reached, after which the Range query will automatically update the field constraint based on the last retrieved Document value.\",\n-                        \"version\": \"1.27.0\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"application/json\",\n-                                \"name\": \"mime.type\"\n-                            },\n-                            {\n-                                \"description\": \"The number of the page (request), starting from 1, in which the results were returned that are in the output flowfile\",\n-                                \"name\": \"page.number\"\n-                            },\n-                            {\n-                                \"description\": \"The number of hits that are in the output flowfile\",\n-                                \"name\": \"hit.count\"\n-                            },\n-                            {\n-                                \"description\": \"The error message provided by Elasticsearch if there is an error querying the index.\",\n-                                \"name\": \"elasticsearch.query.error\"\n-                            }\n-                        ]\n+                        \"type\": \"org.apache.nifi.processors.script.ExecuteScript\",\n+                        \"typeDescription\": \"Experimental - Executes a script given the flow file and a process session.  The script is responsible for handling the incoming flow file (transfer to SUCCESS or remove, e.g.) as well as any flow files created by the script. If the handling is incomplete or incorrect, the session will be rolled back. Experimental: Impact of sustained usage not yet verified.\",\n+                        \"version\": \"1.27.0\"\n                     },\n                     {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-elasticsearch-restapi-nar\",\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-scripting-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -20449,373 +21446,359 @@\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n                         \"dynamicProperties\": [\n                             {\n-                                \"description\": \"Adds the specified property name/value as a query parameter in the Elasticsearch URL used for processing. These parameters will override any matching parameters in the query request body\",\n+                                \"description\": \"Updates a script engine property specified by the Dynamic Property's key with the value specified by the Dynamic Property's value\",\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"name\": \"The name of a URL query parameter to add\",\n-                                \"value\": \"The value of the URL query parameter\"\n+                                \"name\": \"Script Engine Binding property\",\n+                                \"value\": \"Binding property value passed to Script Runner\"\n+                            }\n+                        ],\n+                        \"explicitRestrictions\": [\n+                            {\n+                                \"explanation\": \"Provides operator the ability to execute arbitrary code assuming all permissions that NiFi has.\",\n+                                \"requiredPermission\": \"execute code\"\n                             }\n                         ],\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_ALLOWED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"el-query-attribute\": {\n-                                \"description\": \"If set, the executed query will be set on each result flowfile in the specified attribute.\",\n-                                \"displayName\": \"Query Attribute\",\n+                            \"Module Directory\": {\n+                                \"description\": \"Comma-separated list of paths to files and/or directories which contain modules required by the script.\",\n+                                \"displayName\": \"Module Directory\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"el-query-attribute\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Module Directory\",\n                                 \"required\": false,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"MULTIPLE\",\n+                                    \"resourceTypes\": [\n+                                        \"DIRECTORY\",\n+                                        \"FILE\"\n+                                    ]\n+                                },\n                                 \"sensitive\": false\n                             },\n-                            \"el-rest-client-service\": {\n-                                \"description\": \"An Elasticsearch client service to use for running queries.\",\n-                                \"displayName\": \"Client Service\",\n+                            \"Script Body\": {\n+                                \"description\": \"Body of script to execute. Only one of Script File or Script Body may be used\",\n+                                \"displayName\": \"Script Body\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"el-rest-client-service\",\n-                                \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-elasticsearch-client-service-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.elasticsearch.ElasticSearchClientService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            },\n-                            \"el-rest-fetch-index\": {\n-                                \"description\": \"The name of the index to use.\",\n-                                \"displayName\": \"Index\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"el-rest-fetch-index\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"el-rest-query\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"full\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Query Definition Style\",\n-                                        \"propertyName\": \"el-rest-query-definition-style\"\n-                                    }\n-                                ],\n-                                \"description\": \"A query in JSON syntax, not Lucene syntax. Ex: {\\\"query\\\":{\\\"match\\\":{\\\"somefield\\\":\\\"somevalue\\\"}}}. If this parameter is not set, the query will be read from the flowfile content. If the query (property and flowfile content) is empty, a default empty JSON Object will be used, which will result in a \\\"match_all\\\" query in Elasticsearch.\",\n-                                \"displayName\": \"Query\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"el-rest-query\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"el-rest-query-clause\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"build\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Query Definition Style\",\n-                                        \"propertyName\": \"el-rest-query-definition-style\"\n-                                    }\n-                                ],\n-                                \"description\": \"A \\\"query\\\" clause in JSON syntax, not Lucene syntax. Ex: {\\\"match\\\":{\\\"somefield\\\":\\\"somevalue\\\"}}. If the query is empty, a default JSON Object will be used, which will result in a \\\"match_all\\\" query in Elasticsearch.\",\n-                                \"displayName\": \"Query Clause\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"el-rest-query-clause\",\n+                                \"name\": \"Script Body\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"el-rest-query-definition-style\": {\n+                            \"Script Engine\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Provide the full Query.\",\n-                                        \"displayName\": \"FULL_QUERY\",\n-                                        \"value\": \"full\"\n+                                        \"description\": \"ECMAScript ECMA - 262 Edition 5.1 [Oracle Nashorn 1.8.0_422]\",\n+                                        \"displayName\": \"ECMAScript DEPRECATED\",\n+                                        \"value\": \"ECMAScript\"\n                                     },\n                                     {\n-                                        \"description\": \"Build the Query from separate JSON objects.\",\n-                                        \"displayName\": \"BUILD_QUERY\",\n-                                        \"value\": \"build\"\n+                                        \"description\": \"Groovy 3.0.21 [Groovy Scripting Engine 2.0]\",\n+                                        \"displayName\": \"Groovy\",\n+                                        \"value\": \"Groovy\"\n+                                    },\n+                                    {\n+                                        \"description\": \"python 2.7 [jython 2.7.3]\",\n+                                        \"displayName\": \"python DEPRECATED\",\n+                                        \"value\": \"python\"\n+                                    },\n+                                    {\n+                                        \"description\": \"ruby jruby 9.4.2.0 [JSR 223 JRuby Engine 9.4.2.0]\",\n+                                        \"displayName\": \"ruby DEPRECATED\",\n+                                        \"value\": \"ruby\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"full\",\n-                                \"description\": \"How the JSON Query will be defined for use by the processor.\",\n-                                \"displayName\": \"Query Definition Style\",\n+                                \"defaultValue\": \"ECMAScript\",\n+                                \"description\": \"Language Engine for executing scripts\",\n+                                \"displayName\": \"Script Engine\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"el-rest-query-definition-style\",\n+                                \"name\": \"Script Engine\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"el-rest-type\": {\n-                                \"description\": \"The type of this document (used by Elasticsearch for indexing and searching).\",\n-                                \"displayName\": \"Type\",\n+                            \"Script File\": {\n+                                \"description\": \"Path to script file to execute. Only one of Script File or Script Body may be used\",\n+                                \"displayName\": \"Script File\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"el-rest-type\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Script File\",\n                                 \"required\": false,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"SINGLE\",\n+                                    \"resourceTypes\": [\n+                                        \"FILE\"\n+                                    ]\n+                                },\n                                 \"sensitive\": false\n                             }\n                         },\n-                        \"sideEffectFree\": false,\n-                        \"supportedRelationships\": [\n-                            {\n-                                \"description\": \"All flowfiles that fail due to server/cluster availability go to this relationship.\",\n-                                \"name\": \"retry\"\n-                            },\n-                            {\n-                                \"description\": \"If the \\\"by query\\\" operation succeeds, and a flowfile was read, it will be sent to this relationship.\",\n-                                \"name\": \"success\"\n-                            },\n-                            {\n-                                \"description\": \"If the \\\"by query\\\" operation fails, and a flowfile was read, it will be sent to this relationship.\",\n-                                \"name\": \"failure\"\n-                            }\n+                        \"restricted\": true,\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.processors.script.ExecuteScript\"\n                         ],\n+                        \"sideEffectFree\": false,\n+                        \"stateful\": {\n+                            \"description\": \"Scripts can store and retrieve state using the State Management APIs. Consult the State Manager section of the Developer's Guide for more details.\",\n+                            \"scopes\": [\n+                                \"CLUSTER\",\n+                                \"LOCAL\"\n+                            ]\n+                        },\n+                        \"supportedRelationships\": [],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n                         \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": true,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsEventDriven\": false,\n-                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"supportsSensitiveDynamicProperties\": true,\n                         \"tags\": [\n-                            \"delete\",\n-                            \"elastic\",\n-                            \"elasticsearch\",\n-                            \"elasticsearch5\",\n-                            \"elasticsearch6\",\n-                            \"elasticsearch7\",\n-                            \"elasticsearch8\",\n-                            \"query\"\n+                            \"groovy\",\n+                            \"invoke\",\n+                            \"javascript\",\n+                            \"jruby\",\n+                            \"js\",\n+                            \"jython\",\n+                            \"lua\",\n+                            \"luaj\",\n+                            \"python\",\n+                            \"ruby\",\n+                            \"script\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.elasticsearch.DeleteByQueryElasticsearch\",\n-                        \"typeDescription\": \"Delete from an Elasticsearch index using a query. The query can be loaded from a flowfile body or from the Query parameter.\",\n-                        \"version\": \"1.27.0\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"The amount of time that it took to complete the delete operation in ms.\",\n-                                \"name\": \"elasticsearch.delete.took\"\n-                            },\n-                            {\n-                                \"description\": \"The error message provided by Elasticsearch if there is an error running the delete.\",\n-                                \"name\": \"elasticsearch.delete.error\"\n-                            }\n-                        ]\n+                        \"type\": \"org.apache.nifi.processors.script.InvokeScriptedProcessor\",\n+                        \"typeDescription\": \"Experimental - Invokes a script engine for a Processor defined in the given script. The script must define a valid class that implements the Processor interface, and it must set a variable 'processor' to an instance of the class. Processor methods such as onTrigger() will be delegated to the scripted Processor instance. Also any Relationships or PropertyDescriptors defined by the scripted processor will be added to the configuration dialog. The scripted processor can implement public void setLogger(ComponentLog logger) to get access to the parent logger, as well as public void onScheduled(ProcessContext context) and public void onStopped(ProcessContext context) methods to be invoked when the parent InvokeScriptedProcessor is scheduled or stopped, respectively.  NOTE: The script will be loaded when the processor is populated with property values, see the Restrictions section for more security implications.  Experimental: Impact of sustained usage not yet verified.\",\n+                        \"version\": \"1.27.0\"\n                     },\n                     {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-elasticsearch-restapi-nar\",\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-scripting-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n+                            \"EVENT_DRIVEN\": 0,\n                             \"TIMER_DRIVEN\": 1\n                         },\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n-                        \"dynamicProperties\": [\n+                        \"explicitRestrictions\": [\n                             {\n-                                \"description\": \"Adds the specified property name/value as a query parameter in the Elasticsearch URL used for processing.\",\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"name\": \"The name of a URL query parameter to add\",\n-                                \"value\": \"The value of the URL query parameter\"\n+                                \"explanation\": \"Provides operator the ability to execute arbitrary code assuming all permissions that NiFi has.\",\n+                                \"requiredPermission\": \"execute code\"\n                             }\n                         ],\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_ALLOWED\",\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"el-rest-client-service\": {\n-                                \"description\": \"An Elasticsearch client service to use for running queries.\",\n-                                \"displayName\": \"Client Service\",\n+                            \"Module Directory\": {\n+                                \"description\": \"Comma-separated list of paths to files and/or directories which contain modules required by the script.\",\n+                                \"displayName\": \"Module Directory\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Module Directory\",\n+                                \"required\": false,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"MULTIPLE\",\n+                                    \"resourceTypes\": [\n+                                        \"DIRECTORY\",\n+                                        \"FILE\"\n+                                    ]\n+                                },\n+                                \"sensitive\": false\n+                            },\n+                            \"Record Reader\": {\n+                                \"description\": \"The Record Reader to use parsing the incoming FlowFile into Records\",\n+                                \"displayName\": \"Record Reader\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"el-rest-client-service\",\n+                                \"name\": \"Record Reader\",\n                                 \"required\": true,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-elasticsearch-client-service-api-nar\",\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.elasticsearch.ElasticSearchClientService\",\n+                                    \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             },\n-                            \"el-rest-fetch-index\": {\n-                                \"description\": \"The name of the index to use.\",\n-                                \"displayName\": \"Index\",\n+                            \"Record Writer\": {\n+                                \"description\": \"The Record Writer to use for serializing Records after they have been transformed\",\n+                                \"displayName\": \"Record Writer\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"el-rest-fetch-index\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Record Writer\",\n                                 \"required\": true,\n-                                \"sensitive\": false\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n                             },\n-                            \"el-rest-type\": {\n-                                \"description\": \"The type of this document (used by Elasticsearch for indexing and searching).\",\n-                                \"displayName\": \"Type\",\n+                            \"Script Body\": {\n+                                \"description\": \"Body of script to execute. Only one of Script File or Script Body may be used\",\n+                                \"displayName\": \"Script Body\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"el-rest-type\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Script Body\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"get-es-attribute-name\": {\n-                                \"defaultValue\": \"elasticsearch.doc\",\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"flowfile-attribute\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Destination\",\n-                                        \"propertyName\": \"get-es-destination\"\n-                                    }\n-                                ],\n-                                \"description\": \"The name of the FlowFile attribute to use for the retrieved document output.\",\n-                                \"displayName\": \"Attribute Name\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"get-es-attribute-name\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"get-es-destination\": {\n+                            \"Script Engine\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Output the retrieved document as the FlowFile content.\",\n-                                        \"displayName\": \"FlowFile Content\",\n-                                        \"value\": \"flowfile-content\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Clojure\",\n+                                        \"value\": \"Clojure\"\n                                     },\n                                     {\n-                                        \"description\": \"Output the retrieved document as a FlowFile attribute specified by the Attribute Name.\",\n-                                        \"displayName\": \"FlowFile Attribute\",\n-                                        \"value\": \"flowfile-attribute\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"ECMAScript\",\n+                                        \"value\": \"ECMAScript\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Groovy\",\n+                                        \"value\": \"Groovy\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"lua\",\n+                                        \"value\": \"lua\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"python\",\n+                                        \"value\": \"python\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"ruby\",\n+                                        \"value\": \"ruby\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"flowfile-content\",\n-                                \"description\": \"Indicates whether the retrieved document is written to the FlowFile content or a FlowFile attribute.\",\n-                                \"displayName\": \"Destination\",\n+                                \"defaultValue\": \"Groovy\",\n+                                \"description\": \"The Language to use for the script\",\n+                                \"displayName\": \"Script Language\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"get-es-destination\",\n+                                \"name\": \"Script Engine\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"get-es-id\": {\n-                                \"description\": \"The _id of the document to retrieve.\",\n-                                \"displayName\": \"Document Id\",\n+                            \"Script File\": {\n+                                \"description\": \"Path to script file to execute. Only one of Script File or Script Body may be used\",\n+                                \"displayName\": \"Script File\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"get-es-id\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Script File\",\n+                                \"required\": false,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"SINGLE\",\n+                                    \"resourceTypes\": [\n+                                        \"FILE\"\n+                                    ]\n+                                },\n                                 \"sensitive\": false\n                             }\n                         },\n+                        \"restricted\": true,\n                         \"seeAlso\": [\n-                            \"org.apache.nifi.processors.elasticsearch.JsonQueryElasticsearch\"\n+                            \"org.apache.nifi.processors.script.ScriptedPartitionRecord\",\n+                            \"org.apache.nifi.processors.script.ScriptedTransformRecord\",\n+                            \"org.apache.nifi.processors.script.ScriptedValidateRecord\"\n                         ],\n-                        \"sideEffectFree\": false,\n+                        \"sideEffectFree\": true,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"All flowfiles that fail due to server/cluster availability go to this relationship.\",\n-                                \"name\": \"retry\"\n-                            },\n-                            {\n-                                \"description\": \"Fetched documents are routed to this relationship.\",\n-                                \"name\": \"document\"\n+                                \"description\": \"Matching records of the original FlowFile will be routed to this relationship. If there are no matching records, no FlowFile will be routed here.\",\n+                                \"name\": \"success\"\n                             },\n                             {\n-                                \"description\": \"A FlowFile is routed to this relationship if the specified document does not exist in the Elasticsearch cluster.\",\n-                                \"name\": \"not_found\"\n+                                \"description\": \"In case of any issue during processing the incoming FlowFile, the incoming FlowFile will be routed to this relationship.\",\n+                                \"name\": \"failure\"\n                             },\n                             {\n-                                \"description\": \"All flowfiles that fail for reasons unrelated to server availability go to this relationship.\",\n-                                \"name\": \"failure\"\n+                                \"description\": \"After successful procession, the incoming FlowFile will be transferred to this relationship. This happens regardless the number of filtered or remaining records.\",\n+                                \"name\": \"original\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n+                            \"CRON_DRIVEN\",\n+                            \"EVENT_DRIVEN\"\n                         ],\n-                        \"supportsBatching\": false,\n-                        \"supportsDynamicProperties\": true,\n+                        \"supportsBatching\": true,\n+                        \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": false,\n+                        \"supportsEventDriven\": true,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"elasticsearch\",\n-                            \"elasticsearch5\",\n-                            \"elasticsearch6\",\n-                            \"elasticsearch7\",\n-                            \"elasticsearch8\",\n-                            \"index\",\n-                            \"json\",\n-                            \"put\",\n-                            \"record\"\n+                            \"filter\",\n+                            \"groovy\",\n+                            \"jython\",\n+                            \"python\",\n+                            \"record\",\n+                            \"script\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.elasticsearch.GetElasticsearch\",\n-                        \"typeDescription\": \"Elasticsearch get processor that uses the official Elastic REST client libraries to fetch a single document from Elasticsearch by _id. Note that the full body of the document will be read into memory before being written to a FlowFile for transfer.\",\n+                        \"type\": \"org.apache.nifi.processors.script.ScriptedFilterRecord\",\n+                        \"typeDescription\": \"This processor provides the ability to filter records out from FlowFiles using the user-provided script. Every record will be evaluated by the script which must return with a boolean value. Records with \\\"true\\\" result will be routed to the \\\"matching\\\" relationship in a batch. Other records will be filtered out.\",\n                         \"version\": \"1.27.0\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"The filename attribute is set to the document identifier\",\n-                                \"name\": \"filename\"\n-                            },\n-                            {\n-                                \"description\": \"The Elasticsearch index containing the document\",\n-                                \"name\": \"elasticsearch.index\"\n+                                \"description\": \"Sets the mime.type attribute to the MIME Type specified by the Record Writer\",\n+                                \"name\": \"mime.type\"\n                             },\n                             {\n-                                \"description\": \"The Elasticsearch document type\",\n-                                \"name\": \"elasticsearch.type\"\n+                                \"description\": \"The number of records within the flow file.\",\n+                                \"name\": \"record.count\"\n                             },\n                             {\n-                                \"description\": \"The error message provided by Elasticsearch if there is an error fetching the document.\",\n-                                \"name\": \"elasticsearch.get.error\"\n+                                \"description\": \"This attribute provides on failure the error message encountered by the Reader or Writer.\",\n+                                \"name\": \"record.error.message\"\n                             }\n                         ]\n                     },\n                     {\n                         \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-elasticsearch-restapi-nar\",\n+                        \"artifact\": \"nifi-scripting-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"EVENT_DRIVEN\": 0,\n@@ -20824,429 +21807,221 @@\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n-                        \"dynamicProperties\": [\n+                        \"explicitRestrictions\": [\n                             {\n-                                \"description\": \"Adds the specified property name/value as a query parameter in the Elasticsearch URL used for processing. These parameters will override any matching parameters in the query request body\",\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"name\": \"The name of a URL query parameter to add\",\n-                                \"value\": \"The value of the URL query parameter\"\n+                                \"explanation\": \"Provides operator the ability to execute arbitrary code assuming all permissions that NiFi has.\",\n+                                \"requiredPermission\": \"execute code\"\n                             }\n                         ],\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_ALLOWED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"el-query-attribute\": {\n-                                \"description\": \"If set, the executed query will be set on each result flowfile in the specified attribute.\",\n-                                \"displayName\": \"Query Attribute\",\n+                            \"Module Directory\": {\n+                                \"description\": \"Comma-separated list of paths to files and/or directories which contain modules required by the script.\",\n+                                \"displayName\": \"Module Directory\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"el-query-attribute\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Module Directory\",\n                                 \"required\": false,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"MULTIPLE\",\n+                                    \"resourceTypes\": [\n+                                        \"DIRECTORY\",\n+                                        \"FILE\"\n+                                    ]\n+                                },\n                                 \"sensitive\": false\n                             },\n-                            \"el-rest-client-service\": {\n-                                \"description\": \"An Elasticsearch client service to use for running queries.\",\n-                                \"displayName\": \"Client Service\",\n+                            \"Record Reader\": {\n+                                \"description\": \"The Record Reader to use parsing the incoming FlowFile into Records\",\n+                                \"displayName\": \"Record Reader\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"el-rest-client-service\",\n+                                \"name\": \"Record Reader\",\n                                 \"required\": true,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-elasticsearch-client-service-api-nar\",\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.elasticsearch.ElasticSearchClientService\",\n+                                    \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             },\n-                            \"el-rest-fetch-index\": {\n-                                \"description\": \"The name of the index to use.\",\n-                                \"displayName\": \"Index\",\n+                            \"Record Writer\": {\n+                                \"description\": \"The Record Writer to use for serializing Records after they have been transformed\",\n+                                \"displayName\": \"Record Writer\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"el-rest-fetch-index\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Record Writer\",\n                                 \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"el-rest-format-aggregations\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"Contains full Elasticsearch Aggregation, including Buckets and Metadata.\",\n-                                        \"displayName\": \"FULL\",\n-                                        \"value\": \"FULL\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Bucket Content only.\",\n-                                        \"displayName\": \"BUCKETS_ONLY\",\n-                                        \"value\": \"BUCKETS_ONLY\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Aggregation Metadata only.\",\n-                                        \"displayName\": \"METADATA_ONLY\",\n-                                        \"value\": \"METADATA_ONLY\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"FULL\",\n-                                \"description\": \"Format of Aggregation output.\",\n-                                \"displayName\": \"Aggregation Results Format\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"el-rest-format-aggregations\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n                             },\n-                            \"el-rest-format-hits\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"Contains full Elasticsearch Hit, including Document Source and Metadata.\",\n-                                        \"displayName\": \"FULL\",\n-                                        \"value\": \"FULL\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Document Source only (where present).\",\n-                                        \"displayName\": \"SOURCE_ONLY\",\n-                                        \"value\": \"SOURCE_ONLY\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Hit Metadata only.\",\n-                                        \"displayName\": \"METADATA_ONLY\",\n-                                        \"value\": \"METADATA_ONLY\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"FULL\",\n-                                \"description\": \"Format of Hits output.\",\n-                                \"displayName\": \"Search Results Format\",\n+                            \"Script Body\": {\n+                                \"description\": \"Body of script to execute. Only one of Script File or Script Body may be used\",\n+                                \"displayName\": \"Script Body\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"el-rest-format-hits\",\n-                                \"required\": true,\n+                                \"name\": \"Script Body\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"el-rest-output-no-hits\": {\n+                            \"Script Engine\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"displayName\": \"Clojure\",\n+                                        \"value\": \"Clojure\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"Output a \\\"hits\\\" flowfile even if no hits found for query. If true, an empty \\\"hits\\\" flowfile will be output even if \\\"aggregations\\\" are output.\",\n-                                \"displayName\": \"Output No Hits\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"el-rest-output-no-hits\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"el-rest-query\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"full\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Query Definition Style\",\n-                                        \"propertyName\": \"el-rest-query-definition-style\"\n-                                    }\n-                                ],\n-                                \"description\": \"A query in JSON syntax, not Lucene syntax. Ex: {\\\"query\\\":{\\\"match\\\":{\\\"somefield\\\":\\\"somevalue\\\"}}}. If this parameter is not set, the query will be read from the flowfile content. If the query (property and flowfile content) is empty, a default empty JSON Object will be used, which will result in a \\\"match_all\\\" query in Elasticsearch.\",\n-                                \"displayName\": \"Query\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"el-rest-query\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"el-rest-query-clause\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"build\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Query Definition Style\",\n-                                        \"propertyName\": \"el-rest-query-definition-style\"\n-                                    }\n-                                ],\n-                                \"description\": \"A \\\"query\\\" clause in JSON syntax, not Lucene syntax. Ex: {\\\"match\\\":{\\\"somefield\\\":\\\"somevalue\\\"}}. If the query is empty, a default JSON Object will be used, which will result in a \\\"match_all\\\" query in Elasticsearch.\",\n-                                \"displayName\": \"Query Clause\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"el-rest-query-clause\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"el-rest-query-definition-style\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"Provide the full Query.\",\n-                                        \"displayName\": \"FULL_QUERY\",\n-                                        \"value\": \"full\"\n+                                        \"displayName\": \"ECMAScript\",\n+                                        \"value\": \"ECMAScript\"\n                                     },\n                                     {\n-                                        \"description\": \"Build the Query from separate JSON objects.\",\n-                                        \"displayName\": \"BUILD_QUERY\",\n-                                        \"value\": \"build\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"full\",\n-                                \"description\": \"How the JSON Query will be defined for use by the processor.\",\n-                                \"displayName\": \"Query Definition Style\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"el-rest-query-definition-style\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"el-rest-split-up-aggregations\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"Flowfile per hit.\",\n-                                        \"displayName\": \"PER_HIT\",\n-                                        \"value\": \"splitUp-yes\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Groovy\",\n+                                        \"value\": \"Groovy\"\n                                     },\n                                     {\n-                                        \"description\": \"Flowfile per response.\",\n-                                        \"displayName\": \"PER_RESPONSE\",\n-                                        \"value\": \"splitUp-no\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"splitUp-no\",\n-                                \"description\": \"Output a flowfile containing all aggregations or one flowfile for each individual aggregation.\",\n-                                \"displayName\": \"Aggregation Results Split\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"el-rest-split-up-aggregations\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"el-rest-split-up-hits\": {\n-                                \"allowableValues\": [\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"lua\",\n+                                        \"value\": \"lua\"\n+                                    },\n                                     {\n-                                        \"description\": \"Flowfile per hit.\",\n-                                        \"displayName\": \"PER_HIT\",\n-                                        \"value\": \"splitUp-yes\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"python\",\n+                                        \"value\": \"python\"\n                                     },\n                                     {\n-                                        \"description\": \"Flowfile per response.\",\n-                                        \"displayName\": \"PER_RESPONSE\",\n-                                        \"value\": \"splitUp-no\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"ruby\",\n+                                        \"value\": \"ruby\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"splitUp-no\",\n-                                \"description\": \"Output a flowfile containing all hits or one flowfile for each individual hit.\",\n-                                \"displayName\": \"Search Results Split\",\n+                                \"defaultValue\": \"Groovy\",\n+                                \"description\": \"The Language to use for the script\",\n+                                \"displayName\": \"Script Language\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"el-rest-split-up-hits\",\n+                                \"name\": \"Script Engine\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"el-rest-type\": {\n-                                \"description\": \"The type of this document (used by Elasticsearch for indexing and searching).\",\n-                                \"displayName\": \"Type\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"el-rest-type\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"es-rest-query-aggs\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"build\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Query Definition Style\",\n-                                        \"propertyName\": \"el-rest-query-definition-style\"\n-                                    }\n-                                ],\n-                                \"description\": \"One or more query aggregations (or \\\"aggs\\\"), in JSON syntax. Ex: {\\\"items\\\": {\\\"terms\\\": {\\\"field\\\": \\\"product\\\", \\\"size\\\": 10}}}\",\n-                                \"displayName\": \"Aggregations\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"es-rest-query-aggs\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"es-rest-query-fields\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"build\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Query Definition Style\",\n-                                        \"propertyName\": \"el-rest-query-definition-style\"\n-                                    }\n-                                ],\n-                                \"description\": \"Fields of indexed documents to be retrieved, in JSON syntax. Ex: [\\\"user.id\\\", \\\"http.response.*\\\", {\\\"field\\\": \\\"@timestamp\\\", \\\"format\\\": \\\"epoch_millis\\\"}]\",\n-                                \"displayName\": \"Fields\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"es-rest-query-fields\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"es-rest-query-script-fields\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"build\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Query Definition Style\",\n-                                        \"propertyName\": \"el-rest-query-definition-style\"\n-                                    }\n-                                ],\n-                                \"description\": \"Fields to created using script evaluation at query runtime, in JSON syntax. Ex: {\\\"test1\\\": {\\\"script\\\": {\\\"lang\\\": \\\"painless\\\", \\\"source\\\": \\\"doc['price'].value * 2\\\"}}, \\\"test2\\\": {\\\"script\\\": {\\\"lang\\\": \\\"painless\\\", \\\"source\\\": \\\"doc['price'].value * params.factor\\\", \\\"params\\\": {\\\"factor\\\": 2.0}}}}\",\n-                                \"displayName\": \"Script Fields\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"es-rest-query-script-fields\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"es-rest-query-sort\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"build\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Query Definition Style\",\n-                                        \"propertyName\": \"el-rest-query-definition-style\"\n-                                    }\n-                                ],\n-                                \"description\": \"Sort results by one or more fields, in JSON syntax. Ex: [{\\\"price\\\" : {\\\"order\\\" : \\\"asc\\\", \\\"mode\\\" : \\\"avg\\\"}}, {\\\"post_date\\\" : {\\\"format\\\": \\\"strict_date_optional_time_nanos\\\"}}]\",\n-                                \"displayName\": \"Sort\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"es-rest-query-sort\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"es-rest-size\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"build\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Query Definition Style\",\n-                                        \"propertyName\": \"el-rest-query-definition-style\"\n-                                    }\n-                                ],\n-                                \"description\": \"The maximum number of documents to retrieve in the query. If the query is paginated, this \\\"size\\\" applies to each page of the query, not the \\\"size\\\" of the entire result set.\",\n-                                \"displayName\": \"Size\",\n+                            \"Script File\": {\n+                                \"description\": \"Path to script file to execute. Only one of Script File or Script Body may be used\",\n+                                \"displayName\": \"Script File\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"es-rest-size\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Script File\",\n                                 \"required\": false,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"SINGLE\",\n+                                    \"resourceTypes\": [\n+                                        \"FILE\"\n+                                    ]\n+                                },\n                                 \"sensitive\": false\n                             }\n                         },\n+                        \"restricted\": true,\n                         \"seeAlso\": [\n-                            \"org.apache.nifi.processors.elasticsearch.PaginatedJsonQueryElasticsearch\"\n+                            \"org.apache.nifi.processors.script.ScriptedFilterRecord\",\n+                            \"org.apache.nifi.processors.script.ScriptedTransformRecord\",\n+                            \"org.apache.nifi.processors.script.ScriptedValidateRecord\"\n                         ],\n-                        \"sideEffectFree\": false,\n+                        \"sideEffectFree\": true,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"Aggregations are routed to this relationship.\",\n-                                \"name\": \"aggregations\"\n+                                \"description\": \"FlowFiles that are successfully partitioned will be routed to this relationship\",\n+                                \"name\": \"success\"\n                             },\n                             {\n-                                \"description\": \"All flowfiles that fail for reasons unrelated to server availability go to this relationship.\",\n+                                \"description\": \"If a FlowFile cannot be partitioned from the configured input format to the configured output format, the unchanged FlowFile will be routed to this relationship\",\n                                 \"name\": \"failure\"\n                             },\n                             {\n-                                \"description\": \"All original flowfiles that don't cause an error to occur go to this relationship.\",\n+                                \"description\": \"Once all records in an incoming FlowFile have been partitioned, the original FlowFile is routed to this relationship.\",\n                                 \"name\": \"original\"\n-                            },\n-                            {\n-                                \"description\": \"Search hits are routed to this relationship.\",\n-                                \"name\": \"hits\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\",\n                             \"EVENT_DRIVEN\"\n                         ],\n                         \"supportsBatching\": false,\n-                        \"supportsDynamicProperties\": true,\n+                        \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsEventDriven\": true,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"elasticsearch\",\n-                            \"elasticsearch5\",\n-                            \"elasticsearch6\",\n-                            \"elasticsearch7\",\n-                            \"elasticsearch8\",\n-                            \"get\",\n-                            \"json\",\n-                            \"query\",\n-                            \"read\"\n+                            \"groovy\",\n+                            \"group\",\n+                            \"jython\",\n+                            \"organize\",\n+                            \"partition\",\n+                            \"python\",\n+                            \"record\",\n+                            \"script\",\n+                            \"segment\",\n+                            \"split\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.elasticsearch.JsonQueryElasticsearch\",\n-                        \"typeDescription\": \"A processor that allows the user to run a query (with aggregations) written with the Elasticsearch JSON DSL. It does not automatically paginate queries for the user. If an incoming relationship is added to this processor, it will use the flowfile's content for the query. Care should be taken on the size of the query because the entire response from Elasticsearch will be loaded into memory all at once and converted into the resulting flowfiles.\",\n+                        \"type\": \"org.apache.nifi.processors.script.ScriptedPartitionRecord\",\n+                        \"typeDescription\": \"Receives Record-oriented data (i.e., data that can be read by the configured Record Reader) and evaluates the user provided script against each record in the incoming flow file. Each record is then grouped with other records sharing the same partition and a FlowFile is created for each groups of records. Two records shares the same partition if the evaluation of the script results the same return value for both. Those will be considered as part of the same partition.\",\n                         \"version\": \"1.27.0\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"application/json\",\n+                                \"description\": \"The partition of the outgoing flow file. If the script indicates that the partition has a null value, the attribute will be set to the literal string \\\"<null partition>\\\" (without quotes). Otherwise, the attribute is set to the String representation of whatever value is returned by the script.\",\n+                                \"name\": \"partition\"\n+                            },\n+                            {\n+                                \"description\": \"Sets the mime.type attribute to the MIME Type specified by the Record Writer\",\n                                 \"name\": \"mime.type\"\n                             },\n                             {\n-                                \"description\": \"The name of the aggregation whose results are in the output flowfile\",\n-                                \"name\": \"aggregation.name\"\n+                                \"description\": \"The number of records within the flow file.\",\n+                                \"name\": \"record.count\"\n                             },\n                             {\n-                                \"description\": \"The number of the aggregation whose results are in the output flowfile\",\n-                                \"name\": \"aggregation.number\"\n+                                \"description\": \"This attribute provides on failure the error message encountered by the Reader or Writer.\",\n+                                \"name\": \"record.error.message\"\n                             },\n                             {\n-                                \"description\": \"The number of hits that are in the output flowfile\",\n-                                \"name\": \"hit.count\"\n+                                \"description\": \"A one-up number that indicates the ordering of the partitioned FlowFiles that were created from a single parent FlowFile\",\n+                                \"name\": \"fragment.index\"\n                             },\n                             {\n-                                \"description\": \"The error message provided by Elasticsearch if there is an error querying the index.\",\n-                                \"name\": \"elasticsearch.query.error\"\n+                                \"description\": \"The number of partitioned FlowFiles generated from the parent FlowFile\",\n+                                \"name\": \"fragment.count\"\n                             }\n                         ]\n                     },\n                     {\n                         \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-elasticsearch-restapi-nar\",\n+                        \"artifact\": \"nifi-scripting-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"EVENT_DRIVEN\": 0,\n@@ -21255,11688 +22030,7187 @@\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n-                        \"dynamicProperties\": [\n+                        \"explicitRestrictions\": [\n                             {\n-                                \"description\": \"Adds the specified property name/value as a query parameter in the Elasticsearch URL used for processing. These parameters will override any matching parameters in the query request body. For SCROLL type queries, these parameters are only used in the initial (first page) query as the Elasticsearch Scroll API does not support the same query parameters for subsequent pages of data.\",\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"name\": \"The name of a URL query parameter to add\",\n-                                \"value\": \"The value of the URL query parameter\"\n+                                \"explanation\": \"Provides operator the ability to execute arbitrary code assuming all permissions that NiFi has.\",\n+                                \"requiredPermission\": \"execute code\"\n                             }\n                         ],\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"el-query-attribute\": {\n-                                \"description\": \"If set, the executed query will be set on each result flowfile in the specified attribute.\",\n-                                \"displayName\": \"Query Attribute\",\n+                            \"Module Directory\": {\n+                                \"description\": \"Comma-separated list of paths to files and/or directories which contain modules required by the script.\",\n+                                \"displayName\": \"Module Directory\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"el-query-attribute\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Module Directory\",\n                                 \"required\": false,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"MULTIPLE\",\n+                                    \"resourceTypes\": [\n+                                        \"DIRECTORY\",\n+                                        \"FILE\"\n+                                    ]\n+                                },\n                                 \"sensitive\": false\n                             },\n-                            \"el-rest-client-service\": {\n-                                \"description\": \"An Elasticsearch client service to use for running queries.\",\n-                                \"displayName\": \"Client Service\",\n+                            \"Record Reader\": {\n+                                \"description\": \"The Record Reader to use parsing the incoming FlowFile into Records\",\n+                                \"displayName\": \"Record Reader\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"el-rest-client-service\",\n+                                \"name\": \"Record Reader\",\n                                 \"required\": true,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-elasticsearch-client-service-api-nar\",\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.elasticsearch.ElasticSearchClientService\",\n+                                    \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             },\n-                            \"el-rest-fetch-index\": {\n-                                \"description\": \"The name of the index to use.\",\n-                                \"displayName\": \"Index\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"el-rest-fetch-index\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"el-rest-format-aggregations\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"Contains full Elasticsearch Aggregation, including Buckets and Metadata.\",\n-                                        \"displayName\": \"FULL\",\n-                                        \"value\": \"FULL\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Bucket Content only.\",\n-                                        \"displayName\": \"BUCKETS_ONLY\",\n-                                        \"value\": \"BUCKETS_ONLY\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Aggregation Metadata only.\",\n-                                        \"displayName\": \"METADATA_ONLY\",\n-                                        \"value\": \"METADATA_ONLY\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"FULL\",\n-                                \"description\": \"Format of Aggregation output.\",\n-                                \"displayName\": \"Aggregation Results Format\",\n+                            \"Record Writer\": {\n+                                \"description\": \"The Record Writer to use for serializing Records after they have been transformed\",\n+                                \"displayName\": \"Record Writer\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"el-rest-format-aggregations\",\n+                                \"name\": \"Record Writer\",\n                                 \"required\": true,\n-                                \"sensitive\": false\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n                             },\n-                            \"el-rest-format-hits\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"Contains full Elasticsearch Hit, including Document Source and Metadata.\",\n-                                        \"displayName\": \"FULL\",\n-                                        \"value\": \"FULL\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Document Source only (where present).\",\n-                                        \"displayName\": \"SOURCE_ONLY\",\n-                                        \"value\": \"SOURCE_ONLY\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Hit Metadata only.\",\n-                                        \"displayName\": \"METADATA_ONLY\",\n-                                        \"value\": \"METADATA_ONLY\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"FULL\",\n-                                \"description\": \"Format of Hits output.\",\n-                                \"displayName\": \"Search Results Format\",\n+                            \"Script Body\": {\n+                                \"description\": \"Body of script to execute. Only one of Script File or Script Body may be used\",\n+                                \"displayName\": \"Script Body\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"el-rest-format-hits\",\n-                                \"required\": true,\n+                                \"name\": \"Script Body\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"el-rest-output-no-hits\": {\n+                            \"Script Engine\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"displayName\": \"Clojure\",\n+                                        \"value\": \"Clojure\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"Output a \\\"hits\\\" flowfile even if no hits found for query. If true, an empty \\\"hits\\\" flowfile will be output even if \\\"aggregations\\\" are output.\",\n-                                \"displayName\": \"Output No Hits\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"el-rest-output-no-hits\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"el-rest-pagination-keep-alive\": {\n-                                \"defaultValue\": \"10 mins\",\n-                                \"description\": \"Pagination \\\"keep_alive\\\" period. Period Elasticsearch will keep the scroll/pit cursor alive in between requests (this is not the time expected for all pages to be returned, but the maximum allowed time for requests between page retrievals).\",\n-                                \"displayName\": \"Pagination Keep Alive\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"el-rest-pagination-keep-alive\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"el-rest-pagination-type\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"Use Elasticsearch \\\"_scroll\\\" API to page results. Does not accept additional query parameters.\",\n-                                        \"displayName\": \"SCROLL\",\n-                                        \"value\": \"pagination-scroll\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Use Elasticsearch \\\"search_after\\\" _search API to page sorted results.\",\n-                                        \"displayName\": \"SEARCH_AFTER\",\n-                                        \"value\": \"pagination-search_after\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Use Elasticsearch (7.10+ with XPack) \\\"point in time\\\" _search API to page sorted results.\",\n-                                        \"displayName\": \"POINT_IN_TIME\",\n-                                        \"value\": \"pagination-pit\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"pagination-scroll\",\n-                                \"description\": \"Pagination method to use. Not all types are available for all Elasticsearch versions, check the Elasticsearch docs to confirm which are applicable and recommended for your service.\",\n-                                \"displayName\": \"Pagination Type\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"el-rest-pagination-type\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"el-rest-query\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"full\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Query Definition Style\",\n-                                        \"propertyName\": \"el-rest-query-definition-style\"\n-                                    }\n-                                ],\n-                                \"description\": \"A query in JSON syntax, not Lucene syntax. Ex: {\\\"query\\\":{\\\"match\\\":{\\\"somefield\\\":\\\"somevalue\\\"}}}. If this parameter is not set, the query will be read from the flowfile content. If the query (property and flowfile content) is empty, a default empty JSON Object will be used, which will result in a \\\"match_all\\\" query in Elasticsearch.\",\n-                                \"displayName\": \"Query\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"el-rest-query\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"el-rest-query-clause\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"build\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Query Definition Style\",\n-                                        \"propertyName\": \"el-rest-query-definition-style\"\n-                                    }\n-                                ],\n-                                \"description\": \"A \\\"query\\\" clause in JSON syntax, not Lucene syntax. Ex: {\\\"match\\\":{\\\"somefield\\\":\\\"somevalue\\\"}}. If the query is empty, a default JSON Object will be used, which will result in a \\\"match_all\\\" query in Elasticsearch.\",\n-                                \"displayName\": \"Query Clause\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"el-rest-query-clause\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"el-rest-query-definition-style\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"Provide the full Query.\",\n-                                        \"displayName\": \"FULL_QUERY\",\n-                                        \"value\": \"full\"\n+                                        \"displayName\": \"ECMAScript\",\n+                                        \"value\": \"ECMAScript\"\n                                     },\n                                     {\n-                                        \"description\": \"Build the Query from separate JSON objects.\",\n-                                        \"displayName\": \"BUILD_QUERY\",\n-                                        \"value\": \"build\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"full\",\n-                                \"description\": \"How the JSON Query will be defined for use by the processor.\",\n-                                \"displayName\": \"Query Definition Style\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"el-rest-query-definition-style\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"el-rest-split-up-aggregations\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"Flowfile per hit.\",\n-                                        \"displayName\": \"PER_HIT\",\n-                                        \"value\": \"splitUp-yes\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Groovy\",\n+                                        \"value\": \"Groovy\"\n                                     },\n                                     {\n-                                        \"description\": \"Flowfile per response.\",\n-                                        \"displayName\": \"PER_RESPONSE\",\n-                                        \"value\": \"splitUp-no\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"splitUp-no\",\n-                                \"description\": \"Output a flowfile containing all aggregations or one flowfile for each individual aggregation.\",\n-                                \"displayName\": \"Aggregation Results Split\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"el-rest-split-up-aggregations\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"el-rest-split-up-hits\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"Flowfile per hit.\",\n-                                        \"displayName\": \"PER_HIT\",\n-                                        \"value\": \"splitUp-yes\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"lua\",\n+                                        \"value\": \"lua\"\n                                     },\n                                     {\n-                                        \"description\": \"Flowfile per response.\",\n-                                        \"displayName\": \"PER_RESPONSE\",\n-                                        \"value\": \"splitUp-no\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"python\",\n+                                        \"value\": \"python\"\n                                     },\n                                     {\n-                                        \"description\": \"Combine results from all query responses (one flowfile per entire paginated result set of hits). Note that aggregations cannot be paged, they are generated across the entire result set and returned as part of the first page. Results are output with one JSON object per line (allowing hits to be combined from multiple pages without loading all results into memory).\",\n-                                        \"displayName\": \"PER_QUERY\",\n-                                        \"value\": \"splitUp-query\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"ruby\",\n+                                        \"value\": \"ruby\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"splitUp-no\",\n-                                \"description\": \"Output a flowfile containing all hits or one flowfile for each individual hit or one flowfile containing all hits from all paged responses.\",\n-                                \"displayName\": \"Search Results Split\",\n+                                \"defaultValue\": \"Groovy\",\n+                                \"description\": \"The Language to use for the script\",\n+                                \"displayName\": \"Script Language\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"el-rest-split-up-hits\",\n+                                \"name\": \"Script Engine\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"el-rest-type\": {\n-                                \"description\": \"The type of this document (used by Elasticsearch for indexing and searching).\",\n-                                \"displayName\": \"Type\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"el-rest-type\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"es-rest-query-aggs\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"build\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Query Definition Style\",\n-                                        \"propertyName\": \"el-rest-query-definition-style\"\n-                                    }\n-                                ],\n-                                \"description\": \"One or more query aggregations (or \\\"aggs\\\"), in JSON syntax. Ex: {\\\"items\\\": {\\\"terms\\\": {\\\"field\\\": \\\"product\\\", \\\"size\\\": 10}}}\",\n-                                \"displayName\": \"Aggregations\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"es-rest-query-aggs\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"es-rest-query-fields\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"build\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Query Definition Style\",\n-                                        \"propertyName\": \"el-rest-query-definition-style\"\n-                                    }\n-                                ],\n-                                \"description\": \"Fields of indexed documents to be retrieved, in JSON syntax. Ex: [\\\"user.id\\\", \\\"http.response.*\\\", {\\\"field\\\": \\\"@timestamp\\\", \\\"format\\\": \\\"epoch_millis\\\"}]\",\n-                                \"displayName\": \"Fields\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"es-rest-query-fields\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"es-rest-query-script-fields\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"build\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Query Definition Style\",\n-                                        \"propertyName\": \"el-rest-query-definition-style\"\n-                                    }\n-                                ],\n-                                \"description\": \"Fields to created using script evaluation at query runtime, in JSON syntax. Ex: {\\\"test1\\\": {\\\"script\\\": {\\\"lang\\\": \\\"painless\\\", \\\"source\\\": \\\"doc['price'].value * 2\\\"}}, \\\"test2\\\": {\\\"script\\\": {\\\"lang\\\": \\\"painless\\\", \\\"source\\\": \\\"doc['price'].value * params.factor\\\", \\\"params\\\": {\\\"factor\\\": 2.0}}}}\",\n-                                \"displayName\": \"Script Fields\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"es-rest-query-script-fields\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"es-rest-query-sort\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"build\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Query Definition Style\",\n-                                        \"propertyName\": \"el-rest-query-definition-style\"\n-                                    }\n-                                ],\n-                                \"description\": \"Sort results by one or more fields, in JSON syntax. Ex: [{\\\"price\\\" : {\\\"order\\\" : \\\"asc\\\", \\\"mode\\\" : \\\"avg\\\"}}, {\\\"post_date\\\" : {\\\"format\\\": \\\"strict_date_optional_time_nanos\\\"}}]\",\n-                                \"displayName\": \"Sort\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"es-rest-query-sort\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"es-rest-size\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"build\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Query Definition Style\",\n-                                        \"propertyName\": \"el-rest-query-definition-style\"\n-                                    }\n-                                ],\n-                                \"description\": \"The maximum number of documents to retrieve in the query. If the query is paginated, this \\\"size\\\" applies to each page of the query, not the \\\"size\\\" of the entire result set.\",\n-                                \"displayName\": \"Size\",\n+                            \"Script File\": {\n+                                \"description\": \"Path to script file to execute. Only one of Script File or Script Body may be used\",\n+                                \"displayName\": \"Script File\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"es-rest-size\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Script File\",\n                                 \"required\": false,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"SINGLE\",\n+                                    \"resourceTypes\": [\n+                                        \"FILE\"\n+                                    ]\n+                                },\n                                 \"sensitive\": false\n                             }\n                         },\n+                        \"restricted\": true,\n                         \"seeAlso\": [\n-                            \"org.apache.nifi.processors.elasticsearch.ConsumeElasticsearch\",\n-                            \"org.apache.nifi.processors.elasticsearch.JsonQueryElasticsearch\",\n-                            \"org.apache.nifi.processors.elasticsearch.SearchElasticsearch\"\n+                            \"org.apache.nifi.processors.jolt.record.JoltTransformRecord\",\n+                            \"org.apache.nifi.processors.script.ExecuteScript\",\n+                            \"org.apache.nifi.processors.standard.LookupRecord\",\n+                            \"org.apache.nifi.processors.standard.QueryRecord\",\n+                            \"org.apache.nifi.processors.standard.UpdateRecord\"\n                         ],\n-                        \"sideEffectFree\": false,\n+                        \"sideEffectFree\": true,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"Aggregations are routed to this relationship.\",\n-                                \"name\": \"aggregations\"\n+                                \"description\": \"Each FlowFile that were successfully transformed will be routed to this Relationship\",\n+                                \"name\": \"success\"\n                             },\n                             {\n-                                \"description\": \"All flowfiles that fail for reasons unrelated to server availability go to this relationship.\",\n+                                \"description\": \"Any FlowFile that cannot be transformed will be routed to this Relationship\",\n                                 \"name\": \"failure\"\n-                            },\n-                            {\n-                                \"description\": \"All original flowfiles that don't cause an error to occur go to this relationship.\",\n-                                \"name\": \"original\"\n-                            },\n-                            {\n-                                \"description\": \"Search hits are routed to this relationship.\",\n-                                \"name\": \"hits\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\",\n                             \"EVENT_DRIVEN\"\n                         ],\n-                        \"supportsBatching\": false,\n-                        \"supportsDynamicProperties\": true,\n+                        \"supportsBatching\": true,\n+                        \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsEventDriven\": true,\n                         \"supportsSensitiveDynamicProperties\": false,\n-                        \"systemResourceConsiderations\": [\n-                            {\n-                                \"description\": \"Care should be taken on the size of each page because each response from Elasticsearch will be loaded into memory all at once and converted into the resulting flowfiles.\",\n-                                \"resource\": \"MEMORY\"\n-                            }\n-                        ],\n                         \"tags\": [\n-                            \"elasticsearch\",\n-                            \"elasticsearch5\",\n-                            \"elasticsearch6\",\n-                            \"elasticsearch7\",\n-                            \"elasticsearch8\",\n-                            \"json\",\n-                            \"page\",\n-                            \"query\",\n-                            \"read\",\n-                            \"scroll\"\n+                            \"filter\",\n+                            \"groovy\",\n+                            \"jython\",\n+                            \"modify\",\n+                            \"python\",\n+                            \"record\",\n+                            \"script\",\n+                            \"transform\",\n+                            \"update\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.elasticsearch.PaginatedJsonQueryElasticsearch\",\n-                        \"typeDescription\": \"A processor that allows the user to run a paginated query (with aggregations) written with the Elasticsearch JSON DSL. It will use the flowfile's content for the query unless the QUERY attribute is populated. Search After/Point in Time queries must include a valid \\\"sort\\\" field.\",\n+                        \"type\": \"org.apache.nifi.processors.script.ScriptedTransformRecord\",\n+                        \"typeDescription\": \"Provides the ability to evaluate a simple script against each record in an incoming FlowFile. The script may transform the record in some way, filter the record, or fork additional records. See Processor's Additional Details for more information.\",\n                         \"version\": \"1.27.0\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"application/json\",\n+                                \"description\": \"Sets the mime.type attribute to the MIME Type specified by the Record Writer\",\n                                 \"name\": \"mime.type\"\n                             },\n                             {\n-                                \"description\": \"The name of the aggregation whose results are in the output flowfile\",\n-                                \"name\": \"aggregation.name\"\n-                            },\n-                            {\n-                                \"description\": \"The number of the aggregation whose results are in the output flowfile\",\n-                                \"name\": \"aggregation.number\"\n-                            },\n-                            {\n-                                \"description\": \"The number of the page (request), starting from 1, in which the results were returned that are in the output flowfile\",\n-                                \"name\": \"page.number\"\n-                            },\n-                            {\n-                                \"description\": \"The number of hits that are in the output flowfile\",\n-                                \"name\": \"hit.count\"\n+                                \"description\": \"The number of records in the FlowFile\",\n+                                \"name\": \"record.count\"\n                             },\n                             {\n-                                \"description\": \"The error message provided by Elasticsearch if there is an error querying the index.\",\n-                                \"name\": \"elasticsearch.query.error\"\n+                                \"description\": \"This attribute provides on failure the error message encountered by the Reader or Writer.\",\n+                                \"name\": \"record.error.message\"\n                             }\n                         ]\n                     },\n                     {\n                         \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-elasticsearch-restapi-nar\",\n+                        \"artifact\": \"nifi-scripting-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n+                            \"EVENT_DRIVEN\": 0,\n                             \"TIMER_DRIVEN\": 1\n                         },\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n-                        \"dynamicProperties\": [\n-                            {\n-                                \"description\": \"Prefix: BULK: - adds the specified property name/value as a Bulk request header in the Elasticsearch Bulk API body used for processing. If the value is null or blank, the Bulk header will be omitted for the document operation. These parameters will override any matching parameters in the _bulk request body.\",\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"name\": \"The name of the Bulk request header\",\n-                                \"value\": \"The value of the Bulk request header\"\n-                            },\n+                        \"explicitRestrictions\": [\n                             {\n-                                \"description\": \"Adds the specified property name/value as a query parameter in the Elasticsearch URL used for processing. These parameters will override any matching parameters in the _bulk request body. If FlowFiles are batched, only the first FlowFile in the batch is used to evaluate property values.\",\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"name\": \"The name of a URL query parameter to add\",\n-                                \"value\": \"The value of the URL query parameter\"\n+                                \"explanation\": \"Provides operator the ability to execute arbitrary code assuming all permissions that NiFi has.\",\n+                                \"requiredPermission\": \"execute code\"\n                             }\n                         ],\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"el-rest-client-service\": {\n-                                \"description\": \"An Elasticsearch client service to use for running queries.\",\n-                                \"displayName\": \"Client Service\",\n+                            \"Module Directory\": {\n+                                \"description\": \"Comma-separated list of paths to files and/or directories which contain modules required by the script.\",\n+                                \"displayName\": \"Module Directory\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Module Directory\",\n+                                \"required\": false,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"MULTIPLE\",\n+                                    \"resourceTypes\": [\n+                                        \"DIRECTORY\",\n+                                        \"FILE\"\n+                                    ]\n+                                },\n+                                \"sensitive\": false\n+                            },\n+                            \"Record Reader\": {\n+                                \"description\": \"The Record Reader to use parsing the incoming FlowFile into Records\",\n+                                \"displayName\": \"Record Reader\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"el-rest-client-service\",\n+                                \"name\": \"Record Reader\",\n                                 \"required\": true,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-elasticsearch-client-service-api-nar\",\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.elasticsearch.ElasticSearchClientService\",\n+                                    \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             },\n-                            \"el-rest-fetch-index\": {\n-                                \"description\": \"The name of the index to use.\",\n-                                \"displayName\": \"Index\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"el-rest-fetch-index\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"el-rest-type\": {\n-                                \"description\": \"The type of this document (used by Elasticsearch for indexing and searching).\",\n-                                \"displayName\": \"Type\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"el-rest-type\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"put-es-json-charset\": {\n-                                \"defaultValue\": \"UTF-8\",\n-                                \"description\": \"Specifies the character set of the document data.\",\n-                                \"displayName\": \"Character Set\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"put-es-json-charset\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"put-es-json-dynamic_templates\": {\n-                                \"description\": \"The dynamic_templates for the document. Must be parsable as a JSON Object. Requires Elasticsearch 7+\",\n-                                \"displayName\": \"Dynamic Templates\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"put-es-json-dynamic_templates\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"put-es-json-error-documents\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"If this configuration property is true, the response from Elasticsearch will be examined for failed documents and the FlowFile(s) associated with the failed document(s) will be sent to the \\\"errors\\\" relationship with \\\"elasticsearch.bulk.error\\\" attributes.\",\n-                                \"displayName\": \"Output Error Documents\",\n+                            \"Record Writer\": {\n+                                \"description\": \"The Record Writer to use for serializing Records after they have been transformed\",\n+                                \"displayName\": \"Record Writer\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"put-es-json-error-documents\",\n+                                \"name\": \"Record Writer\",\n                                 \"required\": true,\n-                                \"sensitive\": false\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n                             },\n-                            \"put-es-json-id-attr\": {\n-                                \"description\": \"The name of the FlowFile attribute containing the identifier for the document. If the Index Operation is \\\"index\\\", this property may be left empty or evaluate to an empty value, in which case the document's identifier will be auto-generated by Elasticsearch. For all other Index Operations, the attribute must evaluate to a non-empty value.\",\n-                                \"displayName\": \"Identifier Attribute\",\n+                            \"Script Body\": {\n+                                \"description\": \"Body of script to execute. Only one of Script File or Script Body may be used\",\n+                                \"displayName\": \"Script Body\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"put-es-json-id-attr\",\n+                                \"name\": \"Script Body\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"put-es-json-not_found-is-error\": {\n+                            \"Script Engine\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"displayName\": \"Clojure\",\n+                                        \"value\": \"Clojure\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"true\",\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"true\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Output Error Documents\",\n-                                        \"propertyName\": \"put-es-json-error-documents\"\n-                                    }\n-                                ],\n-                                \"description\": \"If true, \\\"not_found\\\" Elasticsearch Document associated FlowFiles will be routed to the \\\"success\\\" relationship, otherwise to the \\\"errors\\\" relationship. If Output Error Responses is \\\"true\\\" then \\\"not_found\\\" responses from Elasticsearch will be sent to the error_responses relationship\",\n-                                \"displayName\": \"Treat \\\"Not Found\\\" as Success\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"put-es-json-not_found-is-error\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"put-es-json-script\": {\n-                                \"description\": \"The script for the document update/upsert. Only applies to Update/Upsert operations. Must be parsable as JSON Object. If left blank, the FlowFile content will be used for document update/upsert\",\n-                                \"displayName\": \"Script\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"put-es-json-script\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"put-es-json-scripted-upsert\": {\n-                                \"allowableValues\": [\n+                                        \"displayName\": \"ECMAScript\",\n+                                        \"value\": \"ECMAScript\"\n+                                    },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"displayName\": \"Groovy\",\n+                                        \"value\": \"Groovy\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"Whether to add the scripted_upsert flag to the Upsert Operation. Forces Elasticsearch to execute the Script whether or not the document exists, defaults to false. If the Upsert Document provided (from FlowFile content) will be empty, but sure to set the Client Service controller service's Suppress Null/Empty Values to Never Suppress or no \\\"upsert\\\" doc will be, included in the request to Elasticsearch and the operation will not create a new document for the script to execute against, resulting in a \\\"not_found\\\" error\",\n-                                \"displayName\": \"Scripted Upsert\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"put-es-json-scripted-upsert\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"put-es-output-error-responses\": {\n-                                \"allowableValues\": [\n+                                        \"displayName\": \"lua\",\n+                                        \"value\": \"lua\"\n+                                    },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"displayName\": \"python\",\n+                                        \"value\": \"python\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"displayName\": \"ruby\",\n+                                        \"value\": \"ruby\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"If this is enabled, response messages from Elasticsearch marked as \\\"error\\\" will be output to the \\\"error_responses\\\" relationship.This does not impact the output of flowfiles to the \\\"success\\\" or \\\"errors\\\" relationships\",\n-                                \"displayName\": \"Output Error Responses\",\n+                                \"defaultValue\": \"Groovy\",\n+                                \"description\": \"The Language to use for the script\",\n+                                \"displayName\": \"Script Language\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"put-es-output-error-responses\",\n-                                \"required\": false,\n+                                \"name\": \"Script Engine\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"put-es-record-batch-size\": {\n-                                \"defaultValue\": \"100\",\n-                                \"description\": \"The preferred number of FlowFiles to send over in a single batch.\",\n-                                \"displayName\": \"Batch Size\",\n+                            \"Script File\": {\n+                                \"description\": \"Path to script file to execute. Only one of Script File or Script Body may be used\",\n+                                \"displayName\": \"Script File\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"put-es-record-batch-size\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"put-es-record-index-op\": {\n-                                \"defaultValue\": \"index\",\n-                                \"description\": \"The type of the operation used to index (create, delete, index, update, upsert)\",\n-                                \"displayName\": \"Index Operation\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"put-es-record-index-op\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"put-es-record-log-error-responses\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"If this is enabled, errors will be logged to the NiFi logs at the error log level. Otherwise, they will only be logged if debug logging is enabled on NiFi as a whole. The purpose of this option is to give the user the ability to debug failed operations without having to turn on debug logging.\",\n-                                \"displayName\": \"Log Error Responses\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"put-es-record-log-error-responses\",\n+                                \"name\": \"Script File\",\n                                 \"required\": false,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"SINGLE\",\n+                                    \"resourceTypes\": [\n+                                        \"FILE\"\n+                                    ]\n+                                },\n                                 \"sensitive\": false\n                             }\n                         },\n+                        \"restricted\": true,\n                         \"seeAlso\": [\n-                            \"org.apache.nifi.processors.elasticsearch.PutElasticsearchRecord\"\n+                            \"org.apache.nifi.processors.script.ScriptedFilterRecord\",\n+                            \"org.apache.nifi.processors.script.ScriptedPartitionRecord\",\n+                            \"org.apache.nifi.processors.script.ScriptedTransformRecord\"\n                         ],\n-                        \"sideEffectFree\": false,\n+                        \"sideEffectFree\": true,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"All flowfiles that fail due to server/cluster availability go to this relationship.\",\n-                                \"name\": \"retry\"\n+                                \"description\": \"FlowFile containing the valid records from the incoming FlowFile will be routed to this relationship. If there are no valid records, no FlowFile will be routed to this Relationship.\",\n+                                \"name\": \"valid\"\n                             },\n                             {\n-                                \"description\": \"All flowfiles that succeed in being transferred into Elasticsearch go here. Documents received by the Elasticsearch _bulk API may still result in errors on the Elasticsearch side. The Elasticsearch response will need to be examined to determine whether any Document(s)/Record(s) resulted in errors.\",\n-                                \"name\": \"success\"\n+                                \"description\": \"FlowFile containing the invalid records from the incoming FlowFile will be routed to this relationship. If there are no invalid records, no FlowFile will be routed to this Relationship.\",\n+                                \"name\": \"invalid\"\n                             },\n                             {\n-                                \"description\": \"All flowfiles that fail for reasons unrelated to server availability go to this relationship.\",\n+                                \"description\": \"In case of any issue during processing the incoming flow file, the incoming FlowFile will be routed to this relationship.\",\n                                 \"name\": \"failure\"\n                             },\n                             {\n-                                \"description\": \"If a \\\"Output Error Documents\\\" is set, any FlowFile(s) corresponding to Elasticsearch document(s) that resulted in an \\\"error\\\" (within Elasticsearch) will be routed here.\",\n-                                \"name\": \"errors\"\n+                                \"description\": \"After successful procession, the incoming FlowFile will be transferred to this relationship. This happens regardless the FlowFiles might routed to \\\"valid\\\" and \\\"invalid\\\" relationships.\",\n+                                \"name\": \"original\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n+                            \"CRON_DRIVEN\",\n+                            \"EVENT_DRIVEN\"\n                         ],\n-                        \"supportsBatching\": false,\n-                        \"supportsDynamicProperties\": true,\n+                        \"supportsBatching\": true,\n+                        \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": false,\n+                        \"supportsEventDriven\": true,\n                         \"supportsSensitiveDynamicProperties\": false,\n-                        \"systemResourceConsiderations\": [\n-                            {\n-                                \"description\": \"The Batch of FlowFiles will be stored in memory until the bulk operation is performed.\",\n-                                \"resource\": \"MEMORY\"\n-                            }\n-                        ],\n                         \"tags\": [\n-                            \"elasticsearch\",\n-                            \"elasticsearch5\",\n-                            \"elasticsearch6\",\n-                            \"elasticsearch7\",\n-                            \"elasticsearch8\",\n-                            \"index\",\n-                            \"json\",\n-                            \"put\"\n+                            \"groovy\",\n+                            \"jython\",\n+                            \"python\",\n+                            \"record\",\n+                            \"script\",\n+                            \"validate\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.elasticsearch.PutElasticsearchJson\",\n-                        \"typeDescription\": \"An Elasticsearch put processor that uses the official Elastic REST client libraries. Each FlowFile is treated as a document to be sent to the Elasticsearch _bulk API. Multiple FlowFiles can be batched together into each Request sent to Elasticsearch.\",\n+                        \"type\": \"org.apache.nifi.processors.script.ScriptedValidateRecord\",\n+                        \"typeDescription\": \"This processor provides the ability to validate records in FlowFiles using the user-provided script. The script is expected to have a record as incoming argument and return with a boolean value. Based on this result, the processor categorizes the records as \\\"valid\\\" or \\\"invalid\\\" and routes them to the respective relationship in batch. Additionally the original FlowFile will be routed to the \\\"original\\\" relationship or in case of unsuccessful processing, to the \\\"failed\\\" relationship.\",\n                         \"version\": \"1.27.0\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"The error message if there is an issue parsing the FlowFile, sending the parsed document to Elasticsearch or parsing the Elasticsearch response\",\n-                                \"name\": \"elasticsearch.put.error\"\n+                                \"description\": \"Sets the mime.type attribute to the MIME Type specified by the Record Writer\",\n+                                \"name\": \"mime.type\"\n                             },\n                             {\n-                                \"description\": \"The _bulk response if there was an error during processing the document within Elasticsearch.\",\n-                                \"name\": \"elasticsearch.bulk.error\"\n+                                \"description\": \"The number of records within the flow file.\",\n+                                \"name\": \"record.count\"\n+                            },\n+                            {\n+                                \"description\": \"This attribute provides on failure the error message encountered by the Reader or Writer.\",\n+                                \"name\": \"record.error.message\"\n                             }\n                         ]\n-                    },\n+                    }\n+                ],\n+                \"reportingTasks\": [\n                     {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-elasticsearch-restapi-nar\",\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-scripting-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n-                        \"defaultBulletinLevel\": \"WARN\",\n-                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": 1,\n-                            \"TIMER_DRIVEN\": 1\n-                        },\n-                        \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n-                        \"defaultYieldDuration\": \"1 sec\",\n                         \"dynamicProperties\": [\n                             {\n-                                \"description\": \"Prefix: BULK: - adds the specified property name/value as a Bulk request header in the Elasticsearch Bulk API body used for processing. If the Record Path expression results in a null or blank value, the Bulk header will be omitted for the document operation. These parameters will override any matching parameters in the _bulk request body.\",\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"name\": \"The name of the Bulk request header\",\n-                                \"value\": \"A Record Path expression to retrieve the Bulk request header value\"\n-                            },\n+                                \"description\": \"Updates a script engine property specified by the Dynamic Property's key with the value specified by the Dynamic Property's value\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"name\": \"A script engine property to update\",\n+                                \"value\": \"The value to set it to\"\n+                            }\n+                        ],\n+                        \"explicitRestrictions\": [\n                             {\n-                                \"description\": \"Adds the specified property name/value as a query parameter in the Elasticsearch URL used for processing. These parameters will override any matching parameters in the _bulk request body\",\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"name\": \"The name of a URL query parameter to add\",\n-                                \"value\": \"The value of the URL query parameter\"\n+                                \"explanation\": \"Provides operator the ability to execute arbitrary code assuming all permissions that NiFi has.\",\n+                                \"requiredPermission\": \"execute code\"\n                             }\n                         ],\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_REQUIRED\",\n-                        \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"el-rest-client-service\": {\n-                                \"description\": \"An Elasticsearch client service to use for running queries.\",\n-                                \"displayName\": \"Client Service\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"el-rest-client-service\",\n-                                \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-elasticsearch-client-service-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.elasticsearch.ElasticSearchClientService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            },\n-                            \"el-rest-fetch-index\": {\n-                                \"description\": \"The name of the index to use.\",\n-                                \"displayName\": \"Index\",\n+                            \"Module Directory\": {\n+                                \"description\": \"Comma-separated list of paths to files and/or directories which contain modules required by the script.\",\n+                                \"displayName\": \"Module Directory\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"el-rest-fetch-index\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Module Directory\",\n+                                \"required\": false,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"MULTIPLE\",\n+                                    \"resourceTypes\": [\n+                                        \"DIRECTORY\",\n+                                        \"FILE\"\n+                                    ]\n+                                },\n                                 \"sensitive\": false\n                             },\n-                            \"el-rest-type\": {\n-                                \"description\": \"The type of this document (used by Elasticsearch for indexing and searching).\",\n-                                \"displayName\": \"Type\",\n+                            \"Script Body\": {\n+                                \"description\": \"Body of script to execute. Only one of Script File or Script Body may be used\",\n+                                \"displayName\": \"Script Body\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"el-rest-type\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Script Body\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"put-es-output-error-responses\": {\n+                            \"Script Engine\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"description\": \"ECMAScript ECMA - 262 Edition 5.1 [Oracle Nashorn 1.8.0_422]\",\n+                                        \"displayName\": \"ECMAScript DEPRECATED\",\n+                                        \"value\": \"ECMAScript\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"description\": \"Groovy 3.0.21 [Groovy Scripting Engine 2.0]\",\n+                                        \"displayName\": \"Groovy\",\n+                                        \"value\": \"Groovy\"\n+                                    },\n+                                    {\n+                                        \"description\": \"python 2.7 [jython 2.7.3]\",\n+                                        \"displayName\": \"python DEPRECATED\",\n+                                        \"value\": \"python\"\n+                                    },\n+                                    {\n+                                        \"description\": \"ruby jruby 9.4.2.0 [JSR 223 JRuby Engine 9.4.2.0]\",\n+                                        \"displayName\": \"ruby DEPRECATED\",\n+                                        \"value\": \"ruby\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"If this is enabled, response messages from Elasticsearch marked as \\\"error\\\" will be output to the \\\"error_responses\\\" relationship.This does not impact the output of flowfiles to the \\\"success\\\" or \\\"errors\\\" relationships\",\n-                                \"displayName\": \"Output Error Responses\",\n+                                \"defaultValue\": \"ECMAScript\",\n+                                \"description\": \"Language Engine for executing scripts\",\n+                                \"displayName\": \"Script Engine\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"put-es-output-error-responses\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"put-es-record-at-timestamp\": {\n-                                \"description\": \"The value to use as the @timestamp field (required for Elasticsearch Data Streams)\",\n-                                \"displayName\": \"@timestamp Value\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"put-es-record-at-timestamp\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"put-es-record-at-timestamp-date-format\": {\n-                                \"description\": \"Specifies the format to use when writing Date fields. If not specified, the default format 'yyyy-MM-dd' is used. If specified, the value must match the Java Simple Date Format (for example, MM/dd/yyyy for a two-digit month, followed by a two-digit day, followed by a four-digit year, all separated by '/' characters, as in 01/25/2017).\",\n-                                \"displayName\": \"Date Format\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"put-es-record-at-timestamp-date-format\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"put-es-record-at-timestamp-path\": {\n-                                \"description\": \"A RecordPath pointing to a field in the record(s) that contains the @timestamp for the document. If left blank the @timestamp will be determined using the main @timestamp property\",\n-                                \"displayName\": \"@timestamp Record Path\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"put-es-record-at-timestamp-path\",\n-                                \"required\": false,\n+                                \"name\": \"Script Engine\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"put-es-record-at-timestamp-time-format\": {\n-                                \"description\": \"Specifies the format to use when writing Time fields. If not specified, the default format 'HH:mm:ss' is used. If specified, the value must match the Java Simple Date Format (for example, HH:mm:ss for a two-digit hour in 24-hour format, followed by a two-digit minute, followed by a two-digit second, all separated by ':' characters, as in 18:04:15).\",\n-                                \"displayName\": \"Time Format\",\n+                            \"Script File\": {\n+                                \"description\": \"Path to script file to execute. Only one of Script File or Script Body may be used\",\n+                                \"displayName\": \"Script File\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"put-es-record-at-timestamp-time-format\",\n+                                \"name\": \"Script File\",\n                                 \"required\": false,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"SINGLE\",\n+                                    \"resourceTypes\": [\n+                                        \"FILE\"\n+                                    ]\n+                                },\n                                 \"sensitive\": false\n-                            },\n-                            \"put-es-record-at-timestamp-timestamp-format\": {\n-                                \"description\": \"Specifies the format to use when writing Timestamp fields. If not specified, the default format 'yyyy-MM-dd HH:mm:ss' is used. If specified, the value must match the Java Simple Date Format (for example, MM/dd/yyyy HH:mm:ss for a two-digit month, followed by a two-digit day, followed by a four-digit year, all separated by '/' characters; and then followed by a two-digit hour in 24-hour format, followed by a two-digit minute, followed by a two-digit second, all separated by ':' characters, as in 01/25/2017 18:04:15).\",\n-                                \"displayName\": \"Timestamp Format\",\n+                            }\n+                        },\n+                        \"restricted\": true,\n+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\"\n+                        ],\n+                        \"supportsDynamicProperties\": true,\n+                        \"supportsSensitiveDynamicProperties\": true,\n+                        \"tags\": [\n+                            \"execute\",\n+                            \"groovy\",\n+                            \"javascript\",\n+                            \"jruby\",\n+                            \"js\",\n+                            \"jython\",\n+                            \"lua\",\n+                            \"luaj\",\n+                            \"python\",\n+                            \"reporting\",\n+                            \"ruby\",\n+                            \"script\"\n+                        ],\n+                        \"type\": \"org.apache.nifi.reporting.script.ScriptedReportingTask\",\n+                        \"typeDescription\": \"Provides reporting and status information to a script. ReportingContext, ComponentLog, and VirtualMachineMetrics objects are made available as variables (context, log, and vmMetrics, respectively) to the script for further processing. The context makes various information available such as events, provenance, bulletins, controller services, process groups, Java Virtual Machine metrics, etc.\",\n+                        \"version\": \"1.27.0\"\n+                    }\n+                ]\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"1.27.0\"\n+        },\n+        {\n+            \"artifact\": \"nifi-smb-client-api-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [],\n+                \"processors\": [],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"1.27.0\"\n+        },\n+        {\n+            \"artifact\": \"nifi-email-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [],\n+                \"processors\": [\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-email-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"e0c4461\"\n+                        },\n+                        \"defaultBulletinLevel\": \"WARN\",\n+                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": 1,\n+                            \"TIMER_DRIVEN\": 1\n+                        },\n+                        \"defaultPenaltyDuration\": \"30 sec\",\n+                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": \"* * * * * ?\",\n+                            \"TIMER_DRIVEN\": \"0 sec\"\n+                        },\n+                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n+                        \"defaultYieldDuration\": \"1 sec\",\n+                        \"deprecated\": true,\n+                        \"deprecationReason\": \"The supporting ews-java-api library is no longer maintained\",\n+                        \"group\": \"org.apache.nifi\",\n+                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n+                        \"primaryNodeOnly\": false,\n+                        \"propertyDescriptors\": {\n+                            \"connection.timeout\": {\n+                                \"defaultValue\": \"30 sec\",\n+                                \"description\": \"The amount of time to wait to connect to Email server\",\n+                                \"displayName\": \"Connection timeout\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"put-es-record-at-timestamp-timestamp-format\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"put-es-record-batch-size\": {\n-                                \"defaultValue\": \"100\",\n-                                \"description\": \"The number of records to send over in a single batch.\",\n-                                \"displayName\": \"Batch Size\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"put-es-record-batch-size\",\n+                                \"name\": \"connection.timeout\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"put-es-record-bulk-error-groups\": {\n+                            \"delete.messages\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"true\",\n                                         \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"false\",\n                                         \"value\": \"false\"\n                                     }\n                                 ],\n                                 \"defaultValue\": \"false\",\n-                                \"dependencies\": [\n-                                    {\n-                                        \"propertyDisplayName\": \"Result Record Writer\",\n-                                        \"propertyName\": \"put-es-record-error-writer\"\n-                                    }\n-                                ],\n-                                \"description\": \"If this configuration property is set, the response from Elasticsearch will be examined for _bulk errors. The failed records written to the \\\"errors\\\" relationship will be grouped by error type and the error related to the first record within the FlowFile added to the FlowFile as \\\"elasticsearch.bulk.error\\\". If \\\"Treat \\\"Not Found\\\" as Success\\\" is \\\"false\\\" then records associated with \\\"not_found\\\" Elasticsearch document responses will also be send to the \\\"errors\\\" relationship.\",\n-                                \"displayName\": \"Group Results by Bulk Error Type\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"put-es-record-bulk-error-groups\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"put-es-record-dynamic-templates-path\": {\n-                                \"description\": \"A RecordPath pointing to a field in the record(s) that contains the dynamic_templates for the document. Field must be Map-type compatible (e.g. a Map or Record) or a String parsable into a JSON Object. Requires Elasticsearch 7+\",\n-                                \"displayName\": \"Dynamic Templates Record Path\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"put-es-record-dynamic-templates-path\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"put-es-record-error-writer\": {\n-                                \"description\": \"If this configuration property is set, the response from Elasticsearch will be examined for failed records and the failed records will be written to a record set with this record writer service and sent to the \\\"errors\\\" relationship. Successful records will be written to a record set with this record writer service and sent to the \\\"successful_records\\\" relationship.\",\n-                                \"displayName\": \"Result Record Writer\",\n+                                \"description\": \"Specify whether mail messages should be deleted after retrieval.\",\n+                                \"displayName\": \"Delete Messages\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"put-es-record-error-writer\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            },\n-                            \"put-es-record-id-path\": {\n-                                \"description\": \"A record path expression to retrieve the ID field for use with Elasticsearch. If left blank the ID will be automatically generated by Elasticsearch.\",\n-                                \"displayName\": \"ID Record Path\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"put-es-record-id-path\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"put-es-record-index-op\": {\n-                                \"defaultValue\": \"index\",\n-                                \"description\": \"The type of the operation used to index (create, delete, index, update, upsert)\",\n-                                \"displayName\": \"Index Operation\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"put-es-record-index-op\",\n+                                \"name\": \"delete.messages\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"put-es-record-index-op-path\": {\n-                                \"description\": \"A record path expression to retrieve the Index Operation field for use with Elasticsearch. If left blank the Index Operation will be determined using the main Index Operation property.\",\n-                                \"displayName\": \"Index Operation Record Path\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"put-es-record-index-op-path\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"put-es-record-index-record-path\": {\n-                                \"description\": \"A record path expression to retrieve the index field for use with Elasticsearch. If left blank the index will be determined using the main index property.\",\n-                                \"displayName\": \"Index Record Path\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"put-es-record-index-record-path\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"put-es-record-log-error-responses\": {\n+                            \"ews-autodiscover\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"true\",\n                                         \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"false\",\n                                         \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"If this is enabled, errors will be logged to the NiFi logs at the error log level. Otherwise, they will only be logged if debug logging is enabled on NiFi as a whole. The purpose of this option is to give the user the ability to debug failed operations without having to turn on debug logging.\",\n-                                \"displayName\": \"Log Error Responses\",\n+                                \"defaultValue\": \"true\",\n+                                \"description\": \"Whether or not to use the Exchange email address to Autodiscover the EWS endpoint URL.\",\n+                                \"displayName\": \"Auto Discover URL\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"put-es-record-log-error-responses\",\n+                                \"name\": \"ews-autodiscover\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"ews-exclude-headers\": {\n+                                \"defaultValue\": \"\",\n+                                \"description\": \"Comma delimited list specifying which headers from the original message to exclude in the exported email message. Blank means don't exclude any headers.\",\n+                                \"displayName\": \"Original Headers to Exclude\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"ews-exclude-headers\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"put-es-record-not_found-is-error\": {\n+                            \"ews-include-headers\": {\n+                                \"defaultValue\": \"\",\n+                                \"description\": \"Comma delimited list specifying which headers from the original message to include in the exported email message. Blank means copy all headers. Some headers can cause problems with message parsing, specifically the 'Content-Type' header.\",\n+                                \"displayName\": \"Original Headers to Include\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"ews-include-headers\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"ews-mark-as-read\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"true\",\n                                         \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"false\",\n                                         \"value\": \"false\"\n                                     }\n                                 ],\n                                 \"defaultValue\": \"true\",\n-                                \"dependencies\": [\n-                                    {\n-                                        \"propertyDisplayName\": \"Result Record Writer\",\n-                                        \"propertyName\": \"put-es-record-error-writer\"\n-                                    }\n-                                ],\n-                                \"description\": \"If true, \\\"not_found\\\" Elasticsearch Document associated Records will be routed to the \\\"successful_records\\\" relationship, otherwise to the \\\"errors\\\" relationship. If Output Error Responses is \\\"true\\\" then \\\"not_found\\\" responses from Elasticsearch will be sent to the error_responses relationship.\",\n-                                \"displayName\": \"Treat \\\"Not Found\\\" as Success\",\n+                                \"description\": \"Specify if messages should be marked as read after retrieval.\",\n+                                \"displayName\": \"Mark Messages as Read\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"put-es-record-not_found-is-error\",\n-                                \"required\": false,\n+                                \"name\": \"ews-mark-as-read\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"put-es-record-reader\": {\n-                                \"description\": \"The record reader to use for reading incoming records from flowfiles.\",\n-                                \"displayName\": \"Record Reader\",\n+                            \"ews-url\": {\n+                                \"description\": \"URL of the EWS Endpoint. Required if Autodiscover is false.\",\n+                                \"displayName\": \"EWS URL\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"put-es-record-reader\",\n+                                \"name\": \"ews-url\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"fetch.size\": {\n+                                \"defaultValue\": \"10\",\n+                                \"description\": \"Specify the maximum number of Messages to fetch per call to Email Server.\",\n+                                \"displayName\": \"Fetch Size\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"fetch.size\",\n                                 \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n+                                \"sensitive\": false\n                             },\n-                            \"put-es-record-retain-at-timestamp-field\": {\n+                            \"folder\": {\n+                                \"defaultValue\": \"INBOX\",\n+                                \"description\": \"Email folder to retrieve messages from (e.g., INBOX)\",\n+                                \"displayName\": \"Folder\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"folder\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"mail-ews-version\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"displayName\": \"Exchange2007_SP1\",\n+                                        \"value\": \"Exchange2007_SP1\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"false\",\n-                                \"dependencies\": [\n-                                    {\n-                                        \"propertyDisplayName\": \"@timestamp Record Path\",\n-                                        \"propertyName\": \"put-es-record-at-timestamp-path\"\n-                                    }\n-                                ],\n-                                \"description\": \"Whether to retain the existing field used as the @timestamp Record Path.\",\n-                                \"displayName\": \"Retain @timestamp (Record Path)\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"put-es-record-retain-at-timestamp-field\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"put-es-record-retain-id-field\": {\n-                                \"allowableValues\": [\n+                                        \"displayName\": \"Exchange2010\",\n+                                        \"value\": \"Exchange2010\"\n+                                    },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"displayName\": \"Exchange2010_SP1\",\n+                                        \"value\": \"Exchange2010_SP1\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"false\",\n-                                \"dependencies\": [\n-                                    {\n-                                        \"propertyDisplayName\": \"ID Record Path\",\n-                                        \"propertyName\": \"put-es-record-id-path\"\n+                                        \"displayName\": \"Exchange2010_SP2\",\n+                                        \"value\": \"Exchange2010_SP2\"\n                                     }\n                                 ],\n-                                \"description\": \"Whether to retain the existing field used as the ID Record Path.\",\n-                                \"displayName\": \"Retain ID (Record Path)\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"put-es-record-retain-id-field\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"put-es-record-script-path\": {\n-                                \"description\": \"A RecordPath pointing to a field in the record(s) that contains the script for the document update/upsert. Only applies to Update/Upsert operations. Field must be Map-type compatible (e.g. a Map or a Record) or a String parsable into a JSON Object\",\n-                                \"displayName\": \"Script Record Path\",\n+                                \"defaultValue\": \"Exchange2010_SP2\",\n+                                \"description\": \"What version of Exchange Server the server is running.\",\n+                                \"displayName\": \"Exchange Version\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"put-es-record-script-path\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"mail-ews-version\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"put-es-record-scripted-upsert-path\": {\n-                                \"description\": \"A RecordPath pointing to a field in the record(s) that contains the scripted_upsert boolean flag. Whether to add the scripted_upsert flag to the Upsert Operation. Forces Elasticsearch to execute the Script whether or not the document exists, defaults to false. If the Upsert Document provided (from FlowFile content) will be empty, but sure to set the Client Service controller service's Suppress Null/Empty Values to Never Suppress or no \\\"upsert\\\" doc will be, included in the request to Elasticsearch and the operation will not create a new document for the script to execute against, resulting in a \\\"not_found\\\" error\",\n-                                \"displayName\": \"Scripted Upsert Record Path\",\n+                            \"password\": {\n+                                \"description\": \"Password used for authentication and authorization with Email server.\",\n+                                \"displayName\": \"Password\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"put-es-record-scripted-upsert-path\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"password\",\n+                                \"required\": true,\n+                                \"sensitive\": true\n                             },\n-                            \"put-es-record-type-record-path\": {\n-                                \"description\": \"A record path expression to retrieve the type field for use with Elasticsearch. If left blank the type will be determined using the main type property.\",\n-                                \"displayName\": \"Type Record Path\",\n+                            \"user\": {\n+                                \"description\": \"User Name used for authentication and authorization with Email server.\",\n+                                \"displayName\": \"User Name\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"put-es-record-type-record-path\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"user\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             }\n                         },\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.processors.elasticsearch.PutElasticsearchJson\"\n-                        ],\n                         \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"All flowfiles that fail due to server/cluster availability go to this relationship.\",\n-                                \"name\": \"retry\"\n-                            },\n-                            {\n-                                \"description\": \"All flowfiles that succeed in being transferred into Elasticsearch go here. Documents received by the Elasticsearch _bulk API may still result in errors on the Elasticsearch side. The Elasticsearch response will need to be examined to determine whether any Document(s)/Record(s) resulted in errors.\",\n+                                \"description\": \"All messages that are the are successfully received from Email server and converted to FlowFiles are routed to this relationship\",\n                                 \"name\": \"success\"\n-                            },\n-                            {\n-                                \"description\": \"If a \\\"Result Record Writer\\\" is set, any Record(s) corresponding to Elasticsearch document(s) that did not result in an \\\"error\\\" (within Elasticsearch) will be routed here.\",\n-                                \"name\": \"successful_records\"\n-                            },\n-                            {\n-                                \"description\": \"All flowfiles that fail for reasons unrelated to server availability go to this relationship.\",\n-                                \"name\": \"failure\"\n-                            },\n-                            {\n-                                \"description\": \"If a \\\"Result Record Writer\\\" is set, any Record(s) corresponding to Elasticsearch document(s) that resulted in an \\\"error\\\" (within Elasticsearch) will be routed here.\",\n-                                \"name\": \"errors\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n                         \"supportsBatching\": false,\n-                        \"supportsDynamicProperties\": true,\n+                        \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n-                        \"systemResourceConsiderations\": [\n-                            {\n-                                \"description\": \"The Batch of Records will be stored in memory until the bulk operation is performed.\",\n-                                \"resource\": \"MEMORY\"\n-                            }\n-                        ],\n                         \"tags\": [\n-                            \"elasticsearch\",\n-                            \"elasticsearch5\",\n-                            \"elasticsearch6\",\n-                            \"elasticsearch7\",\n-                            \"elasticsearch8\",\n-                            \"index\",\n-                            \"json\",\n-                            \"put\",\n-                            \"record\"\n+                            \"Consume\",\n+                            \"EWS\",\n+                            \"Email\",\n+                            \"Exchange\",\n+                            \"Get\",\n+                            \"Ingest\",\n+                            \"Ingress\",\n+                            \"Message\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.elasticsearch.PutElasticsearchRecord\",\n-                        \"typeDescription\": \"A record-aware Elasticsearch put processor that uses the official Elastic REST client libraries. Each Record within the FlowFile is converted into a document to be sent to the Elasticsearch _bulk APi. Multiple documents can be batched into each Request sent to Elasticsearch. Each document's Bulk operation can be configured using Record Path expressions.\",\n-                        \"version\": \"1.27.0\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"The error message if there is an issue parsing the FlowFile records, sending the parsed documents to Elasticsearch or parsing the Elasticsearch response.\",\n-                                \"name\": \"elasticsearch.put.error\"\n-                            },\n-                            {\n-                                \"description\": \"The number of records that generated errors in the Elasticsearch _bulk API.\",\n-                                \"name\": \"elasticsearch.put.error.count\"\n-                            },\n-                            {\n-                                \"description\": \"The number of records that were successfully processed by the Elasticsearch _bulk API.\",\n-                                \"name\": \"elasticsearch.put.success.count\"\n-                            },\n-                            {\n-                                \"description\": \"The _bulk response if there was an error during processing the record within Elasticsearch.\",\n-                                \"name\": \"elasticsearch.bulk.error\"\n-                            }\n-                        ]\n+                        \"type\": \"org.apache.nifi.processors.email.ConsumeEWS\",\n+                        \"typeDescription\": \"Consumes messages from Microsoft Exchange using Exchange Web Services. The raw-bytes of each received email message are written as contents of the FlowFile\",\n+                        \"version\": \"1.27.0\"\n                     },\n                     {\n                         \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-elasticsearch-restapi-nar\",\n+                        \"artifact\": \"nifi-email-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n                         },\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"1 min\"\n+                            \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n-                        \"dynamicProperties\": [\n-                            {\n-                                \"description\": \"Adds the specified property name/value as a query parameter in the Elasticsearch URL used for processing. These parameters will override any matching parameters in the query request body. For SCROLL type queries, these parameters are only used in the initial (first page) query as the Elasticsearch Scroll API does not support the same query parameters for subsequent pages of data.\",\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"name\": \"The name of a URL query parameter to add\",\n-                                \"value\": \"The value of the URL query parameter\"\n-                            }\n-                        ],\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_FORBIDDEN\",\n-                        \"primaryNodeOnly\": true,\n+                        \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"el-query-attribute\": {\n-                                \"description\": \"If set, the executed query will be set on each result flowfile in the specified attribute.\",\n-                                \"displayName\": \"Query Attribute\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"el-query-attribute\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"el-rest-client-service\": {\n-                                \"description\": \"An Elasticsearch client service to use for running queries.\",\n-                                \"displayName\": \"Client Service\",\n+                            \"Mark Messages as Read\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"Specify if messages should be marked as read after retrieval.\",\n+                                \"displayName\": \"Mark Messages as Read\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"el-rest-client-service\",\n-                                \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-elasticsearch-client-service-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.elasticsearch.ElasticSearchClientService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            },\n-                            \"el-rest-fetch-index\": {\n-                                \"description\": \"The name of the index to use.\",\n-                                \"displayName\": \"Index\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"el-rest-fetch-index\",\n+                                \"name\": \"Mark Messages as Read\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"el-rest-format-aggregations\": {\n+                            \"Use SSL\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Contains full Elasticsearch Aggregation, including Buckets and Metadata.\",\n-                                        \"displayName\": \"FULL\",\n-                                        \"value\": \"FULL\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Bucket Content only.\",\n-                                        \"displayName\": \"BUCKETS_ONLY\",\n-                                        \"value\": \"BUCKETS_ONLY\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n-                                        \"description\": \"Aggregation Metadata only.\",\n-                                        \"displayName\": \"METADATA_ONLY\",\n-                                        \"value\": \"METADATA_ONLY\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"FULL\",\n-                                \"description\": \"Format of Aggregation output.\",\n-                                \"displayName\": \"Aggregation Results Format\",\n+                                \"defaultValue\": \"true\",\n+                                \"description\": \"Specifies if IMAP connection must be obtained via SSL encrypted connection (i.e., IMAPS)\",\n+                                \"displayName\": \"Use SSL\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"el-rest-format-aggregations\",\n+                                \"name\": \"Use SSL\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"el-rest-format-hits\": {\n+                            \"authorization-mode\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Contains full Elasticsearch Hit, including Document Source and Metadata.\",\n-                                        \"displayName\": \"FULL\",\n-                                        \"value\": \"FULL\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Document Source only (where present).\",\n-                                        \"displayName\": \"SOURCE_ONLY\",\n-                                        \"value\": \"SOURCE_ONLY\"\n+                                        \"description\": \"Use password\",\n+                                        \"displayName\": \"Use Password\",\n+                                        \"value\": \"password-based-authorization-mode\"\n                                     },\n                                     {\n-                                        \"description\": \"Hit Metadata only.\",\n-                                        \"displayName\": \"METADATA_ONLY\",\n-                                        \"value\": \"METADATA_ONLY\"\n+                                        \"description\": \"Use OAuth2 to acquire access token\",\n+                                        \"displayName\": \"Use OAuth2\",\n+                                        \"value\": \"oauth-based-authorization-mode\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"FULL\",\n-                                \"description\": \"Format of Hits output.\",\n-                                \"displayName\": \"Search Results Format\",\n+                                \"defaultValue\": \"password-based-authorization-mode\",\n+                                \"description\": \"How to authorize sending email on the user's behalf.\",\n+                                \"displayName\": \"Authorization Mode\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"el-rest-format-hits\",\n+                                \"name\": \"authorization-mode\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"el-rest-output-no-hits\": {\n+                            \"connection.timeout\": {\n+                                \"defaultValue\": \"30 sec\",\n+                                \"description\": \"The amount of time to wait to connect to Email server\",\n+                                \"displayName\": \"Connection timeout\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"connection.timeout\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"delete.messages\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"true\",\n                                         \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"false\",\n                                         \"value\": \"false\"\n                                     }\n                                 ],\n                                 \"defaultValue\": \"false\",\n-                                \"description\": \"Output a \\\"hits\\\" flowfile even if no hits found for query. If true, an empty \\\"hits\\\" flowfile will be output even if \\\"aggregations\\\" are output.\",\n-                                \"displayName\": \"Output No Hits\",\n+                                \"description\": \"Specify whether mail messages should be deleted after retrieval.\",\n+                                \"displayName\": \"Delete Messages\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"el-rest-output-no-hits\",\n+                                \"name\": \"delete.messages\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"el-rest-pagination-keep-alive\": {\n-                                \"defaultValue\": \"10 mins\",\n-                                \"description\": \"Pagination \\\"keep_alive\\\" period. Period Elasticsearch will keep the scroll/pit cursor alive in between requests (this is not the time expected for all pages to be returned, but the maximum allowed time for requests between page retrievals).\",\n-                                \"displayName\": \"Pagination Keep Alive\",\n+                            \"fetch.size\": {\n+                                \"defaultValue\": \"10\",\n+                                \"description\": \"Specify the maximum number of Messages to fetch per call to Email Server.\",\n+                                \"displayName\": \"Fetch Size\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"el-rest-pagination-keep-alive\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"fetch.size\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"el-rest-pagination-type\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"Use Elasticsearch \\\"_scroll\\\" API to page results. Does not accept additional query parameters.\",\n-                                        \"displayName\": \"SCROLL\",\n-                                        \"value\": \"pagination-scroll\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Use Elasticsearch \\\"search_after\\\" _search API to page sorted results.\",\n-                                        \"displayName\": \"SEARCH_AFTER\",\n-                                        \"value\": \"pagination-search_after\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Use Elasticsearch (7.10+ with XPack) \\\"point in time\\\" _search API to page sorted results.\",\n-                                        \"displayName\": \"POINT_IN_TIME\",\n-                                        \"value\": \"pagination-pit\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"pagination-scroll\",\n-                                \"description\": \"Pagination method to use. Not all types are available for all Elasticsearch versions, check the Elasticsearch docs to confirm which are applicable and recommended for your service.\",\n-                                \"displayName\": \"Pagination Type\",\n+                            \"folder\": {\n+                                \"defaultValue\": \"INBOX\",\n+                                \"description\": \"Email folder to retrieve messages from (e.g., INBOX)\",\n+                                \"displayName\": \"Folder\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"el-rest-pagination-type\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"folder\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"el-rest-query\": {\n+                            \"host\": {\n+                                \"description\": \"Network address of Email server (e.g., pop.gmail.com, imap.gmail.com . . .)\",\n+                                \"displayName\": \"Host Name\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"host\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"oauth2-access-token-provider\": {\n                                 \"dependencies\": [\n                                     {\n                                         \"dependentValues\": [\n-                                            \"full\"\n+                                            \"oauth-based-authorization-mode\"\n                                         ],\n-                                        \"propertyDisplayName\": \"Query Definition Style\",\n-                                        \"propertyName\": \"el-rest-query-definition-style\"\n+                                        \"propertyDisplayName\": \"Authorization Mode\",\n+                                        \"propertyName\": \"authorization-mode\"\n                                     }\n                                 ],\n-                                \"description\": \"A query in JSON syntax, not Lucene syntax. Ex: {\\\"query\\\":{\\\"match\\\":{\\\"somefield\\\":\\\"somevalue\\\"}}}. If the query is empty, a default JSON Object will be used, which will result in a \\\"match_all\\\" query in Elasticsearch.\",\n-                                \"displayName\": \"Query\",\n+                                \"description\": \"OAuth2 service that can provide access tokens.\",\n+                                \"displayName\": \"OAuth2 Access Token Provider\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"el-rest-query\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"oauth2-access-token-provider\",\n+                                \"required\": true,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.oauth2.OAuth2AccessTokenProvider\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n                             },\n-                            \"el-rest-query-clause\": {\n+                            \"password\": {\n                                 \"dependencies\": [\n                                     {\n                                         \"dependentValues\": [\n-                                            \"build\"\n+                                            \"password-based-authorization-mode\"\n                                         ],\n-                                        \"propertyDisplayName\": \"Query Definition Style\",\n-                                        \"propertyName\": \"el-rest-query-definition-style\"\n+                                        \"propertyDisplayName\": \"Authorization Mode\",\n+                                        \"propertyName\": \"authorization-mode\"\n                                     }\n                                 ],\n-                                \"description\": \"A \\\"query\\\" clause in JSON syntax, not Lucene syntax. Ex: {\\\"match\\\":{\\\"somefield\\\":\\\"somevalue\\\"}}. If the query is empty, a default JSON Object will be used, which will result in a \\\"match_all\\\" query in Elasticsearch.\",\n-                                \"displayName\": \"Query Clause\",\n+                                \"description\": \"Password used for authentication and authorization with Email server.\",\n+                                \"displayName\": \"Password\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"el-rest-query-clause\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"password\",\n+                                \"required\": true,\n+                                \"sensitive\": true\n+                            },\n+                            \"port\": {\n+                                \"description\": \"Numeric value identifying Port of Email server (e.g., 993)\",\n+                                \"displayName\": \"Port\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"port\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"el-rest-query-definition-style\": {\n+                            \"user\": {\n+                                \"description\": \"User Name used for authentication and authorization with Email server.\",\n+                                \"displayName\": \"User Name\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"user\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            }\n+                        },\n+                        \"sideEffectFree\": false,\n+                        \"supportedRelationships\": [\n+                            {\n+                                \"description\": \"All messages that are the are successfully received from Email server and converted to FlowFiles are routed to this relationship\",\n+                                \"name\": \"success\"\n+                            }\n+                        ],\n+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\"\n+                        ],\n+                        \"supportsBatching\": false,\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicRelationships\": false,\n+                        \"supportsEventDriven\": false,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"Consume\",\n+                            \"Email\",\n+                            \"Get\",\n+                            \"Imap\",\n+                            \"Ingest\",\n+                            \"Ingress\",\n+                            \"Message\"\n+                        ],\n+                        \"triggerSerially\": false,\n+                        \"triggerWhenAnyDestinationAvailable\": false,\n+                        \"triggerWhenEmpty\": false,\n+                        \"type\": \"org.apache.nifi.processors.email.ConsumeIMAP\",\n+                        \"typeDescription\": \"Consumes messages from Email Server using IMAP protocol. The raw-bytes of each received email message are written as contents of the FlowFile\",\n+                        \"version\": \"1.27.0\"\n+                    },\n+                    {\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-email-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"e0c4461\"\n+                        },\n+                        \"defaultBulletinLevel\": \"WARN\",\n+                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": 1,\n+                            \"TIMER_DRIVEN\": 1\n+                        },\n+                        \"defaultPenaltyDuration\": \"30 sec\",\n+                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": \"* * * * * ?\",\n+                            \"TIMER_DRIVEN\": \"0 sec\"\n+                        },\n+                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n+                        \"defaultYieldDuration\": \"1 sec\",\n+                        \"group\": \"org.apache.nifi\",\n+                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n+                        \"primaryNodeOnly\": false,\n+                        \"propertyDescriptors\": {\n+                            \"authorization-mode\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Provide the full Query.\",\n-                                        \"displayName\": \"FULL_QUERY\",\n-                                        \"value\": \"full\"\n+                                        \"description\": \"Use password\",\n+                                        \"displayName\": \"Use Password\",\n+                                        \"value\": \"password-based-authorization-mode\"\n                                     },\n                                     {\n-                                        \"description\": \"Build the Query from separate JSON objects.\",\n-                                        \"displayName\": \"BUILD_QUERY\",\n-                                        \"value\": \"build\"\n+                                        \"description\": \"Use OAuth2 to acquire access token\",\n+                                        \"displayName\": \"Use OAuth2\",\n+                                        \"value\": \"oauth-based-authorization-mode\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"full\",\n-                                \"description\": \"How the JSON Query will be defined for use by the processor.\",\n-                                \"displayName\": \"Query Definition Style\",\n+                                \"defaultValue\": \"password-based-authorization-mode\",\n+                                \"description\": \"How to authorize sending email on the user's behalf.\",\n+                                \"displayName\": \"Authorization Mode\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"el-rest-query-definition-style\",\n+                                \"name\": \"authorization-mode\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"el-rest-split-up-aggregations\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"Flowfile per hit.\",\n-                                        \"displayName\": \"PER_HIT\",\n-                                        \"value\": \"splitUp-yes\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Flowfile per response.\",\n-                                        \"displayName\": \"PER_RESPONSE\",\n-                                        \"value\": \"splitUp-no\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"splitUp-no\",\n-                                \"description\": \"Output a flowfile containing all aggregations or one flowfile for each individual aggregation.\",\n-                                \"displayName\": \"Aggregation Results Split\",\n+                            \"connection.timeout\": {\n+                                \"defaultValue\": \"30 sec\",\n+                                \"description\": \"The amount of time to wait to connect to Email server\",\n+                                \"displayName\": \"Connection timeout\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"el-rest-split-up-aggregations\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"connection.timeout\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"el-rest-split-up-hits\": {\n+                            \"delete.messages\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Flowfile per hit.\",\n-                                        \"displayName\": \"PER_HIT\",\n-                                        \"value\": \"splitUp-yes\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Flowfile per response.\",\n-                                        \"displayName\": \"PER_RESPONSE\",\n-                                        \"value\": \"splitUp-no\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n-                                        \"description\": \"Combine results from all query responses (one flowfile per entire paginated result set of hits). Note that aggregations cannot be paged, they are generated across the entire result set and returned as part of the first page. Results are output with one JSON object per line (allowing hits to be combined from multiple pages without loading all results into memory).\",\n-                                        \"displayName\": \"PER_QUERY\",\n-                                        \"value\": \"splitUp-query\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"splitUp-no\",\n-                                \"description\": \"Output a flowfile containing all hits or one flowfile for each individual hit or one flowfile containing all hits from all paged responses.\",\n-                                \"displayName\": \"Search Results Split\",\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"Specify whether mail messages should be deleted after retrieval.\",\n+                                \"displayName\": \"Delete Messages\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"el-rest-split-up-hits\",\n+                                \"name\": \"delete.messages\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"el-rest-type\": {\n-                                \"description\": \"The type of this document (used by Elasticsearch for indexing and searching).\",\n-                                \"displayName\": \"Type\",\n+                            \"fetch.size\": {\n+                                \"defaultValue\": \"10\",\n+                                \"description\": \"Specify the maximum number of Messages to fetch per call to Email Server.\",\n+                                \"displayName\": \"Fetch Size\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"el-rest-type\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"fetch.size\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"es-rest-query-aggs\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"build\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Query Definition Style\",\n-                                        \"propertyName\": \"el-rest-query-definition-style\"\n-                                    }\n-                                ],\n-                                \"description\": \"One or more query aggregations (or \\\"aggs\\\"), in JSON syntax. Ex: {\\\"items\\\": {\\\"terms\\\": {\\\"field\\\": \\\"product\\\", \\\"size\\\": 10}}}\",\n-                                \"displayName\": \"Aggregations\",\n+                            \"folder\": {\n+                                \"defaultValue\": \"INBOX\",\n+                                \"description\": \"Email folder to retrieve messages from (e.g., INBOX)\",\n+                                \"displayName\": \"Folder\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"es-rest-query-aggs\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"folder\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"es-rest-query-fields\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"build\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Query Definition Style\",\n-                                        \"propertyName\": \"el-rest-query-definition-style\"\n-                                    }\n-                                ],\n-                                \"description\": \"Fields of indexed documents to be retrieved, in JSON syntax. Ex: [\\\"user.id\\\", \\\"http.response.*\\\", {\\\"field\\\": \\\"@timestamp\\\", \\\"format\\\": \\\"epoch_millis\\\"}]\",\n-                                \"displayName\": \"Fields\",\n+                            \"host\": {\n+                                \"description\": \"Network address of Email server (e.g., pop.gmail.com, imap.gmail.com . . .)\",\n+                                \"displayName\": \"Host Name\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"es-rest-query-fields\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"host\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"es-rest-query-script-fields\": {\n+                            \"oauth2-access-token-provider\": {\n                                 \"dependencies\": [\n                                     {\n                                         \"dependentValues\": [\n-                                            \"build\"\n+                                            \"oauth-based-authorization-mode\"\n                                         ],\n-                                        \"propertyDisplayName\": \"Query Definition Style\",\n-                                        \"propertyName\": \"el-rest-query-definition-style\"\n+                                        \"propertyDisplayName\": \"Authorization Mode\",\n+                                        \"propertyName\": \"authorization-mode\"\n                                     }\n                                 ],\n-                                \"description\": \"Fields to created using script evaluation at query runtime, in JSON syntax. Ex: {\\\"test1\\\": {\\\"script\\\": {\\\"lang\\\": \\\"painless\\\", \\\"source\\\": \\\"doc['price'].value * 2\\\"}}, \\\"test2\\\": {\\\"script\\\": {\\\"lang\\\": \\\"painless\\\", \\\"source\\\": \\\"doc['price'].value * params.factor\\\", \\\"params\\\": {\\\"factor\\\": 2.0}}}}\",\n-                                \"displayName\": \"Script Fields\",\n+                                \"description\": \"OAuth2 service that can provide access tokens.\",\n+                                \"displayName\": \"OAuth2 Access Token Provider\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"es-rest-query-script-fields\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"oauth2-access-token-provider\",\n+                                \"required\": true,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.oauth2.OAuth2AccessTokenProvider\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n                             },\n-                            \"es-rest-query-sort\": {\n+                            \"password\": {\n                                 \"dependencies\": [\n                                     {\n                                         \"dependentValues\": [\n-                                            \"build\"\n+                                            \"password-based-authorization-mode\"\n                                         ],\n-                                        \"propertyDisplayName\": \"Query Definition Style\",\n-                                        \"propertyName\": \"el-rest-query-definition-style\"\n+                                        \"propertyDisplayName\": \"Authorization Mode\",\n+                                        \"propertyName\": \"authorization-mode\"\n                                     }\n                                 ],\n-                                \"description\": \"Sort results by one or more fields, in JSON syntax. Ex: [{\\\"price\\\" : {\\\"order\\\" : \\\"asc\\\", \\\"mode\\\" : \\\"avg\\\"}}, {\\\"post_date\\\" : {\\\"format\\\": \\\"strict_date_optional_time_nanos\\\"}}]\",\n-                                \"displayName\": \"Sort\",\n+                                \"description\": \"Password used for authentication and authorization with Email server.\",\n+                                \"displayName\": \"Password\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"es-rest-query-sort\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"password\",\n+                                \"required\": true,\n+                                \"sensitive\": true\n+                            },\n+                            \"port\": {\n+                                \"description\": \"Numeric value identifying Port of Email server (e.g., 993)\",\n+                                \"displayName\": \"Port\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"port\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"es-rest-size\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"build\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Query Definition Style\",\n-                                        \"propertyName\": \"el-rest-query-definition-style\"\n-                                    }\n-                                ],\n-                                \"description\": \"The maximum number of documents to retrieve in the query. If the query is paginated, this \\\"size\\\" applies to each page of the query, not the \\\"size\\\" of the entire result set.\",\n-                                \"displayName\": \"Size\",\n+                            \"user\": {\n+                                \"description\": \"User Name used for authentication and authorization with Email server.\",\n+                                \"displayName\": \"User Name\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"es-rest-size\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"user\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             }\n                         },\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.processors.elasticsearch.ConsumeElasticsearch\",\n-                            \"org.apache.nifi.processors.elasticsearch.PaginatedJsonQueryElasticsearch\"\n-                        ],\n                         \"sideEffectFree\": false,\n-                        \"stateful\": {\n-                            \"description\": \"The pagination state (scrollId, searchAfter, pitId, hitCount, pageCount, pageExpirationTimestamp) is retained in between invocations of this processor until the Scroll/PiT has expired (when the current time is later than the last query execution plus the Pagination Keep Alive interval).\",\n-                            \"scopes\": [\n-                                \"LOCAL\"\n-                            ]\n-                        },\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"Aggregations are routed to this relationship.\",\n-                                \"name\": \"aggregations\"\n-                            },\n-                            {\n-                                \"description\": \"Search hits are routed to this relationship.\",\n-                                \"name\": \"hits\"\n+                                \"description\": \"All messages that are the are successfully received from Email server and converted to FlowFiles are routed to this relationship\",\n+                                \"name\": \"success\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n                         \"supportsBatching\": false,\n-                        \"supportsDynamicProperties\": true,\n+                        \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n-                        \"systemResourceConsiderations\": [\n+                        \"tags\": [\n+                            \"Consume\",\n+                            \"Email\",\n+                            \"Get\",\n+                            \"Ingest\",\n+                            \"Ingress\",\n+                            \"Message\",\n+                            \"POP3\"\n+                        ],\n+                        \"triggerSerially\": false,\n+                        \"triggerWhenAnyDestinationAvailable\": false,\n+                        \"triggerWhenEmpty\": false,\n+                        \"type\": \"org.apache.nifi.processors.email.ConsumePOP3\",\n+                        \"typeDescription\": \"Consumes messages from Email Server using POP3 protocol. The raw-bytes of each received email message are written as contents of the FlowFile\",\n+                        \"version\": \"1.27.0\"\n+                    },\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-email-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"e0c4461\"\n+                        },\n+                        \"defaultBulletinLevel\": \"WARN\",\n+                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": 1,\n+                            \"EVENT_DRIVEN\": 0,\n+                            \"TIMER_DRIVEN\": 1\n+                        },\n+                        \"defaultPenaltyDuration\": \"30 sec\",\n+                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": \"* * * * * ?\",\n+                            \"TIMER_DRIVEN\": \"0 sec\"\n+                        },\n+                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n+                        \"defaultYieldDuration\": \"1 sec\",\n+                        \"group\": \"org.apache.nifi\",\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n+                        \"primaryNodeOnly\": false,\n+                        \"sideEffectFree\": true,\n+                        \"supportedRelationships\": [\n                             {\n-                                \"description\": \"Care should be taken on the size of each page because each response from Elasticsearch will be loaded into memory all at once and converted into the resulting flowfiles.\",\n-                                \"resource\": \"MEMORY\"\n+                                \"description\": \"Flowfiles that could not be parsed\",\n+                                \"name\": \"failure\"\n+                            },\n+                            {\n+                                \"description\": \"The original file\",\n+                                \"name\": \"original\"\n+                            },\n+                            {\n+                                \"description\": \"Each individual attachment will be routed to the attachments relationship\",\n+                                \"name\": \"attachments\"\n                             }\n                         ],\n+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\",\n+                            \"EVENT_DRIVEN\"\n+                        ],\n+                        \"supportsBatching\": true,\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicRelationships\": false,\n+                        \"supportsEventDriven\": true,\n+                        \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"elasticsearch\",\n-                            \"elasticsearch5\",\n-                            \"elasticsearch6\",\n-                            \"elasticsearch7\",\n-                            \"elasticsearch8\",\n-                            \"json\",\n-                            \"page\",\n-                            \"query\",\n-                            \"scroll\",\n-                            \"search\"\n+                            \"email\",\n+                            \"split\"\n                         ],\n-                        \"triggerSerially\": true,\n+                        \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.elasticsearch.SearchElasticsearch\",\n-                        \"typeDescription\": \"A processor that allows the user to repeatedly run a paginated query (with aggregations) written with the Elasticsearch JSON DSL. Search After/Point in Time queries must include a valid \\\"sort\\\" field. The processor will retrieve multiple pages of results until either no more results are available or the Pagination Keep Alive expiration is reached, after which the query will restart with the first page of results being retrieved.\",\n+                        \"type\": \"org.apache.nifi.processors.email.ExtractEmailAttachments\",\n+                        \"typeDescription\": \"Extract attachments from a mime formatted email file, splitting them into individual flowfiles.\",\n                         \"version\": \"1.27.0\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"application/json\",\n-                                \"name\": \"mime.type\"\n-                            },\n-                            {\n-                                \"description\": \"The name of the aggregation whose results are in the output flowfile\",\n-                                \"name\": \"aggregation.name\"\n-                            },\n-                            {\n-                                \"description\": \"The number of the aggregation whose results are in the output flowfile\",\n-                                \"name\": \"aggregation.number\"\n+                                \"description\": \"The filename of the attachment\",\n+                                \"name\": \"filename \"\n                             },\n                             {\n-                                \"description\": \"The number of the page (request), starting from 1, in which the results were returned that are in the output flowfile\",\n-                                \"name\": \"page.number\"\n+                                \"description\": \"The filename of the parent FlowFile\",\n+                                \"name\": \"email.attachment.parent.filename \"\n                             },\n                             {\n-                                \"description\": \"The number of hits that are in the output flowfile\",\n-                                \"name\": \"hit.count\"\n+                                \"description\": \"The UUID of the original FlowFile.\",\n+                                \"name\": \"email.attachment.parent.uuid\"\n                             },\n                             {\n-                                \"description\": \"The error message provided by Elasticsearch if there is an error querying the index.\",\n-                                \"name\": \"elasticsearch.query.error\"\n+                                \"description\": \"The mime type of the attachment.\",\n+                                \"name\": \"mime.type\"\n                             }\n                         ]\n                     },\n                     {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-elasticsearch-restapi-nar\",\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-email-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n+                            \"EVENT_DRIVEN\": 0,\n                             \"TIMER_DRIVEN\": 1\n                         },\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n-                        \"dynamicProperties\": [\n-                            {\n-                                \"description\": \"Adds the specified property name/value as a query parameter in the Elasticsearch URL used for processing. These parameters will override any matching parameters in the query request body\",\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"name\": \"The name of a URL query parameter to add\",\n-                                \"value\": \"The value of the URL query parameter\"\n-                            }\n-                        ],\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_ALLOWED\",\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"el-query-attribute\": {\n-                                \"description\": \"If set, the executed query will be set on each result flowfile in the specified attribute.\",\n-                                \"displayName\": \"Query Attribute\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"el-query-attribute\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"el-rest-client-service\": {\n-                                \"description\": \"An Elasticsearch client service to use for running queries.\",\n-                                \"displayName\": \"Client Service\",\n+                            \"CAPTURED_HEADERS\": {\n+                                \"defaultValue\": \"x-mailer\",\n+                                \"description\": \"COLON separated list of additional headers to be extracted from the flowfile content.NOTE the header key is case insensitive and will be matched as lower-case. Values will respect email contents.\",\n+                                \"displayName\": \"Additional Header List\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"el-rest-client-service\",\n-                                \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-elasticsearch-client-service-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.elasticsearch.ElasticSearchClientService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            },\n-                            \"el-rest-fetch-index\": {\n-                                \"description\": \"The name of the index to use.\",\n-                                \"displayName\": \"Index\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"el-rest-fetch-index\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"el-rest-query\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"full\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Query Definition Style\",\n-                                        \"propertyName\": \"el-rest-query-definition-style\"\n-                                    }\n-                                ],\n-                                \"description\": \"A query in JSON syntax, not Lucene syntax. Ex: {\\\"query\\\":{\\\"match\\\":{\\\"somefield\\\":\\\"somevalue\\\"}}}. If this parameter is not set, the query will be read from the flowfile content. If the query (property and flowfile content) is empty, a default empty JSON Object will be used, which will result in a \\\"match_all\\\" query in Elasticsearch.\",\n-                                \"displayName\": \"Query\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"el-rest-query\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"el-rest-query-clause\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"build\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Query Definition Style\",\n-                                        \"propertyName\": \"el-rest-query-definition-style\"\n-                                    }\n-                                ],\n-                                \"description\": \"A \\\"query\\\" clause in JSON syntax, not Lucene syntax. Ex: {\\\"match\\\":{\\\"somefield\\\":\\\"somevalue\\\"}}. If the query is empty, a default JSON Object will be used, which will result in a \\\"match_all\\\" query in Elasticsearch.\",\n-                                \"displayName\": \"Query Clause\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"el-rest-query-clause\",\n+                                \"name\": \"CAPTURED_HEADERS\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"el-rest-query-definition-style\": {\n+                            \"STRICT_ADDRESS_PARSING\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Provide the full Query.\",\n-                                        \"displayName\": \"FULL_QUERY\",\n-                                        \"value\": \"full\"\n+                                        \"description\": \"Strict email address format will be enforced. FlowFiles will be transfered to the failure relationship if the email address is invalid.\",\n+                                        \"displayName\": \"Strict Address Parsing\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n-                                        \"description\": \"Build the Query from separate JSON objects.\",\n-                                        \"displayName\": \"BUILD_QUERY\",\n-                                        \"value\": \"build\"\n+                                        \"description\": \"Accept emails, even if the address is poorly formed and doesn't strictly comply with RFC Validation.\",\n+                                        \"displayName\": \"Non-Strict Address Parsing\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"full\",\n-                                \"description\": \"How the JSON Query will be defined for use by the processor.\",\n-                                \"displayName\": \"Query Definition Style\",\n+                                \"defaultValue\": \"true\",\n+                                \"description\": \"If \\\"strict\\\", strict address format parsing rules are applied to mailbox and mailbox list fields, such as \\\"to\\\" and \\\"from\\\" headers, and FlowFiles with poorly formed addresses will be routed to the failure relationship, similar to messages that fail RFC compliant format validation. If \\\"non-strict\\\", the processor will extract the contents of mailbox list headers as comma-separated values without attempting to parse each value as well-formed Internet mailbox addresses. This is optional and defaults to Strict Address Parsing\",\n+                                \"displayName\": \"Email Address Parsing\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"el-rest-query-definition-style\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"el-rest-script\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"build\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Query Definition Style\",\n-                                        \"propertyName\": \"el-rest-query-definition-style\"\n-                                    }\n-                                ],\n-                                \"description\": \"A \\\"script\\\" to execute during the operation, in JSON syntax. Ex: {\\\"source\\\": \\\"ctx._source.count++\\\", \\\"lang\\\": \\\"painless\\\"}\",\n-                                \"displayName\": \"Script\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"el-rest-script\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"el-rest-type\": {\n-                                \"description\": \"The type of this document (used by Elasticsearch for indexing and searching).\",\n-                                \"displayName\": \"Type\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"el-rest-type\",\n+                                \"name\": \"STRICT_ADDRESS_PARSING\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             }\n                         },\n-                        \"sideEffectFree\": false,\n+                        \"sideEffectFree\": true,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"All flowfiles that fail due to server/cluster availability go to this relationship.\",\n-                                \"name\": \"retry\"\n-                            },\n-                            {\n-                                \"description\": \"If the \\\"by query\\\" operation succeeds, and a flowfile was read, it will be sent to this relationship.\",\n+                                \"description\": \"Extraction was successful\",\n                                 \"name\": \"success\"\n                             },\n                             {\n-                                \"description\": \"If the \\\"by query\\\" operation fails, and a flowfile was read, it will be sent to this relationship.\",\n+                                \"description\": \"Flowfiles that could not be parsed as a RFC-2822 compliant message\",\n                                 \"name\": \"failure\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n+                            \"CRON_DRIVEN\",\n+                            \"EVENT_DRIVEN\"\n                         ],\n-                        \"supportsBatching\": false,\n-                        \"supportsDynamicProperties\": true,\n+                        \"supportsBatching\": true,\n+                        \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": false,\n+                        \"supportsEventDriven\": true,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"elastic\",\n-                            \"elasticsearch\",\n-                            \"elasticsearch5\",\n-                            \"elasticsearch6\",\n-                            \"elasticsearch7\",\n-                            \"elasticsearch8\",\n-                            \"query\",\n-                            \"update\"\n+                            \"email\",\n+                            \"split\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.elasticsearch.UpdateByQueryElasticsearch\",\n-                        \"typeDescription\": \"Update documents in an Elasticsearch index using a query. The query can be loaded from a flowfile body or from the Query parameter. The loaded Query can contain any JSON accepted by Elasticsearch's _update_by_query API, for example a \\\"query\\\" object to identify what documents are to be updated, plus a \\\"script\\\" to define the updates to perform.\",\n+                        \"type\": \"org.apache.nifi.processors.email.ExtractEmailHeaders\",\n+                        \"typeDescription\": \"Using the flowfile content as source of data, extract header from an RFC compliant  email file adding the relevant attributes to the flowfile. This processor does not perform extensive RFC validation but still requires a bare minimum compliance with RFC 2822\",\n                         \"version\": \"1.27.0\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"The amount of time that it took to complete the update operation in ms.\",\n-                                \"name\": \"elasticsearch.update.took\"\n+                                \"description\": \"Each individual BCC recipient (if available)\",\n+                                \"name\": \"email.headers.bcc.*\"\n                             },\n                             {\n-                                \"description\": \"The error message provided by Elasticsearch if there is an error running the update.\",\n-                                \"name\": \"elasticsearch.update.error\"\n+                                \"description\": \"Each individual CC recipient (if available)\",\n+                                \"name\": \"email.headers.cc.*\"\n+                            },\n+                            {\n+                                \"description\": \"Each individual mailbox contained in the From  of the Email (array as per RFC-2822)\",\n+                                \"name\": \"email.headers.from.*\"\n+                            },\n+                            {\n+                                \"description\": \"The value of the Message-ID header (if available)\",\n+                                \"name\": \"email.headers.message-id\"\n+                            },\n+                            {\n+                                \"description\": \"The Received-Date of the message (if available)\",\n+                                \"name\": \"email.headers.received_date\"\n+                            },\n+                            {\n+                                \"description\": \"Date the message was sent\",\n+                                \"name\": \"email.headers.sent_date\"\n+                            },\n+                            {\n+                                \"description\": \"Subject of the message (if available)\",\n+                                \"name\": \"email.headers.subject\"\n+                            },\n+                            {\n+                                \"description\": \"Each individual TO recipient (if available)\",\n+                                \"name\": \"email.headers.to.*\"\n+                            },\n+                            {\n+                                \"description\": \"Number of attachments of the message\",\n+                                \"name\": \"email.attachment_count\"\n                             }\n                         ]\n-                    }\n-                ],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"1.27.0\"\n-        },\n-        {\n-            \"artifact\": \"nifi-kafka-2-0-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [\n+                    },\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-kafka-2-0-nar\",\n+                        \"artifact\": \"nifi-email-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n-                        \"deprecated\": true,\n-                        \"deprecationAlternatives\": [\n-                            \"org.apache.nifi.record.sink.kafka.KafkaRecordSink_2_6\"\n-                        ],\n-                        \"deprecationReason\": \"\",\n-                        \"dynamicProperties\": [\n+                        \"defaultBulletinLevel\": \"WARN\",\n+                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": 1,\n+                            \"EVENT_DRIVEN\": 0,\n+                            \"TIMER_DRIVEN\": 1\n+                        },\n+                        \"defaultPenaltyDuration\": \"30 sec\",\n+                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": \"* * * * * ?\",\n+                            \"TIMER_DRIVEN\": \"0 sec\"\n+                        },\n+                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n+                        \"defaultYieldDuration\": \"1 sec\",\n+                        \"group\": \"org.apache.nifi\",\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n+                        \"primaryNodeOnly\": false,\n+                        \"sideEffectFree\": true,\n+                        \"supportedRelationships\": [\n                             {\n-                                \"description\": \"These properties will be added on the Kafka configuration after loading any provided configuration properties. In the event a dynamic property represents a property that was already set, its value will be ignored and WARN message logged. For the list of available Kafka properties please refer to: http://kafka.apache.org/documentation.html#configuration. \",\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"name\": \"The name of a Kafka configuration property.\",\n-                                \"value\": \"The value of a given Kafka configuration property.\"\n+                                \"description\": \"Each individual flowfile that could not be parsed will be routed to the failure relationship\",\n+                                \"name\": \"failure\"\n+                            },\n+                            {\n+                                \"description\": \"Each original flowfile (i.e. before extraction) will be routed to the original relationship\",\n+                                \"name\": \"original\"\n+                            },\n+                            {\n+                                \"description\": \"Each individual attachment will be routed to the attachments relationship\",\n+                                \"name\": \"attachments\"\n                             }\n                         ],\n-                        \"group\": \"org.apache.nifi\",\n-                        \"propertyDescriptors\": {\n-                            \"ack.wait.time\": {\n-                                \"defaultValue\": \"5 secs\",\n-                                \"description\": \"After sending a message to Kafka, this indicates the amount of time that we are willing to wait for a response from Kafka. If Kafka does not acknowledge the message within this time period, the FlowFile will be routed to 'failure'.\",\n-                                \"displayName\": \"Acknowledgment Wait Time\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"ack.wait.time\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"acks\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"Records are considered 'transmitted successfully' after successfully writing the content to a Kafka node, without waiting for a response. This provides the best performance but may result in data loss.\",\n-                                        \"displayName\": \"Best Effort\",\n-                                        \"value\": \"0\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Records are considered 'transmitted successfully' if the message is received by a single Kafka node, whether or not it is replicated. This is faster than <Guarantee Replicated Delivery> but can result in data loss if a Kafka node crashes.\",\n-                                        \"displayName\": \"Guarantee Single Node Delivery\",\n-                                        \"value\": \"1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Records are considered 'transmitted unsuccessfully' unless the message is replicated to the appropriate number of Kafka Nodes according to the Topic configuration.\",\n-                                        \"displayName\": \"Guarantee Replicated Delivery\",\n-                                        \"value\": \"all\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"0\",\n-                                \"description\": \"Specifies the requirement for guaranteeing that a message is sent to Kafka. Corresponds to Kafka's 'acks' property.\",\n-                                \"displayName\": \"Delivery Guarantee\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"acks\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\",\n+                            \"EVENT_DRIVEN\"\n+                        ],\n+                        \"supportsBatching\": true,\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicRelationships\": false,\n+                        \"supportsEventDriven\": true,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"email\",\n+                            \"split\"\n+                        ],\n+                        \"triggerSerially\": false,\n+                        \"triggerWhenAnyDestinationAvailable\": false,\n+                        \"triggerWhenEmpty\": false,\n+                        \"type\": \"org.apache.nifi.processors.email.ExtractTNEFAttachments\",\n+                        \"typeDescription\": \"Extract attachments from a mime formatted email file, splitting them into individual flowfiles.\",\n+                        \"version\": \"1.27.0\",\n+                        \"writesAttributes\": [\n+                            {\n+                                \"description\": \"The filename of the attachment\",\n+                                \"name\": \"filename \"\n                             },\n-                            \"bootstrap.servers\": {\n-                                \"defaultValue\": \"localhost:9092\",\n-                                \"description\": \"Comma-separated list of Kafka Brokers in the format host:port\",\n-                                \"displayName\": \"Kafka Brokers\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"bootstrap.servers\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n+                            {\n+                                \"description\": \"The filename of the parent FlowFile\",\n+                                \"name\": \"email.tnef.attachment.parent.filename \"\n                             },\n-                            \"compression.type\": {\n+                            {\n+                                \"description\": \"The UUID of the original FlowFile.\",\n+                                \"name\": \"email.tnef.attachment.parent.uuid\"\n+                            }\n+                        ]\n+                    },\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-email-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"e0c4461\"\n+                        },\n+                        \"defaultBulletinLevel\": \"WARN\",\n+                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": 1,\n+                            \"TIMER_DRIVEN\": 1\n+                        },\n+                        \"defaultPenaltyDuration\": \"30 sec\",\n+                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": \"* * * * * ?\",\n+                            \"TIMER_DRIVEN\": \"0 sec\"\n+                        },\n+                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n+                        \"defaultYieldDuration\": \"1 sec\",\n+                        \"group\": \"org.apache.nifi\",\n+                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n+                        \"primaryNodeOnly\": false,\n+                        \"propertyDescriptors\": {\n+                            \"CLIENT_AUTH\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"none\",\n-                                        \"value\": \"none\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"gzip\",\n-                                        \"value\": \"gzip\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"snappy\",\n-                                        \"value\": \"snappy\"\n+                                        \"displayName\": \"NONE\",\n+                                        \"value\": \"NONE\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"lz4\",\n-                                        \"value\": \"lz4\"\n+                                        \"displayName\": \"REQUIRED\",\n+                                        \"value\": \"REQUIRED\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"none\",\n-                                \"description\": \"This parameter allows you to specify the compression codec for all data generated by this producer.\",\n-                                \"displayName\": \"Compression Type\",\n+                                \"description\": \"The client authentication policy to use for the SSL Context. Only used if an SSL Context Service is provided.\",\n+                                \"displayName\": \"Client Auth\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"compression.type\",\n-                                \"required\": true,\n+                                \"name\": \"CLIENT_AUTH\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"kerberos-credentials-service\": {\n-                                \"description\": \"Service supporting generalized credentials authentication with Kerberos\",\n-                                \"displayName\": \"Kerberos Credentials Service\",\n+                            \"SMTP_HOSTNAME\": {\n+                                \"description\": \"The hostname to be embedded into the banner displayed when an SMTP client connects to the processor TCP port .\",\n+                                \"displayName\": \"SMTP hostname\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"kerberos-credentials-service\",\n+                                \"name\": \"SMTP_HOSTNAME\",\n                                 \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.kerberos.KerberosCredentialsService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            },\n-                            \"max.block.ms\": {\n-                                \"defaultValue\": \"5 sec\",\n-                                \"description\": \"The amount of time publisher will wait to obtain metadata or wait for the buffer to flush during the 'send' call before failing the entire 'send' call. Corresponds to Kafka's 'max.block.ms' property\",\n-                                \"displayName\": \"Max Metadata Wait Time\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"max.block.ms\",\n-                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"max.request.size\": {\n-                                \"defaultValue\": \"1 MB\",\n-                                \"description\": \"The maximum size of a request in bytes. Corresponds to Kafka's 'max.request.size' property and defaults to 1 MB (1048576).\",\n-                                \"displayName\": \"Max Request Size\",\n+                            \"SMTP_MAXIMUM_CONNECTIONS\": {\n+                                \"defaultValue\": \"1\",\n+                                \"description\": \"The maximum number of simultaneous SMTP connections.\",\n+                                \"displayName\": \"Maximum number of SMTP connection\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"max.request.size\",\n+                                \"name\": \"SMTP_MAXIMUM_CONNECTIONS\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"message-header-encoding\": {\n-                                \"defaultValue\": \"UTF-8\",\n-                                \"description\": \"For any attribute that is added as a message header, as configured via the <Attributes to Send as Headers> property, this property indicates the Character Encoding to use for serializing the headers.\",\n-                                \"displayName\": \"Message Header Encoding\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"message-header-encoding\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"record-sink-record-writer\": {\n-                                \"description\": \"Specifies the Controller Service to use for writing out the records.\",\n-                                \"displayName\": \"Record Writer\",\n+                            \"SMTP_MAXIMUM_MSG_SIZE\": {\n+                                \"defaultValue\": \"20 MB\",\n+                                \"description\": \"The maximum number of bytes the server will accept.\",\n+                                \"displayName\": \"SMTP Maximum Message Size\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"record-sink-record-writer\",\n+                                \"name\": \"SMTP_MAXIMUM_MSG_SIZE\",\n                                 \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            },\n-                            \"sasl.kerberos.service.name\": {\n-                                \"description\": \"The service name that matches the primary name of the Kafka server configured in the broker JAAS configuration\",\n-                                \"displayName\": \"Kerberos Service Name\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"sasl.kerberos.service.name\",\n-                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"sasl.mechanism\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"General Security Services API for Kerberos authentication\",\n-                                        \"displayName\": \"GSSAPI\",\n-                                        \"value\": \"GSSAPI\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Plain username and password authentication\",\n-                                        \"displayName\": \"PLAIN\",\n-                                        \"value\": \"PLAIN\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Salted Challenge Response Authentication Mechanism using SHA-512 with username and password\",\n-                                        \"displayName\": \"SCRAM-SHA-256\",\n-                                        \"value\": \"SCRAM-SHA-256\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Salted Challenge Response Authentication Mechanism using SHA-256 with username and password\",\n-                                        \"displayName\": \"SCRAM-SHA-512\",\n-                                        \"value\": \"SCRAM-SHA-512\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"GSSAPI\",\n-                                \"description\": \"SASL mechanism used for authentication. Corresponds to Kafka Client sasl.mechanism property\",\n-                                \"displayName\": \"SASL Mechanism\",\n+                            \"SMTP_PORT\": {\n+                                \"description\": \"The TCP port the ListenSMTP processor will bind to.NOTE that on Unix derivative operating  systems this port must be higher than 1024 unless NiFi is running as with root user permissions.\",\n+                                \"displayName\": \"Listening Port\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"sasl.mechanism\",\n+                                \"name\": \"SMTP_PORT\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"security.protocol\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"PLAINTEXT\",\n-                                        \"value\": \"PLAINTEXT\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"SSL\",\n-                                        \"value\": \"SSL\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"SASL_PLAINTEXT\",\n-                                        \"value\": \"SASL_PLAINTEXT\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"SASL_SSL\",\n-                                        \"value\": \"SASL_SSL\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"PLAINTEXT\",\n-                                \"description\": \"Security protocol used to communicate with brokers. Corresponds to Kafka Client security.protocol property\",\n-                                \"displayName\": \"Security Protocol\",\n+                            \"SMTP_TIMEOUT\": {\n+                                \"defaultValue\": \"60 seconds\",\n+                                \"description\": \"The maximum time to wait for an action of SMTP client.\",\n+                                \"displayName\": \"SMTP connection timeout\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"security.protocol\",\n+                                \"name\": \"SMTP_TIMEOUT\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"ssl.context.service\": {\n-                                \"description\": \"Service supporting SSL communication with Kafka brokers\",\n+                            \"SSL_CONTEXT_SERVICE\": {\n+                                \"description\": \"The Controller Service to use in order to obtain an SSL Context. If this property is set, messages will be received over a secure connection.\",\n                                 \"displayName\": \"SSL Context Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"ssl.context.service\",\n+                                \"name\": \"SSL_CONTEXT_SERVICE\",\n                                 \"required\": false,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n                                     \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n+                                    \"type\": \"org.apache.nifi.ssl.RestrictedSSLContextService\",\n                                     \"version\": \"1.27.0\"\n                                 }\n-                            },\n-                            \"topic\": {\n-                                \"description\": \"The name of the Kafka Topic to publish to.\",\n-                                \"displayName\": \"Topic Name\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"topic\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n                             }\n                         },\n-                        \"providedApiImplementations\": [\n+                        \"sideEffectFree\": false,\n+                        \"supportedRelationships\": [\n                             {\n-                                \"artifact\": \"nifi-standard-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.record.sink.RecordSinkService\",\n-                                \"version\": \"1.27.0\"\n+                                \"description\": \"All new messages will be routed as FlowFiles to this relationship\",\n+                                \"name\": \"success\"\n                             }\n                         ],\n-                        \"supportsDynamicProperties\": true,\n+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\"\n+                        ],\n+                        \"supportsBatching\": false,\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicRelationships\": false,\n+                        \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"kafka\",\n-                            \"record\",\n-                            \"sink\"\n+                            \"email\",\n+                            \"listen\",\n+                            \"smtp\"\n                         ],\n-                        \"type\": \"org.apache.nifi.record.sink.kafka.KafkaRecordSink_2_0\",\n-                        \"typeDescription\": \"Provides a service to write records to a Kafka 2.x topic.\",\n-                        \"version\": \"1.27.0\"\n+                        \"triggerSerially\": true,\n+                        \"triggerWhenAnyDestinationAvailable\": false,\n+                        \"triggerWhenEmpty\": false,\n+                        \"type\": \"org.apache.nifi.processors.email.ListenSMTP\",\n+                        \"typeDescription\": \"This processor implements a lightweight SMTP server to an arbitrary port, allowing nifi to listen for incoming email. Note this server does not perform any email validation. If direct exposure to the internet is sought, it may be a better idea to use the combination of NiFi and an industrial scale MTA (e.g. Postfix). Threading for this processor is managed by the underlying smtp server used so the processor need not support more than one thread.\",\n+                        \"version\": \"1.27.0\",\n+                        \"writesAttributes\": [\n+                            {\n+                                \"description\": \"The value used during HELO\",\n+                                \"name\": \"smtp.helo\"\n+                            },\n+                            {\n+                                \"description\": \"The serial numbers for each of the certificates used by an TLS peer\",\n+                                \"name\": \"smtp.certificates.*.serial\"\n+                            },\n+                            {\n+                                \"description\": \"The principal for each of the certificates used by an TLS peer\",\n+                                \"name\": \"smtp.certificates.*.principal\"\n+                            },\n+                            {\n+                                \"description\": \"The source IP and port of the SMTP connection\",\n+                                \"name\": \"smtp.src\"\n+                            },\n+                            {\n+                                \"description\": \"The value used during MAIL FROM (i.e. envelope)\",\n+                                \"name\": \"smtp.from\"\n+                            },\n+                            {\n+                                \"description\": \"The values used during RCPT TO (i.e. envelope)\",\n+                                \"name\": \"smtp.recipient.*\"\n+                            },\n+                            {\n+                                \"description\": \"Mime type of the message\",\n+                                \"name\": \"mime.type\"\n+                            }\n+                        ]\n                     }\n                 ],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"1.27.0\"\n+        },\n+        {\n+            \"artifact\": \"nifi-splunk-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [],\n                 \"processors\": [\n                     {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-kafka-2-0-nar\",\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-splunk-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n                         },\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"0 sec\"\n+                            \"TIMER_DRIVEN\": \"1 min\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n-                        \"deprecated\": true,\n-                        \"deprecationAlternatives\": [\n-                            \"org.apache.nifi.processors.kafka.pubsub.ConsumeKafkaRecord_2_6\"\n-                        ],\n-                        \"deprecationReason\": \"\",\n-                        \"dynamicProperties\": [\n-                            {\n-                                \"description\": \"These properties will be added on the Kafka configuration after loading any provided configuration properties. In the event a dynamic property represents a property that was already set, its value will be ignored and WARN message logged. For the list of available Kafka properties please refer to: http://kafka.apache.org/documentation.html#configuration.\",\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"name\": \"The name of a Kafka configuration property.\",\n-                                \"value\": \"The value of a given Kafka configuration property.\"\n-                            }\n-                        ],\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_FORBIDDEN\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Communications Timeout\": {\n-                                \"defaultValue\": \"60 secs\",\n-                                \"description\": \"Specifies the timeout that the consumer should use when communicating with the Kafka Broker\",\n-                                \"displayName\": \"Communications Timeout\",\n+                            \"Application\": {\n+                                \"description\": \"The Splunk Application to query.\",\n+                                \"displayName\": \"Application\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Communications Timeout\",\n-                                \"required\": true,\n+                                \"name\": \"Application\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"auto.offset.reset\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"Automatically reset the offset to the earliest offset\",\n-                                        \"displayName\": \"earliest\",\n-                                        \"value\": \"earliest\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Automatically reset the offset to the latest offset\",\n-                                        \"displayName\": \"latest\",\n-                                        \"value\": \"latest\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Throw exception to the consumer if no previous offset is found for the consumer's group\",\n-                                        \"displayName\": \"none\",\n-                                        \"value\": \"none\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"latest\",\n-                                \"description\": \"Allows you to manage the condition when there is no initial offset in Kafka or if the current offset does not exist any more on the server (e.g. because that data has been deleted). Corresponds to Kafka's 'auto.offset.reset' property.\",\n-                                \"displayName\": \"Offset Reset\",\n+                            \"Connection Timeout\": {\n+                                \"defaultValue\": \"5 secs\",\n+                                \"description\": \"Max wait time for connection to the Splunk server.\",\n+                                \"displayName\": \"Connection Timeout\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"auto.offset.reset\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"aws.profile.name\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"AWS_MSK_IAM\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"SASL Mechanism\",\n-                                        \"propertyName\": \"sasl.mechanism\"\n-                                    }\n-                                ],\n-                                \"description\": \"The Amazon Web Services Profile to select when multiple profiles are available.\",\n-                                \"displayName\": \"AWS Profile Name\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"aws.profile.name\",\n+                                \"name\": \"Connection Timeout\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"bootstrap.servers\": {\n-                                \"defaultValue\": \"localhost:9092\",\n-                                \"description\": \"Comma-separated list of Kafka Brokers in the format host:port\",\n-                                \"displayName\": \"Kafka Brokers\",\n+                            \"Earliest Time\": {\n+                                \"description\": \"The value to use for the earliest time when querying. Only used with a Time Range Strategy of Provided. See Splunk's documentation on Search Time Modifiers for guidance in populating this field.\",\n+                                \"displayName\": \"Earliest Time\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"bootstrap.servers\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Earliest Time\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"group.id\": {\n-                                \"description\": \"A Group ID is used to identify consumers that are within the same consumer group. Corresponds to Kafka's 'group.id' property.\",\n-                                \"displayName\": \"Group ID\",\n+                            \"Hostname\": {\n+                                \"defaultValue\": \"localhost\",\n+                                \"description\": \"The ip address or hostname of the Splunk server.\",\n+                                \"displayName\": \"Hostname\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"group.id\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Hostname\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"header-name-regex\": {\n-                                \"description\": \"A Regular Expression that is matched against all message headers. Any message header whose name matches the regex will be added to the FlowFile as an Attribute. If not specified, no Header values will be added as FlowFile attributes. If two messages have a different value for the same header and that header is selected by the provided regex, then those two messages must be added to different FlowFiles. As a result, users should be cautious about using a regex like \\\".*\\\" if messages are expected to have header values that are unique per message, such as an identifier or timestamp, because it will prevent NiFi from bundling the messages together efficiently.\",\n-                                \"displayName\": \"Headers to Add as Attributes (Regex)\",\n+                            \"Latest Time\": {\n+                                \"description\": \"The value to use for the latest time when querying. Only used with a Time Range Strategy of Provided. See Splunk's documentation on Search Time Modifiers for guidance in populating this field.\",\n+                                \"displayName\": \"Latest Time\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"header-name-regex\",\n+                                \"name\": \"Latest Time\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"honor-transactions\": {\n+                            \"Output Mode\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"displayName\": \"ATOM\",\n+                                        \"value\": \"ATOM\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"true\",\n-                                \"description\": \"Specifies whether or not NiFi should honor transactional guarantees when communicating with Kafka. If false, the Processor will use an \\\"isolation level\\\" of read_uncomitted. This means that messages will be received as soon as they are written to Kafka but will be pulled, even if the producer cancels the transactions. If this value is true, NiFi will not receive any messages for which the producer's transaction was canceled, but this can result in some latency since the consumer must wait for the producer to finish its entire transaction instead of pulling as the messages become available.\",\n-                                \"displayName\": \"Honor Transactions\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"honor-transactions\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"kerberos-credentials-service\": {\n-                                \"description\": \"Service supporting generalized credentials authentication with Kerberos\",\n-                                \"displayName\": \"Kerberos Credentials Service\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"kerberos-credentials-service\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.kerberos.KerberosCredentialsService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            },\n-                            \"key-attribute-encoding\": {\n-                                \"allowableValues\": [\n+                                        \"displayName\": \"CSV\",\n+                                        \"value\": \"CSV\"\n+                                    },\n                                     {\n-                                        \"description\": \"The key is interpreted as a UTF-8 Encoded string.\",\n-                                        \"displayName\": \"UTF-8 Encoded\",\n-                                        \"value\": \"utf-8\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"JSON\",\n+                                        \"value\": \"JSON\"\n                                     },\n                                     {\n-                                        \"description\": \"The key is interpreted as arbitrary binary data and is encoded using hexadecimal characters with uppercase letters\",\n-                                        \"displayName\": \"Hex Encoded\",\n-                                        \"value\": \"hex\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"JSON_COLS\",\n+                                        \"value\": \"JSON_COLS\"\n                                     },\n                                     {\n-                                        \"description\": \"The key will not be added as an Attribute\",\n-                                        \"displayName\": \"Do Not Add Key as Attribute\",\n-                                        \"value\": \"do-not-add\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"JSON_ROWS\",\n+                                        \"value\": \"JSON_ROWS\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"RAW\",\n+                                        \"value\": \"RAW\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"XML\",\n+                                        \"value\": \"XML\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"utf-8\",\n-                                \"description\": \"If the <Separate By Key> property is set to true, FlowFiles that are emitted have an attribute named 'kafka.key'. This property dictates how the value of the attribute should be encoded.\",\n-                                \"displayName\": \"Key Attribute Encoding\",\n+                                \"defaultValue\": \"JSON\",\n+                                \"description\": \"The output mode for the results.\",\n+                                \"displayName\": \"Output Mode\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"key-attribute-encoding\",\n+                                \"name\": \"Output Mode\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"max-uncommit-offset-wait\": {\n-                                \"defaultValue\": \"1 secs\",\n-                                \"description\": \"Specifies the maximum amount of time allowed to pass before offsets must be committed. This value impacts how often offsets will be committed.  Committing offsets less often increases throughput but also increases the window of potential data duplication in the event of a rebalance or JVM restart between commits.  This value is also related to maximum poll records and the use of a message demarcator.  When using a message demarcator we can have far more uncommitted messages than when we're not as there is much less for us to keep track of in memory.\",\n-                                \"displayName\": \"Max Uncommitted Time\",\n+                            \"Owner\": {\n+                                \"description\": \"The owner to pass to Splunk.\",\n+                                \"displayName\": \"Owner\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"max-uncommit-offset-wait\",\n+                                \"name\": \"Owner\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"max.poll.records\": {\n-                                \"defaultValue\": \"10000\",\n-                                \"description\": \"Specifies the maximum number of records Kafka should return in a single poll.\",\n-                                \"displayName\": \"Max Poll Records\",\n+                            \"Password\": {\n+                                \"description\": \"The password to authenticate to Splunk.\",\n+                                \"displayName\": \"Password\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"max.poll.records\",\n+                                \"name\": \"Password\",\n                                 \"required\": false,\n-                                \"sensitive\": false\n+                                \"sensitive\": true\n                             },\n-                            \"message-header-encoding\": {\n-                                \"defaultValue\": \"UTF-8\",\n-                                \"description\": \"Any message header that is found on a Kafka message will be added to the outbound FlowFile as an attribute. This property indicates the Character Encoding to use for deserializing the headers.\",\n-                                \"displayName\": \"Message Header Encoding\",\n+                            \"Port\": {\n+                                \"defaultValue\": \"8089\",\n+                                \"description\": \"The port of the Splunk server.\",\n+                                \"displayName\": \"Port\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"message-header-encoding\",\n-                                \"required\": false,\n+                                \"name\": \"Port\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"record-reader\": {\n-                                \"description\": \"The Record Reader to use for incoming FlowFiles\",\n-                                \"displayName\": \"Record Reader\",\n+                            \"Query\": {\n+                                \"defaultValue\": \"search * | head 100\",\n+                                \"description\": \"The query to execute. Typically beginning with a <search> command followed by a search clause, such as <search source=\\\"tcp:7689\\\"> to search for messages received on TCP port 7689.\",\n+                                \"displayName\": \"Query\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"record-reader\",\n+                                \"name\": \"Query\",\n                                 \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n+                                \"sensitive\": false\n                             },\n-                            \"record-writer\": {\n-                                \"description\": \"The Record Writer to use in order to serialize the data before sending to Kafka\",\n-                                \"displayName\": \"Record Writer\",\n+                            \"Read Timeout\": {\n+                                \"defaultValue\": \"15 secs\",\n+                                \"description\": \"Max wait time for response from the Splunk server.\",\n+                                \"displayName\": \"Read Timeout\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"record-writer\",\n-                                \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            },\n-                            \"sasl.kerberos.keytab\": {\n-                                \"description\": \"Keytab credentials used for authentication with Kerberos\",\n-                                \"displayName\": \"Kerberos Keytab\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"sasl.kerberos.keytab\",\n-                                \"required\": false,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"SINGLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\"\n-                                    ]\n-                                },\n-                                \"sensitive\": false\n-                            },\n-                            \"sasl.kerberos.principal\": {\n-                                \"description\": \"Principal used for authentication with Kerberos\",\n-                                \"displayName\": \"Kerberos Principal\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"sasl.kerberos.principal\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"sasl.kerberos.service.name\": {\n-                                \"description\": \"The service name that matches the primary name of the Kafka server configured in the broker JAAS configuration\",\n-                                \"displayName\": \"Kerberos Service Name\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"sasl.kerberos.service.name\",\n+                                \"name\": \"Read Timeout\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"sasl.mechanism\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"General Security Services API for Kerberos authentication\",\n-                                        \"displayName\": \"GSSAPI\",\n-                                        \"value\": \"GSSAPI\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Plain username and password authentication\",\n-                                        \"displayName\": \"PLAIN\",\n-                                        \"value\": \"PLAIN\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Salted Challenge Response Authentication Mechanism using SHA-512 with username and password\",\n-                                        \"displayName\": \"SCRAM-SHA-256\",\n-                                        \"value\": \"SCRAM-SHA-256\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Salted Challenge Response Authentication Mechanism using SHA-256 with username and password\",\n-                                        \"displayName\": \"SCRAM-SHA-512\",\n-                                        \"value\": \"SCRAM-SHA-512\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"GSSAPI\",\n-                                \"description\": \"SASL mechanism used for authentication. Corresponds to Kafka Client sasl.mechanism property\",\n-                                \"displayName\": \"SASL Mechanism\",\n+                            \"SSL Context Service\": {\n+                                \"description\": \"The SSL Context Service used to provide client certificate information for TLS/SSL connections.\",\n+                                \"displayName\": \"SSL Context Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"sasl.mechanism\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"sasl.password\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"PLAIN\",\n-                                            \"SCRAM-SHA-512\",\n-                                            \"SCRAM-SHA-256\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"SASL Mechanism\",\n-                                        \"propertyName\": \"sasl.mechanism\"\n-                                    }\n-                                ],\n-                                \"description\": \"Password provided with configured username when using PLAIN or SCRAM SASL Mechanisms\",\n-                                \"displayName\": \"Password\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"sasl.password\",\n+                                \"name\": \"SSL Context Service\",\n                                 \"required\": false,\n-                                \"sensitive\": true\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n                             },\n-                            \"sasl.token.auth\": {\n+                            \"Scheme\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"displayName\": \"https\",\n+                                        \"value\": \"https\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"false\",\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"SCRAM-SHA-512\",\n-                                            \"SCRAM-SHA-256\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"SASL Mechanism\",\n-                                        \"propertyName\": \"sasl.mechanism\"\n+                                        \"displayName\": \"http\",\n+                                        \"value\": \"http\"\n                                     }\n                                 ],\n-                                \"description\": \"Enables or disables Token authentication when using SCRAM SASL Mechanisms\",\n-                                \"displayName\": \"Token Authentication\",\n+                                \"defaultValue\": \"https\",\n+                                \"description\": \"The scheme for connecting to Splunk.\",\n+                                \"displayName\": \"Scheme\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"sasl.token.auth\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"sasl.username\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"PLAIN\",\n-                                            \"SCRAM-SHA-512\",\n-                                            \"SCRAM-SHA-256\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"SASL Mechanism\",\n-                                        \"propertyName\": \"sasl.mechanism\"\n-                                    }\n-                                ],\n-                                \"description\": \"Username provided with configured password when using PLAIN or SCRAM SASL Mechanisms\",\n-                                \"displayName\": \"Username\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"sasl.username\",\n-                                \"required\": false,\n+                                \"name\": \"Scheme\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"security.protocol\": {\n+                            \"Security Protocol\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"PLAINTEXT\",\n-                                        \"value\": \"PLAINTEXT\"\n+                                        \"displayName\": \"TLSv1_2\",\n+                                        \"value\": \"TLSv1_2\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"SSL\",\n-                                        \"value\": \"SSL\"\n+                                        \"displayName\": \"TLSv1_1\",\n+                                        \"value\": \"TLSv1_1\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"SASL_PLAINTEXT\",\n-                                        \"value\": \"SASL_PLAINTEXT\"\n+                                        \"displayName\": \"TLSv1\",\n+                                        \"value\": \"TLSv1\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"SASL_SSL\",\n-                                        \"value\": \"SASL_SSL\"\n+                                        \"displayName\": \"SSLv3\",\n+                                        \"value\": \"SSLv3\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"PLAINTEXT\",\n-                                \"description\": \"Security protocol used to communicate with brokers. Corresponds to Kafka Client security.protocol property\",\n+                                \"defaultValue\": \"TLSv1_2\",\n+                                \"description\": \"The security protocol to use for communicating with Splunk.\",\n                                 \"displayName\": \"Security Protocol\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"security.protocol\",\n-                                \"required\": true,\n+                                \"name\": \"Security Protocol\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"separate-by-key\": {\n+                            \"Time Field Strategy\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"description\": \"Search based on the time of the event which may be different than when the event was indexed.\",\n+                                        \"displayName\": \"Event Time\",\n+                                        \"value\": \"Event Time\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"description\": \"Search based on the time the event was indexed in Splunk.\",\n+                                        \"displayName\": \"Index Time\",\n+                                        \"value\": \"Index Time\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"If true, two Records will only be added to the same FlowFile if both of the Kafka Messages have identical keys.\",\n-                                \"displayName\": \"Separate By Key\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"separate-by-key\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"ssl.context.service\": {\n-                                \"description\": \"Service supporting SSL communication with Kafka brokers\",\n-                                \"displayName\": \"SSL Context Service\",\n+                                \"defaultValue\": \"Event Time\",\n+                                \"description\": \"Indicates whether to search by the time attached to the event, or by the time the event was indexed in Splunk.\",\n+                                \"displayName\": \"Time Field Strategy\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"ssl.context.service\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            },\n-                            \"topic\": {\n-                                \"description\": \"The name of the Kafka Topic(s) to pull from. More than one can be supplied if comma separated.\",\n-                                \"displayName\": \"Topic Name(s)\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"topic\",\n+                                \"name\": \"Time Field Strategy\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"topic_type\": {\n+                            \"Time Range Strategy\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Topic is a full topic name or comma separated list of names\",\n-                                        \"displayName\": \"names\",\n-                                        \"value\": \"names\"\n+                                        \"description\": \"The processor will manage the date ranges of the query starting from the beginning of time.\",\n+                                        \"displayName\": \"Managed from Beginning\",\n+                                        \"value\": \"Managed from Beginning\"\n                                     },\n                                     {\n-                                        \"description\": \"Topic is a regex using the Java Pattern syntax\",\n-                                        \"displayName\": \"pattern\",\n-                                        \"value\": \"pattern\"\n+                                        \"description\": \"The processor will manage the date ranges of the query starting from the current time.\",\n+                                        \"displayName\": \"Managed from Current\",\n+                                        \"value\": \"Managed from Current\"\n+                                    },\n+                                    {\n+                                        \"description\": \"The the time range provided through the Earliest Time and Latest Time properties will be used.\",\n+                                        \"displayName\": \"Provided\",\n+                                        \"value\": \"Provided\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"names\",\n-                                \"description\": \"Specifies whether the Topic(s) provided are a comma separated list of names or a single regular expression\",\n-                                \"displayName\": \"Topic Name Format\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"topic_type\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            }\n-                        },\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.processors.kafka.pubsub.ConsumeKafka_2_0\",\n-                            \"org.apache.nifi.processors.kafka.pubsub.PublishKafkaRecord_2_0\",\n-                            \"org.apache.nifi.processors.kafka.pubsub.PublishKafka_2_0\"\n-                        ],\n-                        \"sideEffectFree\": false,\n-                        \"supportedRelationships\": [\n-                            {\n-                                \"description\": \"FlowFiles received from Kafka.  Depending on demarcation strategy it is a flow file per message or a bundle of messages grouped by topic and partition.\",\n-                                \"name\": \"success\"\n-                            },\n-                            {\n-                                \"description\": \"If a message from Kafka cannot be parsed using the configured Record Reader, the contents of the message will be routed to this Relationship as its own individual FlowFile.\",\n-                                \"name\": \"parse.failure\"\n-                            }\n-                        ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": false,\n-                        \"supportsDynamicProperties\": true,\n-                        \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": false,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"2.0\",\n-                            \"Consume\",\n-                            \"Get\",\n-                            \"Ingest\",\n-                            \"Ingress\",\n-                            \"Kafka\",\n-                            \"PubSub\",\n-                            \"Record\",\n-                            \"Topic\",\n-                            \"avro\",\n-                            \"csv\",\n-                            \"json\"\n-                        ],\n-                        \"triggerSerially\": false,\n-                        \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.kafka.pubsub.ConsumeKafkaRecord_2_0\",\n-                        \"typeDescription\": \"Consumes messages from Apache Kafka specifically built against the Kafka 2.0 Consumer API. The complementary NiFi processor for sending messages is PublishKafkaRecord_2_0. Please note that, at this time, the Processor assumes that all records that are retrieved from a given partition have the same schema. If any of the Kafka messages are pulled but cannot be parsed or written with the configured Record Reader or Record Writer, the contents of the message will be written to a separate FlowFile, and that FlowFile will be transferred to the 'parse.failure' relationship. Otherwise, each FlowFile is sent to the 'success' relationship and may contain many individual messages within the single FlowFile. A 'record.count' attribute is added to indicate how many messages are contained in the FlowFile. No two Kafka messages will be placed into the same FlowFile if they have different schemas, or if they have different values for a message header that is included by the <Headers to Add as Attributes> property.\",\n-                        \"version\": \"1.27.0\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"The number of records received\",\n-                                \"name\": \"record.count\"\n-                            },\n-                            {\n-                                \"description\": \"The MIME Type that is provided by the configured Record Writer\",\n-                                \"name\": \"mime.type\"\n-                            },\n-                            {\n-                                \"description\": \"The partition of the topic the records are from\",\n-                                \"name\": \"kafka.partition\"\n-                            },\n-                            {\n-                                \"description\": \"The timestamp of the message in the partition of the topic.\",\n-                                \"name\": \"kafka.timestamp\"\n-                            },\n-                            {\n-                                \"description\": \"The topic records are from\",\n-                                \"name\": \"kafka.topic\"\n-                            }\n-                        ]\n-                    },\n-                    {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-kafka-2-0-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"e0c4461\"\n-                        },\n-                        \"defaultBulletinLevel\": \"WARN\",\n-                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": 1,\n-                            \"TIMER_DRIVEN\": 1\n-                        },\n-                        \"defaultPenaltyDuration\": \"30 sec\",\n-                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"0 sec\"\n-                        },\n-                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n-                        \"defaultYieldDuration\": \"1 sec\",\n-                        \"deprecated\": true,\n-                        \"deprecationAlternatives\": [\n-                            \"org.apache.nifi.processors.kafka.pubsub.ConsumeKafka_2_6\"\n-                        ],\n-                        \"deprecationReason\": \"\",\n-                        \"dynamicProperties\": [\n-                            {\n-                                \"description\": \"These properties will be added on the Kafka configuration after loading any provided configuration properties. In the event a dynamic property represents a property that was already set, its value will be ignored and WARN message logged. For the list of available Kafka properties please refer to: http://kafka.apache.org/documentation.html#configuration. \",\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"name\": \"The name of a Kafka configuration property.\",\n-                                \"value\": \"The value of a given Kafka configuration property.\"\n-                            }\n-                        ],\n-                        \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n-                        \"primaryNodeOnly\": false,\n-                        \"propertyDescriptors\": {\n-                            \"Communications Timeout\": {\n-                                \"defaultValue\": \"60 secs\",\n-                                \"description\": \"Specifies the timeout that the consumer should use when communicating with the Kafka Broker\",\n-                                \"displayName\": \"Communications Timeout\",\n+                                \"defaultValue\": \"Provided\",\n+                                \"description\": \"Indicates how to apply time ranges to each execution of the query. Selecting a managed option allows the processor to apply a time range from the last execution time to the current execution time. When using <Managed from Beginning>, an earliest time will not be applied on the first execution, and thus all records searched. When using <Managed from Current> the earliest time of the first execution will be the initial execution time. When using <Provided>, the time range will come from the Earliest Time and Latest Time properties, or no time range will be applied if these properties are left blank.\",\n+                                \"displayName\": \"Time Range Strategy\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Communications Timeout\",\n+                                \"name\": \"Time Range Strategy\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"auto.offset.reset\": {\n+                            \"Time Zone\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Automatically reset the offset to the earliest offset\",\n-                                        \"displayName\": \"earliest\",\n-                                        \"value\": \"earliest\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Africa/Abidjan\",\n+                                        \"value\": \"Africa/Abidjan\"\n                                     },\n                                     {\n-                                        \"description\": \"Automatically reset the offset to the latest offset\",\n-                                        \"displayName\": \"latest\",\n-                                        \"value\": \"latest\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Africa/Accra\",\n+                                        \"value\": \"Africa/Accra\"\n                                     },\n                                     {\n-                                        \"description\": \"Throw exception to the consumer if no previous offset is found for the consumer's group\",\n-                                        \"displayName\": \"none\",\n-                                        \"value\": \"none\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"latest\",\n-                                \"description\": \"Allows you to manage the condition when there is no initial offset in Kafka or if the current offset does not exist any more on the server (e.g. because that data has been deleted). Corresponds to Kafka's 'auto.offset.reset' property.\",\n-                                \"displayName\": \"Offset Reset\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"auto.offset.reset\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"aws.profile.name\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"AWS_MSK_IAM\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"SASL Mechanism\",\n-                                        \"propertyName\": \"sasl.mechanism\"\n-                                    }\n-                                ],\n-                                \"description\": \"The Amazon Web Services Profile to select when multiple profiles are available.\",\n-                                \"displayName\": \"AWS Profile Name\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"aws.profile.name\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"bootstrap.servers\": {\n-                                \"defaultValue\": \"localhost:9092\",\n-                                \"description\": \"Comma-separated list of Kafka Brokers in the format host:port\",\n-                                \"displayName\": \"Kafka Brokers\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"bootstrap.servers\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"group.id\": {\n-                                \"description\": \"A Group ID is used to identify consumers that are within the same consumer group. Corresponds to Kafka's 'group.id' property.\",\n-                                \"displayName\": \"Group ID\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"group.id\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"header-name-regex\": {\n-                                \"description\": \"A Regular Expression that is matched against all message headers. Any message header whose name matches the regex will be added to the FlowFile as an Attribute. If not specified, no Header values will be added as FlowFile attributes. If two messages have a different value for the same header and that header is selected by the provided regex, then those two messages must be added to different FlowFiles. As a result, users should be cautious about using a regex like \\\".*\\\" if messages are expected to have header values that are unique per message, such as an identifier or timestamp, because it will prevent NiFi from bundling the messages together efficiently.\",\n-                                \"displayName\": \"Headers to Add as Attributes (Regex)\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"header-name-regex\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"honor-transactions\": {\n-                                \"allowableValues\": [\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Africa/Addis_Ababa\",\n+                                        \"value\": \"Africa/Addis_Ababa\"\n+                                    },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"displayName\": \"Africa/Algiers\",\n+                                        \"value\": \"Africa/Algiers\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"true\",\n-                                \"description\": \"Specifies whether or not NiFi should honor transactional guarantees when communicating with Kafka. If false, the Processor will use an \\\"isolation level\\\" of read_uncomitted. This means that messages will be received as soon as they are written to Kafka but will be pulled, even if the producer cancels the transactions. If this value is true, NiFi will not receive any messages for which the producer's transaction was canceled, but this can result in some latency since the consumer must wait for the producer to finish its entire transaction instead of pulling as the messages become available.\",\n-                                \"displayName\": \"Honor Transactions\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"honor-transactions\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"kerberos-credentials-service\": {\n-                                \"description\": \"Service supporting generalized credentials authentication with Kerberos\",\n-                                \"displayName\": \"Kerberos Credentials Service\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"kerberos-credentials-service\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.kerberos.KerberosCredentialsService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            },\n-                            \"key-attribute-encoding\": {\n-                                \"allowableValues\": [\n+                                        \"displayName\": \"Africa/Asmara\",\n+                                        \"value\": \"Africa/Asmara\"\n+                                    },\n                                     {\n-                                        \"description\": \"The key is interpreted as a UTF-8 Encoded string.\",\n-                                        \"displayName\": \"UTF-8 Encoded\",\n-                                        \"value\": \"utf-8\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Africa/Asmera\",\n+                                        \"value\": \"Africa/Asmera\"\n                                     },\n                                     {\n-                                        \"description\": \"The key is interpreted as arbitrary binary data and is encoded using hexadecimal characters with uppercase letters\",\n-                                        \"displayName\": \"Hex Encoded\",\n-                                        \"value\": \"hex\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Africa/Bamako\",\n+                                        \"value\": \"Africa/Bamako\"\n                                     },\n                                     {\n-                                        \"description\": \"The key will not be added as an Attribute\",\n-                                        \"displayName\": \"Do Not Add Key as Attribute\",\n-                                        \"value\": \"do-not-add\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"utf-8\",\n-                                \"description\": \"FlowFiles that are emitted have an attribute named 'kafka.key'. This property dictates how the value of the attribute should be encoded.\",\n-                                \"displayName\": \"Key Attribute Encoding\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"key-attribute-encoding\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"max-uncommit-offset-wait\": {\n-                                \"defaultValue\": \"1 secs\",\n-                                \"description\": \"Specifies the maximum amount of time allowed to pass before offsets must be committed. This value impacts how often offsets will be committed.  Committing offsets less often increases throughput but also increases the window of potential data duplication in the event of a rebalance or JVM restart between commits.  This value is also related to maximum poll records and the use of a message demarcator.  When using a message demarcator we can have far more uncommitted messages than when we're not as there is much less for us to keep track of in memory.\",\n-                                \"displayName\": \"Max Uncommitted Time\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"max-uncommit-offset-wait\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"max.poll.records\": {\n-                                \"defaultValue\": \"10000\",\n-                                \"description\": \"Specifies the maximum number of records Kafka should return in a single poll.\",\n-                                \"displayName\": \"Max Poll Records\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"max.poll.records\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"message-demarcator\": {\n-                                \"description\": \"Since KafkaConsumer receives messages in batches, you have an option to output FlowFiles which contains all Kafka messages in a single batch for a given topic and partition and this property allows you to provide a string (interpreted as UTF-8) to use for demarcating apart multiple Kafka messages. This is an optional property and if not provided each Kafka message received will result in a single FlowFile which  time it is triggered. To enter special character such as 'new line' use CTRL+Enter or Shift+Enter depending on the OS\",\n-                                \"displayName\": \"Message Demarcator\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"message-demarcator\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"message-header-encoding\": {\n-                                \"defaultValue\": \"UTF-8\",\n-                                \"description\": \"Any message header that is found on a Kafka message will be added to the outbound FlowFile as an attribute. This property indicates the Character Encoding to use for deserializing the headers.\",\n-                                \"displayName\": \"Message Header Encoding\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"message-header-encoding\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"sasl.kerberos.keytab\": {\n-                                \"description\": \"Keytab credentials used for authentication with Kerberos\",\n-                                \"displayName\": \"Kerberos Keytab\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"sasl.kerberos.keytab\",\n-                                \"required\": false,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"SINGLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\"\n-                                    ]\n-                                },\n-                                \"sensitive\": false\n-                            },\n-                            \"sasl.kerberos.principal\": {\n-                                \"description\": \"Principal used for authentication with Kerberos\",\n-                                \"displayName\": \"Kerberos Principal\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"sasl.kerberos.principal\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"sasl.kerberos.service.name\": {\n-                                \"description\": \"The service name that matches the primary name of the Kafka server configured in the broker JAAS configuration\",\n-                                \"displayName\": \"Kerberos Service Name\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"sasl.kerberos.service.name\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"sasl.mechanism\": {\n-                                \"allowableValues\": [\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Africa/Bangui\",\n+                                        \"value\": \"Africa/Bangui\"\n+                                    },\n                                     {\n-                                        \"description\": \"General Security Services API for Kerberos authentication\",\n-                                        \"displayName\": \"GSSAPI\",\n-                                        \"value\": \"GSSAPI\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Africa/Banjul\",\n+                                        \"value\": \"Africa/Banjul\"\n                                     },\n                                     {\n-                                        \"description\": \"Plain username and password authentication\",\n-                                        \"displayName\": \"PLAIN\",\n-                                        \"value\": \"PLAIN\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Africa/Bissau\",\n+                                        \"value\": \"Africa/Bissau\"\n                                     },\n                                     {\n-                                        \"description\": \"Salted Challenge Response Authentication Mechanism using SHA-512 with username and password\",\n-                                        \"displayName\": \"SCRAM-SHA-256\",\n-                                        \"value\": \"SCRAM-SHA-256\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Africa/Blantyre\",\n+                                        \"value\": \"Africa/Blantyre\"\n                                     },\n                                     {\n-                                        \"description\": \"Salted Challenge Response Authentication Mechanism using SHA-256 with username and password\",\n-                                        \"displayName\": \"SCRAM-SHA-512\",\n-                                        \"value\": \"SCRAM-SHA-512\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"GSSAPI\",\n-                                \"description\": \"SASL mechanism used for authentication. Corresponds to Kafka Client sasl.mechanism property\",\n-                                \"displayName\": \"SASL Mechanism\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"sasl.mechanism\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"sasl.password\": {\n-                                \"dependencies\": [\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Africa/Brazzaville\",\n+                                        \"value\": \"Africa/Brazzaville\"\n+                                    },\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"PLAIN\",\n-                                            \"SCRAM-SHA-512\",\n-                                            \"SCRAM-SHA-256\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"SASL Mechanism\",\n-                                        \"propertyName\": \"sasl.mechanism\"\n-                                    }\n-                                ],\n-                                \"description\": \"Password provided with configured username when using PLAIN or SCRAM SASL Mechanisms\",\n-                                \"displayName\": \"Password\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"sasl.password\",\n-                                \"required\": false,\n-                                \"sensitive\": true\n-                            },\n-                            \"sasl.token.auth\": {\n-                                \"allowableValues\": [\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Africa/Bujumbura\",\n+                                        \"value\": \"Africa/Bujumbura\"\n+                                    },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"displayName\": \"Africa/Cairo\",\n+                                        \"value\": \"Africa/Cairo\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"false\",\n-                                \"dependencies\": [\n+                                        \"displayName\": \"Africa/Casablanca\",\n+                                        \"value\": \"Africa/Casablanca\"\n+                                    },\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"SCRAM-SHA-512\",\n-                                            \"SCRAM-SHA-256\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"SASL Mechanism\",\n-                                        \"propertyName\": \"sasl.mechanism\"\n-                                    }\n-                                ],\n-                                \"description\": \"Enables or disables Token authentication when using SCRAM SASL Mechanisms\",\n-                                \"displayName\": \"Token Authentication\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"sasl.token.auth\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"sasl.username\": {\n-                                \"dependencies\": [\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Africa/Ceuta\",\n+                                        \"value\": \"Africa/Ceuta\"\n+                                    },\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"PLAIN\",\n-                                            \"SCRAM-SHA-512\",\n-                                            \"SCRAM-SHA-256\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"SASL Mechanism\",\n-                                        \"propertyName\": \"sasl.mechanism\"\n-                                    }\n-                                ],\n-                                \"description\": \"Username provided with configured password when using PLAIN or SCRAM SASL Mechanisms\",\n-                                \"displayName\": \"Username\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"sasl.username\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"security.protocol\": {\n-                                \"allowableValues\": [\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Africa/Conakry\",\n+                                        \"value\": \"Africa/Conakry\"\n+                                    },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"PLAINTEXT\",\n-                                        \"value\": \"PLAINTEXT\"\n+                                        \"displayName\": \"Africa/Dakar\",\n+                                        \"value\": \"Africa/Dakar\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"SSL\",\n-                                        \"value\": \"SSL\"\n+                                        \"displayName\": \"Africa/Dar_es_Salaam\",\n+                                        \"value\": \"Africa/Dar_es_Salaam\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"SASL_PLAINTEXT\",\n-                                        \"value\": \"SASL_PLAINTEXT\"\n+                                        \"displayName\": \"Africa/Djibouti\",\n+                                        \"value\": \"Africa/Djibouti\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"SASL_SSL\",\n-                                        \"value\": \"SASL_SSL\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"PLAINTEXT\",\n-                                \"description\": \"Security protocol used to communicate with brokers. Corresponds to Kafka Client security.protocol property\",\n-                                \"displayName\": \"Security Protocol\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"security.protocol\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"separate-by-key\": {\n-                                \"allowableValues\": [\n+                                        \"displayName\": \"Africa/Douala\",\n+                                        \"value\": \"Africa/Douala\"\n+                                    },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"displayName\": \"Africa/El_Aaiun\",\n+                                        \"value\": \"Africa/El_Aaiun\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"If true, and the <Message Demarcator> property is set, two messages will only be added to the same FlowFile if both of the Kafka Messages have identical keys.\",\n-                                \"displayName\": \"Separate By Key\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"separate-by-key\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"ssl.context.service\": {\n-                                \"description\": \"Service supporting SSL communication with Kafka brokers\",\n-                                \"displayName\": \"SSL Context Service\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"ssl.context.service\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            },\n-                            \"topic\": {\n-                                \"description\": \"The name of the Kafka Topic(s) to pull from. More than one can be supplied if comma separated.\",\n-                                \"displayName\": \"Topic Name(s)\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"topic\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"topic_type\": {\n-                                \"allowableValues\": [\n+                                        \"displayName\": \"Africa/Freetown\",\n+                                        \"value\": \"Africa/Freetown\"\n+                                    },\n                                     {\n-                                        \"description\": \"Topic is a full topic name or comma separated list of names\",\n-                                        \"displayName\": \"names\",\n-                                        \"value\": \"names\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Africa/Gaborone\",\n+                                        \"value\": \"Africa/Gaborone\"\n                                     },\n                                     {\n-                                        \"description\": \"Topic is a regex using the Java Pattern syntax\",\n-                                        \"displayName\": \"pattern\",\n-                                        \"value\": \"pattern\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"names\",\n-                                \"description\": \"Specifies whether the Topic(s) provided are a comma separated list of names or a single regular expression\",\n-                                \"displayName\": \"Topic Name Format\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"topic_type\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            }\n-                        },\n-                        \"sideEffectFree\": false,\n-                        \"supportedRelationships\": [\n-                            {\n-                                \"description\": \"FlowFiles received from Kafka. Depending on demarcation strategy it is a flow file per message or a bundle of messages grouped by topic and partition.\",\n-                                \"name\": \"success\"\n-                            }\n-                        ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": false,\n-                        \"supportsDynamicProperties\": true,\n-                        \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": false,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"2.0\",\n-                            \"Consume\",\n-                            \"Get\",\n-                            \"Ingest\",\n-                            \"Ingress\",\n-                            \"Kafka\",\n-                            \"PubSub\",\n-                            \"Topic\"\n-                        ],\n-                        \"triggerSerially\": false,\n-                        \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.kafka.pubsub.ConsumeKafka_2_0\",\n-                        \"typeDescription\": \"Consumes messages from Apache Kafka specifically built against the Kafka 2.0 Consumer API. The complementary NiFi processor for sending messages is PublishKafka_2_0.\",\n-                        \"version\": \"1.27.0\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"The number of messages written if more than one\",\n-                                \"name\": \"kafka.count\"\n-                            },\n-                            {\n-                                \"description\": \"The key of message if present and if single message. How the key is encoded depends on the value of the 'Key Attribute Encoding' property.\",\n-                                \"name\": \"kafka.key\"\n-                            },\n-                            {\n-                                \"description\": \"The offset of the message in the partition of the topic.\",\n-                                \"name\": \"kafka.offset\"\n-                            },\n-                            {\n-                                \"description\": \"The timestamp of the message in the partition of the topic.\",\n-                                \"name\": \"kafka.timestamp\"\n-                            },\n-                            {\n-                                \"description\": \"The partition of the topic the message or message bundle is from\",\n-                                \"name\": \"kafka.partition\"\n-                            },\n-                            {\n-                                \"description\": \"The topic the message or message bundle is from\",\n-                                \"name\": \"kafka.topic\"\n-                            }\n-                        ]\n-                    },\n-                    {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-kafka-2-0-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"e0c4461\"\n-                        },\n-                        \"defaultBulletinLevel\": \"WARN\",\n-                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": 1,\n-                            \"TIMER_DRIVEN\": 1\n-                        },\n-                        \"defaultPenaltyDuration\": \"30 sec\",\n-                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"0 sec\"\n-                        },\n-                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n-                        \"defaultYieldDuration\": \"1 sec\",\n-                        \"deprecated\": true,\n-                        \"deprecationAlternatives\": [\n-                            \"org.apache.nifi.processors.kafka.pubsub.PublishKafkaRecord_2_6\"\n-                        ],\n-                        \"deprecationReason\": \"\",\n-                        \"dynamicProperties\": [\n-                            {\n-                                \"description\": \"These properties will be added on the Kafka configuration after loading any provided configuration properties. In the event a dynamic property represents a property that was already set, its value will be ignored and WARN message logged. For the list of available Kafka properties please refer to: http://kafka.apache.org/documentation.html#configuration. \",\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"name\": \"The name of a Kafka configuration property.\",\n-                                \"value\": \"The value of a given Kafka configuration property.\"\n-                            }\n-                        ],\n-                        \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_REQUIRED\",\n-                        \"primaryNodeOnly\": false,\n-                        \"propertyDescriptors\": {\n-                            \"Failure Strategy\": {\n-                                \"allowableValues\": [\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Africa/Harare\",\n+                                        \"value\": \"Africa/Harare\"\n+                                    },\n                                     {\n-                                        \"description\": \"When unable to publish records to Kafka, the FlowFile will be routed to the failure relationship.\",\n-                                        \"displayName\": \"Route to Failure\",\n-                                        \"value\": \"Route to Failure\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Africa/Johannesburg\",\n+                                        \"value\": \"Africa/Johannesburg\"\n                                     },\n                                     {\n-                                        \"description\": \"When unable to publish records to Kafka, the FlowFile will be placed back on the queue so that it will be retried. For flows where FlowFile ordering is important, this strategy can be used along with ensuring that the each processor uses only a single Concurrent Task.\",\n-                                        \"displayName\": \"Rollback\",\n-                                        \"value\": \"Rollback\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"Route to Failure\",\n-                                \"description\": \"Specifies how the processor handles a FlowFile if it is unable to publish the data to Kafka\",\n-                                \"displayName\": \"Failure Strategy\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Failure Strategy\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"ack.wait.time\": {\n-                                \"defaultValue\": \"5 secs\",\n-                                \"description\": \"After sending a message to Kafka, this indicates the amount of time that we are willing to wait for a response from Kafka. If Kafka does not acknowledge the message within this time period, the FlowFile will be routed to 'failure'.\",\n-                                \"displayName\": \"Acknowledgment Wait Time\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"ack.wait.time\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"acks\": {\n-                                \"allowableValues\": [\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Africa/Juba\",\n+                                        \"value\": \"Africa/Juba\"\n+                                    },\n                                     {\n-                                        \"description\": \"FlowFile will be routed to success after successfully sending the content to a Kafka node, without waiting for any acknowledgment from the node at all. This provides the best performance but may result in data loss.\",\n-                                        \"displayName\": \"Best Effort\",\n-                                        \"value\": \"0\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Africa/Kampala\",\n+                                        \"value\": \"Africa/Kampala\"\n                                     },\n                                     {\n-                                        \"description\": \"FlowFile will be routed to success if the message is received by a single Kafka node, whether or not it is replicated. This is faster than <Guarantee Replicated Delivery> but can result in data loss if a Kafka node crashes\",\n-                                        \"displayName\": \"Guarantee Single Node Delivery\",\n-                                        \"value\": \"1\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Africa/Khartoum\",\n+                                        \"value\": \"Africa/Khartoum\"\n                                     },\n                                     {\n-                                        \"description\": \"FlowFile will be routed to failure unless the message is replicated to the appropriate number of Kafka Nodes according to the Topic configuration\",\n-                                        \"displayName\": \"Guarantee Replicated Delivery\",\n-                                        \"value\": \"all\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"all\",\n-                                \"description\": \"Specifies the requirement for guaranteeing that a message is sent to Kafka. Corresponds to Kafka's 'acks' property.\",\n-                                \"displayName\": \"Delivery Guarantee\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"acks\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"attribute-name-regex\": {\n-                                \"description\": \"A Regular Expression that is matched against all FlowFile attribute names. Any attribute whose name matches the regex will be added to the Kafka messages as a Header. If not specified, no FlowFile attributes will be added as headers.\",\n-                                \"displayName\": \"Attributes to Send as Headers (Regex)\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"attribute-name-regex\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"aws.profile.name\": {\n-                                \"dependencies\": [\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Africa/Kigali\",\n+                                        \"value\": \"Africa/Kigali\"\n+                                    },\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"AWS_MSK_IAM\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"SASL Mechanism\",\n-                                        \"propertyName\": \"sasl.mechanism\"\n-                                    }\n-                                ],\n-                                \"description\": \"The Amazon Web Services Profile to select when multiple profiles are available.\",\n-                                \"displayName\": \"AWS Profile Name\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"aws.profile.name\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"bootstrap.servers\": {\n-                                \"defaultValue\": \"localhost:9092\",\n-                                \"description\": \"Comma-separated list of Kafka Brokers in the format host:port\",\n-                                \"displayName\": \"Kafka Brokers\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"bootstrap.servers\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"compression.type\": {\n-                                \"allowableValues\": [\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Africa/Kinshasa\",\n+                                        \"value\": \"Africa/Kinshasa\"\n+                                    },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"none\",\n-                                        \"value\": \"none\"\n+                                        \"displayName\": \"Africa/Lagos\",\n+                                        \"value\": \"Africa/Lagos\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"gzip\",\n-                                        \"value\": \"gzip\"\n+                                        \"displayName\": \"Africa/Libreville\",\n+                                        \"value\": \"Africa/Libreville\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"snappy\",\n-                                        \"value\": \"snappy\"\n+                                        \"displayName\": \"Africa/Lome\",\n+                                        \"value\": \"Africa/Lome\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"lz4\",\n-                                        \"value\": \"lz4\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"none\",\n-                                \"description\": \"This parameter allows you to specify the compression codec for all data generated by this producer.\",\n-                                \"displayName\": \"Compression Type\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"compression.type\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"kerberos-credentials-service\": {\n-                                \"description\": \"Service supporting generalized credentials authentication with Kerberos\",\n-                                \"displayName\": \"Kerberos Credentials Service\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"kerberos-credentials-service\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.kerberos.KerberosCredentialsService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            },\n-                            \"max.block.ms\": {\n-                                \"defaultValue\": \"5 sec\",\n-                                \"description\": \"The amount of time publisher will wait to obtain metadata or wait for the buffer to flush during the 'send' call before failing the entire 'send' call. Corresponds to Kafka's 'max.block.ms' property\",\n-                                \"displayName\": \"Max Metadata Wait Time\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"max.block.ms\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"max.request.size\": {\n-                                \"defaultValue\": \"1 MB\",\n-                                \"description\": \"The maximum size of a request in bytes. Corresponds to Kafka's 'max.request.size' property and defaults to 1 MB (1048576).\",\n-                                \"displayName\": \"Max Request Size\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"max.request.size\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"message-header-encoding\": {\n-                                \"defaultValue\": \"UTF-8\",\n-                                \"description\": \"For any attribute that is added as a message header, as configured via the <Attributes to Send as Headers> property, this property indicates the Character Encoding to use for serializing the headers.\",\n-                                \"displayName\": \"Message Header Encoding\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"message-header-encoding\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"message-key-field\": {\n-                                \"description\": \"The name of a field in the Input Records that should be used as the Key for the Kafka message.\",\n-                                \"displayName\": \"Message Key Field\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"message-key-field\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"partition\": {\n-                                \"description\": \"Specifies which Partition Records will go to. How this value is interpreted is dictated by the <Partitioner class> property.\",\n-                                \"displayName\": \"Partition\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"partition\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"partitioner.class\": {\n-                                \"allowableValues\": [\n+                                        \"displayName\": \"Africa/Luanda\",\n+                                        \"value\": \"Africa/Luanda\"\n+                                    },\n                                     {\n-                                        \"description\": \"Messages will be assigned partitions in a round-robin fashion, sending the first message to Partition 1, the next Partition to Partition 2, and so on, wrapping as necessary.\",\n-                                        \"displayName\": \"RoundRobinPartitioner\",\n-                                        \"value\": \"org.apache.nifi.processors.kafka.pubsub.Partitioners$RoundRobinPartitioner\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Africa/Lubumbashi\",\n+                                        \"value\": \"Africa/Lubumbashi\"\n                                     },\n                                     {\n-                                        \"description\": \"Messages will be assigned to random partitions.\",\n-                                        \"displayName\": \"DefaultPartitioner\",\n-                                        \"value\": \"org.apache.kafka.clients.producer.internals.DefaultPartitioner\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Africa/Lusaka\",\n+                                        \"value\": \"Africa/Lusaka\"\n                                     },\n                                     {\n-                                        \"description\": \"Interprets the <Partition> property as a RecordPath that will be evaluated against each Record to determine which partition the Record will go to. All Records that have the same value for the given RecordPath will go to the same Partition.\",\n-                                        \"displayName\": \"RecordPath Partitioner\",\n-                                        \"value\": \"org.apache.nifi.processors.kafka.pubsub.Partitioners$RecordPathPartitioner\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Africa/Malabo\",\n+                                        \"value\": \"Africa/Malabo\"\n                                     },\n                                     {\n-                                        \"description\": \"Interprets the <Partition> property as Expression Language that will be evaluated against each FlowFile. This Expression will be evaluated once against the FlowFile, so all Records in a given FlowFile will go to the same partition.\",\n-                                        \"displayName\": \"Expression Language Partitioner\",\n-                                        \"value\": \"org.apache.nifi.processors.kafka.pubsub.Partitioners$ExpressionLanguagePartitioner\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"org.apache.kafka.clients.producer.internals.DefaultPartitioner\",\n-                                \"description\": \"Specifies which class to use to compute a partition id for a message. Corresponds to Kafka's 'partitioner.class' property.\",\n-                                \"displayName\": \"Partitioner class\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"partitioner.class\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"record-reader\": {\n-                                \"description\": \"The Record Reader to use for incoming FlowFiles\",\n-                                \"displayName\": \"Record Reader\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"record-reader\",\n-                                \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            },\n-                            \"record-writer\": {\n-                                \"description\": \"The Record Writer to use in order to serialize the data before sending to Kafka\",\n-                                \"displayName\": \"Record Writer\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"record-writer\",\n-                                \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            },\n-                            \"sasl.kerberos.keytab\": {\n-                                \"description\": \"Keytab credentials used for authentication with Kerberos\",\n-                                \"displayName\": \"Kerberos Keytab\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"sasl.kerberos.keytab\",\n-                                \"required\": false,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"SINGLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\"\n-                                    ]\n-                                },\n-                                \"sensitive\": false\n-                            },\n-                            \"sasl.kerberos.principal\": {\n-                                \"description\": \"Principal used for authentication with Kerberos\",\n-                                \"displayName\": \"Kerberos Principal\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"sasl.kerberos.principal\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"sasl.kerberos.service.name\": {\n-                                \"description\": \"The service name that matches the primary name of the Kafka server configured in the broker JAAS configuration\",\n-                                \"displayName\": \"Kerberos Service Name\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"sasl.kerberos.service.name\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"sasl.mechanism\": {\n-                                \"allowableValues\": [\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Africa/Maputo\",\n+                                        \"value\": \"Africa/Maputo\"\n+                                    },\n                                     {\n-                                        \"description\": \"General Security Services API for Kerberos authentication\",\n-                                        \"displayName\": \"GSSAPI\",\n-                                        \"value\": \"GSSAPI\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Africa/Maseru\",\n+                                        \"value\": \"Africa/Maseru\"\n                                     },\n                                     {\n-                                        \"description\": \"Plain username and password authentication\",\n-                                        \"displayName\": \"PLAIN\",\n-                                        \"value\": \"PLAIN\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Africa/Mbabane\",\n+                                        \"value\": \"Africa/Mbabane\"\n                                     },\n                                     {\n-                                        \"description\": \"Salted Challenge Response Authentication Mechanism using SHA-512 with username and password\",\n-                                        \"displayName\": \"SCRAM-SHA-256\",\n-                                        \"value\": \"SCRAM-SHA-256\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Africa/Mogadishu\",\n+                                        \"value\": \"Africa/Mogadishu\"\n                                     },\n                                     {\n-                                        \"description\": \"Salted Challenge Response Authentication Mechanism using SHA-256 with username and password\",\n-                                        \"displayName\": \"SCRAM-SHA-512\",\n-                                        \"value\": \"SCRAM-SHA-512\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"GSSAPI\",\n-                                \"description\": \"SASL mechanism used for authentication. Corresponds to Kafka Client sasl.mechanism property\",\n-                                \"displayName\": \"SASL Mechanism\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"sasl.mechanism\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"sasl.password\": {\n-                                \"dependencies\": [\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Africa/Monrovia\",\n+                                        \"value\": \"Africa/Monrovia\"\n+                                    },\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"PLAIN\",\n-                                            \"SCRAM-SHA-512\",\n-                                            \"SCRAM-SHA-256\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"SASL Mechanism\",\n-                                        \"propertyName\": \"sasl.mechanism\"\n-                                    }\n-                                ],\n-                                \"description\": \"Password provided with configured username when using PLAIN or SCRAM SASL Mechanisms\",\n-                                \"displayName\": \"Password\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"sasl.password\",\n-                                \"required\": false,\n-                                \"sensitive\": true\n-                            },\n-                            \"sasl.token.auth\": {\n-                                \"allowableValues\": [\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Africa/Nairobi\",\n+                                        \"value\": \"Africa/Nairobi\"\n+                                    },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"displayName\": \"Africa/Ndjamena\",\n+                                        \"value\": \"Africa/Ndjamena\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"false\",\n-                                \"dependencies\": [\n+                                        \"displayName\": \"Africa/Niamey\",\n+                                        \"value\": \"Africa/Niamey\"\n+                                    },\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"SCRAM-SHA-512\",\n-                                            \"SCRAM-SHA-256\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"SASL Mechanism\",\n-                                        \"propertyName\": \"sasl.mechanism\"\n-                                    }\n-                                ],\n-                                \"description\": \"Enables or disables Token authentication when using SCRAM SASL Mechanisms\",\n-                                \"displayName\": \"Token Authentication\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"sasl.token.auth\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"sasl.username\": {\n-                                \"dependencies\": [\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Africa/Nouakchott\",\n+                                        \"value\": \"Africa/Nouakchott\"\n+                                    },\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"PLAIN\",\n-                                            \"SCRAM-SHA-512\",\n-                                            \"SCRAM-SHA-256\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"SASL Mechanism\",\n-                                        \"propertyName\": \"sasl.mechanism\"\n-                                    }\n-                                ],\n-                                \"description\": \"Username provided with configured password when using PLAIN or SCRAM SASL Mechanisms\",\n-                                \"displayName\": \"Username\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"sasl.username\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"security.protocol\": {\n-                                \"allowableValues\": [\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Africa/Ouagadougou\",\n+                                        \"value\": \"Africa/Ouagadougou\"\n+                                    },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"PLAINTEXT\",\n-                                        \"value\": \"PLAINTEXT\"\n+                                        \"displayName\": \"Africa/Porto-Novo\",\n+                                        \"value\": \"Africa/Porto-Novo\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"SSL\",\n-                                        \"value\": \"SSL\"\n+                                        \"displayName\": \"Africa/Sao_Tome\",\n+                                        \"value\": \"Africa/Sao_Tome\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"SASL_PLAINTEXT\",\n-                                        \"value\": \"SASL_PLAINTEXT\"\n+                                        \"displayName\": \"Africa/Timbuktu\",\n+                                        \"value\": \"Africa/Timbuktu\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"SASL_SSL\",\n-                                        \"value\": \"SASL_SSL\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"PLAINTEXT\",\n-                                \"description\": \"Security protocol used to communicate with brokers. Corresponds to Kafka Client security.protocol property\",\n-                                \"displayName\": \"Security Protocol\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"security.protocol\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"ssl.context.service\": {\n-                                \"description\": \"Service supporting SSL communication with Kafka brokers\",\n-                                \"displayName\": \"SSL Context Service\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"ssl.context.service\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            },\n-                            \"topic\": {\n-                                \"description\": \"The name of the Kafka Topic to publish to.\",\n-                                \"displayName\": \"Topic Name\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"topic\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"transactional-id-prefix\": {\n-                                \"description\": \"When Use Transaction is set to true, KafkaProducer config 'transactional.id' will be a generated UUID and will be prefixed with this string.\",\n-                                \"displayName\": \"Transactional Id Prefix\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"transactional-id-prefix\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"use-transactions\": {\n-                                \"allowableValues\": [\n+                                        \"displayName\": \"Africa/Tripoli\",\n+                                        \"value\": \"Africa/Tripoli\"\n+                                    },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"displayName\": \"Africa/Tunis\",\n+                                        \"value\": \"Africa/Tunis\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"true\",\n-                                \"description\": \"Specifies whether or not NiFi should provide Transactional guarantees when communicating with Kafka. If there is a problem sending data to Kafka, and this property is set to false, then the messages that have already been sent to Kafka will continue on and be delivered to consumers. If this is set to true, then the Kafka transaction will be rolled back so that those messages are not available to consumers. Setting this to true requires that the <Delivery Guarantee> property be set to \\\"Guarantee Replicated Delivery.\\\"\",\n-                                \"displayName\": \"Use Transactions\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"use-transactions\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            }\n-                        },\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.processors.kafka.pubsub.ConsumeKafkaRecord_2_0\",\n-                            \"org.apache.nifi.processors.kafka.pubsub.ConsumeKafka_2_0\",\n-                            \"org.apache.nifi.processors.kafka.pubsub.PublishKafka_2_0\"\n-                        ],\n-                        \"sideEffectFree\": false,\n-                        \"supportedRelationships\": [\n-                            {\n-                                \"description\": \"FlowFiles for which all content was sent to Kafka.\",\n-                                \"name\": \"success\"\n-                            },\n-                            {\n-                                \"description\": \"Any FlowFile that cannot be sent to Kafka will be routed to this Relationship\",\n-                                \"name\": \"failure\"\n-                            }\n-                        ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": false,\n-                        \"supportsDynamicProperties\": true,\n-                        \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": false,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"2.0\",\n-                            \"Apache\",\n-                            \"Kafka\",\n-                            \"Message\",\n-                            \"PubSub\",\n-                            \"Put\",\n-                            \"Record\",\n-                            \"Send\",\n-                            \"avro\",\n-                            \"csv\",\n-                            \"json\",\n-                            \"logs\"\n-                        ],\n-                        \"triggerSerially\": false,\n-                        \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.kafka.pubsub.PublishKafkaRecord_2_0\",\n-                        \"typeDescription\": \"Sends the contents of a FlowFile as individual records to Apache Kafka using the Kafka 2.0 Producer API. The contents of the FlowFile are expected to be record-oriented data that can be read by the configured Record Reader. The complementary NiFi processor for fetching messages is ConsumeKafkaRecord_2_0.\",\n-                        \"version\": \"1.27.0\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"The number of messages that were sent to Kafka for this FlowFile. This attribute is added only to FlowFiles that are routed to success.\",\n-                                \"name\": \"msg.count\"\n-                            }\n-                        ]\n-                    },\n-                    {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-kafka-2-0-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"e0c4461\"\n-                        },\n-                        \"defaultBulletinLevel\": \"WARN\",\n-                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": 1,\n-                            \"TIMER_DRIVEN\": 1\n-                        },\n-                        \"defaultPenaltyDuration\": \"30 sec\",\n-                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"0 sec\"\n-                        },\n-                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n-                        \"defaultYieldDuration\": \"1 sec\",\n-                        \"deprecated\": true,\n-                        \"deprecationAlternatives\": [\n-                            \"org.apache.nifi.processors.kafka.pubsub.PublishKafka_2_6\"\n-                        ],\n-                        \"deprecationReason\": \"\",\n-                        \"dynamicProperties\": [\n-                            {\n-                                \"description\": \"These properties will be added on the Kafka configuration after loading any provided configuration properties. In the event a dynamic property represents a property that was already set, its value will be ignored and WARN message logged. For the list of available Kafka properties please refer to: http://kafka.apache.org/documentation.html#configuration. \",\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"name\": \"The name of a Kafka configuration property.\",\n-                                \"value\": \"The value of a given Kafka configuration property.\"\n-                            }\n-                        ],\n-                        \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_REQUIRED\",\n-                        \"primaryNodeOnly\": false,\n-                        \"propertyDescriptors\": {\n-                            \"Failure Strategy\": {\n-                                \"allowableValues\": [\n+                                        \"displayName\": \"Africa/Windhoek\",\n+                                        \"value\": \"Africa/Windhoek\"\n+                                    },\n                                     {\n-                                        \"description\": \"When unable to publish records to Kafka, the FlowFile will be routed to the failure relationship.\",\n-                                        \"displayName\": \"Route to Failure\",\n-                                        \"value\": \"Route to Failure\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"America/Adak\",\n+                                        \"value\": \"America/Adak\"\n                                     },\n                                     {\n-                                        \"description\": \"When unable to publish records to Kafka, the FlowFile will be placed back on the queue so that it will be retried. For flows where FlowFile ordering is important, this strategy can be used along with ensuring that the each processor uses only a single Concurrent Task.\",\n-                                        \"displayName\": \"Rollback\",\n-                                        \"value\": \"Rollback\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"Route to Failure\",\n-                                \"description\": \"Specifies how the processor handles a FlowFile if it is unable to publish the data to Kafka\",\n-                                \"displayName\": \"Failure Strategy\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Failure Strategy\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"ack.wait.time\": {\n-                                \"defaultValue\": \"5 secs\",\n-                                \"description\": \"After sending a message to Kafka, this indicates the amount of time that we are willing to wait for a response from Kafka. If Kafka does not acknowledge the message within this time period, the FlowFile will be routed to 'failure'.\",\n-                                \"displayName\": \"Acknowledgment Wait Time\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"ack.wait.time\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"acks\": {\n-                                \"allowableValues\": [\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"America/Anchorage\",\n+                                        \"value\": \"America/Anchorage\"\n+                                    },\n                                     {\n-                                        \"description\": \"FlowFile will be routed to success after successfully sending the content to a Kafka node, without waiting for any acknowledgment from the node at all. This provides the best performance but may result in data loss.\",\n-                                        \"displayName\": \"Best Effort\",\n-                                        \"value\": \"0\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"America/Anguilla\",\n+                                        \"value\": \"America/Anguilla\"\n                                     },\n                                     {\n-                                        \"description\": \"FlowFile will be routed to success if the message is received by a single Kafka node, whether or not it is replicated. This is faster than <Guarantee Replicated Delivery> but can result in data loss if a Kafka node crashes\",\n-                                        \"displayName\": \"Guarantee Single Node Delivery\",\n-                                        \"value\": \"1\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"America/Antigua\",\n+                                        \"value\": \"America/Antigua\"\n                                     },\n                                     {\n-                                        \"description\": \"FlowFile will be routed to failure unless the message is replicated to the appropriate number of Kafka Nodes according to the Topic configuration\",\n-                                        \"displayName\": \"Guarantee Replicated Delivery\",\n-                                        \"value\": \"all\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"all\",\n-                                \"description\": \"Specifies the requirement for guaranteeing that a message is sent to Kafka. Corresponds to Kafka's 'acks' property.\",\n-                                \"displayName\": \"Delivery Guarantee\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"acks\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"attribute-name-regex\": {\n-                                \"description\": \"A Regular Expression that is matched against all FlowFile attribute names. Any attribute whose name matches the regex will be added to the Kafka messages as a Header. If not specified, no FlowFile attributes will be added as headers.\",\n-                                \"displayName\": \"Attributes to Send as Headers (Regex)\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"attribute-name-regex\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"aws.profile.name\": {\n-                                \"dependencies\": [\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"America/Araguaina\",\n+                                        \"value\": \"America/Araguaina\"\n+                                    },\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"AWS_MSK_IAM\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"SASL Mechanism\",\n-                                        \"propertyName\": \"sasl.mechanism\"\n-                                    }\n-                                ],\n-                                \"description\": \"The Amazon Web Services Profile to select when multiple profiles are available.\",\n-                                \"displayName\": \"AWS Profile Name\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"aws.profile.name\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"bootstrap.servers\": {\n-                                \"defaultValue\": \"localhost:9092\",\n-                                \"description\": \"Comma-separated list of Kafka Brokers in the format host:port\",\n-                                \"displayName\": \"Kafka Brokers\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"bootstrap.servers\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"compression.type\": {\n-                                \"allowableValues\": [\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"America/Argentina/Buenos_Aires\",\n+                                        \"value\": \"America/Argentina/Buenos_Aires\"\n+                                    },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"none\",\n-                                        \"value\": \"none\"\n+                                        \"displayName\": \"America/Argentina/Catamarca\",\n+                                        \"value\": \"America/Argentina/Catamarca\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"gzip\",\n-                                        \"value\": \"gzip\"\n+                                        \"displayName\": \"America/Argentina/ComodRivadavia\",\n+                                        \"value\": \"America/Argentina/ComodRivadavia\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"snappy\",\n-                                        \"value\": \"snappy\"\n+                                        \"displayName\": \"America/Argentina/Cordoba\",\n+                                        \"value\": \"America/Argentina/Cordoba\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"lz4\",\n-                                        \"value\": \"lz4\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"none\",\n-                                \"description\": \"This parameter allows you to specify the compression codec for all data generated by this producer.\",\n-                                \"displayName\": \"Compression Type\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"compression.type\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"kafka-key\": {\n-                                \"description\": \"The Key to use for the Message. If not specified, the flow file attribute 'kafka.key' is used as the message key, if it is present.Beware that setting Kafka key and demarcating at the same time may potentially lead to many Kafka messages with the same key.Normally this is not a problem as Kafka does not enforce or assume message and key uniqueness. Still, setting the demarcator and Kafka key at the same time poses a risk of data loss on Kafka. During a topic compaction on Kafka, messages will be deduplicated based on this key.\",\n-                                \"displayName\": \"Kafka Key\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"kafka-key\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"kerberos-credentials-service\": {\n-                                \"description\": \"Service supporting generalized credentials authentication with Kerberos\",\n-                                \"displayName\": \"Kerberos Credentials Service\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"kerberos-credentials-service\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.kerberos.KerberosCredentialsService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            },\n-                            \"key-attribute-encoding\": {\n-                                \"allowableValues\": [\n+                                        \"displayName\": \"America/Argentina/Jujuy\",\n+                                        \"value\": \"America/Argentina/Jujuy\"\n+                                    },\n                                     {\n-                                        \"description\": \"The key is interpreted as a UTF-8 Encoded string.\",\n-                                        \"displayName\": \"UTF-8 Encoded\",\n-                                        \"value\": \"utf-8\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"America/Argentina/La_Rioja\",\n+                                        \"value\": \"America/Argentina/La_Rioja\"\n                                     },\n                                     {\n-                                        \"description\": \"The key is interpreted as arbitrary binary data and is encoded using hexadecimal characters with uppercase letters\",\n-                                        \"displayName\": \"Hex Encoded\",\n-                                        \"value\": \"hex\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"America/Argentina/Mendoza\",\n+                                        \"value\": \"America/Argentina/Mendoza\"\n                                     },\n                                     {\n-                                        \"description\": \"The key will not be added as an Attribute\",\n-                                        \"displayName\": \"Do Not Add Key as Attribute\",\n-                                        \"value\": \"do-not-add\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"utf-8\",\n-                                \"description\": \"FlowFiles that are emitted have an attribute named 'kafka.key'. This property dictates how the value of the attribute should be encoded.\",\n-                                \"displayName\": \"Key Attribute Encoding\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"key-attribute-encoding\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"max.block.ms\": {\n-                                \"defaultValue\": \"5 sec\",\n-                                \"description\": \"The amount of time publisher will wait to obtain metadata or wait for the buffer to flush during the 'send' call before failing the entire 'send' call. Corresponds to Kafka's 'max.block.ms' property\",\n-                                \"displayName\": \"Max Metadata Wait Time\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"max.block.ms\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"max.request.size\": {\n-                                \"defaultValue\": \"1 MB\",\n-                                \"description\": \"The maximum size of a request in bytes. Corresponds to Kafka's 'max.request.size' property and defaults to 1 MB (1048576).\",\n-                                \"displayName\": \"Max Request Size\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"max.request.size\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"message-demarcator\": {\n-                                \"description\": \"Specifies the string (interpreted as UTF-8) to use for demarcating multiple messages within a single FlowFile. If not specified, the entire content of the FlowFile will be used as a single message. If specified, the contents of the FlowFile will be split on this delimiter and each section sent as a separate Kafka message. To enter special character such as 'new line' use CTRL+Enter or Shift+Enter, depending on your OS.\",\n-                                \"displayName\": \"Message Demarcator\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"message-demarcator\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"message-header-encoding\": {\n-                                \"defaultValue\": \"UTF-8\",\n-                                \"description\": \"For any attribute that is added as a message header, as configured via the <Attributes to Send as Headers> property, this property indicates the Character Encoding to use for serializing the headers.\",\n-                                \"displayName\": \"Message Header Encoding\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"message-header-encoding\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"partition\": {\n-                                \"description\": \"Specifies which Partition Records will go to.\",\n-                                \"displayName\": \"Partition\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"partition\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"partitioner.class\": {\n-                                \"allowableValues\": [\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"America/Argentina/Rio_Gallegos\",\n+                                        \"value\": \"America/Argentina/Rio_Gallegos\"\n+                                    },\n                                     {\n-                                        \"description\": \"Messages will be assigned partitions in a round-robin fashion, sending the first message to Partition 1, the next Partition to Partition 2, and so on, wrapping as necessary.\",\n-                                        \"displayName\": \"RoundRobinPartitioner\",\n-                                        \"value\": \"org.apache.nifi.processors.kafka.pubsub.Partitioners$RoundRobinPartitioner\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"America/Argentina/Salta\",\n+                                        \"value\": \"America/Argentina/Salta\"\n                                     },\n                                     {\n-                                        \"description\": \"Messages will be assigned to random partitions.\",\n-                                        \"displayName\": \"DefaultPartitioner\",\n-                                        \"value\": \"org.apache.kafka.clients.producer.internals.DefaultPartitioner\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"America/Argentina/San_Juan\",\n+                                        \"value\": \"America/Argentina/San_Juan\"\n                                     },\n                                     {\n-                                        \"description\": \"Interprets the <Partition> property as Expression Language that will be evaluated against each FlowFile. This Expression will be evaluated once against the FlowFile, so all Records in a given FlowFile will go to the same partition.\",\n-                                        \"displayName\": \"Expression Language Partitioner\",\n-                                        \"value\": \"org.apache.nifi.processors.kafka.pubsub.Partitioners$ExpressionLanguagePartitioner\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"org.apache.kafka.clients.producer.internals.DefaultPartitioner\",\n-                                \"description\": \"Specifies which class to use to compute a partition id for a message. Corresponds to Kafka's 'partitioner.class' property.\",\n-                                \"displayName\": \"Partitioner class\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"partitioner.class\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"sasl.kerberos.keytab\": {\n-                                \"description\": \"Keytab credentials used for authentication with Kerberos\",\n-                                \"displayName\": \"Kerberos Keytab\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"sasl.kerberos.keytab\",\n-                                \"required\": false,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"SINGLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\"\n-                                    ]\n-                                },\n-                                \"sensitive\": false\n-                            },\n-                            \"sasl.kerberos.principal\": {\n-                                \"description\": \"Principal used for authentication with Kerberos\",\n-                                \"displayName\": \"Kerberos Principal\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"sasl.kerberos.principal\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"sasl.kerberos.service.name\": {\n-                                \"description\": \"The service name that matches the primary name of the Kafka server configured in the broker JAAS configuration\",\n-                                \"displayName\": \"Kerberos Service Name\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"sasl.kerberos.service.name\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"sasl.mechanism\": {\n-                                \"allowableValues\": [\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"America/Argentina/San_Luis\",\n+                                        \"value\": \"America/Argentina/San_Luis\"\n+                                    },\n                                     {\n-                                        \"description\": \"General Security Services API for Kerberos authentication\",\n-                                        \"displayName\": \"GSSAPI\",\n-                                        \"value\": \"GSSAPI\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"America/Argentina/Tucuman\",\n+                                        \"value\": \"America/Argentina/Tucuman\"\n                                     },\n                                     {\n-                                        \"description\": \"Plain username and password authentication\",\n-                                        \"displayName\": \"PLAIN\",\n-                                        \"value\": \"PLAIN\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"America/Argentina/Ushuaia\",\n+                                        \"value\": \"America/Argentina/Ushuaia\"\n                                     },\n                                     {\n-                                        \"description\": \"Salted Challenge Response Authentication Mechanism using SHA-512 with username and password\",\n-                                        \"displayName\": \"SCRAM-SHA-256\",\n-                                        \"value\": \"SCRAM-SHA-256\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"America/Aruba\",\n+                                        \"value\": \"America/Aruba\"\n                                     },\n                                     {\n-                                        \"description\": \"Salted Challenge Response Authentication Mechanism using SHA-256 with username and password\",\n-                                        \"displayName\": \"SCRAM-SHA-512\",\n-                                        \"value\": \"SCRAM-SHA-512\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"GSSAPI\",\n-                                \"description\": \"SASL mechanism used for authentication. Corresponds to Kafka Client sasl.mechanism property\",\n-                                \"displayName\": \"SASL Mechanism\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"sasl.mechanism\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"sasl.password\": {\n-                                \"dependencies\": [\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"America/Asuncion\",\n+                                        \"value\": \"America/Asuncion\"\n+                                    },\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"PLAIN\",\n-                                            \"SCRAM-SHA-512\",\n-                                            \"SCRAM-SHA-256\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"SASL Mechanism\",\n-                                        \"propertyName\": \"sasl.mechanism\"\n-                                    }\n-                                ],\n-                                \"description\": \"Password provided with configured username when using PLAIN or SCRAM SASL Mechanisms\",\n-                                \"displayName\": \"Password\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"sasl.password\",\n-                                \"required\": false,\n-                                \"sensitive\": true\n-                            },\n-                            \"sasl.token.auth\": {\n-                                \"allowableValues\": [\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"America/Atikokan\",\n+                                        \"value\": \"America/Atikokan\"\n+                                    },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"displayName\": \"America/Atka\",\n+                                        \"value\": \"America/Atka\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"false\",\n-                                \"dependencies\": [\n+                                        \"displayName\": \"America/Bahia\",\n+                                        \"value\": \"America/Bahia\"\n+                                    },\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"SCRAM-SHA-512\",\n-                                            \"SCRAM-SHA-256\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"SASL Mechanism\",\n-                                        \"propertyName\": \"sasl.mechanism\"\n-                                    }\n-                                ],\n-                                \"description\": \"Enables or disables Token authentication when using SCRAM SASL Mechanisms\",\n-                                \"displayName\": \"Token Authentication\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"sasl.token.auth\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"sasl.username\": {\n-                                \"dependencies\": [\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"America/Bahia_Banderas\",\n+                                        \"value\": \"America/Bahia_Banderas\"\n+                                    },\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"PLAIN\",\n-                                            \"SCRAM-SHA-512\",\n-                                            \"SCRAM-SHA-256\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"SASL Mechanism\",\n-                                        \"propertyName\": \"sasl.mechanism\"\n-                                    }\n-                                ],\n-                                \"description\": \"Username provided with configured password when using PLAIN or SCRAM SASL Mechanisms\",\n-                                \"displayName\": \"Username\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"sasl.username\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"security.protocol\": {\n-                                \"allowableValues\": [\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"America/Barbados\",\n+                                        \"value\": \"America/Barbados\"\n+                                    },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"PLAINTEXT\",\n-                                        \"value\": \"PLAINTEXT\"\n+                                        \"displayName\": \"America/Belem\",\n+                                        \"value\": \"America/Belem\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"SSL\",\n-                                        \"value\": \"SSL\"\n+                                        \"displayName\": \"America/Belize\",\n+                                        \"value\": \"America/Belize\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"SASL_PLAINTEXT\",\n-                                        \"value\": \"SASL_PLAINTEXT\"\n+                                        \"displayName\": \"America/Blanc-Sablon\",\n+                                        \"value\": \"America/Blanc-Sablon\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"SASL_SSL\",\n-                                        \"value\": \"SASL_SSL\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"PLAINTEXT\",\n-                                \"description\": \"Security protocol used to communicate with brokers. Corresponds to Kafka Client security.protocol property\",\n-                                \"displayName\": \"Security Protocol\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"security.protocol\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"ssl.context.service\": {\n-                                \"description\": \"Service supporting SSL communication with Kafka brokers\",\n-                                \"displayName\": \"SSL Context Service\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"ssl.context.service\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            },\n-                            \"topic\": {\n-                                \"description\": \"The name of the Kafka Topic to publish to.\",\n-                                \"displayName\": \"Topic Name\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"topic\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"transactional-id-prefix\": {\n-                                \"description\": \"When Use Transaction is set to true, KafkaProducer config 'transactional.id' will be a generated UUID and will be prefixed with this string.\",\n-                                \"displayName\": \"Transactional Id Prefix\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"transactional-id-prefix\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"use-transactions\": {\n-                                \"allowableValues\": [\n+                                        \"displayName\": \"America/Boa_Vista\",\n+                                        \"value\": \"America/Boa_Vista\"\n+                                    },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"displayName\": \"America/Bogota\",\n+                                        \"value\": \"America/Bogota\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"true\",\n-                                \"description\": \"Specifies whether or not NiFi should provide Transactional guarantees when communicating with Kafka. If there is a problem sending data to Kafka, and this property is set to false, then the messages that have already been sent to Kafka will continue on and be delivered to consumers. If this is set to true, then the Kafka transaction will be rolled back so that those messages are not available to consumers. Setting this to true requires that the <Delivery Guarantee> property be set to \\\"Guarantee Replicated Delivery.\\\"\",\n-                                \"displayName\": \"Use Transactions\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"use-transactions\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            }\n-                        },\n-                        \"sideEffectFree\": false,\n-                        \"supportedRelationships\": [\n-                            {\n-                                \"description\": \"FlowFiles for which all content was sent to Kafka.\",\n-                                \"name\": \"success\"\n-                            },\n-                            {\n-                                \"description\": \"Any FlowFile that cannot be sent to Kafka will be routed to this Relationship\",\n-                                \"name\": \"failure\"\n-                            }\n-                        ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": false,\n-                        \"supportsDynamicProperties\": true,\n-                        \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": false,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"2.0\",\n-                            \"Apache\",\n-                            \"Kafka\",\n-                            \"Message\",\n-                            \"PubSub\",\n-                            \"Put\",\n-                            \"Send\"\n-                        ],\n-                        \"triggerSerially\": false,\n-                        \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.kafka.pubsub.PublishKafka_2_0\",\n-                        \"typeDescription\": \"Sends the contents of a FlowFile as a message to Apache Kafka using the Kafka 2.0 Producer API.The messages to send may be individual FlowFiles or may be delimited, using a user-specified delimiter, such as a new-line. The complementary NiFi processor for fetching messages is ConsumeKafka_2_0.\",\n-                        \"version\": \"1.27.0\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"The number of messages that were sent to Kafka for this FlowFile. This attribute is added only to FlowFiles that are routed to success. If the <Message Demarcator> Property is not set, this will always be 1, but if the Property is set, it may be greater than 1.\",\n-                                \"name\": \"msg.count\"\n-                            }\n-                        ]\n-                    }\n-                ],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"1.27.0\"\n-        },\n-        {\n-            \"artifact\": \"nifi-elasticsearch-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [],\n-                \"processors\": [\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-elasticsearch-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"e0c4461\"\n-                        },\n-                        \"defaultBulletinLevel\": \"WARN\",\n-                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": 1,\n-                            \"EVENT_DRIVEN\": 0,\n-                            \"TIMER_DRIVEN\": 1\n-                        },\n-                        \"defaultPenaltyDuration\": \"30 sec\",\n-                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"0 sec\"\n-                        },\n-                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n-                        \"defaultYieldDuration\": \"1 sec\",\n-                        \"deprecated\": true,\n-                        \"deprecationAlternatives\": [\n-                            \"org.apache.nifi.processors.elasticsearch.GetElasticsearch\"\n-                        ],\n-                        \"deprecationReason\": \"This processor is deprecated and may be removed in future releases.\",\n-                        \"dynamicProperties\": [\n-                            {\n-                                \"description\": \"Adds the specified property name/value as a query parameter in the Elasticsearch URL used for processing\",\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"name\": \"A URL query parameter\",\n-                                \"value\": \"The value to set it to\"\n-                            }\n-                        ],\n-                        \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_ALLOWED\",\n-                        \"primaryNodeOnly\": false,\n-                        \"propertyDescriptors\": {\n-                            \"Character Set\": {\n-                                \"defaultValue\": \"UTF-8\",\n-                                \"description\": \"Specifies the character set of the document data.\",\n-                                \"displayName\": \"Character Set\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Character Set\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Password\": {\n-                                \"description\": \"Password to access the Elasticsearch cluster\",\n-                                \"displayName\": \"Password\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Password\",\n-                                \"required\": false,\n-                                \"sensitive\": true\n-                            },\n-                            \"SSL Context Service\": {\n-                                \"description\": \"The SSL Context Service used to provide client certificate information for TLS/SSL connections. This service only applies if the Elasticsearch endpoint(s) have been secured with TLS/SSL.\",\n-                                \"displayName\": \"SSL Context Service\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"SSL Context Service\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            },\n-                            \"Username\": {\n-                                \"description\": \"Username to access the Elasticsearch cluster\",\n-                                \"displayName\": \"Username\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Username\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"elasticsearch-http-connect-timeout\": {\n-                                \"defaultValue\": \"5 secs\",\n-                                \"description\": \"Max wait time for the connection to the Elasticsearch REST API.\",\n-                                \"displayName\": \"Connection Timeout\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"elasticsearch-http-connect-timeout\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"elasticsearch-http-proxy-host\": {\n-                                \"description\": \"The fully qualified hostname or IP address of the proxy server\",\n-                                \"displayName\": \"Proxy Host\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"elasticsearch-http-proxy-host\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"elasticsearch-http-proxy-port\": {\n-                                \"description\": \"The port of the proxy server\",\n-                                \"displayName\": \"Proxy Port\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"elasticsearch-http-proxy-port\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"elasticsearch-http-response-timeout\": {\n-                                \"defaultValue\": \"15 secs\",\n-                                \"description\": \"Max wait time for a response from the Elasticsearch REST API.\",\n-                                \"displayName\": \"Response Timeout\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"elasticsearch-http-response-timeout\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"elasticsearch-http-url\": {\n-                                \"description\": \"Elasticsearch URL which will be connected to, including scheme (http, e.g.), host, and port. The default port for the REST API is 9200.\",\n-                                \"displayName\": \"Elasticsearch URL\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"elasticsearch-http-url\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"fetch-es-doc-id\": {\n-                                \"description\": \"The identifier of the document to be fetched\",\n-                                \"displayName\": \"Document Identifier\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"fetch-es-doc-id\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"fetch-es-fields\": {\n-                                \"description\": \"A comma-separated list of fields to retrieve from the document. If the Fields property is left blank, then the entire document's source will be retrieved.\",\n-                                \"displayName\": \"Fields\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"fetch-es-fields\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"fetch-es-index\": {\n-                                \"description\": \"The name of the index to read from.\",\n-                                \"displayName\": \"Index\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"fetch-es-index\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"fetch-es-type\": {\n-                                \"description\": \"The type of document/fetch (if unset, the first document matching the identifier across _all types will be retrieved). This should be unset, '_doc' or '_source' for Elasticsearch 7.0+.\",\n-                                \"displayName\": \"Type\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"fetch-es-type\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"proxy-configuration-service\": {\n-                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests. If set, it supersedes proxy settings configured per component. Supported proxies: SOCKS, HTTP + AuthN In case of SOCKS, it is not guaranteed that the selected SOCKS Version will be used by the processor.\",\n-                                \"displayName\": \"Proxy Configuration Service\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"proxy-configuration-service\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.proxy.ProxyConfigurationService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            },\n-                            \"proxy-password\": {\n-                                \"description\": \"Proxy Password\",\n-                                \"displayName\": \"Proxy Password\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"proxy-password\",\n-                                \"required\": false,\n-                                \"sensitive\": true\n-                            },\n-                            \"proxy-username\": {\n-                                \"description\": \"Proxy Username\",\n-                                \"displayName\": \"Proxy Username\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"proxy-username\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            }\n-                        },\n-                        \"sideEffectFree\": false,\n-                        \"supportedRelationships\": [\n-                            {\n-                                \"description\": \"A FlowFile is routed to this relationship if the document cannot be fetched but attempting the operation again may succeed. Note that if the processor has no incoming connections, flow files may still be sent to this relationship based on the processor properties and the results of the fetch operation.\",\n-                                \"name\": \"retry\"\n-                            },\n-                            {\n-                                \"description\": \"All FlowFiles that are read from Elasticsearch are routed to this relationship.\",\n-                                \"name\": \"success\"\n-                            },\n-                            {\n-                                \"description\": \"All FlowFiles that cannot be read from Elasticsearch are routed to this relationship. Note that only incoming flow files will be routed to failure.\",\n-                                \"name\": \"failure\"\n-                            },\n-                            {\n-                                \"description\": \"A FlowFile is routed to this relationship if the specified document does not exist in the Elasticsearch cluster. Note that if the processor has no incoming connections, flow files may still be sent to this relationship based on the processor properties and the results of the fetch operation.\",\n-                                \"name\": \"not found\"\n-                            }\n-                        ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\",\n-                            \"EVENT_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": true,\n-                        \"supportsDynamicProperties\": true,\n-                        \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": true,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"elasticsearch\",\n-                            \"fetch\",\n-                            \"get\",\n-                            \"http\",\n-                            \"read\"\n-                        ],\n-                        \"triggerSerially\": false,\n-                        \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.elasticsearch.FetchElasticsearchHttp\",\n-                        \"typeDescription\": \"Retrieves a document from Elasticsearch using the specified connection properties and the identifier of the document to retrieve. Note that the full body of the document will be read into memory before being written to a Flow File for transfer.\",\n-                        \"version\": \"1.27.0\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"The filename attribute is set to the document identifier\",\n-                                \"name\": \"filename\"\n-                            },\n-                            {\n-                                \"description\": \"The Elasticsearch index containing the document\",\n-                                \"name\": \"es.index\"\n-                            },\n-                            {\n-                                \"description\": \"The Elasticsearch document type\",\n-                                \"name\": \"es.type\"\n-                            }\n-                        ]\n-                    },\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-elasticsearch-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"e0c4461\"\n-                        },\n-                        \"defaultBulletinLevel\": \"WARN\",\n-                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": 1,\n-                            \"EVENT_DRIVEN\": 0,\n-                            \"TIMER_DRIVEN\": 1\n-                        },\n-                        \"defaultPenaltyDuration\": \"30 sec\",\n-                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"0 sec\"\n-                        },\n-                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n-                        \"defaultYieldDuration\": \"1 sec\",\n-                        \"deprecated\": true,\n-                        \"deprecationAlternatives\": [\n-                            \"org.apache.nifi.processors.elasticsearch.PutElasticsearchJson\"\n-                        ],\n-                        \"deprecationReason\": \"This processor is deprecated and may be removed in future releases.\",\n-                        \"dynamicProperties\": [\n-                            {\n-                                \"description\": \"Adds the specified property name/value as a query parameter in the Elasticsearch URL used for processing\",\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"name\": \"A URL query parameter\",\n-                                \"value\": \"The value to set it to\"\n-                            }\n-                        ],\n-                        \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_REQUIRED\",\n-                        \"primaryNodeOnly\": false,\n-                        \"propertyDescriptors\": {\n-                            \"Character Set\": {\n-                                \"defaultValue\": \"UTF-8\",\n-                                \"description\": \"Specifies the character set of the document data.\",\n-                                \"displayName\": \"Character Set\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Character Set\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Password\": {\n-                                \"description\": \"Password to access the Elasticsearch cluster\",\n-                                \"displayName\": \"Password\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Password\",\n-                                \"required\": false,\n-                                \"sensitive\": true\n-                            },\n-                            \"SSL Context Service\": {\n-                                \"description\": \"The SSL Context Service used to provide client certificate information for TLS/SSL connections. This service only applies if the Elasticsearch endpoint(s) have been secured with TLS/SSL.\",\n-                                \"displayName\": \"SSL Context Service\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"SSL Context Service\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            },\n-                            \"Username\": {\n-                                \"description\": \"Username to access the Elasticsearch cluster\",\n-                                \"displayName\": \"Username\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Username\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"elasticsearch-http-connect-timeout\": {\n-                                \"defaultValue\": \"5 secs\",\n-                                \"description\": \"Max wait time for the connection to the Elasticsearch REST API.\",\n-                                \"displayName\": \"Connection Timeout\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"elasticsearch-http-connect-timeout\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"elasticsearch-http-proxy-host\": {\n-                                \"description\": \"The fully qualified hostname or IP address of the proxy server\",\n-                                \"displayName\": \"Proxy Host\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"elasticsearch-http-proxy-host\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"elasticsearch-http-proxy-port\": {\n-                                \"description\": \"The port of the proxy server\",\n-                                \"displayName\": \"Proxy Port\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"elasticsearch-http-proxy-port\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"elasticsearch-http-response-timeout\": {\n-                                \"defaultValue\": \"15 secs\",\n-                                \"description\": \"Max wait time for a response from the Elasticsearch REST API.\",\n-                                \"displayName\": \"Response Timeout\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"elasticsearch-http-response-timeout\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"elasticsearch-http-url\": {\n-                                \"description\": \"Elasticsearch URL which will be connected to, including scheme (http, e.g.), host, and port. The default port for the REST API is 9200.\",\n-                                \"displayName\": \"Elasticsearch URL\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"elasticsearch-http-url\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"proxy-configuration-service\": {\n-                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests. If set, it supersedes proxy settings configured per component. Supported proxies: SOCKS, HTTP + AuthN In case of SOCKS, it is not guaranteed that the selected SOCKS Version will be used by the processor.\",\n-                                \"displayName\": \"Proxy Configuration Service\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"proxy-configuration-service\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.proxy.ProxyConfigurationService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            },\n-                            \"proxy-password\": {\n-                                \"description\": \"Proxy Password\",\n-                                \"displayName\": \"Proxy Password\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"proxy-password\",\n-                                \"required\": false,\n-                                \"sensitive\": true\n-                            },\n-                            \"proxy-username\": {\n-                                \"description\": \"Proxy Username\",\n-                                \"displayName\": \"Proxy Username\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"proxy-username\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"put-es-batch-size\": {\n-                                \"defaultValue\": \"100\",\n-                                \"description\": \"The preferred number of flow files to put to the database in a single transaction. Note that the contents of the flow files will be stored in memory until the bulk operation is performed. Also the results should be returned in the same order the flow files were received.\",\n-                                \"displayName\": \"Batch Size\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"put-es-batch-size\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"put-es-id-attr\": {\n-                                \"description\": \"The name of the FlowFile attribute containing the identifier for the document. If the Index Operation is \\\"index\\\", this property may be left empty or evaluate to an empty value, in which case the document's identifier will be auto-generated by Elasticsearch. For all other Index Operations, the attribute must evaluate to a non-empty value.\",\n-                                \"displayName\": \"Identifier Attribute\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"put-es-id-attr\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"put-es-index\": {\n-                                \"description\": \"The name of the index to insert into\",\n-                                \"displayName\": \"Index\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"put-es-index\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"put-es-index-op\": {\n-                                \"defaultValue\": \"index\",\n-                                \"description\": \"The type of the operation used to index (create, index, update, upsert, delete)\",\n-                                \"displayName\": \"Index Operation\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"put-es-index-op\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"put-es-type\": {\n-                                \"description\": \"The type of this document (required by Elasticsearch versions < 7.0 for indexing and searching). This must be unset or '_doc' for Elasticsearch 7.0+.\",\n-                                \"displayName\": \"Type\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"put-es-type\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            }\n-                        },\n-                        \"sideEffectFree\": false,\n-                        \"supportedRelationships\": [\n-                            {\n-                                \"description\": \"A FlowFile is routed to this relationship if the database cannot be updated but attempting the operation again may succeed\",\n-                                \"name\": \"retry\"\n-                            },\n-                            {\n-                                \"description\": \"All FlowFiles that are written to Elasticsearch are routed to this relationship\",\n-                                \"name\": \"success\"\n-                            },\n-                            {\n-                                \"description\": \"All FlowFiles that cannot be written to Elasticsearch are routed to this relationship\",\n-                                \"name\": \"failure\"\n-                            }\n-                        ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\",\n-                            \"EVENT_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": true,\n-                        \"supportsDynamicProperties\": true,\n-                        \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": true,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"systemResourceConsiderations\": [\n-                            {\n-                                \"description\": \"An instance of this component can cause high usage of this system resource.  Multiple instances or high concurrency settings may result a degradation of performance.\",\n-                                \"resource\": \"MEMORY\"\n-                            }\n-                        ],\n-                        \"tags\": [\n-                            \"delete\",\n-                            \"elasticsearch\",\n-                            \"http\",\n-                            \"insert\",\n-                            \"put\",\n-                            \"update\",\n-                            \"upsert\",\n-                            \"write\"\n-                        ],\n-                        \"triggerSerially\": false,\n-                        \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.elasticsearch.PutElasticsearchHttp\",\n-                        \"typeDescription\": \"Writes the contents of a FlowFile to Elasticsearch, using the specified parameters such as the index to insert into and the type of the document.\",\n-                        \"version\": \"1.27.0\"\n-                    },\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-elasticsearch-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"e0c4461\"\n-                        },\n-                        \"defaultBulletinLevel\": \"WARN\",\n-                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": 1,\n-                            \"EVENT_DRIVEN\": 0,\n-                            \"TIMER_DRIVEN\": 1\n-                        },\n-                        \"defaultPenaltyDuration\": \"30 sec\",\n-                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"0 sec\"\n-                        },\n-                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n-                        \"defaultYieldDuration\": \"1 sec\",\n-                        \"deprecated\": true,\n-                        \"deprecationAlternatives\": [\n-                            \"org.apache.nifi.processors.elasticsearch.PutElasticsearchRecord\"\n-                        ],\n-                        \"deprecationReason\": \"This processor is deprecated and may be removed in future releases.\",\n-                        \"dynamicProperties\": [\n-                            {\n-                                \"description\": \"Adds the specified property name/value as a query parameter in the Elasticsearch URL used for processing\",\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"name\": \"A URL query parameter\",\n-                                \"value\": \"The value to set it to\"\n-                            }\n-                        ],\n-                        \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_REQUIRED\",\n-                        \"primaryNodeOnly\": false,\n-                        \"propertyDescriptors\": {\n-                            \"Character Set\": {\n-                                \"defaultValue\": \"UTF-8\",\n-                                \"description\": \"Specifies the character set of the document data.\",\n-                                \"displayName\": \"Character Set\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Character Set\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Date Format\": {\n-                                \"description\": \"Specifies the format to use when reading/writing Date fields. If not specified, the default format 'yyyy-MM-dd' is used. If specified, the value must match the Java Simple Date Format (for example, MM/dd/yyyy for a two-digit month, followed by a two-digit day, followed by a four-digit year, all separated by '/' characters, as in 01/25/2017).\",\n-                                \"displayName\": \"Date Format\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Date Format\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Password\": {\n-                                \"description\": \"Password to access the Elasticsearch cluster\",\n-                                \"displayName\": \"Password\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Password\",\n-                                \"required\": false,\n-                                \"sensitive\": true\n-                            },\n-                            \"SSL Context Service\": {\n-                                \"description\": \"The SSL Context Service used to provide client certificate information for TLS/SSL connections. This service only applies if the Elasticsearch endpoint(s) have been secured with TLS/SSL.\",\n-                                \"displayName\": \"SSL Context Service\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"SSL Context Service\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            },\n-                            \"Time Format\": {\n-                                \"description\": \"Specifies the format to use when reading/writing Time fields. If not specified, the default format 'HH:mm:ss' is used. If specified, the value must match the Java Simple Date Format (for example, HH:mm:ss for a two-digit hour in 24-hour format, followed by a two-digit minute, followed by a two-digit second, all separated by ':' characters, as in 18:04:15).\",\n-                                \"displayName\": \"Time Format\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Time Format\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Timestamp Format\": {\n-                                \"description\": \"Specifies the format to use when reading/writing Timestamp fields. If not specified, the default format 'yyyy-MM-dd HH:mm:ss' is used. If specified, the value must match the Java Simple Date Format (for example, MM/dd/yyyy HH:mm:ss for a two-digit month, followed by a two-digit day, followed by a four-digit year, all separated by '/' characters; and then followed by a two-digit hour in 24-hour format, followed by a two-digit minute, followed by a two-digit second, all separated by ':' characters, as in 01/25/2017 18:04:15).\",\n-                                \"displayName\": \"Timestamp Format\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Timestamp Format\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Username\": {\n-                                \"description\": \"Username to access the Elasticsearch cluster\",\n-                                \"displayName\": \"Username\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Username\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"elasticsearch-http-connect-timeout\": {\n-                                \"defaultValue\": \"5 secs\",\n-                                \"description\": \"Max wait time for the connection to the Elasticsearch REST API.\",\n-                                \"displayName\": \"Connection Timeout\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"elasticsearch-http-connect-timeout\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"elasticsearch-http-proxy-host\": {\n-                                \"description\": \"The fully qualified hostname or IP address of the proxy server\",\n-                                \"displayName\": \"Proxy Host\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"elasticsearch-http-proxy-host\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"elasticsearch-http-proxy-port\": {\n-                                \"description\": \"The port of the proxy server\",\n-                                \"displayName\": \"Proxy Port\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"elasticsearch-http-proxy-port\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"elasticsearch-http-response-timeout\": {\n-                                \"defaultValue\": \"15 secs\",\n-                                \"description\": \"Max wait time for a response from the Elasticsearch REST API.\",\n-                                \"displayName\": \"Response Timeout\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"elasticsearch-http-response-timeout\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"elasticsearch-http-url\": {\n-                                \"description\": \"Elasticsearch URL which will be connected to, including scheme (http, e.g.), host, and port. The default port for the REST API is 9200.\",\n-                                \"displayName\": \"Elasticsearch URL\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"elasticsearch-http-url\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"proxy-configuration-service\": {\n-                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests. If set, it supersedes proxy settings configured per component. Supported proxies: SOCKS, HTTP + AuthN In case of SOCKS, it is not guaranteed that the selected SOCKS Version will be used by the processor.\",\n-                                \"displayName\": \"Proxy Configuration Service\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"proxy-configuration-service\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.proxy.ProxyConfigurationService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            },\n-                            \"proxy-password\": {\n-                                \"description\": \"Proxy Password\",\n-                                \"displayName\": \"Proxy Password\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"proxy-password\",\n-                                \"required\": false,\n-                                \"sensitive\": true\n-                            },\n-                            \"proxy-username\": {\n-                                \"description\": \"Proxy Username\",\n-                                \"displayName\": \"Proxy Username\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"proxy-username\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"put-es-record-at-timestamp\": {\n-                                \"description\": \"The value to use as the @timestamp field (required for Elasticsearch Data Streams)\",\n-                                \"displayName\": \"@timestamp Value\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"put-es-record-at-timestamp\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"put-es-record-at-timestamp-path\": {\n-                                \"description\": \"A RecordPath pointing to a field in the record(s) that contains the @timestamp for the document. If left blank the @timestamp will be determined using the main @timestamp property\",\n-                                \"displayName\": \"@timestamp Record Path\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"put-es-record-at-timestamp-path\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"put-es-record-id-path\": {\n-                                \"description\": \"A RecordPath pointing to a field in the record(s) that contains the identifier for the document. If the Index Operation is \\\"index\\\" or \\\"create\\\", this property may be left empty or evaluate to an empty value, in which case the document's identifier will be auto-generated by Elasticsearch. For all other Index Operations, the field's value must be non-empty.\",\n-                                \"displayName\": \"Identifier Record Path\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"put-es-record-id-path\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"put-es-record-index\": {\n-                                \"description\": \"The name of the index to insert into\",\n-                                \"displayName\": \"Index\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"put-es-record-index\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"put-es-record-index-op\": {\n-                                \"defaultValue\": \"index\",\n-                                \"description\": \"The type of the operation used to index (create, index, update, upsert, delete)\",\n-                                \"displayName\": \"Index Operation\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"put-es-record-index-op\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"put-es-record-log-all-errors\": {\n-                                \"allowableValues\": [\n+                                        \"displayName\": \"America/Boise\",\n+                                        \"value\": \"America/Boise\"\n+                                    },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"displayName\": \"America/Buenos_Aires\",\n+                                        \"value\": \"America/Buenos_Aires\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"After sending a batch of records, Elasticsearch will report if individual records failed to insert. As an example, this can happen if the record doesn't match the mapping for the index it is being inserted into. If this is set to true, the processor will log the failure reason for the every failed record. When set to false only the first error in the batch will be logged.\",\n-                                \"displayName\": \"Log all errors in batch\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"put-es-record-log-all-errors\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"put-es-record-record-reader\": {\n-                                \"description\": \"Specifies the Controller Service to use for parsing incoming data and determining the data's schema.\",\n-                                \"displayName\": \"Record Reader\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"put-es-record-record-reader\",\n-                                \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            },\n-                            \"put-es-record-record-writer\": {\n-                                \"description\": \"After sending a batch of records, Elasticsearch will report if individual records failed to insert. As an example, this can happen if the record doesn't match the mappingfor the index it is being inserted into. This property specifies the Controller Service to use for writing out those individual records sent to 'failure'. If this is not set, then the whole FlowFile will be routed to failure (including any records which may have been inserted successfully). Note that this will only be used if Elasticsearch reports that individual records failed and that in the event that the entire FlowFile fails (e.g. in the event ES is down), the FF will be routed to failure without being interpreted by this record writer. If there is an error while attempting to route the failures, the entire FlowFile will be routed to Failure. Also if every record failed individually, the entire FlowFile will be routed to Failure without being parsed by the writer.\",\n-                                \"displayName\": \"Record Writer\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"put-es-record-record-writer\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            },\n-                            \"put-es-record-type\": {\n-                                \"description\": \"The type of this document (required by Elasticsearch versions < 7.0 for indexing and searching). This must be unset or '_doc' for Elasticsearch 7.0+.\",\n-                                \"displayName\": \"Type\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"put-es-record-type\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"suppress-nulls\": {\n-                                \"allowableValues\": [\n+                                        \"displayName\": \"America/Cambridge_Bay\",\n+                                        \"value\": \"America/Cambridge_Bay\"\n+                                    },\n                                     {\n-                                        \"description\": \"Fields that are missing (present in the schema but not in the record), or that have a value of null, will be written out as a null value\",\n-                                        \"displayName\": \"Never Suppress\",\n-                                        \"value\": \"never-suppress\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"America/Campo_Grande\",\n+                                        \"value\": \"America/Campo_Grande\"\n                                     },\n                                     {\n-                                        \"description\": \"Fields that are missing (present in the schema but not in the record), or that have a value of null, will not be written out\",\n-                                        \"displayName\": \"Always Suppress\",\n-                                        \"value\": \"always-suppress\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"America/Cancun\",\n+                                        \"value\": \"America/Cancun\"\n                                     },\n                                     {\n-                                        \"description\": \"When a field has a value of null, it will be written out. However, if a field is defined in the schema and not present in the record, the field will not be written out.\",\n-                                        \"displayName\": \"Suppress Missing Values\",\n-                                        \"value\": \"suppress-missing\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"never-suppress\",\n-                                \"description\": \"Specifies how the writer should handle a null field\",\n-                                \"displayName\": \"Suppress Null Values\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"suppress-nulls\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            }\n-                        },\n-                        \"sideEffectFree\": false,\n-                        \"supportedRelationships\": [\n-                            {\n-                                \"description\": \"A FlowFile is routed to this relationship if the database cannot be updated but attempting the operation again may succeed\",\n-                                \"name\": \"retry\"\n-                            },\n-                            {\n-                                \"description\": \"All FlowFiles that are written to Elasticsearch are routed to this relationship\",\n-                                \"name\": \"success\"\n-                            },\n-                            {\n-                                \"description\": \"All FlowFiles that cannot be written to Elasticsearch are routed to this relationship\",\n-                                \"name\": \"failure\"\n-                            }\n-                        ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\",\n-                            \"EVENT_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": false,\n-                        \"supportsDynamicProperties\": true,\n-                        \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": true,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"delete\",\n-                            \"elasticsearch\",\n-                            \"http\",\n-                            \"insert\",\n-                            \"put\",\n-                            \"record\",\n-                            \"update\",\n-                            \"upsert\",\n-                            \"write\"\n-                        ],\n-                        \"triggerSerially\": false,\n-                        \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.elasticsearch.PutElasticsearchHttpRecord\",\n-                        \"typeDescription\": \"Writes the records from a FlowFile into to Elasticsearch, using the specified parameters such as the index to insert into and the type of the document, as well as the operation type (index, upsert, delete, etc.). Note: The Bulk API is used to send the records. This means that the entire contents of the incoming flow file are read into memory, and each record is transformed into a JSON document which is added to a single HTTP request body. For very large flow files (files with a large number of records, e.g.), this could cause memory usage issues.\",\n-                        \"version\": \"1.27.0\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"The number of records in an outgoing FlowFile. This is only populated on the 'success' relationship.\",\n-                                \"name\": \"record.count\"\n-                            },\n-                            {\n-                                \"description\": \"The number of records found by Elasticsearch to have errors. This is only populated on the 'failure' relationship.\",\n-                                \"name\": \"failure.count\"\n-                            }\n-                        ]\n-                    },\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-elasticsearch-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"e0c4461\"\n-                        },\n-                        \"defaultBulletinLevel\": \"WARN\",\n-                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": 1,\n-                            \"EVENT_DRIVEN\": 0,\n-                            \"TIMER_DRIVEN\": 1\n-                        },\n-                        \"defaultPenaltyDuration\": \"30 sec\",\n-                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"0 sec\"\n-                        },\n-                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n-                        \"defaultYieldDuration\": \"1 sec\",\n-                        \"deprecated\": true,\n-                        \"deprecationAlternatives\": [\n-                            \"org.apache.nifi.processors.elasticsearch.PaginatedJsonQueryElasticsearch\"\n-                        ],\n-                        \"deprecationReason\": \"This processor is deprecated and may be removed in future releases.\",\n-                        \"dynamicProperties\": [\n-                            {\n-                                \"description\": \"Adds the specified property name/value as a query parameter in the Elasticsearch URL used for processing\",\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"name\": \"A URL query parameter\",\n-                                \"value\": \"The value to set it to\"\n-                            }\n-                        ],\n-                        \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_ALLOWED\",\n-                        \"primaryNodeOnly\": false,\n-                        \"propertyDescriptors\": {\n-                            \"Character Set\": {\n-                                \"defaultValue\": \"UTF-8\",\n-                                \"description\": \"Specifies the character set of the document data.\",\n-                                \"displayName\": \"Character Set\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Character Set\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Password\": {\n-                                \"description\": \"Password to access the Elasticsearch cluster\",\n-                                \"displayName\": \"Password\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Password\",\n-                                \"required\": false,\n-                                \"sensitive\": true\n-                            },\n-                            \"SSL Context Service\": {\n-                                \"description\": \"The SSL Context Service used to provide client certificate information for TLS/SSL connections. This service only applies if the Elasticsearch endpoint(s) have been secured with TLS/SSL.\",\n-                                \"displayName\": \"SSL Context Service\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"SSL Context Service\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            },\n-                            \"Username\": {\n-                                \"description\": \"Username to access the Elasticsearch cluster\",\n-                                \"displayName\": \"Username\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Username\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"elasticsearch-http-connect-timeout\": {\n-                                \"defaultValue\": \"5 secs\",\n-                                \"description\": \"Max wait time for the connection to the Elasticsearch REST API.\",\n-                                \"displayName\": \"Connection Timeout\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"elasticsearch-http-connect-timeout\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"elasticsearch-http-proxy-host\": {\n-                                \"description\": \"The fully qualified hostname or IP address of the proxy server\",\n-                                \"displayName\": \"Proxy Host\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"elasticsearch-http-proxy-host\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"elasticsearch-http-proxy-port\": {\n-                                \"description\": \"The port of the proxy server\",\n-                                \"displayName\": \"Proxy Port\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"elasticsearch-http-proxy-port\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"elasticsearch-http-response-timeout\": {\n-                                \"defaultValue\": \"15 secs\",\n-                                \"description\": \"Max wait time for a response from the Elasticsearch REST API.\",\n-                                \"displayName\": \"Response Timeout\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"elasticsearch-http-response-timeout\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"elasticsearch-http-url\": {\n-                                \"description\": \"Elasticsearch URL which will be connected to, including scheme (http, e.g.), host, and port. The default port for the REST API is 9200.\",\n-                                \"displayName\": \"Elasticsearch URL\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"elasticsearch-http-url\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"proxy-configuration-service\": {\n-                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests. If set, it supersedes proxy settings configured per component. Supported proxies: SOCKS, HTTP + AuthN In case of SOCKS, it is not guaranteed that the selected SOCKS Version will be used by the processor.\",\n-                                \"displayName\": \"Proxy Configuration Service\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"proxy-configuration-service\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.proxy.ProxyConfigurationService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            },\n-                            \"proxy-password\": {\n-                                \"description\": \"Proxy Password\",\n-                                \"displayName\": \"Proxy Password\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"proxy-password\",\n-                                \"required\": false,\n-                                \"sensitive\": true\n-                            },\n-                            \"proxy-username\": {\n-                                \"description\": \"Proxy Username\",\n-                                \"displayName\": \"Proxy Username\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"proxy-username\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"query-es-fields\": {\n-                                \"description\": \"A comma-separated list of fields to retrieve from the document. If the Fields property is left blank, then the entire document's source will be retrieved.\",\n-                                \"displayName\": \"Fields\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"query-es-fields\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"query-es-index\": {\n-                                \"description\": \"The name of the index to read from. If the property is unset or set to _all, the query will match across all indexes.\",\n-                                \"displayName\": \"Index\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"query-es-index\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"query-es-limit\": {\n-                                \"description\": \"If set, limits the number of results that will be returned.\",\n-                                \"displayName\": \"Limit\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"query-es-limit\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"query-es-query\": {\n-                                \"description\": \"The Lucene-style query to run against ElasticSearch (e.g., genre:blues AND -artist:muddy)\",\n-                                \"displayName\": \"Query\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"query-es-query\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"query-es-size\": {\n-                                \"defaultValue\": \"20\",\n-                                \"description\": \"Determines how many documents to return per page during scrolling.\",\n-                                \"displayName\": \"Page Size\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"query-es-size\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"query-es-sort\": {\n-                                \"description\": \"A sort parameter (e.g., timestamp:asc). If the Sort property is left blank, then the results will be retrieved in document order.\",\n-                                \"displayName\": \"Sort\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"query-es-sort\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"query-es-target\": {\n-                                \"allowableValues\": [\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"America/Caracas\",\n+                                        \"value\": \"America/Caracas\"\n+                                    },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"Flow file content\",\n-                                        \"value\": \"Flow file content\"\n+                                        \"displayName\": \"America/Catamarca\",\n+                                        \"value\": \"America/Catamarca\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"Flow file attributes\",\n-                                        \"value\": \"Flow file attributes\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"Flow file content\",\n-                                \"description\": \"Indicates where the results should be placed.  In the case of 'Flow file content', the JSON response will be written as the content of the flow file.  In the case of 'Flow file attributes', the original flow file (if applicable) will be cloned for each result, and all return fields will be placed in a flow file attribute of the same name, but prefixed by 'es.result.'\",\n-                                \"displayName\": \"Target\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"query-es-target\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"query-es-type\": {\n-                                \"description\": \"The type of document (if unset, the query will be against all types in the _index). This should be unset or '_doc' for Elasticsearch 7.0+.\",\n-                                \"displayName\": \"Type\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"query-es-type\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"routing-query-info-strategy\": {\n-                                \"allowableValues\": [\n+                                        \"displayName\": \"America/Cayenne\",\n+                                        \"value\": \"America/Cayenne\"\n+                                    },\n                                     {\n-                                        \"description\": \"Always route Query Info\",\n-                                        \"displayName\": \"Always\",\n-                                        \"value\": \"ALWAYS\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"America/Cayman\",\n+                                        \"value\": \"America/Cayman\"\n                                     },\n                                     {\n-                                        \"description\": \"Never route Query Info\",\n-                                        \"displayName\": \"Never\",\n-                                        \"value\": \"NEVER\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"America/Chicago\",\n+                                        \"value\": \"America/Chicago\"\n                                     },\n                                     {\n-                                        \"description\": \"Route Query Info if the Query returns no hits\",\n-                                        \"displayName\": \"No Hits\",\n-                                        \"value\": \"NOHIT\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"America/Chihuahua\",\n+                                        \"value\": \"America/Chihuahua\"\n                                     },\n                                     {\n-                                        \"description\": \"Always append Query Info as attributes, using the existing relationships (does not add the Query Info relationship).\",\n-                                        \"displayName\": \"Append as Attributes\",\n-                                        \"value\": \"APPEND_AS_ATTRIBUTES\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"NEVER\",\n-                                \"description\": \"Specifies when to generate and route Query Info after a successful query\",\n-                                \"displayName\": \"Routing Strategy for Query Info\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"routing-query-info-strategy\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            }\n-                        },\n-                        \"sideEffectFree\": false,\n-                        \"supportedRelationships\": [\n-                            {\n-                                \"description\": \"A FlowFile is routed to this relationship if the document cannot be fetched but attempting the operation again may succeed. Note that if the processor has no incoming connections, flow files may still be sent to this relationship based on the processor properties and the results of the fetch operation.\",\n-                                \"name\": \"retry\"\n-                            },\n-                            {\n-                                \"description\": \"All FlowFiles that are read from Elasticsearch are routed to this relationship.\",\n-                                \"name\": \"success\"\n-                            },\n-                            {\n-                                \"description\": \"All FlowFiles that cannot be read from Elasticsearch are routed to this relationship. Note that only incoming flow files will be routed to failure.\",\n-                                \"name\": \"failure\"\n-                            }\n-                        ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\",\n-                            \"EVENT_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": true,\n-                        \"supportsDynamicProperties\": true,\n-                        \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": true,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"elasticsearch\",\n-                            \"get\",\n-                            \"http\",\n-                            \"query\",\n-                            \"read\"\n-                        ],\n-                        \"triggerSerially\": false,\n-                        \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.elasticsearch.QueryElasticsearchHttp\",\n-                        \"typeDescription\": \"Queries Elasticsearch using the specified connection properties. Note that the full body of each page of documents will be read into memory before being written to Flow Files for transfer.  Also note that the Elasticsearch max_result_window index setting is the upper bound on the number of records that can be retrieved using this query.  To retrieve more records, use the ScrollElasticsearchHttp processor.\",\n-                        \"version\": \"1.27.0\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"The filename attribute is set to the document identifier\",\n-                                \"name\": \"filename\"\n-                            },\n-                            {\n-                                \"description\": \"The number of hits for a query\",\n-                                \"name\": \"es.query.hitcount\"\n-                            },\n-                            {\n-                                \"description\": \"The Elasticsearch document identifier\",\n-                                \"name\": \"es.id\"\n-                            },\n-                            {\n-                                \"description\": \"The Elasticsearch index containing the document\",\n-                                \"name\": \"es.index\"\n-                            },\n-                            {\n-                                \"description\": \"The Elasticsearch query that was built\",\n-                                \"name\": \"es.query.url\"\n-                            },\n-                            {\n-                                \"description\": \"The Elasticsearch document type\",\n-                                \"name\": \"es.type\"\n-                            },\n-                            {\n-                                \"description\": \"If Target is 'Flow file attributes', the JSON attributes of each result will be placed into corresponding attributes with this prefix.\",\n-                                \"name\": \"es.result.*\"\n-                            }\n-                        ]\n-                    },\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-elasticsearch-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"e0c4461\"\n-                        },\n-                        \"defaultBulletinLevel\": \"WARN\",\n-                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": 1,\n-                            \"EVENT_DRIVEN\": 0,\n-                            \"TIMER_DRIVEN\": 1\n-                        },\n-                        \"defaultPenaltyDuration\": \"30 sec\",\n-                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"0 sec\"\n-                        },\n-                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n-                        \"defaultYieldDuration\": \"1 sec\",\n-                        \"deprecated\": true,\n-                        \"deprecationAlternatives\": [\n-                            \"org.apache.nifi.processors.elasticsearch.SearchElasticsearch\"\n-                        ],\n-                        \"deprecationReason\": \"This processor is deprecated and may be removed in future releases.\",\n-                        \"dynamicProperties\": [\n-                            {\n-                                \"description\": \"Adds the specified property name/value as a query parameter in the Elasticsearch URL used for processing\",\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"name\": \"A URL query parameter\",\n-                                \"value\": \"The value to set it to\"\n-                            }\n-                        ],\n-                        \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n-                        \"primaryNodeOnly\": false,\n-                        \"propertyDescriptors\": {\n-                            \"Character Set\": {\n-                                \"defaultValue\": \"UTF-8\",\n-                                \"description\": \"Specifies the character set of the document data.\",\n-                                \"displayName\": \"Character Set\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Character Set\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Password\": {\n-                                \"description\": \"Password to access the Elasticsearch cluster\",\n-                                \"displayName\": \"Password\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Password\",\n-                                \"required\": false,\n-                                \"sensitive\": true\n-                            },\n-                            \"SSL Context Service\": {\n-                                \"description\": \"The SSL Context Service used to provide client certificate information for TLS/SSL connections. This service only applies if the Elasticsearch endpoint(s) have been secured with TLS/SSL.\",\n-                                \"displayName\": \"SSL Context Service\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"SSL Context Service\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            },\n-                            \"Username\": {\n-                                \"description\": \"Username to access the Elasticsearch cluster\",\n-                                \"displayName\": \"Username\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Username\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"elasticsearch-http-connect-timeout\": {\n-                                \"defaultValue\": \"5 secs\",\n-                                \"description\": \"Max wait time for the connection to the Elasticsearch REST API.\",\n-                                \"displayName\": \"Connection Timeout\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"elasticsearch-http-connect-timeout\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"elasticsearch-http-proxy-host\": {\n-                                \"description\": \"The fully qualified hostname or IP address of the proxy server\",\n-                                \"displayName\": \"Proxy Host\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"elasticsearch-http-proxy-host\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"elasticsearch-http-proxy-port\": {\n-                                \"description\": \"The port of the proxy server\",\n-                                \"displayName\": \"Proxy Port\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"elasticsearch-http-proxy-port\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"elasticsearch-http-response-timeout\": {\n-                                \"defaultValue\": \"15 secs\",\n-                                \"description\": \"Max wait time for a response from the Elasticsearch REST API.\",\n-                                \"displayName\": \"Response Timeout\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"elasticsearch-http-response-timeout\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"elasticsearch-http-url\": {\n-                                \"description\": \"Elasticsearch URL which will be connected to, including scheme (http, e.g.), host, and port. The default port for the REST API is 9200.\",\n-                                \"displayName\": \"Elasticsearch URL\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"elasticsearch-http-url\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"proxy-configuration-service\": {\n-                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests. If set, it supersedes proxy settings configured per component. Supported proxies: SOCKS, HTTP + AuthN In case of SOCKS, it is not guaranteed that the selected SOCKS Version will be used by the processor.\",\n-                                \"displayName\": \"Proxy Configuration Service\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"proxy-configuration-service\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.proxy.ProxyConfigurationService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            },\n-                            \"proxy-password\": {\n-                                \"description\": \"Proxy Password\",\n-                                \"displayName\": \"Proxy Password\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"proxy-password\",\n-                                \"required\": false,\n-                                \"sensitive\": true\n-                            },\n-                            \"proxy-username\": {\n-                                \"description\": \"Proxy Username\",\n-                                \"displayName\": \"Proxy Username\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"proxy-username\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"scroll-es-fields\": {\n-                                \"description\": \"A comma-separated list of fields to retrieve from the document. If the Fields property is left blank, then the entire document's source will be retrieved.\",\n-                                \"displayName\": \"Fields\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"scroll-es-fields\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"scroll-es-index\": {\n-                                \"description\": \"The name of the index to read from. If the property is set to _all, the query will match across all indexes.\",\n-                                \"displayName\": \"Index\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"scroll-es-index\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"scroll-es-query\": {\n-                                \"description\": \"The Lucene-style query to run against ElasticSearch (e.g., genre:blues AND -artist:muddy)\",\n-                                \"displayName\": \"Query\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"scroll-es-query\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"scroll-es-scroll\": {\n-                                \"defaultValue\": \"1m\",\n-                                \"description\": \"The scroll duration is how long each search context is kept in memory.\",\n-                                \"displayName\": \"Scroll Duration\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"scroll-es-scroll\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"scroll-es-size\": {\n-                                \"defaultValue\": \"20\",\n-                                \"description\": \"Determines how many documents to return per page during scrolling.\",\n-                                \"displayName\": \"Page Size\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"scroll-es-size\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"scroll-es-sort\": {\n-                                \"description\": \"A sort parameter (e.g., timestamp:asc). If the Sort property is left blank, then the results will be retrieved in document order.\",\n-                                \"displayName\": \"Sort\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"scroll-es-sort\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"scroll-es-type\": {\n-                                \"description\": \"The type of document (if unset, the query will be against all types in the _index). This should be unset or '_doc' for Elasticsearch 7.0+.\",\n-                                \"displayName\": \"Type\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"scroll-es-type\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            }\n-                        },\n-                        \"sideEffectFree\": false,\n-                        \"stateful\": {\n-                            \"description\": \"After each successful scroll page, the latest scroll_id is persisted in scrollId as input for the next scroll call.  Once the entire query is complete, finishedQuery state will be set to true, and the processor will not execute unless this is cleared.\",\n-                            \"scopes\": [\n-                                \"LOCAL\"\n-                            ]\n-                        },\n-                        \"supportedRelationships\": [\n-                            {\n-                                \"description\": \"All FlowFiles that are read from Elasticsearch are routed to this relationship.\",\n-                                \"name\": \"success\"\n-                            },\n-                            {\n-                                \"description\": \"All FlowFiles that cannot be read from Elasticsearch are routed to this relationship. Note that only incoming flow files will be routed to failure.\",\n-                                \"name\": \"failure\"\n-                            }\n-                        ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\",\n-                            \"EVENT_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": true,\n-                        \"supportsDynamicProperties\": true,\n-                        \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": true,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"elasticsearch\",\n-                            \"get\",\n-                            \"http\",\n-                            \"query\",\n-                            \"read\",\n-                            \"scroll\"\n-                        ],\n-                        \"triggerSerially\": false,\n-                        \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.elasticsearch.ScrollElasticsearchHttp\",\n-                        \"typeDescription\": \"Scrolls through an Elasticsearch query using the specified connection properties. This processor is intended to be run on the primary node, and is designed for scrolling through huge result sets, as in the case of a reindex.  The state must be cleared before another query can be run.  Each page of results is returned, wrapped in a JSON object like so: { \\\"hits\\\" : [ <doc1>, <doc2>, <docn> ] }.  Note that the full body of each page of documents will be read into memory before being written to a Flow File for transfer.\",\n-                        \"version\": \"1.27.0\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"The Elasticsearch index containing the document\",\n-                                \"name\": \"es.index\"\n-                            },\n-                            {\n-                                \"description\": \"The Elasticsearch document type\",\n-                                \"name\": \"es.type\"\n-                            }\n-                        ]\n-                    }\n-                ],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"1.27.0\"\n-        },\n-        {\n-            \"artifact\": \"nifi-stateful-analysis-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [],\n-                \"processors\": [\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-stateful-analysis-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"e0c4461\"\n-                        },\n-                        \"defaultBulletinLevel\": \"WARN\",\n-                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": 1,\n-                            \"TIMER_DRIVEN\": 1\n-                        },\n-                        \"defaultPenaltyDuration\": \"30 sec\",\n-                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"0 sec\"\n-                        },\n-                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n-                        \"defaultYieldDuration\": \"1 sec\",\n-                        \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_REQUIRED\",\n-                        \"primaryNodeOnly\": false,\n-                        \"propertyDescriptors\": {\n-                            \"Sub-window length\": {\n-                                \"description\": \"When set, values will be batched into sub-windows of the set length. This allows for much larger length total windows to be set but sacrifices some precision. If this is not set (or is 0) then each value is stored in state with the timestamp of when it was received. After the length of time stated in Time window elaspes the value will be removed. If this is set, values will be batched together every X amount of time (where X is the time period set for this property) and removed all at once.\",\n-                                \"displayName\": \"Sub-window length\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Sub-window length\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Time window\": {\n-                                \"description\": \"The time window on which to calculate the rolling window.\",\n-                                \"displayName\": \"Time window\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Time window\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Value to track\": {\n-                                \"description\": \"The expression on which to evaluate each FlowFile. The result of the expression will be added to the rolling window value.\",\n-                                \"displayName\": \"Value to track\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Value to track\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            }\n-                        },\n-                        \"sideEffectFree\": false,\n-                        \"stateful\": {\n-                            \"description\": \"Store the values backing the rolling window. This includes storing the individual values and their time-stamps or the batches of values and their counts.\",\n-                            \"scopes\": [\n-                                \"LOCAL\"\n-                            ]\n-                        },\n-                        \"supportedRelationships\": [\n-                            {\n-                                \"description\": \"When state fails to save when processing a FlowFile, the FlowFile is routed here.\",\n-                                \"name\": \"set state fail\"\n-                            },\n-                            {\n-                                \"description\": \"All FlowFiles are successfully processed are routed here\",\n-                                \"name\": \"success\"\n-                            },\n-                            {\n-                                \"description\": \"When a FlowFile fails for a reason other than failing to set state it is routed here.\",\n-                                \"name\": \"failure\"\n-                            }\n-                        ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": false,\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": false,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"Attribute Expression Language\",\n-                            \"data science\",\n-                            \"rolling\",\n-                            \"state\",\n-                            \"window\"\n-                        ],\n-                        \"triggerSerially\": true,\n-                        \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.stateful.analysis.AttributeRollingWindow\",\n-                        \"typeDescription\": \"Track a Rolling Window based on evaluating an Expression Language expression on each FlowFile and add that value to the processor's state. Each FlowFile will be emitted with the count of FlowFiles and total aggregate value of values processed in the current time window.\",\n-                        \"version\": \"1.27.0\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"The rolling window value (sum of all the values stored).\",\n-                                \"name\": \"rolling_window_value\"\n-                            },\n-                            {\n-                                \"description\": \"The count of the number of FlowFiles seen in the rolling window.\",\n-                                \"name\": \"rolling_window_count\"\n-                            },\n-                            {\n-                                \"description\": \"The mean of the FlowFiles seen in the rolling window.\",\n-                                \"name\": \"rolling_window_mean\"\n-                            },\n-                            {\n-                                \"description\": \"The variance of the FlowFiles seen in the rolling window.\",\n-                                \"name\": \"rolling_window_variance\"\n-                            },\n-                            {\n-                                \"description\": \"The standard deviation (positive square root of the variance) of the FlowFiles seen in the rolling window.\",\n-                                \"name\": \"rolling_window_stddev\"\n-                            }\n-                        ]\n-                    }\n-                ],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"1.27.0\"\n-        },\n-        {\n-            \"artifact\": \"nifi-cybersecurity-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [],\n-                \"processors\": [\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-cybersecurity-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"e0c4461\"\n-                        },\n-                        \"defaultBulletinLevel\": \"WARN\",\n-                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": 1,\n-                            \"EVENT_DRIVEN\": 0,\n-                            \"TIMER_DRIVEN\": 1\n-                        },\n-                        \"defaultPenaltyDuration\": \"30 sec\",\n-                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"0 sec\"\n-                        },\n-                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n-                        \"defaultYieldDuration\": \"1 sec\",\n-                        \"deprecated\": true,\n-                        \"deprecationReason\": \"Unmaintained and planned for removal in version 2.0\",\n-                        \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_REQUIRED\",\n-                        \"primaryNodeOnly\": false,\n-                        \"propertyDescriptors\": {\n-                            \"ATTRIBUTE_NAME\": {\n-                                \"defaultValue\": \"fuzzyhash.value\",\n-                                \"description\": \"The name of the FlowFile Attribute that should hold the Fuzzy Hash Value\",\n-                                \"displayName\": \"Hash Attribute Name\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"ATTRIBUTE_NAME\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"HASH_ALGORITHM\": {\n-                                \"allowableValues\": [\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"America/Ciudad_Juarez\",\n+                                        \"value\": \"America/Ciudad_Juarez\"\n+                                    },\n                                     {\n-                                        \"description\": \"Uses ssdeep / SpamSum 'context triggered piecewise hash'.\",\n-                                        \"displayName\": \"ssdeep\",\n-                                        \"value\": \"ssdeep\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"America/Coral_Harbour\",\n+                                        \"value\": \"America/Coral_Harbour\"\n                                     },\n                                     {\n-                                        \"description\": \"Uses TLSH (Trend 'Locality Sensitive Hash'). Note: FlowFile Content must be at least 512 characters long\",\n-                                        \"displayName\": \"tlsh\",\n-                                        \"value\": \"tlsh\"\n-                                    }\n-                                ],\n-                                \"description\": \"The hashing algorithm utilised\",\n-                                \"displayName\": \"Hashing Algorithm\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"HASH_ALGORITHM\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"HASH_LIST_FILE\": {\n-                                \"description\": \"Path to the file containing hashes to be validated against\",\n-                                \"displayName\": \"Hash List Source File\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"HASH_LIST_FILE\",\n-                                \"required\": true,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"SINGLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\"\n-                                    ]\n-                                },\n-                                \"sensitive\": false\n-                            },\n-                            \"MATCHING_MODE\": {\n-                                \"allowableValues\": [\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"America/Cordoba\",\n+                                        \"value\": \"America/Cordoba\"\n+                                    },\n                                     {\n-                                        \"description\": \"Send FlowFile to matched after the first match above threshold\",\n-                                        \"displayName\": \"single\",\n-                                        \"value\": \"single\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"America/Costa_Rica\",\n+                                        \"value\": \"America/Costa_Rica\"\n                                     },\n                                     {\n-                                        \"description\": \"Iterate full list of hashes before deciding to send FlowFile to matched or unmatched\",\n-                                        \"displayName\": \"multi-match\",\n-                                        \"value\": \"multi-match\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"single\",\n-                                \"description\": \"Defines if the Processor should try to match as many entries as possible (multi-match) or if it should stop after the first match (single)\",\n-                                \"displayName\": \"Matching Mode\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"MATCHING_MODE\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"MATCH_THRESHOLD\": {\n-                                \"description\": \"The similarity score must exceed or be equal to in order formatch to be considered true. Refer to Additional Information for differences between TLSH and SSDEEP scores and how they relate to this property.\",\n-                                \"displayName\": \"Match Threshold\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"MATCH_THRESHOLD\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            }\n-                        },\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.processors.cybersecurity.FuzzyHashContent\"\n-                        ],\n-                        \"sideEffectFree\": true,\n-                        \"supportedRelationships\": [\n-                            {\n-                                \"description\": \"Any FlowFile that cannot be matched, e.g. (lacks the attribute) will be sent to this Relationship.\",\n-                                \"name\": \"failure\"\n-                            },\n-                            {\n-                                \"description\": \"Any FlowFile that cannot be matched to an existing hash will be sent to this Relationship.\",\n-                                \"name\": \"not-found\"\n-                            },\n-                            {\n-                                \"description\": \"Any FlowFile that is successfully matched to an existing hash will be sent to this Relationship.\",\n-                                \"name\": \"found\"\n-                            }\n-                        ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\",\n-                            \"EVENT_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": true,\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": true,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"cyber-security\",\n-                            \"fuzzy-hashing\",\n-                            \"hashing\"\n-                        ],\n-                        \"triggerSerially\": false,\n-                        \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.cybersecurity.CompareFuzzyHash\",\n-                        \"typeDescription\": \"Compares an attribute containing a Fuzzy Hash against a file containing a list of fuzzy hashes, appending an attribute to the FlowFile in case of a successful match.\",\n-                        \"version\": \"1.27.0\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"The match that resembles the attribute specified by the <Hash Attribute Name> property. Note that: 'XXX' gets replaced with the <Hash Attribute Name>\",\n-                                \"name\": \"XXXX.N.match\"\n-                            },\n-                            {\n-                                \"description\": \"The similarity score between this flowfileand its match of the same number N. Note that: 'XXX' gets replaced with the <Hash Attribute Name>\",\n-                                \"name\": \"XXXX.N.similarity\"\n-                            }\n-                        ]\n-                    },\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-cybersecurity-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"e0c4461\"\n-                        },\n-                        \"defaultBulletinLevel\": \"WARN\",\n-                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": 1,\n-                            \"EVENT_DRIVEN\": 0,\n-                            \"TIMER_DRIVEN\": 1\n-                        },\n-                        \"defaultPenaltyDuration\": \"30 sec\",\n-                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"0 sec\"\n-                        },\n-                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n-                        \"defaultYieldDuration\": \"1 sec\",\n-                        \"deprecated\": true,\n-                        \"deprecationReason\": \"Unmaintained and planned for removal in version 2.0\",\n-                        \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_REQUIRED\",\n-                        \"primaryNodeOnly\": false,\n-                        \"propertyDescriptors\": {\n-                            \"ATTRIBUTE_NAME\": {\n-                                \"defaultValue\": \"fuzzyhash.value\",\n-                                \"description\": \"The name of the FlowFile Attribute that should hold the Fuzzy Hash Value\",\n-                                \"displayName\": \"Hash Attribute Name\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"ATTRIBUTE_NAME\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"HASH_ALGORITHM\": {\n-                                \"allowableValues\": [\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"America/Creston\",\n+                                        \"value\": \"America/Creston\"\n+                                    },\n                                     {\n-                                        \"description\": \"Uses ssdeep / SpamSum 'context triggered piecewise hash'.\",\n-                                        \"displayName\": \"ssdeep\",\n-                                        \"value\": \"ssdeep\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"America/Cuiaba\",\n+                                        \"value\": \"America/Cuiaba\"\n                                     },\n                                     {\n-                                        \"description\": \"Uses TLSH (Trend 'Locality Sensitive Hash'). Note: FlowFile Content must be at least 512 characters long\",\n-                                        \"displayName\": \"tlsh\",\n-                                        \"value\": \"tlsh\"\n-                                    }\n-                                ],\n-                                \"description\": \"The hashing algorithm utilised\",\n-                                \"displayName\": \"Hashing Algorithm\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"HASH_ALGORITHM\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            }\n-                        },\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.processors.cybersecurity.CompareFuzzyHash\",\n-                            \"org.apache.nifi.processors.standard.HashContent\"\n-                        ],\n-                        \"sideEffectFree\": true,\n-                        \"supportedRelationships\": [\n-                            {\n-                                \"description\": \"Any FlowFile that is successfully hashed will be sent to this Relationship.\",\n-                                \"name\": \"success\"\n-                            },\n-                            {\n-                                \"description\": \"Any FlowFile that is successfully hashed will be sent to this Relationship.\",\n-                                \"name\": \"failure\"\n-                            }\n-                        ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\",\n-                            \"EVENT_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": true,\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": true,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"cyber-security\",\n-                            \"fuzzy-hashing\",\n-                            \"hashing\"\n-                        ],\n-                        \"triggerSerially\": false,\n-                        \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.cybersecurity.FuzzyHashContent\",\n-                        \"typeDescription\": \"Calculates a fuzzy/locality-sensitive hash value for the Content of a FlowFile and puts that hash value on the FlowFile as an attribute whose name is determined by the <Hash Attribute Name> property.Note: this processor only offers non-cryptographic hash algorithms. And it should be not be seen as a replacement to the HashContent processor.Note: The underlying library loads the entirety of the streamed content into and performs result evaluations in memory. Accordingly, it is important to consider the anticipated profile of content being evaluated by this processor and the hardware supporting it especially when working against large files.\",\n-                        \"version\": \"1.27.0\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"This Processor adds an attribute whose value is the result of Hashing the existing FlowFile content. The name of this attribute is specified by the <Hash Attribute Name> property\",\n-                                \"name\": \"<Hash Attribute Name>\"\n-                            }\n-                        ]\n-                    }\n-                ],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"1.27.0\"\n-        },\n-        {\n-            \"artifact\": \"nifi-hwx-schema-registry-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-hwx-schema-registry-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"e0c4461\"\n-                        },\n-                        \"deprecated\": true,\n-                        \"deprecationReason\": \"This controller service is deprecated and will be removed in NiFi 2.x.\",\n-                        \"group\": \"org.apache.nifi\",\n-                        \"propertyDescriptors\": {\n-                            \"basic-auth-password\": {\n-                                \"dependencies\": [\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"America/Curacao\",\n+                                        \"value\": \"America/Curacao\"\n+                                    },\n                                     {\n-                                        \"propertyDisplayName\": \"SSL Context Service\",\n-                                        \"propertyName\": \"ssl-context-service\"\n-                                    }\n-                                ],\n-                                \"description\": \"The password to use for basic authentication when the Schema Registry is behind a proxy such as Apache Knox.\",\n-                                \"displayName\": \"Basic Authentication Password\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"basic-auth-password\",\n-                                \"required\": false,\n-                                \"sensitive\": true\n-                            },\n-                            \"basic-auth-username\": {\n-                                \"dependencies\": [\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"America/Danmarkshavn\",\n+                                        \"value\": \"America/Danmarkshavn\"\n+                                    },\n                                     {\n-                                        \"propertyDisplayName\": \"SSL Context Service\",\n-                                        \"propertyName\": \"ssl-context-service\"\n-                                    }\n-                                ],\n-                                \"description\": \"The username to use for basic authentication when the Schema Registry is behind a proxy such as Apache Knox.\",\n-                                \"displayName\": \"Basic Authentication Username\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"basic-auth-username\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"cache-expiration\": {\n-                                \"defaultValue\": \"1 hour\",\n-                                \"description\": \"Specifies how long a Schema that is cached should remain in the cache. Once this time period elapses, a cached version of a schema will no longer be used, and the service will have to communicate with the Hortonworks Schema Registry again in order to obtain the schema.\",\n-                                \"displayName\": \"Cache Expiration\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"cache-expiration\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"cache-size\": {\n-                                \"defaultValue\": \"1000\",\n-                                \"description\": \"Specifies how many Schemas should be cached from the Hortonworks Schema Registry\",\n-                                \"displayName\": \"Cache Size\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"cache-size\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"kerberos-credentials-service\": {\n-                                \"description\": \"Specifies the Kerberos Credentials Controller Service that should be used for authenticating with Kerberos\",\n-                                \"displayName\": \"Kerberos Credentials Service\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"kerberos-credentials-service\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.kerberos.KerberosCredentialsService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            },\n-                            \"kerberos-password\": {\n-                                \"description\": \"The password for the kerberos principal when not using the kerberos credentials service\",\n-                                \"displayName\": \"Kerberos Password\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"kerberos-password\",\n-                                \"required\": false,\n-                                \"sensitive\": true\n-                            },\n-                            \"kerberos-principal\": {\n-                                \"description\": \"The kerberos principal to authenticate with when not using the kerberos credentials service\",\n-                                \"displayName\": \"Kerberos Principal\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"kerberos-principal\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"ssl-context-service\": {\n-                                \"description\": \"Specifies the SSL Context Service to use for communicating with Schema Registry.\",\n-                                \"displayName\": \"SSL Context Service\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"ssl-context-service\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            },\n-                            \"url\": {\n-                                \"description\": \"URL of the schema registry that this Controller Service should connect to, including version. For example, http://localhost:9090/api/v1\",\n-                                \"displayName\": \"Schema Registry URL\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"url\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            }\n-                        },\n-                        \"providedApiImplementations\": [\n-                            {\n-                                \"artifact\": \"nifi-standard-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.schemaregistry.services.SchemaRegistry\",\n-                                \"version\": \"1.27.0\"\n-                            }\n-                        ],\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"avro\",\n-                            \"hortonworks\",\n-                            \"hwx\",\n-                            \"registry\",\n-                            \"schema\"\n-                        ],\n-                        \"type\": \"org.apache.nifi.schemaregistry.hortonworks.HortonworksSchemaRegistry\",\n-                        \"typeDescription\": \"Provides a Schema Registry Service that interacts with a Hortonworks Schema Registry, available at https://github.com/hortonworks/registry\",\n-                        \"version\": \"1.27.0\"\n-                    }\n-                ],\n-                \"processors\": [],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"1.27.0\"\n-        },\n-        {\n-            \"artifact\": \"nifi-record-serialization-services-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-record-serialization-services-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"e0c4461\"\n-                        },\n-                        \"group\": \"org.apache.nifi\",\n-                        \"propertyDescriptors\": {\n-                            \"cache-size\": {\n-                                \"defaultValue\": \"1000\",\n-                                \"description\": \"Specifies how many Schemas should be cached\",\n-                                \"displayName\": \"Cache Size\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"cache-size\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"schema-access-strategy\": {\n-                                \"allowableValues\": [\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"America/Dawson\",\n+                                        \"value\": \"America/Dawson\"\n+                                    },\n                                     {\n-                                        \"description\": \"The name of the Schema to use is specified by the 'Schema Name' Property. The value of this property is used to lookup the Schema in the configured Schema Registry service.\",\n-                                        \"displayName\": \"Use 'Schema Name' Property\",\n-                                        \"value\": \"schema-name\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"America/Dawson_Creek\",\n+                                        \"value\": \"America/Dawson_Creek\"\n                                     },\n                                     {\n-                                        \"description\": \"The text of the Schema itself is specified by the 'Schema Text' Property. The value of this property must be a valid Avro Schema. If Expression Language is used, the value of the 'Schema Text' property must be valid after substituting the expressions.\",\n-                                        \"displayName\": \"Use 'Schema Text' Property\",\n-                                        \"value\": \"schema-text-property\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"America/Denver\",\n+                                        \"value\": \"America/Denver\"\n                                     },\n                                     {\n-                                        \"description\": \"The FlowFile contains 3 Attributes that will be used to lookup a Schema from the configured Schema Registry: 'schema.identifier', 'schema.version', and 'schema.protocol.version'\",\n-                                        \"displayName\": \"HWX Schema Reference Attributes\",\n-                                        \"value\": \"hwx-schema-ref-attributes\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"America/Detroit\",\n+                                        \"value\": \"America/Detroit\"\n                                     },\n                                     {\n-                                        \"description\": \"The content of the FlowFile contains a reference to a schema in the Schema Registry service. The reference is encoded as a single byte indicating the 'protocol version', followed by 8 bytes indicating the schema identifier, and finally 4 bytes indicating the schema version, as per the Hortonworks Schema Registry serializers and deserializers, found at https://github.com/hortonworks/registry\",\n-                                        \"displayName\": \"HWX Content-Encoded Schema Reference\",\n-                                        \"value\": \"hwx-content-encoded-schema\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"America/Dominica\",\n+                                        \"value\": \"America/Dominica\"\n                                     },\n                                     {\n-                                        \"description\": \"The content of the FlowFile contains a reference to a schema in the Schema Registry service. The reference is encoded as a single 'Magic Byte' followed by 4 bytes representing the identifier of the schema, as outlined at http://docs.confluent.io/current/schema-registry/docs/serializer-formatter.html. This is based on version 3.2.x of the Confluent Schema Registry.\",\n-                                        \"displayName\": \"Confluent Content-Encoded Schema Reference\",\n-                                        \"value\": \"confluent-encoded\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"America/Edmonton\",\n+                                        \"value\": \"America/Edmonton\"\n                                     },\n                                     {\n-                                        \"description\": \"The FlowFile has the Avro Schema embedded within the content, and this schema will be used.\",\n-                                        \"displayName\": \"Use Embedded Avro Schema\",\n-                                        \"value\": \"embedded-avro-schema\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"embedded-avro-schema\",\n-                                \"description\": \"Specifies how to obtain the schema that is to be used for interpreting the data.\",\n-                                \"displayName\": \"Schema Access Strategy\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"schema-access-strategy\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"schema-branch\": {\n-                                \"dependencies\": [\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"America/Eirunepe\",\n+                                        \"value\": \"America/Eirunepe\"\n+                                    },\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"schema-name\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n-                                        \"propertyName\": \"schema-access-strategy\"\n-                                    }\n-                                ],\n-                                \"description\": \"Specifies the name of the branch to use when looking up the schema in the Schema Registry property. If the chosen Schema Registry does not support branching, this value will be ignored.\",\n-                                \"displayName\": \"Schema Branch\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"schema-branch\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"schema-name\": {\n-                                \"defaultValue\": \"${schema.name}\",\n-                                \"dependencies\": [\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"America/El_Salvador\",\n+                                        \"value\": \"America/El_Salvador\"\n+                                    },\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"schema-name\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n-                                        \"propertyName\": \"schema-access-strategy\"\n-                                    }\n-                                ],\n-                                \"description\": \"Specifies the name of the schema to lookup in the Schema Registry property\",\n-                                \"displayName\": \"Schema Name\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"schema-name\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"schema-registry\": {\n-                                \"dependencies\": [\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"America/Ensenada\",\n+                                        \"value\": \"America/Ensenada\"\n+                                    },\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"confluent-encoded\",\n-                                            \"schema-name\",\n-                                            \"hwx-schema-ref-attributes\",\n-                                            \"hwx-content-encoded-schema\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n-                                        \"propertyName\": \"schema-access-strategy\"\n-                                    }\n-                                ],\n-                                \"description\": \"Specifies the Controller Service to use for the Schema Registry\",\n-                                \"displayName\": \"Schema Registry\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"schema-registry\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.schemaregistry.services.SchemaRegistry\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            },\n-                            \"schema-text\": {\n-                                \"defaultValue\": \"${avro.schema}\",\n-                                \"dependencies\": [\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"America/Fort_Nelson\",\n+                                        \"value\": \"America/Fort_Nelson\"\n+                                    },\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"schema-text-property\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n-                                        \"propertyName\": \"schema-access-strategy\"\n-                                    }\n-                                ],\n-                                \"description\": \"The text of an Avro-formatted Schema\",\n-                                \"displayName\": \"Schema Text\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"schema-text\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"schema-version\": {\n-                                \"dependencies\": [\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"America/Fort_Wayne\",\n+                                        \"value\": \"America/Fort_Wayne\"\n+                                    },\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"schema-name\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n-                                        \"propertyName\": \"schema-access-strategy\"\n-                                    }\n-                                ],\n-                                \"description\": \"Specifies the version of the schema to lookup in the Schema Registry. If not specified then the latest version of the schema will be retrieved.\",\n-                                \"displayName\": \"Schema Version\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"schema-version\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            }\n-                        },\n-                        \"providedApiImplementations\": [\n-                            {\n-                                \"artifact\": \"nifi-standard-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n-                                \"version\": \"1.27.0\"\n-                            }\n-                        ],\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"avro\",\n-                            \"comma\",\n-                            \"delimited\",\n-                            \"parse\",\n-                            \"reader\",\n-                            \"record\",\n-                            \"row\",\n-                            \"separated\",\n-                            \"values\"\n-                        ],\n-                        \"type\": \"org.apache.nifi.avro.AvroReader\",\n-                        \"typeDescription\": \"Parses Avro data and returns each Avro record as an separate Record object. The Avro data may contain the schema itself, or the schema can be externalized and accessed by one of the methods offered by the 'Schema Access Strategy' property.\",\n-                        \"version\": \"1.27.0\"\n-                    },\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-record-serialization-services-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"e0c4461\"\n-                        },\n-                        \"group\": \"org.apache.nifi\",\n-                        \"propertyDescriptors\": {\n-                            \"Schema Write Strategy\": {\n-                                \"allowableValues\": [\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"America/Fortaleza\",\n+                                        \"value\": \"America/Fortaleza\"\n+                                    },\n                                     {\n-                                        \"description\": \"The FlowFile will have the Avro schema embedded into the content, as is typical with Avro\",\n-                                        \"displayName\": \"Embed Avro Schema\",\n-                                        \"value\": \"avro-embedded\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"America/Glace_Bay\",\n+                                        \"value\": \"America/Glace_Bay\"\n                                     },\n                                     {\n-                                        \"description\": \"Do not add any schema-related information to the FlowFile.\",\n-                                        \"displayName\": \"Do Not Write Schema\",\n-                                        \"value\": \"no-schema\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"America/Godthab\",\n+                                        \"value\": \"America/Godthab\"\n                                     },\n                                     {\n-                                        \"description\": \"The FlowFile will be given an attribute named 'schema.name' and this attribute will indicate the name of the schema in the Schema Registry. Note that ifthe schema for a record is not obtained from a Schema Registry, then no attribute will be added.\",\n-                                        \"displayName\": \"Set 'schema.name' Attribute\",\n-                                        \"value\": \"schema-name\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"America/Goose_Bay\",\n+                                        \"value\": \"America/Goose_Bay\"\n                                     },\n                                     {\n-                                        \"description\": \"The FlowFile will be given an attribute named 'avro.schema' and this attribute will contain the Avro Schema that describes the records in the FlowFile. The contents of the FlowFile need not be Avro, but the text of the schema will be used.\",\n-                                        \"displayName\": \"Set 'avro.schema' Attribute\",\n-                                        \"value\": \"full-schema-attribute\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"America/Grand_Turk\",\n+                                        \"value\": \"America/Grand_Turk\"\n                                     },\n                                     {\n-                                        \"description\": \"The FlowFile will be given a set of 3 attributes to describe the schema: 'schema.identifier', 'schema.version', and 'schema.protocol.version'. Note that if the schema for a record does not contain the necessary identifier and version, an Exception will be thrown when attempting to write the data.\",\n-                                        \"displayName\": \"HWX Schema Reference Attributes\",\n-                                        \"value\": \"hwx-schema-ref-attributes\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"America/Grenada\",\n+                                        \"value\": \"America/Grenada\"\n                                     },\n                                     {\n-                                        \"description\": \"The content of the FlowFile will contain a reference to a schema in the Schema Registry service. The reference is encoded as a single byte indicating the 'protocol version', followed by 8 bytes indicating the schema identifier, and finally 4 bytes indicating the schema version, as per the Hortonworks Schema Registry serializers and deserializers, as found at https://github.com/hortonworks/registry. This will be prepended to each FlowFile. Note that if the schema for a record does not contain the necessary identifier and version, an Exception will be thrown when attempting to write the data.\",\n-                                        \"displayName\": \"HWX Content-Encoded Schema Reference\",\n-                                        \"value\": \"hwx-content-encoded-schema\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"America/Guadeloupe\",\n+                                        \"value\": \"America/Guadeloupe\"\n                                     },\n                                     {\n-                                        \"description\": \"The content of the FlowFile will contain a reference to a schema in the Schema Registry service. The reference is encoded as a single 'Magic Byte' followed by 4 bytes representing the identifier of the schema, as outlined at http://docs.confluent.io/current/schema-registry/docs/serializer-formatter.html. This will be prepended to each FlowFile. Note that if the schema for a record does not contain the necessary identifier and version, an Exception will be thrown when attempting to write the data. This is based on the encoding used by version 3.2.x of the Confluent Schema Registry.\",\n-                                        \"displayName\": \"Confluent Schema Registry Reference\",\n-                                        \"value\": \"confluent-encoded\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"avro-embedded\",\n-                                \"description\": \"Specifies how the schema for a Record should be added to the data.\",\n-                                \"displayName\": \"Schema Write Strategy\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Schema Write Strategy\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"cache-size\": {\n-                                \"defaultValue\": \"1000\",\n-                                \"description\": \"Specifies how many Schemas should be cached\",\n-                                \"displayName\": \"Cache Size\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"cache-size\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"compression-format\": {\n-                                \"allowableValues\": [\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"America/Guatemala\",\n+                                        \"value\": \"America/Guatemala\"\n+                                    },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"BZIP2\",\n-                                        \"value\": \"BZIP2\"\n+                                        \"displayName\": \"America/Guayaquil\",\n+                                        \"value\": \"America/Guayaquil\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"DEFLATE\",\n-                                        \"value\": \"DEFLATE\"\n+                                        \"displayName\": \"America/Guyana\",\n+                                        \"value\": \"America/Guyana\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"NONE\",\n-                                        \"value\": \"NONE\"\n+                                        \"displayName\": \"America/Halifax\",\n+                                        \"value\": \"America/Halifax\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"SNAPPY\",\n-                                        \"value\": \"SNAPPY\"\n+                                        \"displayName\": \"America/Havana\",\n+                                        \"value\": \"America/Havana\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"LZO\",\n-                                        \"value\": \"LZO\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"NONE\",\n-                                \"description\": \"Compression type to use when writing Avro files. Default is None.\",\n-                                \"displayName\": \"Compression Format\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"compression-format\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"encoder-pool-size\": {\n-                                \"defaultValue\": \"32\",\n-                                \"description\": \"Avro Writers require the use of an Encoder. Creation of Encoders is expensive, but once created, they can be reused. This property controls the maximum number of Encoders that can be pooled and reused. Setting this value too small can result in degraded performance, but setting it higher can result in more heap being used. This property is ignored if the Avro Writer is configured with a Schema Write Strategy of 'Embed Avro Schema'.\",\n-                                \"displayName\": \"Encoder Pool Size\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"encoder-pool-size\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"schema-access-strategy\": {\n-                                \"allowableValues\": [\n+                                        \"displayName\": \"America/Hermosillo\",\n+                                        \"value\": \"America/Hermosillo\"\n+                                    },\n                                     {\n-                                        \"description\": \"The schema used to write records will be the same schema that was given to the Record when the Record was created.\",\n-                                        \"displayName\": \"Inherit Record Schema\",\n-                                        \"value\": \"inherit-record-schema\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"America/Indiana/Indianapolis\",\n+                                        \"value\": \"America/Indiana/Indianapolis\"\n                                     },\n                                     {\n-                                        \"description\": \"The name of the Schema to use is specified by the 'Schema Name' Property. The value of this property is used to lookup the Schema in the configured Schema Registry service.\",\n-                                        \"displayName\": \"Use 'Schema Name' Property\",\n-                                        \"value\": \"schema-name\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"America/Indiana/Knox\",\n+                                        \"value\": \"America/Indiana/Knox\"\n                                     },\n                                     {\n-                                        \"description\": \"The text of the Schema itself is specified by the 'Schema Text' Property. The value of this property must be a valid Avro Schema. If Expression Language is used, the value of the 'Schema Text' property must be valid after substituting the expressions.\",\n-                                        \"displayName\": \"Use 'Schema Text' Property\",\n-                                        \"value\": \"schema-text-property\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"inherit-record-schema\",\n-                                \"description\": \"Specifies how to obtain the schema that is to be used for interpreting the data.\",\n-                                \"displayName\": \"Schema Access Strategy\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"schema-access-strategy\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"schema-branch\": {\n-                                \"dependencies\": [\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"America/Indiana/Marengo\",\n+                                        \"value\": \"America/Indiana/Marengo\"\n+                                    },\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"schema-name\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n-                                        \"propertyName\": \"schema-access-strategy\"\n-                                    }\n-                                ],\n-                                \"description\": \"Specifies the name of the branch to use when looking up the schema in the Schema Registry property. If the chosen Schema Registry does not support branching, this value will be ignored.\",\n-                                \"displayName\": \"Schema Branch\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"schema-branch\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"schema-cache\": {\n-                                \"description\": \"Specifies a Schema Cache to add the Record Schema to so that Record Readers can quickly lookup the schema.\",\n-                                \"displayName\": \"Schema Cache\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"schema-cache\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.serialization.RecordSchemaCacheService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            },\n-                            \"schema-name\": {\n-                                \"defaultValue\": \"${schema.name}\",\n-                                \"dependencies\": [\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"America/Indiana/Petersburg\",\n+                                        \"value\": \"America/Indiana/Petersburg\"\n+                                    },\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"schema-name\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n-                                        \"propertyName\": \"schema-access-strategy\"\n-                                    }\n-                                ],\n-                                \"description\": \"Specifies the name of the schema to lookup in the Schema Registry property\",\n-                                \"displayName\": \"Schema Name\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"schema-name\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"schema-protocol-version\": {\n-                                \"defaultValue\": \"1\",\n-                                \"dependencies\": [\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"America/Indiana/Tell_City\",\n+                                        \"value\": \"America/Indiana/Tell_City\"\n+                                    },\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"hwx-schema-ref-attributes\",\n-                                            \"hwx-content-encoded-schema\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Schema Write Strategy\",\n-                                        \"propertyName\": \"Schema Write Strategy\"\n-                                    }\n-                                ],\n-                                \"description\": \"The protocol version to be used for Schema Write Strategies that require a protocol version, such as Hortonworks Schema Registry strategies. Valid protocol versions for Hortonworks Schema Registry are integer values 1, 2, or 3.\",\n-                                \"displayName\": \"Schema Protocol Version\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"schema-protocol-version\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"schema-registry\": {\n-                                \"dependencies\": [\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"America/Indiana/Vevay\",\n+                                        \"value\": \"America/Indiana/Vevay\"\n+                                    },\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"confluent-encoded\",\n-                                            \"schema-name\",\n-                                            \"hwx-schema-ref-attributes\",\n-                                            \"hwx-content-encoded-schema\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n-                                        \"propertyName\": \"schema-access-strategy\"\n-                                    }\n-                                ],\n-                                \"description\": \"Specifies the Controller Service to use for the Schema Registry\",\n-                                \"displayName\": \"Schema Registry\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"schema-registry\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.schemaregistry.services.SchemaRegistry\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            },\n-                            \"schema-text\": {\n-                                \"defaultValue\": \"${avro.schema}\",\n-                                \"dependencies\": [\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"America/Indiana/Vincennes\",\n+                                        \"value\": \"America/Indiana/Vincennes\"\n+                                    },\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"schema-text-property\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n-                                        \"propertyName\": \"schema-access-strategy\"\n-                                    }\n-                                ],\n-                                \"description\": \"The text of an Avro-formatted Schema\",\n-                                \"displayName\": \"Schema Text\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"schema-text\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"schema-version\": {\n-                                \"dependencies\": [\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"America/Indiana/Winamac\",\n+                                        \"value\": \"America/Indiana/Winamac\"\n+                                    },\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"schema-name\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n-                                        \"propertyName\": \"schema-access-strategy\"\n-                                    }\n-                                ],\n-                                \"description\": \"Specifies the version of the schema to lookup in the Schema Registry. If not specified then the latest version of the schema will be retrieved.\",\n-                                \"displayName\": \"Schema Version\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"schema-version\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            }\n-                        },\n-                        \"providedApiImplementations\": [\n-                            {\n-                                \"artifact\": \"nifi-standard-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n-                                \"version\": \"1.27.0\"\n-                            }\n-                        ],\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"avro\",\n-                            \"record\",\n-                            \"recordset\",\n-                            \"result\",\n-                            \"row\",\n-                            \"serializer\",\n-                            \"set\",\n-                            \"writer\"\n-                        ],\n-                        \"type\": \"org.apache.nifi.avro.AvroRecordSetWriter\",\n-                        \"typeDescription\": \"Writes the contents of a RecordSet in Binary Avro format.\",\n-                        \"version\": \"1.27.0\"\n-                    },\n-                    {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-record-serialization-services-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"e0c4461\"\n-                        },\n-                        \"group\": \"org.apache.nifi\",\n-                        \"propertyDescriptors\": {\n-                            \"accept-empty-extensions\": {\n-                                \"allowableValues\": [\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"America/Indianapolis\",\n+                                        \"value\": \"America/Indianapolis\"\n+                                    },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"displayName\": \"America/Inuvik\",\n+                                        \"value\": \"America/Inuvik\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"If set to true, empty extensions will be accepted and will be associated to a null value.\",\n-                                \"displayName\": \"Accept empty extensions\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"accept-empty-extensions\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"datetime-representation\": {\n-                                \"defaultValue\": \"en-US\",\n-                                \"description\": \"The IETF BCP 47 representation of the Locale to be used when parsing date fields with long or short month names (e.g. may <en-US> vs. mai. <fr-FR>. The defaultvalue is generally safe. Only change if having issues parsing CEF messages\",\n-                                \"displayName\": \"DateTime Locale\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"datetime-representation\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"inference-strategy\": {\n-                                \"allowableValues\": [\n+                                        \"displayName\": \"America/Iqaluit\",\n+                                        \"value\": \"America/Iqaluit\"\n+                                    },\n                                     {\n-                                        \"description\": \"Includes only CEF header fields into the inferred schema.\",\n-                                        \"displayName\": \"Headers only\",\n-                                        \"value\": \"headers-only\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"America/Jamaica\",\n+                                        \"value\": \"America/Jamaica\"\n                                     },\n                                     {\n-                                        \"description\": \"Includes the CEF header and extension fields to the schema, but not the custom extensions.\",\n-                                        \"displayName\": \"Headers and extensions\",\n-                                        \"value\": \"headers-and-extensions\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"America/Jujuy\",\n+                                        \"value\": \"America/Jujuy\"\n                                     },\n                                     {\n-                                        \"description\": \"Includes all fields into the inferred schema, involving custom extension fields as string values.\",\n-                                        \"displayName\": \"With custom extensions as strings\",\n-                                        \"value\": \"custom-extensions-as-string\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"America/Juneau\",\n+                                        \"value\": \"America/Juneau\"\n                                     },\n                                     {\n-                                        \"description\": \"Includes all fields into the inferred schema, involving custom extension fields with inferred data types. The inference works based on the values in the FlowFile. In some scenarios this might result unsatisfiable behaviour. In these cases it is suggested to use \\\"With custom extensions as strings\\\" Inference Strategy or predefined schema.\",\n-                                        \"displayName\": \"With custom extensions inferred\",\n-                                        \"value\": \"custom-extensions-inferred\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"custom-extensions-inferred\",\n-                                \"dependencies\": [\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"America/Kentucky/Louisville\",\n+                                        \"value\": \"America/Kentucky/Louisville\"\n+                                    },\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"infer-schema\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n-                                        \"propertyName\": \"schema-access-strategy\"\n-                                    }\n-                                ],\n-                                \"description\": \"Defines the set of fields should be included in the schema and the way the fields are being interpreted.\",\n-                                \"displayName\": \"Inference Strategy\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"inference-strategy\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"invalid-message-field\": {\n-                                \"description\": \"Used when a line in the FlowFile cannot be parsed by the CEF parser. If set, instead of failing to process the FlowFile, a record is being added with one field. This record contains one field with the name specified by the property and the raw message as value.\",\n-                                \"displayName\": \"Invalid Field\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"invalid-message-field\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"raw-message-field\": {\n-                                \"description\": \"If set the raw message will be added to the record using the property value as field name. This is not the same as the \\\"rawEvent\\\" extension field!\",\n-                                \"displayName\": \"Raw Message Field\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"raw-message-field\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"schema-access-strategy\": {\n-                                \"allowableValues\": [\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"America/Kentucky/Monticello\",\n+                                        \"value\": \"America/Kentucky/Monticello\"\n+                                    },\n                                     {\n-                                        \"description\": \"The name of the Schema to use is specified by the 'Schema Name' Property. The value of this property is used to lookup the Schema in the configured Schema Registry service.\",\n-                                        \"displayName\": \"Use 'Schema Name' Property\",\n-                                        \"value\": \"schema-name\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"America/Knox_IN\",\n+                                        \"value\": \"America/Knox_IN\"\n                                     },\n                                     {\n-                                        \"description\": \"The text of the Schema itself is specified by the 'Schema Text' Property. The value of this property must be a valid Avro Schema. If Expression Language is used, the value of the 'Schema Text' property must be valid after substituting the expressions.\",\n-                                        \"displayName\": \"Use 'Schema Text' Property\",\n-                                        \"value\": \"schema-text-property\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"America/Kralendijk\",\n+                                        \"value\": \"America/Kralendijk\"\n                                     },\n                                     {\n-                                        \"description\": \"The FlowFile contains 3 Attributes that will be used to lookup a Schema from the configured Schema Registry: 'schema.identifier', 'schema.version', and 'schema.protocol.version'\",\n-                                        \"displayName\": \"HWX Schema Reference Attributes\",\n-                                        \"value\": \"hwx-schema-ref-attributes\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"America/La_Paz\",\n+                                        \"value\": \"America/La_Paz\"\n                                     },\n                                     {\n-                                        \"description\": \"The content of the FlowFile contains a reference to a schema in the Schema Registry service. The reference is encoded as a single byte indicating the 'protocol version', followed by 8 bytes indicating the schema identifier, and finally 4 bytes indicating the schema version, as per the Hortonworks Schema Registry serializers and deserializers, found at https://github.com/hortonworks/registry\",\n-                                        \"displayName\": \"HWX Content-Encoded Schema Reference\",\n-                                        \"value\": \"hwx-content-encoded-schema\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"America/Lima\",\n+                                        \"value\": \"America/Lima\"\n                                     },\n                                     {\n-                                        \"description\": \"The content of the FlowFile contains a reference to a schema in the Schema Registry service. The reference is encoded as a single 'Magic Byte' followed by 4 bytes representing the identifier of the schema, as outlined at http://docs.confluent.io/current/schema-registry/docs/serializer-formatter.html. This is based on version 3.2.x of the Confluent Schema Registry.\",\n-                                        \"displayName\": \"Confluent Content-Encoded Schema Reference\",\n-                                        \"value\": \"confluent-encoded\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"America/Los_Angeles\",\n+                                        \"value\": \"America/Los_Angeles\"\n                                     },\n                                     {\n-                                        \"description\": \"The Schema of the data will be inferred automatically when the data is read. See component Usage and Additional Details for information about how the schema is inferred.\",\n-                                        \"displayName\": \"Infer Schema\",\n-                                        \"value\": \"infer-schema\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"infer-schema\",\n-                                \"description\": \"Specifies how to obtain the schema that is to be used for interpreting the data.\",\n-                                \"displayName\": \"Schema Access Strategy\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"schema-access-strategy\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"schema-branch\": {\n-                                \"dependencies\": [\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"America/Louisville\",\n+                                        \"value\": \"America/Louisville\"\n+                                    },\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"schema-name\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n-                                        \"propertyName\": \"schema-access-strategy\"\n-                                    }\n-                                ],\n-                                \"description\": \"Specifies the name of the branch to use when looking up the schema in the Schema Registry property. If the chosen Schema Registry does not support branching, this value will be ignored.\",\n-                                \"displayName\": \"Schema Branch\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"schema-branch\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"schema-inference-cache\": {\n-                                \"dependencies\": [\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"America/Lower_Princes\",\n+                                        \"value\": \"America/Lower_Princes\"\n+                                    },\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"infer-schema\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n-                                        \"propertyName\": \"schema-access-strategy\"\n-                                    }\n-                                ],\n-                                \"description\": \"Specifies a Schema Cache to use when inferring the schema. If not populated, the schema will be inferred each time. However, if a cache is specified, the cache will first be consulted and if the applicable schema can be found, it will be used instead of inferring the schema.\",\n-                                \"displayName\": \"Schema Inference Cache\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"schema-inference-cache\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.serialization.RecordSchemaCacheService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            },\n-                            \"schema-name\": {\n-                                \"defaultValue\": \"${schema.name}\",\n-                                \"dependencies\": [\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"America/Maceio\",\n+                                        \"value\": \"America/Maceio\"\n+                                    },\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"schema-name\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n-                                        \"propertyName\": \"schema-access-strategy\"\n-                                    }\n-                                ],\n-                                \"description\": \"Specifies the name of the schema to lookup in the Schema Registry property\",\n-                                \"displayName\": \"Schema Name\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"schema-name\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"schema-registry\": {\n-                                \"dependencies\": [\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"America/Managua\",\n+                                        \"value\": \"America/Managua\"\n+                                    },\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"confluent-encoded\",\n-                                            \"schema-name\",\n-                                            \"hwx-schema-ref-attributes\",\n-                                            \"hwx-content-encoded-schema\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n-                                        \"propertyName\": \"schema-access-strategy\"\n-                                    }\n-                                ],\n-                                \"description\": \"Specifies the Controller Service to use for the Schema Registry\",\n-                                \"displayName\": \"Schema Registry\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"schema-registry\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.schemaregistry.services.SchemaRegistry\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            },\n-                            \"schema-text\": {\n-                                \"defaultValue\": \"${avro.schema}\",\n-                                \"dependencies\": [\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"America/Manaus\",\n+                                        \"value\": \"America/Manaus\"\n+                                    },\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"schema-text-property\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n-                                        \"propertyName\": \"schema-access-strategy\"\n-                                    }\n-                                ],\n-                                \"description\": \"The text of an Avro-formatted Schema\",\n-                                \"displayName\": \"Schema Text\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"schema-text\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"schema-version\": {\n-                                \"dependencies\": [\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"America/Marigot\",\n+                                        \"value\": \"America/Marigot\"\n+                                    },\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"schema-name\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n-                                        \"propertyName\": \"schema-access-strategy\"\n-                                    }\n-                                ],\n-                                \"description\": \"Specifies the version of the schema to lookup in the Schema Registry. If not specified then the latest version of the schema will be retrieved.\",\n-                                \"displayName\": \"Schema Version\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"schema-version\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            }\n-                        },\n-                        \"providedApiImplementations\": [\n-                            {\n-                                \"artifact\": \"nifi-standard-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n-                                \"version\": \"1.27.0\"\n-                            }\n-                        ],\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"cef\",\n-                            \"parser\",\n-                            \"reader\",\n-                            \"record\"\n-                        ],\n-                        \"type\": \"org.apache.nifi.cef.CEFReader\",\n-                        \"typeDescription\": \"Parses CEF (Common Event Format) events, returning each row as a record. This reader allows for inferring a schema based on the first event in the FlowFile or providing an explicit schema for interpreting the values.\",\n-                        \"version\": \"1.27.0\"\n-                    },\n-                    {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-record-serialization-services-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"e0c4461\"\n-                        },\n-                        \"group\": \"org.apache.nifi\",\n-                        \"propertyDescriptors\": {\n-                            \"CSV Format\": {\n-                                \"allowableValues\": [\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"America/Martinique\",\n+                                        \"value\": \"America/Martinique\"\n+                                    },\n                                     {\n-                                        \"description\": \"The format of the CSV is configured by using the properties of this Controller Service, such as Value Separator\",\n-                                        \"displayName\": \"Custom Format\",\n-                                        \"value\": \"custom\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"America/Matamoros\",\n+                                        \"value\": \"America/Matamoros\"\n                                     },\n                                     {\n-                                        \"description\": \"CSV data follows the RFC 4180 Specification defined at https://tools.ietf.org/html/rfc4180\",\n-                                        \"displayName\": \"RFC 4180\",\n-                                        \"value\": \"rfc-4180\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"America/Mazatlan\",\n+                                        \"value\": \"America/Mazatlan\"\n                                     },\n                                     {\n-                                        \"description\": \"CSV data follows the format used by Microsoft Excel\",\n-                                        \"displayName\": \"Microsoft Excel\",\n-                                        \"value\": \"excel\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"America/Mendoza\",\n+                                        \"value\": \"America/Mendoza\"\n                                     },\n                                     {\n-                                        \"description\": \"CSV data is Tab-Delimited instead of Comma Delimited\",\n-                                        \"displayName\": \"Tab-Delimited\",\n-                                        \"value\": \"tdf\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"America/Menominee\",\n+                                        \"value\": \"America/Menominee\"\n                                     },\n                                     {\n-                                        \"description\": \"CSV data follows the format used by MySQL\",\n-                                        \"displayName\": \"MySQL Format\",\n-                                        \"value\": \"mysql\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"America/Merida\",\n+                                        \"value\": \"America/Merida\"\n                                     },\n                                     {\n-                                        \"description\": \"The format used by Informix when issuing the UNLOAD TO file_name command\",\n-                                        \"displayName\": \"Informix Unload\",\n-                                        \"value\": \"informix-unload\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"America/Metlakatla\",\n+                                        \"value\": \"America/Metlakatla\"\n                                     },\n                                     {\n-                                        \"description\": \"The format used by Informix when issuing the UNLOAD TO file_name command with escaping disabled\",\n-                                        \"displayName\": \"Informix Unload Escape Disabled\",\n-                                        \"value\": \"informix-unload-csv\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"custom\",\n-                                \"description\": \"Specifies which \\\"format\\\" the CSV data is in, or specifies if custom formatting should be used.\",\n-                                \"displayName\": \"CSV Format\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"CSV Format\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Comment Marker\": {\n-                                \"dependencies\": [\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"America/Mexico_City\",\n+                                        \"value\": \"America/Mexico_City\"\n+                                    },\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"custom\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"CSV Format\",\n-                                        \"propertyName\": \"CSV Format\"\n-                                    }\n-                                ],\n-                                \"description\": \"The character that is used to denote the start of a comment. Any line that begins with this comment will be ignored.\",\n-                                \"displayName\": \"Comment Marker\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Comment Marker\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Date Format\": {\n-                                \"description\": \"Specifies the format to use when reading/writing Date fields. If not specified, Date fields will be assumed to be number of milliseconds since epoch (Midnight, Jan 1, 1970 GMT). If specified, the value must match the Java Simple Date Format (for example, MM/dd/yyyy for a two-digit month, followed by a two-digit day, followed by a four-digit year, all separated by '/' characters, as in 01/01/2017).\",\n-                                \"displayName\": \"Date Format\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Date Format\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Escape Character\": {\n-                                \"defaultValue\": \"\\\\\",\n-                                \"dependencies\": [\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"America/Miquelon\",\n+                                        \"value\": \"America/Miquelon\"\n+                                    },\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"custom\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"CSV Format\",\n-                                        \"propertyName\": \"CSV Format\"\n-                                    }\n-                                ],\n-                                \"description\": \"The character that is used to escape characters that would otherwise have a specific meaning to the CSV Parser. If the property has been specified via Expression Language but the expression gets evaluated to an invalid Escape Character at runtime, then it will be skipped and the default Escape Character will be used. Setting it to an empty string means no escape character should be used.\",\n-                                \"displayName\": \"Escape Character\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Escape Character\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Null String\": {\n-                                \"dependencies\": [\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"America/Moncton\",\n+                                        \"value\": \"America/Moncton\"\n+                                    },\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"custom\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"CSV Format\",\n-                                        \"propertyName\": \"CSV Format\"\n-                                    }\n-                                ],\n-                                \"description\": \"Specifies a String that, if present as a value in the CSV, should be considered a null field instead of using the literal value.\",\n-                                \"displayName\": \"Null String\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Null String\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Quote Character\": {\n-                                \"defaultValue\": \"\\\"\",\n-                                \"dependencies\": [\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"America/Monterrey\",\n+                                        \"value\": \"America/Monterrey\"\n+                                    },\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"custom\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"CSV Format\",\n-                                        \"propertyName\": \"CSV Format\"\n-                                    }\n-                                ],\n-                                \"description\": \"The character that is used to quote values so that escape characters do not have to be used. If the property has been specified via Expression Language but the expression gets evaluated to an invalid Quote Character at runtime, then it will be skipped and the default Quote Character will be used.\",\n-                                \"displayName\": \"Quote Character\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Quote Character\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Record Separator\": {\n-                                \"defaultValue\": \"\\\\n\",\n-                                \"dependencies\": [\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"America/Montevideo\",\n+                                        \"value\": \"America/Montevideo\"\n+                                    },\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"custom\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"CSV Format\",\n-                                        \"propertyName\": \"CSV Format\"\n-                                    }\n-                                ],\n-                                \"description\": \"Specifies the characters to use in order to separate CSV Records\",\n-                                \"displayName\": \"Record Separator\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Record Separator\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Skip Header Line\": {\n-                                \"allowableValues\": [\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"America/Montreal\",\n+                                        \"value\": \"America/Montreal\"\n+                                    },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"displayName\": \"America/Montserrat\",\n+                                        \"value\": \"America/Montserrat\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"Specifies whether or not the first line of CSV should be considered a Header or should be considered a record. If the Schema Access Strategy indicates that the columns must be defined in the header, then this property will be ignored, since the header must always be present and won't be processed as a Record. Otherwise, if 'true', then the first line of CSV data will not be processed as a record and if 'false',then the first line will be interpreted as a record.\",\n-                                \"displayName\": \"Treat First Line as Header\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Skip Header Line\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Time Format\": {\n-                                \"description\": \"Specifies the format to use when reading/writing Time fields. If not specified, Time fields will be assumed to be number of milliseconds since epoch (Midnight, Jan 1, 1970 GMT). If specified, the value must match the Java Simple Date Format (for example, HH:mm:ss for a two-digit hour in 24-hour format, followed by a two-digit minute, followed by a two-digit second, all separated by ':' characters, as in 18:04:15).\",\n-                                \"displayName\": \"Time Format\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Time Format\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Timestamp Format\": {\n-                                \"description\": \"Specifies the format to use when reading/writing Timestamp fields. If not specified, Timestamp fields will be assumed to be number of milliseconds since epoch (Midnight, Jan 1, 1970 GMT). If specified, the value must match the Java Simple Date Format (for example, MM/dd/yyyy HH:mm:ss for a two-digit month, followed by a two-digit day, followed by a four-digit year, all separated by '/' characters; and then followed by a two-digit hour in 24-hour format, followed by a two-digit minute, followed by a two-digit second, all separated by ':' characters, as in 01/01/2017 18:04:15).\",\n-                                \"displayName\": \"Timestamp Format\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Timestamp Format\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Trim Fields\": {\n-                                \"allowableValues\": [\n+                                        \"displayName\": \"America/Nassau\",\n+                                        \"value\": \"America/Nassau\"\n+                                    },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"displayName\": \"America/New_York\",\n+                                        \"value\": \"America/New_York\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"true\",\n-                                \"dependencies\": [\n+                                        \"displayName\": \"America/Nipigon\",\n+                                        \"value\": \"America/Nipigon\"\n+                                    },\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"custom\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"CSV Format\",\n-                                        \"propertyName\": \"CSV Format\"\n-                                    }\n-                                ],\n-                                \"description\": \"Whether or not white space should be removed from the beginning and end of fields\",\n-                                \"displayName\": \"Trim Fields\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Trim Fields\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Trim double quote\": {\n-                                \"allowableValues\": [\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"America/Nome\",\n+                                        \"value\": \"America/Nome\"\n+                                    },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"displayName\": \"America/Noronha\",\n+                                        \"value\": \"America/Noronha\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"true\",\n-                                \"dependencies\": [\n+                                        \"displayName\": \"America/North_Dakota/Beulah\",\n+                                        \"value\": \"America/North_Dakota/Beulah\"\n+                                    },\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"rfc-4180\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"CSV Format\",\n-                                        \"propertyName\": \"CSV Format\"\n-                                    }\n-                                ],\n-                                \"description\": \"Whether or not to trim starting and ending double quotes. For example: with trim string '\\\"test\\\"' would be parsed to 'test', without trim would be parsed to '\\\"test\\\"'.If set to 'false' it means full compliance with RFC-4180. Default value is true, with trim.\",\n-                                \"displayName\": \"Trim double quote\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Trim double quote\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Value Separator\": {\n-                                \"defaultValue\": \",\",\n-                                \"dependencies\": [\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"America/North_Dakota/Center\",\n+                                        \"value\": \"America/North_Dakota/Center\"\n+                                    },\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"custom\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"CSV Format\",\n-                                        \"propertyName\": \"CSV Format\"\n-                                    }\n-                                ],\n-                                \"description\": \"The character that is used to separate values/fields in a CSV Record. If the property has been specified via Expression Language but the expression gets evaluated to an invalid Value Separator at runtime, then it will be skipped and the default Value Separator will be used.\",\n-                                \"displayName\": \"Value Separator\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Value Separator\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"csv-reader-csv-parser\": {\n-                                \"allowableValues\": [\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"America/North_Dakota/New_Salem\",\n+                                        \"value\": \"America/North_Dakota/New_Salem\"\n+                                    },\n                                     {\n-                                        \"description\": \"The CSV parser implementation from the Apache Commons CSV library.\",\n-                                        \"displayName\": \"Apache Commons CSV\",\n-                                        \"value\": \"commons-csv\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"America/Nuuk\",\n+                                        \"value\": \"America/Nuuk\"\n                                     },\n                                     {\n-                                        \"description\": \"The CSV parser implementation from the Jackson Dataformats library.\",\n-                                        \"displayName\": \"Jackson CSV\",\n-                                        \"value\": \"jackson-csv\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"commons-csv\",\n-                                \"description\": \"Specifies which parser to use to read CSV records. NOTE: Different parsers may support different subsets of functionality and may also exhibit different levels of performance.\",\n-                                \"displayName\": \"CSV Parser\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"csv-reader-csv-parser\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"csvutils-allow-duplicate-header-names\": {\n-                                \"allowableValues\": [\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"America/Ojinaga\",\n+                                        \"value\": \"America/Ojinaga\"\n+                                    },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"displayName\": \"America/Panama\",\n+                                        \"value\": \"America/Panama\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"true\",\n-                                \"dependencies\": [\n+                                        \"displayName\": \"America/Pangnirtung\",\n+                                        \"value\": \"America/Pangnirtung\"\n+                                    },\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"custom\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"CSV Format\",\n-                                        \"propertyName\": \"CSV Format\"\n-                                    }\n-                                ],\n-                                \"description\": \"Whether duplicate header names are allowed. Header names are case-sensitive, for example \\\"name\\\" and \\\"Name\\\" are treated as separate fields. Handling of duplicate header names is CSV Parser specific (where applicable):\\n* Apache Commons CSV - duplicate headers will result in column data \\\"shifting\\\" right with new fields created for \\\"unknown_field_index_X\\\" where \\\"X\\\" is the CSV column index number\\n* Jackson CSV - duplicate headers will be de-duplicated with the field value being that of the right-most duplicate CSV column\",\n-                                \"displayName\": \"Allow Duplicate Header Names\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"csvutils-allow-duplicate-header-names\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"csvutils-character-set\": {\n-                                \"defaultValue\": \"UTF-8\",\n-                                \"description\": \"The Character Encoding that is used to encode/decode the CSV file\",\n-                                \"displayName\": \"Character Set\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"csvutils-character-set\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"ignore-csv-header\": {\n-                                \"allowableValues\": [\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"America/Paramaribo\",\n+                                        \"value\": \"America/Paramaribo\"\n+                                    },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"displayName\": \"America/Phoenix\",\n+                                        \"value\": \"America/Phoenix\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"If the first line of a CSV is a header, and the configured schema does not match the fields named in the header line, this controls how the Reader will interpret the fields. If this property is true, then the field names mapped to each column are driven only by the configured schema and any fields not in the schema will be ignored. If this property is false, then the field names found in the CSV Header will be used as the names of the fields.\",\n-                                \"displayName\": \"Ignore CSV Header Column Names\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"ignore-csv-header\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"schema-access-strategy\": {\n-                                \"allowableValues\": [\n+                                        \"displayName\": \"America/Port-au-Prince\",\n+                                        \"value\": \"America/Port-au-Prince\"\n+                                    },\n                                     {\n-                                        \"description\": \"The name of the Schema to use is specified by the 'Schema Name' Property. The value of this property is used to lookup the Schema in the configured Schema Registry service.\",\n-                                        \"displayName\": \"Use 'Schema Name' Property\",\n-                                        \"value\": \"schema-name\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"America/Port_of_Spain\",\n+                                        \"value\": \"America/Port_of_Spain\"\n                                     },\n                                     {\n-                                        \"description\": \"The text of the Schema itself is specified by the 'Schema Text' Property. The value of this property must be a valid Avro Schema. If Expression Language is used, the value of the 'Schema Text' property must be valid after substituting the expressions.\",\n-                                        \"displayName\": \"Use 'Schema Text' Property\",\n-                                        \"value\": \"schema-text-property\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"America/Porto_Acre\",\n+                                        \"value\": \"America/Porto_Acre\"\n                                     },\n                                     {\n-                                        \"description\": \"The FlowFile contains 3 Attributes that will be used to lookup a Schema from the configured Schema Registry: 'schema.identifier', 'schema.version', and 'schema.protocol.version'\",\n-                                        \"displayName\": \"HWX Schema Reference Attributes\",\n-                                        \"value\": \"hwx-schema-ref-attributes\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"America/Porto_Velho\",\n+                                        \"value\": \"America/Porto_Velho\"\n                                     },\n                                     {\n-                                        \"description\": \"The content of the FlowFile contains a reference to a schema in the Schema Registry service. The reference is encoded as a single byte indicating the 'protocol version', followed by 8 bytes indicating the schema identifier, and finally 4 bytes indicating the schema version, as per the Hortonworks Schema Registry serializers and deserializers, found at https://github.com/hortonworks/registry\",\n-                                        \"displayName\": \"HWX Content-Encoded Schema Reference\",\n-                                        \"value\": \"hwx-content-encoded-schema\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"America/Puerto_Rico\",\n+                                        \"value\": \"America/Puerto_Rico\"\n                                     },\n                                     {\n-                                        \"description\": \"The content of the FlowFile contains a reference to a schema in the Schema Registry service. The reference is encoded as a single 'Magic Byte' followed by 4 bytes representing the identifier of the schema, as outlined at http://docs.confluent.io/current/schema-registry/docs/serializer-formatter.html. This is based on version 3.2.x of the Confluent Schema Registry.\",\n-                                        \"displayName\": \"Confluent Content-Encoded Schema Reference\",\n-                                        \"value\": \"confluent-encoded\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"America/Punta_Arenas\",\n+                                        \"value\": \"America/Punta_Arenas\"\n                                     },\n                                     {\n-                                        \"description\": \"The first non-comment line of the CSV file is a header line that contains the names of the columns. The schema will be derived by using the column names in the header and assuming that all columns are of type String.\",\n-                                        \"displayName\": \"Use String Fields From Header\",\n-                                        \"value\": \"csv-header-derived\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"America/Rainy_River\",\n+                                        \"value\": \"America/Rainy_River\"\n                                     },\n                                     {\n-                                        \"description\": \"The Schema of the data will be inferred automatically when the data is read. See component Usage and Additional Details for information about how the schema is inferred.\",\n-                                        \"displayName\": \"Infer Schema\",\n-                                        \"value\": \"infer-schema\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"infer-schema\",\n-                                \"description\": \"Specifies how to obtain the schema that is to be used for interpreting the data.\",\n-                                \"displayName\": \"Schema Access Strategy\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"schema-access-strategy\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"schema-branch\": {\n-                                \"dependencies\": [\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"America/Rankin_Inlet\",\n+                                        \"value\": \"America/Rankin_Inlet\"\n+                                    },\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"schema-name\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n-                                        \"propertyName\": \"schema-access-strategy\"\n-                                    }\n-                                ],\n-                                \"description\": \"Specifies the name of the branch to use when looking up the schema in the Schema Registry property. If the chosen Schema Registry does not support branching, this value will be ignored.\",\n-                                \"displayName\": \"Schema Branch\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"schema-branch\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"schema-name\": {\n-                                \"defaultValue\": \"${schema.name}\",\n-                                \"dependencies\": [\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"America/Recife\",\n+                                        \"value\": \"America/Recife\"\n+                                    },\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"schema-name\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n-                                        \"propertyName\": \"schema-access-strategy\"\n-                                    }\n-                                ],\n-                                \"description\": \"Specifies the name of the schema to lookup in the Schema Registry property\",\n-                                \"displayName\": \"Schema Name\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"schema-name\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"schema-registry\": {\n-                                \"dependencies\": [\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"America/Regina\",\n+                                        \"value\": \"America/Regina\"\n+                                    },\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"confluent-encoded\",\n-                                            \"schema-name\",\n-                                            \"hwx-schema-ref-attributes\",\n-                                            \"hwx-content-encoded-schema\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n-                                        \"propertyName\": \"schema-access-strategy\"\n-                                    }\n-                                ],\n-                                \"description\": \"Specifies the Controller Service to use for the Schema Registry\",\n-                                \"displayName\": \"Schema Registry\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"schema-registry\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.schemaregistry.services.SchemaRegistry\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            },\n-                            \"schema-text\": {\n-                                \"defaultValue\": \"${avro.schema}\",\n-                                \"dependencies\": [\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"America/Resolute\",\n+                                        \"value\": \"America/Resolute\"\n+                                    },\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"schema-text-property\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n-                                        \"propertyName\": \"schema-access-strategy\"\n-                                    }\n-                                ],\n-                                \"description\": \"The text of an Avro-formatted Schema\",\n-                                \"displayName\": \"Schema Text\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"schema-text\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"schema-version\": {\n-                                \"dependencies\": [\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"America/Rio_Branco\",\n+                                        \"value\": \"America/Rio_Branco\"\n+                                    },\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"schema-name\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n-                                        \"propertyName\": \"schema-access-strategy\"\n-                                    }\n-                                ],\n-                                \"description\": \"Specifies the version of the schema to lookup in the Schema Registry. If not specified then the latest version of the schema will be retrieved.\",\n-                                \"displayName\": \"Schema Version\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"schema-version\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            }\n-                        },\n-                        \"providedApiImplementations\": [\n-                            {\n-                                \"artifact\": \"nifi-standard-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n-                                \"version\": \"1.27.0\"\n-                            }\n-                        ],\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"comma\",\n-                            \"csv\",\n-                            \"delimited\",\n-                            \"parse\",\n-                            \"reader\",\n-                            \"record\",\n-                            \"row\",\n-                            \"separated\",\n-                            \"values\"\n-                        ],\n-                        \"type\": \"org.apache.nifi.csv.CSVReader\",\n-                        \"typeDescription\": \"Parses CSV-formatted data, returning each row in the CSV file as a separate record. This reader allows for inferring a schema based on the first line of the CSV, if a 'header line' is present, or providing an explicit schema for interpreting the values. See Controller Service's Usage for further documentation.\",\n-                        \"version\": \"1.27.0\"\n-                    },\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-record-serialization-services-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"e0c4461\"\n-                        },\n-                        \"group\": \"org.apache.nifi\",\n-                        \"propertyDescriptors\": {\n-                            \"CSV Format\": {\n-                                \"allowableValues\": [\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"America/Rosario\",\n+                                        \"value\": \"America/Rosario\"\n+                                    },\n                                     {\n-                                        \"description\": \"The format of the CSV is configured by using the properties of this Controller Service, such as Value Separator\",\n-                                        \"displayName\": \"Custom Format\",\n-                                        \"value\": \"custom\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"America/Santa_Isabel\",\n+                                        \"value\": \"America/Santa_Isabel\"\n                                     },\n                                     {\n-                                        \"description\": \"CSV data follows the RFC 4180 Specification defined at https://tools.ietf.org/html/rfc4180\",\n-                                        \"displayName\": \"RFC 4180\",\n-                                        \"value\": \"rfc-4180\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"America/Santarem\",\n+                                        \"value\": \"America/Santarem\"\n                                     },\n                                     {\n-                                        \"description\": \"CSV data follows the format used by Microsoft Excel\",\n-                                        \"displayName\": \"Microsoft Excel\",\n-                                        \"value\": \"excel\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"America/Santiago\",\n+                                        \"value\": \"America/Santiago\"\n                                     },\n                                     {\n-                                        \"description\": \"CSV data is Tab-Delimited instead of Comma Delimited\",\n-                                        \"displayName\": \"Tab-Delimited\",\n-                                        \"value\": \"tdf\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"America/Santo_Domingo\",\n+                                        \"value\": \"America/Santo_Domingo\"\n                                     },\n                                     {\n-                                        \"description\": \"CSV data follows the format used by MySQL\",\n-                                        \"displayName\": \"MySQL Format\",\n-                                        \"value\": \"mysql\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"America/Sao_Paulo\",\n+                                        \"value\": \"America/Sao_Paulo\"\n                                     },\n                                     {\n-                                        \"description\": \"The format used by Informix when issuing the UNLOAD TO file_name command\",\n-                                        \"displayName\": \"Informix Unload\",\n-                                        \"value\": \"informix-unload\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"America/Scoresbysund\",\n+                                        \"value\": \"America/Scoresbysund\"\n                                     },\n                                     {\n-                                        \"description\": \"The format used by Informix when issuing the UNLOAD TO file_name command with escaping disabled\",\n-                                        \"displayName\": \"Informix Unload Escape Disabled\",\n-                                        \"value\": \"informix-unload-csv\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"custom\",\n-                                \"description\": \"Specifies which \\\"format\\\" the CSV data is in, or specifies if custom formatting should be used.\",\n-                                \"displayName\": \"CSV Format\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"CSV Format\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Comment Marker\": {\n-                                \"dependencies\": [\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"America/Shiprock\",\n+                                        \"value\": \"America/Shiprock\"\n+                                    },\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"custom\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"CSV Format\",\n-                                        \"propertyName\": \"CSV Format\"\n-                                    }\n-                                ],\n-                                \"description\": \"The character that is used to denote the start of a comment. Any line that begins with this comment will be ignored.\",\n-                                \"displayName\": \"Comment Marker\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Comment Marker\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Date Format\": {\n-                                \"description\": \"Specifies the format to use when reading/writing Date fields. If not specified, Date fields will be assumed to be number of milliseconds since epoch (Midnight, Jan 1, 1970 GMT). If specified, the value must match the Java Simple Date Format (for example, MM/dd/yyyy for a two-digit month, followed by a two-digit day, followed by a four-digit year, all separated by '/' characters, as in 01/01/2017).\",\n-                                \"displayName\": \"Date Format\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Date Format\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Escape Character\": {\n-                                \"defaultValue\": \"\\\\\",\n-                                \"dependencies\": [\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"America/Sitka\",\n+                                        \"value\": \"America/Sitka\"\n+                                    },\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"custom\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"CSV Format\",\n-                                        \"propertyName\": \"CSV Format\"\n-                                    }\n-                                ],\n-                                \"description\": \"The character that is used to escape characters that would otherwise have a specific meaning to the CSV Parser. If the property has been specified via Expression Language but the expression gets evaluated to an invalid Escape Character at runtime, then it will be skipped and the default Escape Character will be used. Setting it to an empty string means no escape character should be used.\",\n-                                \"displayName\": \"Escape Character\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Escape Character\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Include Header Line\": {\n-                                \"allowableValues\": [\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"America/St_Barthelemy\",\n+                                        \"value\": \"America/St_Barthelemy\"\n+                                    },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"displayName\": \"America/St_Johns\",\n+                                        \"value\": \"America/St_Johns\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"true\",\n-                                \"description\": \"Specifies whether or not the CSV column names should be written out as the first line.\",\n-                                \"displayName\": \"Include Header Line\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Include Header Line\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Include Trailing Delimiter\": {\n-                                \"allowableValues\": [\n+                                        \"displayName\": \"America/St_Kitts\",\n+                                        \"value\": \"America/St_Kitts\"\n+                                    },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"displayName\": \"America/St_Lucia\",\n+                                        \"value\": \"America/St_Lucia\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"false\",\n-                                \"dependencies\": [\n+                                        \"displayName\": \"America/St_Thomas\",\n+                                        \"value\": \"America/St_Thomas\"\n+                                    },\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"custom\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"CSV Format\",\n-                                        \"propertyName\": \"CSV Format\"\n-                                    }\n-                                ],\n-                                \"description\": \"If true, a trailing delimiter will be added to each CSV Record that is written. If false, the trailing delimiter will be omitted.\",\n-                                \"displayName\": \"Include Trailing Delimiter\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Include Trailing Delimiter\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Null String\": {\n-                                \"dependencies\": [\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"America/St_Vincent\",\n+                                        \"value\": \"America/St_Vincent\"\n+                                    },\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"custom\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"CSV Format\",\n-                                        \"propertyName\": \"CSV Format\"\n-                                    }\n-                                ],\n-                                \"description\": \"Specifies a String that, if present as a value in the CSV, should be considered a null field instead of using the literal value.\",\n-                                \"displayName\": \"Null String\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Null String\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Quote Character\": {\n-                                \"defaultValue\": \"\\\"\",\n-                                \"dependencies\": [\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"America/Swift_Current\",\n+                                        \"value\": \"America/Swift_Current\"\n+                                    },\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"custom\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"CSV Format\",\n-                                        \"propertyName\": \"CSV Format\"\n-                                    }\n-                                ],\n-                                \"description\": \"The character that is used to quote values so that escape characters do not have to be used. If the property has been specified via Expression Language but the expression gets evaluated to an invalid Quote Character at runtime, then it will be skipped and the default Quote Character will be used.\",\n-                                \"displayName\": \"Quote Character\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Quote Character\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Quote Mode\": {\n-                                \"allowableValues\": [\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"America/Tegucigalpa\",\n+                                        \"value\": \"America/Tegucigalpa\"\n+                                    },\n                                     {\n-                                        \"description\": \"All values will be quoted using the configured quote character.\",\n-                                        \"displayName\": \"Quote All Values\",\n-                                        \"value\": \"ALL\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"America/Thule\",\n+                                        \"value\": \"America/Thule\"\n                                     },\n                                     {\n-                                        \"description\": \"Values will be quoted only if they are contain special characters such as newline characters or field separators.\",\n-                                        \"displayName\": \"Quote Minimal\",\n-                                        \"value\": \"MINIMAL\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"America/Thunder_Bay\",\n+                                        \"value\": \"America/Thunder_Bay\"\n                                     },\n                                     {\n-                                        \"description\": \"Values will be quoted unless the value is a number.\",\n-                                        \"displayName\": \"Quote Non-Numeric Values\",\n-                                        \"value\": \"NON_NUMERIC\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"America/Tijuana\",\n+                                        \"value\": \"America/Tijuana\"\n                                     },\n                                     {\n-                                        \"description\": \"Values will not be quoted. Instead, all special characters will be escaped using the configured escape character.\",\n-                                        \"displayName\": \"Do Not Quote Values\",\n-                                        \"value\": \"NONE\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"MINIMAL\",\n-                                \"dependencies\": [\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"America/Toronto\",\n+                                        \"value\": \"America/Toronto\"\n+                                    },\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"custom\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"CSV Format\",\n-                                        \"propertyName\": \"CSV Format\"\n-                                    }\n-                                ],\n-                                \"description\": \"Specifies how fields should be quoted when they are written\",\n-                                \"displayName\": \"Quote Mode\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Quote Mode\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Record Separator\": {\n-                                \"defaultValue\": \"\\\\n\",\n-                                \"dependencies\": [\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"America/Tortola\",\n+                                        \"value\": \"America/Tortola\"\n+                                    },\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"custom\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"CSV Format\",\n-                                        \"propertyName\": \"CSV Format\"\n-                                    }\n-                                ],\n-                                \"description\": \"Specifies the characters to use in order to separate CSV Records\",\n-                                \"displayName\": \"Record Separator\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Record Separator\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Schema Write Strategy\": {\n-                                \"allowableValues\": [\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"America/Vancouver\",\n+                                        \"value\": \"America/Vancouver\"\n+                                    },\n                                     {\n-                                        \"description\": \"Do not add any schema-related information to the FlowFile.\",\n-                                        \"displayName\": \"Do Not Write Schema\",\n-                                        \"value\": \"no-schema\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"America/Virgin\",\n+                                        \"value\": \"America/Virgin\"\n                                     },\n                                     {\n-                                        \"description\": \"The FlowFile will be given an attribute named 'schema.name' and this attribute will indicate the name of the schema in the Schema Registry. Note that ifthe schema for a record is not obtained from a Schema Registry, then no attribute will be added.\",\n-                                        \"displayName\": \"Set 'schema.name' Attribute\",\n-                                        \"value\": \"schema-name\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"America/Whitehorse\",\n+                                        \"value\": \"America/Whitehorse\"\n                                     },\n                                     {\n-                                        \"description\": \"The FlowFile will be given an attribute named 'avro.schema' and this attribute will contain the Avro Schema that describes the records in the FlowFile. The contents of the FlowFile need not be Avro, but the text of the schema will be used.\",\n-                                        \"displayName\": \"Set 'avro.schema' Attribute\",\n-                                        \"value\": \"full-schema-attribute\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"America/Winnipeg\",\n+                                        \"value\": \"America/Winnipeg\"\n                                     },\n                                     {\n-                                        \"description\": \"The FlowFile will be given a set of 3 attributes to describe the schema: 'schema.identifier', 'schema.version', and 'schema.protocol.version'. Note that if the schema for a record does not contain the necessary identifier and version, an Exception will be thrown when attempting to write the data.\",\n-                                        \"displayName\": \"HWX Schema Reference Attributes\",\n-                                        \"value\": \"hwx-schema-ref-attributes\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"America/Yakutat\",\n+                                        \"value\": \"America/Yakutat\"\n                                     },\n                                     {\n-                                        \"description\": \"The content of the FlowFile will contain a reference to a schema in the Schema Registry service. The reference is encoded as a single byte indicating the 'protocol version', followed by 8 bytes indicating the schema identifier, and finally 4 bytes indicating the schema version, as per the Hortonworks Schema Registry serializers and deserializers, as found at https://github.com/hortonworks/registry. This will be prepended to each FlowFile. Note that if the schema for a record does not contain the necessary identifier and version, an Exception will be thrown when attempting to write the data.\",\n-                                        \"displayName\": \"HWX Content-Encoded Schema Reference\",\n-                                        \"value\": \"hwx-content-encoded-schema\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"America/Yellowknife\",\n+                                        \"value\": \"America/Yellowknife\"\n                                     },\n                                     {\n-                                        \"description\": \"The content of the FlowFile will contain a reference to a schema in the Schema Registry service. The reference is encoded as a single 'Magic Byte' followed by 4 bytes representing the identifier of the schema, as outlined at http://docs.confluent.io/current/schema-registry/docs/serializer-formatter.html. This will be prepended to each FlowFile. Note that if the schema for a record does not contain the necessary identifier and version, an Exception will be thrown when attempting to write the data. This is based on the encoding used by version 3.2.x of the Confluent Schema Registry.\",\n-                                        \"displayName\": \"Confluent Schema Registry Reference\",\n-                                        \"value\": \"confluent-encoded\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"no-schema\",\n-                                \"description\": \"Specifies how the schema for a Record should be added to the data.\",\n-                                \"displayName\": \"Schema Write Strategy\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Schema Write Strategy\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Time Format\": {\n-                                \"description\": \"Specifies the format to use when reading/writing Time fields. If not specified, Time fields will be assumed to be number of milliseconds since epoch (Midnight, Jan 1, 1970 GMT). If specified, the value must match the Java Simple Date Format (for example, HH:mm:ss for a two-digit hour in 24-hour format, followed by a two-digit minute, followed by a two-digit second, all separated by ':' characters, as in 18:04:15).\",\n-                                \"displayName\": \"Time Format\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Time Format\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Timestamp Format\": {\n-                                \"description\": \"Specifies the format to use when reading/writing Timestamp fields. If not specified, Timestamp fields will be assumed to be number of milliseconds since epoch (Midnight, Jan 1, 1970 GMT). If specified, the value must match the Java Simple Date Format (for example, MM/dd/yyyy HH:mm:ss for a two-digit month, followed by a two-digit day, followed by a four-digit year, all separated by '/' characters; and then followed by a two-digit hour in 24-hour format, followed by a two-digit minute, followed by a two-digit second, all separated by ':' characters, as in 01/01/2017 18:04:15).\",\n-                                \"displayName\": \"Timestamp Format\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Timestamp Format\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Trim Fields\": {\n-                                \"allowableValues\": [\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Antarctica/Casey\",\n+                                        \"value\": \"Antarctica/Casey\"\n+                                    },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"displayName\": \"Antarctica/Davis\",\n+                                        \"value\": \"Antarctica/Davis\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"true\",\n-                                \"dependencies\": [\n+                                        \"displayName\": \"Antarctica/DumontDUrville\",\n+                                        \"value\": \"Antarctica/DumontDUrville\"\n+                                    },\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"custom\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"CSV Format\",\n-                                        \"propertyName\": \"CSV Format\"\n-                                    }\n-                                ],\n-                                \"description\": \"Whether or not white space should be removed from the beginning and end of fields\",\n-                                \"displayName\": \"Trim Fields\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Trim Fields\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Value Separator\": {\n-                                \"defaultValue\": \",\",\n-                                \"dependencies\": [\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Antarctica/Macquarie\",\n+                                        \"value\": \"Antarctica/Macquarie\"\n+                                    },\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"custom\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"CSV Format\",\n-                                        \"propertyName\": \"CSV Format\"\n-                                    }\n-                                ],\n-                                \"description\": \"The character that is used to separate values/fields in a CSV Record. If the property has been specified via Expression Language but the expression gets evaluated to an invalid Value Separator at runtime, then it will be skipped and the default Value Separator will be used.\",\n-                                \"displayName\": \"Value Separator\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Value Separator\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"csvutils-character-set\": {\n-                                \"defaultValue\": \"UTF-8\",\n-                                \"description\": \"The Character Encoding that is used to encode/decode the CSV file\",\n-                                \"displayName\": \"Character Set\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"csvutils-character-set\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"schema-access-strategy\": {\n-                                \"allowableValues\": [\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Antarctica/Mawson\",\n+                                        \"value\": \"Antarctica/Mawson\"\n+                                    },\n                                     {\n-                                        \"description\": \"The schema used to write records will be the same schema that was given to the Record when the Record was created.\",\n-                                        \"displayName\": \"Inherit Record Schema\",\n-                                        \"value\": \"inherit-record-schema\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Antarctica/McMurdo\",\n+                                        \"value\": \"Antarctica/McMurdo\"\n                                     },\n                                     {\n-                                        \"description\": \"The name of the Schema to use is specified by the 'Schema Name' Property. The value of this property is used to lookup the Schema in the configured Schema Registry service.\",\n-                                        \"displayName\": \"Use 'Schema Name' Property\",\n-                                        \"value\": \"schema-name\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Antarctica/Palmer\",\n+                                        \"value\": \"Antarctica/Palmer\"\n                                     },\n                                     {\n-                                        \"description\": \"The text of the Schema itself is specified by the 'Schema Text' Property. The value of this property must be a valid Avro Schema. If Expression Language is used, the value of the 'Schema Text' property must be valid after substituting the expressions.\",\n-                                        \"displayName\": \"Use 'Schema Text' Property\",\n-                                        \"value\": \"schema-text-property\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"inherit-record-schema\",\n-                                \"description\": \"Specifies how to obtain the schema that is to be used for interpreting the data.\",\n-                                \"displayName\": \"Schema Access Strategy\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"schema-access-strategy\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"schema-branch\": {\n-                                \"dependencies\": [\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Antarctica/Rothera\",\n+                                        \"value\": \"Antarctica/Rothera\"\n+                                    },\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"schema-name\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n-                                        \"propertyName\": \"schema-access-strategy\"\n-                                    }\n-                                ],\n-                                \"description\": \"Specifies the name of the branch to use when looking up the schema in the Schema Registry property. If the chosen Schema Registry does not support branching, this value will be ignored.\",\n-                                \"displayName\": \"Schema Branch\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"schema-branch\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"schema-cache\": {\n-                                \"description\": \"Specifies a Schema Cache to add the Record Schema to so that Record Readers can quickly lookup the schema.\",\n-                                \"displayName\": \"Schema Cache\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"schema-cache\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.serialization.RecordSchemaCacheService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            },\n-                            \"schema-name\": {\n-                                \"defaultValue\": \"${schema.name}\",\n-                                \"dependencies\": [\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Antarctica/South_Pole\",\n+                                        \"value\": \"Antarctica/South_Pole\"\n+                                    },\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"schema-name\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n-                                        \"propertyName\": \"schema-access-strategy\"\n-                                    }\n-                                ],\n-                                \"description\": \"Specifies the name of the schema to lookup in the Schema Registry property\",\n-                                \"displayName\": \"Schema Name\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"schema-name\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"schema-protocol-version\": {\n-                                \"defaultValue\": \"1\",\n-                                \"dependencies\": [\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Antarctica/Syowa\",\n+                                        \"value\": \"Antarctica/Syowa\"\n+                                    },\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"hwx-schema-ref-attributes\",\n-                                            \"hwx-content-encoded-schema\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Schema Write Strategy\",\n-                                        \"propertyName\": \"Schema Write Strategy\"\n-                                    }\n-                                ],\n-                                \"description\": \"The protocol version to be used for Schema Write Strategies that require a protocol version, such as Hortonworks Schema Registry strategies. Valid protocol versions for Hortonworks Schema Registry are integer values 1, 2, or 3.\",\n-                                \"displayName\": \"Schema Protocol Version\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"schema-protocol-version\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"schema-registry\": {\n-                                \"dependencies\": [\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Antarctica/Troll\",\n+                                        \"value\": \"Antarctica/Troll\"\n+                                    },\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"confluent-encoded\",\n-                                            \"schema-name\",\n-                                            \"hwx-schema-ref-attributes\",\n-                                            \"hwx-content-encoded-schema\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n-                                        \"propertyName\": \"schema-access-strategy\"\n-                                    }\n-                                ],\n-                                \"description\": \"Specifies the Controller Service to use for the Schema Registry\",\n-                                \"displayName\": \"Schema Registry\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"schema-registry\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.schemaregistry.services.SchemaRegistry\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            },\n-                            \"schema-text\": {\n-                                \"defaultValue\": \"${avro.schema}\",\n-                                \"dependencies\": [\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Antarctica/Vostok\",\n+                                        \"value\": \"Antarctica/Vostok\"\n+                                    },\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"schema-text-property\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n-                                        \"propertyName\": \"schema-access-strategy\"\n-                                    }\n-                                ],\n-                                \"description\": \"The text of an Avro-formatted Schema\",\n-                                \"displayName\": \"Schema Text\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"schema-text\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"schema-version\": {\n-                                \"dependencies\": [\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Arctic/Longyearbyen\",\n+                                        \"value\": \"Arctic/Longyearbyen\"\n+                                    },\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"schema-name\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n-                                        \"propertyName\": \"schema-access-strategy\"\n-                                    }\n-                                ],\n-                                \"description\": \"Specifies the version of the schema to lookup in the Schema Registry. If not specified then the latest version of the schema will be retrieved.\",\n-                                \"displayName\": \"Schema Version\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"schema-version\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            }\n-                        },\n-                        \"providedApiImplementations\": [\n-                            {\n-                                \"artifact\": \"nifi-standard-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n-                                \"version\": \"1.27.0\"\n-                            }\n-                        ],\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"csv\",\n-                            \"delimited\",\n-                            \"record\",\n-                            \"recordset\",\n-                            \"result\",\n-                            \"row\",\n-                            \"separated\",\n-                            \"serializer\",\n-                            \"set\",\n-                            \"tab\",\n-                            \"tsv\",\n-                            \"writer\"\n-                        ],\n-                        \"type\": \"org.apache.nifi.csv.CSVRecordSetWriter\",\n-                        \"typeDescription\": \"Writes the contents of a RecordSet as CSV data. The first line written will be the column names (unless the 'Include Header Line' property is false). All subsequent lines will be the values corresponding to the record fields.\",\n-                        \"version\": \"1.27.0\"\n-                    },\n-                    {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-record-serialization-services-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"e0c4461\"\n-                        },\n-                        \"explicitRestrictions\": [\n-                            {\n-                                \"explanation\": \"Patterns and Expressions can reference resources over HTTP\",\n-                                \"requiredPermission\": \"reference remote resources\"\n-                            }\n-                        ],\n-                        \"group\": \"org.apache.nifi\",\n-                        \"propertyDescriptors\": {\n-                            \"Grok Expression\": {\n-                                \"description\": \"Specifies the format of a log line in Grok format. This allows the Record Reader to understand how to parse each log line. The property supports one or more Grok expressions. The Reader attempts to parse input lines according to the configured order of the expressions.If a line in the log file does not match any expressions, the line will be assumed to belong to the previous log message.If other Grok patterns are referenced by this expression, they need to be supplied in the Grok Pattern File property.\",\n-                                \"displayName\": \"Grok Expressions\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Grok Expression\",\n-                                \"required\": true,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"SINGLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\",\n-                                        \"URL\",\n-                                        \"TEXT\"\n-                                    ]\n-                                },\n-                                \"sensitive\": false\n-                            },\n-                            \"Grok Pattern File\": {\n-                                \"description\": \"Grok Patterns to use for parsing logs. If not specified, a built-in default Pattern file will be used. If specified, all patterns specified will override the default patterns. See the Controller Service's Additional Details for a list of pre-defined patterns.\",\n-                                \"displayName\": \"Grok Patterns\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Grok Pattern File\",\n-                                \"required\": false,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"SINGLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\",\n-                                        \"URL\",\n-                                        \"TEXT\"\n-                                    ]\n-                                },\n-                                \"sensitive\": false\n-                            },\n-                            \"no-match-behavior\": {\n-                                \"allowableValues\": [\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Asia/Aden\",\n+                                        \"value\": \"Asia/Aden\"\n+                                    },\n                                     {\n-                                        \"description\": \"The line of text that does not match the Grok Expression will be appended to the last field of the prior message.\",\n-                                        \"displayName\": \"Append to Previous Message\",\n-                                        \"value\": \"append-to-previous-message\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Asia/Almaty\",\n+                                        \"value\": \"Asia/Almaty\"\n                                     },\n                                     {\n-                                        \"description\": \"The line of text that does not match the Grok Expression will be skipped.\",\n-                                        \"displayName\": \"Skip Line\",\n-                                        \"value\": \"skip-line\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Asia/Amman\",\n+                                        \"value\": \"Asia/Amman\"\n                                     },\n                                     {\n-                                        \"description\": \"The line of text that does not match the Grok Expression will only be added to the _raw field.\",\n-                                        \"displayName\": \"Raw Line\",\n-                                        \"value\": \"raw-line\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"append-to-previous-message\",\n-                                \"description\": \"If a line of text is encountered and it does not match the given Grok Expression, and it is not part of a stack trace, this property specifies how the text should be processed.\",\n-                                \"displayName\": \"No Match Behavior\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"no-match-behavior\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"schema-access-strategy\": {\n-                                \"allowableValues\": [\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Asia/Anadyr\",\n+                                        \"value\": \"Asia/Anadyr\"\n+                                    },\n                                     {\n-                                        \"description\": \"The schema will be derived using the field names present in all configured Grok Expressions. All schema fields will have a String type and will be marked as nullable. The schema will also include a `stackTrace` field, and a `_raw` field containing the input line string.\",\n-                                        \"displayName\": \"Use String Fields From Grok Expression\",\n-                                        \"value\": \"string-fields-from-grok-expression\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Asia/Aqtau\",\n+                                        \"value\": \"Asia/Aqtau\"\n                                     },\n                                     {\n-                                        \"description\": \"The name of the Schema to use is specified by the 'Schema Name' Property. The value of this property is used to lookup the Schema in the configured Schema Registry service.\",\n-                                        \"displayName\": \"Use 'Schema Name' Property\",\n-                                        \"value\": \"schema-name\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Asia/Aqtobe\",\n+                                        \"value\": \"Asia/Aqtobe\"\n                                     },\n                                     {\n-                                        \"description\": \"The text of the Schema itself is specified by the 'Schema Text' Property. The value of this property must be a valid Avro Schema. If Expression Language is used, the value of the 'Schema Text' property must be valid after substituting the expressions.\",\n-                                        \"displayName\": \"Use 'Schema Text' Property\",\n-                                        \"value\": \"schema-text-property\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Asia/Ashgabat\",\n+                                        \"value\": \"Asia/Ashgabat\"\n                                     },\n                                     {\n-                                        \"description\": \"The FlowFile contains 3 Attributes that will be used to lookup a Schema from the configured Schema Registry: 'schema.identifier', 'schema.version', and 'schema.protocol.version'\",\n-                                        \"displayName\": \"HWX Schema Reference Attributes\",\n-                                        \"value\": \"hwx-schema-ref-attributes\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Asia/Ashkhabad\",\n+                                        \"value\": \"Asia/Ashkhabad\"\n                                     },\n                                     {\n-                                        \"description\": \"The content of the FlowFile contains a reference to a schema in the Schema Registry service. The reference is encoded as a single byte indicating the 'protocol version', followed by 8 bytes indicating the schema identifier, and finally 4 bytes indicating the schema version, as per the Hortonworks Schema Registry serializers and deserializers, found at https://github.com/hortonworks/registry\",\n-                                        \"displayName\": \"HWX Content-Encoded Schema Reference\",\n-                                        \"value\": \"hwx-content-encoded-schema\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Asia/Atyrau\",\n+                                        \"value\": \"Asia/Atyrau\"\n                                     },\n                                     {\n-                                        \"description\": \"The content of the FlowFile contains a reference to a schema in the Schema Registry service. The reference is encoded as a single 'Magic Byte' followed by 4 bytes representing the identifier of the schema, as outlined at http://docs.confluent.io/current/schema-registry/docs/serializer-formatter.html. This is based on version 3.2.x of the Confluent Schema Registry.\",\n-                                        \"displayName\": \"Confluent Content-Encoded Schema Reference\",\n-                                        \"value\": \"confluent-encoded\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"string-fields-from-grok-expression\",\n-                                \"description\": \"Specifies how to obtain the schema that is to be used for interpreting the data.\",\n-                                \"displayName\": \"Schema Access Strategy\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"schema-access-strategy\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"schema-branch\": {\n-                                \"dependencies\": [\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Asia/Baghdad\",\n+                                        \"value\": \"Asia/Baghdad\"\n+                                    },\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"schema-name\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n-                                        \"propertyName\": \"schema-access-strategy\"\n-                                    }\n-                                ],\n-                                \"description\": \"Specifies the name of the branch to use when looking up the schema in the Schema Registry property. If the chosen Schema Registry does not support branching, this value will be ignored.\",\n-                                \"displayName\": \"Schema Branch\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"schema-branch\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"schema-name\": {\n-                                \"defaultValue\": \"${schema.name}\",\n-                                \"dependencies\": [\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Asia/Bahrain\",\n+                                        \"value\": \"Asia/Bahrain\"\n+                                    },\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"schema-name\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n-                                        \"propertyName\": \"schema-access-strategy\"\n-                                    }\n-                                ],\n-                                \"description\": \"Specifies the name of the schema to lookup in the Schema Registry property\",\n-                                \"displayName\": \"Schema Name\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"schema-name\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"schema-registry\": {\n-                                \"dependencies\": [\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Asia/Baku\",\n+                                        \"value\": \"Asia/Baku\"\n+                                    },\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"confluent-encoded\",\n-                                            \"schema-name\",\n-                                            \"hwx-schema-ref-attributes\",\n-                                            \"hwx-content-encoded-schema\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n-                                        \"propertyName\": \"schema-access-strategy\"\n-                                    }\n-                                ],\n-                                \"description\": \"Specifies the Controller Service to use for the Schema Registry\",\n-                                \"displayName\": \"Schema Registry\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"schema-registry\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.schemaregistry.services.SchemaRegistry\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            },\n-                            \"schema-text\": {\n-                                \"defaultValue\": \"${avro.schema}\",\n-                                \"dependencies\": [\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Asia/Bangkok\",\n+                                        \"value\": \"Asia/Bangkok\"\n+                                    },\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"schema-text-property\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n-                                        \"propertyName\": \"schema-access-strategy\"\n-                                    }\n-                                ],\n-                                \"description\": \"The text of an Avro-formatted Schema\",\n-                                \"displayName\": \"Schema Text\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"schema-text\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"schema-version\": {\n-                                \"dependencies\": [\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Asia/Barnaul\",\n+                                        \"value\": \"Asia/Barnaul\"\n+                                    },\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"schema-name\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n-                                        \"propertyName\": \"schema-access-strategy\"\n-                                    }\n-                                ],\n-                                \"description\": \"Specifies the version of the schema to lookup in the Schema Registry. If not specified then the latest version of the schema will be retrieved.\",\n-                                \"displayName\": \"Schema Version\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"schema-version\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            }\n-                        },\n-                        \"providedApiImplementations\": [\n-                            {\n-                                \"artifact\": \"nifi-standard-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n-                                \"version\": \"1.27.0\"\n-                            }\n-                        ],\n-                        \"restricted\": true,\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"grok\",\n-                            \"logfiles\",\n-                            \"logs\",\n-                            \"logstash\",\n-                            \"parse\",\n-                            \"pattern\",\n-                            \"reader\",\n-                            \"record\",\n-                            \"regex\",\n-                            \"text\",\n-                            \"unstructured\"\n-                        ],\n-                        \"type\": \"org.apache.nifi.grok.GrokReader\",\n-                        \"typeDescription\": \"Provides a mechanism for reading unstructured text data, such as log files, and structuring the data so that it can be processed. The service is configured using Grok patterns. The service reads from a stream of data and splits each message that it finds into a separate Record, each containing the fields that are configured. If a line in the input does not match the expected message pattern, the line of text is either considered to be part of the previous message or is skipped, depending on the configuration, with the exception of stack traces. A stack trace that is found at the end of a log message is considered to be part of the previous message but is added to the 'stackTrace' field of the Record. If a record has no stack trace, it will have a NULL value for the stackTrace field (assuming that the schema does in fact include a stackTrace field of type String). Assuming that the schema includes a '_raw' field of type String, the raw message will be included in the Record.\",\n-                        \"version\": \"1.27.0\"\n-                    },\n-                    {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-record-serialization-services-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"e0c4461\"\n-                        },\n-                        \"dynamicProperties\": [\n-                            {\n-                                \"description\": \"User-defined properties identify how to extract specific fields from a JSON object in order to create a Record\",\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"name\": \"The field name for the record.\",\n-                                \"value\": \"A JSONPath Expression that will be evaluated against each JSON record. The result of the JSONPath will be the value of the field whose name is the same as the property name.\"\n-                            }\n-                        ],\n-                        \"group\": \"org.apache.nifi\",\n-                        \"propertyDescriptors\": {\n-                            \"Allow Comments\": {\n-                                \"allowableValues\": [\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Asia/Beirut\",\n+                                        \"value\": \"Asia/Beirut\"\n+                                    },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"displayName\": \"Asia/Bishkek\",\n+                                        \"value\": \"Asia/Bishkek\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"Whether to allow comments when parsing the JSON document\",\n-                                \"displayName\": \"Allow Comments\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Allow Comments\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Date Format\": {\n-                                \"description\": \"Specifies the format to use when reading/writing Date fields. If not specified, Date fields will be assumed to be number of milliseconds since epoch (Midnight, Jan 1, 1970 GMT). If specified, the value must match the Java Simple Date Format (for example, MM/dd/yyyy for a two-digit month, followed by a two-digit day, followed by a four-digit year, all separated by '/' characters, as in 01/01/2017).\",\n-                                \"displayName\": \"Date Format\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Date Format\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Max String Length\": {\n-                                \"defaultValue\": \"20 MB\",\n-                                \"description\": \"The maximum allowed length of a string value when parsing the JSON document\",\n-                                \"displayName\": \"Max String Length\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Max String Length\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Time Format\": {\n-                                \"description\": \"Specifies the format to use when reading/writing Time fields. If not specified, Time fields will be assumed to be number of milliseconds since epoch (Midnight, Jan 1, 1970 GMT). If specified, the value must match the Java Simple Date Format (for example, HH:mm:ss for a two-digit hour in 24-hour format, followed by a two-digit minute, followed by a two-digit second, all separated by ':' characters, as in 18:04:15).\",\n-                                \"displayName\": \"Time Format\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Time Format\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Timestamp Format\": {\n-                                \"description\": \"Specifies the format to use when reading/writing Timestamp fields. If not specified, Timestamp fields will be assumed to be number of milliseconds since epoch (Midnight, Jan 1, 1970 GMT). If specified, the value must match the Java Simple Date Format (for example, MM/dd/yyyy HH:mm:ss for a two-digit month, followed by a two-digit day, followed by a four-digit year, all separated by '/' characters; and then followed by a two-digit hour in 24-hour format, followed by a two-digit minute, followed by a two-digit second, all separated by ':' characters, as in 01/01/2017 18:04:15).\",\n-                                \"displayName\": \"Timestamp Format\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Timestamp Format\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"schema-access-strategy\": {\n-                                \"allowableValues\": [\n+                                        \"displayName\": \"Asia/Brunei\",\n+                                        \"value\": \"Asia/Brunei\"\n+                                    },\n                                     {\n-                                        \"description\": \"The name of the Schema to use is specified by the 'Schema Name' Property. The value of this property is used to lookup the Schema in the configured Schema Registry service.\",\n-                                        \"displayName\": \"Use 'Schema Name' Property\",\n-                                        \"value\": \"schema-name\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Asia/Calcutta\",\n+                                        \"value\": \"Asia/Calcutta\"\n                                     },\n                                     {\n-                                        \"description\": \"The text of the Schema itself is specified by the 'Schema Text' Property. The value of this property must be a valid Avro Schema. If Expression Language is used, the value of the 'Schema Text' property must be valid after substituting the expressions.\",\n-                                        \"displayName\": \"Use 'Schema Text' Property\",\n-                                        \"value\": \"schema-text-property\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Asia/Chita\",\n+                                        \"value\": \"Asia/Chita\"\n                                     },\n                                     {\n-                                        \"description\": \"The FlowFile contains 3 Attributes that will be used to lookup a Schema from the configured Schema Registry: 'schema.identifier', 'schema.version', and 'schema.protocol.version'\",\n-                                        \"displayName\": \"HWX Schema Reference Attributes\",\n-                                        \"value\": \"hwx-schema-ref-attributes\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Asia/Choibalsan\",\n+                                        \"value\": \"Asia/Choibalsan\"\n                                     },\n                                     {\n-                                        \"description\": \"The content of the FlowFile contains a reference to a schema in the Schema Registry service. The reference is encoded as a single byte indicating the 'protocol version', followed by 8 bytes indicating the schema identifier, and finally 4 bytes indicating the schema version, as per the Hortonworks Schema Registry serializers and deserializers, found at https://github.com/hortonworks/registry\",\n-                                        \"displayName\": \"HWX Content-Encoded Schema Reference\",\n-                                        \"value\": \"hwx-content-encoded-schema\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Asia/Chongqing\",\n+                                        \"value\": \"Asia/Chongqing\"\n                                     },\n                                     {\n-                                        \"description\": \"The content of the FlowFile contains a reference to a schema in the Schema Registry service. The reference is encoded as a single 'Magic Byte' followed by 4 bytes representing the identifier of the schema, as outlined at http://docs.confluent.io/current/schema-registry/docs/serializer-formatter.html. This is based on version 3.2.x of the Confluent Schema Registry.\",\n-                                        \"displayName\": \"Confluent Content-Encoded Schema Reference\",\n-                                        \"value\": \"confluent-encoded\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Asia/Chungking\",\n+                                        \"value\": \"Asia/Chungking\"\n                                     },\n                                     {\n-                                        \"description\": \"The Schema of the data will be inferred automatically when the data is read. See component Usage and Additional Details for information about how the schema is inferred.\",\n-                                        \"displayName\": \"Infer Schema\",\n-                                        \"value\": \"infer-schema\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"infer-schema\",\n-                                \"description\": \"Specifies how to obtain the schema that is to be used for interpreting the data.\",\n-                                \"displayName\": \"Schema Access Strategy\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"schema-access-strategy\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"schema-branch\": {\n-                                \"dependencies\": [\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Asia/Colombo\",\n+                                        \"value\": \"Asia/Colombo\"\n+                                    },\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"schema-name\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n-                                        \"propertyName\": \"schema-access-strategy\"\n-                                    }\n-                                ],\n-                                \"description\": \"Specifies the name of the branch to use when looking up the schema in the Schema Registry property. If the chosen Schema Registry does not support branching, this value will be ignored.\",\n-                                \"displayName\": \"Schema Branch\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"schema-branch\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"schema-name\": {\n-                                \"defaultValue\": \"${schema.name}\",\n-                                \"dependencies\": [\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Asia/Dacca\",\n+                                        \"value\": \"Asia/Dacca\"\n+                                    },\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"schema-name\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n-                                        \"propertyName\": \"schema-access-strategy\"\n-                                    }\n-                                ],\n-                                \"description\": \"Specifies the name of the schema to lookup in the Schema Registry property\",\n-                                \"displayName\": \"Schema Name\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"schema-name\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"schema-registry\": {\n-                                \"dependencies\": [\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Asia/Damascus\",\n+                                        \"value\": \"Asia/Damascus\"\n+                                    },\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"confluent-encoded\",\n-                                            \"schema-name\",\n-                                            \"hwx-schema-ref-attributes\",\n-                                            \"hwx-content-encoded-schema\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n-                                        \"propertyName\": \"schema-access-strategy\"\n-                                    }\n-                                ],\n-                                \"description\": \"Specifies the Controller Service to use for the Schema Registry\",\n-                                \"displayName\": \"Schema Registry\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"schema-registry\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.schemaregistry.services.SchemaRegistry\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            },\n-                            \"schema-text\": {\n-                                \"defaultValue\": \"${avro.schema}\",\n-                                \"dependencies\": [\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Asia/Dhaka\",\n+                                        \"value\": \"Asia/Dhaka\"\n+                                    },\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"schema-text-property\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n-                                        \"propertyName\": \"schema-access-strategy\"\n-                                    }\n-                                ],\n-                                \"description\": \"The text of an Avro-formatted Schema\",\n-                                \"displayName\": \"Schema Text\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"schema-text\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"schema-version\": {\n-                                \"dependencies\": [\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Asia/Dili\",\n+                                        \"value\": \"Asia/Dili\"\n+                                    },\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"schema-name\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n-                                        \"propertyName\": \"schema-access-strategy\"\n-                                    }\n-                                ],\n-                                \"description\": \"Specifies the version of the schema to lookup in the Schema Registry. If not specified then the latest version of the schema will be retrieved.\",\n-                                \"displayName\": \"Schema Version\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"schema-version\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            }\n-                        },\n-                        \"providedApiImplementations\": [\n-                            {\n-                                \"artifact\": \"nifi-standard-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n-                                \"version\": \"1.27.0\"\n-                            }\n-                        ],\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.json.JsonTreeReader\"\n-                        ],\n-                        \"supportsDynamicProperties\": true,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"json\",\n-                            \"jsonpath\",\n-                            \"parser\",\n-                            \"reader\",\n-                            \"record\"\n-                        ],\n-                        \"type\": \"org.apache.nifi.json.JsonPathReader\",\n-                        \"typeDescription\": \"Parses JSON records and evaluates user-defined JSON Path's against each JSON object. While the reader expects each record to be well-formed JSON, the content of a FlowFile may consist of many records, each as a well-formed JSON array or JSON object with optional whitespace between them, such as the common 'JSON-per-line' format. If an array is encountered, each element in that array will be treated as a separate record. User-defined properties define the fields that should be extracted from the JSON in order to form the fields of a Record. Any JSON field that is not extracted via a JSONPath will not be returned in the JSON Records.\",\n-                        \"version\": \"1.27.0\"\n-                    },\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-record-serialization-services-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"e0c4461\"\n-                        },\n-                        \"group\": \"org.apache.nifi\",\n-                        \"propertyDescriptors\": {\n-                            \"Allow Scientific Notation\": {\n-                                \"allowableValues\": [\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Asia/Dubai\",\n+                                        \"value\": \"Asia/Dubai\"\n+                                    },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"displayName\": \"Asia/Dushanbe\",\n+                                        \"value\": \"Asia/Dushanbe\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"Specifies whether or not scientific notation should be used when writing numbers\",\n-                                \"displayName\": \"Allow Scientific Notation\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Allow Scientific Notation\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Date Format\": {\n-                                \"description\": \"Specifies the format to use when reading/writing Date fields. If not specified, Date fields will be assumed to be number of milliseconds since epoch (Midnight, Jan 1, 1970 GMT). If specified, the value must match the Java Simple Date Format (for example, MM/dd/yyyy for a two-digit month, followed by a two-digit day, followed by a four-digit year, all separated by '/' characters, as in 01/01/2017).\",\n-                                \"displayName\": \"Date Format\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Date Format\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Pretty Print JSON\": {\n-                                \"allowableValues\": [\n+                                        \"displayName\": \"Asia/Famagusta\",\n+                                        \"value\": \"Asia/Famagusta\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Asia/Gaza\",\n+                                        \"value\": \"Asia/Gaza\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Asia/Harbin\",\n+                                        \"value\": \"Asia/Harbin\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Asia/Hebron\",\n+                                        \"value\": \"Asia/Hebron\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Asia/Ho_Chi_Minh\",\n+                                        \"value\": \"Asia/Ho_Chi_Minh\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Asia/Hong_Kong\",\n+                                        \"value\": \"Asia/Hong_Kong\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Asia/Hovd\",\n+                                        \"value\": \"Asia/Hovd\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Asia/Irkutsk\",\n+                                        \"value\": \"Asia/Irkutsk\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Asia/Istanbul\",\n+                                        \"value\": \"Asia/Istanbul\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Asia/Jakarta\",\n+                                        \"value\": \"Asia/Jakarta\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Asia/Jayapura\",\n+                                        \"value\": \"Asia/Jayapura\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Asia/Jerusalem\",\n+                                        \"value\": \"Asia/Jerusalem\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Asia/Kabul\",\n+                                        \"value\": \"Asia/Kabul\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Asia/Kamchatka\",\n+                                        \"value\": \"Asia/Kamchatka\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Asia/Karachi\",\n+                                        \"value\": \"Asia/Karachi\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Asia/Kashgar\",\n+                                        \"value\": \"Asia/Kashgar\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Asia/Kathmandu\",\n+                                        \"value\": \"Asia/Kathmandu\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Asia/Katmandu\",\n+                                        \"value\": \"Asia/Katmandu\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Asia/Khandyga\",\n+                                        \"value\": \"Asia/Khandyga\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Asia/Kolkata\",\n+                                        \"value\": \"Asia/Kolkata\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Asia/Krasnoyarsk\",\n+                                        \"value\": \"Asia/Krasnoyarsk\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Asia/Kuala_Lumpur\",\n+                                        \"value\": \"Asia/Kuala_Lumpur\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Asia/Kuching\",\n+                                        \"value\": \"Asia/Kuching\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Asia/Kuwait\",\n+                                        \"value\": \"Asia/Kuwait\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Asia/Macao\",\n+                                        \"value\": \"Asia/Macao\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Asia/Macau\",\n+                                        \"value\": \"Asia/Macau\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Asia/Magadan\",\n+                                        \"value\": \"Asia/Magadan\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Asia/Makassar\",\n+                                        \"value\": \"Asia/Makassar\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Asia/Manila\",\n+                                        \"value\": \"Asia/Manila\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Asia/Muscat\",\n+                                        \"value\": \"Asia/Muscat\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Asia/Nicosia\",\n+                                        \"value\": \"Asia/Nicosia\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Asia/Novokuznetsk\",\n+                                        \"value\": \"Asia/Novokuznetsk\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Asia/Novosibirsk\",\n+                                        \"value\": \"Asia/Novosibirsk\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Asia/Omsk\",\n+                                        \"value\": \"Asia/Omsk\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Asia/Oral\",\n+                                        \"value\": \"Asia/Oral\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Asia/Phnom_Penh\",\n+                                        \"value\": \"Asia/Phnom_Penh\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Asia/Pontianak\",\n+                                        \"value\": \"Asia/Pontianak\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Asia/Pyongyang\",\n+                                        \"value\": \"Asia/Pyongyang\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Asia/Qatar\",\n+                                        \"value\": \"Asia/Qatar\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Asia/Qostanay\",\n+                                        \"value\": \"Asia/Qostanay\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Asia/Qyzylorda\",\n+                                        \"value\": \"Asia/Qyzylorda\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Asia/Rangoon\",\n+                                        \"value\": \"Asia/Rangoon\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Asia/Riyadh\",\n+                                        \"value\": \"Asia/Riyadh\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Asia/Saigon\",\n+                                        \"value\": \"Asia/Saigon\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Asia/Sakhalin\",\n+                                        \"value\": \"Asia/Sakhalin\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Asia/Samarkand\",\n+                                        \"value\": \"Asia/Samarkand\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Asia/Seoul\",\n+                                        \"value\": \"Asia/Seoul\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Asia/Shanghai\",\n+                                        \"value\": \"Asia/Shanghai\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Asia/Singapore\",\n+                                        \"value\": \"Asia/Singapore\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Asia/Srednekolymsk\",\n+                                        \"value\": \"Asia/Srednekolymsk\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Asia/Taipei\",\n+                                        \"value\": \"Asia/Taipei\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Asia/Tashkent\",\n+                                        \"value\": \"Asia/Tashkent\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Asia/Tbilisi\",\n+                                        \"value\": \"Asia/Tbilisi\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Asia/Tehran\",\n+                                        \"value\": \"Asia/Tehran\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Asia/Tel_Aviv\",\n+                                        \"value\": \"Asia/Tel_Aviv\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Asia/Thimbu\",\n+                                        \"value\": \"Asia/Thimbu\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Asia/Thimphu\",\n+                                        \"value\": \"Asia/Thimphu\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Asia/Tokyo\",\n+                                        \"value\": \"Asia/Tokyo\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Asia/Tomsk\",\n+                                        \"value\": \"Asia/Tomsk\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Asia/Ujung_Pandang\",\n+                                        \"value\": \"Asia/Ujung_Pandang\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Asia/Ulaanbaatar\",\n+                                        \"value\": \"Asia/Ulaanbaatar\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Asia/Ulan_Bator\",\n+                                        \"value\": \"Asia/Ulan_Bator\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Asia/Urumqi\",\n+                                        \"value\": \"Asia/Urumqi\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Asia/Ust-Nera\",\n+                                        \"value\": \"Asia/Ust-Nera\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Asia/Vientiane\",\n+                                        \"value\": \"Asia/Vientiane\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Asia/Vladivostok\",\n+                                        \"value\": \"Asia/Vladivostok\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Asia/Yakutsk\",\n+                                        \"value\": \"Asia/Yakutsk\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Asia/Yangon\",\n+                                        \"value\": \"Asia/Yangon\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Asia/Yekaterinburg\",\n+                                        \"value\": \"Asia/Yekaterinburg\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Asia/Yerevan\",\n+                                        \"value\": \"Asia/Yerevan\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Atlantic/Azores\",\n+                                        \"value\": \"Atlantic/Azores\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Atlantic/Bermuda\",\n+                                        \"value\": \"Atlantic/Bermuda\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Atlantic/Canary\",\n+                                        \"value\": \"Atlantic/Canary\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Atlantic/Cape_Verde\",\n+                                        \"value\": \"Atlantic/Cape_Verde\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Atlantic/Faeroe\",\n+                                        \"value\": \"Atlantic/Faeroe\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Atlantic/Faroe\",\n+                                        \"value\": \"Atlantic/Faroe\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Atlantic/Jan_Mayen\",\n+                                        \"value\": \"Atlantic/Jan_Mayen\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Atlantic/Madeira\",\n+                                        \"value\": \"Atlantic/Madeira\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Atlantic/Reykjavik\",\n+                                        \"value\": \"Atlantic/Reykjavik\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Atlantic/South_Georgia\",\n+                                        \"value\": \"Atlantic/South_Georgia\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Atlantic/St_Helena\",\n+                                        \"value\": \"Atlantic/St_Helena\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Atlantic/Stanley\",\n+                                        \"value\": \"Atlantic/Stanley\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Australia/ACT\",\n+                                        \"value\": \"Australia/ACT\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Australia/Adelaide\",\n+                                        \"value\": \"Australia/Adelaide\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Australia/Brisbane\",\n+                                        \"value\": \"Australia/Brisbane\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Australia/Broken_Hill\",\n+                                        \"value\": \"Australia/Broken_Hill\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Australia/Canberra\",\n+                                        \"value\": \"Australia/Canberra\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Australia/Currie\",\n+                                        \"value\": \"Australia/Currie\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Australia/Darwin\",\n+                                        \"value\": \"Australia/Darwin\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Australia/Eucla\",\n+                                        \"value\": \"Australia/Eucla\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Australia/Hobart\",\n+                                        \"value\": \"Australia/Hobart\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Australia/LHI\",\n+                                        \"value\": \"Australia/LHI\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Australia/Lindeman\",\n+                                        \"value\": \"Australia/Lindeman\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Australia/Lord_Howe\",\n+                                        \"value\": \"Australia/Lord_Howe\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Australia/Melbourne\",\n+                                        \"value\": \"Australia/Melbourne\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Australia/NSW\",\n+                                        \"value\": \"Australia/NSW\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Australia/North\",\n+                                        \"value\": \"Australia/North\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Australia/Perth\",\n+                                        \"value\": \"Australia/Perth\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Australia/Queensland\",\n+                                        \"value\": \"Australia/Queensland\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Australia/South\",\n+                                        \"value\": \"Australia/South\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Australia/Sydney\",\n+                                        \"value\": \"Australia/Sydney\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Australia/Tasmania\",\n+                                        \"value\": \"Australia/Tasmania\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Australia/Victoria\",\n+                                        \"value\": \"Australia/Victoria\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Australia/West\",\n+                                        \"value\": \"Australia/West\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Australia/Yancowinna\",\n+                                        \"value\": \"Australia/Yancowinna\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Brazil/Acre\",\n+                                        \"value\": \"Brazil/Acre\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Brazil/DeNoronha\",\n+                                        \"value\": \"Brazil/DeNoronha\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Brazil/East\",\n+                                        \"value\": \"Brazil/East\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Brazil/West\",\n+                                        \"value\": \"Brazil/West\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"CET\",\n+                                        \"value\": \"CET\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"CST6CDT\",\n+                                        \"value\": \"CST6CDT\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Canada/Atlantic\",\n+                                        \"value\": \"Canada/Atlantic\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Canada/Central\",\n+                                        \"value\": \"Canada/Central\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Canada/Eastern\",\n+                                        \"value\": \"Canada/Eastern\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Canada/Mountain\",\n+                                        \"value\": \"Canada/Mountain\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Canada/Newfoundland\",\n+                                        \"value\": \"Canada/Newfoundland\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Canada/Pacific\",\n+                                        \"value\": \"Canada/Pacific\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Canada/Saskatchewan\",\n+                                        \"value\": \"Canada/Saskatchewan\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Canada/Yukon\",\n+                                        \"value\": \"Canada/Yukon\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Chile/Continental\",\n+                                        \"value\": \"Chile/Continental\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Chile/EasterIsland\",\n+                                        \"value\": \"Chile/EasterIsland\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Cuba\",\n+                                        \"value\": \"Cuba\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"EET\",\n+                                        \"value\": \"EET\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"EST5EDT\",\n+                                        \"value\": \"EST5EDT\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Egypt\",\n+                                        \"value\": \"Egypt\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Eire\",\n+                                        \"value\": \"Eire\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Etc/GMT\",\n+                                        \"value\": \"Etc/GMT\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Etc/GMT+0\",\n+                                        \"value\": \"Etc/GMT+0\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Etc/GMT+1\",\n+                                        \"value\": \"Etc/GMT+1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Etc/GMT+10\",\n+                                        \"value\": \"Etc/GMT+10\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Etc/GMT+11\",\n+                                        \"value\": \"Etc/GMT+11\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Etc/GMT+12\",\n+                                        \"value\": \"Etc/GMT+12\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Etc/GMT+2\",\n+                                        \"value\": \"Etc/GMT+2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Etc/GMT+3\",\n+                                        \"value\": \"Etc/GMT+3\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Etc/GMT+4\",\n+                                        \"value\": \"Etc/GMT+4\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Etc/GMT+5\",\n+                                        \"value\": \"Etc/GMT+5\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Etc/GMT+6\",\n+                                        \"value\": \"Etc/GMT+6\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Etc/GMT+7\",\n+                                        \"value\": \"Etc/GMT+7\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Etc/GMT+8\",\n+                                        \"value\": \"Etc/GMT+8\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Etc/GMT+9\",\n+                                        \"value\": \"Etc/GMT+9\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Etc/GMT-0\",\n+                                        \"value\": \"Etc/GMT-0\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Etc/GMT-1\",\n+                                        \"value\": \"Etc/GMT-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Etc/GMT-10\",\n+                                        \"value\": \"Etc/GMT-10\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Etc/GMT-11\",\n+                                        \"value\": \"Etc/GMT-11\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Etc/GMT-12\",\n+                                        \"value\": \"Etc/GMT-12\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Etc/GMT-13\",\n+                                        \"value\": \"Etc/GMT-13\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Etc/GMT-14\",\n+                                        \"value\": \"Etc/GMT-14\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Etc/GMT-2\",\n+                                        \"value\": \"Etc/GMT-2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Etc/GMT-3\",\n+                                        \"value\": \"Etc/GMT-3\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Etc/GMT-4\",\n+                                        \"value\": \"Etc/GMT-4\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Etc/GMT-5\",\n+                                        \"value\": \"Etc/GMT-5\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Etc/GMT-6\",\n+                                        \"value\": \"Etc/GMT-6\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Etc/GMT-7\",\n+                                        \"value\": \"Etc/GMT-7\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Etc/GMT-8\",\n+                                        \"value\": \"Etc/GMT-8\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Etc/GMT-9\",\n+                                        \"value\": \"Etc/GMT-9\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Etc/GMT0\",\n+                                        \"value\": \"Etc/GMT0\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Etc/Greenwich\",\n+                                        \"value\": \"Etc/Greenwich\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Etc/UCT\",\n+                                        \"value\": \"Etc/UCT\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Etc/UTC\",\n+                                        \"value\": \"Etc/UTC\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Etc/Universal\",\n+                                        \"value\": \"Etc/Universal\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Etc/Zulu\",\n+                                        \"value\": \"Etc/Zulu\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Europe/Amsterdam\",\n+                                        \"value\": \"Europe/Amsterdam\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Europe/Andorra\",\n+                                        \"value\": \"Europe/Andorra\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Europe/Astrakhan\",\n+                                        \"value\": \"Europe/Astrakhan\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Europe/Athens\",\n+                                        \"value\": \"Europe/Athens\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Europe/Belfast\",\n+                                        \"value\": \"Europe/Belfast\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Europe/Belgrade\",\n+                                        \"value\": \"Europe/Belgrade\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Europe/Berlin\",\n+                                        \"value\": \"Europe/Berlin\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Europe/Bratislava\",\n+                                        \"value\": \"Europe/Bratislava\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Europe/Brussels\",\n+                                        \"value\": \"Europe/Brussels\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Europe/Bucharest\",\n+                                        \"value\": \"Europe/Bucharest\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Europe/Budapest\",\n+                                        \"value\": \"Europe/Budapest\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Europe/Busingen\",\n+                                        \"value\": \"Europe/Busingen\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Europe/Chisinau\",\n+                                        \"value\": \"Europe/Chisinau\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Europe/Copenhagen\",\n+                                        \"value\": \"Europe/Copenhagen\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Europe/Dublin\",\n+                                        \"value\": \"Europe/Dublin\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Europe/Gibraltar\",\n+                                        \"value\": \"Europe/Gibraltar\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Europe/Guernsey\",\n+                                        \"value\": \"Europe/Guernsey\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Europe/Helsinki\",\n+                                        \"value\": \"Europe/Helsinki\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Europe/Isle_of_Man\",\n+                                        \"value\": \"Europe/Isle_of_Man\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Europe/Istanbul\",\n+                                        \"value\": \"Europe/Istanbul\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Europe/Jersey\",\n+                                        \"value\": \"Europe/Jersey\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Europe/Kaliningrad\",\n+                                        \"value\": \"Europe/Kaliningrad\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Europe/Kiev\",\n+                                        \"value\": \"Europe/Kiev\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Europe/Kirov\",\n+                                        \"value\": \"Europe/Kirov\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Europe/Kyiv\",\n+                                        \"value\": \"Europe/Kyiv\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Europe/Lisbon\",\n+                                        \"value\": \"Europe/Lisbon\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Europe/Ljubljana\",\n+                                        \"value\": \"Europe/Ljubljana\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Europe/London\",\n+                                        \"value\": \"Europe/London\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Europe/Luxembourg\",\n+                                        \"value\": \"Europe/Luxembourg\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Europe/Madrid\",\n+                                        \"value\": \"Europe/Madrid\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Europe/Malta\",\n+                                        \"value\": \"Europe/Malta\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Europe/Mariehamn\",\n+                                        \"value\": \"Europe/Mariehamn\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Europe/Minsk\",\n+                                        \"value\": \"Europe/Minsk\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Europe/Monaco\",\n+                                        \"value\": \"Europe/Monaco\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Europe/Moscow\",\n+                                        \"value\": \"Europe/Moscow\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Europe/Nicosia\",\n+                                        \"value\": \"Europe/Nicosia\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Europe/Oslo\",\n+                                        \"value\": \"Europe/Oslo\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Europe/Paris\",\n+                                        \"value\": \"Europe/Paris\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Europe/Podgorica\",\n+                                        \"value\": \"Europe/Podgorica\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Europe/Prague\",\n+                                        \"value\": \"Europe/Prague\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Europe/Riga\",\n+                                        \"value\": \"Europe/Riga\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Europe/Rome\",\n+                                        \"value\": \"Europe/Rome\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Europe/Samara\",\n+                                        \"value\": \"Europe/Samara\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Europe/San_Marino\",\n+                                        \"value\": \"Europe/San_Marino\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Europe/Sarajevo\",\n+                                        \"value\": \"Europe/Sarajevo\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Europe/Saratov\",\n+                                        \"value\": \"Europe/Saratov\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Europe/Simferopol\",\n+                                        \"value\": \"Europe/Simferopol\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Europe/Skopje\",\n+                                        \"value\": \"Europe/Skopje\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Europe/Sofia\",\n+                                        \"value\": \"Europe/Sofia\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Europe/Stockholm\",\n+                                        \"value\": \"Europe/Stockholm\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Europe/Tallinn\",\n+                                        \"value\": \"Europe/Tallinn\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Europe/Tirane\",\n+                                        \"value\": \"Europe/Tirane\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Europe/Tiraspol\",\n+                                        \"value\": \"Europe/Tiraspol\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Europe/Ulyanovsk\",\n+                                        \"value\": \"Europe/Ulyanovsk\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Europe/Uzhgorod\",\n+                                        \"value\": \"Europe/Uzhgorod\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Europe/Vaduz\",\n+                                        \"value\": \"Europe/Vaduz\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Europe/Vatican\",\n+                                        \"value\": \"Europe/Vatican\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Europe/Vienna\",\n+                                        \"value\": \"Europe/Vienna\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Europe/Vilnius\",\n+                                        \"value\": \"Europe/Vilnius\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Europe/Volgograd\",\n+                                        \"value\": \"Europe/Volgograd\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Europe/Warsaw\",\n+                                        \"value\": \"Europe/Warsaw\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Europe/Zagreb\",\n+                                        \"value\": \"Europe/Zagreb\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Europe/Zaporozhye\",\n+                                        \"value\": \"Europe/Zaporozhye\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Europe/Zurich\",\n+                                        \"value\": \"Europe/Zurich\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"GB\",\n+                                        \"value\": \"GB\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"GB-Eire\",\n+                                        \"value\": \"GB-Eire\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"GMT\",\n+                                        \"value\": \"GMT\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"GMT0\",\n+                                        \"value\": \"GMT0\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Greenwich\",\n+                                        \"value\": \"Greenwich\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Hongkong\",\n+                                        \"value\": \"Hongkong\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Iceland\",\n+                                        \"value\": \"Iceland\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Indian/Antananarivo\",\n+                                        \"value\": \"Indian/Antananarivo\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Indian/Chagos\",\n+                                        \"value\": \"Indian/Chagos\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Indian/Christmas\",\n+                                        \"value\": \"Indian/Christmas\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Indian/Cocos\",\n+                                        \"value\": \"Indian/Cocos\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Indian/Comoro\",\n+                                        \"value\": \"Indian/Comoro\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Indian/Kerguelen\",\n+                                        \"value\": \"Indian/Kerguelen\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Indian/Mahe\",\n+                                        \"value\": \"Indian/Mahe\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Indian/Maldives\",\n+                                        \"value\": \"Indian/Maldives\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Indian/Mauritius\",\n+                                        \"value\": \"Indian/Mauritius\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Indian/Mayotte\",\n+                                        \"value\": \"Indian/Mayotte\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Indian/Reunion\",\n+                                        \"value\": \"Indian/Reunion\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Iran\",\n+                                        \"value\": \"Iran\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Israel\",\n+                                        \"value\": \"Israel\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Jamaica\",\n+                                        \"value\": \"Jamaica\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Japan\",\n+                                        \"value\": \"Japan\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Kwajalein\",\n+                                        \"value\": \"Kwajalein\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Libya\",\n+                                        \"value\": \"Libya\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"MET\",\n+                                        \"value\": \"MET\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"MST7MDT\",\n+                                        \"value\": \"MST7MDT\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Mexico/BajaNorte\",\n+                                        \"value\": \"Mexico/BajaNorte\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Mexico/BajaSur\",\n+                                        \"value\": \"Mexico/BajaSur\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Mexico/General\",\n+                                        \"value\": \"Mexico/General\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"NZ\",\n+                                        \"value\": \"NZ\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"NZ-CHAT\",\n+                                        \"value\": \"NZ-CHAT\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Navajo\",\n+                                        \"value\": \"Navajo\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"PRC\",\n+                                        \"value\": \"PRC\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"PST8PDT\",\n+                                        \"value\": \"PST8PDT\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Pacific/Apia\",\n+                                        \"value\": \"Pacific/Apia\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Pacific/Auckland\",\n+                                        \"value\": \"Pacific/Auckland\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Pacific/Bougainville\",\n+                                        \"value\": \"Pacific/Bougainville\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Pacific/Chatham\",\n+                                        \"value\": \"Pacific/Chatham\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Pacific/Chuuk\",\n+                                        \"value\": \"Pacific/Chuuk\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Pacific/Easter\",\n+                                        \"value\": \"Pacific/Easter\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Pacific/Efate\",\n+                                        \"value\": \"Pacific/Efate\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Pacific/Enderbury\",\n+                                        \"value\": \"Pacific/Enderbury\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Pacific/Fakaofo\",\n+                                        \"value\": \"Pacific/Fakaofo\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Pacific/Fiji\",\n+                                        \"value\": \"Pacific/Fiji\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Pacific/Funafuti\",\n+                                        \"value\": \"Pacific/Funafuti\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Pacific/Galapagos\",\n+                                        \"value\": \"Pacific/Galapagos\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Pacific/Gambier\",\n+                                        \"value\": \"Pacific/Gambier\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Pacific/Guadalcanal\",\n+                                        \"value\": \"Pacific/Guadalcanal\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Pacific/Guam\",\n+                                        \"value\": \"Pacific/Guam\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Pacific/Honolulu\",\n+                                        \"value\": \"Pacific/Honolulu\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Pacific/Johnston\",\n+                                        \"value\": \"Pacific/Johnston\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Pacific/Kanton\",\n+                                        \"value\": \"Pacific/Kanton\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Pacific/Kiritimati\",\n+                                        \"value\": \"Pacific/Kiritimati\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Pacific/Kosrae\",\n+                                        \"value\": \"Pacific/Kosrae\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Pacific/Kwajalein\",\n+                                        \"value\": \"Pacific/Kwajalein\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Pacific/Majuro\",\n+                                        \"value\": \"Pacific/Majuro\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Pacific/Marquesas\",\n+                                        \"value\": \"Pacific/Marquesas\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Pacific/Midway\",\n+                                        \"value\": \"Pacific/Midway\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Pacific/Nauru\",\n+                                        \"value\": \"Pacific/Nauru\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Pacific/Niue\",\n+                                        \"value\": \"Pacific/Niue\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Pacific/Norfolk\",\n+                                        \"value\": \"Pacific/Norfolk\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Pacific/Noumea\",\n+                                        \"value\": \"Pacific/Noumea\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Pacific/Pago_Pago\",\n+                                        \"value\": \"Pacific/Pago_Pago\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Pacific/Palau\",\n+                                        \"value\": \"Pacific/Palau\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Pacific/Pitcairn\",\n+                                        \"value\": \"Pacific/Pitcairn\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Pacific/Pohnpei\",\n+                                        \"value\": \"Pacific/Pohnpei\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Pacific/Ponape\",\n+                                        \"value\": \"Pacific/Ponape\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Pacific/Port_Moresby\",\n+                                        \"value\": \"Pacific/Port_Moresby\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Pacific/Rarotonga\",\n+                                        \"value\": \"Pacific/Rarotonga\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Pacific/Saipan\",\n+                                        \"value\": \"Pacific/Saipan\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Pacific/Samoa\",\n+                                        \"value\": \"Pacific/Samoa\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Pacific/Tahiti\",\n+                                        \"value\": \"Pacific/Tahiti\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Pacific/Tarawa\",\n+                                        \"value\": \"Pacific/Tarawa\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Pacific/Tongatapu\",\n+                                        \"value\": \"Pacific/Tongatapu\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Pacific/Truk\",\n+                                        \"value\": \"Pacific/Truk\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Pacific/Wake\",\n+                                        \"value\": \"Pacific/Wake\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Pacific/Wallis\",\n+                                        \"value\": \"Pacific/Wallis\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Pacific/Yap\",\n+                                        \"value\": \"Pacific/Yap\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Poland\",\n+                                        \"value\": \"Poland\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Portugal\",\n+                                        \"value\": \"Portugal\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"ROK\",\n+                                        \"value\": \"ROK\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Singapore\",\n+                                        \"value\": \"Singapore\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"SystemV/AST4\",\n+                                        \"value\": \"SystemV/AST4\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"SystemV/AST4ADT\",\n+                                        \"value\": \"SystemV/AST4ADT\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"SystemV/CST6\",\n+                                        \"value\": \"SystemV/CST6\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"SystemV/CST6CDT\",\n+                                        \"value\": \"SystemV/CST6CDT\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"SystemV/EST5\",\n+                                        \"value\": \"SystemV/EST5\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"SystemV/EST5EDT\",\n+                                        \"value\": \"SystemV/EST5EDT\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"SystemV/HST10\",\n+                                        \"value\": \"SystemV/HST10\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"SystemV/MST7\",\n+                                        \"value\": \"SystemV/MST7\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"SystemV/MST7MDT\",\n+                                        \"value\": \"SystemV/MST7MDT\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"SystemV/PST8\",\n+                                        \"value\": \"SystemV/PST8\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"SystemV/PST8PDT\",\n+                                        \"value\": \"SystemV/PST8PDT\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"SystemV/YST9\",\n+                                        \"value\": \"SystemV/YST9\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"SystemV/YST9YDT\",\n+                                        \"value\": \"SystemV/YST9YDT\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Turkey\",\n+                                        \"value\": \"Turkey\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"UCT\",\n+                                        \"value\": \"UCT\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"US/Alaska\",\n+                                        \"value\": \"US/Alaska\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"US/Aleutian\",\n+                                        \"value\": \"US/Aleutian\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"US/Arizona\",\n+                                        \"value\": \"US/Arizona\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"US/Central\",\n+                                        \"value\": \"US/Central\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"US/East-Indiana\",\n+                                        \"value\": \"US/East-Indiana\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"US/Eastern\",\n+                                        \"value\": \"US/Eastern\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"US/Hawaii\",\n+                                        \"value\": \"US/Hawaii\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"US/Indiana-Starke\",\n+                                        \"value\": \"US/Indiana-Starke\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"US/Michigan\",\n+                                        \"value\": \"US/Michigan\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"US/Mountain\",\n+                                        \"value\": \"US/Mountain\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"US/Pacific\",\n+                                        \"value\": \"US/Pacific\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"US/Samoa\",\n+                                        \"value\": \"US/Samoa\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"UTC\",\n+                                        \"value\": \"UTC\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Universal\",\n+                                        \"value\": \"Universal\"\n+                                    },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"displayName\": \"W-SU\",\n+                                        \"value\": \"W-SU\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"Specifies whether or not the JSON should be pretty printed\",\n-                                \"displayName\": \"Pretty Print JSON\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Pretty Print JSON\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Schema Write Strategy\": {\n-                                \"allowableValues\": [\n+                                        \"displayName\": \"WET\",\n+                                        \"value\": \"WET\"\n+                                    },\n                                     {\n-                                        \"description\": \"Do not add any schema-related information to the FlowFile.\",\n-                                        \"displayName\": \"Do Not Write Schema\",\n-                                        \"value\": \"no-schema\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Zulu\",\n+                                        \"value\": \"Zulu\"\n                                     },\n                                     {\n-                                        \"description\": \"The FlowFile will be given an attribute named 'schema.name' and this attribute will indicate the name of the schema in the Schema Registry. Note that ifthe schema for a record is not obtained from a Schema Registry, then no attribute will be added.\",\n-                                        \"displayName\": \"Set 'schema.name' Attribute\",\n-                                        \"value\": \"schema-name\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"EST\",\n+                                        \"value\": \"EST\"\n                                     },\n                                     {\n-                                        \"description\": \"The FlowFile will be given an attribute named 'avro.schema' and this attribute will contain the Avro Schema that describes the records in the FlowFile. The contents of the FlowFile need not be Avro, but the text of the schema will be used.\",\n-                                        \"displayName\": \"Set 'avro.schema' Attribute\",\n-                                        \"value\": \"full-schema-attribute\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"HST\",\n+                                        \"value\": \"HST\"\n                                     },\n                                     {\n-                                        \"description\": \"The FlowFile will be given a set of 3 attributes to describe the schema: 'schema.identifier', 'schema.version', and 'schema.protocol.version'. Note that if the schema for a record does not contain the necessary identifier and version, an Exception will be thrown when attempting to write the data.\",\n-                                        \"displayName\": \"HWX Schema Reference Attributes\",\n-                                        \"value\": \"hwx-schema-ref-attributes\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"MST\",\n+                                        \"value\": \"MST\"\n                                     },\n                                     {\n-                                        \"description\": \"The content of the FlowFile will contain a reference to a schema in the Schema Registry service. The reference is encoded as a single byte indicating the 'protocol version', followed by 8 bytes indicating the schema identifier, and finally 4 bytes indicating the schema version, as per the Hortonworks Schema Registry serializers and deserializers, as found at https://github.com/hortonworks/registry. This will be prepended to each FlowFile. Note that if the schema for a record does not contain the necessary identifier and version, an Exception will be thrown when attempting to write the data.\",\n-                                        \"displayName\": \"HWX Content-Encoded Schema Reference\",\n-                                        \"value\": \"hwx-content-encoded-schema\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"ACT\",\n+                                        \"value\": \"ACT\"\n                                     },\n                                     {\n-                                        \"description\": \"The content of the FlowFile will contain a reference to a schema in the Schema Registry service. The reference is encoded as a single 'Magic Byte' followed by 4 bytes representing the identifier of the schema, as outlined at http://docs.confluent.io/current/schema-registry/docs/serializer-formatter.html. This will be prepended to each FlowFile. Note that if the schema for a record does not contain the necessary identifier and version, an Exception will be thrown when attempting to write the data. This is based on the encoding used by version 3.2.x of the Confluent Schema Registry.\",\n-                                        \"displayName\": \"Confluent Schema Registry Reference\",\n-                                        \"value\": \"confluent-encoded\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"no-schema\",\n-                                \"description\": \"Specifies how the schema for a Record should be added to the data.\",\n-                                \"displayName\": \"Schema Write Strategy\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Schema Write Strategy\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Time Format\": {\n-                                \"description\": \"Specifies the format to use when reading/writing Time fields. If not specified, Time fields will be assumed to be number of milliseconds since epoch (Midnight, Jan 1, 1970 GMT). If specified, the value must match the Java Simple Date Format (for example, HH:mm:ss for a two-digit hour in 24-hour format, followed by a two-digit minute, followed by a two-digit second, all separated by ':' characters, as in 18:04:15).\",\n-                                \"displayName\": \"Time Format\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Time Format\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Timestamp Format\": {\n-                                \"description\": \"Specifies the format to use when reading/writing Timestamp fields. If not specified, Timestamp fields will be assumed to be number of milliseconds since epoch (Midnight, Jan 1, 1970 GMT). If specified, the value must match the Java Simple Date Format (for example, MM/dd/yyyy HH:mm:ss for a two-digit month, followed by a two-digit day, followed by a four-digit year, all separated by '/' characters; and then followed by a two-digit hour in 24-hour format, followed by a two-digit minute, followed by a two-digit second, all separated by ':' characters, as in 01/01/2017 18:04:15).\",\n-                                \"displayName\": \"Timestamp Format\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Timestamp Format\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"compression-format\": {\n-                                \"allowableValues\": [\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"AET\",\n+                                        \"value\": \"AET\"\n+                                    },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"none\",\n-                                        \"value\": \"none\"\n+                                        \"displayName\": \"AGT\",\n+                                        \"value\": \"AGT\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"gzip\",\n-                                        \"value\": \"gzip\"\n+                                        \"displayName\": \"ART\",\n+                                        \"value\": \"ART\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"bzip2\",\n-                                        \"value\": \"bzip2\"\n+                                        \"displayName\": \"AST\",\n+                                        \"value\": \"AST\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"xz-lzma2\",\n-                                        \"value\": \"xz-lzma2\"\n+                                        \"displayName\": \"BET\",\n+                                        \"value\": \"BET\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"snappy\",\n-                                        \"value\": \"snappy\"\n+                                        \"displayName\": \"BST\",\n+                                        \"value\": \"BST\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"snappy framed\",\n-                                        \"value\": \"snappy framed\"\n+                                        \"displayName\": \"CAT\",\n+                                        \"value\": \"CAT\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"zstd\",\n-                                        \"value\": \"zstd\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"none\",\n-                                \"description\": \"The compression format to use. Valid values are: GZIP, BZIP2, ZSTD, XZ-LZMA2, LZMA, Snappy, and Snappy Framed\",\n-                                \"displayName\": \"Compression Format\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"compression-format\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"compression-level\": {\n-                                \"allowableValues\": [\n+                                        \"displayName\": \"CNT\",\n+                                        \"value\": \"CNT\"\n+                                    },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"0\",\n-                                        \"value\": \"0\"\n+                                        \"displayName\": \"CST\",\n+                                        \"value\": \"CST\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"1\",\n-                                        \"value\": \"1\"\n+                                        \"displayName\": \"CTT\",\n+                                        \"value\": \"CTT\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"2\",\n-                                        \"value\": \"2\"\n+                                        \"displayName\": \"EAT\",\n+                                        \"value\": \"EAT\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"3\",\n-                                        \"value\": \"3\"\n+                                        \"displayName\": \"ECT\",\n+                                        \"value\": \"ECT\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"4\",\n-                                        \"value\": \"4\"\n+                                        \"displayName\": \"IET\",\n+                                        \"value\": \"IET\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"5\",\n-                                        \"value\": \"5\"\n+                                        \"displayName\": \"IST\",\n+                                        \"value\": \"IST\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"6\",\n-                                        \"value\": \"6\"\n+                                        \"displayName\": \"JST\",\n+                                        \"value\": \"JST\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"7\",\n-                                        \"value\": \"7\"\n+                                        \"displayName\": \"MIT\",\n+                                        \"value\": \"MIT\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"8\",\n-                                        \"value\": \"8\"\n+                                        \"displayName\": \"NET\",\n+                                        \"value\": \"NET\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"9\",\n-                                        \"value\": \"9\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"1\",\n-                                \"dependencies\": [\n+                                        \"displayName\": \"NST\",\n+                                        \"value\": \"NST\"\n+                                    },\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"gzip\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Compression Format\",\n-                                        \"propertyName\": \"compression-format\"\n-                                    }\n-                                ],\n-                                \"description\": \"The compression level to use; this is valid only when using GZIP compression. A lower value results in faster processing but less compression; a value of 0 indicates no compression but simply archiving\",\n-                                \"displayName\": \"Compression Level\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"compression-level\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"output-grouping\": {\n-                                \"allowableValues\": [\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"PLT\",\n+                                        \"value\": \"PLT\"\n+                                    },\n                                     {\n-                                        \"description\": \"Output records as a JSON array\",\n-                                        \"displayName\": \"Array\",\n-                                        \"value\": \"output-array\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"PNT\",\n+                                        \"value\": \"PNT\"\n                                     },\n                                     {\n-                                        \"description\": \"Output records with one JSON object per line, delimited by a newline character\",\n-                                        \"displayName\": \"One Line Per Object\",\n-                                        \"value\": \"output-oneline\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"output-array\",\n-                                \"description\": \"Specifies how the writer should output the JSON records (as an array or one object per line, e.g.) Note that if 'One Line Per Object' is selected, then Pretty Print JSON must be false.\",\n-                                \"displayName\": \"Output Grouping\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"output-grouping\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"schema-access-strategy\": {\n-                                \"allowableValues\": [\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"PRT\",\n+                                        \"value\": \"PRT\"\n+                                    },\n                                     {\n-                                        \"description\": \"The schema used to write records will be the same schema that was given to the Record when the Record was created.\",\n-                                        \"displayName\": \"Inherit Record Schema\",\n-                                        \"value\": \"inherit-record-schema\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"PST\",\n+                                        \"value\": \"PST\"\n                                     },\n                                     {\n-                                        \"description\": \"The name of the Schema to use is specified by the 'Schema Name' Property. The value of this property is used to lookup the Schema in the configured Schema Registry service.\",\n-                                        \"displayName\": \"Use 'Schema Name' Property\",\n-                                        \"value\": \"schema-name\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"SST\",\n+                                        \"value\": \"SST\"\n                                     },\n                                     {\n-                                        \"description\": \"The text of the Schema itself is specified by the 'Schema Text' Property. The value of this property must be a valid Avro Schema. If Expression Language is used, the value of the 'Schema Text' property must be valid after substituting the expressions.\",\n-                                        \"displayName\": \"Use 'Schema Text' Property\",\n-                                        \"value\": \"schema-text-property\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"VST\",\n+                                        \"value\": \"VST\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"inherit-record-schema\",\n-                                \"description\": \"Specifies how to obtain the schema that is to be used for interpreting the data.\",\n-                                \"displayName\": \"Schema Access Strategy\",\n+                                \"defaultValue\": \"UTC\",\n+                                \"description\": \"The Time Zone to use for formatting dates when performing a search. Only used with Managed time strategies.\",\n+                                \"displayName\": \"Time Zone\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"schema-access-strategy\",\n+                                \"name\": \"Time Zone\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"schema-branch\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"schema-name\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n-                                        \"propertyName\": \"schema-access-strategy\"\n-                                    }\n-                                ],\n-                                \"description\": \"Specifies the name of the branch to use when looking up the schema in the Schema Registry property. If the chosen Schema Registry does not support branching, this value will be ignored.\",\n-                                \"displayName\": \"Schema Branch\",\n+                            \"Token\": {\n+                                \"description\": \"The token to pass to Splunk.\",\n+                                \"displayName\": \"Token\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"schema-branch\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Token\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"schema-cache\": {\n-                                \"description\": \"Specifies a Schema Cache to add the Record Schema to so that Record Readers can quickly lookup the schema.\",\n-                                \"displayName\": \"Schema Cache\",\n+                            \"Username\": {\n+                                \"description\": \"The username to authenticate to Splunk.\",\n+                                \"displayName\": \"Username\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"schema-cache\",\n+                                \"name\": \"Username\",\n                                 \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.serialization.RecordSchemaCacheService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n+                                \"sensitive\": false\n+                            }\n+                        },\n+                        \"sideEffectFree\": false,\n+                        \"stateful\": {\n+                            \"description\": \"If using one of the managed Time Range Strategies, this processor will store the values of the latest and earliest times from the previous execution so that the next execution of the can pick up where the last execution left off. The state will be cleared and start over if the query is changed.\",\n+                            \"scopes\": [\n+                                \"CLUSTER\"\n+                            ]\n+                        },\n+                        \"supportedRelationships\": [\n+                            {\n+                                \"description\": \"Results retrieved from Splunk are sent out this relationship.\",\n+                                \"name\": \"success\"\n+                            }\n+                        ],\n+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\"\n+                        ],\n+                        \"supportsBatching\": false,\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicRelationships\": false,\n+                        \"supportsEventDriven\": false,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"get\",\n+                            \"logs\",\n+                            \"splunk\"\n+                        ],\n+                        \"triggerSerially\": true,\n+                        \"triggerWhenAnyDestinationAvailable\": false,\n+                        \"triggerWhenEmpty\": false,\n+                        \"type\": \"org.apache.nifi.processors.splunk.GetSplunk\",\n+                        \"typeDescription\": \"Retrieves data from Splunk Enterprise.\",\n+                        \"version\": \"1.27.0\",\n+                        \"writesAttributes\": [\n+                            {\n+                                \"description\": \"The query that performed to produce the FlowFile.\",\n+                                \"name\": \"splunk.query\"\n                             },\n-                            \"schema-name\": {\n-                                \"defaultValue\": \"${schema.name}\",\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"schema-name\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n-                                        \"propertyName\": \"schema-access-strategy\"\n-                                    }\n-                                ],\n-                                \"description\": \"Specifies the name of the schema to lookup in the Schema Registry property\",\n-                                \"displayName\": \"Schema Name\",\n+                            {\n+                                \"description\": \"The value of the earliest time that was used when performing the query.\",\n+                                \"name\": \"splunk.earliest.time\"\n+                            },\n+                            {\n+                                \"description\": \"The value of the latest time that was used when performing the query.\",\n+                                \"name\": \"splunk.latest.time\"\n+                            }\n+                        ]\n+                    },\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-splunk-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"e0c4461\"\n+                        },\n+                        \"defaultBulletinLevel\": \"WARN\",\n+                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": 1,\n+                            \"TIMER_DRIVEN\": 1\n+                        },\n+                        \"defaultPenaltyDuration\": \"30 sec\",\n+                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": \"* * * * * ?\",\n+                            \"TIMER_DRIVEN\": \"0 sec\"\n+                        },\n+                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n+                        \"defaultYieldDuration\": \"1 sec\",\n+                        \"group\": \"org.apache.nifi\",\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n+                        \"primaryNodeOnly\": false,\n+                        \"propertyDescriptors\": {\n+                            \"Character Set\": {\n+                                \"defaultValue\": \"UTF-8\",\n+                                \"description\": \"Specifies the character set of the data being sent.\",\n+                                \"displayName\": \"Character Set\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"schema-name\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Character Set\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"schema-protocol-version\": {\n-                                \"defaultValue\": \"1\",\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"hwx-schema-ref-attributes\",\n-                                            \"hwx-content-encoded-schema\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Schema Write Strategy\",\n-                                        \"propertyName\": \"Schema Write Strategy\"\n-                                    }\n-                                ],\n-                                \"description\": \"The protocol version to be used for Schema Write Strategies that require a protocol version, such as Hortonworks Schema Registry strategies. Valid protocol versions for Hortonworks Schema Registry are integer values 1, 2, or 3.\",\n-                                \"displayName\": \"Schema Protocol Version\",\n+                            \"Hostname\": {\n+                                \"defaultValue\": \"localhost\",\n+                                \"description\": \"Destination hostname or IP address\",\n+                                \"displayName\": \"Hostname\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"schema-protocol-version\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Hostname\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"schema-registry\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"confluent-encoded\",\n-                                            \"schema-name\",\n-                                            \"hwx-schema-ref-attributes\",\n-                                            \"hwx-content-encoded-schema\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n-                                        \"propertyName\": \"schema-access-strategy\"\n-                                    }\n-                                ],\n-                                \"description\": \"Specifies the Controller Service to use for the Schema Registry\",\n-                                \"displayName\": \"Schema Registry\",\n+                            \"Idle Connection Expiration\": {\n+                                \"defaultValue\": \"15 seconds\",\n+                                \"description\": \"The amount of time a connection should be held open without being used before closing the connection. A value of 0 seconds will disable this feature.\",\n+                                \"displayName\": \"Idle Connection Expiration\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Idle Connection Expiration\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Max Size of Socket Send Buffer\": {\n+                                \"defaultValue\": \"1 MB\",\n+                                \"description\": \"The maximum size of the socket send buffer that should be used. This is a suggestion to the Operating System to indicate how big the socket buffer should be. If this value is set too low, the buffer may fill up before the data can be read, and incoming data will be dropped.\",\n+                                \"displayName\": \"Max Size of Socket Send Buffer\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"schema-registry\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.schemaregistry.services.SchemaRegistry\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n+                                \"name\": \"Max Size of Socket Send Buffer\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n                             },\n-                            \"schema-text\": {\n-                                \"defaultValue\": \"${avro.schema}\",\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"schema-text-property\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n-                                        \"propertyName\": \"schema-access-strategy\"\n-                                    }\n-                                ],\n-                                \"description\": \"The text of an Avro-formatted Schema\",\n-                                \"displayName\": \"Schema Text\",\n+                            \"Message Delimiter\": {\n+                                \"description\": \"Specifies the delimiter to use for splitting apart multiple messages within a single FlowFile. If not specified, the entire content of the FlowFile will be used as a single message. If specified, the contents of the FlowFile will be split on this delimiter and each section sent as a separate message. Note that if messages are delimited and some messages for a given FlowFile are transferred successfully while others are not, the messages will be split into individual FlowFiles, such that those messages that were successfully sent are routed to the 'success' relationship while other messages are sent to the 'failure' relationship.\",\n+                                \"displayName\": \"Message Delimiter\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"schema-text\",\n+                                \"name\": \"Message Delimiter\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"schema-version\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"schema-name\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n-                                        \"propertyName\": \"schema-access-strategy\"\n-                                    }\n-                                ],\n-                                \"description\": \"Specifies the version of the schema to lookup in the Schema Registry. If not specified then the latest version of the schema will be retrieved.\",\n-                                \"displayName\": \"Schema Version\",\n+                            \"Port\": {\n+                                \"description\": \"Destination port number\",\n+                                \"displayName\": \"Port\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"schema-version\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Port\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"suppress-nulls\": {\n+                            \"Protocol\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Fields that are missing (present in the schema but not in the record), or that have a value of null, will be written out as a null value\",\n-                                        \"displayName\": \"Never Suppress\",\n-                                        \"value\": \"never-suppress\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Fields that are missing (present in the schema but not in the record), or that have a value of null, will not be written out\",\n-                                        \"displayName\": \"Always Suppress\",\n-                                        \"value\": \"always-suppress\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"TCP\",\n+                                        \"value\": \"TCP\"\n                                     },\n                                     {\n-                                        \"description\": \"When a field has a value of null, it will be written out. However, if a field is defined in the schema and not present in the record, the field will not be written out.\",\n-                                        \"displayName\": \"Suppress Missing Values\",\n-                                        \"value\": \"suppress-missing\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"UDP\",\n+                                        \"value\": \"UDP\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"never-suppress\",\n-                                \"description\": \"Specifies how the writer should handle a null field\",\n-                                \"displayName\": \"Suppress Null Values\",\n+                                \"defaultValue\": \"TCP\",\n+                                \"description\": \"The protocol for communication.\",\n+                                \"displayName\": \"Protocol\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"suppress-nulls\",\n+                                \"name\": \"Protocol\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n+                            },\n+                            \"SSL Context Service\": {\n+                                \"description\": \"Specifies the SSL Context Service to enable TLS socket communication\",\n+                                \"displayName\": \"SSL Context Service\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"SSL Context Service\",\n+                                \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"Timeout\": {\n+                                \"defaultValue\": \"10 seconds\",\n+                                \"description\": \"The timeout for connecting to and communicating with the destination. Does not apply to UDP\",\n+                                \"displayName\": \"Timeout\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Timeout\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n                             }\n                         },\n-                        \"providedApiImplementations\": [\n+                        \"sideEffectFree\": false,\n+                        \"supportedRelationships\": [\n                             {\n-                                \"artifact\": \"nifi-standard-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n-                                \"version\": \"1.27.0\"\n+                                \"description\": \"FlowFiles that are sent successfully to the destination are sent out this relationship.\",\n+                                \"name\": \"success\"\n+                            },\n+                            {\n+                                \"description\": \"FlowFiles that failed to send to the destination are sent out this relationship.\",\n+                                \"name\": \"failure\"\n                             }\n                         ],\n+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\"\n+                        ],\n+                        \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicRelationships\": false,\n+                        \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"json\",\n-                            \"record\",\n-                            \"recordset\",\n-                            \"resultset\",\n-                            \"row\",\n-                            \"serialize\",\n-                            \"writer\"\n+                            \"logs\",\n+                            \"splunk\",\n+                            \"tcp\",\n+                            \"udp\"\n                         ],\n-                        \"type\": \"org.apache.nifi.json.JsonRecordSetWriter\",\n-                        \"typeDescription\": \"Writes the results of a RecordSet as either a JSON Array or one JSON object per line. If using Array output, then even if the RecordSet consists of a single row, it will be written as an array with a single element. If using One Line Per Object output, the JSON objects cannot be pretty-printed.\",\n+                        \"triggerSerially\": false,\n+                        \"triggerWhenAnyDestinationAvailable\": false,\n+                        \"triggerWhenEmpty\": true,\n+                        \"type\": \"org.apache.nifi.processors.splunk.PutSplunk\",\n+                        \"typeDescription\": \"Sends logs to Splunk Enterprise over TCP, TCP + TLS/SSL, or UDP. If a Message Delimiter is provided, then this processor will read messages from the incoming FlowFile based on the delimiter, and send each message to Splunk. If a Message Delimiter is not provided then the content of the FlowFile will be sent directly to Splunk as if it were a single message.\",\n                         \"version\": \"1.27.0\"\n                     },\n                     {\n                         \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-record-serialization-services-nar\",\n+                        \"artifact\": \"nifi-splunk-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n+                        \"defaultBulletinLevel\": \"WARN\",\n+                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": 1,\n+                            \"TIMER_DRIVEN\": 1\n+                        },\n+                        \"defaultPenaltyDuration\": \"30 sec\",\n+                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": \"* * * * * ?\",\n+                            \"TIMER_DRIVEN\": \"0 sec\"\n+                        },\n+                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n+                        \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n+                        \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Allow Comments\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"Whether to allow comments when parsing the JSON document\",\n-                                \"displayName\": \"Allow Comments\",\n+                            \"Hostname\": {\n+                                \"defaultValue\": \"localhost\",\n+                                \"description\": \"The ip address or hostname of the Splunk server.\",\n+                                \"displayName\": \"Hostname\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Allow Comments\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Hostname\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Date Format\": {\n-                                \"description\": \"Specifies the format to use when reading/writing Date fields. If not specified, Date fields will be assumed to be number of milliseconds since epoch (Midnight, Jan 1, 1970 GMT). If specified, the value must match the Java Simple Date Format (for example, MM/dd/yyyy for a two-digit month, followed by a two-digit day, followed by a four-digit year, all separated by '/' characters, as in 01/01/2017).\",\n-                                \"displayName\": \"Date Format\",\n+                            \"Owner\": {\n+                                \"description\": \"The owner to pass to Splunk.\",\n+                                \"displayName\": \"Owner\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Date Format\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Owner\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Max String Length\": {\n-                                \"defaultValue\": \"20 MB\",\n-                                \"description\": \"The maximum allowed length of a string value when parsing the JSON document\",\n-                                \"displayName\": \"Max String Length\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Max String Length\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Time Format\": {\n-                                \"description\": \"Specifies the format to use when reading/writing Time fields. If not specified, Time fields will be assumed to be number of milliseconds since epoch (Midnight, Jan 1, 1970 GMT). If specified, the value must match the Java Simple Date Format (for example, HH:mm:ss for a two-digit hour in 24-hour format, followed by a two-digit minute, followed by a two-digit second, all separated by ':' characters, as in 18:04:15).\",\n-                                \"displayName\": \"Time Format\",\n+                            \"Password\": {\n+                                \"description\": \"The password to authenticate to Splunk.\",\n+                                \"displayName\": \"Password\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Time Format\",\n+                                \"name\": \"Password\",\n                                 \"required\": false,\n-                                \"sensitive\": false\n+                                \"sensitive\": true\n                             },\n-                            \"Timestamp Format\": {\n-                                \"description\": \"Specifies the format to use when reading/writing Timestamp fields. If not specified, Timestamp fields will be assumed to be number of milliseconds since epoch (Midnight, Jan 1, 1970 GMT). If specified, the value must match the Java Simple Date Format (for example, MM/dd/yyyy HH:mm:ss for a two-digit month, followed by a two-digit day, followed by a four-digit year, all separated by '/' characters; and then followed by a two-digit hour in 24-hour format, followed by a two-digit minute, followed by a two-digit second, all separated by ':' characters, as in 01/01/2017 18:04:15).\",\n-                                \"displayName\": \"Timestamp Format\",\n+                            \"Port\": {\n+                                \"defaultValue\": \"8088\",\n+                                \"description\": \"The HTTP Event Collector HTTP Port Number.\",\n+                                \"displayName\": \"HTTP Event Collector Port\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Timestamp Format\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Port\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"schema-access-strategy\": {\n+                            \"Scheme\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"The Schema of the data will be inferred automatically when the data is read. See component Usage and Additional Details for information about how the schema is inferred.\",\n-                                        \"displayName\": \"Infer Schema\",\n-                                        \"value\": \"infer-schema\"\n-                                    },\n-                                    {\n-                                        \"description\": \"The name of the Schema to use is specified by the 'Schema Name' Property. The value of this property is used to lookup the Schema in the configured Schema Registry service.\",\n-                                        \"displayName\": \"Use 'Schema Name' Property\",\n-                                        \"value\": \"schema-name\"\n-                                    },\n-                                    {\n-                                        \"description\": \"The text of the Schema itself is specified by the 'Schema Text' Property. The value of this property must be a valid Avro Schema. If Expression Language is used, the value of the 'Schema Text' property must be valid after substituting the expressions.\",\n-                                        \"displayName\": \"Use 'Schema Text' Property\",\n-                                        \"value\": \"schema-text-property\"\n-                                    },\n-                                    {\n-                                        \"description\": \"The FlowFile contains 3 Attributes that will be used to lookup a Schema from the configured Schema Registry: 'schema.identifier', 'schema.version', and 'schema.protocol.version'\",\n-                                        \"displayName\": \"HWX Schema Reference Attributes\",\n-                                        \"value\": \"hwx-schema-ref-attributes\"\n-                                    },\n-                                    {\n-                                        \"description\": \"The content of the FlowFile contains a reference to a schema in the Schema Registry service. The reference is encoded as a single byte indicating the 'protocol version', followed by 8 bytes indicating the schema identifier, and finally 4 bytes indicating the schema version, as per the Hortonworks Schema Registry serializers and deserializers, found at https://github.com/hortonworks/registry\",\n-                                        \"displayName\": \"HWX Content-Encoded Schema Reference\",\n-                                        \"value\": \"hwx-content-encoded-schema\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"https\",\n+                                        \"value\": \"https\"\n                                     },\n                                     {\n-                                        \"description\": \"The content of the FlowFile contains a reference to a schema in the Schema Registry service. The reference is encoded as a single 'Magic Byte' followed by 4 bytes representing the identifier of the schema, as outlined at http://docs.confluent.io/current/schema-registry/docs/serializer-formatter.html. This is based on version 3.2.x of the Confluent Schema Registry.\",\n-                                        \"displayName\": \"Confluent Content-Encoded Schema Reference\",\n-                                        \"value\": \"confluent-encoded\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"http\",\n+                                        \"value\": \"http\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"infer-schema\",\n-                                \"description\": \"Specifies how to obtain the schema that is to be used for interpreting the data.\",\n-                                \"displayName\": \"Schema Access Strategy\",\n+                                \"defaultValue\": \"https\",\n+                                \"description\": \"The scheme for connecting to Splunk.\",\n+                                \"displayName\": \"Scheme\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"schema-access-strategy\",\n+                                \"name\": \"Scheme\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"schema-application-strategy\": {\n+                            \"Security Protocol\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Applies the schema for the whole JSON.\",\n-                                        \"displayName\": \"Whole JSON\",\n-                                        \"value\": \"WHOLE_JSON\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"TLSv1_2\",\n+                                        \"value\": \"TLSv1_2\"\n                                     },\n                                     {\n-                                        \"description\": \"Applies the schema for the selected part starting from the \\\"Starting Field Name\\\".\",\n-                                        \"displayName\": \"Selected Part\",\n-                                        \"value\": \"SELECTED_PART\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"SELECTED_PART\",\n-                                \"dependencies\": [\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"TLSv1_1\",\n+                                        \"value\": \"TLSv1_1\"\n+                                    },\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"confluent-encoded\",\n-                                            \"schema-name\",\n-                                            \"schema-text-property\",\n-                                            \"hwx-schema-ref-attributes\",\n-                                            \"hwx-content-encoded-schema\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n-                                        \"propertyName\": \"schema-access-strategy\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"TLSv1\",\n+                                        \"value\": \"TLSv1\"\n                                     },\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"NESTED_FIELD\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Starting Field Strategy\",\n-                                        \"propertyName\": \"starting-field-strategy\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"SSLv3\",\n+                                        \"value\": \"SSLv3\"\n                                     }\n                                 ],\n-                                \"description\": \"Specifies whether the schema is defined for the whole JSON or for the selected part starting from \\\"Starting Field Name\\\".\",\n-                                \"displayName\": \"Schema Application Strategy\",\n+                                \"defaultValue\": \"TLSv1_2\",\n+                                \"description\": \"The security protocol to use for communicating with Splunk.\",\n+                                \"displayName\": \"Security Protocol\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"schema-application-strategy\",\n-                                \"required\": true,\n+                                \"name\": \"Security Protocol\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"schema-branch\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"schema-name\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n-                                        \"propertyName\": \"schema-access-strategy\"\n-                                    }\n-                                ],\n-                                \"description\": \"Specifies the name of the branch to use when looking up the schema in the Schema Registry property. If the chosen Schema Registry does not support branching, this value will be ignored.\",\n-                                \"displayName\": \"Schema Branch\",\n+                            \"Token\": {\n+                                \"description\": \"HTTP Event Collector token starting with the string Splunk. For example 'Splunk 1234578-abcd-1234-abcd-1234abcd'\",\n+                                \"displayName\": \"HTTP Event Collector Token\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"schema-branch\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Token\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"schema-inference-cache\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"infer-schema\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n-                                        \"propertyName\": \"schema-access-strategy\"\n-                                    }\n-                                ],\n-                                \"description\": \"Specifies a Schema Cache to use when inferring the schema. If not populated, the schema will be inferred each time. However, if a cache is specified, the cache will first be consulted and if the applicable schema can be found, it will be used instead of inferring the schema.\",\n-                                \"displayName\": \"Schema Inference Cache\",\n+                            \"Username\": {\n+                                \"description\": \"The username to authenticate to Splunk.\",\n+                                \"displayName\": \"Username\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"schema-inference-cache\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Username\",\n                                 \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.serialization.RecordSchemaCacheService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n+                                \"sensitive\": false\n                             },\n-                            \"schema-name\": {\n-                                \"defaultValue\": \"${schema.name}\",\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"schema-name\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n-                                        \"propertyName\": \"schema-access-strategy\"\n-                                    }\n-                                ],\n-                                \"description\": \"Specifies the name of the schema to lookup in the Schema Registry property\",\n-                                \"displayName\": \"Schema Name\",\n+                            \"character-set\": {\n+                                \"defaultValue\": \"UTF-8\",\n+                                \"description\": \"The name of the character set.\",\n+                                \"displayName\": \"Character Set\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"schema-name\",\n-                                \"required\": false,\n+                                \"name\": \"character-set\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"schema-registry\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"confluent-encoded\",\n-                                            \"schema-name\",\n-                                            \"hwx-schema-ref-attributes\",\n-                                            \"hwx-content-encoded-schema\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n-                                        \"propertyName\": \"schema-access-strategy\"\n-                                    }\n-                                ],\n-                                \"description\": \"Specifies the Controller Service to use for the Schema Registry\",\n-                                \"displayName\": \"Schema Registry\",\n+                            \"content-type\": {\n+                                \"description\": \"The media type of the event sent to Splunk. If not set, \\\"mime.type\\\" flow file attribute will be used. In case of neither of them is specified, this information will not be sent to the server.\",\n+                                \"displayName\": \"Content Type\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"schema-registry\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"content-type\",\n                                 \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.schemaregistry.services.SchemaRegistry\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n+                                \"sensitive\": false\n                             },\n-                            \"schema-text\": {\n-                                \"defaultValue\": \"${avro.schema}\",\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"schema-text-property\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n-                                        \"propertyName\": \"schema-access-strategy\"\n-                                    }\n-                                ],\n-                                \"description\": \"The text of an Avro-formatted Schema\",\n-                                \"displayName\": \"Schema Text\",\n+                            \"host\": {\n+                                \"description\": \"Specify with the host query string parameter. Sets a default for all events when unspecified.\",\n+                                \"displayName\": \"Host\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"schema-text\",\n+                                \"name\": \"host\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"schema-version\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"schema-name\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n-                                        \"propertyName\": \"schema-access-strategy\"\n-                                    }\n-                                ],\n-                                \"description\": \"Specifies the version of the schema to lookup in the Schema Registry. If not specified then the latest version of the schema will be retrieved.\",\n-                                \"displayName\": \"Schema Version\",\n+                            \"index\": {\n+                                \"description\": \"Index name. Specify with the index query string parameter. Sets a default for all events when unspecified.\",\n+                                \"displayName\": \"Index\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"schema-version\",\n+                                \"name\": \"index\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"starting-field-name\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"NESTED_FIELD\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Starting Field Strategy\",\n-                                        \"propertyName\": \"starting-field-strategy\"\n-                                    }\n-                                ],\n-                                \"description\": \"Skips forward to the given nested JSON field (array or object) to begin processing.\",\n-                                \"displayName\": \"Starting Field Name\",\n+                            \"request-channel\": {\n+                                \"description\": \"Identifier of the used request channel.\",\n+                                \"displayName\": \"Splunk Request Channel\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"starting-field-name\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"request-channel\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"starting-field-strategy\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"Begins processing from the root node.\",\n-                                        \"displayName\": \"Root Node\",\n-                                        \"value\": \"ROOT_NODE\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Skips forward to the given nested JSON field (array or object) to begin processing.\",\n-                                        \"displayName\": \"Nested Field\",\n-                                        \"value\": \"NESTED_FIELD\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"ROOT_NODE\",\n-                                \"description\": \"Start processing from the root node or from a specified nested node.\",\n-                                \"displayName\": \"Starting Field Strategy\",\n+                            \"source\": {\n+                                \"description\": \"User-defined event source. Sets a default for all events when unspecified.\",\n+                                \"displayName\": \"Source\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"starting-field-strategy\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"source\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n-                            }\n-                        },\n-                        \"providedApiImplementations\": [\n-                            {\n-                                \"artifact\": \"nifi-standard-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n-                                \"version\": \"1.27.0\"\n-                            }\n-                        ],\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.json.JsonPathReader\"\n-                        ],\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"json\",\n-                            \"parser\",\n-                            \"reader\",\n-                            \"record\",\n-                            \"tree\"\n-                        ],\n-                        \"type\": \"org.apache.nifi.json.JsonTreeReader\",\n-                        \"typeDescription\": \"Parses JSON into individual Record objects. While the reader expects each record to be well-formed JSON, the content of a FlowFile may consist of many records, each as a well-formed JSON array or JSON object with optional whitespace between them, such as the common 'JSON-per-line' format. If an array is encountered, each element in that array will be treated as a separate record. If the schema that is configured contains a field that is not present in the JSON, a null value will be used. If the JSON contains a field that is not present in the schema, that field will be skipped. See the Usage of the Controller Service for more information and examples.\",\n-                        \"version\": \"1.27.0\"\n-                    },\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-record-serialization-services-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"e0c4461\"\n-                        },\n-                        \"dynamicProperties\": [\n-                            {\n-                                \"description\": \"\",\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"name\": \"Name of the RecordReader\",\n-                                \"value\": \"A RecordReaderFactory controller service\"\n-                            }\n-                        ],\n-                        \"group\": \"org.apache.nifi\",\n-                        \"propertyDescriptors\": {\n-                            \"Service to Use\": {\n-                                \"defaultValue\": \"${recordreader.name}\",\n-                                \"description\": \"Specifies the name of the user-defined property whose associated Controller Service should be used.\",\n-                                \"displayName\": \"Service to Use\",\n+                            },\n+                            \"source-type\": {\n+                                \"description\": \"User-defined event sourcetype. Sets a default for all events when unspecified.\",\n+                                \"displayName\": \"Source Type\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Service to Use\",\n-                                \"required\": true,\n+                                \"name\": \"source-type\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             }\n                         },\n-                        \"providedApiImplementations\": [\n+                        \"readsAttributes\": [\n                             {\n-                                \"artifact\": \"nifi-standard-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n-                                \"version\": \"1.27.0\"\n+                                \"description\": \"Uses as value for HTTP Content-Type header if set.\",\n+                                \"name\": \"mime.type\"\n                             }\n                         ],\n                         \"seeAlso\": [\n-                            \"org.apache.nifi.lookup.RecordSetWriterLookup\"\n-                        ],\n-                        \"supportsDynamicProperties\": true,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"lookup\",\n-                            \"parse\",\n-                            \"reader\",\n-                            \"record\",\n-                            \"row\"\n+                            \"org.apache.nifi.processors.splunk.QuerySplunkIndexingStatus\"\n                         ],\n-                        \"type\": \"org.apache.nifi.lookup.ReaderLookup\",\n-                        \"typeDescription\": \"Provides a RecordReaderFactory that can be used to dynamically select another RecordReaderFactory. This will allow multiple RecordReaderFactories to be defined and registered, and then selected dynamically at runtime by referencing a FlowFile attribute in the Service to Use property.\",\n-                        \"version\": \"1.27.0\"\n-                    },\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-record-serialization-services-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"e0c4461\"\n-                        },\n-                        \"dynamicProperties\": [\n+                        \"sideEffectFree\": false,\n+                        \"supportedRelationships\": [\n                             {\n-                                \"description\": \"\",\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"name\": \"Name of the RecordSetWriter\",\n-                                \"value\": \"A RecordSetWriterFactory controller service\"\n-                            }\n-                        ],\n-                        \"group\": \"org.apache.nifi\",\n-                        \"propertyDescriptors\": {\n-                            \"Service to Use\": {\n-                                \"defaultValue\": \"${recordsetwriter.name}\",\n-                                \"description\": \"Specifies the name of the user-defined property whose associated Controller Service should be used.\",\n-                                \"displayName\": \"Service to Use\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Service to Use\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            }\n-                        },\n-                        \"providedApiImplementations\": [\n+                                \"description\": \"FlowFiles that are sent successfully to the destination are sent to this relationship.\",\n+                                \"name\": \"success\"\n+                            },\n                             {\n-                                \"artifact\": \"nifi-standard-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n-                                \"version\": \"1.27.0\"\n+                                \"description\": \"FlowFiles that failed to send to the destination are sent to this relationship.\",\n+                                \"name\": \"failure\"\n                             }\n                         ],\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.lookup.ReaderLookup\"\n+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\"\n                         ],\n-                        \"supportsDynamicProperties\": true,\n+                        \"supportsBatching\": false,\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicRelationships\": false,\n+                        \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n+                        \"systemResourceConsiderations\": [\n+                            {\n+                                \"description\": \"An instance of this component can cause high usage of this system resource.  Multiple instances or high concurrency settings may result a degradation of performance.\",\n+                                \"resource\": \"MEMORY\"\n+                            }\n+                        ],\n                         \"tags\": [\n-                            \"lookup\",\n-                            \"record\",\n-                            \"recordset\",\n-                            \"result\",\n-                            \"row\",\n-                            \"serializer\",\n-                            \"set\",\n-                            \"writer\"\n+                            \"http\",\n+                            \"logs\",\n+                            \"splunk\"\n                         ],\n-                        \"type\": \"org.apache.nifi.lookup.RecordSetWriterLookup\",\n-                        \"typeDescription\": \"Provides a RecordSetWriterFactory that can be used to dynamically select another RecordSetWriterFactory. This will allow multiple RecordSetWriterFactory's to be defined and registered, and then selected dynamically at runtime by tagging FlowFiles with the attributes and referencing those attributes in the Service to Use property.\",\n-                        \"version\": \"1.27.0\"\n+                        \"triggerSerially\": false,\n+                        \"triggerWhenAnyDestinationAvailable\": false,\n+                        \"triggerWhenEmpty\": false,\n+                        \"type\": \"org.apache.nifi.processors.splunk.PutSplunkHTTP\",\n+                        \"typeDescription\": \"Sends flow file content to the specified Splunk server over HTTP or HTTPS. Supports HEC Index Acknowledgement.\",\n+                        \"version\": \"1.27.0\",\n+                        \"writesAttributes\": [\n+                            {\n+                                \"description\": \"The indexing acknowledgement id provided by Splunk.\",\n+                                \"name\": \"splunk.acknowledgement.id\"\n+                            },\n+                            {\n+                                \"description\": \"The time of the response of put request for Splunk.\",\n+                                \"name\": \"splunk.responded.at\"\n+                            }\n+                        ]\n                     },\n                     {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-record-serialization-services-nar\",\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-splunk-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n+                        \"defaultBulletinLevel\": \"WARN\",\n+                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": 1,\n+                            \"TIMER_DRIVEN\": 1\n+                        },\n+                        \"defaultPenaltyDuration\": \"30 sec\",\n+                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": \"* * * * * ?\",\n+                            \"TIMER_DRIVEN\": \"1 min\"\n+                        },\n+                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n+                        \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n+                        \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"max-cache-size\": {\n-                                \"defaultValue\": \"100\",\n-                                \"description\": \"The maximum number of Schemas to cache.\",\n-                                \"displayName\": \"Maximum Cache Size\",\n+                            \"Hostname\": {\n+                                \"defaultValue\": \"localhost\",\n+                                \"description\": \"The ip address or hostname of the Splunk server.\",\n+                                \"displayName\": \"Hostname\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"max-cache-size\",\n+                                \"name\": \"Hostname\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n-                            }\n-                        },\n-                        \"providedApiImplementations\": [\n-                            {\n-                                \"artifact\": \"nifi-standard-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.serialization.RecordSchemaCacheService\",\n-                                \"version\": \"1.27.0\"\n-                            }\n-                        ],\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"cache\",\n-                            \"record\",\n-                            \"schema\"\n-                        ],\n-                        \"type\": \"org.apache.nifi.schema.inference.VolatileSchemaCache\",\n-                        \"typeDescription\": \"Provides a Schema Cache that evicts elements based on a Least-Recently-Used algorithm. This cache is not persisted, so any restart of NiFi will result in the cache being cleared. Additionally, the cache will be cleared any time that the Controller Service is stopped and restarted.\",\n-                        \"version\": \"1.27.0\"\n-                    },\n-                    {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-record-serialization-services-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"e0c4461\"\n-                        },\n-                        \"group\": \"org.apache.nifi\",\n-                        \"propertyDescriptors\": {\n-                            \"Character Set\": {\n-                                \"defaultValue\": \"UTF-8\",\n-                                \"description\": \"Specifies which character set of the Syslog messages\",\n-                                \"displayName\": \"Character Set\",\n+                            },\n+                            \"Owner\": {\n+                                \"description\": \"The owner to pass to Splunk.\",\n+                                \"displayName\": \"Owner\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Owner\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Password\": {\n+                                \"description\": \"The password to authenticate to Splunk.\",\n+                                \"displayName\": \"Password\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Character Set\",\n+                                \"name\": \"Password\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n+                            },\n+                            \"Port\": {\n+                                \"defaultValue\": \"8088\",\n+                                \"description\": \"The HTTP Event Collector HTTP Port Number.\",\n+                                \"displayName\": \"HTTP Event Collector Port\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Port\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"syslog-5424-reader-raw-message\": {\n+                            \"Scheme\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"displayName\": \"https\",\n+                                        \"value\": \"https\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"displayName\": \"http\",\n+                                        \"value\": \"http\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"If true, the record will have a _raw field containing the raw message\",\n-                                \"displayName\": \"Raw message\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"syslog-5424-reader-raw-message\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            }\n-                        },\n-                        \"providedApiImplementations\": [\n-                            {\n-                                \"artifact\": \"nifi-standard-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n-                                \"version\": \"1.27.0\"\n-                            }\n-                        ],\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"logfiles\",\n-                            \"logs\",\n-                            \"parse\",\n-                            \"reader\",\n-                            \"record\",\n-                            \"syslog\",\n-                            \"syslog 5424\",\n-                            \"text\"\n-                        ],\n-                        \"type\": \"org.apache.nifi.syslog.Syslog5424Reader\",\n-                        \"typeDescription\": \"Provides a mechanism for reading RFC 5424 compliant Syslog data, such as log files, and structuring the data so that it can be processed.\",\n-                        \"version\": \"1.27.0\"\n-                    },\n-                    {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-record-serialization-services-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"e0c4461\"\n-                        },\n-                        \"group\": \"org.apache.nifi\",\n-                        \"propertyDescriptors\": {\n-                            \"Character Set\": {\n-                                \"defaultValue\": \"UTF-8\",\n-                                \"description\": \"Specifies which character set of the Syslog messages\",\n-                                \"displayName\": \"Character Set\",\n+                                \"defaultValue\": \"https\",\n+                                \"description\": \"The scheme for connecting to Splunk.\",\n+                                \"displayName\": \"Scheme\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Character Set\",\n+                                \"name\": \"Scheme\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"syslog-5424-reader-raw-message\": {\n+                            \"Security Protocol\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"displayName\": \"TLSv1_2\",\n+                                        \"value\": \"TLSv1_2\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"displayName\": \"TLSv1_1\",\n+                                        \"value\": \"TLSv1_1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"TLSv1\",\n+                                        \"value\": \"TLSv1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"SSLv3\",\n+                                        \"value\": \"SSLv3\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"If true, the record will have a _raw field containing the raw message\",\n-                                \"displayName\": \"Raw message\",\n+                                \"defaultValue\": \"TLSv1_2\",\n+                                \"description\": \"The security protocol to use for communicating with Splunk.\",\n+                                \"displayName\": \"Security Protocol\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"syslog-5424-reader-raw-message\",\n+                                \"name\": \"Security Protocol\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Token\": {\n+                                \"description\": \"HTTP Event Collector token starting with the string Splunk. For example 'Splunk 1234578-abcd-1234-abcd-1234abcd'\",\n+                                \"displayName\": \"HTTP Event Collector Token\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Token\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Username\": {\n+                                \"description\": \"The username to authenticate to Splunk.\",\n+                                \"displayName\": \"Username\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Username\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"max-query-size\": {\n+                                \"defaultValue\": \"10000\",\n+                                \"description\": \"The maximum number of acknowledgement identifiers the outgoing query contains in one batch. It is recommended not to set it too low in order to reduce network communication.\",\n+                                \"displayName\": \"Maximum Query Size\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"max-query-size\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"request-channel\": {\n+                                \"description\": \"Identifier of the used request channel.\",\n+                                \"displayName\": \"Splunk Request Channel\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"request-channel\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"ttl\": {\n+                                \"defaultValue\": \"1 hour\",\n+                                \"description\": \"The maximum time the processor tries to acquire acknowledgement confirmation for an index, from the point of registration. After the given amount of time, the processor considers the index as not acknowledged and transfers the FlowFile to the \\\"unacknowledged\\\" relationship.\",\n+                                \"displayName\": \"Maximum Waiting Time\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"ttl\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             }\n                         },\n-                        \"providedApiImplementations\": [\n+                        \"readsAttributes\": [\n                             {\n-                                \"artifact\": \"nifi-standard-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n-                                \"version\": \"1.27.0\"\n+                                \"description\": \"The indexing acknowledgement id provided by Splunk.\",\n+                                \"name\": \"splunk.acknowledgement.id\"\n+                            },\n+                            {\n+                                \"description\": \"The time of the response of put request for Splunk.\",\n+                                \"name\": \"splunk.responded.at\"\n+                            }\n+                        ],\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.processors.splunk.PutSplunkHTTP\"\n+                        ],\n+                        \"sideEffectFree\": false,\n+                        \"supportedRelationships\": [\n+                            {\n+                                \"description\": \"A FlowFile is transferred to this relationship when the acknowledgement was successful.\",\n+                                \"name\": \"success\"\n+                            },\n+                            {\n+                                \"description\": \"A FlowFile is transferred to this relationship when the acknowledgement was not successful. This can happen when the acknowledgement did not happened within the time period set for Maximum Waiting Time. FlowFiles with acknowledgement id unknown for the Splunk server will be transferred to this relationship after the Maximum Waiting Time is reached.\",\n+                                \"name\": \"unacknowledged\"\n+                            },\n+                            {\n+                                \"description\": \"A FlowFile is transferred to this relationship when the acknowledgement state is not determined. FlowFiles transferred to this relationship might be penalized. This happens when Splunk returns with HTTP 200 but with false response for the acknowledgement id in the flow file attribute.\",\n+                                \"name\": \"undetermined\"\n+                            },\n+                            {\n+                                \"description\": \"A FlowFile is transferred to this relationship when the acknowledgement was not successful due to errors during the communication. FlowFiles are timing out or unknown by the Splunk server will transferred to \\\"undetermined\\\" relationship.\",\n+                                \"name\": \"failure\"\n                             }\n                         ],\n+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\"\n+                        ],\n+                        \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicRelationships\": false,\n+                        \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"logfiles\",\n+                            \"acknowledgement\",\n+                            \"http\",\n                             \"logs\",\n-                            \"parse\",\n-                            \"reader\",\n-                            \"record\",\n-                            \"syslog\",\n-                            \"text\"\n+                            \"splunk\"\n                         ],\n-                        \"type\": \"org.apache.nifi.syslog.SyslogReader\",\n-                        \"typeDescription\": \"Attempts to parses the contents of a Syslog message in accordance to RFC5424 and RFC3164. In the case of RFC5424 formatted messages, structured data is not supported, and will be returned as part of the message.Note: Be mindfull that RFC3164 is informational and a wide range of different implementations are present in the wild.\",\n+                        \"triggerSerially\": false,\n+                        \"triggerWhenAnyDestinationAvailable\": false,\n+                        \"triggerWhenEmpty\": false,\n+                        \"type\": \"org.apache.nifi.processors.splunk.QuerySplunkIndexingStatus\",\n+                        \"typeDescription\": \"Queries Splunk server in order to acquire the status of indexing acknowledgement.\",\n                         \"version\": \"1.27.0\"\n-                    },\n+                    }\n+                ],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"1.27.0\"\n+        },\n+        {\n+            \"artifact\": \"nifi-mongodb-client-service-api-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [],\n+                \"processors\": [],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"1.27.0\"\n+        },\n+        {\n+            \"artifact\": \"nifi-confluent-platform-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-record-serialization-services-nar\",\n+                        \"artifact\": \"nifi-confluent-platform-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n+                        \"dynamicProperties\": [\n+                            {\n+                                \"description\": \"Properties that begin with 'request.header.' are populated into a map and passed as http headers in REST requests to the Confluent Schema Registry\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"name\": \"request.header.*\",\n+                                \"value\": \"String literal, may not be empty\"\n+                            }\n+                        ],\n                         \"group\": \"org.apache.nifi\",\n                         \"propertyDescriptors\": {\n-                            \"Character Set\": {\n-                                \"defaultValue\": \"UTF-8\",\n-                                \"description\": \"The Character set to use when writing the data to the FlowFile\",\n-                                \"displayName\": \"Character Set\",\n+                            \"authentication-type\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"BASIC\",\n+                                        \"value\": \"BASIC\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"NONE\",\n+                                        \"value\": \"NONE\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"NONE\",\n+                                \"description\": \"HTTP Client Authentication Type for Confluent Schema Registry\",\n+                                \"displayName\": \"Authentication Type\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Character Set\",\n+                                \"name\": \"authentication-type\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"cache-expiration\": {\n+                                \"defaultValue\": \"1 hour\",\n+                                \"description\": \"Specifies how long a Schema that is cached should remain in the cache. Once this time period elapses, a cached version of a schema will no longer be used, and the service will have to communicate with the Schema Registry again in order to obtain the schema.\",\n+                                \"displayName\": \"Cache Expiration\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"cache-expiration\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Text\": {\n-                                \"description\": \"The text to use when writing the results. This property will evaluate the Expression Language using any of the fields available in a Record.\",\n-                                \"displayName\": \"Text\",\n+                            \"cache-size\": {\n+                                \"defaultValue\": \"1000\",\n+                                \"description\": \"Specifies how many Schemas should be cached from the Schema Registry\",\n+                                \"displayName\": \"Cache Size\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Text\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"cache-size\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"password\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"BASIC\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Authentication Type\",\n+                                        \"propertyName\": \"authentication-type\"\n+                                    }\n+                                ],\n+                                \"description\": \"Password for authentication to Confluent Schema Registry\",\n+                                \"displayName\": \"Password\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"password\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n+                            },\n+                            \"ssl-context\": {\n+                                \"description\": \"Specifies the SSL Context Service to use for interacting with the Confluent Schema Registry\",\n+                                \"displayName\": \"SSL Context Service\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"ssl-context\",\n+                                \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"timeout\": {\n+                                \"defaultValue\": \"30 secs\",\n+                                \"description\": \"Specifies how long to wait to receive data from the Schema Registry before considering the communications a failure\",\n+                                \"displayName\": \"Communications Timeout\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"timeout\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n+                            },\n+                            \"url\": {\n+                                \"defaultValue\": \"http://localhost:8081\",\n+                                \"description\": \"A comma-separated list of URLs of the Schema Registry to interact with\",\n+                                \"displayName\": \"Schema Registry URLs\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"url\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"username\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"BASIC\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Authentication Type\",\n+                                        \"propertyName\": \"authentication-type\"\n+                                    }\n+                                ],\n+                                \"description\": \"Username for authentication to Confluent Schema Registry\",\n+                                \"displayName\": \"Username\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"username\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n                             }\n                         },\n                         \"providedApiImplementations\": [\n                             {\n                                 \"artifact\": \"nifi-standard-services-api-nar\",\n                                 \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n+                                \"type\": \"org.apache.nifi.schemaregistry.services.SchemaRegistry\",\n                                 \"version\": \"1.27.0\"\n                             }\n                         ],\n-                        \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicProperties\": true,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"el\",\n-                            \"expression\",\n-                            \"freeform\",\n-                            \"language\",\n-                            \"record\",\n-                            \"recordset\",\n-                            \"resultset\",\n-                            \"serialize\",\n-                            \"text\",\n-                            \"writer\"\n+                            \"avro\",\n+                            \"confluent\",\n+                            \"kafka\",\n+                            \"registry\",\n+                            \"schema\"\n                         ],\n-                        \"type\": \"org.apache.nifi.text.FreeFormTextRecordSetWriter\",\n-                        \"typeDescription\": \"Writes the contents of a RecordSet as free-form text. The configured text is able to make use of the Expression Language to reference each of the fields that are available in a Record, as well as the attributes in the FlowFile and variables. If there is a name collision, the field name/value is used before attributes or variables. Each record in the RecordSet will be separated by a single newline character.\",\n+                        \"type\": \"org.apache.nifi.confluent.schemaregistry.ConfluentSchemaRegistry\",\n+                        \"typeDescription\": \"Provides a Schema Registry that interacts with the Confluent Schema Registry so that those Schemas that are stored in the Confluent Schema Registry can be used in NiFi. The Confluent Schema Registry has a notion of a \\\"subject\\\" for schemas, which is their terminology for a schema name. When a Schema is looked up by name by this registry, it will find a Schema in the Confluent Schema Registry with that subject.\",\n                         \"version\": \"1.27.0\"\n-                    },\n+                    }\n+                ],\n+                \"processors\": [],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"1.27.0\"\n+        },\n+        {\n+            \"artifact\": \"nifi-provenance-repository-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [],\n+                \"processors\": [],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"1.27.0\"\n+        },\n+        {\n+            \"artifact\": \"nifi-single-user-iaa-providers-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [],\n+                \"processors\": [],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"1.27.0\"\n+        },\n+        {\n+            \"artifact\": \"nifi-hadoop-dbcp-service-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [\n                     {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-record-serialization-services-nar\",\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-hadoop-dbcp-service-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n-                        \"group\": \"org.apache.nifi\",\n-                        \"providedApiImplementations\": [\n+                        \"dynamicProperties\": [\n                             {\n-                                \"artifact\": \"nifi-standard-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n-                                \"version\": \"1.27.0\"\n+                                \"description\": \"These properties will be set on the Hadoop configuration after loading any provided configuration files.\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"name\": \"The name of a Hadoop configuration property.\",\n+                                \"value\": \"The value of the given Hadoop configuration property.\"\n                             }\n                         ],\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"event\",\n-                            \"log\",\n-                            \"parser\",\n-                            \"reader\",\n-                            \"record\",\n-                            \"windows\",\n-                            \"xml\"\n+                        \"explicitRestrictions\": [\n+                            {\n+                                \"explanation\": \"Database Driver Location can reference resources over HTTP\",\n+                                \"requiredPermission\": \"reference remote resources\"\n+                            }\n                         ],\n-                        \"type\": \"org.apache.nifi.windowsevent.WindowsEventLogReader\",\n-                        \"typeDescription\": \"Reads Windows Event Log data as XML content having been generated by ConsumeWindowsEventLog, ParseEvtx, etc. (see Additional Details) and creates Record object(s). If the root tag of the input XML is 'Events', the child content is expected to be a series of 'Event' tags, each of which will constitute a single record. If the root tag is 'Event', the content is expected to be a single 'Event' and thus a single record. No other root tags are valid. Only events of type 'System' are currently supported.\",\n-                        \"version\": \"1.27.0\"\n-                    },\n-                    {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-record-serialization-services-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"e0c4461\"\n-                        },\n                         \"group\": \"org.apache.nifi\",\n                         \"propertyDescriptors\": {\n-                            \"Date Format\": {\n-                                \"description\": \"Specifies the format to use when reading/writing Date fields. If not specified, Date fields will be assumed to be number of milliseconds since epoch (Midnight, Jan 1, 1970 GMT). If specified, the value must match the Java Simple Date Format (for example, MM/dd/yyyy for a two-digit month, followed by a two-digit day, followed by a four-digit year, all separated by '/' characters, as in 01/01/2017).\",\n-                                \"displayName\": \"Date Format\",\n+                            \"Database Connection URL\": {\n+                                \"description\": \"A database connection URL used to connect to a database. May contain database system name, host, port, database name and some parameters. The exact syntax of a database connection URL is specified by your DBMS.\",\n+                                \"displayName\": \"Database Connection URL\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Date Format\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Database Connection URL\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Database Driver Class Name\": {\n+                                \"description\": \"Database driver class name\",\n+                                \"displayName\": \"Database Driver Class Name\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Database Driver Class Name\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Database User\": {\n+                                \"description\": \"Database user name\",\n+                                \"displayName\": \"Database User\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Database User\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Time Format\": {\n-                                \"description\": \"Specifies the format to use when reading/writing Time fields. If not specified, Time fields will be assumed to be number of milliseconds since epoch (Midnight, Jan 1, 1970 GMT). If specified, the value must match the Java Simple Date Format (for example, HH:mm:ss for a two-digit hour in 24-hour format, followed by a two-digit minute, followed by a two-digit second, all separated by ':' characters, as in 18:04:15).\",\n-                                \"displayName\": \"Time Format\",\n+                            \"Kerberos Keytab\": {\n+                                \"description\": \"Kerberos keytab associated with the principal. Requires nifi.kerberos.krb5.file to be set in your nifi.properties\",\n+                                \"displayName\": \"Kerberos Keytab\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Time Format\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Kerberos Keytab\",\n                                 \"required\": false,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"SINGLE\",\n+                                    \"resourceTypes\": [\n+                                        \"FILE\"\n+                                    ]\n+                                },\n                                 \"sensitive\": false\n                             },\n-                            \"Timestamp Format\": {\n-                                \"description\": \"Specifies the format to use when reading/writing Timestamp fields. If not specified, Timestamp fields will be assumed to be number of milliseconds since epoch (Midnight, Jan 1, 1970 GMT). If specified, the value must match the Java Simple Date Format (for example, MM/dd/yyyy HH:mm:ss for a two-digit month, followed by a two-digit day, followed by a four-digit year, all separated by '/' characters; and then followed by a two-digit hour in 24-hour format, followed by a two-digit minute, followed by a two-digit second, all separated by ':' characters, as in 01/01/2017 18:04:15).\",\n-                                \"displayName\": \"Timestamp Format\",\n+                            \"Kerberos Password\": {\n+                                \"description\": \"Kerberos password associated with the principal.\",\n+                                \"displayName\": \"Kerberos Password\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Timestamp Format\",\n+                                \"name\": \"Kerberos Password\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n+                            },\n+                            \"Kerberos Principal\": {\n+                                \"description\": \"Kerberos principal to authenticate as. Requires nifi.kerberos.krb5.file to be set in your nifi.properties\",\n+                                \"displayName\": \"Kerberos Principal\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Kerberos Principal\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"attribute_prefix\": {\n-                                \"description\": \"If this property is set, the name of attributes will be prepended with a prefix when they are added to a record.\",\n-                                \"displayName\": \"Attribute Prefix\",\n+                            \"Max Total Connections\": {\n+                                \"defaultValue\": \"8\",\n+                                \"description\": \"The maximum number of active connections that can be allocated from this pool at the same time,  or negative for no limit.\",\n+                                \"displayName\": \"Max Total Connections\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"attribute_prefix\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Max Total Connections\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Max Wait Time\": {\n+                                \"defaultValue\": \"500 millis\",\n+                                \"description\": \"The maximum amount of time that the pool will wait (when there are no available connections)  for a connection to be returned before failing, or -1 to wait indefinitely. \",\n+                                \"displayName\": \"Max Wait Time\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Max Wait Time\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Password\": {\n+                                \"description\": \"The password for the database user\",\n+                                \"displayName\": \"Password\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Password\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n+                            },\n+                            \"Validation-query\": {\n+                                \"description\": \"Validation query used to validate connections before returning them. When connection is invalid, it gets dropped and new valid connection will be returned. Note!! Using validation might have some performance penalty.\",\n+                                \"displayName\": \"Validation query\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Validation-query\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"content_field_name\": {\n-                                \"description\": \"If tags with content (e. g. <field>content</field>) are defined as nested records in the schema, the name of the tag will be used as name for the record and the value of this property will be used as name for the field. If tags with content shall be parsed together with attributes (e. g. <field attribute=\\\"123\\\">content</field>), they have to be defined as records. In such a case, the name of the tag will be used as the name for the record and  the value of this property will be used as the name for the field holding the original content. The name of the attribute will be used to create a new record field, the content of which will be the value of the attribute. For more information, see the 'Additional Details...' section of the XMLReader controller service's documentation.\",\n-                                \"displayName\": \"Field Name for Content\",\n+                            \"database-driver-locations\": {\n+                                \"description\": \"Comma-separated list of files/folders and/or URLs containing the driver JAR and its dependencies. For example '/var/tmp/phoenix-client.jar'. NOTE: It is required that the resources specified by this property provide the classes from hadoop-common, such as Configuration and UserGroupInformation.\",\n+                                \"displayName\": \"Database Driver Location(s)\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"content_field_name\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"database-driver-locations\",\n+                                \"required\": true,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"MULTIPLE\",\n+                                    \"resourceTypes\": [\n+                                        \"DIRECTORY\",\n+                                        \"FILE\",\n+                                        \"URL\"\n+                                    ]\n+                                },\n+                                \"sensitive\": false\n+                            },\n+                            \"dbcp-max-conn-lifetime\": {\n+                                \"defaultValue\": \"-1\",\n+                                \"description\": \"The maximum lifetime of a connection. After this time is exceeded the connection will fail the next activation, passivation or validation test. A value of zero or less means the connection has an infinite lifetime.\",\n+                                \"displayName\": \"Max Connection Lifetime\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"dbcp-max-conn-lifetime\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"parse_xml_attributes\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"true\",\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"infer-schema\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n-                                        \"propertyName\": \"schema-access-strategy\"\n-                                    }\n-                                ],\n-                                \"description\": \"When 'Schema Access Strategy' is 'Infer Schema' and this property is 'true' then XML attributes are parsed and added to the record as new fields. When the schema is inferred but this property is 'false', XML attributes and their values are ignored.\",\n-                                \"displayName\": \"Parse XML Attributes\",\n+                            \"dbcp-max-idle-conns\": {\n+                                \"defaultValue\": \"8\",\n+                                \"description\": \"The maximum number of connections that can remain idle in the pool without extra ones being released. Set to any negative value to allow unlimited idle connections.\",\n+                                \"displayName\": \"Max Idle Connections\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"parse_xml_attributes\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"dbcp-max-idle-conns\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"record_format\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"Each FlowFile will consist of a single record without any sort of \\\"wrapper\\\".\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Each FlowFile will consist of zero or more records. The outer-most XML element is expected to be a \\\"wrapper\\\" and will be ignored.\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Whether to treat a FlowFile as a single Record or an array of multiple Records is determined by the value of the 'xml.stream.is.array' attribute. If the value of the attribute is 'true' (case-insensitive), then the XML Reader will treat the FlowFile as a series of Records with the outer element being ignored. If the value of the attribute is 'false' (case-insensitive), then the FlowFile is treated as a single Record and no wrapper element is assumed. If the attribute is missing or its value is anything other than 'true' or 'false', then an Exception will be thrown and no records will be parsed.\",\n-                                        \"displayName\": \"Use attribute 'xml.stream.is.array'\",\n-                                        \"value\": \"${xml.stream.is.array}\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"This property defines whether the reader expects a FlowFile to consist of a single Record or a series of Records with a \\\"wrapper element\\\". Because XML does not provide for a way to read a series of XML documents from a stream directly, it is common to combine many XML documents by concatenating them and then wrapping the entire XML blob  with a \\\"wrapper element\\\". This property dictates whether the reader expects a FlowFile to consist of a single Record or a series of Records with a \\\"wrapper element\\\" that will be ignored.\",\n-                                \"displayName\": \"Expect Records as Array\",\n+                            \"dbcp-min-evictable-idle-time\": {\n+                                \"defaultValue\": \"30 mins\",\n+                                \"description\": \"The minimum amount of time a connection may sit idle in the pool before it is eligible for eviction.\",\n+                                \"displayName\": \"Minimum Evictable Idle Time\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"record_format\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"dbcp-min-evictable-idle-time\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"schema-access-strategy\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"The name of the Schema to use is specified by the 'Schema Name' Property. The value of this property is used to lookup the Schema in the configured Schema Registry service.\",\n-                                        \"displayName\": \"Use 'Schema Name' Property\",\n-                                        \"value\": \"schema-name\"\n-                                    },\n-                                    {\n-                                        \"description\": \"The text of the Schema itself is specified by the 'Schema Text' Property. The value of this property must be a valid Avro Schema. If Expression Language is used, the value of the 'Schema Text' property must be valid after substituting the expressions.\",\n-                                        \"displayName\": \"Use 'Schema Text' Property\",\n-                                        \"value\": \"schema-text-property\"\n-                                    },\n-                                    {\n-                                        \"description\": \"The FlowFile contains 3 Attributes that will be used to lookup a Schema from the configured Schema Registry: 'schema.identifier', 'schema.version', and 'schema.protocol.version'\",\n-                                        \"displayName\": \"HWX Schema Reference Attributes\",\n-                                        \"value\": \"hwx-schema-ref-attributes\"\n-                                    },\n-                                    {\n-                                        \"description\": \"The content of the FlowFile contains a reference to a schema in the Schema Registry service. The reference is encoded as a single byte indicating the 'protocol version', followed by 8 bytes indicating the schema identifier, and finally 4 bytes indicating the schema version, as per the Hortonworks Schema Registry serializers and deserializers, found at https://github.com/hortonworks/registry\",\n-                                        \"displayName\": \"HWX Content-Encoded Schema Reference\",\n-                                        \"value\": \"hwx-content-encoded-schema\"\n-                                    },\n-                                    {\n-                                        \"description\": \"The content of the FlowFile contains a reference to a schema in the Schema Registry service. The reference is encoded as a single 'Magic Byte' followed by 4 bytes representing the identifier of the schema, as outlined at http://docs.confluent.io/current/schema-registry/docs/serializer-formatter.html. This is based on version 3.2.x of the Confluent Schema Registry.\",\n-                                        \"displayName\": \"Confluent Content-Encoded Schema Reference\",\n-                                        \"value\": \"confluent-encoded\"\n-                                    },\n-                                    {\n-                                        \"description\": \"The Schema of the data will be inferred automatically when the data is read. See component Usage and Additional Details for information about how the schema is inferred.\",\n-                                        \"displayName\": \"Infer Schema\",\n-                                        \"value\": \"infer-schema\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"infer-schema\",\n-                                \"description\": \"Specifies how to obtain the schema that is to be used for interpreting the data.\",\n-                                \"displayName\": \"Schema Access Strategy\",\n+                            \"dbcp-min-idle-conns\": {\n+                                \"defaultValue\": \"0\",\n+                                \"description\": \"The minimum number of connections that can remain idle in the pool without extra ones being created. Set to or zero to allow no idle connections.\",\n+                                \"displayName\": \"Minimum Idle Connections\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"schema-access-strategy\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"dbcp-min-idle-conns\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"schema-branch\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"schema-name\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n-                                        \"propertyName\": \"schema-access-strategy\"\n-                                    }\n-                                ],\n-                                \"description\": \"Specifies the name of the branch to use when looking up the schema in the Schema Registry property. If the chosen Schema Registry does not support branching, this value will be ignored.\",\n-                                \"displayName\": \"Schema Branch\",\n+                            \"dbcp-soft-min-evictable-idle-time\": {\n+                                \"defaultValue\": \"-1\",\n+                                \"description\": \"The minimum amount of time a connection may sit idle in the pool before it is eligible for eviction by the idle connection evictor, with the extra condition that at least a minimum number of idle connections remain in the pool. When the not-soft version of this option is set to a positive value, it is examined first by the idle connection evictor: when idle connections are visited by the evictor, idle time is first compared against it (without considering the number of idle connections in the pool) and then against this soft option, including the minimum idle connections constraint.\",\n+                                \"displayName\": \"Soft Minimum Evictable Idle Time\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"schema-branch\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"dbcp-soft-min-evictable-idle-time\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"schema-inference-cache\": {\n-                                \"description\": \"Specifies a Schema Cache to use when inferring the schema. If not populated, the schema will be inferred each time. However, if a cache is specified, the cache will first be consulted and if the applicable schema can be found, it will be used instead of inferring the schema.\",\n-                                \"displayName\": \"Schema Inference Cache\",\n+                            \"dbcp-time-between-eviction-runs\": {\n+                                \"defaultValue\": \"-1\",\n+                                \"description\": \"The time period to sleep between runs of the idle connection evictor thread. When non-positive, no idle connection evictor thread will be run.\",\n+                                \"displayName\": \"Time Between Eviction Runs\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"dbcp-time-between-eviction-runs\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"hadoop-config-resources\": {\n+                                \"description\": \"A file, or comma separated list of files, which contain the Hadoop configuration (core-site.xml, etc.). Without this, Hadoop will search the classpath, or will revert to a default configuration. Note that to enable authentication with Kerberos, the appropriate properties must be set in the configuration files.\",\n+                                \"displayName\": \"Hadoop Configuration Resources\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"hadoop-config-resources\",\n+                                \"required\": false,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"MULTIPLE\",\n+                                    \"resourceTypes\": [\n+                                        \"FILE\"\n+                                    ]\n+                                },\n+                                \"sensitive\": false\n+                            },\n+                            \"kerberos-credentials-service\": {\n+                                \"description\": \"Specifies the Kerberos Credentials Controller Service that should be used for authenticating with Kerberos\",\n+                                \"displayName\": \"Kerberos Credentials Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"schema-inference-cache\",\n+                                \"name\": \"kerberos-credentials-service\",\n                                 \"required\": false,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n                                     \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.serialization.RecordSchemaCacheService\",\n+                                    \"type\": \"org.apache.nifi.kerberos.KerberosCredentialsService\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             },\n-                            \"schema-name\": {\n-                                \"defaultValue\": \"${schema.name}\",\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"schema-name\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n-                                        \"propertyName\": \"schema-access-strategy\"\n-                                    }\n-                                ],\n-                                \"description\": \"Specifies the name of the schema to lookup in the Schema Registry property\",\n-                                \"displayName\": \"Schema Name\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"schema-name\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"schema-registry\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"confluent-encoded\",\n-                                            \"schema-name\",\n-                                            \"hwx-schema-ref-attributes\",\n-                                            \"hwx-content-encoded-schema\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n-                                        \"propertyName\": \"schema-access-strategy\"\n-                                    }\n-                                ],\n-                                \"description\": \"Specifies the Controller Service to use for the Schema Registry\",\n-                                \"displayName\": \"Schema Registry\",\n+                            \"kerberos-user-service\": {\n+                                \"description\": \"Specifies the Kerberos User Controller Service that should be used for authenticating with Kerberos\",\n+                                \"displayName\": \"Kerberos User Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"schema-registry\",\n+                                \"name\": \"kerberos-user-service\",\n                                 \"required\": false,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n                                     \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.schemaregistry.services.SchemaRegistry\",\n+                                    \"type\": \"org.apache.nifi.kerberos.KerberosUserService\",\n                                     \"version\": \"1.27.0\"\n                                 }\n-                            },\n-                            \"schema-text\": {\n-                                \"defaultValue\": \"${avro.schema}\",\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"schema-text-property\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n-                                        \"propertyName\": \"schema-access-strategy\"\n-                                    }\n-                                ],\n-                                \"description\": \"The text of an Avro-formatted Schema\",\n-                                \"displayName\": \"Schema Text\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"schema-text\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"schema-version\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"schema-name\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n-                                        \"propertyName\": \"schema-access-strategy\"\n-                                    }\n-                                ],\n-                                \"description\": \"Specifies the version of the schema to lookup in the Schema Registry. If not specified then the latest version of the schema will be retrieved.\",\n-                                \"displayName\": \"Schema Version\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"schema-version\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n                             }\n                         },\n                         \"providedApiImplementations\": [\n                             {\n                                 \"artifact\": \"nifi-standard-services-api-nar\",\n                                 \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n+                                \"type\": \"org.apache.nifi.dbcp.DBCPService\",\n                                 \"version\": \"1.27.0\"\n                             }\n                         ],\n-                        \"supportsDynamicProperties\": false,\n+                        \"restricted\": true,\n+                        \"supportsDynamicProperties\": true,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"parser\",\n-                            \"reader\",\n-                            \"record\",\n-                            \"xml\"\n+                            \"connection\",\n+                            \"database\",\n+                            \"dbcp\",\n+                            \"hadoop\",\n+                            \"jdbc\",\n+                            \"pooling\",\n+                            \"store\"\n                         ],\n-                        \"type\": \"org.apache.nifi.xml.XMLReader\",\n-                        \"typeDescription\": \"Reads XML content and creates Record objects. Records are expected in the second level of XML data, embedded in an enclosing root tag.\",\n+                        \"type\": \"org.apache.nifi.dbcp.HadoopDBCPConnectionPool\",\n+                        \"typeDescription\": \"Provides a Database Connection Pooling Service for Hadoop related JDBC services. This service requires that the Database Driver Location(s) contains some version of a hadoop-common JAR, or a shaded JAR that shades hadoop-common.\",\n                         \"version\": \"1.27.0\"\n-                    },\n+                    }\n+                ],\n+                \"processors\": [],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"1.27.0\"\n+        },\n+        {\n+            \"artifact\": \"nifi-gcp-services-api-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [],\n+                \"processors\": [],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"1.27.0\"\n+        },\n+        {\n+            \"artifact\": \"nifi-stateful-analysis-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [],\n+                \"processors\": [\n                     {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-record-serialization-services-nar\",\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-stateful-analysis-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n+                        \"defaultBulletinLevel\": \"WARN\",\n+                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": 1,\n+                            \"TIMER_DRIVEN\": 1\n+                        },\n+                        \"defaultPenaltyDuration\": \"30 sec\",\n+                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": \"* * * * * ?\",\n+                            \"TIMER_DRIVEN\": \"0 sec\"\n+                        },\n+                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n+                        \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n+                        \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Character Set\": {\n-                                \"defaultValue\": \"UTF-8\",\n-                                \"description\": \"The Character set to use when writing the data to the FlowFile\",\n-                                \"displayName\": \"Character Set\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Character Set\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Date Format\": {\n-                                \"description\": \"Specifies the format to use when reading/writing Date fields. If not specified, Date fields will be assumed to be number of milliseconds since epoch (Midnight, Jan 1, 1970 GMT). If specified, the value must match the Java Simple Date Format (for example, MM/dd/yyyy for a two-digit month, followed by a two-digit day, followed by a four-digit year, all separated by '/' characters, as in 01/01/2017).\",\n-                                \"displayName\": \"Date Format\",\n+                            \"Sub-window length\": {\n+                                \"description\": \"When set, values will be batched into sub-windows of the set length. This allows for much larger length total windows to be set but sacrifices some precision. If this is not set (or is 0) then each value is stored in state with the timestamp of when it was received. After the length of time stated in Time window elaspes the value will be removed. If this is set, values will be batched together every X amount of time (where X is the time period set for this property) and removed all at once.\",\n+                                \"displayName\": \"Sub-window length\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Date Format\",\n+                                \"name\": \"Sub-window length\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Schema Write Strategy\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"Do not add any schema-related information to the FlowFile.\",\n-                                        \"displayName\": \"Do Not Write Schema\",\n-                                        \"value\": \"no-schema\"\n-                                    },\n-                                    {\n-                                        \"description\": \"The FlowFile will be given an attribute named 'schema.name' and this attribute will indicate the name of the schema in the Schema Registry. Note that ifthe schema for a record is not obtained from a Schema Registry, then no attribute will be added.\",\n-                                        \"displayName\": \"Set 'schema.name' Attribute\",\n-                                        \"value\": \"schema-name\"\n-                                    },\n-                                    {\n-                                        \"description\": \"The FlowFile will be given an attribute named 'avro.schema' and this attribute will contain the Avro Schema that describes the records in the FlowFile. The contents of the FlowFile need not be Avro, but the text of the schema will be used.\",\n-                                        \"displayName\": \"Set 'avro.schema' Attribute\",\n-                                        \"value\": \"full-schema-attribute\"\n-                                    },\n-                                    {\n-                                        \"description\": \"The FlowFile will be given a set of 3 attributes to describe the schema: 'schema.identifier', 'schema.version', and 'schema.protocol.version'. Note that if the schema for a record does not contain the necessary identifier and version, an Exception will be thrown when attempting to write the data.\",\n-                                        \"displayName\": \"HWX Schema Reference Attributes\",\n-                                        \"value\": \"hwx-schema-ref-attributes\"\n-                                    },\n-                                    {\n-                                        \"description\": \"The content of the FlowFile will contain a reference to a schema in the Schema Registry service. The reference is encoded as a single byte indicating the 'protocol version', followed by 8 bytes indicating the schema identifier, and finally 4 bytes indicating the schema version, as per the Hortonworks Schema Registry serializers and deserializers, as found at https://github.com/hortonworks/registry. This will be prepended to each FlowFile. Note that if the schema for a record does not contain the necessary identifier and version, an Exception will be thrown when attempting to write the data.\",\n-                                        \"displayName\": \"HWX Content-Encoded Schema Reference\",\n-                                        \"value\": \"hwx-content-encoded-schema\"\n-                                    },\n-                                    {\n-                                        \"description\": \"The content of the FlowFile will contain a reference to a schema in the Schema Registry service. The reference is encoded as a single 'Magic Byte' followed by 4 bytes representing the identifier of the schema, as outlined at http://docs.confluent.io/current/schema-registry/docs/serializer-formatter.html. This will be prepended to each FlowFile. Note that if the schema for a record does not contain the necessary identifier and version, an Exception will be thrown when attempting to write the data. This is based on the encoding used by version 3.2.x of the Confluent Schema Registry.\",\n-                                        \"displayName\": \"Confluent Schema Registry Reference\",\n-                                        \"value\": \"confluent-encoded\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"no-schema\",\n-                                \"description\": \"Specifies how the schema for a Record should be added to the data.\",\n-                                \"displayName\": \"Schema Write Strategy\",\n+                            \"Time window\": {\n+                                \"description\": \"The time window on which to calculate the rolling window.\",\n+                                \"displayName\": \"Time window\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Schema Write Strategy\",\n+                                \"name\": \"Time window\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Time Format\": {\n-                                \"description\": \"Specifies the format to use when reading/writing Time fields. If not specified, Time fields will be assumed to be number of milliseconds since epoch (Midnight, Jan 1, 1970 GMT). If specified, the value must match the Java Simple Date Format (for example, HH:mm:ss for a two-digit hour in 24-hour format, followed by a two-digit minute, followed by a two-digit second, all separated by ':' characters, as in 18:04:15).\",\n-                                \"displayName\": \"Time Format\",\n+                            \"Value to track\": {\n+                                \"description\": \"The expression on which to evaluate each FlowFile. The result of the expression will be added to the rolling window value.\",\n+                                \"displayName\": \"Value to track\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Time Format\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Value to track\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n+                            }\n+                        },\n+                        \"sideEffectFree\": false,\n+                        \"stateful\": {\n+                            \"description\": \"Store the values backing the rolling window. This includes storing the individual values and their time-stamps or the batches of values and their counts.\",\n+                            \"scopes\": [\n+                                \"LOCAL\"\n+                            ]\n+                        },\n+                        \"supportedRelationships\": [\n+                            {\n+                                \"description\": \"When state fails to save when processing a FlowFile, the FlowFile is routed here.\",\n+                                \"name\": \"set state fail\"\n                             },\n-                            \"Timestamp Format\": {\n-                                \"description\": \"Specifies the format to use when reading/writing Timestamp fields. If not specified, Timestamp fields will be assumed to be number of milliseconds since epoch (Midnight, Jan 1, 1970 GMT). If specified, the value must match the Java Simple Date Format (for example, MM/dd/yyyy HH:mm:ss for a two-digit month, followed by a two-digit day, followed by a four-digit year, all separated by '/' characters; and then followed by a two-digit hour in 24-hour format, followed by a two-digit minute, followed by a two-digit second, all separated by ':' characters, as in 01/01/2017 18:04:15).\",\n-                                \"displayName\": \"Timestamp Format\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Timestamp Format\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n+                            {\n+                                \"description\": \"All FlowFiles are successfully processed are routed here\",\n+                                \"name\": \"success\"\n                             },\n-                            \"array_tag_name\": {\n-                                \"description\": \"Name of the tag used by property \\\"Wrap Elements of Arrays\\\" to write arrays\",\n-                                \"displayName\": \"Array Tag Name\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"array_tag_name\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n+                            {\n+                                \"description\": \"When a FlowFile fails for a reason other than failing to set state it is routed here.\",\n+                                \"name\": \"failure\"\n+                            }\n+                        ],\n+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\"\n+                        ],\n+                        \"supportsBatching\": false,\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicRelationships\": false,\n+                        \"supportsEventDriven\": false,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"Attribute Expression Language\",\n+                            \"data science\",\n+                            \"rolling\",\n+                            \"state\",\n+                            \"window\"\n+                        ],\n+                        \"triggerSerially\": true,\n+                        \"triggerWhenAnyDestinationAvailable\": false,\n+                        \"triggerWhenEmpty\": false,\n+                        \"type\": \"org.apache.nifi.processors.stateful.analysis.AttributeRollingWindow\",\n+                        \"typeDescription\": \"Track a Rolling Window based on evaluating an Expression Language expression on each FlowFile and add that value to the processor's state. Each FlowFile will be emitted with the count of FlowFiles and total aggregate value of values processed in the current time window.\",\n+                        \"version\": \"1.27.0\",\n+                        \"writesAttributes\": [\n+                            {\n+                                \"description\": \"The rolling window value (sum of all the values stored).\",\n+                                \"name\": \"rolling_window_value\"\n                             },\n-                            \"array_wrapping\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"The value of the property \\\"Array Tag Name\\\" will be used as the tag name to wrap elements of an array. The field name of the array field will be used for the tag name of the elements.\",\n-                                        \"displayName\": \"Use Property as Wrapper\",\n-                                        \"value\": \"use-property-as-wrapper\"\n-                                    },\n-                                    {\n-                                        \"description\": \"The value of the property \\\"Array Tag Name\\\" will be used for the tag name of the elements of an array. The field name of the array field will be used as the tag name to wrap elements.\",\n-                                        \"displayName\": \"Use Property for Elements\",\n-                                        \"value\": \"use-property-for-elements\"\n-                                    },\n-                                    {\n-                                        \"description\": \"The elements of an array will not be wrapped\",\n-                                        \"displayName\": \"No Wrapping\",\n-                                        \"value\": \"no-wrapping\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"no-wrapping\",\n-                                \"description\": \"Specifies how the writer wraps elements of fields of type array\",\n-                                \"displayName\": \"Wrap Elements of Arrays\",\n+                            {\n+                                \"description\": \"The count of the number of FlowFiles seen in the rolling window.\",\n+                                \"name\": \"rolling_window_count\"\n+                            },\n+                            {\n+                                \"description\": \"The mean of the FlowFiles seen in the rolling window.\",\n+                                \"name\": \"rolling_window_mean\"\n+                            },\n+                            {\n+                                \"description\": \"The variance of the FlowFiles seen in the rolling window.\",\n+                                \"name\": \"rolling_window_variance\"\n+                            },\n+                            {\n+                                \"description\": \"The standard deviation (positive square root of the variance) of the FlowFiles seen in the rolling window.\",\n+                                \"name\": \"rolling_window_stddev\"\n+                            }\n+                        ]\n+                    }\n+                ],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"1.27.0\"\n+        },\n+        {\n+            \"artifact\": \"nifi-websocket-services-jetty-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-websocket-services-jetty-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"e0c4461\"\n+                        },\n+                        \"group\": \"org.apache.nifi\",\n+                        \"propertyDescriptors\": {\n+                            \"authentication-charset\": {\n+                                \"defaultValue\": \"US-ASCII\",\n+                                \"description\": \"The charset for Basic Authentication header base64 string.\",\n+                                \"displayName\": \"Authentication Header Charset\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"array_wrapping\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"authentication-charset\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"omit_xml_declaration\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"Specifies whether or not to include XML declaration\",\n-                                \"displayName\": \"Omit XML Declaration\",\n+                            \"connection-attempt-timeout\": {\n+                                \"defaultValue\": \"3\",\n+                                \"description\": \"The number of times to try and establish a connection.\",\n+                                \"displayName\": \"Connection Attempt Count\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"omit_xml_declaration\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"connection-attempt-timeout\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"pretty_print_xml\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"Specifies whether or not the XML should be pretty printed\",\n-                                \"displayName\": \"Pretty Print XML\",\n+                            \"connection-timeout\": {\n+                                \"defaultValue\": \"3 sec\",\n+                                \"description\": \"The timeout to connect the WebSocket URI.\",\n+                                \"displayName\": \"Connection Timeout\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"pretty_print_xml\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"connection-timeout\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"record_tag_name\": {\n-                                \"description\": \"Specifies the name of the XML record tag wrapping the record fields. If this is not set, the writer will use the record name in the schema.\",\n-                                \"displayName\": \"Name of Record Tag\",\n+                            \"custom-authorization\": {\n+                                \"description\": \"Configures a custom HTTP Authorization Header as described in RFC 7235 Section 4.2. Setting a custom Authorization Header excludes configuring the User Name and User Password properties for Basic Authentication.\",\n+                                \"displayName\": \"Custom Authorization\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"record_tag_name\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"custom-authorization\",\n                                 \"required\": false,\n-                                \"sensitive\": false\n+                                \"sensitive\": true\n                             },\n-                            \"root_tag_name\": {\n-                                \"description\": \"Specifies the name of the XML root tag wrapping the record set. This property has to be defined if the writer is supposed to write multiple records in a single FlowFile.\",\n-                                \"displayName\": \"Name of Root Tag\",\n+                            \"input-buffer-size\": {\n+                                \"defaultValue\": \"4 kb\",\n+                                \"description\": \"The size of the input (read from network layer) buffer size.\",\n+                                \"displayName\": \"Input Buffer Size\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"root_tag_name\",\n-                                \"required\": false,\n+                                \"name\": \"input-buffer-size\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"schema-access-strategy\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"The schema used to write records will be the same schema that was given to the Record when the Record was created.\",\n-                                        \"displayName\": \"Inherit Record Schema\",\n-                                        \"value\": \"inherit-record-schema\"\n-                                    },\n-                                    {\n-                                        \"description\": \"The name of the Schema to use is specified by the 'Schema Name' Property. The value of this property is used to lookup the Schema in the configured Schema Registry service.\",\n-                                        \"displayName\": \"Use 'Schema Name' Property\",\n-                                        \"value\": \"schema-name\"\n-                                    },\n-                                    {\n-                                        \"description\": \"The text of the Schema itself is specified by the 'Schema Text' Property. The value of this property must be a valid Avro Schema. If Expression Language is used, the value of the 'Schema Text' property must be valid after substituting the expressions.\",\n-                                        \"displayName\": \"Use 'Schema Text' Property\",\n-                                        \"value\": \"schema-text-property\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"inherit-record-schema\",\n-                                \"description\": \"Specifies how to obtain the schema that is to be used for interpreting the data.\",\n-                                \"displayName\": \"Schema Access Strategy\",\n+                            \"max-binary-message-size\": {\n+                                \"defaultValue\": \"64 kb\",\n+                                \"description\": \"The maximum size of a binary message during parsing/generating.\",\n+                                \"displayName\": \"Max Binary Message Size\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"schema-access-strategy\",\n+                                \"name\": \"max-binary-message-size\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"schema-branch\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"schema-name\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n-                                        \"propertyName\": \"schema-access-strategy\"\n-                                    }\n-                                ],\n-                                \"description\": \"Specifies the name of the branch to use when looking up the schema in the Schema Registry property. If the chosen Schema Registry does not support branching, this value will be ignored.\",\n-                                \"displayName\": \"Schema Branch\",\n+                            \"max-text-message-size\": {\n+                                \"defaultValue\": \"64 kb\",\n+                                \"description\": \"The maximum size of a text message during parsing/generating.\",\n+                                \"displayName\": \"Max Text Message Size\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"schema-branch\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"max-text-message-size\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"schema-cache\": {\n-                                \"description\": \"Specifies a Schema Cache to add the Record Schema to so that Record Readers can quickly lookup the schema.\",\n-                                \"displayName\": \"Schema Cache\",\n+                            \"proxy-host\": {\n+                                \"description\": \"The host name of the HTTP Proxy.\",\n+                                \"displayName\": \"HTTP Proxy Host\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"schema-cache\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"proxy-host\",\n                                 \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.serialization.RecordSchemaCacheService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n+                                \"sensitive\": false\n                             },\n-                            \"schema-name\": {\n-                                \"defaultValue\": \"${schema.name}\",\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"schema-name\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n-                                        \"propertyName\": \"schema-access-strategy\"\n-                                    }\n-                                ],\n-                                \"description\": \"Specifies the name of the schema to lookup in the Schema Registry property\",\n-                                \"displayName\": \"Schema Name\",\n+                            \"proxy-port\": {\n+                                \"description\": \"The port number of the HTTP Proxy.\",\n+                                \"displayName\": \"HTTP Proxy Port\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"schema-name\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"proxy-port\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"schema-protocol-version\": {\n-                                \"defaultValue\": \"1\",\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"hwx-schema-ref-attributes\",\n-                                            \"hwx-content-encoded-schema\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Schema Write Strategy\",\n-                                        \"propertyName\": \"Schema Write Strategy\"\n-                                    }\n-                                ],\n-                                \"description\": \"The protocol version to be used for Schema Write Strategies that require a protocol version, such as Hortonworks Schema Registry strategies. Valid protocol versions for Hortonworks Schema Registry are integer values 1, 2, or 3.\",\n-                                \"displayName\": \"Schema Protocol Version\",\n+                            \"session-maintenance-interval\": {\n+                                \"defaultValue\": \"10 sec\",\n+                                \"description\": \"The interval between session maintenance activities. A WebSocket session established with a WebSocket server can be terminated due to different reasons including restarting the WebSocket server or timing out inactive sessions. This session maintenance activity is periodically executed in order to reconnect those lost sessions, so that a WebSocket client can reuse the same session id transparently after it reconnects successfully.  The maintenance activity is executed until corresponding processors or this controller service is stopped.\",\n+                                \"displayName\": \"Session Maintenance Interval\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"schema-protocol-version\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"session-maintenance-interval\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"schema-registry\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"confluent-encoded\",\n-                                            \"schema-name\",\n-                                            \"hwx-schema-ref-attributes\",\n-                                            \"hwx-content-encoded-schema\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n-                                        \"propertyName\": \"schema-access-strategy\"\n-                                    }\n-                                ],\n-                                \"description\": \"Specifies the Controller Service to use for the Schema Registry\",\n-                                \"displayName\": \"Schema Registry\",\n+                            \"ssl-context-service\": {\n+                                \"description\": \"The SSL Context Service to use in order to secure the server. If specified, the server will accept only WSS requests; otherwise, the server will accept only WS requests\",\n+                                \"displayName\": \"SSL Context Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"schema-registry\",\n+                                \"name\": \"ssl-context-service\",\n                                 \"required\": false,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n                                     \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.schemaregistry.services.SchemaRegistry\",\n+                                    \"type\": \"org.apache.nifi.ssl.RestrictedSSLContextService\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             },\n-                            \"schema-text\": {\n-                                \"defaultValue\": \"${avro.schema}\",\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"schema-text-property\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n-                                        \"propertyName\": \"schema-access-strategy\"\n-                                    }\n-                                ],\n-                                \"description\": \"The text of an Avro-formatted Schema\",\n-                                \"displayName\": \"Schema Text\",\n+                            \"user-name\": {\n+                                \"description\": \"The user name for Basic Authentication.\",\n+                                \"displayName\": \"User Name\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"schema-text\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"user-name\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"schema-version\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"schema-name\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n-                                        \"propertyName\": \"schema-access-strategy\"\n-                                    }\n-                                ],\n-                                \"description\": \"Specifies the version of the schema to lookup in the Schema Registry. If not specified then the latest version of the schema will be retrieved.\",\n-                                \"displayName\": \"Schema Version\",\n+                            \"user-password\": {\n+                                \"description\": \"The user password for Basic Authentication.\",\n+                                \"displayName\": \"User Password\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"schema-version\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"user-password\",\n                                 \"required\": false,\n-                                \"sensitive\": false\n+                                \"sensitive\": true\n                             },\n-                            \"suppress_nulls\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"Fields that are missing (present in the schema but not in the record), or that have a value of null, will be written out as a null value\",\n-                                        \"displayName\": \"Never Suppress\",\n-                                        \"value\": \"never-suppress\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Fields that are missing (present in the schema but not in the record), or that have a value of null, will not be written out\",\n-                                        \"displayName\": \"Always Suppress\",\n-                                        \"value\": \"always-suppress\"\n-                                    },\n-                                    {\n-                                        \"description\": \"When a field has a value of null, it will be written out. However, if a field is defined in the schema and not present in the record, the field will not be written out.\",\n-                                        \"displayName\": \"Suppress Missing Values\",\n-                                        \"value\": \"suppress-missing\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"never-suppress\",\n-                                \"description\": \"Specifies how the writer should handle a null field\",\n-                                \"displayName\": \"Suppress Null Values\",\n+                            \"websocket-uri\": {\n+                                \"description\": \"The WebSocket URI this client connects to.\",\n+                                \"displayName\": \"WebSocket URI\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"suppress_nulls\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"websocket-uri\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             }\n                         },\n                         \"providedApiImplementations\": [\n                             {\n-                                \"artifact\": \"nifi-standard-services-api-nar\",\n+                                \"artifact\": \"nifi-websocket-services-api-nar\",\n                                 \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n+                                \"type\": \"org.apache.nifi.websocket.WebSocketClientService\",\n+                                \"version\": \"1.27.0\"\n+                            },\n+                            {\n+                                \"artifact\": \"nifi-websocket-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.websocket.WebSocketService\",\n                                 \"version\": \"1.27.0\"\n                             }\n                         ],\n                         \"supportsDynamicProperties\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"record\",\n-                            \"recordset\",\n-                            \"resultset\",\n-                            \"row\",\n-                            \"serialize\",\n-                            \"writer\",\n-                            \"xml\"\n+                            \"Jetty\",\n+                            \"WebSocket\",\n+                            \"client\"\n                         ],\n-                        \"type\": \"org.apache.nifi.xml.XMLRecordSetWriter\",\n-                        \"typeDescription\": \"Writes a RecordSet to XML. The records are wrapped by a root tag.\",\n+                        \"type\": \"org.apache.nifi.websocket.jetty.JettyWebSocketClient\",\n+                        \"typeDescription\": \"Implementation of WebSocketClientService. This service uses Jetty WebSocket client module to provide WebSocket session management throughout the application.\",\n                         \"version\": \"1.27.0\"\n                     },\n                     {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-record-serialization-services-nar\",\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-websocket-services-jetty-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"group\": \"org.apache.nifi\",\n                         \"propertyDescriptors\": {\n-                            \"Date Format\": {\n-                                \"description\": \"Specifies the format to use when reading/writing Date fields. If not specified, Date fields will be assumed to be number of milliseconds since epoch (Midnight, Jan 1, 1970 GMT). If specified, the value must match the Java Simple Date Format (for example, MM/dd/yyyy for a two-digit month, followed by a two-digit day, followed by a four-digit year, all separated by '/' characters, as in 01/01/2017).\",\n-                                \"displayName\": \"Date Format\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Date Format\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Time Format\": {\n-                                \"description\": \"Specifies the format to use when reading/writing Time fields. If not specified, Time fields will be assumed to be number of milliseconds since epoch (Midnight, Jan 1, 1970 GMT). If specified, the value must match the Java Simple Date Format (for example, HH:mm:ss for a two-digit hour in 24-hour format, followed by a two-digit minute, followed by a two-digit second, all separated by ':' characters, as in 18:04:15).\",\n-                                \"displayName\": \"Time Format\",\n+                            \"auth-path-spec\": {\n+                                \"defaultValue\": \"/*\",\n+                                \"description\": \"Specify a Path Spec to apply Basic Authentication.\",\n+                                \"displayName\": \"Basic Authentication Path Spec\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Time Format\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"auth-path-spec\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Timestamp Format\": {\n-                                \"description\": \"Specifies the format to use when reading/writing Timestamp fields. If not specified, Timestamp fields will be assumed to be number of milliseconds since epoch (Midnight, Jan 1, 1970 GMT). If specified, the value must match the Java Simple Date Format (for example, MM/dd/yyyy HH:mm:ss for a two-digit month, followed by a two-digit day, followed by a four-digit year, all separated by '/' characters; and then followed by a two-digit hour in 24-hour format, followed by a two-digit minute, followed by a two-digit second, all separated by ':' characters, as in 01/01/2017 18:04:15).\",\n-                                \"displayName\": \"Timestamp Format\",\n+                            \"auth-roles\": {\n+                                \"defaultValue\": \"**\",\n+                                \"description\": \"The authenticated user must have one of specified role. Multiple roles can be set as comma separated string. '*' represents any role and so does '**' any role including no role.\",\n+                                \"displayName\": \"Basic Authentication Roles\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Timestamp Format\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"auth-roles\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"schema-access-strategy\": {\n+                            \"basic-auth\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"The Schema of the data will be inferred automatically when the data is read. See component Usage and Additional Details for information about how the schema is inferred.\",\n-                                        \"displayName\": \"Infer Schema\",\n-                                        \"value\": \"infer-schema\"\n-                                    },\n-                                    {\n-                                        \"description\": \"The name of the Schema to use is specified by the 'Schema Name' Property. The value of this property is used to lookup the Schema in the configured Schema Registry service.\",\n-                                        \"displayName\": \"Use 'Schema Name' Property\",\n-                                        \"value\": \"schema-name\"\n-                                    },\n-                                    {\n-                                        \"description\": \"The text of the Schema itself is specified by the 'Schema Text' Property. The value of this property must be a valid Avro Schema. If Expression Language is used, the value of the 'Schema Text' property must be valid after substituting the expressions.\",\n-                                        \"displayName\": \"Use 'Schema Text' Property\",\n-                                        \"value\": \"schema-text-property\"\n-                                    },\n-                                    {\n-                                        \"description\": \"The FlowFile contains 3 Attributes that will be used to lookup a Schema from the configured Schema Registry: 'schema.identifier', 'schema.version', and 'schema.protocol.version'\",\n-                                        \"displayName\": \"HWX Schema Reference Attributes\",\n-                                        \"value\": \"hwx-schema-ref-attributes\"\n-                                    },\n-                                    {\n-                                        \"description\": \"The content of the FlowFile contains a reference to a schema in the Schema Registry service. The reference is encoded as a single byte indicating the 'protocol version', followed by 8 bytes indicating the schema identifier, and finally 4 bytes indicating the schema version, as per the Hortonworks Schema Registry serializers and deserializers, found at https://github.com/hortonworks/registry\",\n-                                        \"displayName\": \"HWX Content-Encoded Schema Reference\",\n-                                        \"value\": \"hwx-content-encoded-schema\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n-                                        \"description\": \"The content of the FlowFile contains a reference to a schema in the Schema Registry service. The reference is encoded as a single 'Magic Byte' followed by 4 bytes representing the identifier of the schema, as outlined at http://docs.confluent.io/current/schema-registry/docs/serializer-formatter.html. This is based on version 3.2.x of the Confluent Schema Registry.\",\n-                                        \"displayName\": \"Confluent Content-Encoded Schema Reference\",\n-                                        \"value\": \"confluent-encoded\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"infer-schema\",\n-                                \"description\": \"Specifies how to obtain the schema that is to be used for interpreting the data.\",\n-                                \"displayName\": \"Schema Access Strategy\",\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"If enabled, client connection requests are authenticated with Basic authentication using the specified Login Provider.\",\n+                                \"displayName\": \"Enable Basic Authentication\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"schema-access-strategy\",\n+                                \"name\": \"basic-auth\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"schema-application-strategy\": {\n+                            \"client-authentication\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Applies the schema for the whole JSON.\",\n-                                        \"displayName\": \"Whole JSON\",\n-                                        \"value\": \"WHOLE_JSON\"\n+                                        \"description\": \"Processor will not authenticate clients. Anyone can communicate with this Processor anonymously\",\n+                                        \"displayName\": \"No Authentication\",\n+                                        \"value\": \"no\"\n                                     },\n                                     {\n-                                        \"description\": \"Applies the schema for the selected part starting from the \\\"Starting Field Name\\\".\",\n-                                        \"displayName\": \"Selected Part\",\n-                                        \"value\": \"SELECTED_PART\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"SELECTED_PART\",\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"confluent-encoded\",\n-                                            \"schema-name\",\n-                                            \"schema-text-property\",\n-                                            \"hwx-schema-ref-attributes\",\n-                                            \"hwx-content-encoded-schema\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n-                                        \"propertyName\": \"schema-access-strategy\"\n+                                        \"description\": \"Processor will try to verify the client but if unable to verify will allow the client to communicate anonymously\",\n+                                        \"displayName\": \"Want Authentication\",\n+                                        \"value\": \"want\"\n                                     },\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"NESTED_FIELD\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Starting Field Strategy\",\n-                                        \"propertyName\": \"starting-field-strategy\"\n+                                        \"description\": \"Processor will reject communications from any client unless the client provides a certificate that is trusted by the TrustStore specified in the SSL Context Service\",\n+                                        \"displayName\": \"Need Authentication\",\n+                                        \"value\": \"need\"\n                                     }\n                                 ],\n-                                \"description\": \"Specifies whether the schema is defined for the whole JSON or for the selected part starting from \\\"Starting Field Name\\\".\",\n-                                \"displayName\": \"Schema Application Strategy\",\n+                                \"defaultValue\": \"no\",\n+                                \"description\": \"Specifies whether or not the Processor should authenticate client by its certificate. This value is ignored if the <SSL Context Service> Property is not specified or the SSL Context provided uses only a KeyStore and not a TrustStore.\",\n+                                \"displayName\": \"SSL Client Authentication\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"schema-application-strategy\",\n+                                \"name\": \"client-authentication\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"schema-branch\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"schema-name\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n-                                        \"propertyName\": \"schema-access-strategy\"\n-                                    }\n-                                ],\n-                                \"description\": \"Specifies the name of the branch to use when looking up the schema in the Schema Registry property. If the chosen Schema Registry does not support branching, this value will be ignored.\",\n-                                \"displayName\": \"Schema Branch\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"schema-branch\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"schema-inference-cache\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"infer-schema\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n-                                        \"propertyName\": \"schema-access-strategy\"\n-                                    }\n-                                ],\n-                                \"description\": \"Specifies a Schema Cache to use when inferring the schema. If not populated, the schema will be inferred each time. However, if a cache is specified, the cache will first be consulted and if the applicable schema can be found, it will be used instead of inferring the schema.\",\n-                                \"displayName\": \"Schema Inference Cache\",\n+                            \"input-buffer-size\": {\n+                                \"defaultValue\": \"4 kb\",\n+                                \"description\": \"The size of the input (read from network layer) buffer size.\",\n+                                \"displayName\": \"Input Buffer Size\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"schema-inference-cache\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.serialization.RecordSchemaCacheService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n+                                \"name\": \"input-buffer-size\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n                             },\n-                            \"schema-name\": {\n-                                \"defaultValue\": \"${schema.name}\",\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"schema-name\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n-                                        \"propertyName\": \"schema-access-strategy\"\n-                                    }\n-                                ],\n-                                \"description\": \"Specifies the name of the schema to lookup in the Schema Registry property\",\n-                                \"displayName\": \"Schema Name\",\n+                            \"listen-port\": {\n+                                \"description\": \"The port number on which this WebSocketServer listens to.\",\n+                                \"displayName\": \"Listen Port\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"schema-name\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"listen-port\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"schema-registry\": {\n-                                \"dependencies\": [\n+                            \"login-service\": {\n+                                \"allowableValues\": [\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"confluent-encoded\",\n-                                            \"schema-name\",\n-                                            \"hwx-schema-ref-attributes\",\n-                                            \"hwx-content-encoded-schema\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n-                                        \"propertyName\": \"schema-access-strategy\"\n+                                        \"description\": \"See http://www.eclipse.org/jetty/javadoc/current/org/eclipse/jetty/security/HashLoginService.html for detail.\",\n+                                        \"displayName\": \"HashLoginService\",\n+                                        \"value\": \"hash\"\n                                     }\n                                 ],\n-                                \"description\": \"Specifies the Controller Service to use for the Schema Registry\",\n-                                \"displayName\": \"Schema Registry\",\n+                                \"defaultValue\": \"hash\",\n+                                \"description\": \"Specify which Login Service to use for Basic Authentication.\",\n+                                \"displayName\": \"Login Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"schema-registry\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.schemaregistry.services.SchemaRegistry\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            },\n-                            \"schema-text\": {\n-                                \"defaultValue\": \"${avro.schema}\",\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"schema-text-property\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n-                                        \"propertyName\": \"schema-access-strategy\"\n-                                    }\n-                                ],\n-                                \"description\": \"The text of an Avro-formatted Schema\",\n-                                \"displayName\": \"Schema Text\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"schema-text\",\n+                                \"name\": \"login-service\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"schema-version\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"schema-name\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n-                                        \"propertyName\": \"schema-access-strategy\"\n-                                    }\n-                                ],\n-                                \"description\": \"Specifies the version of the schema to lookup in the Schema Registry. If not specified then the latest version of the schema will be retrieved.\",\n-                                \"displayName\": \"Schema Version\",\n+                            \"max-binary-message-size\": {\n+                                \"defaultValue\": \"64 kb\",\n+                                \"description\": \"The maximum size of a binary message during parsing/generating.\",\n+                                \"displayName\": \"Max Binary Message Size\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"schema-version\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"max-binary-message-size\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"starting-field-name\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"NESTED_FIELD\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Starting Field Strategy\",\n-                                        \"propertyName\": \"starting-field-strategy\"\n-                                    }\n-                                ],\n-                                \"description\": \"Skips forward to the given nested JSON field (array or object) to begin processing.\",\n-                                \"displayName\": \"Starting Field Name\",\n+                            \"max-text-message-size\": {\n+                                \"defaultValue\": \"64 kb\",\n+                                \"description\": \"The maximum size of a text message during parsing/generating.\",\n+                                \"displayName\": \"Max Text Message Size\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"starting-field-name\",\n-                                \"required\": false,\n+                                \"name\": \"max-text-message-size\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"starting-field-strategy\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"Begins processing from the root node.\",\n-                                        \"displayName\": \"Root Node\",\n-                                        \"value\": \"ROOT_NODE\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Skips forward to the given nested JSON field (array or object) to begin processing.\",\n-                                        \"displayName\": \"Nested Field\",\n-                                        \"value\": \"NESTED_FIELD\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"ROOT_NODE\",\n-                                \"description\": \"Start processing from the root node or from a specified nested node.\",\n-                                \"displayName\": \"Starting Field Strategy\",\n+                            \"ssl-context-service\": {\n+                                \"description\": \"The SSL Context Service to use in order to secure the server. If specified, the server will accept only WSS requests; otherwise, the server will accept only WS requests\",\n+                                \"displayName\": \"SSL Context Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"starting-field-strategy\",\n-                                \"required\": true,\n+                                \"name\": \"ssl-context-service\",\n+                                \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.ssl.RestrictedSSLContextService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"users-properties-file\": {\n+                                \"description\": \"Specify a property file containing users for Basic Authentication using HashLoginService. See http://www.eclipse.org/jetty/documentation/current/configuring-security.html for detail.\",\n+                                \"displayName\": \"Users Properties File\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"users-properties-file\",\n+                                \"required\": false,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"SINGLE\",\n+                                    \"resourceTypes\": [\n+                                        \"FILE\"\n+                                    ]\n+                                },\n                                 \"sensitive\": false\n                             }\n                         },\n                         \"providedApiImplementations\": [\n                             {\n-                                \"artifact\": \"nifi-standard-services-api-nar\",\n+                                \"artifact\": \"nifi-websocket-services-api-nar\",\n                                 \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n+                                \"type\": \"org.apache.nifi.websocket.WebSocketServerService\",\n+                                \"version\": \"1.27.0\"\n+                            },\n+                            {\n+                                \"artifact\": \"nifi-websocket-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.websocket.WebSocketService\",\n                                 \"version\": \"1.27.0\"\n                             }\n                         ],\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.json.JsonPathReader\"\n-                        ],\n                         \"supportsDynamicProperties\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"parser\",\n-                            \"reader\",\n-                            \"record\",\n-                            \"tree\",\n-                            \"yaml\"\n+                            \"Jetty\",\n+                            \"WebSocket\",\n+                            \"server\"\n                         ],\n-                        \"type\": \"org.apache.nifi.yaml.YamlTreeReader\",\n-                        \"typeDescription\": \"Parses YAML into individual Record objects. While the reader expects each record to be well-formed YAML, the content of a FlowFile may consist of many records, each as a well-formed YAML array or YAML object. If an array is encountered, each element in that array will be treated as a separate record. If the schema that is configured contains a field that is not present in the YAML, a null value will be used. If the YAML contains a field that is not present in the schema, that field will be skipped. Please note this controller service does not support resolving the use of YAML aliases. Any alias present will be treated as a string. See the Usage of the Controller Service for more information and examples.\",\n+                        \"type\": \"org.apache.nifi.websocket.jetty.JettyWebSocketServer\",\n+                        \"typeDescription\": \"Implementation of WebSocketServerService. This service uses Jetty WebSocket server module to provide WebSocket session management throughout the application.\",\n                         \"version\": \"1.27.0\"\n                     }\n                 ],\n                 \"processors\": [],\n                 \"reportingTasks\": []\n             },\n             \"group\": \"org.apache.nifi\",\n             \"version\": \"1.27.0\"\n         },\n         {\n-            \"artifact\": \"nifi-box-services-nar\",\n+            \"artifact\": \"nifi-kerberos-user-service-nar\",\n             \"componentManifest\": {\n                 \"controllerServices\": [\n                     {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-box-services-nar\",\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-kerberos-user-service-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n+                        \"explicitRestrictions\": [\n+                            {\n+                                \"explanation\": \"Allows user to define a Keytab and principal that can then be used by other components.\",\n+                                \"requiredPermission\": \"access keytab\"\n+                            }\n+                        ],\n                         \"group\": \"org.apache.nifi\",\n                         \"propertyDescriptors\": {\n-                            \"app-config-file\": {\n-                                \"description\": \"Full path of an App config JSON file. See Additional Details for more information.\",\n-                                \"displayName\": \"App Config File\",\n+                            \"Kerberos Keytab\": {\n+                                \"description\": \"Kerberos keytab associated with the principal.\",\n+                                \"displayName\": \"Kerberos Keytab\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"app-config-file\",\n-                                \"required\": false,\n+                                \"name\": \"Kerberos Keytab\",\n+                                \"required\": true,\n                                 \"resourceDefinition\": {\n                                     \"cardinality\": \"SINGLE\",\n                                     \"resourceTypes\": [\n                                         \"FILE\"\n                                     ]\n                                 },\n                                 \"sensitive\": false\n                             },\n-                            \"app-config-json\": {\n-                                \"description\": \"The raw JSON containing an App config. See Additional Details for more information.\",\n-                                \"displayName\": \"App Config JSON\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"app-config-json\",\n-                                \"required\": false,\n-                                \"sensitive\": true\n-                            },\n-                            \"box-account-id\": {\n-                                \"description\": \"The ID of the Box account who owns the accessed resource. Same as 'User Id' under 'App Info' in the App 'General Settings'.\",\n-                                \"displayName\": \"Account ID\",\n+                            \"Kerberos Principal\": {\n+                                \"description\": \"Kerberos principal to authenticate as. Requires nifi.kerberos.krb5.file to be set in your nifi.properties\",\n+                                \"displayName\": \"Kerberos Principal\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"box-account-id\",\n+                                \"name\": \"Kerberos Principal\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n-                            },\n-                            \"proxy-configuration-service\": {\n-                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests. Supported proxies: HTTP + AuthN\",\n-                                \"displayName\": \"Proxy Configuration Service\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"proxy-configuration-service\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.proxy.ProxyConfigurationService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n                             }\n                         },\n                         \"providedApiImplementations\": [\n                             {\n-                                \"artifact\": \"nifi-box-services-api-nar\",\n+                                \"artifact\": \"nifi-standard-services-api-nar\",\n                                 \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.box.controllerservices.BoxClientService\",\n+                                \"type\": \"org.apache.nifi.kerberos.KerberosUserService\",\n+                                \"version\": \"1.27.0\"\n+                            },\n+                            {\n+                                \"artifact\": \"nifi-standard-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.kerberos.SelfContainedKerberosUserService\",\n                                 \"version\": \"1.27.0\"\n                             }\n                         ],\n+                        \"restricted\": true,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"box\",\n-                            \"client\",\n-                            \"provider\"\n+                            \"Authentication\",\n+                            \"Credentials\",\n+                            \"Kerberos\",\n+                            \"Keytab\",\n+                            \"Principal\",\n+                            \"Security\"\n                         ],\n-                        \"type\": \"org.apache.nifi.box.controllerservices.JsonConfigBasedBoxClientService\",\n-                        \"typeDescription\": \"Provides Box client objects through which Box API calls can be used.\",\n+                        \"type\": \"org.apache.nifi.kerberos.KerberosKeytabUserService\",\n+                        \"typeDescription\": \"Provides a mechanism for creating a KerberosUser from a principal and keytab that other components are able to use in order to perform authentication using Kerberos. By encapsulating this information into a Controller Service and allowing other components to make use of it (as opposed to specifying the principal and keytab directly in the processor) an administrator is able to choose which users are allowed to use which keytabs and principals. This provides a more robust security model for multi-tenant use cases.\",\n                         \"version\": \"1.27.0\"\n-                    }\n-                ],\n-                \"processors\": [],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"1.27.0\"\n-        },\n-        {\n-            \"artifact\": \"nifi-ambari-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [],\n-                \"processors\": [],\n-                \"reportingTasks\": [\n+                    },\n                     {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-ambari-nar\",\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-kerberos-user-service-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n-                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"1 min\"\n-                        },\n-                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n-                        \"deprecated\": true,\n-                        \"deprecationReason\": \"This reporting task is deprecated and will be removed in NiFi 2.x.\",\n                         \"group\": \"org.apache.nifi\",\n                         \"propertyDescriptors\": {\n-                            \"Application ID\": {\n-                                \"defaultValue\": \"nifi\",\n-                                \"description\": \"The Application ID to be included in the metrics sent to Ambari\",\n-                                \"displayName\": \"Application ID\",\n+                            \"Kerberos Password\": {\n+                                \"description\": \"Kerberos password associated with the principal.\",\n+                                \"displayName\": \"Kerberos Password\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Application ID\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Kerberos Password\",\n                                 \"required\": true,\n-                                \"sensitive\": false\n+                                \"sensitive\": true\n                             },\n-                            \"Hostname\": {\n-                                \"defaultValue\": \"${hostname(true)}\",\n-                                \"description\": \"The Hostname of this NiFi instance to be included in the metrics sent to Ambari\",\n-                                \"displayName\": \"Hostname\",\n+                            \"Kerberos Principal\": {\n+                                \"description\": \"Kerberos principal to authenticate as. Requires nifi.kerberos.krb5.file to be set in your nifi.properties\",\n+                                \"displayName\": \"Kerberos Principal\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Hostname\",\n+                                \"name\": \"Kerberos Principal\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n-                            },\n-                            \"Metrics Collector URL\": {\n-                                \"defaultValue\": \"http://localhost:6188/ws/v1/timeline/metrics\",\n-                                \"description\": \"The URL of the Ambari Metrics Collector Service\",\n-                                \"displayName\": \"Metrics Collector URL\",\n+                            }\n+                        },\n+                        \"providedApiImplementations\": [\n+                            {\n+                                \"artifact\": \"nifi-standard-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.kerberos.KerberosUserService\",\n+                                \"version\": \"1.27.0\"\n+                            }\n+                        ],\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"Authentication\",\n+                            \"Credentials\",\n+                            \"Kerberos\",\n+                            \"Password\",\n+                            \"Principal\",\n+                            \"Security\"\n+                        ],\n+                        \"type\": \"org.apache.nifi.kerberos.KerberosPasswordUserService\",\n+                        \"typeDescription\": \"Provides a mechanism for creating a KerberosUser from a principal and password that other components are able to use in order to perform authentication using Kerberos.\",\n+                        \"version\": \"1.27.0\"\n+                    },\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-kerberos-user-service-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"e0c4461\"\n+                        },\n+                        \"explicitRestrictions\": [\n+                            {\n+                                \"explanation\": \"Allows user to define a ticket cache and principal that can then be used by other components.\",\n+                                \"requiredPermission\": \"access ticket cache\"\n+                            }\n+                        ],\n+                        \"group\": \"org.apache.nifi\",\n+                        \"propertyDescriptors\": {\n+                            \"Kerberos Principal\": {\n+                                \"description\": \"Kerberos principal to authenticate as. Requires nifi.kerberos.krb5.file to be set in your nifi.properties\",\n+                                \"displayName\": \"Kerberos Principal\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Metrics Collector URL\",\n+                                \"name\": \"Kerberos Principal\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Process Group ID\": {\n-                                \"description\": \"If specified, the reporting task will send metrics about this process group only. If not, the root process group is used and global metrics are sent.\",\n-                                \"displayName\": \"Process Group ID\",\n+                            \"Kerberos Ticket Cache File\": {\n+                                \"description\": \"Kerberos ticket cache associated with the principal.\",\n+                                \"displayName\": \"Kerberos Ticket Cache File\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Process Group ID\",\n-                                \"required\": false,\n+                                \"name\": \"Kerberos Ticket Cache File\",\n+                                \"required\": true,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"SINGLE\",\n+                                    \"resourceTypes\": [\n+                                        \"FILE\"\n+                                    ]\n+                                },\n                                 \"sensitive\": false\n                             }\n                         },\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n+                        \"providedApiImplementations\": [\n+                            {\n+                                \"artifact\": \"nifi-standard-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.kerberos.KerberosUserService\",\n+                                \"version\": \"1.27.0\"\n+                            },\n+                            {\n+                                \"artifact\": \"nifi-standard-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.kerberos.SelfContainedKerberosUserService\",\n+                                \"version\": \"1.27.0\"\n+                            }\n                         ],\n+                        \"restricted\": true,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"ambari\",\n-                            \"metrics\",\n-                            \"reporting\"\n+                            \"Authentication\",\n+                            \"Cache\",\n+                            \"Credentials\",\n+                            \"Kerberos\",\n+                            \"Principal\",\n+                            \"Security\",\n+                            \"Ticket\"\n                         ],\n-                        \"type\": \"org.apache.nifi.reporting.ambari.AmbariReportingTask\",\n-                        \"typeDescription\": \"Publishes metrics from NiFi to Ambari Metrics Service (AMS). Due to how the Ambari Metrics Service works, this reporting task should be scheduled to run every 60 seconds. Each iteration it will send the metrics from the previous iteration, and calculate the current metrics to be sent on next iteration. Scheduling this reporting task at a frequency other than 60 seconds may produce unexpected results.\",\n+                        \"type\": \"org.apache.nifi.kerberos.KerberosTicketCacheUserService\",\n+                        \"typeDescription\": \"Provides a mechanism for creating a KerberosUser from a principal and ticket cache that other components are able to use in order to perform authentication using Kerberos. By encapsulating this information into a Controller Service and allowing other components to make use of it an administrator is able to choose which users are allowed to use which ticket caches and principals. This provides a more robust security model for multi-tenant use cases.\",\n                         \"version\": \"1.27.0\"\n                     }\n-                ]\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"1.27.0\"\n-        },\n-        {\n-            \"artifact\": \"nifi-hashicorp-vault-client-service-api-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [],\n+                ],\n                 \"processors\": [],\n                 \"reportingTasks\": []\n             },\n             \"group\": \"org.apache.nifi\",\n             \"version\": \"1.27.0\"\n         },\n         {\n-            \"artifact\": \"nifi-websocket-processors-nar\",\n+            \"artifact\": \"nifi-tcp-nar\",\n             \"componentManifest\": {\n                 \"controllerServices\": [],\n                 \"processors\": [\n                     {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-websocket-processors-nar\",\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-tcp-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -32944,1516 +29218,1978 @@\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n+                        \"deprecated\": true,\n+                        \"deprecationReason\": \"Unmaintained and planned for removal in version 2.0\",\n+                        \"dynamicProperties\": [\n+                            {\n+                                \"description\": \"Sets a FlowFile attribute specified by the Dynamic Property's key with the value specified by the Dynamic Property's value\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"name\": \"A FlowFile attribute to set\",\n+                                \"value\": \"The value to set it to\"\n+                            }\n+                        ],\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_ALLOWED\",\n+                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"websocket-client-controller-service\": {\n-                                \"description\": \"A WebSocket CLIENT Controller Service which can connect to a WebSocket server.\",\n-                                \"displayName\": \"WebSocket Client ControllerService\",\n+                            \"connection-attempt-timeout\": {\n+                                \"defaultValue\": \"3\",\n+                                \"description\": \"The number of times to try and establish a connection, before using a backup host if available. This same attempt count would be used for a backup host as well.\",\n+                                \"displayName\": \"Connection Attempt Count\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"websocket-client-controller-service\",\n+                                \"name\": \"connection-attempt-timeout\",\n                                 \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-websocket-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.websocket.WebSocketClientService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n+                                \"sensitive\": false\n                             },\n-                            \"websocket-client-id\": {\n-                                \"description\": \"The client ID to identify WebSocket session. It should be unique within the WebSocket Client Controller Service. Otherwise, it throws WebSocketConfigurationException when it gets started.\",\n-                                \"displayName\": \"WebSocket Client Id\",\n+                            \"end-of-message-byte\": {\n+                                \"defaultValue\": \"13\",\n+                                \"description\": \"Byte value which denotes end of message. Must be specified as integer within the valid byte range (-128 thru 127). For example, '13' = Carriage return and '10' = New line. Default '13'.\",\n+                                \"displayName\": \"End of message delimiter byte\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"websocket-client-id\",\n+                                \"name\": \"end-of-message-byte\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n-                            }\n-                        },\n-                        \"sideEffectFree\": false,\n-                        \"supportedRelationships\": [\n-                            {\n-                                \"description\": \"FlowFile holding connection configuration attributes (like URL or HTTP headers) in case of successful connection\",\n-                                \"name\": \"success\"\n                             },\n-                            {\n-                                \"description\": \"The WebSocket text message output\",\n-                                \"name\": \"text message\"\n+                            \"endpoint-list\": {\n+                                \"description\": \"A comma delimited list of the endpoints to connect to. The format should be <server_address>:<port>. Only one server will be connected to at a time, the others will be used as fail overs.\",\n+                                \"displayName\": \"Endpoint List\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"endpoint-list\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n                             },\n-                            {\n-                                \"description\": \"The WebSocket binary message output\",\n-                                \"name\": \"binary message\"\n+                            \"receive-buffer-size\": {\n+                                \"defaultValue\": \"16MB\",\n+                                \"description\": \"The size of the buffer to receive data in. Default 16384 (16MB).\",\n+                                \"displayName\": \"Receive Buffer Size\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"receive-buffer-size\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n                             },\n+                            \"reconnect-interval\": {\n+                                \"defaultValue\": \"5 sec\",\n+                                \"description\": \"The number of seconds to wait before attempting to reconnect to the endpoint.\",\n+                                \"displayName\": \"Reconnect interval\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"reconnect-interval\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            }\n+                        },\n+                        \"sideEffectFree\": true,\n+                        \"supportedRelationships\": [\n                             {\n-                                \"description\": \"FlowFile holding connection configuration attributes (like URL or HTTP headers) in case of connection failure\",\n-                                \"name\": \"failure\"\n+                                \"description\": \"The relationship that all incomplete messages from the endpoint will be sent to. Incomplete message is the message that doesn't end with 'End of message delimiter byte'. This can happen when 'Receive Buffer Size' is smaller then the incoming message. If that happens that the subsequent message that completes the previous incomplete message will also end up in this relationship, after which subsequent 'complete' messages will go to 'success'.\",\n+                                \"name\": \"Partial\"\n                             },\n                             {\n-                                \"description\": \"The WebSocket session is established\",\n-                                \"name\": \"connected\"\n+                                \"description\": \"The relationship that all sucessful messages from the endpoint will be sent to.\",\n+                                \"name\": \"Success\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n                         \"supportsBatching\": false,\n-                        \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicProperties\": true,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"WebSocket\",\n-                            \"consume\",\n-                            \"listen\",\n-                            \"subscribe\"\n+                            \"fetch\",\n+                            \"get\",\n+                            \"ingest\",\n+                            \"input\",\n+                            \"poll\",\n+                            \"source\",\n+                            \"tcp\"\n                         ],\n                         \"triggerSerially\": true,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.websocket.ConnectWebSocket\",\n-                        \"typeDescription\": \"Acts as a WebSocket client endpoint to interact with a remote WebSocket server. FlowFiles are transferred to downstream relationships according to received message types as WebSocket client configured with this processor receives messages from remote WebSocket server. If a new flowfile is passed to the processor, the previous sessions will be closed and any data being sent will be aborted.\",\n+                        \"type\": \"org.apache.nifi.processors.gettcp.GetTCP\",\n+                        \"typeDescription\": \"Connects over TCP to the provided endpoint(s). Received data will be written as content to the FlowFile\",\n                         \"version\": \"1.27.0\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"WebSocket Controller Service id.\",\n-                                \"name\": \"websocket.controller.service.id\"\n-                            },\n-                            {\n-                                \"description\": \"Established WebSocket session id.\",\n-                                \"name\": \"websocket.session.id\"\n-                            },\n-                            {\n-                                \"description\": \"WebSocket endpoint id.\",\n-                                \"name\": \"websocket.endpoint.id\"\n-                            },\n-                            {\n-                                \"description\": \"WebSocket client address.\",\n-                                \"name\": \"websocket.local.address\"\n-                            },\n-                            {\n-                                \"description\": \"WebSocket server address.\",\n-                                \"name\": \"websocket.remote.address\"\n-                            },\n-                            {\n-                                \"description\": \"TEXT or BINARY.\",\n-                                \"name\": \"websocket.message.type\"\n+                                \"description\": \"The address of the source endpoint the message came from\",\n+                                \"name\": \"source.endpoint\"\n                             }\n                         ]\n-                    },\n+                    }\n+                ],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"1.27.0\"\n+        },\n+        {\n+            \"artifact\": \"nifi-hubspot-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [],\n+                \"processors\": [\n                     {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-websocket-processors-nar\",\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-hubspot-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n                         },\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"0 sec\"\n+                            \"TIMER_DRIVEN\": \"1 min\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n-                        \"defaultYieldDuration\": \"1 sec\",\n+                        \"defaultYieldDuration\": \"10 sec\",\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_FORBIDDEN\",\n-                        \"primaryNodeOnly\": false,\n+                        \"primaryNodeOnly\": true,\n                         \"propertyDescriptors\": {\n-                            \"server-url-path\": {\n-                                \"description\": \"The WetSocket URL Path on which this processor listens to. Must starts with '/', e.g. '/example'.\",\n-                                \"displayName\": \"Server URL Path\",\n+                            \"access-token\": {\n+                                \"description\": \"Access Token to authenticate requests\",\n+                                \"displayName\": \"Access Token\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"server-url-path\",\n+                                \"name\": \"access-token\",\n+                                \"required\": true,\n+                                \"sensitive\": true\n+                            },\n+                            \"incremental-delay\": {\n+                                \"defaultValue\": \"30 sec\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"true\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Incremental Loading\",\n+                                        \"propertyName\": \"is-incremental\"\n+                                    }\n+                                ],\n+                                \"description\": \"The ending timestamp of the time window will be adjusted earlier by the amount configured in this property. For example, with a property value of 10 seconds, an ending timestamp of 12:30:45 would be changed to 12:30:35. Set this property to avoid missing objects when the clock of your local machines and HubSpot servers' clock are not in sync and to protect against HubSpot's mechanism that changes last updated timestamps after object creation.\",\n+                                \"displayName\": \"Incremental Delay\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"incremental-delay\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"websocket-server-controller-service\": {\n-                                \"description\": \"A WebSocket SERVER Controller Service which can accept WebSocket requests.\",\n-                                \"displayName\": \"WebSocket Server ControllerService\",\n+                            \"incremental-initial-start-time\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"true\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Incremental Loading\",\n+                                        \"propertyName\": \"is-incremental\"\n+                                    }\n+                                ],\n+                                \"description\": \"This property specifies the start time that the processor applies when running the first request. The expected format is a UTC date-time such as '2011-12-03T10:15:30Z'\",\n+                                \"displayName\": \"Incremental Initial Start Time\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"incremental-initial-start-time\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"is-incremental\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"true\",\n+                                \"description\": \"The processor can incrementally load the queried objects so that each object is queried exactly once. For each query, the processor queries objects within a time window where the objects were modified between the previous run time and the current time (optionally adjusted by the Incremental Delay property).\",\n+                                \"displayName\": \"Incremental Loading\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"websocket-server-controller-service\",\n+                                \"name\": \"is-incremental\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"object-type\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"In HubSpot, the companies object is a standard CRM object. Individual company records can be used to store information about businesses and organizations within company properties.\",\n+                                        \"displayName\": \"Companies\",\n+                                        \"value\": \"/crm/v3/objects/companies\"\n+                                    },\n+                                    {\n+                                        \"description\": \"In HubSpot, contacts store information about individuals. From marketing automation to smart content, the lead-specific data found in contact records helps users leverage much of HubSpot's functionality.\",\n+                                        \"displayName\": \"Contacts\",\n+                                        \"value\": \"/crm/v3/objects/contacts\"\n+                                    },\n+                                    {\n+                                        \"description\": \"In HubSpot, a deal represents an ongoing transaction that a sales team is pursuing with a contact or company. It\\u2019s tracked through pipeline stages until won or lost.\",\n+                                        \"displayName\": \"Deals\",\n+                                        \"value\": \"/crm/v3/objects/deals\"\n+                                    },\n+                                    {\n+                                        \"description\": \"In HubSpot, line items can be thought of as a subset of products. When a product is attached to a deal, it becomes a line item. Line items can be created that are unique to an individual quote, but they will not be added to the product library.\",\n+                                        \"displayName\": \"Line Items\",\n+                                        \"value\": \"/crm/v3/objects/line_items\"\n+                                    },\n+                                    {\n+                                        \"description\": \"In HubSpot, products represent the goods or services to be sold. Building a product library allows the user to quickly add products to deals, generate quotes, and report on product performance.\",\n+                                        \"displayName\": \"Products\",\n+                                        \"value\": \"/crm/v3/objects/products\"\n+                                    },\n+                                    {\n+                                        \"description\": \"In HubSpot, a ticket represents a customer request for help or support.\",\n+                                        \"displayName\": \"Tickets\",\n+                                        \"value\": \"/crm/v3/objects/tickets\"\n+                                    },\n+                                    {\n+                                        \"description\": \"In HubSpot, quotes are used to share pricing information with potential buyers.\",\n+                                        \"displayName\": \"Quotes\",\n+                                        \"value\": \"/crm/v3/objects/quotes\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Get calls on CRM records and on the calls index page.\",\n+                                        \"displayName\": \"Calls\",\n+                                        \"value\": \"/crm/v3/objects/calls\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Get emails on CRM records.\",\n+                                        \"displayName\": \"Emails\",\n+                                        \"value\": \"/crm/v3/objects/emails\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Get meetings on CRM records.\",\n+                                        \"displayName\": \"Meetings\",\n+                                        \"value\": \"/crm/v3/objects/meetings\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Get notes on CRM records.\",\n+                                        \"displayName\": \"Notes\",\n+                                        \"value\": \"/crm/v3/objects/notes\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Get tasks on CRM records.\",\n+                                        \"displayName\": \"Tasks\",\n+                                        \"value\": \"/crm/v3/objects/tasks\"\n+                                    }\n+                                ],\n+                                \"description\": \"The HubSpot Object Type requested\",\n+                                \"displayName\": \"Object Type\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"object-type\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"result-limit\": {\n+                                \"description\": \"The maximum number of results to request for each invocation of the Processor\",\n+                                \"displayName\": \"Result Limit\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"result-limit\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"web-client-service-provider\": {\n+                                \"description\": \"Controller service for HTTP client operations\",\n+                                \"displayName\": \"Web Client Service Provider\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"web-client-service-provider\",\n                                 \"required\": true,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-websocket-services-api-nar\",\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.websocket.WebSocketServerService\",\n+                                    \"type\": \"org.apache.nifi.web.client.provider.api.WebClientServiceProvider\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             }\n                         },\n                         \"sideEffectFree\": false,\n+                        \"stateful\": {\n+                            \"description\": \"In case of incremental loading, the start and end timestamps of the last query time window are stored in the state. When the 'Result Limit' property is set, the paging cursor is saved after executing a request. Only the objects after the paging cursor will be retrieved. The maximum number of retrieved objects can be set in the 'Result Limit' property.\",\n+                            \"scopes\": [\n+                                \"CLUSTER\"\n+                            ]\n+                        },\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"The WebSocket text message output\",\n-                                \"name\": \"text message\"\n-                            },\n-                            {\n-                                \"description\": \"The WebSocket binary message output\",\n-                                \"name\": \"binary message\"\n-                            },\n-                            {\n-                                \"description\": \"The WebSocket session is established\",\n-                                \"name\": \"connected\"\n+                                \"description\": \"For FlowFiles created as a result of a successful HTTP request.\",\n+                                \"name\": \"success\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n                         \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"WebSocket\",\n-                            \"consume\",\n-                            \"listen\",\n-                            \"subscribe\"\n+                            \"hubspot\"\n                         ],\n                         \"triggerSerially\": true,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.websocket.ListenWebSocket\",\n-                        \"typeDescription\": \"Acts as a WebSocket server endpoint to accept client connections. FlowFiles are transferred to downstream relationships according to received message types as the WebSocket server configured with this processor receives client requests\",\n+                        \"type\": \"org.apache.nifi.processors.hubspot.GetHubSpot\",\n+                        \"typeDescription\": \"Retrieves JSON data from a private HubSpot application. This processor is intended to be run on the Primary Node only.\",\n                         \"version\": \"1.27.0\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"WebSocket Controller Service id.\",\n-                                \"name\": \"websocket.controller.service.id\"\n-                            },\n+                                \"description\": \"Sets the MIME type to application/json\",\n+                                \"name\": \"mime.type\"\n+                            }\n+                        ]\n+                    }\n+                ],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"1.27.0\"\n+        },\n+        {\n+            \"artifact\": \"nifi-gcp-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-gcp-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"e0c4461\"\n+                        },\n+                        \"explicitRestrictions\": [\n                             {\n-                                \"description\": \"Established WebSocket session id.\",\n-                                \"name\": \"websocket.session.id\"\n+                                \"explanation\": \"The default configuration can read environment variables and system properties for credentials\",\n+                                \"requiredPermission\": \"access environment credentials\"\n+                            }\n+                        ],\n+                        \"group\": \"org.apache.nifi\",\n+                        \"propertyDescriptors\": {\n+                            \"application-default-credentials\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"If true, uses Google Application Default Credentials, which checks the GOOGLE_APPLICATION_CREDENTIALS environment variable for a filepath to a service account JSON key, the config generated by the gcloud sdk, the App Engine service account, and the Compute Engine service account.\",\n+                                \"displayName\": \"Use Application Default Credentials\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"application-default-credentials\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n                             },\n-                            {\n-                                \"description\": \"WebSocket endpoint id.\",\n-                                \"name\": \"websocket.endpoint.id\"\n+                            \"compute-engine-credentials\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"If true, uses Google Compute Engine Credentials of the Compute Engine VM Instance which NiFi is running on.\",\n+                                \"displayName\": \"Use Compute Engine Credentials\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"compute-engine-credentials\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n                             },\n-                            {\n-                                \"description\": \"WebSocket server address.\",\n-                                \"name\": \"websocket.local.address\"\n+                            \"proxy-configuration-service\": {\n+                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests. Supported proxies: HTTP + AuthN\",\n+                                \"displayName\": \"Proxy Configuration Service\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"proxy-configuration-service\",\n+                                \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.proxy.ProxyConfigurationService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n                             },\n-                            {\n-                                \"description\": \"WebSocket client address.\",\n-                                \"name\": \"websocket.remote.address\"\n+                            \"service-account-json\": {\n+                                \"description\": \"The raw JSON containing a Service Account keyfile.\",\n+                                \"displayName\": \"Service Account JSON\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"service-account-json\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n                             },\n+                            \"service-account-json-file\": {\n+                                \"description\": \"Path to a file containing a Service Account key file in JSON format.\",\n+                                \"displayName\": \"Service Account JSON File\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"service-account-json-file\",\n+                                \"required\": false,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"SINGLE\",\n+                                    \"resourceTypes\": [\n+                                        \"FILE\"\n+                                    ]\n+                                },\n+                                \"sensitive\": false\n+                            }\n+                        },\n+                        \"providedApiImplementations\": [\n                             {\n-                                \"description\": \"TEXT or BINARY.\",\n-                                \"name\": \"websocket.message.type\"\n+                                \"artifact\": \"nifi-gcp-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.gcp.credentials.service.GCPCredentialsService\",\n+                                \"version\": \"1.27.0\"\n                             }\n-                        ]\n-                    },\n+                        ],\n+                        \"restricted\": true,\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"credentials\",\n+                            \"gcp\",\n+                            \"provider\"\n+                        ],\n+                        \"type\": \"org.apache.nifi.processors.gcp.credentials.service.GCPCredentialsControllerService\",\n+                        \"typeDescription\": \"Defines credentials for Google Cloud Platform processors. Uses Application Default credentials without configuration. Application Default credentials support environmental variable (GOOGLE_APPLICATION_CREDENTIALS) pointing to a credential file, the config generated by `gcloud auth application-default login`, AppEngine/Compute Engine service accounts, etc.\",\n+                        \"version\": \"1.27.0\"\n+                    }\n+                ],\n+                \"processors\": [\n                     {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-websocket-processors-nar\",\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-gcp-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n+                            \"EVENT_DRIVEN\": 0,\n                             \"TIMER_DRIVEN\": 1\n                         },\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"websocket-controller-service-id\": {\n-                                \"defaultValue\": \"${websocket.controller.service.id}\",\n-                                \"description\": \"A NiFi Expression to retrieve the id of a WebSocket ControllerService.\",\n-                                \"displayName\": \"WebSocket ControllerService Id\",\n+                            \"GCP Credentials Provider Service\": {\n+                                \"description\": \"The Controller Service used to obtain Google Cloud Platform credentials.\",\n+                                \"displayName\": \"GCP Credentials Provider Service\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"websocket-controller-service-id\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"GCP Credentials Provider Service\",\n+                                \"required\": true,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-gcp-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.gcp.credentials.service.GCPCredentialsService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"bigquery-api-endpoint\": {\n+                                \"defaultValue\": \"bigquerystorage.googleapis.com:443\",\n+                                \"description\": \"Can be used to override the default BigQuery endpoint. Default is bigquerystorage.googleapis.com:443. Format must be hostname:port.\",\n+                                \"displayName\": \"BigQuery API Endpoint\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"bigquery-api-endpoint\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"websocket-endpoint-id\": {\n-                                \"defaultValue\": \"${websocket.endpoint.id}\",\n-                                \"description\": \"A NiFi Expression to retrieve the endpoint id of a WebSocket ControllerService.\",\n-                                \"displayName\": \"WebSocket Endpoint Id\",\n+                            \"bq.append.record.count\": {\n+                                \"defaultValue\": \"20\",\n+                                \"description\": \"The number of records to be appended to the write stream at once. Applicable for both batch and stream types\",\n+                                \"displayName\": \"Append Record Count\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"bq.append.record.count\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"bq.dataset\": {\n+                                \"defaultValue\": \"${bq.dataset}\",\n+                                \"description\": \"BigQuery dataset name (Note - The dataset must exist in GCP)\",\n+                                \"displayName\": \"Dataset\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"websocket-endpoint-id\",\n+                                \"name\": \"bq.dataset\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"websocket-message-type\": {\n-                                \"defaultValue\": \"TEXT\",\n-                                \"description\": \"The type of message content: TEXT or BINARY\",\n-                                \"displayName\": \"WebSocket Message Type\",\n+                            \"bq.record.reader\": {\n+                                \"description\": \"Specifies the Controller Service to use for parsing incoming data.\",\n+                                \"displayName\": \"Record Reader\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"bq.record.reader\",\n+                                \"required\": true,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"bq.skip.invalid.rows\": {\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"Sets whether to insert all valid rows of a request, even if invalid rows exist. If not set the entire insert request will fail if it contains an invalid row.\",\n+                                \"displayName\": \"Skip Invalid Rows\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"websocket-message-type\",\n+                                \"name\": \"bq.skip.invalid.rows\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"websocket-session-id\": {\n-                                \"defaultValue\": \"${websocket.session.id}\",\n-                                \"description\": \"A NiFi Expression to retrieve the session id. If not specified, a message will be sent to all connected WebSocket peers for the WebSocket controller service endpoint.\",\n-                                \"displayName\": \"WebSocket Session Id\",\n+                            \"bq.table.name\": {\n+                                \"defaultValue\": \"${bq.table.name}\",\n+                                \"description\": \"BigQuery table name\",\n+                                \"displayName\": \"Table Name\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"websocket-session-id\",\n+                                \"name\": \"bq.table.name\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"bq.transfer.type\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"Use streaming record handling strategy\",\n+                                        \"displayName\": \"STREAM\",\n+                                        \"value\": \"STREAM\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Use batching record handling strategy\",\n+                                        \"displayName\": \"BATCH\",\n+                                        \"value\": \"BATCH\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"STREAM\",\n+                                \"description\": \"Defines the preferred transfer type streaming or batching\",\n+                                \"displayName\": \"Transfer Type\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"bq.transfer.type\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"gcp-project-id\": {\n+                                \"description\": \"Google Cloud Project ID\",\n+                                \"displayName\": \"Project ID\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"gcp-project-id\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"gcp-retry-count\": {\n+                                \"defaultValue\": \"6\",\n+                                \"description\": \"How many retry attempts should be made before routing to the failure relationship.\",\n+                                \"displayName\": \"Number of retries\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"gcp-retry-count\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             }\n                         },\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.processors.gcp.bigquery.PutBigQueryBatch\",\n+                            \"org.apache.nifi.processors.gcp.bigquery.PutBigQueryStreaming\"\n+                        ],\n                         \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"FlowFiles that are sent successfully to the destination are transferred to this relationship.\",\n+                                \"description\": \"FlowFiles are routed to this relationship after a successful Google BigQuery operation.\",\n                                 \"name\": \"success\"\n                             },\n                             {\n-                                \"description\": \"FlowFiles that failed to send to the destination are transferred to this relationship.\",\n+                                \"description\": \"FlowFiles are routed to this relationship if the Google BigQuery operation fails.\",\n                                 \"name\": \"failure\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n+                            \"CRON_DRIVEN\",\n+                            \"EVENT_DRIVEN\"\n                         ],\n                         \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": false,\n+                        \"supportsEventDriven\": true,\n                         \"supportsSensitiveDynamicProperties\": false,\n-                        \"systemResourceConsiderations\": [\n-                            {\n-                                \"description\": \"An instance of this component can cause high usage of this system resource.  Multiple instances or high concurrency settings may result a degradation of performance.\",\n-                                \"resource\": \"MEMORY\"\n-                            }\n-                        ],\n                         \"tags\": [\n-                            \"WebSocket\",\n-                            \"publish\",\n-                            \"send\"\n+                            \"bigquery\",\n+                            \"bq\",\n+                            \"google\",\n+                            \"google cloud\"\n                         ],\n                         \"triggerSerially\": true,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.websocket.PutWebSocket\",\n-                        \"typeDescription\": \"Sends messages to a WebSocket remote endpoint using a WebSocket session that is established by either ListenWebSocket or ConnectWebSocket.\",\n+                        \"type\": \"org.apache.nifi.processors.gcp.bigquery.PutBigQuery\",\n+                        \"typeDescription\": \"Writes the contents of a FlowFile to a Google BigQuery table. The processor is record based so the schema that is used is driven by the RecordReader. Attributes that are not matched to the target schema are skipped. Exactly once delivery semantics are achieved via stream offsets.\",\n                         \"version\": \"1.27.0\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"WebSocket Controller Service id.\",\n-                                \"name\": \"websocket.controller.service.id\"\n-                            },\n-                            {\n-                                \"description\": \"Established WebSocket session id.\",\n-                                \"name\": \"websocket.session.id\"\n-                            },\n-                            {\n-                                \"description\": \"WebSocket endpoint id.\",\n-                                \"name\": \"websocket.endpoint.id\"\n-                            },\n-                            {\n-                                \"description\": \"TEXT or BINARY.\",\n-                                \"name\": \"websocket.message.type\"\n-                            },\n-                            {\n-                                \"description\": \"WebSocket server address.\",\n-                                \"name\": \"websocket.local.address\"\n-                            },\n-                            {\n-                                \"description\": \"WebSocket client address.\",\n-                                \"name\": \"websocket.remote.address\"\n-                            },\n-                            {\n-                                \"description\": \"Detail of the failure.\",\n-                                \"name\": \"websocket.failure.detail\"\n+                                \"description\": \"Number of records successfully inserted\",\n+                                \"name\": \"bq.records.count\"\n                             }\n                         ]\n-                    }\n-                ],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"1.27.0\"\n-        },\n-        {\n-            \"artifact\": \"nifi-key-service-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [\n+                    },\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-key-service-nar\",\n+                        \"artifact\": \"nifi-gcp-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n+                        \"defaultBulletinLevel\": \"WARN\",\n+                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": 1,\n+                            \"TIMER_DRIVEN\": 1\n+                        },\n+                        \"defaultPenaltyDuration\": \"30 sec\",\n+                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": \"* * * * * ?\",\n+                            \"TIMER_DRIVEN\": \"0 sec\"\n+                        },\n+                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n+                        \"defaultYieldDuration\": \"1 sec\",\n+                        \"deprecated\": true,\n+                        \"deprecationAlternatives\": [\n+                            \"org.apache.nifi.processors.gcp.bigquery.PutBigQuery\"\n+                        ],\n+                        \"deprecationReason\": \"This processor is deprecated and may be removed in future releases.\",\n                         \"group\": \"org.apache.nifi\",\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n+                        \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"key\": {\n-                                \"description\": \"Private Key structured using PKCS8 and encoded as PEM\",\n-                                \"displayName\": \"Key\",\n+                            \"GCP Credentials Provider Service\": {\n+                                \"description\": \"The Controller Service used to obtain Google Cloud Platform credentials.\",\n+                                \"displayName\": \"GCP Credentials Provider Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"key\",\n-                                \"required\": false,\n-                                \"sensitive\": true\n+                                \"name\": \"GCP Credentials Provider Service\",\n+                                \"required\": true,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-gcp-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.gcp.credentials.service.GCPCredentialsService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n                             },\n-                            \"key-file\": {\n-                                \"description\": \"File path to Private Key structured using PKCS8 and encoded as PEM\",\n-                                \"displayName\": \"Key File\",\n+                            \"bq.avro.use.logical.types\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"If format is set to Avro and if this option is set to true, you can interpret logical types into their corresponding types (such as TIMESTAMP) instead of only using their raw types (such as INTEGER).\",\n+                                \"displayName\": \"Avro Input - Use Logical Types\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"key-file\",\n-                                \"required\": false,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"SINGLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\"\n-                                    ]\n-                                },\n+                                \"name\": \"bq.avro.use.logical.types\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"key-password\": {\n-                                \"description\": \"Password used for decrypting Private Keys\",\n-                                \"displayName\": \"Key Password\",\n+                            \"bq.csv.allow.jagged.rows\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"Set whether BigQuery should accept rows that are missing trailing optional columns. If true, BigQuery treats missing trailing columns as null values. If false, records with missing trailing columns are treated as bad records, and if there are too many bad records, an invalid error is returned in the job result. By default, rows with missing trailing columns are considered bad records.\",\n+                                \"displayName\": \"CSV Input - Allow Jagged Rows\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"key-password\",\n-                                \"required\": false,\n-                                \"sensitive\": true\n-                            }\n-                        },\n-                        \"providedApiImplementations\": [\n-                            {\n-                                \"artifact\": \"nifi-standard-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.key.service.api.PrivateKeyService\",\n-                                \"version\": \"1.27.0\"\n-                            }\n-                        ],\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"PEM\",\n-                            \"PKCS8\"\n-                        ],\n-                        \"type\": \"org.apache.nifi.key.service.StandardPrivateKeyService\",\n-                        \"typeDescription\": \"Private Key Service provides access to a Private Key loaded from configured sources\",\n-                        \"version\": \"1.27.0\"\n-                    }\n-                ],\n-                \"processors\": [],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"1.27.0\"\n-        },\n-        {\n-            \"artifact\": \"nifi-kerberos-credentials-service-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-kerberos-credentials-service-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"e0c4461\"\n-                        },\n-                        \"explicitRestrictions\": [\n-                            {\n-                                \"explanation\": \"Allows user to define a Keytab and principal that can then be used by other components.\",\n-                                \"requiredPermission\": \"access keytab\"\n-                            }\n-                        ],\n-                        \"group\": \"org.apache.nifi\",\n-                        \"propertyDescriptors\": {\n-                            \"Kerberos Keytab\": {\n-                                \"description\": \"Kerberos keytab associated with the principal. Requires nifi.kerberos.krb5.file to be set in your nifi.properties\",\n-                                \"displayName\": \"Kerberos Keytab\",\n+                                \"name\": \"bq.csv.allow.jagged.rows\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"bq.csv.allow.quoted.new.lines\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"Sets whether BigQuery should allow quoted data sections that contain newline characters in a CSV file. By default quoted newline are not allowed.\",\n+                                \"displayName\": \"CSV Input - Allow Quoted New Lines\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Kerberos Keytab\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"bq.csv.allow.quoted.new.lines\",\n                                 \"required\": true,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"SINGLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\"\n-                                    ]\n-                                },\n                                 \"sensitive\": false\n                             },\n-                            \"Kerberos Principal\": {\n-                                \"description\": \"Kerberos principal to authenticate as. Requires nifi.kerberos.krb5.file to be set in your nifi.properties\",\n-                                \"displayName\": \"Kerberos Principal\",\n+                            \"bq.csv.charset\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"UTF-8\",\n+                                        \"value\": \"UTF-8\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"ISO-8859-1\",\n+                                        \"value\": \"ISO-8859-1\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"UTF-8\",\n+                                \"description\": \"Sets the character encoding of the data.\",\n+                                \"displayName\": \"CSV Input - Character Set\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Kerberos Principal\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"bq.csv.charset\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n-                            }\n-                        },\n-                        \"providedApiImplementations\": [\n-                            {\n-                                \"artifact\": \"nifi-standard-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.kerberos.KerberosCredentialsService\",\n-                                \"version\": \"1.27.0\"\n-                            }\n-                        ],\n-                        \"restricted\": true,\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"Authentication\",\n-                            \"Credentials\",\n-                            \"Kerberos\",\n-                            \"Keytab\",\n-                            \"Principal\",\n-                            \"Security\"\n-                        ],\n-                        \"type\": \"org.apache.nifi.kerberos.KeytabCredentialsService\",\n-                        \"typeDescription\": \"Provides a mechanism for specifying a Keytab and a Principal that other components are able to use in order to perform authentication using Kerberos. By encapsulating this information into a Controller Service and allowing other components to make use of it (as opposed to specifying the principal and keytab directly in the processor) an administrator is able to choose which users are allowed to use which keytabs and principals. This provides a more robust security model for multi-tenant use cases.\",\n-                        \"version\": \"1.27.0\"\n-                    }\n-                ],\n-                \"processors\": [],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"1.27.0\"\n-        },\n-        {\n-            \"artifact\": \"nifi-websocket-services-jetty-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-websocket-services-jetty-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"e0c4461\"\n-                        },\n-                        \"group\": \"org.apache.nifi\",\n-                        \"propertyDescriptors\": {\n-                            \"authentication-charset\": {\n-                                \"defaultValue\": \"US-ASCII\",\n-                                \"description\": \"The charset for Basic Authentication header base64 string.\",\n-                                \"displayName\": \"Authentication Header Charset\",\n+                            },\n+                            \"bq.csv.delimiter\": {\n+                                \"defaultValue\": \",\",\n+                                \"description\": \"Sets the separator for fields in a CSV file. BigQuery converts the string to ISO-8859-1 encoding, and then uses the first byte of the encoded string to split the data in its raw, binary state. BigQuery also supports the escape sequence \\\"\\t\\\" to specify a tab separator. The default value is a comma (',').\",\n+                                \"displayName\": \"CSV Input - Field Delimiter\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"authentication-charset\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"bq.csv.delimiter\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"connection-attempt-timeout\": {\n-                                \"defaultValue\": \"3\",\n-                                \"description\": \"The number of times to try and establish a connection.\",\n-                                \"displayName\": \"Connection Attempt Count\",\n+                            \"bq.csv.quote\": {\n+                                \"defaultValue\": \"\\\"\",\n+                                \"description\": \"Sets the value that is used to quote data sections in a CSV file. BigQuery converts the string to ISO-8859-1 encoding, and then uses the first byte of the encoded string to split the data in its raw, binary state. The default value is a double-quote ('\\\"'). If your data does not contain quoted sections, set the property value to an empty string. If your data contains quoted newline characters, you must also set the Allow Quoted New Lines property to true.\",\n+                                \"displayName\": \"CSV Input - Quote\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"connection-attempt-timeout\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"bq.csv.quote\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"connection-timeout\": {\n-                                \"defaultValue\": \"3 sec\",\n-                                \"description\": \"The timeout to connect the WebSocket URI.\",\n-                                \"displayName\": \"Connection Timeout\",\n+                            \"bq.csv.skip.leading.rows\": {\n+                                \"defaultValue\": \"0\",\n+                                \"description\": \"Sets the number of rows at the top of a CSV file that BigQuery will skip when reading the data. The default value is 0. This property is useful if you have header rows in the file that should be skipped.\",\n+                                \"displayName\": \"CSV Input - Skip Leading Rows\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"connection-timeout\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"bq.csv.skip.leading.rows\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"custom-authorization\": {\n-                                \"description\": \"Configures a custom HTTP Authorization Header as described in RFC 7235 Section 4.2. Setting a custom Authorization Header excludes configuring the User Name and User Password properties for Basic Authentication.\",\n-                                \"displayName\": \"Custom Authorization\",\n+                            \"bq.dataset\": {\n+                                \"defaultValue\": \"${bq.dataset}\",\n+                                \"description\": \"BigQuery dataset name (Note - The dataset must exist in GCP)\",\n+                                \"displayName\": \"Dataset\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"custom-authorization\",\n-                                \"required\": false,\n-                                \"sensitive\": true\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"bq.dataset\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n                             },\n-                            \"input-buffer-size\": {\n-                                \"defaultValue\": \"4 kb\",\n-                                \"description\": \"The size of the input (read from network layer) buffer size.\",\n-                                \"displayName\": \"Input Buffer Size\",\n+                            \"bq.load.create_disposition\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"Configures the job to create the table if it does not exist.\",\n+                                        \"displayName\": \"CREATE_IF_NEEDED\",\n+                                        \"value\": \"CREATE_IF_NEEDED\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Configures the job to fail with a not-found error if the table does not exist.\",\n+                                        \"displayName\": \"CREATE_NEVER\",\n+                                        \"value\": \"CREATE_NEVER\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"CREATE_IF_NEEDED\",\n+                                \"description\": \"Sets whether the job is allowed to create new tables\",\n+                                \"displayName\": \"Create Disposition\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"input-buffer-size\",\n+                                \"name\": \"bq.load.create_disposition\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"max-binary-message-size\": {\n-                                \"defaultValue\": \"64 kb\",\n-                                \"description\": \"The maximum size of a binary message during parsing/generating.\",\n-                                \"displayName\": \"Max Binary Message Size\",\n+                            \"bq.load.ignore_unknown\": {\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"Sets whether BigQuery should allow extra values that are not represented in the table schema. If true, the extra values are ignored. If false, records with extra columns are treated as bad records, and if there are too many bad records, an invalid error is returned in the job result. By default unknown values are not allowed.\",\n+                                \"displayName\": \"Ignore Unknown Values\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"bq.load.ignore_unknown\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"bq.load.max_badrecords\": {\n+                                \"defaultValue\": \"0\",\n+                                \"description\": \"Sets the maximum number of bad records that BigQuery can ignore when running the job. If the number of bad records exceeds this value, an invalid error is returned in the job result. By default no bad record is ignored.\",\n+                                \"displayName\": \"Max Bad Records\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"max-binary-message-size\",\n+                                \"name\": \"bq.load.max_badrecords\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"max-text-message-size\": {\n-                                \"defaultValue\": \"64 kb\",\n-                                \"description\": \"The maximum size of a text message during parsing/generating.\",\n-                                \"displayName\": \"Max Text Message Size\",\n+                            \"bq.load.type\": {\n+                                \"description\": \"Data type of the file to be loaded. Possible values: AVRO, NEWLINE_DELIMITED_JSON, CSV.\",\n+                                \"displayName\": \"Load file type\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"bq.load.type\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"bq.load.write_disposition\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"Configures the job to fail with a duplicate error if the table already exists.\",\n+                                        \"displayName\": \"WRITE_EMPTY\",\n+                                        \"value\": \"WRITE_EMPTY\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Configures the job to append data to the table if it already exists.\",\n+                                        \"displayName\": \"WRITE_APPEND\",\n+                                        \"value\": \"WRITE_APPEND\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Configures the job to overwrite the table data if table already exists.\",\n+                                        \"displayName\": \"WRITE_TRUNCATE\",\n+                                        \"value\": \"WRITE_TRUNCATE\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"WRITE_EMPTY\",\n+                                \"description\": \"Sets the action that should occur if the destination table already exists.\",\n+                                \"displayName\": \"Write Disposition\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"max-text-message-size\",\n+                                \"name\": \"bq.load.write_disposition\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"proxy-host\": {\n-                                \"description\": \"The host name of the HTTP Proxy.\",\n-                                \"displayName\": \"HTTP Proxy Host\",\n+                            \"bq.readtimeout\": {\n+                                \"defaultValue\": \"5 minutes\",\n+                                \"description\": \"Load Job Time Out\",\n+                                \"displayName\": \"Read Timeout\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"proxy-host\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"bq.readtimeout\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"bq.table.name\": {\n+                                \"defaultValue\": \"${bq.table.name}\",\n+                                \"description\": \"BigQuery table name\",\n+                                \"displayName\": \"Table Name\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"bq.table.name\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"bq.table.schema\": {\n+                                \"description\": \"BigQuery schema in JSON format\",\n+                                \"displayName\": \"Table Schema\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"bq.table.schema\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"proxy-port\": {\n-                                \"description\": \"The port number of the HTTP Proxy.\",\n-                                \"displayName\": \"HTTP Proxy Port\",\n+                            \"gcp-project-id\": {\n+                                \"description\": \"Google Cloud Project ID\",\n+                                \"displayName\": \"Project ID\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"proxy-port\",\n+                                \"name\": \"gcp-project-id\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"session-maintenance-interval\": {\n-                                \"defaultValue\": \"10 sec\",\n-                                \"description\": \"The interval between session maintenance activities. A WebSocket session established with a WebSocket server can be terminated due to different reasons including restarting the WebSocket server or timing out inactive sessions. This session maintenance activity is periodically executed in order to reconnect those lost sessions, so that a WebSocket client can reuse the same session id transparently after it reconnects successfully.  The maintenance activity is executed until corresponding processors or this controller service is stopped.\",\n-                                \"displayName\": \"Session Maintenance Interval\",\n+                            \"gcp-proxy-host\": {\n+                                \"description\": \"IP or hostname of the proxy to be used.\\n You might need to set the following properties in bootstrap for https proxy usage:\\n-Djdk.http.auth.tunneling.disabledSchemes=\\n-Djdk.http.auth.proxying.disabledSchemes=\",\n+                                \"displayName\": \"Proxy host\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"session-maintenance-interval\",\n-                                \"required\": true,\n+                                \"name\": \"gcp-proxy-host\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"ssl-context-service\": {\n-                                \"description\": \"The SSL Context Service to use in order to secure the server. If specified, the server will accept only WSS requests; otherwise, the server will accept only WS requests\",\n-                                \"displayName\": \"SSL Context Service\",\n+                            \"gcp-proxy-port\": {\n+                                \"description\": \"Proxy port number\",\n+                                \"displayName\": \"Proxy port\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"ssl-context-service\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"gcp-proxy-port\",\n                                 \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.ssl.RestrictedSSLContextService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n+                                \"sensitive\": false\n                             },\n-                            \"user-name\": {\n-                                \"description\": \"The user name for Basic Authentication.\",\n-                                \"displayName\": \"User Name\",\n+                            \"gcp-proxy-user-name\": {\n+                                \"description\": \"HTTP Proxy Username\",\n+                                \"displayName\": \"HTTP Proxy Username\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"user-name\",\n+                                \"name\": \"gcp-proxy-user-name\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"user-password\": {\n-                                \"description\": \"The user password for Basic Authentication.\",\n-                                \"displayName\": \"User Password\",\n+                            \"gcp-proxy-user-password\": {\n+                                \"description\": \"HTTP Proxy Password\",\n+                                \"displayName\": \"HTTP Proxy Password\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"user-password\",\n+                                \"name\": \"gcp-proxy-user-password\",\n                                 \"required\": false,\n                                 \"sensitive\": true\n                             },\n-                            \"websocket-uri\": {\n-                                \"description\": \"The WebSocket URI this client connects to.\",\n-                                \"displayName\": \"WebSocket URI\",\n+                            \"gcp-retry-count\": {\n+                                \"defaultValue\": \"6\",\n+                                \"description\": \"How many retry attempts should be made before routing to the failure relationship.\",\n+                                \"displayName\": \"Number of retries\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"websocket-uri\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"gcp-retry-count\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n+                            },\n+                            \"proxy-configuration-service\": {\n+                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests. If set, it supersedes proxy settings configured per component. Supported proxies: HTTP + AuthN\",\n+                                \"displayName\": \"Proxy Configuration Service\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"proxy-configuration-service\",\n+                                \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.proxy.ProxyConfigurationService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n                             }\n                         },\n-                        \"providedApiImplementations\": [\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.processors.gcp.storage.DeleteGCSObject\",\n+                            \"org.apache.nifi.processors.gcp.storage.PutGCSObject\"\n+                        ],\n+                        \"sideEffectFree\": false,\n+                        \"supportedRelationships\": [\n                             {\n-                                \"artifact\": \"nifi-websocket-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.websocket.WebSocketClientService\",\n-                                \"version\": \"1.27.0\"\n+                                \"description\": \"FlowFiles are routed to this relationship after a successful Google BigQuery operation.\",\n+                                \"name\": \"success\"\n                             },\n                             {\n-                                \"artifact\": \"nifi-websocket-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.websocket.WebSocketService\",\n-                                \"version\": \"1.27.0\"\n+                                \"description\": \"FlowFiles are routed to this relationship if the Google BigQuery operation fails.\",\n+                                \"name\": \"failure\"\n                             }\n                         ],\n+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\"\n+                        ],\n+                        \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicRelationships\": false,\n+                        \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"Jetty\",\n-                            \"WebSocket\",\n-                            \"client\"\n+                            \"bigquery\",\n+                            \"bq\",\n+                            \"google\",\n+                            \"google cloud\"\n                         ],\n-                        \"type\": \"org.apache.nifi.websocket.jetty.JettyWebSocketClient\",\n-                        \"typeDescription\": \"Implementation of WebSocketClientService. This service uses Jetty WebSocket client module to provide WebSocket session management throughout the application.\",\n-                        \"version\": \"1.27.0\"\n+                        \"triggerSerially\": false,\n+                        \"triggerWhenAnyDestinationAvailable\": false,\n+                        \"triggerWhenEmpty\": false,\n+                        \"type\": \"org.apache.nifi.processors.gcp.bigquery.PutBigQueryBatch\",\n+                        \"typeDescription\": \"Please be aware this processor is deprecated and may be removed in the near future. Use PutBigQuery instead. Batch loads flow files content to a Google BigQuery table.\",\n+                        \"version\": \"1.27.0\",\n+                        \"writesAttributes\": [\n+                            {\n+                                \"description\": \"Time load job creation\",\n+                                \"name\": \"bq.job.stat.creation_time\"\n+                            },\n+                            {\n+                                \"description\": \"Time load job ended\",\n+                                \"name\": \"bq.job.stat.end_time\"\n+                            },\n+                            {\n+                                \"description\": \"Time load job started\",\n+                                \"name\": \"bq.job.stat.start_time\"\n+                            },\n+                            {\n+                                \"description\": \"API Link to load job\",\n+                                \"name\": \"bq.job.link\"\n+                            },\n+                            {\n+                                \"description\": \"ID of the BigQuery job\",\n+                                \"name\": \"bq.job.id\"\n+                            },\n+                            {\n+                                \"description\": \"Load job error message\",\n+                                \"name\": \"bq.error.message\"\n+                            },\n+                            {\n+                                \"description\": \"Load job error reason\",\n+                                \"name\": \"bq.error.reason\"\n+                            },\n+                            {\n+                                \"description\": \"Load job error location\",\n+                                \"name\": \"bq.error.location\"\n+                            },\n+                            {\n+                                \"description\": \"Number of records successfully inserted\",\n+                                \"name\": \"bq.records.count\"\n+                            }\n+                        ]\n                     },\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-websocket-services-jetty-nar\",\n+                        \"artifact\": \"nifi-gcp-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n+                        \"defaultBulletinLevel\": \"WARN\",\n+                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": 1,\n+                            \"TIMER_DRIVEN\": 1\n+                        },\n+                        \"defaultPenaltyDuration\": \"30 sec\",\n+                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": \"* * * * * ?\",\n+                            \"TIMER_DRIVEN\": \"0 sec\"\n+                        },\n+                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n+                        \"defaultYieldDuration\": \"1 sec\",\n+                        \"deprecated\": true,\n+                        \"deprecationAlternatives\": [\n+                            \"org.apache.nifi.processors.gcp.bigquery.PutBigQuery\"\n+                        ],\n+                        \"deprecationReason\": \"This processor is deprecated and may be removed in future releases.\",\n                         \"group\": \"org.apache.nifi\",\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n+                        \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"auth-path-spec\": {\n-                                \"defaultValue\": \"/*\",\n-                                \"description\": \"Specify a Path Spec to apply Basic Authentication.\",\n-                                \"displayName\": \"Basic Authentication Path Spec\",\n+                            \"GCP Credentials Provider Service\": {\n+                                \"description\": \"The Controller Service used to obtain Google Cloud Platform credentials.\",\n+                                \"displayName\": \"GCP Credentials Provider Service\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"auth-path-spec\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"GCP Credentials Provider Service\",\n+                                \"required\": true,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-gcp-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.gcp.credentials.service.GCPCredentialsService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n                             },\n-                            \"auth-roles\": {\n-                                \"defaultValue\": \"**\",\n-                                \"description\": \"The authenticated user must have one of specified role. Multiple roles can be set as comma separated string. '*' represents any role and so does '**' any role including no role.\",\n-                                \"displayName\": \"Basic Authentication Roles\",\n+                            \"bq.dataset\": {\n+                                \"defaultValue\": \"${bq.dataset}\",\n+                                \"description\": \"BigQuery dataset name (Note - The dataset must exist in GCP)\",\n+                                \"displayName\": \"Dataset\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"auth-roles\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"bq.dataset\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"basic-auth\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n+                            \"bq.load.ignore_unknown\": {\n                                 \"defaultValue\": \"false\",\n-                                \"description\": \"If enabled, client connection requests are authenticated with Basic authentication using the specified Login Provider.\",\n-                                \"displayName\": \"Enable Basic Authentication\",\n+                                \"description\": \"Sets whether BigQuery should allow extra values that are not represented in the table schema. If true, the extra values are ignored. If false, records with extra columns are treated as bad records, and if there are too many bad records, an invalid error is returned in the job result. By default unknown values are not allowed.\",\n+                                \"displayName\": \"Ignore Unknown Values\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"basic-auth\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"bq.load.ignore_unknown\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"client-authentication\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"Processor will not authenticate clients. Anyone can communicate with this Processor anonymously\",\n-                                        \"displayName\": \"No Authentication\",\n-                                        \"value\": \"no\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Processor will try to verify the client but if unable to verify will allow the client to communicate anonymously\",\n-                                        \"displayName\": \"Want Authentication\",\n-                                        \"value\": \"want\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Processor will reject communications from any client unless the client provides a certificate that is trusted by the TrustStore specified in the SSL Context Service\",\n-                                        \"displayName\": \"Need Authentication\",\n-                                        \"value\": \"need\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"no\",\n-                                \"description\": \"Specifies whether or not the Processor should authenticate client by its certificate. This value is ignored if the <SSL Context Service> Property is not specified or the SSL Context provided uses only a KeyStore and not a TrustStore.\",\n-                                \"displayName\": \"SSL Client Authentication\",\n+                            \"bq.record.reader\": {\n+                                \"description\": \"Specifies the Controller Service to use for parsing incoming data.\",\n+                                \"displayName\": \"Record Reader\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"client-authentication\",\n+                                \"name\": \"bq.record.reader\",\n+                                \"required\": true,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"bq.skip.invalid.rows\": {\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"Sets whether to insert all valid rows of a request, even if invalid rows exist. If not set the entire insert request will fail if it contains an invalid row.\",\n+                                \"displayName\": \"Skip Invalid Rows\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"bq.skip.invalid.rows\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"input-buffer-size\": {\n-                                \"defaultValue\": \"4 kb\",\n-                                \"description\": \"The size of the input (read from network layer) buffer size.\",\n-                                \"displayName\": \"Input Buffer Size\",\n+                            \"bq.table.name\": {\n+                                \"defaultValue\": \"${bq.table.name}\",\n+                                \"description\": \"BigQuery table name\",\n+                                \"displayName\": \"Table Name\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"input-buffer-size\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"bq.table.name\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"listen-port\": {\n-                                \"description\": \"The port number on which this WebSocketServer listens to.\",\n-                                \"displayName\": \"Listen Port\",\n+                            \"gcp-project-id\": {\n+                                \"description\": \"Google Cloud Project ID\",\n+                                \"displayName\": \"Project ID\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"listen-port\",\n-                                \"required\": true,\n+                                \"name\": \"gcp-project-id\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"login-service\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"See http://www.eclipse.org/jetty/javadoc/current/org/eclipse/jetty/security/HashLoginService.html for detail.\",\n-                                        \"displayName\": \"HashLoginService\",\n-                                        \"value\": \"hash\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"hash\",\n-                                \"description\": \"Specify which Login Service to use for Basic Authentication.\",\n-                                \"displayName\": \"Login Service\",\n+                            \"gcp-proxy-host\": {\n+                                \"description\": \"IP or hostname of the proxy to be used.\\n You might need to set the following properties in bootstrap for https proxy usage:\\n-Djdk.http.auth.tunneling.disabledSchemes=\\n-Djdk.http.auth.proxying.disabledSchemes=\",\n+                                \"displayName\": \"Proxy host\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"login-service\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"gcp-proxy-host\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"max-binary-message-size\": {\n-                                \"defaultValue\": \"64 kb\",\n-                                \"description\": \"The maximum size of a binary message during parsing/generating.\",\n-                                \"displayName\": \"Max Binary Message Size\",\n+                            \"gcp-proxy-port\": {\n+                                \"description\": \"Proxy port number\",\n+                                \"displayName\": \"Proxy port\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"max-binary-message-size\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"gcp-proxy-port\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"max-text-message-size\": {\n-                                \"defaultValue\": \"64 kb\",\n-                                \"description\": \"The maximum size of a text message during parsing/generating.\",\n-                                \"displayName\": \"Max Text Message Size\",\n+                            \"gcp-proxy-user-name\": {\n+                                \"description\": \"HTTP Proxy Username\",\n+                                \"displayName\": \"HTTP Proxy Username\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"gcp-proxy-user-name\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"gcp-proxy-user-password\": {\n+                                \"description\": \"HTTP Proxy Password\",\n+                                \"displayName\": \"HTTP Proxy Password\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"gcp-proxy-user-password\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n+                            },\n+                            \"gcp-retry-count\": {\n+                                \"defaultValue\": \"6\",\n+                                \"description\": \"How many retry attempts should be made before routing to the failure relationship.\",\n+                                \"displayName\": \"Number of retries\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"max-text-message-size\",\n+                                \"name\": \"gcp-retry-count\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"ssl-context-service\": {\n-                                \"description\": \"The SSL Context Service to use in order to secure the server. If specified, the server will accept only WSS requests; otherwise, the server will accept only WS requests\",\n-                                \"displayName\": \"SSL Context Service\",\n+                            \"proxy-configuration-service\": {\n+                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests. If set, it supersedes proxy settings configured per component. Supported proxies: HTTP + AuthN\",\n+                                \"displayName\": \"Proxy Configuration Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"ssl-context-service\",\n+                                \"name\": \"proxy-configuration-service\",\n                                 \"required\": false,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n                                     \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.ssl.RestrictedSSLContextService\",\n+                                    \"type\": \"org.apache.nifi.proxy.ProxyConfigurationService\",\n                                     \"version\": \"1.27.0\"\n                                 }\n-                            },\n-                            \"users-properties-file\": {\n-                                \"description\": \"Specify a property file containing users for Basic Authentication using HashLoginService. See http://www.eclipse.org/jetty/documentation/current/configuring-security.html for detail.\",\n-                                \"displayName\": \"Users Properties File\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"users-properties-file\",\n-                                \"required\": false,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"SINGLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\"\n-                                    ]\n-                                },\n-                                \"sensitive\": false\n                             }\n                         },\n-                        \"providedApiImplementations\": [\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.processors.gcp.bigquery.PutBigQueryBatch\"\n+                        ],\n+                        \"sideEffectFree\": false,\n+                        \"supportedRelationships\": [\n                             {\n-                                \"artifact\": \"nifi-websocket-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.websocket.WebSocketServerService\",\n-                                \"version\": \"1.27.0\"\n+                                \"description\": \"FlowFiles are routed to this relationship after a successful Google BigQuery operation.\",\n+                                \"name\": \"success\"\n                             },\n                             {\n-                                \"artifact\": \"nifi-websocket-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.websocket.WebSocketService\",\n-                                \"version\": \"1.27.0\"\n+                                \"description\": \"FlowFiles are routed to this relationship if the Google BigQuery operation fails.\",\n+                                \"name\": \"failure\"\n                             }\n                         ],\n+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\"\n+                        ],\n+                        \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicRelationships\": false,\n+                        \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n+                        \"systemResourceConsiderations\": [\n+                            {\n+                                \"description\": \"An instance of this component can cause high usage of this system resource.  Multiple instances or high concurrency settings may result a degradation of performance.\",\n+                                \"resource\": \"MEMORY\"\n+                            }\n+                        ],\n                         \"tags\": [\n-                            \"Jetty\",\n-                            \"WebSocket\",\n-                            \"server\"\n+                            \"bigquery\",\n+                            \"bq\",\n+                            \"gcp\",\n+                            \"google\",\n+                            \"google cloud\",\n+                            \"record\"\n                         ],\n-                        \"type\": \"org.apache.nifi.websocket.jetty.JettyWebSocketServer\",\n-                        \"typeDescription\": \"Implementation of WebSocketServerService. This service uses Jetty WebSocket server module to provide WebSocket session management throughout the application.\",\n-                        \"version\": \"1.27.0\"\n-                    }\n-                ],\n-                \"processors\": [],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"1.27.0\"\n-        },\n-        {\n-            \"artifact\": \"nifi-framework-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [],\n-                \"processors\": [],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"1.27.0\"\n-        },\n-        {\n-            \"artifact\": \"nifi-mongodb-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [],\n-                \"processors\": [\n+                        \"triggerSerially\": false,\n+                        \"triggerWhenAnyDestinationAvailable\": false,\n+                        \"triggerWhenEmpty\": false,\n+                        \"type\": \"org.apache.nifi.processors.gcp.bigquery.PutBigQueryStreaming\",\n+                        \"typeDescription\": \"Please be aware this processor is deprecated and may be removed in the near future. Use PutBigQuery instead. Load data into Google BigQuery table using the streaming API. This processor is not intended to load large flow files as it will load the full content into memory. If you need to insert large flow files, consider using PutBigQueryBatch instead.\",\n+                        \"version\": \"1.27.0\",\n+                        \"writesAttributes\": [\n+                            {\n+                                \"description\": \"Number of records successfully inserted\",\n+                                \"name\": \"bq.records.count\"\n+                            }\n+                        ]\n+                    },\n                     {\n                         \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-mongodb-nar\",\n+                        \"artifact\": \"nifi-gcp-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n-                            \"EVENT_DRIVEN\": 0,\n                             \"TIMER_DRIVEN\": 1\n                         },\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Mongo Collection Name\": {\n-                                \"description\": \"The name of the collection to use\",\n-                                \"displayName\": \"Mongo Collection Name\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Mongo Collection Name\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Mongo Database Name\": {\n-                                \"description\": \"The name of the database to use\",\n-                                \"displayName\": \"Mongo Database Name\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Mongo Database Name\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Mongo URI\": {\n-                                \"description\": \"MongoURI, typically of the form: mongodb://host1[:port1][,host2[:port2],...]\",\n-                                \"displayName\": \"Mongo URI\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Mongo URI\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Write Concern\": {\n+                            \"Google Doc Export Type\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"ACKNOWLEDGED\",\n-                                        \"value\": \"ACKNOWLEDGED\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"UNACKNOWLEDGED\",\n-                                        \"value\": \"UNACKNOWLEDGED\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"FSYNCED\",\n-                                        \"value\": \"FSYNCED\"\n+                                        \"displayName\": \"PDF\",\n+                                        \"value\": \"application/pdf\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"JOURNALED\",\n-                                        \"value\": \"JOURNALED\"\n+                                        \"displayName\": \"Plain Text\",\n+                                        \"value\": \"text/plain\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"REPLICA_ACKNOWLEDGED\",\n-                                        \"value\": \"REPLICA_ACKNOWLEDGED\"\n+                                        \"displayName\": \"Microsoft Word\",\n+                                        \"value\": \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"MAJORITY\",\n-                                        \"value\": \"MAJORITY\"\n+                                        \"displayName\": \"OpenDocument\",\n+                                        \"value\": \"application/vnd.oasis.opendocument.text\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"W1\",\n-                                        \"value\": \"W1\"\n+                                        \"displayName\": \"Rich Text\",\n+                                        \"value\": \"application/rtf\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"W2\",\n-                                        \"value\": \"W2\"\n+                                        \"displayName\": \"Web Page (HTML)\",\n+                                        \"value\": \"application/zip\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"W3\",\n-                                        \"value\": \"W3\"\n+                                        \"displayName\": \"EPUB\",\n+                                        \"value\": \"application/epub+zip\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"ACKNOWLEDGED\",\n-                                \"description\": \"The write concern to use\",\n-                                \"displayName\": \"Write Concern\",\n+                                \"defaultValue\": \"application/pdf\",\n+                                \"description\": \"Google Documents cannot be downloaded directly from Google Drive but instead must be exported to a specified MIME Type. In the event that the incoming FlowFile's MIME Type indicates that the file is a Google Document, this property specifies the MIME Type to export the document to.\",\n+                                \"displayName\": \"Google Doc Export Type\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Write Concern\",\n+                                \"name\": \"Google Doc Export Type\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"delete-mongo-delete-mode\": {\n+                            \"Google Drawing Export Type\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Delete only the first document that matches the query.\",\n-                                        \"displayName\": \"Delete One\",\n-                                        \"value\": \"one\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"PDF\",\n+                                        \"value\": \"application/pdf\"\n                                     },\n                                     {\n-                                        \"description\": \"Delete every document that matches the query.\",\n-                                        \"displayName\": \"Delete Many\",\n-                                        \"value\": \"many\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"PNG\",\n+                                        \"value\": \"image/png\"\n                                     },\n                                     {\n-                                        \"description\": \"Read the 'mongodb.delete.mode attribute and use that mode. Acceptable values are 'many' and 'one.'\",\n-                                        \"displayName\": \"Use 'mongodb.delete.mode' attribute\",\n-                                        \"value\": \"attr\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"JPEG\",\n+                                        \"value\": \"image/jpeg\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"SVG\",\n+                                        \"value\": \"image/svg+xml\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"one\",\n-                                \"description\": \"Choose between deleting one document by query or many documents by query.\",\n-                                \"displayName\": \"Delete Mode\",\n+                                \"defaultValue\": \"application/pdf\",\n+                                \"description\": \"Google Drawings cannot be downloaded directly from Google Drive but instead must be exported to a specified MIME Type. In the event that the incoming FlowFile's MIME Type indicates that the file is a Google Drawing, this property specifies the MIME Type to export the drawing to.\",\n+                                \"displayName\": \"Google Drawing Export Type\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"delete-mongo-delete-mode\",\n-                                \"required\": false,\n+                                \"name\": \"Google Drawing Export Type\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"delete-mongo-fail-on-no-delete\": {\n+                            \"Google Presentation Export Type\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Fail when no documents are deleted.\",\n-                                        \"displayName\": \"True\",\n-                                        \"value\": \"true\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"PDF\",\n+                                        \"value\": \"application/pdf\"\n                                     },\n                                     {\n-                                        \"description\": \"Do not fail when nothing is deleted.\",\n-                                        \"displayName\": \"False\",\n-                                        \"value\": \"false\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Microsoft PowerPoint\",\n+                                        \"value\": \"application/vnd.openxmlformats-officedocument.presentationml.presentation\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Plain Text\",\n+                                        \"value\": \"text/plain\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"OpenDocument Presentation\",\n+                                        \"value\": \"application/vnd.oasis.opendocument.presentation\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"PNG (first slide only)\",\n+                                        \"value\": \"image/png\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"JPEG (first slide only)\",\n+                                        \"value\": \"image/jpeg\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Scalable Vector Graphics. Only the first slide will be exported.\",\n+                                        \"displayName\": \"SVG (first slide only)\",\n+                                        \"value\": \"image/svg+xml\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"true\",\n-                                \"description\": \"Determines whether to send the flowfile to the success or failure relationship if nothing is successfully deleted.\",\n-                                \"displayName\": \"Fail When Nothing Is Deleted\",\n+                                \"defaultValue\": \"application/pdf\",\n+                                \"description\": \"Google Presentations cannot be downloaded directly from Google Drive but instead must be exported to a specified MIME Type. In the event that the incoming FlowFile's MIME Type indicates that the file is a Google Presentation, this property specifies the MIME Type to export the presentation to.\",\n+                                \"displayName\": \"Google Presentation Export Type\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"delete-mongo-fail-on-no-delete\",\n-                                \"required\": false,\n+                                \"name\": \"Google Presentation Export Type\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"mongo-client-service\": {\n-                                \"description\": \"If configured, this property will use the assigned client service for connection pooling.\",\n-                                \"displayName\": \"Client Service\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"mongo-client-service\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-mongodb-client-service-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.mongodb.MongoDBClientService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            },\n-                            \"ssl-client-auth\": {\n+                            \"Google Spreadsheet Export Type\": {\n                                 \"allowableValues\": [\n                                     {\n+                                        \"description\": \"Comma-separated values. Only the first sheet will be exported.\",\n+                                        \"displayName\": \"CSV (first sheet only)\",\n+                                        \"value\": \"text/csv\"\n+                                    },\n+                                    {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"WANT\",\n-                                        \"value\": \"WANT\"\n+                                        \"displayName\": \"Microsoft Excel\",\n+                                        \"value\": \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"REQUIRED\",\n-                                        \"value\": \"REQUIRED\"\n+                                        \"displayName\": \"PDF\",\n+                                        \"value\": \"application/pdf\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Tab-separate values. Only the first sheet will be exported.\",\n+                                        \"displayName\": \"TSV (first sheet only)\",\n+                                        \"value\": \"text/tab-separated-values\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"NONE\",\n-                                        \"value\": \"NONE\"\n+                                        \"displayName\": \"Web Page (HTML)\",\n+                                        \"value\": \"text/html\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"OpenDocument Spreadsheet\",\n+                                        \"value\": \"application/x-vnd.oasis.opendocument.spreadsheet\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"REQUIRED\",\n-                                \"description\": \"Client authentication policy when connecting to secure (TLS/SSL) cluster. Possible values are REQUIRED, WANT, NONE. This property is only used when an SSL Context has been defined and enabled.\",\n-                                \"displayName\": \"Client Auth\",\n+                                \"defaultValue\": \"text/csv\",\n+                                \"description\": \"Google Spreadsheets cannot be downloaded directly from Google Drive but instead must be exported to a specified MIME Type. In the event that the incoming FlowFile's MIME Type indicates that the file is a Google Spreadsheet, this property specifies the MIME Type to export the spreadsheet to.\",\n+                                \"displayName\": \"Google Spreadsheet Export Type\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"ssl-client-auth\",\n-                                \"required\": false,\n+                                \"name\": \"Google Spreadsheet Export Type\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"ssl-context-service\": {\n-                                \"description\": \"The SSL Context Service used to provide client certificate information for TLS/SSL connections.\",\n-                                \"displayName\": \"SSL Context Service\",\n+                            \"drive-file-id\": {\n+                                \"defaultValue\": \"${drive.id}\",\n+                                \"description\": \"The Drive ID of the File to fetch. Please see Additional Details for information on how to obtain the Drive ID.\",\n+                                \"displayName\": \"File ID\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"drive-file-id\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"gcp-credentials-provider-service\": {\n+                                \"description\": \"The Controller Service used to obtain Google Cloud Platform credentials.\",\n+                                \"displayName\": \"GCP Credentials Provider Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"ssl-context-service\",\n+                                \"name\": \"gcp-credentials-provider-service\",\n+                                \"required\": true,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-gcp-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.gcp.credentials.service.GCPCredentialsService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"proxy-configuration-service\": {\n+                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests. Supported proxies: HTTP + AuthN\",\n+                                \"displayName\": \"Proxy Configuration Service\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"proxy-configuration-service\",\n                                 \"required\": false,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n                                     \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n+                                    \"type\": \"org.apache.nifi.proxy.ProxyConfigurationService\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             }\n                         },\n                         \"readsAttributes\": [\n                             {\n-                                \"description\": \"Configurable parameter for controlling delete mode on a per-flowfile basis. The process must be configured to use this option. Acceptable values are 'one' and 'many.'\",\n-                                \"name\": \"mongodb.delete.mode\"\n+                                \"description\": \"The id of the file\",\n+                                \"name\": \"drive.id\"\n                             }\n                         ],\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.processors.gcp.drive.ListGoogleDrive\",\n+                            \"org.apache.nifi.processors.gcp.drive.PutGoogleDrive\"\n+                        ],\n                         \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"All FlowFiles that are written to MongoDB are routed to this relationship\",\n+                                \"description\": \"A FlowFile will be routed here for each successfully fetched File.\",\n                                 \"name\": \"success\"\n                             },\n                             {\n-                                \"description\": \"All FlowFiles that cannot be written to MongoDB are routed to this relationship\",\n+                                \"description\": \"A FlowFile will be routed here for each File for which fetch was attempted but failed.\",\n                                 \"name\": \"failure\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\",\n-                            \"EVENT_DRIVEN\"\n+                            \"CRON_DRIVEN\"\n                         ],\n                         \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": true,\n+                        \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"delete\",\n-                            \"mongo\",\n-                            \"mongodb\"\n+                            \"drive\",\n+                            \"fetch\",\n+                            \"google\",\n+                            \"storage\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.mongodb.DeleteMongo\",\n-                        \"typeDescription\": \"Executes a delete query against a MongoDB collection. The query is provided in the body of the flowfile and the user can select whether it will delete one or many documents that match it.\",\n-                        \"version\": \"1.27.0\"\n+                        \"type\": \"org.apache.nifi.processors.gcp.drive.FetchGoogleDrive\",\n+                        \"typeDescription\": \"Fetches files from a Google Drive Folder. Designed to be used in tandem with ListGoogleDrive. Please see Additional Details to set up access to Google Drive.\",\n+                        \"version\": \"1.27.0\",\n+                        \"writesAttributes\": [\n+                            {\n+                                \"description\": \"The id of the file\",\n+                                \"name\": \"drive.id\"\n+                            },\n+                            {\n+                                \"description\": \"The name of the file\",\n+                                \"name\": \"filename\"\n+                            },\n+                            {\n+                                \"description\": \"The MIME type of the file\",\n+                                \"name\": \"mime.type\"\n+                            },\n+                            {\n+                                \"description\": \"The size of the file\",\n+                                \"name\": \"drive.size\"\n+                            },\n+                            {\n+                                \"description\": \"The last modified time or created time (whichever is greater) of the file. The reason for this is that the original modified date of a file is preserved when uploaded to Google Drive. 'Created time' takes the time when the upload occurs. However uploaded files can still be modified later.\",\n+                                \"name\": \"drive.timestamp\"\n+                            },\n+                            {\n+                                \"description\": \"The error code returned by Google Drive\",\n+                                \"name\": \"error.code\"\n+                            },\n+                            {\n+                                \"description\": \"The error message returned by Google Drive\",\n+                                \"name\": \"error.message\"\n+                            }\n+                        ]\n                     },\n                     {\n                         \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-mongodb-nar\",\n+                        \"artifact\": \"nifi-gcp-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n                         },\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"0 sec\"\n+                            \"TIMER_DRIVEN\": \"1 min\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_ALLOWED\",\n-                        \"primaryNodeOnly\": false,\n+                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n+                        \"primaryNodeOnly\": true,\n                         \"propertyDescriptors\": {\n-                            \"Batch Size\": {\n-                                \"description\": \"The number of elements to be returned from the server in one batch\",\n-                                \"displayName\": \"Batch Size\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Batch Size\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Limit\": {\n-                                \"description\": \"The maximum number of elements to return\",\n-                                \"displayName\": \"Limit\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Limit\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Mongo Collection Name\": {\n-                                \"description\": \"The name of the collection to use\",\n-                                \"displayName\": \"Mongo Collection Name\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Mongo Collection Name\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Mongo Database Name\": {\n-                                \"description\": \"The name of the database to use\",\n-                                \"displayName\": \"Mongo Database Name\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Mongo Database Name\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Mongo URI\": {\n-                                \"description\": \"MongoURI, typically of the form: mongodb://host1[:port1][,host2[:port2],...]\",\n-                                \"displayName\": \"Mongo URI\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Mongo URI\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Projection\": {\n-                                \"description\": \"The fields to be returned from the documents in the result set; must be a valid BSON document\",\n-                                \"displayName\": \"Projection\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Projection\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Query\": {\n-                                \"description\": \"The selection criteria to do the lookup. If the field is left blank, it will look for input from an incoming connection from another processor to provide the query as a valid JSON document inside of the FlowFile's body. If this field is left blank and a timer is enabled instead of an incoming connection, that will result in a full collection fetch using a \\\"{}\\\" query.\",\n-                                \"displayName\": \"Query\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Query\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Sort\": {\n-                                \"description\": \"The fields by which to sort; must be a valid BSON document\",\n-                                \"displayName\": \"Sort\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Sort\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"get-mongo-send-empty\": {\n+                            \"et-initial-listing-target\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"description\": \"Ignore entities having timestamp older than the specified 'Tracking Time Window' at the initial listing activity.\",\n+                                        \"displayName\": \"Tracking Time Window\",\n+                                        \"value\": \"window\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"description\": \"Regardless of entities timestamp, all existing entities will be listed at the initial listing activity.\",\n+                                        \"displayName\": \"All Available\",\n+                                        \"value\": \"all\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"If a query executes successfully, but returns no results, send an empty JSON document signifying no result.\",\n-                                \"displayName\": \"Send Empty Result\",\n+                                \"defaultValue\": \"all\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"entities\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Listing Strategy\",\n+                                        \"propertyName\": \"listing-strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"Specify how initial listing should be handled. Used by 'Tracking Entities' strategy.\",\n+                                \"displayName\": \"Entity Tracking Initial Listing Target\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"get-mongo-send-empty\",\n+                                \"name\": \"et-initial-listing-target\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"json-type\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"Use MongoDB's \\\"extended JSON\\\". This is the JSON generated with toJson() on a MongoDB Document from the Java driver\",\n-                                        \"displayName\": \"Extended JSON\",\n-                                        \"value\": \"Extended\"\n-                                    },\n+                            \"et-state-cache\": {\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"Generate a JSON document that conforms to typical JSON conventions instead of Mongo-specific conventions.\",\n-                                        \"displayName\": \"Standard JSON\",\n-                                        \"value\": \"Standard\"\n+                                        \"dependentValues\": [\n+                                            \"entities\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Listing Strategy\",\n+                                        \"propertyName\": \"listing-strategy\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"Extended\",\n-                                \"description\": \"By default, MongoDB's Java driver returns \\\"extended JSON\\\". Some of the features of this variant of JSON may cause problems for other JSON parsers that expect only standard JSON types and conventions. This configuration setting  controls whether to use extended JSON or provide a clean view that conforms to standard JSON.\",\n-                                \"displayName\": \"JSON Type\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"json-type\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"mongo-charset\": {\n-                                \"defaultValue\": \"UTF-8\",\n-                                \"description\": \"Specifies the character set of the document data.\",\n-                                \"displayName\": \"Character Set\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"mongo-charset\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"mongo-client-service\": {\n-                                \"description\": \"If configured, this property will use the assigned client service for connection pooling.\",\n-                                \"displayName\": \"Client Service\",\n+                                \"description\": \"Listed entities are stored in the specified cache storage so that this processor can resume listing across NiFi restart or in case of primary node change. 'Tracking Entities' strategy require tracking information of all listed entities within the last 'Tracking Time Window'. To support large number of entities, the strategy uses DistributedMapCache instead of managed state. Cache key format is 'ListedEntities::{processorId}(::{nodeId})'. If it tracks per node listed entities, then the optional '::{nodeId}' part is added to manage state separately. E.g. cluster wide cache key = 'ListedEntities::8dda2321-0164-1000-50fa-3042fe7d6a7b', per node cache key = 'ListedEntities::8dda2321-0164-1000-50fa-3042fe7d6a7b::nifi-node3' The stored cache content is Gzipped JSON string. The cache key will be deleted when target listing configuration is changed. Used by 'Tracking Entities' strategy.\",\n+                                \"displayName\": \"Entity Tracking State Cache\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"mongo-client-service\",\n+                                \"name\": \"et-state-cache\",\n                                 \"required\": false,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-mongodb-client-service-api-nar\",\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.mongodb.MongoDBClientService\",\n+                                    \"type\": \"org.apache.nifi.distributed.cache.client.DistributedMapCacheClient\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             },\n-                            \"mongo-date-format\": {\n-                                \"defaultValue\": \"yyyy-MM-dd'T'HH:mm:ss'Z'\",\n-                                \"description\": \"The date format string to use for formatting Date fields that are returned from Mongo. It is only applied when the JSON output format is set to Standard JSON. Full documentation for format characters can be found here: https://docs.oracle.com/javase/8/docs/api/java/text/SimpleDateFormat.html\",\n-                                \"displayName\": \"Date Format\",\n+                            \"et-time-window\": {\n+                                \"defaultValue\": \"3 hours\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"entities\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Listing Strategy\",\n+                                        \"propertyName\": \"listing-strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"Specify how long this processor should track already-listed entities. 'Tracking Entities' strategy can pick any entity whose timestamp is inside the specified time window. For example, if set to '30 minutes', any entity having timestamp in recent 30 minutes will be the listing target when this processor runs. A listed entity is considered 'new/updated' and a FlowFile is emitted if one of following condition meets: 1. does not exist in the already-listed entities, 2. has newer timestamp than the cached entity, 3. has different size than the cached entity. If a cached entity's timestamp becomes older than specified time window, that entity will be removed from the cached already-listed entities. Used by 'Tracking Entities' strategy.\",\n+                                \"displayName\": \"Entity Tracking Time Window\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"mongo-date-format\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"et-time-window\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"mongo-query-attribute\": {\n-                                \"description\": \"If set, the query will be written to a specified attribute on the output flowfiles.\",\n-                                \"displayName\": \"Query Output Attribute\",\n+                            \"folder-id\": {\n+                                \"description\": \"The ID of the folder from which to pull list of files. Please see Additional Details to set up access to Google Drive and obtain Folder ID. WARNING: Unauthorized access to the folder is treated as if the folder was empty. This results in the processor not creating outgoing FlowFiles. No additional error message is provided.\",\n+                                \"displayName\": \"Folder ID\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"mongo-query-attribute\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"folder-id\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"results-per-flowfile\": {\n-                                \"description\": \"How many results to put into a FlowFile at once. The whole body will be treated as a JSON array of results.\",\n-                                \"displayName\": \"Results Per FlowFile\",\n+                            \"gcp-credentials-provider-service\": {\n+                                \"description\": \"The Controller Service used to obtain Google Cloud Platform credentials.\",\n+                                \"displayName\": \"GCP Credentials Provider Service\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"results-per-flowfile\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"gcp-credentials-provider-service\",\n+                                \"required\": true,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-gcp-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.gcp.credentials.service.GCPCredentialsService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n                             },\n-                            \"ssl-client-auth\": {\n+                            \"listing-strategy\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"WANT\",\n-                                        \"value\": \"WANT\"\n+                                        \"description\": \"This strategy tracks the latest timestamp of listed entity to determine new/updated entities. Since it only tracks few timestamps, it can manage listing state efficiently. However, any newly added, or updated entity having timestamp older than the tracked latest timestamp can not be picked by this strategy. For example, such situation can happen in a file system if a file with old timestamp is copied or moved into the target directory without its last modified timestamp being updated. Also may miss files when multiple subdirectories are being written at the same time while listing is running.\",\n+                                        \"displayName\": \"Tracking Timestamps\",\n+                                        \"value\": \"timestamps\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"REQUIRED\",\n-                                        \"value\": \"REQUIRED\"\n+                                        \"description\": \"This strategy tracks information of all the listed entities within the latest 'Entity Tracking Time Window' to determine new/updated entities. This strategy can pick entities having old timestamp that can be missed with 'Tracking Timestamps'. Works even when multiple subdirectories are being written at the same time while listing is running. However additional DistributedMapCache controller service is required and more JVM heap memory is used. See the description of 'Entity Tracking Time Window' property for further details on how it works.\",\n+                                        \"displayName\": \"Tracking Entities\",\n+                                        \"value\": \"entities\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"NONE\",\n-                                        \"value\": \"NONE\"\n+                                        \"description\": \"This strategy uses a sliding time window. The window starts where the previous window ended and ends with the 'current time'. One cycle will list files with modification time falling within the time window. Works even when multiple subdirectories are being written at the same time while listing is running. IMPORTANT: This strategy works properly only if the time on both the system hosting NiFi and the one hosting the files are accurate.\",\n+                                        \"displayName\": \"Time Window\",\n+                                        \"value\": \"time-window\"\n+                                    },\n+                                    {\n+                                        \"description\": \"This strategy lists an entity without any tracking. The same entity will be listed each time on executing this processor. It is recommended to change the default run schedule value. Any property that related to the persisting state will be disregarded.\",\n+                                        \"displayName\": \"No Tracking\",\n+                                        \"value\": \"none\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"REQUIRED\",\n-                                \"description\": \"Client authentication policy when connecting to secure (TLS/SSL) cluster. Possible values are REQUIRED, WANT, NONE. This property is only used when an SSL Context has been defined and enabled.\",\n-                                \"displayName\": \"Client Auth\",\n+                                \"defaultValue\": \"timestamps\",\n+                                \"description\": \"Specify how to determine new/updated entities. See each strategy descriptions for detail.\",\n+                                \"displayName\": \"Listing Strategy\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"ssl-client-auth\",\n-                                \"required\": false,\n+                                \"name\": \"listing-strategy\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"ssl-context-service\": {\n-                                \"description\": \"The SSL Context Service used to provide client certificate information for TLS/SSL connections.\",\n-                                \"displayName\": \"SSL Context Service\",\n+                            \"min-age\": {\n+                                \"defaultValue\": \"0 sec\",\n+                                \"description\": \"The minimum age a file must be in order to be considered; any files younger than this will be ignored.\",\n+                                \"displayName\": \"Minimum File Age\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"ssl-context-service\",\n+                                \"name\": \"min-age\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"proxy-configuration-service\": {\n+                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests. Supported proxies: HTTP + AuthN\",\n+                                \"displayName\": \"Proxy Configuration Service\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"proxy-configuration-service\",\n                                 \"required\": false,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n                                     \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n+                                    \"type\": \"org.apache.nifi.proxy.ProxyConfigurationService\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             },\n-                            \"use-pretty-printing\": {\n+                            \"record-writer\": {\n+                                \"description\": \"Specifies the Record Writer to use for creating the listing. If not specified, one FlowFile will be created for each entity that is listed. If the Record Writer is specified, all entities will be written to a single FlowFile instead of adding attributes to individual FlowFiles.\",\n+                                \"displayName\": \"Record Writer\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"record-writer\",\n+                                \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"recursive-search\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"True\",\n+                                        \"displayName\": \"true\",\n                                         \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"False\",\n+                                        \"displayName\": \"false\",\n                                         \"value\": \"false\"\n                                     }\n                                 ],\n                                 \"defaultValue\": \"true\",\n-                                \"description\": \"Choose whether or not to pretty print the JSON from the results of the query. Choosing 'True' can greatly increase the space requirements on disk depending on the complexity of the JSON document\",\n-                                \"displayName\": \"Pretty Print Results JSON\",\n+                                \"description\": \"When 'true', will include list of files from concrete sub-folders (ignores shortcuts). Otherwise, will return only files that have the defined 'Folder ID' as their parent directly. WARNING: The listing may fail if there are too many sub-folders (500+).\",\n+                                \"displayName\": \"Search Recursively\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"use-pretty-printing\",\n+                                \"name\": \"recursive-search\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             }\n                         },\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.processors.gcp.drive.FetchGoogleDrive\",\n+                            \"org.apache.nifi.processors.gcp.drive.PutGoogleDrive\"\n+                        ],\n                         \"sideEffectFree\": false,\n+                        \"stateful\": {\n+                            \"description\": \"The processor stores necessary data to be able to keep track what files have been listed already. What exactly needs to be stored depends on the 'Listing Strategy'. State is stored across the cluster so that this Processor can be run on Primary Node only and if a new Primary Node is selected, the new node can pick up where the previous node left off, without duplicating the data.\",\n+                            \"scopes\": [\n+                                \"CLUSTER\"\n+                            ]\n+                        },\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"All FlowFiles that have the results of a successful query execution go here.\",\n+                                \"description\": \"All FlowFiles that are received are routed to success\",\n                                 \"name\": \"success\"\n-                            },\n-                            {\n-                                \"description\": \"All input FlowFiles that are part of a failed query execution go here.\",\n-                                \"name\": \"failure\"\n-                            },\n-                            {\n-                                \"description\": \"All input FlowFiles that are part of a successful query execution go here.\",\n-                                \"name\": \"original\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n                         \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"get\",\n-                            \"mongodb\",\n-                            \"read\"\n+                            \"drive\",\n+                            \"google\",\n+                            \"storage\"\n                         ],\n-                        \"triggerSerially\": false,\n+                        \"triggerSerially\": true,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.mongodb.GetMongo\",\n-                        \"typeDescription\": \"Creates FlowFiles from documents in MongoDB loaded by a user-specified query.\",\n+                        \"type\": \"org.apache.nifi.processors.gcp.drive.ListGoogleDrive\",\n+                        \"typeDescription\": \"Performs a listing of concrete files (shortcuts are ignored) in a Google Drive folder. If the 'Record Writer' property is set, a single Output FlowFile is created, and each file in the listing is written as a single record to the output file. Otherwise, for each file in the listing, an individual FlowFile is created, the metadata being written as FlowFile attributes. This Processor is designed to run on Primary Node only in a cluster. If the primary node changes, the new Primary Node will pick up where the previous node left off without duplicating all of the data. Please see Additional Details to set up access to Google Drive.\",\n                         \"version\": \"1.27.0\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"The database where the results came from.\",\n-                                \"name\": \"mongo.database.name\"\n+                                \"description\": \"The id of the file\",\n+                                \"name\": \"drive.id\"\n                             },\n                             {\n-                                \"description\": \"The collection where the results came from.\",\n-                                \"name\": \"mongo.collection.name\"\n+                                \"description\": \"The name of the file\",\n+                                \"name\": \"filename\"\n+                            },\n+                            {\n+                                \"description\": \"The MIME type of the file\",\n+                                \"name\": \"mime.type\"\n+                            },\n+                            {\n+                                \"description\": \"The size of the file\",\n+                                \"name\": \"drive.size\"\n+                            },\n+                            {\n+                                \"description\": \"The last modified time or created time (whichever is greater) of the file. The reason for this is that the original modified date of a file is preserved when uploaded to Google Drive. 'Created time' takes the time when the upload occurs. However uploaded files can still be modified later.\",\n+                                \"name\": \"drive.timestamp\"\n                             }\n                         ]\n                     },\n                     {\n                         \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-mongodb-nar\",\n+                        \"artifact\": \"nifi-gcp-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -34462,1098 +31198,1123 @@\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_ALLOWED\",\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Batch Size\": {\n-                                \"description\": \"The number of elements to be returned from the server in one batch\",\n-                                \"displayName\": \"Batch Size\",\n+                            \"chunked-upload-size\": {\n+                                \"defaultValue\": \"10 MB\",\n+                                \"description\": \"Defines the size of a chunk. Used when a FlowFile's size exceeds 'Chunked Upload Threshold' and content is uploaded in smaller chunks. Minimum allowed chunk size is 256 KB, maximum allowed chunk size is 1 GB.\",\n+                                \"displayName\": \"Chunked Upload Size\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Batch Size\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"chunked-upload-size\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Limit\": {\n-                                \"description\": \"The maximum number of elements to return\",\n-                                \"displayName\": \"Limit\",\n+                            \"chunked-upload-threshold\": {\n+                                \"defaultValue\": \"100 MB\",\n+                                \"description\": \"The maximum size of the content which is uploaded at once. FlowFiles larger than this threshold are uploaded in chunks.\",\n+                                \"displayName\": \"Chunked Upload Threshold\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Limit\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"chunked-upload-threshold\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Mongo Collection Name\": {\n-                                \"description\": \"The name of the collection to use\",\n-                                \"displayName\": \"Mongo Collection Name\",\n+                            \"conflict-resolution-strategy\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"Handle file conflict as failure.\",\n+                                        \"displayName\": \"fail\",\n+                                        \"value\": \"fail\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Ignore conflict, do not change the original file.\",\n+                                        \"displayName\": \"ignore\",\n+                                        \"value\": \"ignore\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Replace existing file in case of conflict.\",\n+                                        \"displayName\": \"replace\",\n+                                        \"value\": \"replace\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"fail\",\n+                                \"description\": \"Indicates what should happen when a file with the same name already exists in the specified Google Drive folder.\",\n+                                \"displayName\": \"Conflict Resolution Strategy\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Mongo Collection Name\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"conflict-resolution-strategy\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Mongo Database Name\": {\n-                                \"description\": \"The name of the database to use\",\n-                                \"displayName\": \"Mongo Database Name\",\n+                            \"file-name\": {\n+                                \"defaultValue\": \"${filename}\",\n+                                \"description\": \"The name of the file to upload to the specified Google Drive folder.\",\n+                                \"displayName\": \"Filename\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Mongo Database Name\",\n+                                \"name\": \"file-name\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Projection\": {\n-                                \"description\": \"The fields to be returned from the documents in the result set; must be a valid BSON document\",\n-                                \"displayName\": \"Projection\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Projection\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Query\": {\n-                                \"description\": \"The selection criteria to do the lookup. If the field is left blank, it will look for input from an incoming connection from another processor to provide the query as a valid JSON document inside of the FlowFile's body. If this field is left blank and a timer is enabled instead of an incoming connection, that will result in a full collection fetch using a \\\"{}\\\" query.\",\n-                                \"displayName\": \"Query\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Query\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Sort\": {\n-                                \"description\": \"The fields by which to sort; must be a valid BSON document\",\n-                                \"displayName\": \"Sort\",\n+                            \"folder-id\": {\n+                                \"description\": \"The ID of the shared folder. Please see Additional Details to set up access to Google Drive and obtain Folder ID.\",\n+                                \"displayName\": \"Folder ID\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Sort\",\n-                                \"required\": false,\n+                                \"name\": \"folder-id\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"get-mongo-record-writer-factory\": {\n-                                \"description\": \"The record writer to use to write the result sets.\",\n-                                \"displayName\": \"Record Writer\",\n+                            \"gcp-credentials-provider-service\": {\n+                                \"description\": \"The Controller Service used to obtain Google Cloud Platform credentials.\",\n+                                \"displayName\": \"GCP Credentials Provider Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"get-mongo-record-writer-factory\",\n+                                \"name\": \"gcp-credentials-provider-service\",\n                                 \"required\": true,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"artifact\": \"nifi-gcp-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n+                                    \"type\": \"org.apache.nifi.gcp.credentials.service.GCPCredentialsService\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             },\n-                            \"mongo-client-service\": {\n-                                \"description\": \"If configured, this property will use the assigned client service for connection pooling.\",\n-                                \"displayName\": \"Client Service\",\n+                            \"proxy-configuration-service\": {\n+                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests. Supported proxies: HTTP + AuthN\",\n+                                \"displayName\": \"Proxy Configuration Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"mongo-client-service\",\n+                                \"name\": \"proxy-configuration-service\",\n                                 \"required\": false,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-mongodb-client-service-api-nar\",\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.mongodb.MongoDBClientService\",\n+                                    \"type\": \"org.apache.nifi.proxy.ProxyConfigurationService\",\n                                     \"version\": \"1.27.0\"\n                                 }\n-                            },\n-                            \"mongo-query-attribute\": {\n-                                \"description\": \"If set, the query will be written to a specified attribute on the output flowfiles.\",\n-                                \"displayName\": \"Query Output Attribute\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"mongo-query-attribute\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"mongodb-schema-name\": {\n-                                \"defaultValue\": \"${schema.name}\",\n-                                \"description\": \"The name of the schema in the configured schema registry to use for the query results.\",\n-                                \"displayName\": \"Schema Name\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"mongodb-schema-name\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n                             }\n                         },\n+                        \"readsAttributes\": [\n+                            {\n+                                \"description\": \"Uses the FlowFile's filename as the filename for the Google Drive object.\",\n+                                \"name\": \"filename\"\n+                            }\n+                        ],\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.processors.gcp.drive.FetchGoogleDrive\",\n+                            \"org.apache.nifi.processors.gcp.drive.ListGoogleDrive\"\n+                        ],\n                         \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"All FlowFiles that have the results of a successful query execution go here.\",\n+                                \"description\": \"Files that have been successfully written to Google Drive are transferred to this relationship.\",\n                                 \"name\": \"success\"\n                             },\n                             {\n-                                \"description\": \"All input FlowFiles that are part of a failed query execution go here.\",\n+                                \"description\": \"Files that could not be written to Google Drive for some reason are transferred to this relationship.\",\n                                 \"name\": \"failure\"\n-                            },\n-                            {\n-                                \"description\": \"All input FlowFiles that are part of a successful query execution go here.\",\n-                                \"name\": \"original\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n                         \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"fetch\",\n-                            \"get\",\n-                            \"json\",\n-                            \"mongo\",\n-                            \"mongodb\",\n-                            \"record\"\n+                            \"drive\",\n+                            \"google\",\n+                            \"put\",\n+                            \"storage\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.mongodb.GetMongoRecord\",\n-                        \"typeDescription\": \"A record-based version of GetMongo that uses the Record writers to write the MongoDB result set.\",\n+                        \"type\": \"org.apache.nifi.processors.gcp.drive.PutGoogleDrive\",\n+                        \"typeDescription\": \"Writes the contents of a FlowFile as a file in Google Drive.\",\n                         \"version\": \"1.27.0\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"The database where the results came from.\",\n-                                \"name\": \"mongo.database.name\"\n+                                \"description\": \"The id of the file\",\n+                                \"name\": \"drive.id\"\n                             },\n                             {\n-                                \"description\": \"The collection where the results came from.\",\n-                                \"name\": \"mongo.collection.name\"\n+                                \"description\": \"The name of the file\",\n+                                \"name\": \"filename\"\n+                            },\n+                            {\n+                                \"description\": \"The MIME type of the file\",\n+                                \"name\": \"mime.type\"\n+                            },\n+                            {\n+                                \"description\": \"The size of the file\",\n+                                \"name\": \"drive.size\"\n+                            },\n+                            {\n+                                \"description\": \"The last modified time or created time (whichever is greater) of the file. The reason for this is that the original modified date of a file is preserved when uploaded to Google Drive. 'Created time' takes the time when the upload occurs. However uploaded files can still be modified later.\",\n+                                \"name\": \"drive.timestamp\"\n+                            },\n+                            {\n+                                \"description\": \"The error code returned by Google Drive\",\n+                                \"name\": \"error.code\"\n+                            },\n+                            {\n+                                \"description\": \"The error message returned by Google Drive\",\n+                                \"name\": \"error.message\"\n                             }\n                         ]\n                     },\n                     {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-mongodb-nar\",\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-gcp-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n-                            \"EVENT_DRIVEN\": 0,\n                             \"TIMER_DRIVEN\": 1\n                         },\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_REQUIRED\",\n+                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Character Set\": {\n-                                \"defaultValue\": \"UTF-8\",\n-                                \"description\": \"The Character Set in which the data is encoded\",\n-                                \"displayName\": \"Character Set\",\n+                            \"GCP Credentials Provider Service\": {\n+                                \"description\": \"The Controller Service used to obtain Google Cloud Platform credentials.\",\n+                                \"displayName\": \"GCP Credentials Provider Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Character Set\",\n+                                \"name\": \"GCP Credentials Provider Service\",\n                                 \"required\": true,\n-                                \"sensitive\": false\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-gcp-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.gcp.credentials.service.GCPCredentialsService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n                             },\n-                            \"Mode\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"insert\",\n-                                        \"value\": \"insert\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"update\",\n-                                        \"value\": \"update\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"insert\",\n-                                \"description\": \"Indicates whether the processor should insert or update content\",\n-                                \"displayName\": \"Mode\",\n+                            \"api-endpoint\": {\n+                                \"defaultValue\": \"pubsub.googleapis.com:443\",\n+                                \"description\": \"Override the gRPC endpoint in the form of [host:port]\",\n+                                \"displayName\": \"API Endpoint\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Mode\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"api-endpoint\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Mongo Collection Name\": {\n-                                \"description\": \"The name of the collection to use\",\n-                                \"displayName\": \"Mongo Collection Name\",\n+                            \"gcp-project-id\": {\n+                                \"description\": \"Google Cloud Project ID\",\n+                                \"displayName\": \"Project ID\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Mongo Collection Name\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"gcp-project-id\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Mongo Database Name\": {\n-                                \"description\": \"The name of the database to use\",\n-                                \"displayName\": \"Mongo Database Name\",\n+                            \"gcp-pubsub-publish-batch-size\": {\n+                                \"defaultValue\": \"15\",\n+                                \"description\": \"Indicates the number of messages the cloud service should bundle together in a batch. If not set and left empty, only one message will be used in a batch\",\n+                                \"displayName\": \"Batch Size Threshold\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Mongo Database Name\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"gcp-pubsub-publish-batch-size\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Mongo URI\": {\n-                                \"description\": \"MongoURI, typically of the form: mongodb://host1[:port1][,host2[:port2],...]\",\n-                                \"displayName\": \"Mongo URI\",\n+                            \"gcp-pubsub-subscription\": {\n+                                \"description\": \"Name of the Google Cloud Pub/Sub Subscription\",\n+                                \"displayName\": \"Subscription\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Mongo URI\",\n-                                \"required\": false,\n+                                \"name\": \"gcp-pubsub-subscription\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Update Query Key\": {\n-                                \"description\": \"Key name used to build the update query criteria; this property is valid only when using update mode, otherwise it is ignored. Example: _id\",\n-                                \"displayName\": \"Update Query Key\",\n+                            \"proxy-configuration-service\": {\n+                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests. If set, it supersedes proxy settings configured per component. Supported proxies: HTTP + AuthN\",\n+                                \"displayName\": \"Proxy Configuration Service\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Update Query Key\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"proxy-configuration-service\",\n                                 \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.proxy.ProxyConfigurationService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            }\n+                        },\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.processors.gcp.pubsub.PublishGCPubSub\"\n+                        ],\n+                        \"sideEffectFree\": false,\n+                        \"supportedRelationships\": [\n+                            {\n+                                \"description\": \"FlowFiles are routed to this relationship after a successful Google Cloud Pub/Sub operation.\",\n+                                \"name\": \"success\"\n+                            }\n+                        ],\n+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\"\n+                        ],\n+                        \"supportsBatching\": false,\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicRelationships\": false,\n+                        \"supportsEventDriven\": false,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"consume\",\n+                            \"gcp\",\n+                            \"google\",\n+                            \"google-cloud\",\n+                            \"message\",\n+                            \"pubsub\"\n+                        ],\n+                        \"triggerSerially\": false,\n+                        \"triggerWhenAnyDestinationAvailable\": false,\n+                        \"triggerWhenEmpty\": false,\n+                        \"type\": \"org.apache.nifi.processors.gcp.pubsub.ConsumeGCPubSub\",\n+                        \"typeDescription\": \"Consumes message from the configured Google Cloud PubSub subscription. If the 'Batch Size' is set, the configured number of messages will be pulled in a single request, else only one message will be pulled.\",\n+                        \"version\": \"1.27.0\",\n+                        \"writesAttributes\": [\n+                            {\n+                                \"description\": \"Acknowledgement Id of the consumed Google Cloud PubSub message\",\n+                                \"name\": \"gcp.pubsub.ackId\"\n+                            },\n+                            {\n+                                \"description\": \"Serialized size of the consumed Google Cloud PubSub message\",\n+                                \"name\": \"gcp.pubsub.messageSize\"\n+                            },\n+                            {\n+                                \"description\": \"Number of attributes the consumed PubSub message has, if any\",\n+                                \"name\": \"gcp.pubsub.attributesCount\"\n+                            },\n+                            {\n+                                \"description\": \"Timestamp value when the message was published\",\n+                                \"name\": \"gcp.pubsub.publishTime\"\n+                            },\n+                            {\n+                                \"description\": \"Other than the listed attributes, this processor may write zero or more attributes, if the original Google Cloud Publisher client added any attributes to the message while sending\",\n+                                \"name\": \"Dynamic Attributes\"\n+                            }\n+                        ]\n+                    },\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-gcp-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"e0c4461\"\n+                        },\n+                        \"defaultBulletinLevel\": \"WARN\",\n+                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": 1,\n+                            \"TIMER_DRIVEN\": 1\n+                        },\n+                        \"defaultPenaltyDuration\": \"30 sec\",\n+                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": \"* * * * * ?\",\n+                            \"TIMER_DRIVEN\": \"0 sec\"\n+                        },\n+                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n+                        \"defaultYieldDuration\": \"1 sec\",\n+                        \"dynamicProperties\": [\n+                            {\n+                                \"description\": \"Attributes to be set for the outgoing Google Cloud PubSub message\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"name\": \"Attribute name\",\n+                                \"value\": \"Value to be set to the attribute\"\n+                            }\n+                        ],\n+                        \"group\": \"org.apache.nifi\",\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n+                        \"primaryNodeOnly\": false,\n+                        \"propertyDescriptors\": {\n+                            \"GCP Credentials Provider Service\": {\n+                                \"description\": \"The Controller Service used to obtain Google Cloud Platform credentials.\",\n+                                \"displayName\": \"GCP Credentials Provider Service\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"GCP Credentials Provider Service\",\n+                                \"required\": true,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-gcp-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.gcp.credentials.service.GCPCredentialsService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"Input Batch Size\": {\n+                                \"defaultValue\": \"100\",\n+                                \"description\": \"Maximum number of FlowFiles processed for each Processor invocation\",\n+                                \"displayName\": \"Input Batch Size\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Input Batch Size\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Upsert\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n+                            \"Maximum Message Size\": {\n+                                \"defaultValue\": \"1 MB\",\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"dependentValues\": [\n+                                            \"FLOWFILE_ORIENTED\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Message Derivation Strategy\",\n+                                        \"propertyName\": \"Message Derivation Strategy\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"When true, inserts a document if no document matches the update query criteria; this property is valid only when using update mode, otherwise it is ignored\",\n-                                \"displayName\": \"Upsert\",\n+                                \"description\": \"The maximum size of a Google PubSub message in bytes. Defaults to 1 MB (1048576 bytes)\",\n+                                \"displayName\": \"Maximum Message Size\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Upsert\",\n+                                \"name\": \"Maximum Message Size\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Write Concern\": {\n+                            \"Message Derivation Strategy\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"ACKNOWLEDGED\",\n-                                        \"value\": \"ACKNOWLEDGED\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"UNACKNOWLEDGED\",\n-                                        \"value\": \"UNACKNOWLEDGED\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"FSYNCED\",\n-                                        \"value\": \"FSYNCED\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"JOURNALED\",\n-                                        \"value\": \"JOURNALED\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"REPLICA_ACKNOWLEDGED\",\n-                                        \"value\": \"REPLICA_ACKNOWLEDGED\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"MAJORITY\",\n-                                        \"value\": \"MAJORITY\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"W1\",\n-                                        \"value\": \"W1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"W2\",\n-                                        \"value\": \"W2\"\n+                                        \"description\": \"Each incoming FlowFile is sent as a Google Cloud PubSub message\",\n+                                        \"displayName\": \"FlowFile Oriented\",\n+                                        \"value\": \"FLOWFILE_ORIENTED\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"W3\",\n-                                        \"value\": \"W3\"\n+                                        \"description\": \"Each incoming FlowFile is parsed into NiFi records, which are each sent as a Google Cloud PubSub message\",\n+                                        \"displayName\": \"Record Oriented\",\n+                                        \"value\": \"RECORD_ORIENTED\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"ACKNOWLEDGED\",\n-                                \"description\": \"The write concern to use\",\n-                                \"displayName\": \"Write Concern\",\n+                                \"defaultValue\": \"FLOWFILE_ORIENTED\",\n+                                \"description\": \"The strategy used to publish the incoming FlowFile to the Google Cloud PubSub endpoint.\",\n+                                \"displayName\": \"Message Derivation Strategy\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Write Concern\",\n+                                \"name\": \"Message Derivation Strategy\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"mongo-client-service\": {\n-                                \"description\": \"If configured, this property will use the assigned client service for connection pooling.\",\n-                                \"displayName\": \"Client Service\",\n+                            \"Record Reader\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"RECORD_ORIENTED\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Message Derivation Strategy\",\n+                                        \"propertyName\": \"Message Derivation Strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"The Record Reader to use for incoming FlowFiles\",\n+                                \"displayName\": \"Record Reader\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"mongo-client-service\",\n-                                \"required\": false,\n+                                \"name\": \"Record Reader\",\n+                                \"required\": true,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-mongodb-client-service-api-nar\",\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.mongodb.MongoDBClientService\",\n+                                    \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             },\n-                            \"put-mongo-update-mode\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"With whole document\",\n-                                        \"value\": \"doc\"\n-                                    },\n+                            \"Record Writer\": {\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"With operators enabled\",\n-                                        \"value\": \"operators\"\n+                                        \"dependentValues\": [\n+                                            \"RECORD_ORIENTED\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Message Derivation Strategy\",\n+                                        \"propertyName\": \"Message Derivation Strategy\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"doc\",\n-                                \"description\": \"Choose an update mode. You can either supply a JSON document to use as a direct replacement or specify a document that contains update operators like $set, $unset, and $inc. When Operators mode is enabled, the flowfile content is expected to be the operator part for example: {$set:{\\\"key\\\": \\\"value\\\"},$inc:{\\\"count\\\":1234}} and the update query will come from the configured Update Query property.\",\n-                                \"displayName\": \"Update Mode\",\n+                                \"description\": \"The Record Writer to use in order to serialize the data before sending to GCPubSub endpoint\",\n+                                \"displayName\": \"Record Writer\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"put-mongo-update-mode\",\n+                                \"name\": \"Record Writer\",\n+                                \"required\": true,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"api-endpoint\": {\n+                                \"defaultValue\": \"pubsub.googleapis.com:443\",\n+                                \"description\": \"Override the gRPC endpoint in the form of [host:port]\",\n+                                \"displayName\": \"API Endpoint\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"api-endpoint\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"putmongo-update-query\": {\n-                                \"description\": \"Specify a full MongoDB query to be used for the lookup query to do an update/upsert.\",\n-                                \"displayName\": \"Update Query\",\n+                            \"gcp-batch-bytes\": {\n+                                \"defaultValue\": \"3 MB\",\n+                                \"description\": \"Publish request gets triggered based on this Batch Bytes Threshold property and the Batch Size Threshold property, whichever condition is met first.\",\n+                                \"displayName\": \"Batch Bytes Threshold\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"putmongo-update-query\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"gcp-batch-bytes\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"gcp-project-id\": {\n+                                \"description\": \"Google Cloud Project ID\",\n+                                \"displayName\": \"Project ID\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"gcp-project-id\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"ssl-client-auth\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"WANT\",\n-                                        \"value\": \"WANT\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"REQUIRED\",\n-                                        \"value\": \"REQUIRED\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"NONE\",\n-                                        \"value\": \"NONE\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"REQUIRED\",\n-                                \"description\": \"Client authentication policy when connecting to secure (TLS/SSL) cluster. Possible values are REQUIRED, WANT, NONE. This property is only used when an SSL Context has been defined and enabled.\",\n-                                \"displayName\": \"Client Auth\",\n+                            \"gcp-pubsub-publish-batch-delay\": {\n+                                \"defaultValue\": \"100 millis\",\n+                                \"description\": \"Indicates the delay threshold to use for batching. After this amount of time has elapsed (counting from the first element added), the elements will be wrapped up in a batch and sent. This value should not be set too high, usually on the order of milliseconds. Otherwise, calls might appear to never complete.\",\n+                                \"displayName\": \"Batch Delay Threshold\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"ssl-client-auth\",\n-                                \"required\": false,\n+                                \"name\": \"gcp-pubsub-publish-batch-delay\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"ssl-context-service\": {\n-                                \"description\": \"The SSL Context Service used to provide client certificate information for TLS/SSL connections.\",\n-                                \"displayName\": \"SSL Context Service\",\n+                            \"gcp-pubsub-publish-batch-size\": {\n+                                \"defaultValue\": \"15\",\n+                                \"description\": \"Indicates the number of messages the cloud service should bundle together in a batch. If not set and left empty, only one message will be used in a batch\",\n+                                \"displayName\": \"Batch Size Threshold\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"ssl-context-service\",\n+                                \"name\": \"gcp-pubsub-publish-batch-size\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"gcp-pubsub-topic\": {\n+                                \"description\": \"Name of the Google Cloud PubSub Topic\",\n+                                \"displayName\": \"Topic Name\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"gcp-pubsub-topic\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"proxy-configuration-service\": {\n+                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests. If set, it supersedes proxy settings configured per component. Supported proxies: HTTP + AuthN\",\n+                                \"displayName\": \"Proxy Configuration Service\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"proxy-configuration-service\",\n                                 \"required\": false,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n                                     \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n+                                    \"type\": \"org.apache.nifi.proxy.ProxyConfigurationService\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             }\n                         },\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.processors.gcp.pubsub.ConsumeGCPubSub\"\n+                        ],\n                         \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"All FlowFiles that are written to MongoDB are routed to this relationship\",\n+                                \"description\": \"FlowFiles are routed to this relationship if the Google Cloud Pub/Sub operation fails but attempting the operation again may succeed.\",\n+                                \"name\": \"retry\"\n+                            },\n+                            {\n+                                \"description\": \"FlowFiles are routed to this relationship after a successful Google Cloud Pub/Sub operation.\",\n                                 \"name\": \"success\"\n                             },\n                             {\n-                                \"description\": \"All FlowFiles that cannot be written to MongoDB are routed to this relationship\",\n+                                \"description\": \"FlowFiles are routed to this relationship if the Google Cloud Pub/Sub operation fails.\",\n                                 \"name\": \"failure\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\",\n-                            \"EVENT_DRIVEN\"\n+                            \"CRON_DRIVEN\"\n                         ],\n                         \"supportsBatching\": false,\n-                        \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicProperties\": true,\n                         \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": true,\n+                        \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"systemResourceConsiderations\": [\n                             {\n-                                \"description\": \"An instance of this component can cause high usage of this system resource.  Multiple instances or high concurrency settings may result a degradation of performance.\",\n+                                \"description\": \"The entirety of the FlowFile's content will be read into memory to be sent as a PubSub message.\",\n                                 \"resource\": \"MEMORY\"\n                             }\n                         ],\n                         \"tags\": [\n-                            \"insert\",\n-                            \"mongodb\",\n-                            \"put\",\n-                            \"update\",\n-                            \"write\"\n+                            \"gcp\",\n+                            \"google\",\n+                            \"google-cloud\",\n+                            \"message\",\n+                            \"publish\",\n+                            \"pubsub\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.mongodb.PutMongo\",\n-                        \"typeDescription\": \"Writes the contents of a FlowFile to MongoDB\",\n-                        \"version\": \"1.27.0\"\n+                        \"type\": \"org.apache.nifi.processors.gcp.pubsub.PublishGCPubSub\",\n+                        \"typeDescription\": \"Publishes the content of the incoming flowfile to the configured Google Cloud PubSub topic. The processor supports dynamic properties. If any dynamic properties are present, they will be sent along with the message in the form of 'attributes'.\",\n+                        \"version\": \"1.27.0\",\n+                        \"writesAttributes\": [\n+                            {\n+                                \"description\": \"ID of the pubsub message published to the configured Google Cloud PubSub topic\",\n+                                \"name\": \"gcp.pubsub.messageId\"\n+                            },\n+                            {\n+                                \"description\": \"Count of pubsub messages published to the configured Google Cloud PubSub topic\",\n+                                \"name\": \"gcp.pubsub.count.records\"\n+                            },\n+                            {\n+                                \"description\": \"Name of the Google Cloud PubSub topic the message was published to\",\n+                                \"name\": \"gcp.pubsub.topic\"\n+                            }\n+                        ]\n                     },\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-mongodb-nar\",\n+                        \"artifact\": \"nifi-gcp-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n-                            \"EVENT_DRIVEN\": 0,\n                             \"TIMER_DRIVEN\": 1\n                         },\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_REQUIRED\",\n+                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Mongo Collection Name\": {\n-                                \"description\": \"The name of the collection to use\",\n-                                \"displayName\": \"Mongo Collection Name\",\n+                            \"GCP Credentials Provider Service\": {\n+                                \"description\": \"The Controller Service used to obtain Google Cloud Platform credentials.\",\n+                                \"displayName\": \"GCP Credentials Provider Service\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Mongo Collection Name\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"GCP Credentials Provider Service\",\n                                 \"required\": true,\n-                                \"sensitive\": false\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-gcp-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.gcp.credentials.service.GCPCredentialsService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n                             },\n-                            \"Mongo Database Name\": {\n-                                \"description\": \"The name of the database to use\",\n-                                \"displayName\": \"Mongo Database Name\",\n+                            \"gcp-bytes-outstanding\": {\n+                                \"defaultValue\": \"10 MB\",\n+                                \"description\": \"The number of quota bytes that may be outstanding to the client.\",\n+                                \"displayName\": \"Bytes Outstanding\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Mongo Database Name\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"gcp-bytes-outstanding\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Mongo URI\": {\n-                                \"description\": \"MongoURI, typically of the form: mongodb://host1[:port1][,host2[:port2],...]\",\n-                                \"displayName\": \"Mongo URI\",\n+                            \"gcp-messages-outstanding\": {\n+                                \"defaultValue\": \"1000\",\n+                                \"description\": \"The number of messages that may be outstanding to the client.\",\n+                                \"displayName\": \"Messages Outstanding\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Mongo URI\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Write Concern\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"ACKNOWLEDGED\",\n-                                        \"value\": \"ACKNOWLEDGED\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"UNACKNOWLEDGED\",\n-                                        \"value\": \"UNACKNOWLEDGED\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"FSYNCED\",\n-                                        \"value\": \"FSYNCED\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"JOURNALED\",\n-                                        \"value\": \"JOURNALED\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"REPLICA_ACKNOWLEDGED\",\n-                                        \"value\": \"REPLICA_ACKNOWLEDGED\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"MAJORITY\",\n-                                        \"value\": \"MAJORITY\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"W1\",\n-                                        \"value\": \"W1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"W2\",\n-                                        \"value\": \"W2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"W3\",\n-                                        \"value\": \"W3\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"ACKNOWLEDGED\",\n-                                \"description\": \"The write concern to use\",\n-                                \"displayName\": \"Write Concern\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Write Concern\",\n+                                \"name\": \"gcp-messages-outstanding\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"bypass-validation\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"True\",\n-                                        \"value\": \"True\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"False\",\n-                                        \"value\": \"False\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"True\",\n-                                \"description\": \"Bypass schema validation during insert/upsert\",\n-                                \"displayName\": \"Bypass Validation\",\n+                            \"gcp-pubsub-subscription\": {\n+                                \"description\": \"Name of the Google Cloud Pub/Sub Subscription. Example: projects/8476107443/locations/europe-west1-d/subscriptions/my-lite-subscription\",\n+                                \"displayName\": \"Subscription\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"bypass-validation\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"gcp-pubsub-subscription\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n+                            }\n+                        },\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.processors.gcp.pubsub.lite.PublishGCPubSubLite\"\n+                        ],\n+                        \"sideEffectFree\": false,\n+                        \"supportedRelationships\": [\n+                            {\n+                                \"description\": \"FlowFiles are routed to this relationship after a successful Google Cloud Pub/Sub operation.\",\n+                                \"name\": \"success\"\n+                            }\n+                        ],\n+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\"\n+                        ],\n+                        \"supportsBatching\": false,\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicRelationships\": false,\n+                        \"supportsEventDriven\": false,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"consume\",\n+                            \"gcp\",\n+                            \"google\",\n+                            \"google-cloud\",\n+                            \"lite\",\n+                            \"message\",\n+                            \"pubsub\"\n+                        ],\n+                        \"triggerSerially\": false,\n+                        \"triggerWhenAnyDestinationAvailable\": false,\n+                        \"triggerWhenEmpty\": false,\n+                        \"type\": \"org.apache.nifi.processors.gcp.pubsub.lite.ConsumeGCPubSubLite\",\n+                        \"typeDescription\": \"Consumes message from the configured Google Cloud PubSub Lite subscription.\",\n+                        \"version\": \"1.27.0\",\n+                        \"writesAttributes\": [\n+                            {\n+                                \"description\": \"ID of the pubsub message published to the configured Google Cloud PubSub topic\",\n+                                \"name\": \"gcp.pubsub.messageId\"\n                             },\n-                            \"insert_count\": {\n-                                \"defaultValue\": \"100\",\n-                                \"description\": \"The number of records to group together for one single insert/upsert operation against MongoDB.\",\n-                                \"displayName\": \"Batch Size\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"insert_count\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n+                            {\n+                                \"description\": \"If non-empty, identifies related messages for which publish order should be respected. If a 'Subscription' has 'enable_message_ordering' set to 'true', messages published with the same non-empty 'ordering_key' value will be delivered to subscribers in the order in which they are received by the Pub/Sub system. All 'PubsubMessage's published in a given 'PublishRequest' must specify the same 'ordering_key' value.\",\n+                                \"name\": \"gcp.pubsub.ordering.key\"\n                             },\n-                            \"mongo-client-service\": {\n-                                \"description\": \"If configured, this property will use the assigned client service for connection pooling.\",\n-                                \"displayName\": \"Client Service\",\n+                            {\n+                                \"description\": \"Number of attributes the consumed PubSub message has, if any\",\n+                                \"name\": \"gcp.pubsub.attributesCount\"\n+                            },\n+                            {\n+                                \"description\": \"Timestamp value when the message was published\",\n+                                \"name\": \"gcp.pubsub.publishTime\"\n+                            },\n+                            {\n+                                \"description\": \"Other than the listed attributes, this processor may write zero or more attributes, if the original Google Cloud Publisher client added any attributes to the message while sending\",\n+                                \"name\": \"Dynamic Attributes\"\n+                            }\n+                        ]\n+                    },\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-gcp-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"e0c4461\"\n+                        },\n+                        \"defaultBulletinLevel\": \"WARN\",\n+                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": 1,\n+                            \"TIMER_DRIVEN\": 1\n+                        },\n+                        \"defaultPenaltyDuration\": \"30 sec\",\n+                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": \"* * * * * ?\",\n+                            \"TIMER_DRIVEN\": \"0 sec\"\n+                        },\n+                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n+                        \"defaultYieldDuration\": \"1 sec\",\n+                        \"dynamicProperties\": [\n+                            {\n+                                \"description\": \"Attributes to be set for the outgoing Google Cloud PubSub Lite message\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"name\": \"Attribute name\",\n+                                \"value\": \"Value to be set to the attribute\"\n+                            }\n+                        ],\n+                        \"group\": \"org.apache.nifi\",\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n+                        \"primaryNodeOnly\": false,\n+                        \"propertyDescriptors\": {\n+                            \"GCP Credentials Provider Service\": {\n+                                \"description\": \"The Controller Service used to obtain Google Cloud Platform credentials.\",\n+                                \"displayName\": \"GCP Credentials Provider Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"mongo-client-service\",\n-                                \"required\": false,\n+                                \"name\": \"GCP Credentials Provider Service\",\n+                                \"required\": true,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-mongodb-client-service-api-nar\",\n+                                    \"artifact\": \"nifi-gcp-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.mongodb.MongoDBClientService\",\n+                                    \"type\": \"org.apache.nifi.gcp.credentials.service.GCPCredentialsService\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             },\n-                            \"ordered\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"True\",\n-                                        \"value\": \"True\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"False\",\n-                                        \"value\": \"False\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"False\",\n-                                \"description\": \"Perform ordered or unordered operations\",\n-                                \"displayName\": \"Ordered\",\n+                            \"gcp-batch-bytes\": {\n+                                \"defaultValue\": \"3 MB\",\n+                                \"description\": \"Publish request gets triggered based on this Batch Bytes Threshold property and the Batch Size Threshold property, whichever condition is met first.\",\n+                                \"displayName\": \"Batch Bytes Threshold\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"ordered\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"gcp-batch-bytes\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"record-reader\": {\n-                                \"description\": \"Specifies the Controller Service to use for parsing incoming data and determining the data's schema\",\n-                                \"displayName\": \"Record Reader\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"record-reader\",\n-                                \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            },\n-                            \"ssl-client-auth\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"WANT\",\n-                                        \"value\": \"WANT\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"REQUIRED\",\n-                                        \"value\": \"REQUIRED\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"NONE\",\n-                                        \"value\": \"NONE\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"REQUIRED\",\n-                                \"description\": \"Client authentication policy when connecting to secure (TLS/SSL) cluster. Possible values are REQUIRED, WANT, NONE. This property is only used when an SSL Context has been defined and enabled.\",\n-                                \"displayName\": \"Client Auth\",\n+                            \"gcp-ordering-key\": {\n+                                \"description\": \"Messages with the same ordering key will always get published to the same partition. When this property is not set, messages can get published to different partitions if more than one partition exists for the topic.\",\n+                                \"displayName\": \"Ordering Key\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"ssl-client-auth\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"gcp-ordering-key\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"ssl-context-service\": {\n-                                \"description\": \"The SSL Context Service used to provide client certificate information for TLS/SSL connections.\",\n-                                \"displayName\": \"SSL Context Service\",\n+                            \"gcp-pubsub-publish-batch-delay\": {\n+                                \"defaultValue\": \"100 millis\",\n+                                \"description\": \"Indicates the delay threshold to use for batching. After this amount of time has elapsed (counting from the first element added), the elements will be wrapped up in a batch and sent. This value should not be set too high, usually on the order of milliseconds. Otherwise, calls might appear to never complete.\",\n+                                \"displayName\": \"Batch Delay Threshold\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"ssl-context-service\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n+                                \"name\": \"gcp-pubsub-publish-batch-delay\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n                             },\n-                            \"update-key-fields\": {\n-                                \"description\": \"Comma separated list of fields based on which to identify documents that need to be updated. If this property is set NiFi will attempt an upsert operation on all documents. If this property is not set all documents will be inserted.\",\n-                                \"displayName\": \"Update Key Fields\",\n+                            \"gcp-pubsub-publish-batch-size\": {\n+                                \"defaultValue\": \"15\",\n+                                \"description\": \"Indicates the number of messages the cloud service should bundle together in a batch. If not set and left empty, only one message will be used in a batch\",\n+                                \"displayName\": \"Batch Size Threshold\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"update-key-fields\",\n-                                \"required\": false,\n+                                \"name\": \"gcp-pubsub-publish-batch-size\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"update-mode\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"Updates only the first document that matches the query.\",\n-                                        \"displayName\": \"Update One\",\n-                                        \"value\": \"one\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Updates every document that matches the query.\",\n-                                        \"displayName\": \"Update Many\",\n-                                        \"value\": \"many\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Use the value of the 'mongodb.update.mode' attribute of the incoming flowfile. Acceptable values are 'one' and 'many'.\",\n-                                        \"displayName\": \"Use 'mongodb.update.mode' flowfile attribute.\",\n-                                        \"value\": \"flowfile-attribute\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"one\",\n-                                \"dependencies\": [\n-                                    {\n-                                        \"propertyDisplayName\": \"Update Key Fields\",\n-                                        \"propertyName\": \"update-key-fields\"\n-                                    }\n-                                ],\n-                                \"description\": \"Choose between updating a single document or multiple documents per incoming record.\",\n-                                \"displayName\": \"Update Mode\",\n+                            \"gcp-pubsub-topic\": {\n+                                \"description\": \"Name of the Google Cloud PubSub Topic. Example: projects/8476107443/locations/europe-west1-d/topics/my-lite-topic\",\n+                                \"displayName\": \"Topic Name\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"update-mode\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"gcp-pubsub-topic\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             }\n                         },\n-                        \"readsAttributes\": [\n-                            {\n-                                \"description\": \"Configurable parameter for controlling update mode on a per-flowfile basis. Acceptable values are 'one' and 'many' and controls whether a single incoming record should update a single or multiple Mongo documents.\",\n-                                \"name\": \"mongodb.update.mode\"\n-                            }\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.processors.gcp.pubsub.lite.ConsumeGCPubSubLite\"\n                         ],\n                         \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"All FlowFiles that are written to MongoDB are routed to this relationship\",\n+                                \"description\": \"FlowFiles are routed to this relationship after a successful Google Cloud Pub/Sub operation.\",\n                                 \"name\": \"success\"\n                             },\n                             {\n-                                \"description\": \"All FlowFiles that cannot be written to MongoDB are routed to this relationship\",\n+                                \"description\": \"FlowFiles are routed to this relationship if the Google Cloud Pub/Sub operation fails.\",\n                                 \"name\": \"failure\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\",\n-                            \"EVENT_DRIVEN\"\n+                            \"CRON_DRIVEN\"\n                         ],\n                         \"supportsBatching\": false,\n-                        \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicProperties\": true,\n                         \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": true,\n+                        \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n+                        \"systemResourceConsiderations\": [\n+                            {\n+                                \"description\": \"The entirety of the FlowFile's content will be read into memory to be sent as a PubSub message.\",\n+                                \"resource\": \"MEMORY\"\n+                            }\n+                        ],\n                         \"tags\": [\n-                            \"insert\",\n-                            \"mongodb\",\n-                            \"put\",\n-                            \"record\",\n-                            \"update\",\n-                            \"upsert\"\n+                            \"gcp\",\n+                            \"google\",\n+                            \"google-cloud\",\n+                            \"lite\",\n+                            \"message\",\n+                            \"publish\",\n+                            \"pubsub\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.mongodb.PutMongoRecord\",\n-                        \"typeDescription\": \"This processor is a record-aware processor for inserting/upserting data into MongoDB. It uses a configured record reader and schema to read an incoming record set from the body of a flowfile and then inserts/upserts batches of those records into a configured MongoDB collection. This processor does not support deletes. The number of documents to insert/upsert at a time is controlled by the \\\"Batch Size\\\" configuration property. This value should be set to a reasonable size to ensure that MongoDB is not overloaded with too many operations at once.\",\n-                        \"version\": \"1.27.0\"\n+                        \"type\": \"org.apache.nifi.processors.gcp.pubsub.lite.PublishGCPubSubLite\",\n+                        \"typeDescription\": \"Publishes the content of the incoming FlowFile to the configured Google Cloud PubSub Lite topic. The processor supports dynamic properties. If any dynamic properties are present, they will be sent along with the message in the form of 'attributes'.\",\n+                        \"version\": \"1.27.0\",\n+                        \"writesAttributes\": [\n+                            {\n+                                \"description\": \"ID of the pubsub message published to the configured Google Cloud PubSub topic\",\n+                                \"name\": \"gcp.pubsub.messageId\"\n+                            },\n+                            {\n+                                \"description\": \"Name of the Google Cloud PubSub topic the message was published to\",\n+                                \"name\": \"gcp.pubsub.topic\"\n+                            }\n+                        ]\n                     },\n                     {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-mongodb-nar\",\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-gcp-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n-                            \"EVENT_DRIVEN\": 0,\n                             \"TIMER_DRIVEN\": 1\n                         },\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_ALLOWED\",\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Batch Size\": {\n-                                \"defaultValue\": \"100\",\n-                                \"description\": \"The number of elements returned from the server in one batch.\",\n-                                \"displayName\": \"Batch Size\",\n+                            \"GCP Credentials Provider Service\": {\n+                                \"description\": \"The Controller Service used to obtain Google Cloud Platform credentials.\",\n+                                \"displayName\": \"GCP Credentials Provider Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Batch Size\",\n+                                \"name\": \"GCP Credentials Provider Service\",\n+                                \"required\": true,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-gcp-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.gcp.credentials.service.GCPCredentialsService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"gcp-project-id\": {\n+                                \"description\": \"Google Cloud Project ID\",\n+                                \"displayName\": \"Project ID\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"gcp-project-id\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Mongo Collection Name\": {\n-                                \"description\": \"The name of the collection to use\",\n-                                \"displayName\": \"Mongo Collection Name\",\n+                            \"gcp-proxy-host\": {\n+                                \"description\": \"IP or hostname of the proxy to be used.\\n You might need to set the following properties in bootstrap for https proxy usage:\\n-Djdk.http.auth.tunneling.disabledSchemes=\\n-Djdk.http.auth.proxying.disabledSchemes=\",\n+                                \"displayName\": \"Proxy host\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Mongo Collection Name\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"gcp-proxy-host\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Mongo Database Name\": {\n-                                \"description\": \"The name of the database to use\",\n-                                \"displayName\": \"Mongo Database Name\",\n+                            \"gcp-proxy-port\": {\n+                                \"description\": \"Proxy port number\",\n+                                \"displayName\": \"Proxy port\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Mongo Database Name\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"gcp-proxy-port\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Mongo URI\": {\n-                                \"description\": \"MongoURI, typically of the form: mongodb://host1[:port1][,host2[:port2],...]\",\n-                                \"displayName\": \"Mongo URI\",\n+                            \"gcp-proxy-user-name\": {\n+                                \"description\": \"HTTP Proxy Username\",\n+                                \"displayName\": \"HTTP Proxy Username\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Mongo URI\",\n+                                \"name\": \"gcp-proxy-user-name\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"allow-disk-use\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"Set this to true to enable writing data to temporary files to prevent exceeding the maximum memory use limit during aggregation pipeline staged when handling large datasets.\",\n-                                \"displayName\": \"Allow Disk Use\",\n+                            \"gcp-proxy-user-password\": {\n+                                \"description\": \"HTTP Proxy Password\",\n+                                \"displayName\": \"HTTP Proxy Password\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"allow-disk-use\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"gcp-proxy-user-password\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n                             },\n-                            \"json-type\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"Use MongoDB's \\\"extended JSON\\\". This is the JSON generated with toJson() on a MongoDB Document from the Java driver\",\n-                                        \"displayName\": \"Extended JSON\",\n-                                        \"value\": \"Extended\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Generate a JSON document that conforms to typical JSON conventions instead of Mongo-specific conventions.\",\n-                                        \"displayName\": \"Standard JSON\",\n-                                        \"value\": \"Standard\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"Extended\",\n-                                \"description\": \"By default, MongoDB's Java driver returns \\\"extended JSON\\\". Some of the features of this variant of JSON may cause problems for other JSON parsers that expect only standard JSON types and conventions. This configuration setting  controls whether to use extended JSON or provide a clean view that conforms to standard JSON.\",\n-                                \"displayName\": \"JSON Type\",\n+                            \"gcp-retry-count\": {\n+                                \"defaultValue\": \"6\",\n+                                \"description\": \"How many retry attempts should be made before routing to the failure relationship.\",\n+                                \"displayName\": \"Number of retries\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"json-type\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"mongo-agg-query\": {\n-                                \"description\": \"The aggregation query to be executed.\",\n-                                \"displayName\": \"Query\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"mongo-agg-query\",\n+                                \"name\": \"gcp-retry-count\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"mongo-charset\": {\n-                                \"defaultValue\": \"UTF-8\",\n-                                \"description\": \"Specifies the character set of the document data.\",\n-                                \"displayName\": \"Character Set\",\n+                            \"gcs-bucket\": {\n+                                \"defaultValue\": \"${gcs.bucket}\",\n+                                \"description\": \"Bucket of the object.\",\n+                                \"displayName\": \"Bucket\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"mongo-charset\",\n+                                \"name\": \"gcs-bucket\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"mongo-client-service\": {\n-                                \"description\": \"If configured, this property will use the assigned client service for connection pooling.\",\n-                                \"displayName\": \"Client Service\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"mongo-client-service\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-mongodb-client-service-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.mongodb.MongoDBClientService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            },\n-                            \"mongo-date-format\": {\n-                                \"defaultValue\": \"yyyy-MM-dd'T'HH:mm:ss'Z'\",\n-                                \"description\": \"The date format string to use for formatting Date fields that are returned from Mongo. It is only applied when the JSON output format is set to Standard JSON. Full documentation for format characters can be found here: https://docs.oracle.com/javase/8/docs/api/java/text/SimpleDateFormat.html\",\n-                                \"displayName\": \"Date Format\",\n+                            \"gcs-generation\": {\n+                                \"description\": \"The generation of the object to be deleted. If null, will use latest version of the object.\",\n+                                \"displayName\": \"Generation\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"mongo-date-format\",\n+                                \"name\": \"gcs-generation\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"mongo-query-attribute\": {\n-                                \"description\": \"If set, the query will be written to a specified attribute on the output flowfiles.\",\n-                                \"displayName\": \"Query Output Attribute\",\n+                            \"gcs-key\": {\n+                                \"defaultValue\": \"${filename}\",\n+                                \"description\": \"Name of the object.\",\n+                                \"displayName\": \"Key\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"mongo-query-attribute\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"results-per-flowfile\": {\n-                                \"defaultValue\": \"1\",\n-                                \"description\": \"How many results to put into a flowfile at once. The whole body will be treated as a JSON array of results.\",\n-                                \"displayName\": \"Results Per FlowFile\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"results-per-flowfile\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"ssl-client-auth\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"WANT\",\n-                                        \"value\": \"WANT\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"REQUIRED\",\n-                                        \"value\": \"REQUIRED\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"NONE\",\n-                                        \"value\": \"NONE\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"REQUIRED\",\n-                                \"description\": \"Client authentication policy when connecting to secure (TLS/SSL) cluster. Possible values are REQUIRED, WANT, NONE. This property is only used when an SSL Context has been defined and enabled.\",\n-                                \"displayName\": \"Client Auth\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"ssl-client-auth\",\n-                                \"required\": false,\n+                                \"name\": \"gcs-key\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"ssl-context-service\": {\n-                                \"description\": \"The SSL Context Service used to provide client certificate information for TLS/SSL connections.\",\n-                                \"displayName\": \"SSL Context Service\",\n+                            \"proxy-configuration-service\": {\n+                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests. If set, it supersedes proxy settings configured per component. Supported proxies: HTTP + AuthN\",\n+                                \"displayName\": \"Proxy Configuration Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"ssl-context-service\",\n+                                \"name\": \"proxy-configuration-service\",\n                                 \"required\": false,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n                                     \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n+                                    \"type\": \"org.apache.nifi.proxy.ProxyConfigurationService\",\n                                     \"version\": \"1.27.0\"\n                                 }\n+                            },\n+                            \"storage-api-url\": {\n+                                \"description\": \"Overrides the default storage URL. Configuring an alternative Storage API URL also overrides the HTTP Host header on requests as described in the Google documentation for Private Service Connections.\",\n+                                \"displayName\": \"Storage API URL\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"storage-api-url\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n                             }\n                         },\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.processors.gcp.storage.FetchGCSObject\",\n+                            \"org.apache.nifi.processors.gcp.storage.ListGCSBucket\",\n+                            \"org.apache.nifi.processors.gcp.storage.PutGCSObject\"\n+                        ],\n                         \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"The result set of the aggregation will be sent to this relationship.\",\n-                                \"name\": \"results\"\n+                                \"description\": \"FlowFiles are routed to this relationship after a successful Google Cloud Storage operation.\",\n+                                \"name\": \"success\"\n                             },\n                             {\n-                                \"description\": \"The input flowfile gets sent to this relationship when the query fails.\",\n+                                \"description\": \"FlowFiles are routed to this relationship if the Google Cloud Storage operation fails.\",\n                                 \"name\": \"failure\"\n-                            },\n-                            {\n-                                \"description\": \"The input flowfile gets sent to this relationship when the query succeeds.\",\n-                                \"name\": \"original\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\",\n-                            \"EVENT_DRIVEN\"\n+                            \"CRON_DRIVEN\"\n                         ],\n-                        \"supportsBatching\": false,\n+                        \"supportsBatching\": true,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": true,\n+                        \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"aggregate\",\n-                            \"aggregation\",\n-                            \"mongo\"\n+                            \"delete\",\n+                            \"gcs\",\n+                            \"google\",\n+                            \"google cloud\",\n+                            \"storage\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.mongodb.RunMongoAggregation\",\n-                        \"typeDescription\": \"A processor that runs an aggregation query whenever a flowfile is received.\",\n+                        \"type\": \"org.apache.nifi.processors.gcp.storage.DeleteGCSObject\",\n+                        \"typeDescription\": \"Deletes objects from a Google Cloud Bucket. If attempting to delete a file that does not exist, FlowFile is routed to success.\",\n                         \"version\": \"1.27.0\"\n                     },\n                     {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-mongodb-nar\",\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-gcp-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -35565,270 +32326,749 @@\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"delete-gridfs-query\": {\n-                                \"description\": \"A valid MongoDB query to use to find and delete one or more files from GridFS.\",\n-                                \"displayName\": \"Query\",\n+                            \"GCP Credentials Provider Service\": {\n+                                \"description\": \"The Controller Service used to obtain Google Cloud Platform credentials.\",\n+                                \"displayName\": \"GCP Credentials Provider Service\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"delete-gridfs-query\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"GCP Credentials Provider Service\",\n+                                \"required\": true,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-gcp-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.gcp.credentials.service.GCPCredentialsService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"gcp-project-id\": {\n+                                \"description\": \"Google Cloud Project ID\",\n+                                \"displayName\": \"Project ID\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"gcp-project-id\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"gridfs-bucket-name\": {\n-                                \"description\": \"The GridFS bucket where the files will be stored. If left blank, it will use the default value 'fs' that the MongoDB client driver uses.\",\n-                                \"displayName\": \"Bucket Name\",\n+                            \"gcp-proxy-host\": {\n+                                \"description\": \"IP or hostname of the proxy to be used.\\n You might need to set the following properties in bootstrap for https proxy usage:\\n-Djdk.http.auth.tunneling.disabledSchemes=\\n-Djdk.http.auth.proxying.disabledSchemes=\",\n+                                \"displayName\": \"Proxy host\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"gridfs-bucket-name\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"gcp-proxy-host\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"gridfs-client-service\": {\n-                                \"description\": \"The MongoDB client service to use for database connections.\",\n-                                \"displayName\": \"Client Service\",\n+                            \"gcp-proxy-port\": {\n+                                \"description\": \"Proxy port number\",\n+                                \"displayName\": \"Proxy port\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"gcp-proxy-port\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"gcp-proxy-user-name\": {\n+                                \"description\": \"HTTP Proxy Username\",\n+                                \"displayName\": \"HTTP Proxy Username\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"gcp-proxy-user-name\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"gcp-proxy-user-password\": {\n+                                \"description\": \"HTTP Proxy Password\",\n+                                \"displayName\": \"HTTP Proxy Password\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"gcp-proxy-user-password\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n+                            },\n+                            \"gcp-retry-count\": {\n+                                \"defaultValue\": \"6\",\n+                                \"description\": \"How many retry attempts should be made before routing to the failure relationship.\",\n+                                \"displayName\": \"Number of retries\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"gridfs-client-service\",\n+                                \"name\": \"gcp-retry-count\",\n                                 \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-mongodb-client-service-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.mongodb.MongoDBClientService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n+                                \"sensitive\": false\n                             },\n-                            \"gridfs-database-name\": {\n-                                \"description\": \"The name of the database to use\",\n-                                \"displayName\": \"Mongo Database Name\",\n+                            \"gcs-bucket\": {\n+                                \"defaultValue\": \"${gcs.bucket}\",\n+                                \"description\": \"Bucket of the object.\",\n+                                \"displayName\": \"Bucket\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"gridfs-database-name\",\n+                                \"name\": \"gcs-bucket\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"gridfs-file-name\": {\n-                                \"description\": \"The name of the file in the bucket that is the target of this processor. GridFS file names do not include path information because GridFS does not sort files into folders within a bucket.\",\n-                                \"displayName\": \"File Name\",\n+                            \"gcs-generation\": {\n+                                \"description\": \"The generation of the Object to download. If not set, the latest generation will be downloaded.\",\n+                                \"displayName\": \"Object Generation\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"gridfs-file-name\",\n+                                \"name\": \"gcs-generation\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"mongo-query-attribute\": {\n-                                \"description\": \"If set, the query will be written to a specified attribute on the output flowfiles.\",\n-                                \"displayName\": \"Query Output Attribute\",\n+                            \"gcs-key\": {\n+                                \"defaultValue\": \"${filename}\",\n+                                \"description\": \"Name of the object.\",\n+                                \"displayName\": \"Name\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"mongo-query-attribute\",\n+                                \"name\": \"gcs-key\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"gcs-object-range-length\": {\n+                                \"description\": \"The number of bytes to download from the object, starting from the Range Start. An empty value or a value that extends beyond the end of the object will read to the end of the object.\",\n+                                \"displayName\": \"Range Length\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"gcs-object-range-length\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"gcs-object-range-start\": {\n+                                \"description\": \"The byte position at which to start reading from the object. An empty value or a value of zero will start reading at the beginning of the object.\",\n+                                \"displayName\": \"Range Start\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"gcs-object-range-start\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"gcs-server-side-encryption-key\": {\n+                                \"description\": \"An AES256 Key (encoded in base64) which the object has been encrypted in.\",\n+                                \"displayName\": \"Server Side Encryption Key\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"gcs-server-side-encryption-key\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n+                            },\n+                            \"proxy-configuration-service\": {\n+                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests. If set, it supersedes proxy settings configured per component. Supported proxies: HTTP + AuthN\",\n+                                \"displayName\": \"Proxy Configuration Service\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"proxy-configuration-service\",\n+                                \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.proxy.ProxyConfigurationService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"storage-api-url\": {\n+                                \"description\": \"Overrides the default storage URL. Configuring an alternative Storage API URL also overrides the HTTP Host header on requests as described in the Google documentation for Private Service Connections.\",\n+                                \"displayName\": \"Storage API URL\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"storage-api-url\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             }\n                         },\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.processors.gcp.storage.DeleteGCSObject\",\n+                            \"org.apache.nifi.processors.gcp.storage.ListGCSBucket\",\n+                            \"org.apache.nifi.processors.gcp.storage.PutGCSObject\"\n+                        ],\n                         \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"When the operation succeeds, the flowfile is sent to this relationship.\",\n+                                \"description\": \"FlowFiles are routed to this relationship after a successful Google Cloud Storage operation.\",\n                                 \"name\": \"success\"\n                             },\n                             {\n-                                \"description\": \"When there is a failure processing the flowfile, it goes to this relationship.\",\n+                                \"description\": \"FlowFiles are routed to this relationship if the Google Cloud Storage operation fails.\",\n                                 \"name\": \"failure\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n                         \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"delete\",\n-                            \"gridfs\",\n-                            \"mongodb\"\n+                            \"fetch\",\n+                            \"gcs\",\n+                            \"google\",\n+                            \"google cloud\",\n+                            \"storage\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.mongodb.gridfs.DeleteGridFS\",\n-                        \"typeDescription\": \"Deletes a file from GridFS using a file name or a query.\",\n-                        \"version\": \"1.27.0\"\n+                        \"type\": \"org.apache.nifi.processors.gcp.storage.FetchGCSObject\",\n+                        \"typeDescription\": \"Fetches a file from a Google Cloud Bucket. Designed to be used in tandem with ListGCSBucket.\",\n+                        \"version\": \"1.27.0\",\n+                        \"writesAttributes\": [\n+                            {\n+                                \"description\": \"The name of the file, parsed if possible from the Content-Disposition response header\",\n+                                \"name\": \"filename\"\n+                            },\n+                            {\n+                                \"description\": \"Bucket of the object.\",\n+                                \"name\": \"gcs.bucket\"\n+                            },\n+                            {\n+                                \"description\": \"Name of the object.\",\n+                                \"name\": \"gcs.key\"\n+                            },\n+                            {\n+                                \"description\": \"Size of the object.\",\n+                                \"name\": \"gcs.size\"\n+                            },\n+                            {\n+                                \"description\": \"Data cache control of the object.\",\n+                                \"name\": \"gcs.cache.control\"\n+                            },\n+                            {\n+                                \"description\": \"The number of components which make up the object.\",\n+                                \"name\": \"gcs.component.count\"\n+                            },\n+                            {\n+                                \"description\": \"The data content disposition of the object.\",\n+                                \"name\": \"gcs.content.disposition\"\n+                            },\n+                            {\n+                                \"description\": \"The content encoding of the object.\",\n+                                \"name\": \"gcs.content.encoding\"\n+                            },\n+                            {\n+                                \"description\": \"The content language of the object.\",\n+                                \"name\": \"gcs.content.language\"\n+                            },\n+                            {\n+                                \"description\": \"The MIME/Content-Type of the object\",\n+                                \"name\": \"mime.type\"\n+                            },\n+                            {\n+                                \"description\": \"The CRC32C checksum of object's data, encoded in base64 in big-endian order.\",\n+                                \"name\": \"gcs.crc32c\"\n+                            },\n+                            {\n+                                \"description\": \"The creation time of the object (milliseconds)\",\n+                                \"name\": \"gcs.create.time\"\n+                            },\n+                            {\n+                                \"description\": \"The last modification time of the object (milliseconds)\",\n+                                \"name\": \"gcs.update.time\"\n+                            },\n+                            {\n+                                \"description\": \"The algorithm used to encrypt the object.\",\n+                                \"name\": \"gcs.encryption.algorithm\"\n+                            },\n+                            {\n+                                \"description\": \"The SHA256 hash of the key used to encrypt the object\",\n+                                \"name\": \"gcs.encryption.sha256\"\n+                            },\n+                            {\n+                                \"description\": \"The HTTP 1.1 Entity tag for the object.\",\n+                                \"name\": \"gcs.etag\"\n+                            },\n+                            {\n+                                \"description\": \"The service-generated for the object\",\n+                                \"name\": \"gcs.generated.id\"\n+                            },\n+                            {\n+                                \"description\": \"The data generation of the object.\",\n+                                \"name\": \"gcs.generation\"\n+                            },\n+                            {\n+                                \"description\": \"The MD5 hash of the object's data encoded in base64.\",\n+                                \"name\": \"gcs.md5\"\n+                            },\n+                            {\n+                                \"description\": \"The media download link to the object.\",\n+                                \"name\": \"gcs.media.link\"\n+                            },\n+                            {\n+                                \"description\": \"The metageneration of the object.\",\n+                                \"name\": \"gcs.metageneration\"\n+                            },\n+                            {\n+                                \"description\": \"The owner (uploader) of the object.\",\n+                                \"name\": \"gcs.owner\"\n+                            },\n+                            {\n+                                \"description\": \"The ACL entity type of the uploader of the object.\",\n+                                \"name\": \"gcs.owner.type\"\n+                            },\n+                            {\n+                                \"description\": \"The URI of the object as a string.\",\n+                                \"name\": \"gcs.uri\"\n+                            }\n+                        ]\n                     },\n                     {\n                         \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-mongodb-nar\",\n+                        \"artifact\": \"nifi-gcp-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n                         },\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"0 sec\"\n+                            \"TIMER_DRIVEN\": \"1 min\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_REQUIRED\",\n-                        \"primaryNodeOnly\": false,\n+                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n+                        \"primaryNodeOnly\": true,\n                         \"propertyDescriptors\": {\n-                            \"gridfs-bucket-name\": {\n-                                \"description\": \"The GridFS bucket where the files will be stored. If left blank, it will use the default value 'fs' that the MongoDB client driver uses.\",\n-                                \"displayName\": \"Bucket Name\",\n+                            \"GCP Credentials Provider Service\": {\n+                                \"description\": \"The Controller Service used to obtain Google Cloud Platform credentials.\",\n+                                \"displayName\": \"GCP Credentials Provider Service\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"gridfs-bucket-name\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"GCP Credentials Provider Service\",\n+                                \"required\": true,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-gcp-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.gcp.credentials.service.GCPCredentialsService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"et-initial-listing-target\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"Ignore entities having timestamp older than the specified 'Tracking Time Window' at the initial listing activity.\",\n+                                        \"displayName\": \"Tracking Time Window\",\n+                                        \"value\": \"window\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Regardless of entities timestamp, all existing entities will be listed at the initial listing activity.\",\n+                                        \"displayName\": \"All Available\",\n+                                        \"value\": \"all\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"all\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"entities\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Listing Strategy\",\n+                                        \"propertyName\": \"listing-strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"Specify how initial listing should be handled. Used by 'Tracking Entities' strategy.\",\n+                                \"displayName\": \"Entity Tracking Initial Listing Target\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"et-initial-listing-target\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"gridfs-client-service\": {\n-                                \"description\": \"The MongoDB client service to use for database connections.\",\n-                                \"displayName\": \"Client Service\",\n+                            \"et-state-cache\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"entities\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Listing Strategy\",\n+                                        \"propertyName\": \"listing-strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"Listed entities are stored in the specified cache storage so that this processor can resume listing across NiFi restart or in case of primary node change. 'Tracking Entities' strategy require tracking information of all listed entities within the last 'Tracking Time Window'. To support large number of entities, the strategy uses DistributedMapCache instead of managed state. Cache key format is 'ListedEntities::{processorId}(::{nodeId})'. If it tracks per node listed entities, then the optional '::{nodeId}' part is added to manage state separately. E.g. cluster wide cache key = 'ListedEntities::8dda2321-0164-1000-50fa-3042fe7d6a7b', per node cache key = 'ListedEntities::8dda2321-0164-1000-50fa-3042fe7d6a7b::nifi-node3' The stored cache content is Gzipped JSON string. The cache key will be deleted when target listing configuration is changed. Used by 'Tracking Entities' strategy.\",\n+                                \"displayName\": \"Entity Tracking State Cache\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"gridfs-client-service\",\n+                                \"name\": \"et-state-cache\",\n                                 \"required\": true,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-mongodb-client-service-api-nar\",\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.mongodb.MongoDBClientService\",\n+                                    \"type\": \"org.apache.nifi.distributed.cache.client.DistributedMapCacheClient\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             },\n-                            \"gridfs-database-name\": {\n-                                \"description\": \"The name of the database to use\",\n-                                \"displayName\": \"Mongo Database Name\",\n+                            \"et-time-window\": {\n+                                \"defaultValue\": \"3 hours\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"window\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Entity Tracking Initial Listing Target\",\n+                                        \"propertyName\": \"et-initial-listing-target\"\n+                                    }\n+                                ],\n+                                \"description\": \"Specify how long this processor should track already-listed entities. 'Tracking Entities' strategy can pick any entity whose timestamp is inside the specified time window. For example, if set to '30 minutes', any entity having timestamp in recent 30 minutes will be the listing target when this processor runs. A listed entity is considered 'new/updated' and a FlowFile is emitted if one of following condition meets: 1. does not exist in the already-listed entities, 2. has newer timestamp than the cached entity, 3. has different size than the cached entity. If a cached entity's timestamp becomes older than specified time window, that entity will be removed from the cached already-listed entities. Used by 'Tracking Entities' strategy.\",\n+                                \"displayName\": \"Entity Tracking Time Window\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"gridfs-database-name\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"et-time-window\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"gridfs-file-name\": {\n-                                \"description\": \"The name of the file in the bucket that is the target of this processor.\",\n-                                \"displayName\": \"File Name\",\n+                            \"gcp-project-id\": {\n+                                \"description\": \"Google Cloud Project ID\",\n+                                \"displayName\": \"Project ID\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"gridfs-file-name\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"gcp-project-id\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"gridfs-query\": {\n-                                \"description\": \"A valid MongoDB query to use to fetch one or more files from GridFS.\",\n-                                \"displayName\": \"Query\",\n+                            \"gcp-proxy-host\": {\n+                                \"description\": \"IP or hostname of the proxy to be used.\\n You might need to set the following properties in bootstrap for https proxy usage:\\n-Djdk.http.auth.tunneling.disabledSchemes=\\n-Djdk.http.auth.proxying.disabledSchemes=\",\n+                                \"displayName\": \"Proxy host\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"gridfs-query\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"gcp-proxy-host\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"mongo-operation-mode\": {\n+                            \"gcp-proxy-port\": {\n+                                \"description\": \"Proxy port number\",\n+                                \"displayName\": \"Proxy port\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"gcp-proxy-port\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"gcp-proxy-user-name\": {\n+                                \"description\": \"HTTP Proxy Username\",\n+                                \"displayName\": \"HTTP Proxy Username\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"gcp-proxy-user-name\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"gcp-proxy-user-password\": {\n+                                \"description\": \"HTTP Proxy Password\",\n+                                \"displayName\": \"HTTP Proxy Password\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"gcp-proxy-user-password\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n+                            },\n+                            \"gcp-retry-count\": {\n+                                \"defaultValue\": \"6\",\n+                                \"description\": \"How many retry attempts should be made before routing to the failure relationship.\",\n+                                \"displayName\": \"Number of retries\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"gcp-retry-count\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"gcs-bucket\": {\n+                                \"description\": \"Bucket of the object.\",\n+                                \"displayName\": \"Bucket\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"gcs-bucket\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"gcs-prefix\": {\n+                                \"description\": \"The prefix used to filter the object list. In most cases, it should end with a forward slash ('/').\",\n+                                \"displayName\": \"Prefix\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"gcs-prefix\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"gcs-use-generations\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Fetch the entire query result and then make it available to downstream processors.\",\n-                                        \"displayName\": \"Full Query Fetch\",\n-                                        \"value\": \"all-at-once\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n-                                        \"description\": \"As soon as the query start sending results to the downstream processors at regular intervals.\",\n-                                        \"displayName\": \"Stream Query Results\",\n-                                        \"value\": \"streaming\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"all-at-once\",\n-                                \"description\": \"This option controls when results are made available to downstream processors. If Stream Query Results is enabled, provenance will not be tracked relative to the input flowfile if an input flowfile is received and starts the query. In Stream Query Results mode errors will be handled by sending a new flowfile with the original content and attributes of the input flowfile to the failure relationship. Streaming should only be used if there is reliable connectivity between MongoDB and NiFi.\",\n-                                \"displayName\": \"Operation Mode\",\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"Specifies whether to use GCS Generations, if applicable.  If false, only the latest version of each object will be returned.\",\n+                                \"displayName\": \"Use Generations\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"mongo-operation-mode\",\n+                                \"name\": \"gcs-use-generations\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"mongo-query-attribute\": {\n-                                \"description\": \"If set, the query will be written to a specified attribute on the output flowfiles.\",\n-                                \"displayName\": \"Query Output Attribute\",\n+                            \"listing-strategy\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"This strategy tracks the latest timestamp of listed entity to determine new/updated entities. Since it only tracks few timestamps, it can manage listing state efficiently. This strategy will not pick up any newly added or modified entity if their timestamps are older than the tracked latest timestamp. Also may miss files when multiple subdirectories are being written at the same time while listing is running.\",\n+                                        \"displayName\": \"Tracking Timestamps\",\n+                                        \"value\": \"timestamps\"\n+                                    },\n+                                    {\n+                                        \"description\": \"This strategy tracks information of all the listed entities within the latest 'Entity Tracking Time Window' to determine new/updated entities. This strategy can pick entities having old timestamp that can be missed with 'Tracing Timestamps'. Works even when multiple subdirectories are being written at the same time while listing is running. However an additional DistributedMapCache controller service is required and more JVM heap memory is used. For more information on how the 'Entity Tracking Time Window' property works, see the description.\",\n+                                        \"displayName\": \"Tracking Entities\",\n+                                        \"value\": \"entities\"\n+                                    },\n+                                    {\n+                                        \"description\": \"This strategy lists all entities without any tracking. The same entities will be listed each time this processor is scheduled. It is recommended to change the default run schedule value. Any property that relates to the persisting state will be ignored.\",\n+                                        \"displayName\": \"No Tracking\",\n+                                        \"value\": \"none\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"timestamps\",\n+                                \"description\": \"Specify how to determine new/updated entities. See each strategy descriptions for detail.\",\n+                                \"displayName\": \"Listing Strategy\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"mongo-query-attribute\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"listing-strategy\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"proxy-configuration-service\": {\n+                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests. If set, it supersedes proxy settings configured per component. Supported proxies: HTTP + AuthN\",\n+                                \"displayName\": \"Proxy Configuration Service\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"proxy-configuration-service\",\n+                                \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.proxy.ProxyConfigurationService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"record-writer\": {\n+                                \"description\": \"Specifies the Record Writer to use for creating the listing. If not specified, one FlowFile will be created for each entity that is listed. If the Record Writer is specified, all entities will be written to a single FlowFile instead of adding attributes to individual FlowFiles.\",\n+                                \"displayName\": \"Record Writer\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"record-writer\",\n+                                \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"storage-api-url\": {\n+                                \"description\": \"Overrides the default storage URL. Configuring an alternative Storage API URL also overrides the HTTP Host header on requests as described in the Google documentation for Private Service Connections.\",\n+                                \"displayName\": \"Storage API URL\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"storage-api-url\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             }\n                         },\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.processors.gcp.storage.DeleteGCSObject\",\n+                            \"org.apache.nifi.processors.gcp.storage.FetchGCSObject\",\n+                            \"org.apache.nifi.processors.gcp.storage.PutGCSObject\"\n+                        ],\n                         \"sideEffectFree\": false,\n+                        \"stateful\": {\n+                            \"description\": \"After performing a listing of keys, the timestamp of the newest key is stored, along with the keys that share that same timestamp. This allows the Processor to list only keys that have been added or modified after this date the next time that the Processor is run. State is stored across the cluster so that this Processor can be run on Primary Node only and if a new Primary Node is selected, the new node can pick up where the previous node left off, without duplicating the data.\",\n+                            \"scopes\": [\n+                                \"CLUSTER\"\n+                            ]\n+                        },\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"When the operation succeeds, the flowfile is sent to this relationship.\",\n+                                \"description\": \"FlowFiles are routed to this relationship after a successful Google Cloud Storage operation.\",\n                                 \"name\": \"success\"\n-                            },\n-                            {\n-                                \"description\": \"When there is a failure processing the flowfile, it goes to this relationship.\",\n-                                \"name\": \"failure\"\n-                            },\n-                            {\n-                                \"description\": \"The original input flowfile goes to this relationship if the query does not cause an error\",\n-                                \"name\": \"original\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n                         \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"fetch\",\n-                            \"gridfs\",\n-                            \"mongo\"\n+                            \"gcs\",\n+                            \"google\",\n+                            \"google cloud\",\n+                            \"list\",\n+                            \"storage\"\n                         ],\n-                        \"triggerSerially\": false,\n+                        \"triggerSerially\": true,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.mongodb.gridfs.FetchGridFS\",\n-                        \"typeDescription\": \"Retrieves one or more files from a GridFS bucket by file name or by a user-defined query.\",\n+                        \"triggerWhenEmpty\": true,\n+                        \"type\": \"org.apache.nifi.processors.gcp.storage.ListGCSBucket\",\n+                        \"typeDescription\": \"Retrieves a listing of objects from a GCS bucket. For each object that is listed, creates a FlowFile that represents the object so that it can be fetched in conjunction with FetchGCSObject. This Processor is designed to run on Primary Node only in a cluster. If the primary node changes, the new Primary Node will pick up where the previous node left off without duplicating all of the data.\",\n                         \"version\": \"1.27.0\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"The custom metadata stored with a file is attached to this property if it exists.\",\n-                                \"name\": \"gridfs.file.metadata\"\n+                                \"description\": \"The name of the file\",\n+                                \"name\": \"filename\"\n+                            },\n+                            {\n+                                \"description\": \"Bucket of the object.\",\n+                                \"name\": \"gcs.bucket\"\n+                            },\n+                            {\n+                                \"description\": \"Name of the object.\",\n+                                \"name\": \"gcs.key\"\n+                            },\n+                            {\n+                                \"description\": \"Size of the object.\",\n+                                \"name\": \"gcs.size\"\n+                            },\n+                            {\n+                                \"description\": \"Data cache control of the object.\",\n+                                \"name\": \"gcs.cache.control\"\n+                            },\n+                            {\n+                                \"description\": \"The number of components which make up the object.\",\n+                                \"name\": \"gcs.component.count\"\n+                            },\n+                            {\n+                                \"description\": \"The data content disposition of the object.\",\n+                                \"name\": \"gcs.content.disposition\"\n+                            },\n+                            {\n+                                \"description\": \"The content encoding of the object.\",\n+                                \"name\": \"gcs.content.encoding\"\n+                            },\n+                            {\n+                                \"description\": \"The content language of the object.\",\n+                                \"name\": \"gcs.content.language\"\n+                            },\n+                            {\n+                                \"description\": \"The MIME/Content-Type of the object\",\n+                                \"name\": \"mime.type\"\n+                            },\n+                            {\n+                                \"description\": \"The CRC32C checksum of object's data, encoded in base64 in big-endian order.\",\n+                                \"name\": \"gcs.crc32c\"\n+                            },\n+                            {\n+                                \"description\": \"The creation time of the object (milliseconds)\",\n+                                \"name\": \"gcs.create.time\"\n+                            },\n+                            {\n+                                \"description\": \"The last modification time of the object (milliseconds)\",\n+                                \"name\": \"gcs.update.time\"\n+                            },\n+                            {\n+                                \"description\": \"The algorithm used to encrypt the object.\",\n+                                \"name\": \"gcs.encryption.algorithm\"\n+                            },\n+                            {\n+                                \"description\": \"The SHA256 hash of the key used to encrypt the object\",\n+                                \"name\": \"gcs.encryption.sha256\"\n+                            },\n+                            {\n+                                \"description\": \"The HTTP 1.1 Entity tag for the object.\",\n+                                \"name\": \"gcs.etag\"\n+                            },\n+                            {\n+                                \"description\": \"The service-generated for the object\",\n+                                \"name\": \"gcs.generated.id\"\n+                            },\n+                            {\n+                                \"description\": \"The data generation of the object.\",\n+                                \"name\": \"gcs.generation\"\n+                            },\n+                            {\n+                                \"description\": \"The MD5 hash of the object's data encoded in base64.\",\n+                                \"name\": \"gcs.md5\"\n+                            },\n+                            {\n+                                \"description\": \"The media download link to the object.\",\n+                                \"name\": \"gcs.media.link\"\n+                            },\n+                            {\n+                                \"description\": \"The metageneration of the object.\",\n+                                \"name\": \"gcs.metageneration\"\n+                            },\n+                            {\n+                                \"description\": \"The owner (uploader) of the object.\",\n+                                \"name\": \"gcs.owner\"\n+                            },\n+                            {\n+                                \"description\": \"The ACL entity type of the uploader of the object.\",\n+                                \"name\": \"gcs.owner.type\"\n+                            },\n+                            {\n+                                \"description\": \"The URI of the object as a string.\",\n+                                \"name\": \"gcs.uri\"\n                             }\n                         ]\n                     },\n                     {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-mongodb-nar\",\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-gcp-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -35836,182 +33076,454 @@\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n+                        \"dynamicProperties\": [\n+                            {\n+                                \"description\": \"Allows user-defined metadata to be added to the GCS object as key/value pairs\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"name\": \"The name of a User-Defined Metadata field to add to the GCS Object\",\n+                                \"value\": \"The value of a User-Defined Metadata field to add to the GCS Object\"\n+                            }\n+                        ],\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"gridfs-bucket-name\": {\n-                                \"description\": \"The GridFS bucket where the files will be stored. If left blank, it will use the default value 'fs' that the MongoDB client driver uses.\",\n-                                \"displayName\": \"Bucket Name\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"gridfs-bucket-name\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"gridfs-client-service\": {\n-                                \"description\": \"The MongoDB client service to use for database connections.\",\n-                                \"displayName\": \"Client Service\",\n+                            \"GCP Credentials Provider Service\": {\n+                                \"description\": \"The Controller Service used to obtain Google Cloud Platform credentials.\",\n+                                \"displayName\": \"GCP Credentials Provider Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"gridfs-client-service\",\n+                                \"name\": \"GCP Credentials Provider Service\",\n                                 \"required\": true,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-mongodb-client-service-api-nar\",\n+                                    \"artifact\": \"nifi-gcp-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.mongodb.MongoDBClientService\",\n+                                    \"type\": \"org.apache.nifi.gcp.credentials.service.GCPCredentialsService\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             },\n-                            \"gridfs-database-name\": {\n-                                \"description\": \"The name of the database to use\",\n-                                \"displayName\": \"Mongo Database Name\",\n+                            \"gcp-project-id\": {\n+                                \"description\": \"Google Cloud Project ID\",\n+                                \"displayName\": \"Project ID\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"gcp-project-id\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"gcp-proxy-host\": {\n+                                \"description\": \"IP or hostname of the proxy to be used.\\n You might need to set the following properties in bootstrap for https proxy usage:\\n-Djdk.http.auth.tunneling.disabledSchemes=\\n-Djdk.http.auth.proxying.disabledSchemes=\",\n+                                \"displayName\": \"Proxy host\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"gcp-proxy-host\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"gcp-proxy-port\": {\n+                                \"description\": \"Proxy port number\",\n+                                \"displayName\": \"Proxy port\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"gcp-proxy-port\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"gcp-proxy-user-name\": {\n+                                \"description\": \"HTTP Proxy Username\",\n+                                \"displayName\": \"HTTP Proxy Username\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"gcp-proxy-user-name\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"gcp-proxy-user-password\": {\n+                                \"description\": \"HTTP Proxy Password\",\n+                                \"displayName\": \"HTTP Proxy Password\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"gcp-proxy-user-password\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n+                            },\n+                            \"gcp-retry-count\": {\n+                                \"defaultValue\": \"6\",\n+                                \"description\": \"How many retry attempts should be made before routing to the failure relationship.\",\n+                                \"displayName\": \"Number of retries\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"gcp-retry-count\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"gcs-bucket\": {\n+                                \"defaultValue\": \"${gcs.bucket}\",\n+                                \"description\": \"Bucket of the object.\",\n+                                \"displayName\": \"Bucket\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"gridfs-database-name\",\n+                                \"name\": \"gcs-bucket\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"gridfs-file-name\": {\n-                                \"description\": \"The name of the file in the bucket that is the target of this processor. GridFS file names do not include path information because GridFS does not sort files into folders within a bucket.\",\n-                                \"displayName\": \"File Name\",\n+                            \"gcs-content-disposition-type\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"Indicates that the object should be loaded and rendered within the browser.\",\n+                                        \"displayName\": \"Inline\",\n+                                        \"value\": \"inline\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Indicates that the object should be saved (using a Save As... dialog) rather than opened directly within the browser\",\n+                                        \"displayName\": \"Attachment\",\n+                                        \"value\": \"attachment\"\n+                                    }\n+                                ],\n+                                \"description\": \"Type of RFC-6266 Content Disposition to be attached to the object\",\n+                                \"displayName\": \"Content Disposition Type\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"gcs-content-disposition-type\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"gcs-content-type\": {\n+                                \"defaultValue\": \"${mime.type}\",\n+                                \"description\": \"Content Type for the file, i.e. text/plain\",\n+                                \"displayName\": \"Content Type\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"gridfs-file-name\",\n-                                \"required\": true,\n+                                \"name\": \"gcs-content-type\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"putgridfs-chunk-size\": {\n-                                \"defaultValue\": \"256 KB\",\n-                                \"description\": \"Controls the maximum size of each chunk of a file uploaded into GridFS.\",\n-                                \"displayName\": \"Chunk Size\",\n+                            \"gcs-key\": {\n+                                \"defaultValue\": \"${filename}\",\n+                                \"description\": \"Name of the object.\",\n+                                \"displayName\": \"Key\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"putgridfs-chunk-size\",\n+                                \"name\": \"gcs-key\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"putgridfs-enforce-uniqueness\": {\n+                            \"gcs-object-acl\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"No uniqueness will be enforced.\",\n-                                        \"displayName\": \"None\",\n-                                        \"value\": \"none\"\n+                                        \"description\": \"Gives the bucket or object owner OWNER permission, and gives all authenticated Google account holders READER and WRITER permissions. All other permissions are removed.\",\n+                                        \"displayName\": \"All Authenticated Users\",\n+                                        \"value\": \"ALL_AUTHENTICATED_USERS\"\n                                     },\n                                     {\n-                                        \"description\": \"Both the filename and hash must be unique.\",\n-                                        \"displayName\": \"Both\",\n-                                        \"value\": \"both\"\n+                                        \"description\": \"Gives the bucket or object owner OWNER permission, and gives all authenticated Google account holders READER permission. All other permissions are removed.\",\n+                                        \"displayName\": \"Authenticated Read\",\n+                                        \"value\": \"AUTHENTICATED_READ\"\n                                     },\n                                     {\n-                                        \"description\": \"Only the filename must be unique.\",\n-                                        \"displayName\": \"Name\",\n-                                        \"value\": \"name\"\n+                                        \"description\": \"Gives the object and bucket owners OWNER permission. All other permissions are removed.\",\n+                                        \"displayName\": \"Bucket Owner Full Control\",\n+                                        \"value\": \"BUCKET_OWNER_FULL_CONTROL\"\n                                     },\n                                     {\n-                                        \"description\": \"Only the file hash must be unique.\",\n-                                        \"displayName\": \"Hash\",\n-                                        \"value\": \"hash\"\n+                                        \"description\": \"Gives the object owner OWNER permission, and gives the bucket owner READER permission. All other permissions are removed.\",\n+                                        \"displayName\": \"Bucket Owner Read Only\",\n+                                        \"value\": \"BUCKET_OWNER_READ\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Gives the bucket or object owner OWNER permission for a bucket or object, and removes all other access permissions.\",\n+                                        \"displayName\": \"Private\",\n+                                        \"value\": \"PRIVATE\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Gives permission to the project team based on their roles. Anyone who is part of the team has READER permission. Project owners and project editors have OWNER permission. This is the default ACL for newly created buckets. This is also the default ACL for newly created objects unless the default object ACL for that bucket has been changed.\",\n+                                        \"displayName\": \"Project Private\",\n+                                        \"value\": \"PROJECT_PRIVATE\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Gives the bucket or object owner OWNER permission, and gives all users, both authenticated and anonymous, READER permission. When you apply this to an object, anyone on the Internet can read the object without authenticating.\",\n+                                        \"displayName\": \"Public Read Only\",\n+                                        \"value\": \"PUBLIC_READ\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"none\",\n-                                \"description\": \"When enabled, this option will ensure that uniqueness is enforced on the bucket. It will do so by creating a MongoDB index that matches your selection. It should ideally be configured once when the bucket is created for the first time because it could take a long time to build on an existing bucket wit a lot of data.\",\n-                                \"displayName\": \"Enforce Uniqueness\",\n+                                \"description\": \"Access Control to be attached to the object uploaded. Not providing this will revert to bucket defaults.\",\n+                                \"displayName\": \"Object ACL\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"putgridfs-enforce-uniqueness\",\n-                                \"required\": true,\n+                                \"name\": \"gcs-object-acl\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"putgridfs-hash-attribute\": {\n-                                \"defaultValue\": \"hash.value\",\n-                                \"description\": \"If uniquness enforcement is enabled and the file hash is part of the constraint, this must be set to an attribute that exists on all incoming flowfiles.\",\n-                                \"displayName\": \"Hash Attribute\",\n+                            \"gcs-object-crc32c\": {\n+                                \"description\": \"CRC32C Checksum (encoded in Base64, big-Endian order) of the file for server-side validation.\",\n+                                \"displayName\": \"CRC32C Checksum\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"putgridfs-hash-attribute\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"gcs-object-crc32c\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"putgridfs-properties-prefix\": {\n-                                \"description\": \"Attributes that have this prefix will be added to the file stored in GridFS as metadata.\",\n-                                \"displayName\": \"File Properties Prefix\",\n+                            \"gcs-object-md5\": {\n+                                \"description\": \"MD5 Hash (encoded in Base64) of the file for server-side validation.\",\n+                                \"displayName\": \"MD5 Hash\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"putgridfs-properties-prefix\",\n+                                \"name\": \"gcs-object-md5\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"gcs-overwrite-object\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"true\",\n+                                \"description\": \"If false, the upload to GCS will succeed only if the object does not exist.\",\n+                                \"displayName\": \"Overwrite Object\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"gcs-overwrite-object\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"gcs-server-side-encryption-key\": {\n+                                \"description\": \"An AES256 Encryption Key (encoded in base64) for server-side encryption of the object.\",\n+                                \"displayName\": \"Server Side Encryption Key\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"gcs-server-side-encryption-key\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n+                            },\n+                            \"gzip.content.enabled\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"true\",\n+                                \"description\": \"Signals to the GCS Blob Writer whether GZIP compression during transfer is desired. False means do not gzip and can boost performance in many cases.\",\n+                                \"displayName\": \"GZIP Compression Enabled\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"gzip.content.enabled\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"proxy-configuration-service\": {\n+                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests. If set, it supersedes proxy settings configured per component. Supported proxies: HTTP + AuthN\",\n+                                \"displayName\": \"Proxy Configuration Service\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"proxy-configuration-service\",\n+                                \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.proxy.ProxyConfigurationService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"storage-api-url\": {\n+                                \"description\": \"Overrides the default storage URL. Configuring an alternative Storage API URL also overrides the HTTP Host header on requests as described in the Google documentation for Private Service Connections.\",\n+                                \"displayName\": \"Storage API URL\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"storage-api-url\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             }\n                         },\n+                        \"readsAttributes\": [\n+                            {\n+                                \"description\": \"Uses the FlowFile's filename as the filename for the GCS object\",\n+                                \"name\": \"filename\"\n+                            },\n+                            {\n+                                \"description\": \"Uses the FlowFile's MIME type as the content-type for the GCS object\",\n+                                \"name\": \"mime.type\"\n+                            }\n+                        ],\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.processors.gcp.storage.DeleteGCSObject\",\n+                            \"org.apache.nifi.processors.gcp.storage.FetchGCSObject\",\n+                            \"org.apache.nifi.processors.gcp.storage.ListGCSBucket\"\n+                        ],\n                         \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"When the operation succeeds, the flowfile is sent to this relationship.\",\n+                                \"description\": \"FlowFiles are routed to this relationship after a successful Google Cloud Storage operation.\",\n                                 \"name\": \"success\"\n                             },\n                             {\n-                                \"description\": \"Flowfiles that fail the duplicate check are sent to this relationship.\",\n-                                \"name\": \"duplicate\"\n-                            },\n-                            {\n-                                \"description\": \"When there is a failure processing the flowfile, it goes to this relationship.\",\n+                                \"description\": \"FlowFiles are routed to this relationship if the Google Cloud Storage operation fails.\",\n                                 \"name\": \"failure\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n                         \"supportsBatching\": false,\n-                        \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicProperties\": true,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"file\",\n-                            \"gridfs\",\n-                            \"mongo\",\n-                            \"put\",\n-                            \"store\"\n+                            \"archive\",\n+                            \"gcs\",\n+                            \"google\",\n+                            \"google cloud\",\n+                            \"put\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.mongodb.gridfs.PutGridFS\",\n-                        \"typeDescription\": \"Writes a file to a GridFS bucket.\",\n-                        \"version\": \"1.27.0\"\n-                    }\n-                ],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"1.27.0\"\n-        },\n-        {\n-            \"artifact\": \"nifi-salesforce-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [],\n-                \"processors\": [\n+                        \"type\": \"org.apache.nifi.processors.gcp.storage.PutGCSObject\",\n+                        \"typeDescription\": \"Writes the contents of a FlowFile as an object in a Google Cloud Storage.\",\n+                        \"version\": \"1.27.0\",\n+                        \"writesAttributes\": [\n+                            {\n+                                \"description\": \"Bucket of the object.\",\n+                                \"name\": \"gcs.bucket\"\n+                            },\n+                            {\n+                                \"description\": \"Name of the object.\",\n+                                \"name\": \"gcs.key\"\n+                            },\n+                            {\n+                                \"description\": \"Size of the object.\",\n+                                \"name\": \"gcs.size\"\n+                            },\n+                            {\n+                                \"description\": \"Data cache control of the object.\",\n+                                \"name\": \"gcs.cache.control\"\n+                            },\n+                            {\n+                                \"description\": \"The number of components which make up the object.\",\n+                                \"name\": \"gcs.component.count\"\n+                            },\n+                            {\n+                                \"description\": \"The data content disposition of the object.\",\n+                                \"name\": \"gcs.content.disposition\"\n+                            },\n+                            {\n+                                \"description\": \"The content encoding of the object.\",\n+                                \"name\": \"gcs.content.encoding\"\n+                            },\n+                            {\n+                                \"description\": \"The content language of the object.\",\n+                                \"name\": \"gcs.content.language\"\n+                            },\n+                            {\n+                                \"description\": \"The MIME/Content-Type of the object\",\n+                                \"name\": \"mime.type\"\n+                            },\n+                            {\n+                                \"description\": \"The CRC32C checksum of object's data, encoded in base64 in big-endian order.\",\n+                                \"name\": \"gcs.crc32c\"\n+                            },\n+                            {\n+                                \"description\": \"The creation time of the object (milliseconds)\",\n+                                \"name\": \"gcs.create.time\"\n+                            },\n+                            {\n+                                \"description\": \"The last modification time of the object (milliseconds)\",\n+                                \"name\": \"gcs.update.time\"\n+                            },\n+                            {\n+                                \"description\": \"The algorithm used to encrypt the object.\",\n+                                \"name\": \"gcs.encryption.algorithm\"\n+                            },\n+                            {\n+                                \"description\": \"The SHA256 hash of the key used to encrypt the object\",\n+                                \"name\": \"gcs.encryption.sha256\"\n+                            },\n+                            {\n+                                \"description\": \"The HTTP 1.1 Entity tag for the object.\",\n+                                \"name\": \"gcs.etag\"\n+                            },\n+                            {\n+                                \"description\": \"The service-generated for the object\",\n+                                \"name\": \"gcs.generated.id\"\n+                            },\n+                            {\n+                                \"description\": \"The data generation of the object.\",\n+                                \"name\": \"gcs.generation\"\n+                            },\n+                            {\n+                                \"description\": \"The MD5 hash of the object's data encoded in base64.\",\n+                                \"name\": \"gcs.md5\"\n+                            },\n+                            {\n+                                \"description\": \"The media download link to the object.\",\n+                                \"name\": \"gcs.media.link\"\n+                            },\n+                            {\n+                                \"description\": \"The metageneration of the object.\",\n+                                \"name\": \"gcs.metageneration\"\n+                            },\n+                            {\n+                                \"description\": \"The owner (uploader) of the object.\",\n+                                \"name\": \"gcs.owner\"\n+                            },\n+                            {\n+                                \"description\": \"The ACL entity type of the uploader of the object.\",\n+                                \"name\": \"gcs.owner.type\"\n+                            },\n+                            {\n+                                \"description\": \"The URI of the object as a string.\",\n+                                \"name\": \"gcs.uri\"\n+                            }\n+                        ]\n+                    },\n                     {\n                         \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-salesforce-nar\",\n+                        \"artifact\": \"nifi-gcp-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -36020,495 +33532,308 @@\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"oauth2-access-token-provider\": {\n-                                \"description\": \"Service providing OAuth2 Access Tokens for authenticating using the HTTP Authorization Header\",\n-                                \"displayName\": \"OAuth2 Access Token Provider\",\n+                            \"gcp-credentials-provider-service\": {\n+                                \"description\": \"The Controller Service used to obtain Google Cloud Platform credentials.\",\n+                                \"displayName\": \"GCP Credentials Provider Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"oauth2-access-token-provider\",\n+                                \"name\": \"gcp-credentials-provider-service\",\n                                 \"required\": true,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"artifact\": \"nifi-gcp-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.oauth2.OAuth2AccessTokenProvider\",\n+                                    \"type\": \"org.apache.nifi.gcp.credentials.service.GCPCredentialsService\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             },\n-                            \"read-timeout\": {\n-                                \"defaultValue\": \"15 s\",\n-                                \"description\": \"Maximum time allowed for reading a response from the Salesforce REST API\",\n-                                \"displayName\": \"Read Timeout\",\n+                            \"operationKey\": {\n+                                \"defaultValue\": \"${operationKey}\",\n+                                \"description\": \"The unique identifier of the Vision operation.\",\n+                                \"displayName\": \"GCP Operation Key\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"read-timeout\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"operationKey\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n+                            }\n+                        },\n+                        \"readsAttributes\": [\n+                            {\n+                                \"description\": \"A unique identifier of the operation designated by the Vision server.\",\n+                                \"name\": \"operationKey\"\n+                            }\n+                        ],\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.processors.gcp.vision.StartGcpVisionAnnotateFilesOperation\"\n+                        ],\n+                        \"sideEffectFree\": false,\n+                        \"supportedRelationships\": [\n+                            {\n+                                \"description\": \"The job is currently still being processed\",\n+                                \"name\": \"running\"\n                             },\n-                            \"record-reader\": {\n-                                \"description\": \"Specifies the Controller Service to use for parsing incoming data and determining the data's schema\",\n-                                \"displayName\": \"Record Reader\",\n+                            {\n+                                \"description\": \"FlowFiles are routed to success relationship\",\n+                                \"name\": \"success\"\n+                            },\n+                            {\n+                                \"description\": \"FlowFiles are routed to failure relationship\",\n+                                \"name\": \"failure\"\n+                            },\n+                            {\n+                                \"description\": \"Upon successful completion, the original FlowFile will be routed to this relationship.\",\n+                                \"name\": \"original\"\n+                            }\n+                        ],\n+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\"\n+                        ],\n+                        \"supportsBatching\": false,\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicRelationships\": false,\n+                        \"supportsEventDriven\": false,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"Cloud\",\n+                            \"Google\",\n+                            \"Machine Learning\",\n+                            \"Vision\"\n+                        ],\n+                        \"triggerSerially\": false,\n+                        \"triggerWhenAnyDestinationAvailable\": false,\n+                        \"triggerWhenEmpty\": false,\n+                        \"type\": \"org.apache.nifi.processors.gcp.vision.GetGcpVisionAnnotateFilesOperationStatus\",\n+                        \"typeDescription\": \"Retrieves the current status of an Google Vision operation.\",\n+                        \"version\": \"1.27.0\"\n+                    },\n+                    {\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-gcp-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"e0c4461\"\n+                        },\n+                        \"defaultBulletinLevel\": \"WARN\",\n+                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": 1,\n+                            \"TIMER_DRIVEN\": 1\n+                        },\n+                        \"defaultPenaltyDuration\": \"30 sec\",\n+                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": \"* * * * * ?\",\n+                            \"TIMER_DRIVEN\": \"0 sec\"\n+                        },\n+                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n+                        \"defaultYieldDuration\": \"1 sec\",\n+                        \"group\": \"org.apache.nifi\",\n+                        \"primaryNodeOnly\": false,\n+                        \"propertyDescriptors\": {\n+                            \"gcp-credentials-provider-service\": {\n+                                \"description\": \"The Controller Service used to obtain Google Cloud Platform credentials.\",\n+                                \"displayName\": \"GCP Credentials Provider Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"record-reader\",\n+                                \"name\": \"gcp-credentials-provider-service\",\n                                 \"required\": true,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"artifact\": \"nifi-gcp-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n+                                    \"type\": \"org.apache.nifi.gcp.credentials.service.GCPCredentialsService\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             },\n-                            \"salesforce-api-version\": {\n-                                \"defaultValue\": \"54.0\",\n-                                \"description\": \"The version number of the Salesforce REST API appended to the URL after the services/data path. See Salesforce documentation for supported versions\",\n-                                \"displayName\": \"API Version\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"salesforce-api-version\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"salesforce-url\": {\n-                                \"description\": \"The URL of the Salesforce instance including the domain without additional path information, such as https://MyDomainName.my.salesforce.com\",\n-                                \"displayName\": \"Salesforce Instance URL\",\n+                            \"operationKey\": {\n+                                \"defaultValue\": \"${operationKey}\",\n+                                \"description\": \"The unique identifier of the Vision operation.\",\n+                                \"displayName\": \"GCP Operation Key\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"salesforce-url\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"operationKey\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             }\n                         },\n                         \"readsAttributes\": [\n                             {\n-                                \"description\": \"The Salesforce object type to upload records to. E.g. Account, Contact, Campaign.\",\n-                                \"name\": \"objectType\"\n+                                \"description\": \"A unique identifier of the operation designated by the Vision server.\",\n+                                \"name\": \"operationKey\"\n                             }\n                         ],\n                         \"seeAlso\": [\n-                            \"org.apache.nifi.processors.salesforce.QuerySalesforceObject\"\n+                            \"org.apache.nifi.processors.gcp.vision.StartGcpVisionAnnotateImagesOperation\"\n                         ],\n                         \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"For FlowFiles created as a result of a successful execution.\",\n+                                \"description\": \"The job is currently still being processed\",\n+                                \"name\": \"running\"\n+                            },\n+                            {\n+                                \"description\": \"FlowFiles are routed to success relationship\",\n                                 \"name\": \"success\"\n                             },\n                             {\n-                                \"description\": \"For FlowFiles created as a result of an execution error.\",\n+                                \"description\": \"FlowFiles are routed to failure relationship\",\n                                 \"name\": \"failure\"\n+                            },\n+                            {\n+                                \"description\": \"Upon successful completion, the original FlowFile will be routed to this relationship.\",\n+                                \"name\": \"original\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n                         \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"put\",\n-                            \"salesforce\",\n-                            \"sobject\"\n+                            \"Cloud\",\n+                            \"Google\",\n+                            \"Machine Learning\",\n+                            \"Vision\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.salesforce.PutSalesforceObject\",\n-                        \"typeDescription\": \"Creates new records for the specified Salesforce sObject. The type of the Salesforce object must be set in the input flowfile's 'objectType' attribute. This processor cannot update existing records.\",\n-                        \"version\": \"1.27.0\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"The error message returned by Salesforce.\",\n-                                \"name\": \"error.message\"\n-                            }\n-                        ]\n+                        \"type\": \"org.apache.nifi.processors.gcp.vision.GetGcpVisionAnnotateImagesOperationStatus\",\n+                        \"typeDescription\": \"Retrieves the current status of an Google Vision operation.\",\n+                        \"version\": \"1.27.0\"\n                     },\n                     {\n                         \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-salesforce-nar\",\n+                        \"artifact\": \"nifi-gcp-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n                         },\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"1 min\"\n+                            \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_ALLOWED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"age-delay\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"propertyDisplayName\": \"Age Field\",\n-                                        \"propertyName\": \"age-field\"\n-                                    },\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"property-based-query\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Query Type\",\n-                                        \"propertyName\": \"query-type\"\n-                                    }\n-                                ],\n-                                \"description\": \"The ending timestamp of the time window will be adjusted earlier by the amount configured in this property. For example, with a property value of 10 seconds, an ending timestamp of 12:30:45 would be changed to 12:30:35.\",\n-                                \"displayName\": \"Age Delay\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"age-delay\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"age-field\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"property-based-query\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Query Type\",\n-                                        \"propertyName\": \"query-type\"\n-                                    }\n-                                ],\n-                                \"description\": \"The name of a TIMESTAMP field that will be used to filter records using a bounded time window.The processor will return only those records with a timestamp value newer than the timestamp recorded after the last processor run.\",\n-                                \"displayName\": \"Age Field\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"age-field\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"create-zero-record-files\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"false\",\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"property-based-query\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Query Type\",\n-                                        \"propertyName\": \"query-type\"\n-                                    }\n-                                ],\n-                                \"description\": \"Specifies whether or not to create a FlowFile when the Salesforce REST API does not return any records\",\n-                                \"displayName\": \"Create Zero Record FlowFiles\",\n+                            \"gcp-credentials-provider-service\": {\n+                                \"description\": \"The Controller Service used to obtain Google Cloud Platform credentials.\",\n+                                \"displayName\": \"GCP Credentials Provider Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"create-zero-record-files\",\n+                                \"name\": \"gcp-credentials-provider-service\",\n                                 \"required\": true,\n-                                \"sensitive\": false\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-gcp-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.gcp.credentials.service.GCPCredentialsService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n                             },\n-                            \"custom-soql-query\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"custom-query\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Query Type\",\n-                                        \"propertyName\": \"query-type\"\n-                                    }\n-                                ],\n-                                \"description\": \"Specify the SOQL query to run.\",\n-                                \"displayName\": \"Custom SOQL Query\",\n+                            \"json-payload\": {\n+                                \"defaultValue\": \"{\\n    \\\"requests\\\": [\\n        {\\n            \\\"inputConfig\\\": {\\n                \\\"gcsSource\\\": {\\n                    \\\"uri\\\": \\\"gs://${gcs.bucket}/${filename}\\\"\\n                },\\n                \\\"mimeType\\\": \\\"application/pdf\\\"\\n            },\\n            \\\"features\\\": [{\\n                    \\\"type\\\": \\\"${vision-feature-type}\\\",\\n                    \\\"maxResults\\\": 4\\n                }],\\n            \\\"outputConfig\\\": {\\n                \\\"gcsDestination\\\": {\\n                    \\\"uri\\\": \\\"gs://${output-bucket}/${filename}/\\\"\\n                },\\n                \\\"batchSize\\\": 2\\n            }\\n        }]\\n}\",\n+                                \"description\": \"JSON request for AWS Machine Learning services. The Processor will use FlowFile content for the request when this property is not specified.\",\n+                                \"displayName\": \"JSON Payload\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"custom-soql-query\",\n-                                \"required\": true,\n+                                \"name\": \"json-payload\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"custom-where-condition\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"property-based-query\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Query Type\",\n-                                        \"propertyName\": \"query-type\"\n-                                    }\n-                                ],\n-                                \"description\": \"A custom expression to be added in the WHERE clause of the query\",\n-                                \"displayName\": \"Custom WHERE Condition\",\n+                            \"output-bucket\": {\n+                                \"description\": \"Name of the GCS bucket where the output of the Vision job will be persisted. The value of this property applies when the JSON Payload property is configured. The JSON Payload property value can use Expression Language to reference the value of ${output-bucket}\",\n+                                \"displayName\": \"Output Bucket\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"custom-where-condition\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"field-names\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"property-based-query\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Query Type\",\n-                                        \"propertyName\": \"query-type\"\n-                                    }\n-                                ],\n-                                \"description\": \"Comma-separated list of field names requested from the sObject to be queried. When this field is left empty, all fields are queried.\",\n-                                \"displayName\": \"Field Names\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"field-names\",\n+                                \"name\": \"output-bucket\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"initial-age-filter\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"propertyDisplayName\": \"Age Field\",\n-                                        \"propertyName\": \"age-field\"\n-                                    },\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"property-based-query\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Query Type\",\n-                                        \"propertyName\": \"query-type\"\n-                                    }\n-                                ],\n-                                \"description\": \"This property specifies the start time that the processor applies when running the first query.\",\n-                                \"displayName\": \"Initial Age Start Time\",\n+                            \"vision-feature-type\": {\n+                                \"defaultValue\": \"TEXT_DETECTION\",\n+                                \"description\": \"Type of GCP Vision Feature. The value of this property applies when the JSON Payload property is configured. The JSON Payload property value can use Expression Language to reference the value of ${vision-feature-type}\",\n+                                \"displayName\": \"Vision Feature Type\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"initial-age-filter\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"vision-feature-type\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n-                            },\n-                            \"oauth2-access-token-provider\": {\n-                                \"description\": \"Service providing OAuth2 Access Tokens for authenticating using the HTTP Authorization Header\",\n-                                \"displayName\": \"OAuth2 Access Token Provider\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"oauth2-access-token-provider\",\n-                                \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.oauth2.OAuth2AccessTokenProvider\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            },\n-                            \"query-type\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"Provide query by properties.\",\n-                                        \"displayName\": \"Property Based Query\",\n-                                        \"value\": \"property-based-query\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Provide custom SOQL query.\",\n-                                        \"displayName\": \"Custom Query\",\n-                                        \"value\": \"custom-query\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"property-based-query\",\n-                                \"description\": \"Choose to provide the query by parameters or a full custom query.\",\n-                                \"displayName\": \"Query Type\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"query-type\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"read-timeout\": {\n-                                \"defaultValue\": \"15 s\",\n-                                \"description\": \"Maximum time allowed for reading a response from the Salesforce REST API\",\n-                                \"displayName\": \"Read Timeout\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"read-timeout\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"record-writer\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"property-based-query\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Query Type\",\n-                                        \"propertyName\": \"query-type\"\n-                                    }\n-                                ],\n-                                \"description\": \"Service used for writing records returned from the Salesforce REST API\",\n-                                \"displayName\": \"Record Writer\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"record-writer\",\n-                                \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            },\n-                            \"salesforce-api-version\": {\n-                                \"defaultValue\": \"54.0\",\n-                                \"description\": \"The version number of the Salesforce REST API appended to the URL after the services/data path. See Salesforce documentation for supported versions\",\n-                                \"displayName\": \"API Version\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"salesforce-api-version\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"salesforce-url\": {\n-                                \"description\": \"The URL of the Salesforce instance including the domain without additional path information, such as https://MyDomainName.my.salesforce.com\",\n-                                \"displayName\": \"Salesforce Instance URL\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"salesforce-url\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"sobject-name\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"property-based-query\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Query Type\",\n-                                        \"propertyName\": \"query-type\"\n-                                    }\n-                                ],\n-                                \"description\": \"The Salesforce sObject to be queried\",\n-                                \"displayName\": \"sObject Name\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"sobject-name\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n                             }\n                         },\n                         \"seeAlso\": [\n-                            \"org.apache.nifi.processors.salesforce.PutSalesforceObject\"\n+                            \"org.apache.nifi.processors.gcp.vision.GetGcpVisionAnnotateFilesOperationStatus\"\n                         ],\n                         \"sideEffectFree\": false,\n-                        \"stateful\": {\n-                            \"description\": \"When 'Age Field' is set, after performing a query the time of execution is stored. Subsequent queries will be augmented with an additional condition so that only records that are newer than the stored execution time (adjusted with the optional value of 'Age Delay') will be retrieved. State is stored across the cluster so that this Processor can be run on Primary Node only and if a new Primary Node is selected, the new node can pick up where the previous node left off, without duplicating the data.\",\n-                            \"scopes\": [\n-                                \"CLUSTER\"\n-                            ]\n-                        },\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"For FlowFiles created as a result of a successful query.\",\n+                                \"description\": \"FlowFiles are routed to success relationship\",\n                                 \"name\": \"success\"\n                             },\n                             {\n-                                \"description\": \"The input flowfile gets sent to this relationship when the query fails.\",\n+                                \"description\": \"FlowFiles are routed to failure relationship\",\n                                 \"name\": \"failure\"\n-                            },\n-                            {\n-                                \"description\": \"The input flowfile gets sent to this relationship when the query succeeds.\",\n-                                \"name\": \"original\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n                         \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"query\",\n-                            \"salesforce\",\n-                            \"sobject\",\n-                            \"soql\"\n+                            \"Cloud\",\n+                            \"Google\",\n+                            \"Machine Learning\",\n+                            \"Vision\"\n                         ],\n-                        \"triggerSerially\": true,\n+                        \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.salesforce.QuerySalesforceObject\",\n-                        \"typeDescription\": \"Retrieves records from a Salesforce sObject. Users can add arbitrary filter conditions by setting the 'Custom WHERE Condition' property. The processor can also run a custom query, although record processing is not supported in that case. Supports incremental retrieval: users can define a field in the 'Age Field' property that will be used to determine when the record was created. When this property is set the processor will retrieve new records. Incremental loading and record-based processing are only supported in property-based queries. It's also possible to define an initial cutoff value for the age, filtering out all older records even for the first run. In case of 'Property Based Query' this processor should run on the Primary Node only. FlowFile attribute 'record.count' indicates how many records were retrieved and written to the output. The processor can accept an optional input FlowFile and reference the FlowFile attributes in the query.\",\n+                        \"type\": \"org.apache.nifi.processors.gcp.vision.StartGcpVisionAnnotateFilesOperation\",\n+                        \"typeDescription\": \"Trigger a Vision operation on file input. It should be followed by GetGcpVisionAnnotateFilesOperationStatus processor in order to monitor operation status.\",\n                         \"version\": \"1.27.0\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"Sets the mime.type attribute to the MIME Type specified by the Record Writer.\",\n-                                \"name\": \"mime.type\"\n-                            },\n-                            {\n-                                \"description\": \"Sets the number of records in the FlowFile.\",\n-                                \"name\": \"record.count\"\n-                            },\n-                            {\n-                                \"description\": \"Sets the total number of records in the FlowFile.\",\n-                                \"name\": \"total.record.count\"\n+                                \"description\": \"A unique identifier of the operation returned by the Vision server.\",\n+                                \"name\": \"operationKey\"\n                             }\n                         ]\n-                    }\n-                ],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"1.27.0\"\n-        },\n-        {\n-            \"artifact\": \"nifi-ccda-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [],\n-                \"processors\": [\n+                    },\n                     {\n                         \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-ccda-nar\",\n+                        \"artifact\": \"nifi-gcp-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -36516,515 +33841,602 @@\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n-                        \"deprecated\": true,\n-                        \"deprecationReason\": \"Parsing XML elements to FlowFile attributes is not recommend and should be replaced with record-oriented handling\",\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"skip-validation\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"true\",\n-                                \"description\": \"Whether or not to validate CDA message values\",\n-                                \"displayName\": \"Skip Validation\",\n+                            \"gcp-credentials-provider-service\": {\n+                                \"description\": \"The Controller Service used to obtain Google Cloud Platform credentials.\",\n+                                \"displayName\": \"GCP Credentials Provider Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"skip-validation\",\n+                                \"name\": \"gcp-credentials-provider-service\",\n                                 \"required\": true,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-gcp-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.gcp.credentials.service.GCPCredentialsService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"json-payload\": {\n+                                \"defaultValue\": \"{\\n    \\\"requests\\\": [{\\n        \\\"image\\\": {\\n            \\\"source\\\": {\\n                \\\"imageUri\\\": \\\"gs://${gcs.bucket}/${filename}\\\"\\n            }\\n        },\\n        \\\"features\\\": [{\\n            \\\"type\\\": \\\"${vision-feature-type}\\\",\\n            \\\"maxResults\\\": 4\\n        }]\\n    }],\\n    \\\"outputConfig\\\": {\\n        \\\"gcsDestination\\\": {\\n            \\\"uri\\\": \\\"gs://${output-bucket}/${filename}/\\\"\\n        },\\n        \\\"batchSize\\\": 2\\n    }\\n}\",\n+                                \"description\": \"JSON request for AWS Machine Learning services. The Processor will use FlowFile content for the request when this property is not specified.\",\n+                                \"displayName\": \"JSON Payload\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"json-payload\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"output-bucket\": {\n+                                \"description\": \"Name of the GCS bucket where the output of the Vision job will be persisted. The value of this property applies when the JSON Payload property is configured. The JSON Payload property value can use Expression Language to reference the value of ${output-bucket}\",\n+                                \"displayName\": \"Output Bucket\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"output-bucket\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"vision-feature-type\": {\n+                                \"defaultValue\": \"TEXT_DETECTION\",\n+                                \"description\": \"Type of GCP Vision Feature. The value of this property applies when the JSON Payload property is configured. The JSON Payload property value can use Expression Language to reference the value of ${vision-feature-type}\",\n+                                \"displayName\": \"Vision Feature Type\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"vision-feature-type\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             }\n                         },\n-                        \"sideEffectFree\": true,\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.processors.gcp.vision.GetGcpVisionAnnotateImagesOperationStatus\"\n+                        ],\n+                        \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"A FlowFile is routed to this relationship if it is properly parsed as CDA and its contents extracted as attributes.\",\n+                                \"description\": \"FlowFiles are routed to success relationship\",\n                                 \"name\": \"success\"\n                             },\n                             {\n-                                \"description\": \"A FlowFile is routed to this relationship if it cannot be parsed as CDA or its contents extracted as attributes.\",\n+                                \"description\": \"FlowFiles are routed to failure relationship\",\n                                 \"name\": \"failure\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n-                        \"supportsBatching\": true,\n+                        \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"CCDA\",\n-                            \"attributes\",\n-                            \"extract\",\n-                            \"healthcare\"\n+                            \"Cloud\",\n+                            \"Google\",\n+                            \"Machine Learning\",\n+                            \"Vision\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.ccda.ExtractCCDAAttributes\",\n-                        \"typeDescription\": \"Extracts information from an Consolidated CDA formatted FlowFile and provides individual attributes as FlowFile attributes. The attributes are named as <Parent> <dot> <Key>. If the Parent is repeating, the naming will be <Parent> <underscore> <Parent Index> <dot> <Key>. For example, section.act_07.observation.name=Essential hypertension\",\n-                        \"version\": \"1.27.0\"\n+                        \"type\": \"org.apache.nifi.processors.gcp.vision.StartGcpVisionAnnotateImagesOperation\",\n+                        \"typeDescription\": \"Trigger a Vision operation on image input. It should be followed by GetGcpVisionAnnotateImagesOperationStatus processor in order to monitor operation status.\",\n+                        \"version\": \"1.27.0\",\n+                        \"writesAttributes\": [\n+                            {\n+                                \"description\": \"A unique identifier of the operation returned by the Vision server.\",\n+                                \"name\": \"operationKey\"\n+                            }\n+                        ]\n                     }\n                 ],\n                 \"reportingTasks\": []\n             },\n             \"group\": \"org.apache.nifi\",\n             \"version\": \"1.27.0\"\n         },\n         {\n-            \"artifact\": \"nifi-metrics-reporting-nar\",\n+            \"artifact\": \"nifi-couchbase-nar\",\n             \"componentManifest\": {\n                 \"controllerServices\": [\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-metrics-reporting-nar\",\n+                        \"artifact\": \"nifi-couchbase-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"deprecated\": true,\n-                        \"deprecationReason\": \"Unmaintained and planned for removal in version 2.0\",\n+                        \"deprecationReason\": \"This component is deprecated and will be removed in NiFi 2.x.\",\n+                        \"dynamicProperties\": [\n+                            {\n+                                \"description\": \"Specify bucket password if necessary. Couchbase Server 5.0 or later should use 'User Name' and 'User Password' instead.\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"name\": \"Bucket Password for BUCKET_NAME\",\n+                                \"value\": \"bucket password\"\n+                            }\n+                        ],\n                         \"group\": \"org.apache.nifi\",\n                         \"propertyDescriptors\": {\n-                            \"charset\": {\n-                                \"defaultValue\": \"UTF-8\",\n-                                \"description\": \"The charset used by the graphite server\",\n-                                \"displayName\": \"Charset\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"charset\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"host\": {\n-                                \"description\": \"The hostname of the carbon listener\",\n-                                \"displayName\": \"Host\",\n+                            \"Connection String\": {\n+                                \"description\": \"The hostnames or ip addresses of the bootstraping nodes and optional parameters. Syntax) couchbase://node1,node2,nodeN?param1=value1&param2=value2&paramN=valueN\",\n+                                \"displayName\": \"Connection String\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"host\",\n+                                \"name\": \"Connection String\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"metric name prefix\": {\n-                                \"defaultValue\": \"nifi\",\n-                                \"description\": \"A prefix that will be used for all metric names sent by reporters provided by this service.\",\n-                                \"displayName\": \"Metric Name Prefix\",\n+                            \"user-name\": {\n+                                \"description\": \"The user name to authenticate NiFi as a Couchbase client. This configuration can be used against Couchbase Server 5.0 or later supporting Roll-Based Access Control.\",\n+                                \"displayName\": \"User Name\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"metric name prefix\",\n-                                \"required\": true,\n+                                \"name\": \"user-name\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"port\": {\n-                                \"description\": \"The port on which carbon listens\",\n-                                \"displayName\": \"Port\",\n+                            \"user-password\": {\n+                                \"description\": \"The user password to authenticate NiFi as a Couchbase client. This configuration can be used against Couchbase Server 5.0 or later supporting Roll-Based Access Control.\",\n+                                \"displayName\": \"User Password\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"port\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n+                                \"name\": \"user-password\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n                             }\n                         },\n                         \"providedApiImplementations\": [\n                             {\n-                                \"artifact\": \"nifi-metrics-reporter-service-api-nar\",\n+                                \"artifact\": \"nifi-couchbase-services-api-nar\",\n                                 \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.metrics.reporting.reporter.service.MetricReporterService\",\n+                                \"type\": \"org.apache.nifi.couchbase.CouchbaseClusterControllerService\",\n                                 \"version\": \"1.27.0\"\n                             }\n                         ],\n-                        \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicProperties\": true,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"graphite\",\n-                            \"metrics\",\n-                            \"reporting\"\n+                            \"connection\",\n+                            \"couchbase\",\n+                            \"database\",\n+                            \"nosql\"\n                         ],\n-                        \"type\": \"org.apache.nifi.metrics.reporting.reporter.service.GraphiteMetricReporterService\",\n-                        \"typeDescription\": \"A controller service that provides metric reporters for graphite. Used by MetricsReportingTask.\",\n+                        \"type\": \"org.apache.nifi.couchbase.CouchbaseClusterService\",\n+                        \"typeDescription\": \"Provides a centralized Couchbase connection and bucket passwords management. Bucket passwords can be specified via dynamic properties.\",\n                         \"version\": \"1.27.0\"\n-                    }\n-                ],\n-                \"processors\": [],\n-                \"reportingTasks\": [\n+                    },\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-metrics-reporting-nar\",\n+                        \"artifact\": \"nifi-couchbase-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n-                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"0 sec\"\n-                        },\n-                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"deprecated\": true,\n-                        \"deprecationReason\": \"Unmaintained and planned for removal in version 2.0\",\n+                        \"deprecationReason\": \"This component is deprecated and will be removed in NiFi 2.x.\",\n                         \"group\": \"org.apache.nifi\",\n                         \"propertyDescriptors\": {\n-                            \"metric reporter service\": {\n-                                \"description\": \"The service that provides a reporter for the gathered metrics\",\n-                                \"displayName\": \"Metric Reporter Service\",\n+                            \"bucket-name\": {\n+                                \"defaultValue\": \"default\",\n+                                \"description\": \"The name of bucket to access.\",\n+                                \"displayName\": \"Bucket Name\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"bucket-name\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"cluster-controller-service\": {\n+                                \"description\": \"A Couchbase Cluster Controller Service which manages connections to a Couchbase cluster.\",\n+                                \"displayName\": \"Couchbase Cluster Controller Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"metric reporter service\",\n+                                \"name\": \"cluster-controller-service\",\n                                 \"required\": true,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-metrics-reporter-service-api-nar\",\n+                                    \"artifact\": \"nifi-couchbase-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.metrics.reporting.reporter.service.MetricReporterService\",\n+                                    \"type\": \"org.apache.nifi.couchbase.CouchbaseClusterControllerService\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             },\n-                            \"process group id\": {\n-                                \"description\": \"The id of the process group to report. If not specified, metrics of the root process groupare reported.\",\n-                                \"displayName\": \"Process Group ID\",\n+                            \"lookup-sub-doc-path\": {\n+                                \"description\": \"The Sub-Document lookup path within the target JSON document.\",\n+                                \"displayName\": \"Lookup Sub-Document Path\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"process group id\",\n+                                \"name\": \"lookup-sub-doc-path\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             }\n                         },\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n+                        \"providedApiImplementations\": [\n+                            {\n+                                \"artifact\": \"nifi-standard-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.lookup.StringLookupService\",\n+                                \"version\": \"1.27.0\"\n+                            },\n+                            {\n+                                \"artifact\": \"nifi-standard-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.lookup.LookupService\",\n+                                \"version\": \"1.27.0\"\n+                            }\n                         ],\n                         \"supportsDynamicProperties\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"metrics\",\n-                            \"reporting\"\n+                            \"couchbase\",\n+                            \"enrich\",\n+                            \"key\",\n+                            \"lookup\",\n+                            \"value\"\n                         ],\n-                        \"type\": \"org.apache.nifi.metrics.reporting.task.MetricsReportingTask\",\n-                        \"typeDescription\": \"This reporting task reports a set of metrics regarding the JVM and the NiFi instanceto a reporter. The reporter is provided by a MetricReporterService. It can be optionally used for a specificprocess group if a property with the group id is provided.\",\n+                        \"type\": \"org.apache.nifi.couchbase.CouchbaseKeyValueLookupService\",\n+                        \"typeDescription\": \"Lookup a string value from Couchbase Server associated with the specified key. The coordinates that are passed to the lookup must contain the key 'key'.\",\n                         \"version\": \"1.27.0\"\n-                    }\n-                ]\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"1.27.0\"\n-        },\n-        {\n-            \"artifact\": \"nifi-network-processors-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [],\n-                \"processors\": [\n+                    },\n                     {\n                         \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-network-processors-nar\",\n+                        \"artifact\": \"nifi-couchbase-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n-                        \"defaultBulletinLevel\": \"WARN\",\n-                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": 1,\n-                            \"EVENT_DRIVEN\": 0,\n-                            \"TIMER_DRIVEN\": 1\n-                        },\n-                        \"defaultPenaltyDuration\": \"30 sec\",\n-                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"0 sec\"\n-                        },\n-                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n-                        \"defaultYieldDuration\": \"1 sec\",\n+                        \"deprecated\": true,\n+                        \"deprecationReason\": \"This component is deprecated and will be removed in NiFi 2.x.\",\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_REQUIRED\",\n-                        \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"FIELDS_DESTINATION\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"Parsed data routes as flowfile JSON content\",\n-                                        \"displayName\": \"flowfile-content\",\n-                                        \"value\": \"flowfile-content\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Parsed data routes as flowfile attributes\",\n-                                        \"displayName\": \"flowfile-attribute\",\n-                                        \"value\": \"flowfile-attribute\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"flowfile-content\",\n-                                \"description\": \"Indicates whether the results of the parser are written to the FlowFile content or a FlowFile attribute; if using flowfile-attribute, fields will be populated as attributes. If set to flowfile-content, the netflowv5 field will be converted into a flat JSON object.\",\n-                                \"displayName\": \"Parsed fields destination\",\n+                            \"bucket-name\": {\n+                                \"defaultValue\": \"default\",\n+                                \"description\": \"The name of bucket to access.\",\n+                                \"displayName\": \"Bucket Name\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"bucket-name\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"cluster-controller-service\": {\n+                                \"description\": \"A Couchbase Cluster Controller Service which manages connections to a Couchbase cluster.\",\n+                                \"displayName\": \"Couchbase Cluster Controller Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"FIELDS_DESTINATION\",\n+                                \"name\": \"cluster-controller-service\",\n                                 \"required\": true,\n-                                \"sensitive\": false\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-couchbase-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.couchbase.CouchbaseClusterControllerService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n                             }\n                         },\n-                        \"readsAttributes\": [\n-                            {\n-                                \"description\": \"Optionally read if packets are received from UDP datagrams.\",\n-                                \"name\": \"udp.port\"\n-                            }\n-                        ],\n-                        \"sideEffectFree\": true,\n-                        \"supportedRelationships\": [\n-                            {\n-                                \"description\": \"Any FlowFile that is successfully parsed as a netflowv5 data will be transferred to this Relationship.\",\n-                                \"name\": \"success\"\n-                            },\n+                        \"providedApiImplementations\": [\n                             {\n-                                \"description\": \"Any FlowFile that could not be parsed as a netflowv5 message will be transferred to this Relationship without any attributes being added\",\n-                                \"name\": \"failure\"\n+                                \"artifact\": \"nifi-standard-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.distributed.cache.client.AtomicDistributedMapCacheClient\",\n+                                \"version\": \"1.27.0\"\n                             },\n                             {\n-                                \"description\": \"The original raw content\",\n-                                \"name\": \"original\"\n+                                \"artifact\": \"nifi-standard-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.distributed.cache.client.DistributedMapCacheClient\",\n+                                \"version\": \"1.27.0\"\n                             }\n                         ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\",\n-                            \"EVENT_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": true,\n                         \"supportsDynamicProperties\": false,\n-                        \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": true,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"attributes\",\n-                            \"byte\",\n-                            \"datagram\",\n-                            \"netflow\",\n-                            \"network\",\n-                            \"packet\",\n-                            \"v5\"\n+                            \"cache\",\n+                            \"cluster\",\n+                            \"couchbase\",\n+                            \"distributed\",\n+                            \"map\"\n                         ],\n-                        \"triggerSerially\": false,\n-                        \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.network.ParseNetflowv5\",\n-                        \"typeDescription\": \"Parses netflowv5 byte ingest and add to NiFi flowfile as attributes or JSON content.\",\n-                        \"version\": \"1.27.0\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"The key and value generated by the parsing of the header fields.\",\n-                                \"name\": \"netflowv5.header.*\"\n-                            },\n-                            {\n-                                \"description\": \"The key and value generated by the parsing of the record fields.\",\n-                                \"name\": \"netflowv5.record.*\"\n-                            }\n-                        ]\n-                    }\n-                ],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"1.27.0\"\n-        },\n-        {\n-            \"artifact\": \"nifi-zendesk-services-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [\n+                        \"type\": \"org.apache.nifi.couchbase.CouchbaseMapCacheClient\",\n+                        \"typeDescription\": \"Provides the ability to communicate with a Couchbase Server cluster as a DistributedMapCacheServer. This can be used in order to share a Map between nodes in a NiFi cluster. Couchbase Server cluster can provide a high available and persistent cache storage.\",\n+                        \"version\": \"1.27.0\"\n+                    },\n                     {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-zendesk-services-nar\",\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-couchbase-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n+                        \"deprecated\": true,\n+                        \"deprecationReason\": \"This component is deprecated and will be removed in NiFi 2.x.\",\n                         \"group\": \"org.apache.nifi\",\n                         \"propertyDescriptors\": {\n-                            \"cache-expiration\": {\n-                                \"defaultValue\": \"1 hour\",\n-                                \"description\": \"Specifies how long a Zendesk ticket that is cached should remain in the cache.\",\n-                                \"displayName\": \"Cache Expiration\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"cache-expiration\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"cache-size\": {\n-                                \"defaultValue\": \"1000\",\n-                                \"description\": \"Specifies how many Zendesk ticket should be cached.\",\n-                                \"displayName\": \"Cache Size\",\n+                            \"bucket-name\": {\n+                                \"defaultValue\": \"default\",\n+                                \"description\": \"The name of bucket to access.\",\n+                                \"displayName\": \"Bucket Name\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"cache-size\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"bucket-name\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"web-client-service-provider\": {\n-                                \"description\": \"Controller service for HTTP client operations.\",\n-                                \"displayName\": \"Web Client Service Provider\",\n+                            \"cluster-controller-service\": {\n+                                \"description\": \"A Couchbase Cluster Controller Service which manages connections to a Couchbase cluster.\",\n+                                \"displayName\": \"Couchbase Cluster Controller Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"web-client-service-provider\",\n+                                \"name\": \"cluster-controller-service\",\n                                 \"required\": true,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"artifact\": \"nifi-couchbase-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.web.client.provider.api.WebClientServiceProvider\",\n+                                    \"type\": \"org.apache.nifi.couchbase.CouchbaseClusterControllerService\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             },\n-                            \"zendesk-authentication-type-name\": {\n+                            \"document-type\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Password of Zendesk login user.\",\n-                                        \"displayName\": \"Password\",\n-                                        \"value\": \"password\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Json\",\n+                                        \"value\": \"Json\"\n                                     },\n                                     {\n-                                        \"description\": \"Authentication token generated in Zendesk Admin menu for API access.\",\n-                                        \"displayName\": \"Token\",\n-                                        \"value\": \"token\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Binary\",\n+                                        \"value\": \"Binary\"\n                                     }\n                                 ],\n-                                \"description\": \"Type of authentication to Zendesk API.\",\n-                                \"displayName\": \"Authentication Type\",\n+                                \"defaultValue\": \"Json\",\n+                                \"description\": \"The type of contents.\",\n+                                \"displayName\": \"Document Type\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"zendesk-authentication-type-name\",\n+                                \"name\": \"document-type\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"zendesk-authentication-value-name\": {\n-                                \"description\": \"Password or authentication token for Zendesk login user.\",\n-                                \"displayName\": \"Authentication Credential\",\n+                            \"record-reader\": {\n+                                \"description\": \"The Record Reader to use for parsing fetched document from Couchbase Server.\",\n+                                \"displayName\": \"Record Reader\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"zendesk-authentication-value-name\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"record-reader\",\n                                 \"required\": true,\n-                                \"sensitive\": true\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            }\n+                        },\n+                        \"providedApiImplementations\": [\n+                            {\n+                                \"artifact\": \"nifi-standard-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.lookup.LookupService\",\n+                                \"version\": \"1.27.0\"\n                             },\n-                            \"zendesk-comment-body\": {\n-                                \"description\": \"The content or the path to the comment body in the incoming record.\",\n-                                \"displayName\": \"Comment Body\",\n+                            {\n+                                \"artifact\": \"nifi-standard-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.lookup.RecordLookupService\",\n+                                \"version\": \"1.27.0\"\n+                            }\n+                        ],\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"couchbase\",\n+                            \"enrich\",\n+                            \"lookup\"\n+                        ],\n+                        \"type\": \"org.apache.nifi.couchbase.CouchbaseRecordLookupService\",\n+                        \"typeDescription\": \"Lookup a record from Couchbase Server associated with the specified key. The coordinates that are passed to the lookup must contain the key 'key'.\",\n+                        \"version\": \"1.27.0\"\n+                    }\n+                ],\n+                \"processors\": [\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-couchbase-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"e0c4461\"\n+                        },\n+                        \"defaultBulletinLevel\": \"WARN\",\n+                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": 1,\n+                            \"TIMER_DRIVEN\": 1\n+                        },\n+                        \"defaultPenaltyDuration\": \"30 sec\",\n+                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": \"* * * * * ?\",\n+                            \"TIMER_DRIVEN\": \"0 sec\"\n+                        },\n+                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n+                        \"defaultYieldDuration\": \"1 sec\",\n+                        \"deprecated\": true,\n+                        \"deprecationReason\": \"This component is deprecated and will be removed in NiFi 2.x.\",\n+                        \"group\": \"org.apache.nifi\",\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n+                        \"primaryNodeOnly\": false,\n+                        \"propertyDescriptors\": {\n+                            \"bucket-name\": {\n+                                \"defaultValue\": \"default\",\n+                                \"description\": \"The name of bucket to access.\",\n+                                \"displayName\": \"Bucket Name\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"zendesk-comment-body\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"bucket-name\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"zendesk-priority\": {\n-                                \"description\": \"The content or the path to the priority in the incoming record.\",\n-                                \"displayName\": \"Priority\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"zendesk-priority\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"zendesk-subdomain\": {\n-                                \"description\": \"Name of the Zendesk subdomain.\",\n-                                \"displayName\": \"Subdomain Name\",\n+                            \"cluster-controller-service\": {\n+                                \"description\": \"A Couchbase Cluster Controller Service which manages connections to a Couchbase cluster.\",\n+                                \"displayName\": \"Couchbase Cluster Controller Service\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"zendesk-subdomain\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"cluster-controller-service\",\n                                 \"required\": true,\n-                                \"sensitive\": false\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-couchbase-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.couchbase.CouchbaseClusterControllerService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n                             },\n-                            \"zendesk-subject\": {\n-                                \"description\": \"The content or the path to the subject in the incoming record.\",\n-                                \"displayName\": \"Subject\",\n+                            \"document-id\": {\n+                                \"description\": \"A static, fixed Couchbase document id, or an expression to construct the Couchbase document id.\",\n+                                \"displayName\": \"Document Id\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"zendesk-subject\",\n+                                \"name\": \"document-id\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"zendesk-type\": {\n-                                \"description\": \"The content or the path to the type in the incoming record.\",\n-                                \"displayName\": \"Type\",\n+                            \"document-type\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Json\",\n+                                        \"value\": \"Json\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Binary\",\n+                                        \"value\": \"Binary\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"Json\",\n+                                \"description\": \"The type of contents.\",\n+                                \"displayName\": \"Document Type\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"zendesk-type\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"document-type\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"zendesk-user\": {\n-                                \"description\": \"Login user to Zendesk subdomain.\",\n-                                \"displayName\": \"User Name\",\n+                            \"put-to-attribute\": {\n+                                \"description\": \"If set, the retrieved value will be put into an attribute of the FlowFile instead of a the content of the FlowFile. The attribute key to put to is determined by evaluating value of this property.\",\n+                                \"displayName\": \"Put Value to Attribute\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"zendesk-user\",\n-                                \"required\": true,\n+                                \"name\": \"put-to-attribute\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             }\n                         },\n-                        \"providedApiImplementations\": [\n+                        \"sideEffectFree\": false,\n+                        \"supportedRelationships\": [\n                             {\n-                                \"artifact\": \"nifi-standard-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.record.sink.RecordSinkService\",\n-                                \"version\": \"1.27.0\"\n+                                \"description\": \"All FlowFiles failed to fetch from Couchbase Server but can be retried are routed to this relationship.\",\n+                                \"name\": \"retry\"\n+                            },\n+                            {\n+                                \"description\": \"Values retrieved from Couchbase Server are written as outgoing FlowFiles content or put into an attribute of the incoming FlowFile and routed to this relationship.\",\n+                                \"name\": \"success\"\n+                            },\n+                            {\n+                                \"description\": \"All FlowFiles failed to fetch from Couchbase Server and not retry-able are routed to this relationship.\",\n+                                \"name\": \"failure\"\n+                            },\n+                            {\n+                                \"description\": \"The original input FlowFile is routed to this relationship when the value is retrieved from Couchbase Server and routed to 'success'.\",\n+                                \"name\": \"original\"\n                             }\n                         ],\n+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\"\n+                        ],\n+                        \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicRelationships\": false,\n+                        \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n+                        \"systemResourceConsiderations\": [\n+                            {\n+                                \"description\": \"An instance of this component can cause high usage of this system resource.  Multiple instances or high concurrency settings may result a degradation of performance.\",\n+                                \"resource\": \"MEMORY\"\n+                            }\n+                        ],\n                         \"tags\": [\n-                            \"record\",\n-                            \"sink\",\n-                            \"zendesk\"\n+                            \"couchbase\",\n+                            \"database\",\n+                            \"get\",\n+                            \"nosql\"\n                         ],\n-                        \"type\": \"org.apache.nifi.services.zendesk.ZendeskRecordSink\",\n-                        \"typeDescription\": \"Create Zendesk tickets using the Zendesk API.The service requires a Zendesk account with configured access.\",\n-                        \"version\": \"1.27.0\"\n-                    }\n-                ],\n-                \"processors\": [],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"1.27.0\"\n-        },\n-        {\n-            \"artifact\": \"nifi-hadoop-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [],\n-                \"processors\": [\n+                        \"triggerSerially\": false,\n+                        \"triggerWhenAnyDestinationAvailable\": false,\n+                        \"triggerWhenEmpty\": false,\n+                        \"type\": \"org.apache.nifi.processors.couchbase.GetCouchbaseKey\",\n+                        \"typeDescription\": \"Get a document from Couchbase Server via Key/Value access. The ID of the document to fetch may be supplied by setting the <Document Id> property. NOTE: if the Document Id property is not set, the contents of the FlowFile will be read to determine the Document Id, which means that the contents of the entire FlowFile will be buffered in memory.\",\n+                        \"version\": \"1.27.0\",\n+                        \"writesAttributes\": [\n+                            {\n+                                \"description\": \"Cluster where the document was retrieved from.\",\n+                                \"name\": \"couchbase.cluster\"\n+                            },\n+                            {\n+                                \"description\": \"Bucket where the document was retrieved from.\",\n+                                \"name\": \"couchbase.bucket\"\n+                            },\n+                            {\n+                                \"description\": \"Id of the document.\",\n+                                \"name\": \"couchbase.doc.id\"\n+                            },\n+                            {\n+                                \"description\": \"CAS of the document.\",\n+                                \"name\": \"couchbase.doc.cas\"\n+                            },\n+                            {\n+                                \"description\": \"Expiration of the document.\",\n+                                \"name\": \"couchbase.doc.expiry\"\n+                            },\n+                            {\n+                                \"description\": \"If Couchbase related error occurs the CouchbaseException class name will be captured here.\",\n+                                \"name\": \"couchbase.exception\"\n+                            }\n+                        ]\n+                    },\n                     {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-hadoop-nar\",\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-couchbase-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -37032,482 +34444,566 @@\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n+                        \"deprecated\": true,\n+                        \"deprecationReason\": \"This component is deprecated and will be removed in NiFi 2.x.\",\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Additional Classpath Resources\": {\n-                                \"description\": \"A comma-separated list of paths to files and/or directories that will be added to the classpath and used for loading native libraries. When specifying a directory, all files with in the directory will be added to the classpath, but further sub-directories will not be included.\",\n-                                \"displayName\": \"Additional Classpath Resources\",\n+                            \"bucket-name\": {\n+                                \"defaultValue\": \"default\",\n+                                \"description\": \"The name of bucket to access.\",\n+                                \"displayName\": \"Bucket Name\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"bucket-name\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"cluster-controller-service\": {\n+                                \"description\": \"A Couchbase Cluster Controller Service which manages connections to a Couchbase cluster.\",\n+                                \"displayName\": \"Couchbase Cluster Controller Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Additional Classpath Resources\",\n+                                \"name\": \"cluster-controller-service\",\n+                                \"required\": true,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-couchbase-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.couchbase.CouchbaseClusterControllerService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"document-id\": {\n+                                \"description\": \"A static, fixed Couchbase document id, or an expression to construct the Couchbase document id.\",\n+                                \"displayName\": \"Document Id\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"document-id\",\n                                 \"required\": false,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"MULTIPLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\",\n-                                        \"DIRECTORY\"\n-                                    ]\n-                                },\n                                 \"sensitive\": false\n                             },\n-                            \"Compression codec\": {\n+                            \"document-type\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"No compression\",\n-                                        \"displayName\": \"NONE\",\n-                                        \"value\": \"NONE\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Json\",\n+                                        \"value\": \"Json\"\n                                     },\n                                     {\n-                                        \"description\": \"Default ZLIB compression\",\n-                                        \"displayName\": \"DEFAULT\",\n-                                        \"value\": \"DEFAULT\"\n-                                    },\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Binary\",\n+                                        \"value\": \"Binary\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"Json\",\n+                                \"description\": \"The type of contents.\",\n+                                \"displayName\": \"Document Type\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"document-type\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"persist-to\": {\n+                                \"allowableValues\": [\n                                     {\n-                                        \"description\": \"BZIP compression\",\n-                                        \"displayName\": \"BZIP\",\n-                                        \"value\": \"BZIP\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"MASTER\",\n+                                        \"value\": \"MASTER\"\n                                     },\n                                     {\n-                                        \"description\": \"GZIP compression\",\n-                                        \"displayName\": \"GZIP\",\n-                                        \"value\": \"GZIP\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"NONE\",\n+                                        \"value\": \"NONE\"\n                                     },\n                                     {\n-                                        \"description\": \"LZ4 compression\",\n-                                        \"displayName\": \"LZ4\",\n-                                        \"value\": \"LZ4\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"ONE\",\n+                                        \"value\": \"ONE\"\n                                     },\n                                     {\n-                                        \"description\": \"LZO compression - it assumes LD_LIBRARY_PATH has been set and jar is available\",\n-                                        \"displayName\": \"LZO\",\n-                                        \"value\": \"LZO\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"TWO\",\n+                                        \"value\": \"TWO\"\n                                     },\n                                     {\n-                                        \"description\": \"Snappy compression\",\n-                                        \"displayName\": \"SNAPPY\",\n-                                        \"value\": \"SNAPPY\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"THREE\",\n+                                        \"value\": \"THREE\"\n                                     },\n                                     {\n-                                        \"description\": \"Will attempt to automatically detect the compression codec.\",\n-                                        \"displayName\": \"AUTOMATIC\",\n-                                        \"value\": \"AUTOMATIC\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"FOUR\",\n+                                        \"value\": \"FOUR\"\n                                     }\n                                 ],\n                                 \"defaultValue\": \"NONE\",\n-                                \"description\": \"\",\n-                                \"displayName\": \"Compression codec\",\n+                                \"description\": \"Durability constraint about disk persistence.\",\n+                                \"displayName\": \"Persist To\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Compression codec\",\n+                                \"name\": \"persist-to\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Hadoop Configuration Resources\": {\n-                                \"description\": \"A file or comma separated list of files which contains the Hadoop file system configuration. Without this, Hadoop will search the classpath for a 'core-site.xml' and 'hdfs-site.xml' file or will revert to a default configuration. To use swebhdfs, see 'Additional Details' section of PutHDFS's documentation.\",\n-                                \"displayName\": \"Hadoop Configuration Resources\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Hadoop Configuration Resources\",\n-                                \"required\": false,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"MULTIPLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\"\n-                                    ]\n-                                },\n-                                \"sensitive\": false\n-                            },\n-                            \"Kerberos Keytab\": {\n-                                \"description\": \"Kerberos keytab associated with the principal. Requires nifi.kerberos.krb5.file to be set in your nifi.properties\",\n-                                \"displayName\": \"Kerberos Keytab\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Kerberos Keytab\",\n-                                \"required\": false,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"SINGLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\"\n-                                    ]\n-                                },\n-                                \"sensitive\": false\n-                            },\n-                            \"Kerberos Password\": {\n-                                \"description\": \"Kerberos password associated with the principal.\",\n-                                \"displayName\": \"Kerberos Password\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Kerberos Password\",\n-                                \"required\": false,\n-                                \"sensitive\": true\n-                            },\n-                            \"Kerberos Principal\": {\n-                                \"description\": \"Kerberos principal to authenticate as. Requires nifi.kerberos.krb5.file to be set in your nifi.properties\",\n-                                \"displayName\": \"Kerberos Principal\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Kerberos Principal\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Kerberos Relogin Period\": {\n-                                \"defaultValue\": \"4 hours\",\n-                                \"description\": \"Period of time which should pass before attempting a kerberos relogin.\\n\\nThis property has been deprecated, and has no effect on processing. Relogins now occur automatically.\",\n-                                \"displayName\": \"Kerberos Relogin Period\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Kerberos Relogin Period\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"compression type\": {\n+                            \"replicate-to\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"NONE\",\n                                         \"value\": \"NONE\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"RECORD\",\n-                                        \"value\": \"RECORD\"\n+                                        \"displayName\": \"ONE\",\n+                                        \"value\": \"ONE\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"BLOCK\",\n-                                        \"value\": \"BLOCK\"\n+                                        \"displayName\": \"TWO\",\n+                                        \"value\": \"TWO\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"THREE\",\n+                                        \"value\": \"THREE\"\n                                     }\n                                 ],\n-                                \"description\": \"Type of compression to use when creating Sequence File\",\n-                                \"displayName\": \"Compression type\",\n+                                \"defaultValue\": \"NONE\",\n+                                \"description\": \"Durability constraint about replication.\",\n+                                \"displayName\": \"Replicate To\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"compression type\",\n-                                \"required\": false,\n+                                \"name\": \"replicate-to\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n-                            },\n-                            \"kerberos-credentials-service\": {\n-                                \"description\": \"Specifies the Kerberos Credentials Controller Service that should be used for authenticating with Kerberos\",\n-                                \"displayName\": \"Kerberos Credentials Service\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"kerberos-credentials-service\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.kerberos.KerberosCredentialsService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            },\n-                            \"kerberos-user-service\": {\n-                                \"description\": \"Specifies the Kerberos User Controller Service that should be used for authenticating with Kerberos\",\n-                                \"displayName\": \"Kerberos User Service\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"kerberos-user-service\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.kerberos.KerberosUserService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n                             }\n                         },\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.processors.hadoop.PutHDFS\"\n+                        \"readsAttributes\": [\n+                            {\n+                                \"description\": \"Used as a document id if 'Document Id' is not specified\",\n+                                \"name\": \"uuid\"\n+                            }\n                         ],\n-                        \"sideEffectFree\": true,\n+                        \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"Generated Sequence Files are sent to this relationship\",\n+                                \"description\": \"All FlowFiles failed to be written to Couchbase Server but can be retried are routed to this relationship.\",\n+                                \"name\": \"retry\"\n+                            },\n+                            {\n+                                \"description\": \"All FlowFiles that are written to Couchbase Server are routed to this relationship.\",\n                                 \"name\": \"success\"\n                             },\n                             {\n-                                \"description\": \"Incoming files that failed to generate a Sequence File are sent to this relationship\",\n+                                \"description\": \"All FlowFiles failed to be written to Couchbase Server and not retry-able are routed to this relationship.\",\n                                 \"name\": \"failure\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n                         \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n+                        \"systemResourceConsiderations\": [\n+                            {\n+                                \"description\": \"An instance of this component can cause high usage of this system resource.  Multiple instances or high concurrency settings may result a degradation of performance.\",\n+                                \"resource\": \"MEMORY\"\n+                            }\n+                        ],\n                         \"tags\": [\n-                            \"create\",\n-                            \"hadoop\",\n-                            \"sequence file\",\n-                            \"sequencefile\"\n+                            \"couchbase\",\n+                            \"database\",\n+                            \"nosql\",\n+                            \"put\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.hadoop.CreateHadoopSequenceFile\",\n-                        \"typeDescription\": \"Creates Hadoop Sequence Files from incoming flow files\",\n-                        \"version\": \"1.27.0\"\n-                    },\n+                        \"type\": \"org.apache.nifi.processors.couchbase.PutCouchbaseKey\",\n+                        \"typeDescription\": \"Put a document to Couchbase Server via Key/Value access.\",\n+                        \"version\": \"1.27.0\",\n+                        \"writesAttributes\": [\n+                            {\n+                                \"description\": \"Cluster where the document was stored.\",\n+                                \"name\": \"couchbase.cluster\"\n+                            },\n+                            {\n+                                \"description\": \"Bucket where the document was stored.\",\n+                                \"name\": \"couchbase.bucket\"\n+                            },\n+                            {\n+                                \"description\": \"Id of the document.\",\n+                                \"name\": \"couchbase.doc.id\"\n+                            },\n+                            {\n+                                \"description\": \"CAS of the document.\",\n+                                \"name\": \"couchbase.doc.cas\"\n+                            },\n+                            {\n+                                \"description\": \"Expiration of the document.\",\n+                                \"name\": \"couchbase.doc.expiry\"\n+                            },\n+                            {\n+                                \"description\": \"If Couchbase related error occurs the CouchbaseException class name will be captured here.\",\n+                                \"name\": \"couchbase.exception\"\n+                            }\n+                        ]\n+                    }\n+                ],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"1.27.0\"\n+        },\n+        {\n+            \"artifact\": \"nifi-kerberos-credentials-service-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-hadoop-nar\",\n+                        \"artifact\": \"nifi-kerberos-credentials-service-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n-                        \"defaultBulletinLevel\": \"WARN\",\n-                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": 1,\n-                            \"TIMER_DRIVEN\": 1\n-                        },\n-                        \"defaultPenaltyDuration\": \"30 sec\",\n-                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"0 sec\"\n-                        },\n-                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n-                        \"defaultYieldDuration\": \"1 sec\",\n                         \"explicitRestrictions\": [\n                             {\n-                                \"explanation\": \"Provides operator the ability to delete any file that NiFi has access to in HDFS or the local filesystem.\",\n-                                \"requiredPermission\": \"write distributed filesystem\"\n+                                \"explanation\": \"Allows user to define a Keytab and principal that can then be used by other components.\",\n+                                \"requiredPermission\": \"access keytab\"\n                             }\n                         ],\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_ALLOWED\",\n-                        \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Additional Classpath Resources\": {\n-                                \"description\": \"A comma-separated list of paths to files and/or directories that will be added to the classpath and used for loading native libraries. When specifying a directory, all files with in the directory will be added to the classpath, but further sub-directories will not be included.\",\n-                                \"displayName\": \"Additional Classpath Resources\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Additional Classpath Resources\",\n-                                \"required\": false,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"MULTIPLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\",\n-                                        \"DIRECTORY\"\n-                                    ]\n-                                },\n-                                \"sensitive\": false\n-                            },\n-                            \"Hadoop Configuration Resources\": {\n-                                \"description\": \"A file or comma separated list of files which contains the Hadoop file system configuration. Without this, Hadoop will search the classpath for a 'core-site.xml' and 'hdfs-site.xml' file or will revert to a default configuration. To use swebhdfs, see 'Additional Details' section of PutHDFS's documentation.\",\n-                                \"displayName\": \"Hadoop Configuration Resources\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Hadoop Configuration Resources\",\n-                                \"required\": false,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"MULTIPLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\"\n-                                    ]\n-                                },\n-                                \"sensitive\": false\n-                            },\n                             \"Kerberos Keytab\": {\n                                 \"description\": \"Kerberos keytab associated with the principal. Requires nifi.kerberos.krb5.file to be set in your nifi.properties\",\n                                 \"displayName\": \"Kerberos Keytab\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n                                 \"name\": \"Kerberos Keytab\",\n-                                \"required\": false,\n+                                \"required\": true,\n                                 \"resourceDefinition\": {\n                                     \"cardinality\": \"SINGLE\",\n                                     \"resourceTypes\": [\n                                         \"FILE\"\n                                     ]\n                                 },\n                                 \"sensitive\": false\n                             },\n-                            \"Kerberos Password\": {\n-                                \"description\": \"Kerberos password associated with the principal.\",\n-                                \"displayName\": \"Kerberos Password\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Kerberos Password\",\n-                                \"required\": false,\n-                                \"sensitive\": true\n-                            },\n                             \"Kerberos Principal\": {\n                                 \"description\": \"Kerberos principal to authenticate as. Requires nifi.kerberos.krb5.file to be set in your nifi.properties\",\n                                 \"displayName\": \"Kerberos Principal\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n                                 \"name\": \"Kerberos Principal\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            }\n+                        },\n+                        \"providedApiImplementations\": [\n+                            {\n+                                \"artifact\": \"nifi-standard-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.kerberos.KerberosCredentialsService\",\n+                                \"version\": \"1.27.0\"\n+                            }\n+                        ],\n+                        \"restricted\": true,\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"Authentication\",\n+                            \"Credentials\",\n+                            \"Kerberos\",\n+                            \"Keytab\",\n+                            \"Principal\",\n+                            \"Security\"\n+                        ],\n+                        \"type\": \"org.apache.nifi.kerberos.KeytabCredentialsService\",\n+                        \"typeDescription\": \"Provides a mechanism for specifying a Keytab and a Principal that other components are able to use in order to perform authentication using Kerberos. By encapsulating this information into a Controller Service and allowing other components to make use of it (as opposed to specifying the principal and keytab directly in the processor) an administrator is able to choose which users are allowed to use which keytabs and principals. This provides a more robust security model for multi-tenant use cases.\",\n+                        \"version\": \"1.27.0\"\n+                    }\n+                ],\n+                \"processors\": [],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"1.27.0\"\n+        },\n+        {\n+            \"artifact\": \"nifi-grpc-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [],\n+                \"processors\": [\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-grpc-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"e0c4461\"\n+                        },\n+                        \"defaultBulletinLevel\": \"WARN\",\n+                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": 1,\n+                            \"EVENT_DRIVEN\": 0,\n+                            \"TIMER_DRIVEN\": 1\n+                        },\n+                        \"defaultPenaltyDuration\": \"30 sec\",\n+                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": \"* * * * * ?\",\n+                            \"TIMER_DRIVEN\": \"0 sec\"\n+                        },\n+                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n+                        \"defaultYieldDuration\": \"1 sec\",\n+                        \"deprecated\": true,\n+                        \"deprecationReason\": \"No planned alternatives to be offered. Use custom processors instead.\",\n+                        \"group\": \"org.apache.nifi\",\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n+                        \"primaryNodeOnly\": false,\n+                        \"propertyDescriptors\": {\n+                            \"Always Output Response\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"Will force a response FlowFile to be generated and routed to the 'Response' relationship regardless of what the server status code received is or if the processor is configured to put the server response body in the request attribute. In the later configuration a request FlowFile with the response body in the attribute and a typical response FlowFile will be emitted to their respective relationships.\",\n+                                \"displayName\": \"Always Output Response\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Always Output Response\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Kerberos Relogin Period\": {\n-                                \"defaultValue\": \"4 hours\",\n-                                \"description\": \"Period of time which should pass before attempting a kerberos relogin.\\n\\nThis property has been deprecated, and has no effect on processing. Relogins now occur automatically.\",\n-                                \"displayName\": \"Kerberos Relogin Period\",\n+                            \"Max Message Size\": {\n+                                \"defaultValue\": \"4MB\",\n+                                \"description\": \"The maximum size of FlowFiles that this processor will allow to be received. The default is 4MB. If FlowFiles exceed this size, you should consider using another transport mechanism as gRPC isn't designed for heavy payloads.\",\n+                                \"displayName\": \"Max Message Size\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Kerberos Relogin Period\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Max Message Size\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"file_or_directory\": {\n-                                \"description\": \"The HDFS file or directory to delete. A wildcard expression may be used to only delete certain files\",\n-                                \"displayName\": \"Path\",\n+                            \"Penalize on \\\"No Retry\\\"\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"Enabling this property will penalize FlowFiles that are routed to the \\\"No Retry\\\" relationship.\",\n+                                \"displayName\": \"Penalize on \\\"No Retry\\\"\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"file_or_directory\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Penalize on \\\"No Retry\\\"\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Remote gRPC service hostname\": {\n+                                \"description\": \"Remote host which will be connected to\",\n+                                \"displayName\": \"Remote gRPC service hostname\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Remote gRPC service hostname\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"kerberos-credentials-service\": {\n-                                \"description\": \"Specifies the Kerberos Credentials Controller Service that should be used for authenticating with Kerberos\",\n-                                \"displayName\": \"Kerberos Credentials Service\",\n+                            \"Remote gRPC service port\": {\n+                                \"description\": \"Remote port which will be connected to\",\n+                                \"displayName\": \"Remote gRPC service port\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"kerberos-credentials-service\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.kerberos.KerberosCredentialsService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n+                                \"name\": \"Remote gRPC service port\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n                             },\n-                            \"kerberos-user-service\": {\n-                                \"description\": \"Specifies the Kerberos User Controller Service that should be used for authenticating with Kerberos\",\n-                                \"displayName\": \"Kerberos User Service\",\n+                            \"SSL Context Service\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"true\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Use TLS\",\n+                                        \"propertyName\": \"Use SSL/TLS\"\n+                                    }\n+                                ],\n+                                \"description\": \"The SSL Context Service used to provide client certificate information for TLS (https) connections.\",\n+                                \"displayName\": \"SSL Context Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"kerberos-user-service\",\n+                                \"name\": \"SSL Context Service\",\n                                 \"required\": false,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n                                     \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.kerberos.KerberosUserService\",\n+                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             },\n-                            \"recursive\": {\n+                            \"Send FlowFile Content\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"true\",\n                                         \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"false\",\n                                         \"value\": \"false\"\n                                     }\n                                 ],\n                                 \"defaultValue\": \"true\",\n-                                \"description\": \"Remove contents of a non-empty directory recursively\",\n-                                \"displayName\": \"Recursive\",\n+                                \"description\": \"Whether or not to include the FlowFile content in the FlowFileRequest to the gRPC service.\",\n+                                \"displayName\": \"Send FlowFile Content\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"recursive\",\n-                                \"required\": true,\n+                                \"name\": \"Send FlowFile Content\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Use SSL/TLS\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"Whether or not to use TLS to send the contents of the gRPC messages.\",\n+                                \"displayName\": \"Use TLS\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Use SSL/TLS\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             }\n                         },\n-                        \"restricted\": true,\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.processors.hadoop.ListHDFS\",\n-                            \"org.apache.nifi.processors.hadoop.PutHDFS\"\n-                        ],\n                         \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"When an incoming flowfile is used then if there are no errors invoking delete the flowfile will route here.\",\n-                                \"name\": \"success\"\n+                                \"description\": \"The original FlowFile will be routed upon success. It will have new attributes detailing the success of the request.\",\n+                                \"name\": \"Original\"\n                             },\n                             {\n-                                \"description\": \"When an incoming flowfile is used and there is a failure while deleting then the flowfile will route here.\",\n-                                \"name\": \"failure\"\n+                                \"description\": \"The original FlowFile will be routed on any type of connection failure, timeout or general exception. It will have new attributes detailing the request.\",\n+                                \"name\": \"Failure\"\n+                            },\n+                            {\n+                                \"description\": \"The original FlowFile will be routed on any status code that can be retried. It will have new attributes detailing the request.\",\n+                                \"name\": \"Retry\"\n+                            },\n+                            {\n+                                \"description\": \"The original FlowFile will be routed on any status code that should NOT be retried.  It will have new attributes detailing the request.\",\n+                                \"name\": \"No Retry\"\n+                            },\n+                            {\n+                                \"description\": \"A Response FlowFile will be routed upon success. If the 'Output Response Regardless' property is true then the response will be sent to this relationship regardless of the status code received.\",\n+                                \"name\": \"Response\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n+                            \"CRON_DRIVEN\",\n+                            \"EVENT_DRIVEN\"\n                         ],\n-                        \"supportsBatching\": false,\n+                        \"supportsBatching\": true,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": false,\n+                        \"supportsEventDriven\": true,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"HCFS\",\n-                            \"HDFS\",\n-                            \"delete\",\n-                            \"filesystem\",\n-                            \"hadoop\",\n-                            \"remove\"\n+                            \"client\",\n+                            \"grpc\",\n+                            \"rpc\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.hadoop.DeleteHDFS\",\n-                        \"typeDescription\": \"Deletes one or more files or directories from HDFS. The path can be provided as an attribute from an incoming FlowFile, or a statically set path that is periodically removed. If this processor has an incoming connection, itwill ignore running on a periodic basis and instead rely on incoming FlowFiles to trigger a delete. Note that you may use a wildcard character to match multiple files or directories. If there are no incoming connections no flowfiles will be transfered to any output relationships.  If there is an incoming flowfile then provided there are no detected failures it will be transferred to success otherwise it will be sent to false. If knowledge of globbed files deleted is necessary use ListHDFS first to produce a specific list of files to delete. \",\n+                        \"type\": \"org.apache.nifi.processors.grpc.InvokeGRPC\",\n+                        \"typeDescription\": \"Sends FlowFiles, optionally with content, to a configurable remote gRPC service endpoint. The remote gRPC service must abide by the service IDL defined in NiFi.  gRPC isn't intended to carry large payloads,  so this processor should be used only when FlowFile sizes are on the order of megabytes. The default maximum message size is 4MB.\",\n                         \"version\": \"1.27.0\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"HDFS file to be deleted. If multiple files are deleted, then only the last filename is set.\",\n-                                \"name\": \"hdfs.filename\"\n+                                \"description\": \"The response code that is returned (0 = ERROR, 1 = SUCCESS, 2 = RETRY)\",\n+                                \"name\": \"invokegrpc.response.code\"\n                             },\n                             {\n-                                \"description\": \"HDFS Path specified in the delete request. If multiple paths are deleted, then only the last path is set.\",\n-                                \"name\": \"hdfs.path\"\n+                                \"description\": \"The response message that is returned\",\n+                                \"name\": \"invokegrpc.response.body\"\n                             },\n                             {\n-                                \"description\": \"The hadoop url for the file to be deleted.\",\n-                                \"name\": \"hadoop.file.url\"\n+                                \"description\": \"The remote gRPC service hostname\",\n+                                \"name\": \"invokegrpc.service.host\"\n                             },\n                             {\n-                                \"description\": \"HDFS error message related to the hdfs.error.code\",\n-                                \"name\": \"hdfs.error.message\"\n+                                \"description\": \"The remote gRPC service port\",\n+                                \"name\": \"invokegrpc.service.port\"\n+                            },\n+                            {\n+                                \"description\": \"The Java exception class raised when the processor fails\",\n+                                \"name\": \"invokegrpc.java.exception.class\"\n+                            },\n+                            {\n+                                \"description\": \"The Java exception message raised when the processor fails\",\n+                                \"name\": \"invokegrpc.java.exception.message\"\n                             }\n                         ]\n                     },\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-hadoop-nar\",\n+                        \"artifact\": \"nifi-grpc-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -37515,485 +35011,329 @@\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n-                        \"explicitRestrictions\": [\n-                            {\n-                                \"explanation\": \"Provides operator the ability to retrieve any file that NiFi has access to in HDFS or the local filesystem.\",\n-                                \"requiredPermission\": \"read distributed filesystem\"\n-                            }\n-                        ],\n+                        \"deprecated\": true,\n+                        \"deprecationReason\": \"No planned alternatives to be offered. Use custom processors instead.\",\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_REQUIRED\",\n+                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Additional Classpath Resources\": {\n-                                \"description\": \"A comma-separated list of paths to files and/or directories that will be added to the classpath and used for loading native libraries. When specifying a directory, all files with in the directory will be added to the classpath, but further sub-directories will not be included.\",\n-                                \"displayName\": \"Additional Classpath Resources\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Additional Classpath Resources\",\n-                                \"required\": false,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"MULTIPLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\",\n-                                        \"DIRECTORY\"\n-                                    ]\n-                                },\n-                                \"sensitive\": false\n-                            },\n-                            \"Compression codec\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"No compression\",\n-                                        \"displayName\": \"NONE\",\n-                                        \"value\": \"NONE\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Default ZLIB compression\",\n-                                        \"displayName\": \"DEFAULT\",\n-                                        \"value\": \"DEFAULT\"\n-                                    },\n-                                    {\n-                                        \"description\": \"BZIP compression\",\n-                                        \"displayName\": \"BZIP\",\n-                                        \"value\": \"BZIP\"\n-                                    },\n-                                    {\n-                                        \"description\": \"GZIP compression\",\n-                                        \"displayName\": \"GZIP\",\n-                                        \"value\": \"GZIP\"\n-                                    },\n-                                    {\n-                                        \"description\": \"LZ4 compression\",\n-                                        \"displayName\": \"LZ4\",\n-                                        \"value\": \"LZ4\"\n-                                    },\n-                                    {\n-                                        \"description\": \"LZO compression - it assumes LD_LIBRARY_PATH has been set and jar is available\",\n-                                        \"displayName\": \"LZO\",\n-                                        \"value\": \"LZO\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Snappy compression\",\n-                                        \"displayName\": \"SNAPPY\",\n-                                        \"value\": \"SNAPPY\"\n-                                    },\n+                            \"Authorized DN Pattern\": {\n+                                \"defaultValue\": \".*\",\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"Will attempt to automatically detect the compression codec.\",\n-                                        \"displayName\": \"AUTOMATIC\",\n-                                        \"value\": \"AUTOMATIC\"\n+                                        \"dependentValues\": [\n+                                            \"true\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Use TLS\",\n+                                        \"propertyName\": \"Use TLS\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"NONE\",\n-                                \"description\": \"\",\n-                                \"displayName\": \"Compression codec\",\n+                                \"description\": \"A Regular Expression to apply against the Distinguished Name of incoming connections. If the Pattern does not match the DN, the connection will be refused. The property will only be used if client certificate authentication (Mutual TLS) has been configured on SSL Context Service, otherwise it will be ignored.\",\n+                                \"displayName\": \"Authorized DN Pattern\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Compression codec\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"HDFS Filename\": {\n-                                \"defaultValue\": \"${path}/${filename}\",\n-                                \"description\": \"The name of the HDFS file to retrieve\",\n-                                \"displayName\": \"HDFS Filename\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"HDFS Filename\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Hadoop Configuration Resources\": {\n-                                \"description\": \"A file or comma separated list of files which contains the Hadoop file system configuration. Without this, Hadoop will search the classpath for a 'core-site.xml' and 'hdfs-site.xml' file or will revert to a default configuration. To use swebhdfs, see 'Additional Details' section of PutHDFS's documentation.\",\n-                                \"displayName\": \"Hadoop Configuration Resources\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Hadoop Configuration Resources\",\n+                                \"name\": \"Authorized DN Pattern\",\n                                 \"required\": false,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"MULTIPLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\"\n-                                    ]\n-                                },\n                                 \"sensitive\": false\n                             },\n-                            \"Kerberos Keytab\": {\n-                                \"description\": \"Kerberos keytab associated with the principal. Requires nifi.kerberos.krb5.file to be set in your nifi.properties\",\n-                                \"displayName\": \"Kerberos Keytab\",\n+                            \"Flow Control Window\": {\n+                                \"defaultValue\": \"1MB\",\n+                                \"description\": \"The initial HTTP/2 flow control window for both new streams and overall connection. Flow-control schemes ensure that streams on the same connection do not destructively interfere with each other. The default is 1MB.\",\n+                                \"displayName\": \"Flow Control Window\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Kerberos Keytab\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Flow Control Window\",\n                                 \"required\": false,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"SINGLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\"\n-                                    ]\n-                                },\n                                 \"sensitive\": false\n                             },\n-                            \"Kerberos Password\": {\n-                                \"description\": \"Kerberos password associated with the principal.\",\n-                                \"displayName\": \"Kerberos Password\",\n+                            \"Local gRPC service port\": {\n+                                \"description\": \"The local port that the gRPC service will listen on.\",\n+                                \"displayName\": \"Local gRPC Service Port\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Kerberos Password\",\n-                                \"required\": false,\n-                                \"sensitive\": true\n-                            },\n-                            \"Kerberos Principal\": {\n-                                \"description\": \"Kerberos principal to authenticate as. Requires nifi.kerberos.krb5.file to be set in your nifi.properties\",\n-                                \"displayName\": \"Kerberos Principal\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Kerberos Principal\",\n-                                \"required\": false,\n+                                \"name\": \"Local gRPC service port\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Kerberos Relogin Period\": {\n-                                \"defaultValue\": \"4 hours\",\n-                                \"description\": \"Period of time which should pass before attempting a kerberos relogin.\\n\\nThis property has been deprecated, and has no effect on processing. Relogins now occur automatically.\",\n-                                \"displayName\": \"Kerberos Relogin Period\",\n+                            \"Max Message Size\": {\n+                                \"defaultValue\": \"4MB\",\n+                                \"description\": \"The maximum size of FlowFiles that this processor will allow to be received. The default is 4MB. If FlowFiles exceed this size, you should consider using another transport mechanism as gRPC isn't designed for heavy payloads.\",\n+                                \"displayName\": \"Maximum Message Size\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Kerberos Relogin Period\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Max Message Size\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"kerberos-credentials-service\": {\n-                                \"description\": \"Specifies the Kerberos Credentials Controller Service that should be used for authenticating with Kerberos\",\n-                                \"displayName\": \"Kerberos Credentials Service\",\n+                            \"SSL Context Service\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"true\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Use TLS\",\n+                                        \"propertyName\": \"Use TLS\"\n+                                    }\n+                                ],\n+                                \"description\": \"The SSL Context Service used to provide server certificate information for TLS (https) connections. Keystore must be configured on the service. If truststore is also configured, it will turn on and require client certificate authentication (Mutual TLS).\",\n+                                \"displayName\": \"SSL Context Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"kerberos-credentials-service\",\n+                                \"name\": \"SSL Context Service\",\n                                 \"required\": false,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n                                     \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.kerberos.KerberosCredentialsService\",\n+                                    \"type\": \"org.apache.nifi.ssl.RestrictedSSLContextService\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             },\n-                            \"kerberos-user-service\": {\n-                                \"description\": \"Specifies the Kerberos User Controller Service that should be used for authenticating with Kerberos\",\n-                                \"displayName\": \"Kerberos User Service\",\n+                            \"Use TLS\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"Whether or not to use TLS to receive the contents of the gRPC messages.\",\n+                                \"displayName\": \"Use TLS\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"kerberos-user-service\",\n+                                \"name\": \"Use TLS\",\n                                 \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.kerberos.KerberosUserService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n+                                \"sensitive\": false\n                             }\n                         },\n-                        \"restricted\": true,\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.processors.hadoop.GetHDFS\",\n-                            \"org.apache.nifi.processors.hadoop.ListHDFS\",\n-                            \"org.apache.nifi.processors.hadoop.PutHDFS\"\n-                        ],\n                         \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"FlowFiles will be routed to this relationship once they have been updated with the content of the HDFS file\",\n-                                \"name\": \"success\"\n-                            },\n-                            {\n-                                \"description\": \"FlowFiles will be routed to this relationship if the content of the HDFS file cannot be retrieve due to a communications failure. This generally indicates that the Fetch should be tried again.\",\n-                                \"name\": \"comms.failure\"\n-                            },\n-                            {\n-                                \"description\": \"FlowFiles will be routed to this relationship if the content of the HDFS file cannot be retrieved and trying again will likely not be helpful. This would occur, for instance, if the file is not found or if there is a permissions issue\",\n-                                \"name\": \"failure\"\n+                                \"description\": \"The FlowFile was received successfully.\",\n+                                \"name\": \"Success\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n-                        \"supportsBatching\": true,\n+                        \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"fetch\",\n-                            \"get\",\n-                            \"hadoop\",\n-                            \"hcfs\",\n-                            \"hdfs\",\n+                            \"grpc\",\n                             \"ingest\",\n-                            \"source\"\n+                            \"listen\",\n+                            \"rpc\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.hadoop.FetchHDFS\",\n-                        \"typeDescription\": \"Retrieves a file from HDFS. The content of the incoming FlowFile is replaced by the content of the file in HDFS. The file in HDFS is left intact without any changes being made to it.\",\n+                        \"type\": \"org.apache.nifi.processors.grpc.ListenGRPC\",\n+                        \"typeDescription\": \"Starts a gRPC server and listens on the given port to transform the incoming messages into FlowFiles. The message format is defined by the standard gRPC protobuf IDL provided by NiFi. gRPC isn't intended to carry large payloads, so this processor should be used only when FlowFile sizes are on the order of megabytes. The default maximum message size is 4MB.\",\n                         \"version\": \"1.27.0\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"When a FlowFile is routed to 'failure', this attribute is added indicating why the file could not be fetched from HDFS\",\n-                                \"name\": \"hdfs.failure.reason\"\n+                                \"description\": \"The DN of the user who sent the FlowFile to this NiFi\",\n+                                \"name\": \"listengrpc.remote.user.dn\"\n                             },\n                             {\n-                                \"description\": \"The hadoop url for the file is stored in this attribute.\",\n-                                \"name\": \"hadoop.file.url\"\n+                                \"description\": \"The IP of the client who sent the FlowFile to this NiFi\",\n+                                \"name\": \"listengrpc.remote.host\"\n                             }\n                         ]\n-                    },\n+                    }\n+                ],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"1.27.0\"\n+        },\n+        {\n+            \"artifact\": \"nifi-hbase_2-client-service-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-hadoop-nar\",\n+                        \"artifact\": \"nifi-hbase_2-client-service-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n-                        \"defaultBulletinLevel\": \"WARN\",\n-                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": 1,\n-                            \"TIMER_DRIVEN\": 1\n-                        },\n-                        \"defaultPenaltyDuration\": \"30 sec\",\n-                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"0 sec\"\n-                        },\n-                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n-                        \"defaultYieldDuration\": \"1 sec\",\n-                        \"explicitRestrictions\": [\n-                            {\n-                                \"explanation\": \"Provides operator the ability to retrieve any file that NiFi has access to in HDFS or the local filesystem.\",\n-                                \"requiredPermission\": \"read distributed filesystem\"\n-                            },\n-                            {\n-                                \"explanation\": \"Provides operator the ability to delete any file that NiFi has access to in HDFS or the local filesystem.\",\n-                                \"requiredPermission\": \"write distributed filesystem\"\n-                            }\n-                        ],\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n-                        \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Additional Classpath Resources\": {\n-                                \"description\": \"A comma-separated list of paths to files and/or directories that will be added to the classpath and used for loading native libraries. When specifying a directory, all files with in the directory will be added to the classpath, but further sub-directories will not be included.\",\n-                                \"displayName\": \"Additional Classpath Resources\",\n+                            \"HBase Cache Table Name\": {\n+                                \"description\": \"Name of the table on HBase to use for the cache.\",\n+                                \"displayName\": \"HBase Cache Table Name\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Additional Classpath Resources\",\n-                                \"required\": false,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"MULTIPLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\",\n-                                        \"DIRECTORY\"\n-                                    ]\n-                                },\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"HBase Cache Table Name\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Batch Size\": {\n-                                \"defaultValue\": \"100\",\n-                                \"description\": \"The maximum number of files to pull in each iteration, based on run schedule.\",\n-                                \"displayName\": \"Batch Size\",\n+                            \"HBase Client Service\": {\n+                                \"description\": \"Specifies the HBase Client Controller Service to use for accessing HBase.\",\n+                                \"displayName\": \"HBase Client Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Batch Size\",\n+                                \"name\": \"HBase Client Service\",\n                                 \"required\": true,\n-                                \"sensitive\": false\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.hbase.HBaseClientService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n                             },\n-                            \"Compression codec\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"No compression\",\n-                                        \"displayName\": \"NONE\",\n-                                        \"value\": \"NONE\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Default ZLIB compression\",\n-                                        \"displayName\": \"DEFAULT\",\n-                                        \"value\": \"DEFAULT\"\n-                                    },\n-                                    {\n-                                        \"description\": \"BZIP compression\",\n-                                        \"displayName\": \"BZIP\",\n-                                        \"value\": \"BZIP\"\n-                                    },\n-                                    {\n-                                        \"description\": \"GZIP compression\",\n-                                        \"displayName\": \"GZIP\",\n-                                        \"value\": \"GZIP\"\n-                                    },\n-                                    {\n-                                        \"description\": \"LZ4 compression\",\n-                                        \"displayName\": \"LZ4\",\n-                                        \"value\": \"LZ4\"\n-                                    },\n-                                    {\n-                                        \"description\": \"LZO compression - it assumes LD_LIBRARY_PATH has been set and jar is available\",\n-                                        \"displayName\": \"LZO\",\n-                                        \"value\": \"LZO\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Snappy compression\",\n-                                        \"displayName\": \"SNAPPY\",\n-                                        \"value\": \"SNAPPY\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Will attempt to automatically detect the compression codec.\",\n-                                        \"displayName\": \"AUTOMATIC\",\n-                                        \"value\": \"AUTOMATIC\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"NONE\",\n-                                \"description\": \"\",\n-                                \"displayName\": \"Compression codec\",\n+                            \"HBase Column Family\": {\n+                                \"defaultValue\": \"f\",\n+                                \"description\": \"Name of the column family on HBase to use for the cache.\",\n+                                \"displayName\": \"HBase Column Family\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Compression codec\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"HBase Column Family\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Directory\": {\n-                                \"description\": \"The HDFS directory from which files should be read\",\n-                                \"displayName\": \"Directory\",\n+                            \"HBase Column Qualifier\": {\n+                                \"defaultValue\": \"q\",\n+                                \"description\": \"Name of the column qualifier on HBase to use for the cache\",\n+                                \"displayName\": \"HBase Column Qualifier\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Directory\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"HBase Column Qualifier\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"File Filter Regex\": {\n-                                \"description\": \"A Java Regular Expression for filtering Filenames; if a filter is supplied then only files whose names match that Regular Expression will be fetched, otherwise all files will be fetched\",\n-                                \"displayName\": \"File Filter Regex\",\n+                            \"hb-lu-authorizations\": {\n+                                \"description\": \"The list of authorization tokens to be used with cell visibility if it is enabled. These will be used to override the default authorization list for the user accessing HBase.\",\n+                                \"displayName\": \"Authorizations\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"File Filter Regex\",\n+                                \"name\": \"hb-lu-authorizations\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Filter Match Name Only\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"true\",\n-                                \"description\": \"If true then File Filter Regex will match on just the filename, otherwise subdirectory names will be included with filename in the regex comparison\",\n-                                \"displayName\": \"Filter Match Name Only\",\n+                            \"hbase-cache-visibility-expression\": {\n+                                \"defaultValue\": \"\",\n+                                \"description\": \"The default visibility expression to apply to cells when visibility expression support is enabled.\",\n+                                \"displayName\": \"Visibility Expression\",\n                                 \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"hbase-cache-visibility-expression\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            }\n+                        },\n+                        \"providedApiImplementations\": [\n+                            {\n+                                \"artifact\": \"nifi-standard-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.distributed.cache.client.DistributedMapCacheClient\",\n+                                \"version\": \"1.27.0\"\n+                            },\n+                            {\n+                                \"artifact\": \"nifi-standard-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.distributed.cache.client.AtomicDistributedMapCacheClient\",\n+                                \"version\": \"1.27.0\"\n+                            }\n+                        ],\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.hbase.HBase_2_ClientService\"\n+                        ],\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"cache\",\n+                            \"cluster\",\n+                            \"distributed\",\n+                            \"hbase\",\n+                            \"map\",\n+                            \"state\"\n+                        ],\n+                        \"type\": \"org.apache.nifi.hbase.HBase_2_ClientMapCacheService\",\n+                        \"typeDescription\": \"Provides the ability to use an HBase table as a cache, in place of a DistributedMapCache. Uses a HBase_2_ClientService controller to communicate with HBase.\",\n+                        \"version\": \"1.27.0\"\n+                    },\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-hbase_2-client-service-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"e0c4461\"\n+                        },\n+                        \"dynamicProperties\": [\n+                            {\n+                                \"description\": \"These properties will be set on the HBase configuration after loading any provided configuration files.\",\n                                 \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Filter Match Name Only\",\n-                                \"required\": true,\n+                                \"name\": \"The name of an HBase configuration property.\",\n+                                \"value\": \"The value of the given HBase configuration property.\"\n+                            }\n+                        ],\n+                        \"explicitRestrictions\": [\n+                            {\n+                                \"explanation\": \"Client JAR Location can reference resources over HTTP\",\n+                                \"requiredPermission\": \"reference remote resources\"\n+                            }\n+                        ],\n+                        \"group\": \"org.apache.nifi\",\n+                        \"propertyDescriptors\": {\n+                            \"HBase Client Retries\": {\n+                                \"defaultValue\": \"1\",\n+                                \"description\": \"The number of times the HBase client will retry connecting. Required if Hadoop Configuration Files are not provided.\",\n+                                \"displayName\": \"HBase Client Retries\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"HBase Client Retries\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Hadoop Configuration Resources\": {\n-                                \"description\": \"A file or comma separated list of files which contains the Hadoop file system configuration. Without this, Hadoop will search the classpath for a 'core-site.xml' and 'hdfs-site.xml' file or will revert to a default configuration. To use swebhdfs, see 'Additional Details' section of PutHDFS's documentation.\",\n-                                \"displayName\": \"Hadoop Configuration Resources\",\n+                            \"Hadoop Configuration Files\": {\n+                                \"description\": \"Comma-separated list of Hadoop Configuration files, such as hbase-site.xml and core-site.xml for kerberos, including full paths to the files.\",\n+                                \"displayName\": \"Hadoop Configuration Files\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Hadoop Configuration Resources\",\n+                                \"name\": \"Hadoop Configuration Files\",\n                                 \"required\": false,\n                                 \"resourceDefinition\": {\n                                     \"cardinality\": \"MULTIPLE\",\n                                     \"resourceTypes\": [\n+                                        \"DIRECTORY\",\n                                         \"FILE\"\n                                     ]\n                                 },\n                                 \"sensitive\": false\n                             },\n-                            \"IO Buffer Size\": {\n-                                \"description\": \"Amount of memory to use to buffer file contents during IO. This overrides the Hadoop Configuration\",\n-                                \"displayName\": \"IO Buffer Size\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"IO Buffer Size\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Ignore Dotted Files\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"true\",\n-                                \"description\": \"If true, files whose names begin with a dot (\\\".\\\") will be ignored\",\n-                                \"displayName\": \"Ignore Dotted Files\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Ignore Dotted Files\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Keep Source File\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"Determines whether to delete the file from HDFS after it has been successfully transferred. If true, the file will be fetched repeatedly. This is intended for testing only.\",\n-                                \"displayName\": \"Keep Source File\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Keep Source File\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n                             \"Kerberos Keytab\": {\n                                 \"description\": \"Kerberos keytab associated with the principal. Requires nifi.kerberos.krb5.file to be set in your nifi.properties\",\n                                 \"displayName\": \"Kerberos Keytab\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n                                 \"name\": \"Kerberos Keytab\",\n@@ -38022,78 +35362,60 @@\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n                                 \"name\": \"Kerberos Principal\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Kerberos Relogin Period\": {\n-                                \"defaultValue\": \"4 hours\",\n-                                \"description\": \"Period of time which should pass before attempting a kerberos relogin.\\n\\nThis property has been deprecated, and has no effect on processing. Relogins now occur automatically.\",\n-                                \"displayName\": \"Kerberos Relogin Period\",\n+                            \"Phoenix Client JAR Location\": {\n+                                \"description\": \"The full path to the Phoenix client JAR. Required if Phoenix is installed on top of HBase.\",\n+                                \"displayName\": \"Phoenix Client JAR Location\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Kerberos Relogin Period\",\n+                                \"name\": \"Phoenix Client JAR Location\",\n                                 \"required\": false,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"SINGLE\",\n+                                    \"resourceTypes\": [\n+                                        \"DIRECTORY\",\n+                                        \"FILE\",\n+                                        \"URL\"\n+                                    ]\n+                                },\n                                 \"sensitive\": false\n                             },\n-                            \"Maximum File Age\": {\n-                                \"description\": \"The maximum age that a file must be in order to be pulled; any file older than this amount of time (based on last modification date) will be ignored\",\n-                                \"displayName\": \"Maximum File Age\",\n+                            \"ZooKeeper Client Port\": {\n+                                \"description\": \"The port on which ZooKeeper is accepting client connections. Required if Hadoop Configuration Files are not provided.\",\n+                                \"displayName\": \"ZooKeeper Client Port\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Maximum File Age\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"ZooKeeper Client Port\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Minimum File Age\": {\n-                                \"defaultValue\": \"0 sec\",\n-                                \"description\": \"The minimum age that a file must be in order to be pulled; any file younger than this amount of time (based on last modification date) will be ignored\",\n-                                \"displayName\": \"Minimum File Age\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Minimum File Age\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Polling Interval\": {\n-                                \"defaultValue\": \"0 sec\",\n-                                \"description\": \"Indicates how long to wait between performing directory listings\",\n-                                \"displayName\": \"Polling Interval\",\n+                            \"ZooKeeper Quorum\": {\n+                                \"description\": \"Comma-separated list of ZooKeeper hosts for HBase. Required if Hadoop Configuration Files are not provided.\",\n+                                \"displayName\": \"ZooKeeper Quorum\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Polling Interval\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"ZooKeeper Quorum\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Recurse Subdirectories\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"true\",\n-                                \"description\": \"Indicates whether to pull files from subdirectories of the HDFS directory\",\n-                                \"displayName\": \"Recurse Subdirectories\",\n+                            \"ZooKeeper ZNode Parent\": {\n+                                \"description\": \"The ZooKeeper ZNode Parent value for HBase (example: /hbase). Required if Hadoop Configuration Files are not provided.\",\n+                                \"displayName\": \"ZooKeeper ZNode Parent\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Recurse Subdirectories\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"ZooKeeper ZNode Parent\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n                             \"kerberos-credentials-service\": {\n                                 \"description\": \"Specifies the Kerberos Credentials Controller Service that should be used for authenticating with Kerberos\",\n                                 \"displayName\": \"Kerberos Credentials Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n@@ -38121,1230 +35443,880 @@\n                                     \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n                                     \"type\": \"org.apache.nifi.kerberos.KerberosUserService\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             }\n                         },\n-                        \"restricted\": true,\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.processors.hadoop.ListHDFS\",\n-                            \"org.apache.nifi.processors.hadoop.PutHDFS\"\n-                        ],\n-                        \"sideEffectFree\": false,\n-                        \"supportedRelationships\": [\n+                        \"providedApiImplementations\": [\n                             {\n-                                \"description\": \"All files retrieved from HDFS are transferred to this relationship\",\n-                                \"name\": \"success\"\n+                                \"artifact\": \"nifi-standard-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.hbase.HBaseClientService\",\n+                                \"version\": \"1.27.0\"\n                             }\n                         ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": false,\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": false,\n+                        \"restricted\": true,\n+                        \"supportsDynamicProperties\": true,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"HCFS\",\n-                            \"HDFS\",\n-                            \"fetch\",\n-                            \"filesystem\",\n-                            \"get\",\n-                            \"hadoop\",\n-                            \"ingest\",\n-                            \"source\"\n+                            \"client\",\n+                            \"hbase\"\n                         ],\n-                        \"triggerSerially\": false,\n-                        \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": true,\n-                        \"type\": \"org.apache.nifi.processors.hadoop.GetHDFS\",\n-                        \"typeDescription\": \"Fetch files from Hadoop Distributed File System (HDFS) into FlowFiles. This Processor will delete the file from HDFS after fetching it.\",\n-                        \"version\": \"1.27.0\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"The name of the file that was read from HDFS.\",\n-                                \"name\": \"filename\"\n-                            },\n-                            {\n-                                \"description\": \"The path is set to the relative path of the file's directory on HDFS. For example, if the Directory property is set to /tmp, then files picked up from /tmp will have the path attribute set to \\\"./\\\". If the Recurse Subdirectories property is set to true and a file is picked up from /tmp/abc/1/2/3, then the path attribute will be set to \\\"abc/1/2/3\\\".\",\n-                                \"name\": \"path\"\n-                            }\n-                        ]\n+                        \"type\": \"org.apache.nifi.hbase.HBase_2_ClientService\",\n+                        \"typeDescription\": \"Implementation of HBaseClientService using the HBase 2.1.1 client. This service can be configured by providing a comma-separated list of configuration files, or by specifying values for the other properties. If configuration files are provided, they will be loaded first, and the values of the additional properties will override the values from the configuration files. In addition, any user defined properties on the processor will also be passed to the HBase configuration.\",\n+                        \"version\": \"1.27.0\"\n                     },\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-hadoop-nar\",\n+                        \"artifact\": \"nifi-hbase_2-client-service-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n-                        \"defaultBulletinLevel\": \"WARN\",\n-                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": 1,\n-                            \"TIMER_DRIVEN\": 1\n-                        },\n-                        \"defaultPenaltyDuration\": \"30 sec\",\n-                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"0 sec\"\n-                        },\n-                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n-                        \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_ALLOWED\",\n-                        \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Additional Classpath Resources\": {\n-                                \"description\": \"A comma-separated list of paths to files and/or directories that will be added to the classpath and used for loading native libraries. When specifying a directory, all files with in the directory will be added to the classpath, but further sub-directories will not be included.\",\n-                                \"displayName\": \"Additional Classpath Resources\",\n+                            \"hb-lu-authorizations\": {\n+                                \"description\": \"The list of authorization tokens to be used with cell visibility if it is enabled. These will be used to override the default authorization list for the user accessing HBase.\",\n+                                \"displayName\": \"Authorizations\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Additional Classpath Resources\",\n+                                \"name\": \"hb-lu-authorizations\",\n                                 \"required\": false,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"MULTIPLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\",\n-                                        \"DIRECTORY\"\n-                                    ]\n-                                },\n                                 \"sensitive\": false\n                             },\n-                            \"Hadoop Configuration Resources\": {\n-                                \"description\": \"A file or comma separated list of files which contains the Hadoop file system configuration. Without this, Hadoop will search the classpath for a 'core-site.xml' and 'hdfs-site.xml' file or will revert to a default configuration. To use swebhdfs, see 'Additional Details' section of PutHDFS's documentation.\",\n-                                \"displayName\": \"Hadoop Configuration Resources\",\n+                            \"hb-lu-charset\": {\n+                                \"defaultValue\": \"UTF-8\",\n+                                \"description\": \"Specifies the character set used to decode bytes retrieved from HBase.\",\n+                                \"displayName\": \"Character Set\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Hadoop Configuration Resources\",\n-                                \"required\": false,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"MULTIPLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\"\n-                                    ]\n-                                },\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"hb-lu-charset\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Kerberos Keytab\": {\n-                                \"description\": \"Kerberos keytab associated with the principal. Requires nifi.kerberos.krb5.file to be set in your nifi.properties\",\n-                                \"displayName\": \"Kerberos Keytab\",\n+                            \"hb-lu-return-cols\": {\n+                                \"description\": \"A comma-separated list of \\\\\\\"<colFamily>:<colQualifier>\\\\\\\" pairs to return when scanning. To return all columns for a given family, leave off the qualifier such as \\\\\\\"<colFamily1>,<colFamily2>\\\\\\\".\",\n+                                \"displayName\": \"Columns\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Kerberos Keytab\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"hb-lu-return-cols\",\n                                 \"required\": false,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"SINGLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\"\n-                                    ]\n-                                },\n                                 \"sensitive\": false\n                             },\n-                            \"Kerberos Password\": {\n-                                \"description\": \"Kerberos password associated with the principal.\",\n-                                \"displayName\": \"Kerberos Password\",\n+                            \"hb-lu-table-name\": {\n+                                \"description\": \"The name of the table where look ups will be run.\",\n+                                \"displayName\": \"Table Name\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Kerberos Password\",\n-                                \"required\": false,\n-                                \"sensitive\": true\n-                            },\n-                            \"Kerberos Principal\": {\n-                                \"description\": \"Kerberos principal to authenticate as. Requires nifi.kerberos.krb5.file to be set in your nifi.properties\",\n-                                \"displayName\": \"Kerberos Principal\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Kerberos Principal\",\n-                                \"required\": false,\n+                                \"name\": \"hb-lu-table-name\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Kerberos Relogin Period\": {\n-                                \"defaultValue\": \"4 hours\",\n-                                \"description\": \"Period of time which should pass before attempting a kerberos relogin.\\n\\nThis property has been deprecated, and has no effect on processing. Relogins now occur automatically.\",\n-                                \"displayName\": \"Kerberos Relogin Period\",\n+                            \"hbase-client-service\": {\n+                                \"description\": \"Specifies the HBase Client Controller Service to use for accessing HBase.\",\n+                                \"displayName\": \"HBase Client Service\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Kerberos Relogin Period\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"gethdfsfileinfo-batch-size\": {\n-                                \"description\": \"Number of records to put into an output flowfile when 'Destination' is set to 'Content' and 'Group Results' is set to 'None'\",\n-                                \"displayName\": \"Batch Size\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"hbase-client-service\",\n+                                \"required\": true,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.hbase.HBaseClientService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            }\n+                        },\n+                        \"providedApiImplementations\": [\n+                            {\n+                                \"artifact\": \"nifi-standard-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.lookup.LookupService\",\n+                                \"version\": \"1.27.0\"\n+                            }\n+                        ],\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"hbase\",\n+                            \"lookup\",\n+                            \"record\",\n+                            \"service\"\n+                        ],\n+                        \"type\": \"org.apache.nifi.hbase.HBase_2_RecordLookupService\",\n+                        \"typeDescription\": \"A lookup service that retrieves one or more columns from HBase and returns them as a record. The lookup coordinates must contain 'rowKey' which will be the HBase row id.\",\n+                        \"version\": \"1.27.0\"\n+                    }\n+                ],\n+                \"processors\": [],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"1.27.0\"\n+        },\n+        {\n+            \"artifact\": \"nifi-hazelcast-services-api-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [],\n+                \"processors\": [],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"1.27.0\"\n+        },\n+        {\n+            \"artifact\": \"nifi-smb-smbj-client-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-smb-smbj-client-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"e0c4461\"\n+                        },\n+                        \"group\": \"org.apache.nifi\",\n+                        \"propertyDescriptors\": {\n+                            \"domain\": {\n+                                \"description\": \"The domain used for authentication. Optional, in most cases username and password is sufficient.\",\n+                                \"displayName\": \"Domain\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"gethdfsfileinfo-batch-size\",\n+                                \"name\": \"domain\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"gethdfsfileinfo-destination\": {\n+                            \"enable-dfs\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Details of given HDFS object will be stored in attributes of flowfile. WARNING: In case when scan finds thousands or millions of objects, having huge values in attribute could impact flow file repo and GC/heap usage. Use content destination for such cases.\",\n-                                        \"displayName\": \"Attributes\",\n-                                        \"value\": \"gethdfsfileinfo-dest-attr\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n-                                        \"description\": \"Details of given HDFS object will be stored in a content in JSON format\",\n-                                        \"displayName\": \"Content\",\n-                                        \"value\": \"gethdfsfileinfo-dest-content\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"gethdfsfileinfo-dest-content\",\n-                                \"description\": \"Sets the destination for the resutls. When set to 'Content', attributes of flowfile won't be used for storing results. \",\n-                                \"displayName\": \"Destination\",\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"Enables accessing Distributed File System (DFS) and following DFS links during SMB operations.\",\n+                                \"displayName\": \"Enable DFS\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"gethdfsfileinfo-destination\",\n+                                \"name\": \"enable-dfs\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"gethdfsfileinfo-dir-filter\": {\n-                                \"description\": \"Regex. Only directories whose names match the given regular expression will be picked up. If not provided, any filter would be apply (performance considerations).\",\n-                                \"displayName\": \"Directory Filter\",\n+                            \"hostname\": {\n+                                \"description\": \"The network host of the SMB file server.\",\n+                                \"displayName\": \"Hostname\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"gethdfsfileinfo-dir-filter\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"hostname\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"gethdfsfileinfo-file-exclude-filter\": {\n-                                \"description\": \"Regex. Files whose names match the given regular expression will not be picked up. If not provided, any filter won't be apply (performance considerations).\",\n-                                \"displayName\": \"Exclude Files\",\n+                            \"password\": {\n+                                \"description\": \"The password used for authentication.\",\n+                                \"displayName\": \"Password\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"gethdfsfileinfo-file-exclude-filter\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"password\",\n                                 \"required\": false,\n-                                \"sensitive\": false\n+                                \"sensitive\": true\n                             },\n-                            \"gethdfsfileinfo-file-filter\": {\n-                                \"description\": \"Regex. Only files whose names match the given regular expression will be picked up. If not provided, any filter would be apply (performance considerations).\",\n-                                \"displayName\": \"File Filter\",\n+                            \"port\": {\n+                                \"defaultValue\": \"445\",\n+                                \"description\": \"Port to use for connection.\",\n+                                \"displayName\": \"Port\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"gethdfsfileinfo-file-filter\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"port\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"gethdfsfileinfo-full-path\": {\n-                                \"defaultValue\": \"\",\n-                                \"description\": \"A directory to start listing from, or a file's full path.\",\n-                                \"displayName\": \"Full path\",\n+                            \"share\": {\n+                                \"description\": \"The network share to which files should be listed from. This is the \\\"first folder\\\"after the hostname: smb://hostname:port/[share]/dir1/dir2\",\n+                                \"displayName\": \"Share\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"gethdfsfileinfo-full-path\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"share\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"gethdfsfileinfo-group\": {\n+                            \"smb-dialect\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Group all results into a single flowfile.\",\n-                                        \"displayName\": \"All\",\n-                                        \"value\": \"gethdfsfileinfo-group-all\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"AUTO\",\n+                                        \"value\": \"AUTO\"\n                                     },\n                                     {\n-                                        \"description\": \"Group HDFS objects by their parent directories only. Processor will generate flowfile for each directory (if recursive). If 'Recurse Subdirectories' property set to 'false', then will have the same effect as 'All'\",\n-                                        \"displayName\": \"Parent Directory\",\n-                                        \"value\": \"gethdfsfileinfo-group-parent-dir\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"SMB 2.0.2\",\n+                                        \"value\": \"SMB_2_0_2\"\n                                     },\n                                     {\n-                                        \"description\": \"Don't group results. Generate flowfile per each HDFS object.\",\n-                                        \"displayName\": \"None\",\n-                                        \"value\": \"gethdfsfileinfo-group-none\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"SMB 2.1\",\n+                                        \"value\": \"SMB_2_1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"SMB 3.0\",\n+                                        \"value\": \"SMB_3_0\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"SMB 3.0.2\",\n+                                        \"value\": \"SMB_3_0_2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"SMB 3.1.1\",\n+                                        \"value\": \"SMB_3_1_1\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"gethdfsfileinfo-group-all\",\n-                                \"description\": \"Groups HDFS objects\",\n-                                \"displayName\": \"Group Results\",\n+                                \"defaultValue\": \"AUTO\",\n+                                \"description\": \"The SMB dialect is negotiated between the client and the server by default to the highest common version supported by both end. In some rare cases, the client-server communication may fail with the automatically negotiated dialect. This property can be used to set the dialect explicitly (e.g. to downgrade to a lower version), when those situations would occur.\",\n+                                \"displayName\": \"SMB Dialect\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"gethdfsfileinfo-group\",\n+                                \"name\": \"smb-dialect\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"gethdfsfileinfo-ignore-dotted-dirs\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"true\",\n-                                \"description\": \"If true, directories whose names begin with a dot (\\\".\\\") will be ignored\",\n-                                \"displayName\": \"Ignore Dotted Directories\",\n+                            \"timeout\": {\n+                                \"defaultValue\": \"5 sec\",\n+                                \"description\": \"Timeout for read and write operations.\",\n+                                \"displayName\": \"Timeout\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"gethdfsfileinfo-ignore-dotted-dirs\",\n+                                \"name\": \"timeout\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"gethdfsfileinfo-ignore-dotted-files\": {\n+                            \"use-encryption\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"true\",\n                                         \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"false\",\n                                         \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"true\",\n-                                \"description\": \"If true, files whose names begin with a dot (\\\".\\\") will be ignored\",\n-                                \"displayName\": \"Ignore Dotted Files\",\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"Turns on/off encrypted communication between the client and the server. The property's behavior is SMB dialect dependent: SMB 2.x does not support encryption and the property has no effect. In case of SMB 3.x, it is a hint/request to the server to turn encryption on if the server also supports it.\",\n+                                \"displayName\": \"Use Encryption\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"gethdfsfileinfo-ignore-dotted-files\",\n+                                \"name\": \"use-encryption\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"gethdfsfileinfo-recurse-subdirs\": {\n+                            \"username\": {\n+                                \"defaultValue\": \"Guest\",\n+                                \"description\": \"The username used for authentication.\",\n+                                \"displayName\": \"Username\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"username\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            }\n+                        },\n+                        \"providedApiImplementations\": [\n+                            {\n+                                \"artifact\": \"nifi-smb-client-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.services.smb.SmbClientProviderService\",\n+                                \"version\": \"1.27.0\"\n+                            }\n+                        ],\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"samba, smb, cifs, files\"\n+                        ],\n+                        \"type\": \"org.apache.nifi.services.smb.SmbjClientProviderService\",\n+                        \"typeDescription\": \"Provides access to SMB Sessions with shared authentication credentials.\",\n+                        \"version\": \"1.27.0\"\n+                    }\n+                ],\n+                \"processors\": [],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"1.27.0\"\n+        },\n+        {\n+            \"artifact\": \"nifi-redis-service-api-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [],\n+                \"processors\": [],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"1.27.0\"\n+        },\n+        {\n+            \"artifact\": \"nifi-parquet-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-parquet-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"e0c4461\"\n+                        },\n+                        \"group\": \"org.apache.nifi\",\n+                        \"propertyDescriptors\": {\n+                            \"avro-read-compatibility\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"true\",\n                                         \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"false\",\n                                         \"value\": \"false\"\n                                     }\n                                 ],\n                                 \"defaultValue\": \"true\",\n-                                \"description\": \"Indicates whether to list files from subdirectories of the HDFS directory\",\n-                                \"displayName\": \"Recurse Subdirectories\",\n+                                \"description\": \"Specifies the value for 'parquet.avro.compatible' in the underlying Parquet library\",\n+                                \"displayName\": \"Avro Read Compatibility\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"gethdfsfileinfo-recurse-subdirs\",\n+                                \"name\": \"avro-read-compatibility\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n-                            },\n-                            \"kerberos-credentials-service\": {\n-                                \"description\": \"Specifies the Kerberos Credentials Controller Service that should be used for authenticating with Kerberos\",\n-                                \"displayName\": \"Kerberos Credentials Service\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"kerberos-credentials-service\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.kerberos.KerberosCredentialsService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            },\n-                            \"kerberos-user-service\": {\n-                                \"description\": \"Specifies the Kerberos User Controller Service that should be used for authenticating with Kerberos\",\n-                                \"displayName\": \"Kerberos User Service\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"kerberos-user-service\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.kerberos.KerberosUserService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n                             }\n                         },\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.processors.hadoop.FetchHDFS\",\n-                            \"org.apache.nifi.processors.hadoop.GetHDFS\",\n-                            \"org.apache.nifi.processors.hadoop.ListHDFS\",\n-                            \"org.apache.nifi.processors.hadoop.PutHDFS\"\n-                        ],\n-                        \"sideEffectFree\": false,\n-                        \"supportedRelationships\": [\n-                            {\n-                                \"description\": \"All successfully generated FlowFiles are transferred to this relationship\",\n-                                \"name\": \"success\"\n-                            },\n-                            {\n-                                \"description\": \"If no objects are found, original FlowFile are transferred to this relationship\",\n-                                \"name\": \"not found\"\n-                            },\n-                            {\n-                                \"description\": \"All failed attempts to access HDFS will be routed to this relationship\",\n-                                \"name\": \"failure\"\n-                            },\n+                        \"providedApiImplementations\": [\n                             {\n-                                \"description\": \"Original FlowFiles are transferred to this relationship\",\n-                                \"name\": \"original\"\n+                                \"artifact\": \"nifi-standard-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n+                                \"version\": \"1.27.0\"\n                             }\n                         ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n-                        \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"HCFS\",\n-                            \"HDFS\",\n-                            \"filesystem\",\n-                            \"get\",\n-                            \"hadoop\",\n-                            \"ingest\",\n-                            \"list\",\n-                            \"source\"\n+                            \"parquet\",\n+                            \"parse\",\n+                            \"reader\",\n+                            \"record\",\n+                            \"row\"\n                         ],\n-                        \"triggerSerially\": false,\n-                        \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.hadoop.GetHDFSFileInfo\",\n-                        \"typeDescription\": \"Retrieves a listing of files and directories from HDFS. This processor creates a FlowFile(s) that represents the HDFS file/dir with relevant information. Main purpose of this processor to provide functionality similar to HDFS Client, i.e. count, du, ls, test, etc. Unlike ListHDFS, this processor is stateless, supports incoming connections and provides information on a dir level. \",\n-                        \"version\": \"1.27.0\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"The name of the file/dir found on HDFS.\",\n-                                \"name\": \"hdfs.objectName\"\n-                            },\n-                            {\n-                                \"description\": \"The path is set to the absolute path of the object's parent directory on HDFS. For example, if an object is a directory 'foo', under directory '/bar' then 'hdfs.objectName' will have value 'foo', and 'hdfs.path' will be '/bar'\",\n-                                \"name\": \"hdfs.path\"\n-                            },\n-                            {\n-                                \"description\": \"The type of an object. Possible values: directory, file, link\",\n-                                \"name\": \"hdfs.type\"\n-                            },\n-                            {\n-                                \"description\": \"The user that owns the object in HDFS\",\n-                                \"name\": \"hdfs.owner\"\n-                            },\n-                            {\n-                                \"description\": \"The group that owns the object in HDFS\",\n-                                \"name\": \"hdfs.group\"\n-                            },\n-                            {\n-                                \"description\": \"The timestamp of when the object in HDFS was last modified, as milliseconds since midnight Jan 1, 1970 UTC\",\n-                                \"name\": \"hdfs.lastModified\"\n-                            },\n-                            {\n-                                \"description\": \"In case of files: The number of bytes in the file in HDFS.  In case of dirs: Retuns storage space consumed by directory. \",\n-                                \"name\": \"hdfs.length\"\n-                            },\n-                            {\n-                                \"description\": \"In case of type='directory' will represent total count of files under this dir. Won't be populated to other types of HDFS objects. \",\n-                                \"name\": \"hdfs.count.files\"\n-                            },\n-                            {\n-                                \"description\": \"In case of type='directory' will represent total count of directories under this dir (including itself). Won't be populated to other types of HDFS objects. \",\n-                                \"name\": \"hdfs.count.dirs\"\n-                            },\n-                            {\n-                                \"description\": \"The number of HDFS replicas for the file\",\n-                                \"name\": \"hdfs.replication\"\n-                            },\n-                            {\n-                                \"description\": \"The permissions for the object in HDFS. This is formatted as 3 characters for the owner, 3 for the group, and 3 for other users. For example rw-rw-r--\",\n-                                \"name\": \"hdfs.permissions\"\n-                            },\n-                            {\n-                                \"description\": \"The status contains comma separated list of file/dir paths, which couldn't be listed/accessed. Status won't be set if no errors occured.\",\n-                                \"name\": \"hdfs.status\"\n-                            },\n-                            {\n-                                \"description\": \"When destination is 'attribute', will be populated with full tree of HDFS directory in JSON format.WARNING: In case when scan finds thousands or millions of objects, having huge values in attribute could impact flow file repo and GC/heap usage. Use content destination for such cases\",\n-                                \"name\": \"hdfs.full.tree\"\n-                            }\n-                        ]\n+                        \"type\": \"org.apache.nifi.parquet.ParquetReader\",\n+                        \"typeDescription\": \"Parses Parquet data and returns each Parquet record as a separate Record object. The schema will come from the Parquet data itself.\",\n+                        \"version\": \"1.27.0\"\n                     },\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-hadoop-nar\",\n+                        \"artifact\": \"nifi-parquet-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n-                        \"defaultBulletinLevel\": \"WARN\",\n-                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": 1,\n-                            \"TIMER_DRIVEN\": 1\n-                        },\n-                        \"defaultPenaltyDuration\": \"30 sec\",\n-                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"0 sec\"\n-                        },\n-                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n-                        \"defaultYieldDuration\": \"1 sec\",\n-                        \"explicitRestrictions\": [\n-                            {\n-                                \"explanation\": \"Provides operator the ability to retrieve any file that NiFi has access to in HDFS or the local filesystem.\",\n-                                \"requiredPermission\": \"read distributed filesystem\"\n-                            },\n-                            {\n-                                \"explanation\": \"Provides operator the ability to delete any file that NiFi has access to in HDFS or the local filesystem.\",\n-                                \"requiredPermission\": \"write distributed filesystem\"\n-                            }\n-                        ],\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n-                        \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Additional Classpath Resources\": {\n-                                \"description\": \"A comma-separated list of paths to files and/or directories that will be added to the classpath and used for loading native libraries. When specifying a directory, all files with in the directory will be added to the classpath, but further sub-directories will not be included.\",\n-                                \"displayName\": \"Additional Classpath Resources\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Additional Classpath Resources\",\n-                                \"required\": false,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"MULTIPLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\",\n-                                        \"DIRECTORY\"\n-                                    ]\n-                                },\n-                                \"sensitive\": false\n-                            },\n-                            \"Batch Size\": {\n-                                \"defaultValue\": \"100\",\n-                                \"description\": \"The maximum number of files to pull in each iteration, based on run schedule.\",\n-                                \"displayName\": \"Batch Size\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Batch Size\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Compression codec\": {\n+                            \"Schema Write Strategy\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"No compression\",\n-                                        \"displayName\": \"NONE\",\n-                                        \"value\": \"NONE\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Default ZLIB compression\",\n-                                        \"displayName\": \"DEFAULT\",\n-                                        \"value\": \"DEFAULT\"\n-                                    },\n-                                    {\n-                                        \"description\": \"BZIP compression\",\n-                                        \"displayName\": \"BZIP\",\n-                                        \"value\": \"BZIP\"\n+                                        \"description\": \"Do not add any schema-related information to the FlowFile.\",\n+                                        \"displayName\": \"Do Not Write Schema\",\n+                                        \"value\": \"no-schema\"\n                                     },\n                                     {\n-                                        \"description\": \"GZIP compression\",\n-                                        \"displayName\": \"GZIP\",\n-                                        \"value\": \"GZIP\"\n+                                        \"description\": \"The FlowFile will be given an attribute named 'schema.name' and this attribute will indicate the name of the schema in the Schema Registry. Note that ifthe schema for a record is not obtained from a Schema Registry, then no attribute will be added.\",\n+                                        \"displayName\": \"Set 'schema.name' Attribute\",\n+                                        \"value\": \"schema-name\"\n                                     },\n                                     {\n-                                        \"description\": \"LZ4 compression\",\n-                                        \"displayName\": \"LZ4\",\n-                                        \"value\": \"LZ4\"\n+                                        \"description\": \"The FlowFile will be given an attribute named 'avro.schema' and this attribute will contain the Avro Schema that describes the records in the FlowFile. The contents of the FlowFile need not be Avro, but the text of the schema will be used.\",\n+                                        \"displayName\": \"Set 'avro.schema' Attribute\",\n+                                        \"value\": \"full-schema-attribute\"\n                                     },\n                                     {\n-                                        \"description\": \"LZO compression - it assumes LD_LIBRARY_PATH has been set and jar is available\",\n-                                        \"displayName\": \"LZO\",\n-                                        \"value\": \"LZO\"\n+                                        \"description\": \"The FlowFile will be given a set of 3 attributes to describe the schema: 'schema.identifier', 'schema.version', and 'schema.protocol.version'. Note that if the schema for a record does not contain the necessary identifier and version, an Exception will be thrown when attempting to write the data.\",\n+                                        \"displayName\": \"HWX Schema Reference Attributes\",\n+                                        \"value\": \"hwx-schema-ref-attributes\"\n                                     },\n                                     {\n-                                        \"description\": \"Snappy compression\",\n-                                        \"displayName\": \"SNAPPY\",\n-                                        \"value\": \"SNAPPY\"\n+                                        \"description\": \"The content of the FlowFile will contain a reference to a schema in the Schema Registry service. The reference is encoded as a single byte indicating the 'protocol version', followed by 8 bytes indicating the schema identifier, and finally 4 bytes indicating the schema version, as per the Hortonworks Schema Registry serializers and deserializers, as found at https://github.com/hortonworks/registry. This will be prepended to each FlowFile. Note that if the schema for a record does not contain the necessary identifier and version, an Exception will be thrown when attempting to write the data.\",\n+                                        \"displayName\": \"HWX Content-Encoded Schema Reference\",\n+                                        \"value\": \"hwx-content-encoded-schema\"\n                                     },\n                                     {\n-                                        \"description\": \"Will attempt to automatically detect the compression codec.\",\n-                                        \"displayName\": \"AUTOMATIC\",\n-                                        \"value\": \"AUTOMATIC\"\n+                                        \"description\": \"The content of the FlowFile will contain a reference to a schema in the Schema Registry service. The reference is encoded as a single 'Magic Byte' followed by 4 bytes representing the identifier of the schema, as outlined at http://docs.confluent.io/current/schema-registry/docs/serializer-formatter.html. This will be prepended to each FlowFile. Note that if the schema for a record does not contain the necessary identifier and version, an Exception will be thrown when attempting to write the data. This is based on the encoding used by version 3.2.x of the Confluent Schema Registry.\",\n+                                        \"displayName\": \"Confluent Schema Registry Reference\",\n+                                        \"value\": \"confluent-encoded\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"NONE\",\n-                                \"description\": \"\",\n-                                \"displayName\": \"Compression codec\",\n+                                \"defaultValue\": \"no-schema\",\n+                                \"description\": \"Specifies how the schema for a Record should be added to the data.\",\n+                                \"displayName\": \"Schema Write Strategy\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Compression codec\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Directory\": {\n-                                \"description\": \"The HDFS directory from which files should be read\",\n-                                \"displayName\": \"Directory\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Directory\",\n+                                \"name\": \"Schema Write Strategy\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"File Filter Regex\": {\n-                                \"description\": \"A Java Regular Expression for filtering Filenames; if a filter is supplied then only files whose names match that Regular Expression will be fetched, otherwise all files will be fetched\",\n-                                \"displayName\": \"File Filter Regex\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"File Filter Regex\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Filter Match Name Only\": {\n+                            \"avro-add-list-element-records\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"true\",\n                                         \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"false\",\n                                         \"value\": \"false\"\n                                     }\n                                 ],\n                                 \"defaultValue\": \"true\",\n-                                \"description\": \"If true then File Filter Regex will match on just the filename, otherwise subdirectory names will be included with filename in the regex comparison\",\n-                                \"displayName\": \"Filter Match Name Only\",\n+                                \"description\": \"Specifies the value for 'parquet.avro.add-list-element-records' in the underlying Parquet library\",\n+                                \"displayName\": \"Avro Add List Element Records\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Filter Match Name Only\",\n+                                \"name\": \"avro-add-list-element-records\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"FlowFile Content\": {\n+                            \"avro-write-old-list-structure\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"VALUE ONLY\",\n-                                        \"value\": \"VALUE ONLY\"\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"KEY VALUE PAIR\",\n-                                        \"value\": \"KEY VALUE PAIR\"\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"VALUE ONLY\",\n-                                \"description\": \"Indicate if the content is to be both the key and value of the Sequence File, or just the value.\",\n-                                \"displayName\": \"FlowFile Content\",\n+                                \"defaultValue\": \"true\",\n+                                \"description\": \"Specifies the value for 'parquet.avro.write-old-list-structure' in the underlying Parquet library\",\n+                                \"displayName\": \"Avro Write Old List Structure\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"FlowFile Content\",\n+                                \"name\": \"avro-write-old-list-structure\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Hadoop Configuration Resources\": {\n-                                \"description\": \"A file or comma separated list of files which contains the Hadoop file system configuration. Without this, Hadoop will search the classpath for a 'core-site.xml' and 'hdfs-site.xml' file or will revert to a default configuration. To use swebhdfs, see 'Additional Details' section of PutHDFS's documentation.\",\n-                                \"displayName\": \"Hadoop Configuration Resources\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Hadoop Configuration Resources\",\n-                                \"required\": false,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"MULTIPLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\"\n-                                    ]\n-                                },\n-                                \"sensitive\": false\n-                            },\n-                            \"IO Buffer Size\": {\n-                                \"description\": \"Amount of memory to use to buffer file contents during IO. This overrides the Hadoop Configuration\",\n-                                \"displayName\": \"IO Buffer Size\",\n+                            \"cache-size\": {\n+                                \"defaultValue\": \"1000\",\n+                                \"description\": \"Specifies how many Schemas should be cached\",\n+                                \"displayName\": \"Cache Size\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"IO Buffer Size\",\n-                                \"required\": false,\n+                                \"name\": \"cache-size\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Ignore Dotted Files\": {\n+                            \"compression-type\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"displayName\": \"UNCOMPRESSED\",\n+                                        \"value\": \"UNCOMPRESSED\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"displayName\": \"SNAPPY\",\n+                                        \"value\": \"SNAPPY\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"GZIP\",\n+                                        \"value\": \"GZIP\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"LZO\",\n+                                        \"value\": \"LZO\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"BROTLI\",\n+                                        \"value\": \"BROTLI\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"LZ4\",\n+                                        \"value\": \"LZ4\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"ZSTD\",\n+                                        \"value\": \"ZSTD\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"LZ4_RAW\",\n+                                        \"value\": \"LZ4_RAW\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"true\",\n-                                \"description\": \"If true, files whose names begin with a dot (\\\".\\\") will be ignored\",\n-                                \"displayName\": \"Ignore Dotted Files\",\n+                                \"defaultValue\": \"UNCOMPRESSED\",\n+                                \"description\": \"The type of compression for the file being written.\",\n+                                \"displayName\": \"Compression Type\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Ignore Dotted Files\",\n+                                \"name\": \"compression-type\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Keep Source File\": {\n+                            \"dictionary-page-size\": {\n+                                \"description\": \"The dictionary page size used by the Parquet writer. The value is specified in the format of <Data Size> <Data Unit> where Data Unit is one of B, KB, MB, GB, TB.\",\n+                                \"displayName\": \"Dictionary Page Size\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"dictionary-page-size\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"enable-dictionary-encoding\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"true\",\n                                         \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"false\",\n                                         \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"Determines whether to delete the file from HDFS after it has been successfully transferred. If true, the file will be fetched repeatedly. This is intended for testing only.\",\n-                                \"displayName\": \"Keep Source File\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Keep Source File\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Kerberos Keytab\": {\n-                                \"description\": \"Kerberos keytab associated with the principal. Requires nifi.kerberos.krb5.file to be set in your nifi.properties\",\n-                                \"displayName\": \"Kerberos Keytab\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Kerberos Keytab\",\n-                                \"required\": false,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"SINGLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\"\n-                                    ]\n-                                },\n-                                \"sensitive\": false\n-                            },\n-                            \"Kerberos Password\": {\n-                                \"description\": \"Kerberos password associated with the principal.\",\n-                                \"displayName\": \"Kerberos Password\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Kerberos Password\",\n-                                \"required\": false,\n-                                \"sensitive\": true\n-                            },\n-                            \"Kerberos Principal\": {\n-                                \"description\": \"Kerberos principal to authenticate as. Requires nifi.kerberos.krb5.file to be set in your nifi.properties\",\n-                                \"displayName\": \"Kerberos Principal\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Kerberos Principal\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Kerberos Relogin Period\": {\n-                                \"defaultValue\": \"4 hours\",\n-                                \"description\": \"Period of time which should pass before attempting a kerberos relogin.\\n\\nThis property has been deprecated, and has no effect on processing. Relogins now occur automatically.\",\n-                                \"displayName\": \"Kerberos Relogin Period\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Kerberos Relogin Period\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Maximum File Age\": {\n-                                \"description\": \"The maximum age that a file must be in order to be pulled; any file older than this amount of time (based on last modification date) will be ignored\",\n-                                \"displayName\": \"Maximum File Age\",\n+                                \"description\": \"Specifies whether dictionary encoding should be enabled for the Parquet writer\",\n+                                \"displayName\": \"Enable Dictionary Encoding\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Maximum File Age\",\n+                                \"name\": \"enable-dictionary-encoding\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Minimum File Age\": {\n-                                \"defaultValue\": \"0 sec\",\n-                                \"description\": \"The minimum age that a file must be in order to be pulled; any file younger than this amount of time (based on last modification date) will be ignored\",\n-                                \"displayName\": \"Minimum File Age\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Minimum File Age\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Polling Interval\": {\n-                                \"defaultValue\": \"0 sec\",\n-                                \"description\": \"Indicates how long to wait between performing directory listings\",\n-                                \"displayName\": \"Polling Interval\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Polling Interval\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Recurse Subdirectories\": {\n+                            \"enable-validation\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"true\",\n                                         \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"false\",\n                                         \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"true\",\n-                                \"description\": \"Indicates whether to pull files from subdirectories of the HDFS directory\",\n-                                \"displayName\": \"Recurse Subdirectories\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Recurse Subdirectories\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"kerberos-credentials-service\": {\n-                                \"description\": \"Specifies the Kerberos Credentials Controller Service that should be used for authenticating with Kerberos\",\n-                                \"displayName\": \"Kerberos Credentials Service\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"kerberos-credentials-service\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.kerberos.KerberosCredentialsService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            },\n-                            \"kerberos-user-service\": {\n-                                \"description\": \"Specifies the Kerberos User Controller Service that should be used for authenticating with Kerberos\",\n-                                \"displayName\": \"Kerberos User Service\",\n+                                \"description\": \"Specifies whether validation should be enabled for the Parquet writer\",\n+                                \"displayName\": \"Enable Validation\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"kerberos-user-service\",\n+                                \"name\": \"enable-validation\",\n                                 \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.kerberos.KerberosUserService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            }\n-                        },\n-                        \"restricted\": true,\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.processors.hadoop.PutHDFS\"\n-                        ],\n-                        \"sideEffectFree\": false,\n-                        \"supportedRelationships\": [\n-                            {\n-                                \"description\": \"All files retrieved from HDFS are transferred to this relationship\",\n-                                \"name\": \"success\"\n-                            }\n-                        ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": false,\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": false,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"HCFS\",\n-                            \"HDFS\",\n-                            \"fetch\",\n-                            \"get\",\n-                            \"hadoop\",\n-                            \"ingest\",\n-                            \"sequence file\",\n-                            \"source\"\n-                        ],\n-                        \"triggerSerially\": false,\n-                        \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": true,\n-                        \"type\": \"org.apache.nifi.processors.hadoop.GetHDFSSequenceFile\",\n-                        \"typeDescription\": \"Fetch sequence files from Hadoop Distributed File System (HDFS) into FlowFiles\",\n-                        \"version\": \"1.27.0\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"The name of the file that was read from HDFS.\",\n-                                \"name\": \"filename\"\n+                                \"sensitive\": false\n                             },\n-                            {\n-                                \"description\": \"The path is set to the relative path of the file's directory on HDFS. For example, if the Directory property is set to /tmp, then files picked up from /tmp will have the path attribute set to \\\"./\\\". If the Recurse Subdirectories property is set to true and a file is picked up from /tmp/abc/1/2/3, then the path attribute will be set to \\\"abc/1/2/3\\\".\",\n-                                \"name\": \"path\"\n-                            }\n-                        ]\n-                    },\n-                    {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-hadoop-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"e0c4461\"\n-                        },\n-                        \"defaultBulletinLevel\": \"WARN\",\n-                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": 1,\n-                            \"TIMER_DRIVEN\": 1\n-                        },\n-                        \"defaultPenaltyDuration\": \"30 sec\",\n-                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"1 min\"\n-                        },\n-                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n-                        \"defaultYieldDuration\": \"1 sec\",\n-                        \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n-                        \"primaryNodeOnly\": true,\n-                        \"propertyDescriptors\": {\n-                            \"Additional Classpath Resources\": {\n-                                \"description\": \"A comma-separated list of paths to files and/or directories that will be added to the classpath and used for loading native libraries. When specifying a directory, all files with in the directory will be added to the classpath, but further sub-directories will not be included.\",\n-                                \"displayName\": \"Additional Classpath Resources\",\n+                            \"int96-fields\": {\n+                                \"description\": \"List of fields with full path that should be treated as INT96 timestamps.\",\n+                                \"displayName\": \"INT96 Fields\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Additional Classpath Resources\",\n+                                \"name\": \"int96-fields\",\n                                 \"required\": false,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"MULTIPLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\",\n-                                        \"DIRECTORY\"\n-                                    ]\n-                                },\n                                 \"sensitive\": false\n                             },\n-                            \"Directory\": {\n-                                \"description\": \"The HDFS directory from which files should be read\",\n-                                \"displayName\": \"Directory\",\n+                            \"max-padding-size\": {\n+                                \"description\": \"The maximum amount of padding that will be used to align row groups with blocks in the underlying filesystem. If the underlying filesystem is not a block filesystem like HDFS, this has no effect. The value is specified in the format of <Data Size> <Data Unit> where Data Unit is one of B, KB, MB, GB, TB.\",\n+                                \"displayName\": \"Max Padding Size\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Directory\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"File Filter\": {\n-                                \"defaultValue\": \"[^\\\\.].*\",\n-                                \"description\": \"Only files whose names match the given regular expression will be picked up\",\n-                                \"displayName\": \"File Filter\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"File Filter\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Hadoop Configuration Resources\": {\n-                                \"description\": \"A file or comma separated list of files which contains the Hadoop file system configuration. Without this, Hadoop will search the classpath for a 'core-site.xml' and 'hdfs-site.xml' file or will revert to a default configuration. To use swebhdfs, see 'Additional Details' section of PutHDFS's documentation.\",\n-                                \"displayName\": \"Hadoop Configuration Resources\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Hadoop Configuration Resources\",\n-                                \"required\": false,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"MULTIPLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\"\n-                                    ]\n-                                },\n-                                \"sensitive\": false\n-                            },\n-                            \"Kerberos Keytab\": {\n-                                \"description\": \"Kerberos keytab associated with the principal. Requires nifi.kerberos.krb5.file to be set in your nifi.properties\",\n-                                \"displayName\": \"Kerberos Keytab\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Kerberos Keytab\",\n+                                \"name\": \"max-padding-size\",\n                                 \"required\": false,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"SINGLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\"\n-                                    ]\n-                                },\n                                 \"sensitive\": false\n                             },\n-                            \"Kerberos Password\": {\n-                                \"description\": \"Kerberos password associated with the principal.\",\n-                                \"displayName\": \"Kerberos Password\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Kerberos Password\",\n-                                \"required\": false,\n-                                \"sensitive\": true\n-                            },\n-                            \"Kerberos Principal\": {\n-                                \"description\": \"Kerberos principal to authenticate as. Requires nifi.kerberos.krb5.file to be set in your nifi.properties\",\n-                                \"displayName\": \"Kerberos Principal\",\n+                            \"page-size\": {\n+                                \"description\": \"The page size used by the Parquet writer. The value is specified in the format of <Data Size> <Data Unit> where Data Unit is one of B, KB, MB, GB, TB.\",\n+                                \"displayName\": \"Page Size\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Kerberos Principal\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"page-size\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Kerberos Relogin Period\": {\n-                                \"defaultValue\": \"4 hours\",\n-                                \"description\": \"Period of time which should pass before attempting a kerberos relogin.\\n\\nThis property has been deprecated, and has no effect on processing. Relogins now occur automatically.\",\n-                                \"displayName\": \"Kerberos Relogin Period\",\n+                            \"row-group-size\": {\n+                                \"description\": \"The row group size used by the Parquet writer. The value is specified in the format of <Data Size> <Data Unit> where Data Unit is one of B, KB, MB, GB, TB.\",\n+                                \"displayName\": \"Row Group Size\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Kerberos Relogin Period\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"row-group-size\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Recurse Subdirectories\": {\n+                            \"schema-access-strategy\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"description\": \"The schema used to write records will be the same schema that was given to the Record when the Record was created.\",\n+                                        \"displayName\": \"Inherit Record Schema\",\n+                                        \"value\": \"inherit-record-schema\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"description\": \"The name of the Schema to use is specified by the 'Schema Name' Property. The value of this property is used to lookup the Schema in the configured Schema Registry service.\",\n+                                        \"displayName\": \"Use 'Schema Name' Property\",\n+                                        \"value\": \"schema-name\"\n+                                    },\n+                                    {\n+                                        \"description\": \"The text of the Schema itself is specified by the 'Schema Text' Property. The value of this property must be a valid Avro Schema. If Expression Language is used, the value of the 'Schema Text' property must be valid after substituting the expressions.\",\n+                                        \"displayName\": \"Use 'Schema Text' Property\",\n+                                        \"value\": \"schema-text-property\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"true\",\n-                                \"description\": \"Indicates whether to list files from subdirectories of the HDFS directory\",\n-                                \"displayName\": \"Recurse Subdirectories\",\n+                                \"defaultValue\": \"inherit-record-schema\",\n+                                \"description\": \"Specifies how to obtain the schema that is to be used for interpreting the data.\",\n+                                \"displayName\": \"Schema Access Strategy\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Recurse Subdirectories\",\n+                                \"name\": \"schema-access-strategy\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"file-filter-mode\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"Filtering will be applied to the names of directories and files.  If Recurse Subdirectories is set to true, only subdirectories with a matching name will be searched for files that match the regular expression defined in File Filter.\",\n-                                        \"displayName\": \"Directories and Files\",\n-                                        \"value\": \"filter-mode-directories-and-files\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Filtering will only be applied to the names of files.  If Recurse Subdirectories is set to true, the entire subdirectory tree will be searched for files that match the regular expression defined in File Filter.\",\n-                                        \"displayName\": \"Files Only\",\n-                                        \"value\": \"filter-mode-files-only\"\n-                                    },\n+                            \"schema-branch\": {\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"Filtering will be applied by evaluating the regular expression defined in File Filter against the full path of files with and without the scheme and authority.  If Recurse Subdirectories is set to true, the entire subdirectory tree will be searched for files in which the full path of the file matches the regular expression defined in File Filter.  See 'Additional Details' for more information.\",\n-                                        \"displayName\": \"Full Path\",\n-                                        \"value\": \"filter-mode-full-path\"\n+                                        \"dependentValues\": [\n+                                            \"schema-name\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n+                                        \"propertyName\": \"schema-access-strategy\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"filter-mode-directories-and-files\",\n-                                \"description\": \"Determines how the regular expression in  File Filter will be used when retrieving listings.\",\n-                                \"displayName\": \"File Filter Mode\",\n+                                \"description\": \"Specifies the name of the branch to use when looking up the schema in the Schema Registry property. If the chosen Schema Registry does not support branching, this value will be ignored.\",\n+                                \"displayName\": \"Schema Branch\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"file-filter-mode\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"schema-branch\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"kerberos-credentials-service\": {\n-                                \"description\": \"Specifies the Kerberos Credentials Controller Service that should be used for authenticating with Kerberos\",\n-                                \"displayName\": \"Kerberos Credentials Service\",\n+                            \"schema-cache\": {\n+                                \"description\": \"Specifies a Schema Cache to add the Record Schema to so that Record Readers can quickly lookup the schema.\",\n+                                \"displayName\": \"Schema Cache\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"kerberos-credentials-service\",\n+                                \"name\": \"schema-cache\",\n                                 \"required\": false,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n                                     \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.kerberos.KerberosCredentialsService\",\n+                                    \"type\": \"org.apache.nifi.serialization.RecordSchemaCacheService\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             },\n-                            \"kerberos-user-service\": {\n-                                \"description\": \"Specifies the Kerberos User Controller Service that should be used for authenticating with Kerberos\",\n-                                \"displayName\": \"Kerberos User Service\",\n+                            \"schema-name\": {\n+                                \"defaultValue\": \"${schema.name}\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"schema-name\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n+                                        \"propertyName\": \"schema-access-strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"Specifies the name of the schema to lookup in the Schema Registry property\",\n+                                \"displayName\": \"Schema Name\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"schema-name\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"schema-protocol-version\": {\n+                                \"defaultValue\": \"1\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"hwx-schema-ref-attributes\",\n+                                            \"hwx-content-encoded-schema\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Schema Write Strategy\",\n+                                        \"propertyName\": \"Schema Write Strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"The protocol version to be used for Schema Write Strategies that require a protocol version, such as Hortonworks Schema Registry strategies. Valid protocol versions for Hortonworks Schema Registry are integer values 1, 2, or 3.\",\n+                                \"displayName\": \"Schema Protocol Version\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"schema-protocol-version\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"schema-registry\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"confluent-encoded\",\n+                                            \"schema-name\",\n+                                            \"hwx-schema-ref-attributes\",\n+                                            \"hwx-content-encoded-schema\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n+                                        \"propertyName\": \"schema-access-strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"Specifies the Controller Service to use for the Schema Registry\",\n+                                \"displayName\": \"Schema Registry\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"kerberos-user-service\",\n+                                \"name\": \"schema-registry\",\n                                 \"required\": false,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n                                     \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.kerberos.KerberosUserService\",\n+                                    \"type\": \"org.apache.nifi.schemaregistry.services.SchemaRegistry\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             },\n-                            \"maximum-file-age\": {\n-                                \"description\": \"The maximum age that a file must be in order to be pulled; any file older than this amount of time (based on last modification date) will be ignored. Minimum value is 100ms.\",\n-                                \"displayName\": \"Maximum File Age\",\n+                            \"schema-text\": {\n+                                \"defaultValue\": \"${avro.schema}\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"schema-text-property\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n+                                        \"propertyName\": \"schema-access-strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"The text of an Avro-formatted Schema\",\n+                                \"displayName\": \"Schema Text\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"maximum-file-age\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"schema-text\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"minimum-file-age\": {\n-                                \"description\": \"The minimum age that a file must be in order to be pulled; any file younger than this amount of time (based on last modification date) will be ignored\",\n-                                \"displayName\": \"Minimum File Age\",\n+                            \"schema-version\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"schema-name\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n+                                        \"propertyName\": \"schema-access-strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"Specifies the version of the schema to lookup in the Schema Registry. If not specified then the latest version of the schema will be retrieved.\",\n+                                \"displayName\": \"Schema Version\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"minimum-file-age\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"schema-version\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"record-writer\": {\n-                                \"description\": \"Specifies the Record Writer to use for creating the listing. If not specified, one FlowFile will be created for each entity that is listed. If the Record Writer is specified, all entities will be written to a single FlowFile.\",\n-                                \"displayName\": \"Record Writer\",\n+                            \"writer-version\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"PARQUET_1_0\",\n+                                        \"value\": \"PARQUET_1_0\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"PARQUET_2_0\",\n+                                        \"value\": \"PARQUET_2_0\"\n+                                    }\n+                                ],\n+                                \"description\": \"Specifies the version used by Parquet writer\",\n+                                \"displayName\": \"Writer Version\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"record-writer\",\n+                                \"name\": \"writer-version\",\n                                 \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n+                                \"sensitive\": false\n                             }\n                         },\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.processors.hadoop.FetchHDFS\",\n-                            \"org.apache.nifi.processors.hadoop.GetHDFS\",\n-                            \"org.apache.nifi.processors.hadoop.PutHDFS\"\n-                        ],\n-                        \"sideEffectFree\": false,\n-                        \"stateful\": {\n-                            \"description\": \"After performing a listing of HDFS files, the latest timestamp of all the files listed is stored. This allows the Processor to list only files that have been added or modified after this date the next time that the Processor is run, without having to store all of the actual filenames/paths which could lead to performance problems. State is stored across the cluster so that this Processor can be run on Primary Node only and if a new Primary Node is selected, the new node can pick up where the previous node left off, without duplicating the data.\",\n-                            \"scopes\": [\n-                                \"CLUSTER\"\n-                            ]\n-                        },\n-                        \"supportedRelationships\": [\n+                        \"providedApiImplementations\": [\n                             {\n-                                \"description\": \"All FlowFiles are transferred to this relationship\",\n-                                \"name\": \"success\"\n+                                \"artifact\": \"nifi-standard-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n+                                \"version\": \"1.27.0\"\n                             }\n                         ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n-                        \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"HCFS\",\n-                            \"HDFS\",\n-                            \"filesystem\",\n-                            \"get\",\n-                            \"hadoop\",\n-                            \"ingest\",\n-                            \"list\",\n-                            \"source\"\n+                            \"parquet\",\n+                            \"record\",\n+                            \"recordset\",\n+                            \"result\",\n+                            \"row\",\n+                            \"serializer\",\n+                            \"set\",\n+                            \"writer\"\n                         ],\n-                        \"triggerSerially\": true,\n-                        \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": true,\n-                        \"type\": \"org.apache.nifi.processors.hadoop.ListHDFS\",\n-                        \"typeDescription\": \"Retrieves a listing of files from HDFS. For each file that is listed in HDFS, this processor creates a FlowFile that represents the HDFS file to be fetched in conjunction with FetchHDFS. This Processor is designed to run on Primary Node only in a cluster. If the primary node changes, the new Primary Node will pick up where the previous node left off without duplicating all of the data. Unlike GetHDFS, this Processor does not delete any data from HDFS.\",\n-                        \"version\": \"1.27.0\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"The name of the file that was read from HDFS.\",\n-                                \"name\": \"filename\"\n-                            },\n-                            {\n-                                \"description\": \"The path is set to the absolute path of the file's directory on HDFS. For example, if the Directory property is set to /tmp, then files picked up from /tmp will have the path attribute set to \\\"./\\\". If the Recurse Subdirectories property is set to true and a file is picked up from /tmp/abc/1/2/3, then the path attribute will be set to \\\"/tmp/abc/1/2/3\\\".\",\n-                                \"name\": \"path\"\n-                            },\n-                            {\n-                                \"description\": \"The user that owns the file in HDFS\",\n-                                \"name\": \"hdfs.owner\"\n-                            },\n-                            {\n-                                \"description\": \"The group that owns the file in HDFS\",\n-                                \"name\": \"hdfs.group\"\n-                            },\n-                            {\n-                                \"description\": \"The timestamp of when the file in HDFS was last modified, as milliseconds since midnight Jan 1, 1970 UTC\",\n-                                \"name\": \"hdfs.lastModified\"\n-                            },\n-                            {\n-                                \"description\": \"The number of bytes in the file in HDFS\",\n-                                \"name\": \"hdfs.length\"\n-                            },\n-                            {\n-                                \"description\": \"The number of HDFS replicas for hte file\",\n-                                \"name\": \"hdfs.replication\"\n-                            },\n-                            {\n-                                \"description\": \"The permissions for the file in HDFS. This is formatted as 3 characters for the owner, 3 for the group, and 3 for other users. For example rw-rw-r--\",\n-                                \"name\": \"hdfs.permissions\"\n-                            }\n-                        ]\n-                    },\n+                        \"type\": \"org.apache.nifi.parquet.ParquetRecordSetWriter\",\n+                        \"typeDescription\": \"Writes the contents of a RecordSet in Parquet format.\",\n+                        \"version\": \"1.27.0\"\n+                    }\n+                ],\n+                \"processors\": [\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-hadoop-nar\",\n+                        \"artifact\": \"nifi-parquet-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -39352,330 +36324,115 @@\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n-                        \"explicitRestrictions\": [\n-                            {\n-                                \"explanation\": \"Provides operator the ability to retrieve any file that NiFi has access to in HDFS or the local filesystem.\",\n-                                \"requiredPermission\": \"read distributed filesystem\"\n-                            },\n-                            {\n-                                \"explanation\": \"Provides operator the ability to delete any file that NiFi has access to in HDFS or the local filesystem.\",\n-                                \"requiredPermission\": \"write distributed filesystem\"\n-                            }\n-                        ],\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_ALLOWED\",\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Additional Classpath Resources\": {\n-                                \"description\": \"A comma-separated list of paths to files and/or directories that will be added to the classpath and used for loading native libraries. When specifying a directory, all files with in the directory will be added to the classpath, but further sub-directories will not be included.\",\n-                                \"displayName\": \"Additional Classpath Resources\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Additional Classpath Resources\",\n-                                \"required\": false,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"MULTIPLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\",\n-                                        \"DIRECTORY\"\n-                                    ]\n-                                },\n-                                \"sensitive\": false\n-                            },\n-                            \"Conflict Resolution Strategy\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"Replaces the existing file if any.\",\n-                                        \"displayName\": \"replace\",\n-                                        \"value\": \"replace\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Failed rename operation stops processing and routes to success.\",\n-                                        \"displayName\": \"ignore\",\n-                                        \"value\": \"ignore\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Failing to rename a file routes to failure.\",\n-                                        \"displayName\": \"fail\",\n-                                        \"value\": \"fail\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"fail\",\n-                                \"description\": \"Indicates what should happen when a file with the same name already exists in the output directory\",\n-                                \"displayName\": \"Conflict Resolution Strategy\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Conflict Resolution Strategy\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"File Filter Regex\": {\n-                                \"description\": \"A Java Regular Expression for filtering Filenames; if a filter is supplied then only files whose names match that Regular Expression will be fetched, otherwise all files will be fetched\",\n-                                \"displayName\": \"File Filter Regex\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"File Filter Regex\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"HDFS Operation\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"move\",\n-                                        \"value\": \"move\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"copy\",\n-                                        \"value\": \"copy\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"move\",\n-                                \"description\": \"The operation that will be performed on the source file\",\n-                                \"displayName\": \"HDFS Operation\",\n+                            \"Records Per Split\": {\n+                                \"description\": \"Specifies how many records should be covered in each FlowFile\",\n+                                \"displayName\": \"Records Per Split\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"HDFS Operation\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Records Per Split\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Hadoop Configuration Resources\": {\n-                                \"description\": \"A file or comma separated list of files which contains the Hadoop file system configuration. Without this, Hadoop will search the classpath for a 'core-site.xml' and 'hdfs-site.xml' file or will revert to a default configuration. To use swebhdfs, see 'Additional Details' section of PutHDFS's documentation.\",\n-                                \"displayName\": \"Hadoop Configuration Resources\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Hadoop Configuration Resources\",\n-                                \"required\": false,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"MULTIPLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\"\n-                                    ]\n-                                },\n-                                \"sensitive\": false\n-                            },\n-                            \"Ignore Dotted Files\": {\n+                            \"Zero Content Output\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"true\",\n                                         \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"false\",\n                                         \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"true\",\n-                                \"description\": \"If true, files whose names begin with a dot (\\\".\\\") will be ignored\",\n-                                \"displayName\": \"Ignore Dotted Files\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Ignore Dotted Files\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Input Directory or File\": {\n-                                \"defaultValue\": \"${path}\",\n-                                \"description\": \"The HDFS directory from which files should be read, or a single file to read.\",\n-                                \"displayName\": \"Input Directory or File\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Input Directory or File\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Kerberos Keytab\": {\n-                                \"description\": \"Kerberos keytab associated with the principal. Requires nifi.kerberos.krb5.file to be set in your nifi.properties\",\n-                                \"displayName\": \"Kerberos Keytab\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Kerberos Keytab\",\n-                                \"required\": false,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"SINGLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\"\n-                                    ]\n-                                },\n-                                \"sensitive\": false\n-                            },\n-                            \"Kerberos Password\": {\n-                                \"description\": \"Kerberos password associated with the principal.\",\n-                                \"displayName\": \"Kerberos Password\",\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"Whether to do, or do not copy the content of input FlowFile.\",\n+                                \"displayName\": \"Zero Content Output\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Kerberos Password\",\n-                                \"required\": false,\n-                                \"sensitive\": true\n-                            },\n-                            \"Kerberos Principal\": {\n-                                \"description\": \"Kerberos principal to authenticate as. Requires nifi.kerberos.krb5.file to be set in your nifi.properties\",\n-                                \"displayName\": \"Kerberos Principal\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Kerberos Principal\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Kerberos Relogin Period\": {\n-                                \"defaultValue\": \"4 hours\",\n-                                \"description\": \"Period of time which should pass before attempting a kerberos relogin.\\n\\nThis property has been deprecated, and has no effect on processing. Relogins now occur automatically.\",\n-                                \"displayName\": \"Kerberos Relogin Period\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Kerberos Relogin Period\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Output Directory\": {\n-                                \"description\": \"The HDFS directory where the files will be moved to\",\n-                                \"displayName\": \"Output Directory\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Output Directory\",\n+                                \"name\": \"Zero Content Output\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n-                            },\n-                            \"Remote Group\": {\n-                                \"description\": \"Changes the group of the HDFS file to this value after it is written. This only works if NiFi is running as a user that has HDFS super user privilege to change group\",\n-                                \"displayName\": \"Remote Group\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Remote Group\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Remote Owner\": {\n-                                \"description\": \"Changes the owner of the HDFS file to this value after it is written. This only works if NiFi is running as a user that has HDFS super user privilege to change owner\",\n-                                \"displayName\": \"Remote Owner\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Remote Owner\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"kerberos-credentials-service\": {\n-                                \"description\": \"Specifies the Kerberos Credentials Controller Service that should be used for authenticating with Kerberos\",\n-                                \"displayName\": \"Kerberos Credentials Service\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"kerberos-credentials-service\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.kerberos.KerberosCredentialsService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            },\n-                            \"kerberos-user-service\": {\n-                                \"description\": \"Specifies the Kerberos User Controller Service that should be used for authenticating with Kerberos\",\n-                                \"displayName\": \"Kerberos User Service\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"kerberos-user-service\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.kerberos.KerberosUserService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n                             }\n                         },\n                         \"readsAttributes\": [\n                             {\n-                                \"description\": \"The name of the file written to HDFS comes from the value of this attribute.\",\n-                                \"name\": \"filename\"\n+                                \"description\": \"Gets the index of first record in the input.\",\n+                                \"name\": \"record.offset\"\n+                            },\n+                            {\n+                                \"description\": \"Gets the number of records in the input.\",\n+                                \"name\": \"record.count\"\n+                            },\n+                            {\n+                                \"description\": \"Gets the start offset of the selected row group in the parquet file.\",\n+                                \"name\": \"parquet.file.range.startOffset\"\n+                            },\n+                            {\n+                                \"description\": \"Gets the end offset of the selected row group in the parquet file.\",\n+                                \"name\": \"parquet.file.range.endOffset\"\n                             }\n                         ],\n-                        \"restricted\": true,\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.processors.hadoop.GetHDFS\",\n-                            \"org.apache.nifi.processors.hadoop.PutHDFS\"\n-                        ],\n-                        \"sideEffectFree\": false,\n+                        \"sideEffectFree\": true,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"Files that have been successfully renamed on HDFS are transferred to this relationship\",\n+                                \"description\": \"FlowFiles, with special attributes that represent a chunk of the input file.\",\n                                 \"name\": \"success\"\n-                            },\n-                            {\n-                                \"description\": \"Files that could not be renamed on HDFS are transferred to this relationship\",\n-                                \"name\": \"failure\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n                         \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"HCFS\",\n-                            \"HDFS\",\n-                            \"filesystem\",\n-                            \"hadoop\",\n-                            \"move\",\n-                            \"moveHDFS\",\n-                            \"put\"\n+                            \"break apart\",\n+                            \"cluster\",\n+                            \"efficient processing\",\n+                            \"load balance\",\n+                            \"parquet\",\n+                            \"partition\",\n+                            \"split\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.hadoop.MoveHDFS\",\n-                        \"typeDescription\": \"Rename existing files or a directory of files (non-recursive) on Hadoop Distributed File System (HDFS).\",\n+                        \"type\": \"org.apache.nifi.processors.parquet.CalculateParquetOffsets\",\n+                        \"typeDescription\": \"The processor generates N flow files from the input, and adds attributes with the offsets required to read the group of rows in the FlowFile's content. Can be used to increase the overall efficiency of processing extremely large Parquet files.\",\n                         \"version\": \"1.27.0\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"The name of the file written to HDFS is stored in this attribute.\",\n-                                \"name\": \"filename\"\n-                            },\n-                            {\n-                                \"description\": \"The absolute path to the file on HDFS is stored in this attribute.\",\n-                                \"name\": \"absolute.hdfs.path\"\n+                                \"description\": \"Sets the index of first record of the parquet file.\",\n+                                \"name\": \"record.offset\"\n                             },\n                             {\n-                                \"description\": \"The hadoop url for the file is stored in this attribute.\",\n-                                \"name\": \"hadoop.file.url\"\n+                                \"description\": \"Sets the number of records in the parquet file.\",\n+                                \"name\": \"record.count\"\n                             }\n                         ]\n                     },\n                     {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-hadoop-nar\",\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-parquet-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -39683,494 +36440,357 @@\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n-                        \"explicitRestrictions\": [\n-                            {\n-                                \"explanation\": \"Provides operator the ability to delete any file that NiFi has access to in HDFS or the local filesystem.\",\n-                                \"requiredPermission\": \"write distributed filesystem\"\n-                            }\n-                        ],\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Additional Classpath Resources\": {\n-                                \"description\": \"A comma-separated list of paths to files and/or directories that will be added to the classpath and used for loading native libraries. When specifying a directory, all files with in the directory will be added to the classpath, but further sub-directories will not be included.\",\n-                                \"displayName\": \"Additional Classpath Resources\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Additional Classpath Resources\",\n-                                \"required\": false,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"MULTIPLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\",\n-                                        \"DIRECTORY\"\n-                                    ]\n-                                },\n-                                \"sensitive\": false\n-                            },\n-                            \"Append Mode\": {\n+                            \"Zero Content Output\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"DEFAULT\",\n-                                        \"value\": \"DEFAULT\"\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"AVRO\",\n-                                        \"value\": \"AVRO\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"DEFAULT\",\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"append\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Conflict Resolution Strategy\",\n-                                        \"propertyName\": \"Conflict Resolution Strategy\"\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"description\": \"Defines the append strategy to use when the Conflict Resolution Strategy is set to 'append'.\",\n-                                \"displayName\": \"Append Mode\",\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"Whether to do, or do not copy the content of input FlowFile.\",\n+                                \"displayName\": \"Zero Content Output\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Append Mode\",\n+                                \"name\": \"Zero Content Output\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n+                            }\n+                        },\n+                        \"sideEffectFree\": true,\n+                        \"supportedRelationships\": [\n+                            {\n+                                \"description\": \"FlowFiles, with special attributes that represent a chunk of the input file.\",\n+                                \"name\": \"success\"\n+                            }\n+                        ],\n+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\"\n+                        ],\n+                        \"supportsBatching\": false,\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicRelationships\": false,\n+                        \"supportsEventDriven\": false,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"break apart\",\n+                            \"cluster\",\n+                            \"efficient processing\",\n+                            \"load balance\",\n+                            \"parquet\",\n+                            \"partition\",\n+                            \"split\"\n+                        ],\n+                        \"triggerSerially\": false,\n+                        \"triggerWhenAnyDestinationAvailable\": false,\n+                        \"triggerWhenEmpty\": false,\n+                        \"type\": \"org.apache.nifi.processors.parquet.CalculateParquetRowGroupOffsets\",\n+                        \"typeDescription\": \"The processor generates one FlowFile from each Row Group of the input, and adds attributes with the offsets required to read the group of rows in the FlowFile's content. Can be used to increase the overall efficiency of processing extremely large Parquet files.\",\n+                        \"version\": \"1.27.0\",\n+                        \"writesAttributes\": [\n+                            {\n+                                \"description\": \"Sets the start offset of the selected row group in the parquet file.\",\n+                                \"name\": \"parquet.file.range.startOffset\"\n                             },\n-                            \"Block Size\": {\n-                                \"description\": \"Size of each block as written to HDFS. This overrides the Hadoop Configuration\",\n-                                \"displayName\": \"Block Size\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Block Size\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n+                            {\n+                                \"description\": \"Sets the end offset of the selected row group in the parquet file.\",\n+                                \"name\": \"parquet.file.range.endOffset\"\n                             },\n-                            \"Compression codec\": {\n+                            {\n+                                \"description\": \"Sets the count of records in the selected row group.\",\n+                                \"name\": \"record.count\"\n+                            }\n+                        ]\n+                    },\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-parquet-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"e0c4461\"\n+                        },\n+                        \"defaultBulletinLevel\": \"WARN\",\n+                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": 1,\n+                            \"TIMER_DRIVEN\": 1\n+                        },\n+                        \"defaultPenaltyDuration\": \"30 sec\",\n+                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": \"* * * * * ?\",\n+                            \"TIMER_DRIVEN\": \"0 sec\"\n+                        },\n+                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n+                        \"defaultYieldDuration\": \"1 sec\",\n+                        \"group\": \"org.apache.nifi\",\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n+                        \"primaryNodeOnly\": false,\n+                        \"propertyDescriptors\": {\n+                            \"compression-type\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"No compression\",\n-                                        \"displayName\": \"NONE\",\n-                                        \"value\": \"NONE\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Default ZLIB compression\",\n-                                        \"displayName\": \"DEFAULT\",\n-                                        \"value\": \"DEFAULT\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"UNCOMPRESSED\",\n+                                        \"value\": \"UNCOMPRESSED\"\n                                     },\n                                     {\n-                                        \"description\": \"BZIP compression\",\n-                                        \"displayName\": \"BZIP\",\n-                                        \"value\": \"BZIP\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"SNAPPY\",\n+                                        \"value\": \"SNAPPY\"\n                                     },\n                                     {\n-                                        \"description\": \"GZIP compression\",\n+                                        \"description\": \"\",\n                                         \"displayName\": \"GZIP\",\n                                         \"value\": \"GZIP\"\n                                     },\n                                     {\n-                                        \"description\": \"LZ4 compression\",\n-                                        \"displayName\": \"LZ4\",\n-                                        \"value\": \"LZ4\"\n-                                    },\n-                                    {\n-                                        \"description\": \"LZO compression - it assumes LD_LIBRARY_PATH has been set and jar is available\",\n+                                        \"description\": \"\",\n                                         \"displayName\": \"LZO\",\n                                         \"value\": \"LZO\"\n                                     },\n                                     {\n-                                        \"description\": \"Snappy compression\",\n-                                        \"displayName\": \"SNAPPY\",\n-                                        \"value\": \"SNAPPY\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Will attempt to automatically detect the compression codec.\",\n-                                        \"displayName\": \"AUTOMATIC\",\n-                                        \"value\": \"AUTOMATIC\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"NONE\",\n-                                \"description\": \"\",\n-                                \"displayName\": \"Compression codec\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Compression codec\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Conflict Resolution Strategy\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"Replaces the existing file if any.\",\n-                                        \"displayName\": \"replace\",\n-                                        \"value\": \"replace\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"BROTLI\",\n+                                        \"value\": \"BROTLI\"\n                                     },\n                                     {\n-                                        \"description\": \"Ignores the flow file and routes it to success.\",\n-                                        \"displayName\": \"ignore\",\n-                                        \"value\": \"ignore\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"LZ4\",\n+                                        \"value\": \"LZ4\"\n                                     },\n                                     {\n-                                        \"description\": \"Penalizes the flow file and routes it to failure.\",\n-                                        \"displayName\": \"fail\",\n-                                        \"value\": \"fail\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"ZSTD\",\n+                                        \"value\": \"ZSTD\"\n                                     },\n                                     {\n-                                        \"description\": \"Appends to the existing file if any, creates a new file otherwise.\",\n-                                        \"displayName\": \"append\",\n-                                        \"value\": \"append\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"LZ4_RAW\",\n+                                        \"value\": \"LZ4_RAW\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"fail\",\n-                                \"description\": \"Indicates what should happen when a file with the same name already exists in the output directory\",\n-                                \"displayName\": \"Conflict Resolution Strategy\",\n+                                \"defaultValue\": \"UNCOMPRESSED\",\n+                                \"description\": \"The type of compression for the file being written.\",\n+                                \"displayName\": \"Compression Type\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Conflict Resolution Strategy\",\n+                                \"name\": \"compression-type\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Directory\": {\n-                                \"description\": \"The parent HDFS directory to which files should be written. The directory will be created if it doesn't exist.\",\n-                                \"displayName\": \"Directory\",\n+                            \"dictionary-page-size\": {\n+                                \"description\": \"The dictionary page size used by the Parquet writer. The value is specified in the format of <Data Size> <Data Unit> where Data Unit is one of B, KB, MB, GB, TB.\",\n+                                \"displayName\": \"Dictionary Page Size\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Directory\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Hadoop Configuration Resources\": {\n-                                \"description\": \"A file or comma separated list of files which contains the Hadoop file system configuration. Without this, Hadoop will search the classpath for a 'core-site.xml' and 'hdfs-site.xml' file or will revert to a default configuration. To use swebhdfs, see 'Additional Details' section of PutHDFS's documentation.\",\n-                                \"displayName\": \"Hadoop Configuration Resources\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Hadoop Configuration Resources\",\n-                                \"required\": false,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"MULTIPLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\"\n-                                    ]\n-                                },\n-                                \"sensitive\": false\n-                            },\n-                            \"IO Buffer Size\": {\n-                                \"description\": \"Amount of memory to use to buffer file contents during IO. This overrides the Hadoop Configuration\",\n-                                \"displayName\": \"IO Buffer Size\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"IO Buffer Size\",\n+                                \"name\": \"dictionary-page-size\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Ignore Locality\": {\n+                            \"enable-dictionary-encoding\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"true\",\n                                         \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"false\",\n                                         \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"Directs the HDFS system to ignore locality rules so that data is distributed randomly throughout the cluster\",\n-                                \"displayName\": \"Ignore Locality\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Ignore Locality\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Kerberos Keytab\": {\n-                                \"description\": \"Kerberos keytab associated with the principal. Requires nifi.kerberos.krb5.file to be set in your nifi.properties\",\n-                                \"displayName\": \"Kerberos Keytab\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Kerberos Keytab\",\n-                                \"required\": false,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"SINGLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\"\n-                                    ]\n-                                },\n-                                \"sensitive\": false\n-                            },\n-                            \"Kerberos Password\": {\n-                                \"description\": \"Kerberos password associated with the principal.\",\n-                                \"displayName\": \"Kerberos Password\",\n+                                \"description\": \"Specifies whether dictionary encoding should be enabled for the Parquet writer\",\n+                                \"displayName\": \"Enable Dictionary Encoding\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Kerberos Password\",\n-                                \"required\": false,\n-                                \"sensitive\": true\n-                            },\n-                            \"Kerberos Principal\": {\n-                                \"description\": \"Kerberos principal to authenticate as. Requires nifi.kerberos.krb5.file to be set in your nifi.properties\",\n-                                \"displayName\": \"Kerberos Principal\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Kerberos Principal\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Kerberos Relogin Period\": {\n-                                \"defaultValue\": \"4 hours\",\n-                                \"description\": \"Period of time which should pass before attempting a kerberos relogin.\\n\\nThis property has been deprecated, and has no effect on processing. Relogins now occur automatically.\",\n-                                \"displayName\": \"Kerberos Relogin Period\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Kerberos Relogin Period\",\n+                                \"name\": \"enable-dictionary-encoding\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Permissions umask\": {\n-                                \"description\": \"A umask represented as an octal number which determines the permissions of files written to HDFS. This overrides the Hadoop property \\\"fs.permissions.umask-mode\\\".  If this property and \\\"fs.permissions.umask-mode\\\" are undefined, the Hadoop default \\\"022\\\" will be used.  If the PutHDFS target folder has a default ACL defined, the umask property is ignored by HDFS.\",\n-                                \"displayName\": \"Permissions umask\",\n+                            \"enable-validation\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n+                                    }\n+                                ],\n+                                \"description\": \"Specifies whether validation should be enabled for the Parquet writer\",\n+                                \"displayName\": \"Enable Validation\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Permissions umask\",\n+                                \"name\": \"enable-validation\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Remote Group\": {\n-                                \"description\": \"Changes the group of the HDFS file to this value after it is written. This only works if NiFi is running as a user that has HDFS super user privilege to change group\",\n-                                \"displayName\": \"Remote Group\",\n+                            \"max-padding-size\": {\n+                                \"description\": \"The maximum amount of padding that will be used to align row groups with blocks in the underlying filesystem. If the underlying filesystem is not a block filesystem like HDFS, this has no effect. The value is specified in the format of <Data Size> <Data Unit> where Data Unit is one of B, KB, MB, GB, TB.\",\n+                                \"displayName\": \"Max Padding Size\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Remote Group\",\n+                                \"name\": \"max-padding-size\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Remote Owner\": {\n-                                \"description\": \"Changes the owner of the HDFS file to this value after it is written. This only works if NiFi is running as a user that has HDFS super user privilege to change owner\",\n-                                \"displayName\": \"Remote Owner\",\n+                            \"page-size\": {\n+                                \"description\": \"The page size used by the Parquet writer. The value is specified in the format of <Data Size> <Data Unit> where Data Unit is one of B, KB, MB, GB, TB.\",\n+                                \"displayName\": \"Page Size\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Remote Owner\",\n+                                \"name\": \"page-size\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Replication\": {\n-                                \"description\": \"Number of times that HDFS will replicate each file. This overrides the Hadoop Configuration\",\n-                                \"displayName\": \"Replication\",\n+                            \"row-group-size\": {\n+                                \"description\": \"The row group size used by the Parquet writer. The value is specified in the format of <Data Size> <Data Unit> where Data Unit is one of B, KB, MB, GB, TB.\",\n+                                \"displayName\": \"Row Group Size\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Replication\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"row-group-size\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"kerberos-credentials-service\": {\n-                                \"description\": \"Specifies the Kerberos Credentials Controller Service that should be used for authenticating with Kerberos\",\n-                                \"displayName\": \"Kerberos Credentials Service\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"kerberos-credentials-service\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.kerberos.KerberosCredentialsService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            },\n-                            \"kerberos-user-service\": {\n-                                \"description\": \"Specifies the Kerberos User Controller Service that should be used for authenticating with Kerberos\",\n-                                \"displayName\": \"Kerberos User Service\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"kerberos-user-service\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.kerberos.KerberosUserService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            },\n-                            \"writing-strategy\": {\n+                            \"writer-version\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"The processor writes FlowFile data into a temporary file and renames it after completion. This prevents other processes from reading partially written files.\",\n-                                        \"displayName\": \"Write and rename\",\n-                                        \"value\": \"writeAndRename\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"PARQUET_1_0\",\n+                                        \"value\": \"PARQUET_1_0\"\n                                     },\n                                     {\n-                                        \"description\": \"The processor writes FlowFile data directly to the destination file. In some cases this might cause reading partially written files.\",\n-                                        \"displayName\": \"Simple write\",\n-                                        \"value\": \"simpleWrite\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"PARQUET_2_0\",\n+                                        \"value\": \"PARQUET_2_0\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"writeAndRename\",\n-                                \"description\": \"Defines the approach for writing the FlowFile data.\",\n-                                \"displayName\": \"Writing Strategy\",\n+                                \"description\": \"Specifies the version used by Parquet writer\",\n+                                \"displayName\": \"Writer Version\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"writing-strategy\",\n-                                \"required\": true,\n+                                \"name\": \"writer-version\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             }\n                         },\n-                        \"readsAttributes\": [\n-                            {\n-                                \"description\": \"The name of the file written to HDFS comes from the value of this attribute.\",\n-                                \"name\": \"filename\"\n-                            }\n-                        ],\n-                        \"restricted\": true,\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.processors.hadoop.GetHDFS\"\n-                        ],\n                         \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"Files that have been successfully written to HDFS are transferred to this relationship\",\n+                                \"description\": \"Parquet file that was converted successfully from Avro\",\n                                 \"name\": \"success\"\n                             },\n                             {\n-                                \"description\": \"Files that could not be written to HDFS for some reason are transferred to this relationship\",\n+                                \"description\": \"Avro content that could not be processed\",\n                                 \"name\": \"failure\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n                         \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"HCFS\",\n-                            \"HDFS\",\n-                            \"copy\",\n-                            \"filesystem\",\n-                            \"hadoop\",\n-                            \"put\"\n+                            \"avro\",\n+                            \"convert\",\n+                            \"parquet\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.hadoop.PutHDFS\",\n-                        \"typeDescription\": \"Write FlowFile data to Hadoop Distributed File System (HDFS)\",\n+                        \"type\": \"org.apache.nifi.processors.parquet.ConvertAvroToParquet\",\n+                        \"typeDescription\": \"Converts Avro records into Parquet file format. The incoming FlowFile should be a valid avro file. If an incoming FlowFile does not contain any records, an empty parquet file is the output. NOTE: Many Avro datatypes (collections, primitives, and unions of primitives, e.g.) can be converted to parquet, but unions of collections and other complex datatypes may not be able to be converted to Parquet.\",\n                         \"version\": \"1.27.0\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"The name of the file written to HDFS is stored in this attribute.\",\n+                                \"description\": \"Sets the filename to the existing filename with the extension replaced by / added to by .parquet\",\n                                 \"name\": \"filename\"\n                             },\n                             {\n-                                \"description\": \"The absolute path to the file on HDFS is stored in this attribute.\",\n-                                \"name\": \"absolute.hdfs.path\"\n-                            },\n-                            {\n-                                \"description\": \"The hadoop url for the file is stored in this attribute.\",\n-                                \"name\": \"hadoop.file.url\"\n-                            },\n-                            {\n-                                \"description\": \"The result(true/false) indicates if the folder is created by the processor.\",\n-                                \"name\": \"target.dir.created\"\n+                                \"description\": \"Sets the number of records in the parquet file.\",\n+                                \"name\": \"record.count\"\n                             }\n                         ]\n                     },\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-hadoop-nar\",\n+                        \"artifact\": \"nifi-parquet-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n                         },\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n-                        \"defaultYieldDuration\": \"1 sec\",\n+                        \"defaultYieldDuration\": \"100 ms\",\n+                        \"explicitRestrictions\": [\n+                            {\n+                                \"explanation\": \"Provides operator the ability to retrieve any file that NiFi has access to in HDFS or the local filesystem.\",\n+                                \"requiredPermission\": \"read distributed filesystem\"\n+                            }\n+                        ],\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n                             \"Additional Classpath Resources\": {\n                                 \"description\": \"A comma-separated list of paths to files and/or directories that will be added to the classpath and used for loading native libraries. When specifying a directory, all files with in the directory will be added to the classpath, but further sub-directories will not be included.\",\n                                 \"displayName\": \"Additional Classpath Resources\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n                                 \"name\": \"Additional Classpath Resources\",\n                                 \"required\": false,\n                                 \"resourceDefinition\": {\n                                     \"cardinality\": \"MULTIPLE\",\n                                     \"resourceTypes\": [\n-                                        \"FILE\",\n-                                        \"DIRECTORY\"\n+                                        \"DIRECTORY\",\n+                                        \"FILE\"\n                                     ]\n                                 },\n                                 \"sensitive\": false\n                             },\n-                            \"Event Types to Filter On\": {\n-                                \"defaultValue\": \"append, close, create, metadata, rename, unlink\",\n-                                \"description\": \"A comma-separated list of event types to process. Valid event types are: append, close, create, metadata, rename, and unlink. Case does not matter.\",\n-                                \"displayName\": \"Event Types to Filter On\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Event Types to Filter On\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"HDFS Path to Watch\": {\n-                                \"description\": \"The HDFS path to get event notifications for. This property accepts both expression language and regular expressions. This will be evaluated during the OnScheduled phase.\",\n-                                \"displayName\": \"HDFS Path to Watch\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"HDFS Path to Watch\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n                             \"Hadoop Configuration Resources\": {\n                                 \"description\": \"A file or comma separated list of files which contains the Hadoop file system configuration. Without this, Hadoop will search the classpath for a 'core-site.xml' and 'hdfs-site.xml' file or will revert to a default configuration. To use swebhdfs, see 'Additional Details' section of PutHDFS's documentation.\",\n                                 \"displayName\": \"Hadoop Configuration Resources\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n                                 \"name\": \"Hadoop Configuration Resources\",\n@@ -40179,48 +36799,14 @@\n                                     \"cardinality\": \"MULTIPLE\",\n                                     \"resourceTypes\": [\n                                         \"FILE\"\n                                     ]\n                                 },\n                                 \"sensitive\": false\n                             },\n-                            \"IOException Retries During Event Polling\": {\n-                                \"defaultValue\": \"3\",\n-                                \"description\": \"According to the HDFS admin API for event polling it is good to retry at least a few times. This number defines how many times the poll will be retried if it throws an IOException.\",\n-                                \"displayName\": \"IOException Retries During Event Polling\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"IOException Retries During Event Polling\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Ignore Hidden Files\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"If true and the final component of the path associated with a given event starts with a '.' then that event will not be processed.\",\n-                                \"displayName\": \"Ignore Hidden Files\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Ignore Hidden Files\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n                             \"Kerberos Keytab\": {\n                                 \"description\": \"Kerberos keytab associated with the principal. Requires nifi.kerberos.krb5.file to be set in your nifi.properties\",\n                                 \"displayName\": \"Kerberos Keytab\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n                                 \"name\": \"Kerberos Keytab\",\n@@ -40260,22 +36846,22 @@\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n                                 \"name\": \"Kerberos Relogin Period\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Poll Duration\": {\n-                                \"defaultValue\": \"1 second\",\n-                                \"description\": \"The time before the polling method returns with the next batch of events if they exist. It may exceed this amount of time by up to the time required for an RPC to the NameNode.\",\n-                                \"displayName\": \"Poll Duration\",\n+                            \"filename\": {\n+                                \"defaultValue\": \"${path}/${filename}\",\n+                                \"description\": \"The name of the file to retrieve\",\n+                                \"displayName\": \"Filename\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Poll Duration\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"filename\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n                             \"kerberos-credentials-service\": {\n                                 \"description\": \"Specifies the Kerberos Credentials Controller Service that should be used for authenticating with Kerberos\",\n                                 \"displayName\": \"Kerberos Credentials Service\",\n                                 \"dynamic\": false,\n@@ -40302,3606 +36888,627 @@\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n                                     \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n                                     \"type\": \"org.apache.nifi.kerberos.KerberosUserService\",\n                                     \"version\": \"1.27.0\"\n                                 }\n+                            },\n+                            \"record-writer\": {\n+                                \"description\": \"The service for writing records to the FlowFile content\",\n+                                \"displayName\": \"Record Writer\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"record-writer\",\n+                                \"required\": true,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n                             }\n                         },\n+                        \"readsAttributes\": [\n+                            {\n+                                \"description\": \"Gets the index of first record in the input.\",\n+                                \"name\": \"record.offset\"\n+                            },\n+                            {\n+                                \"description\": \"Gets the number of records in the input.\",\n+                                \"name\": \"record.count\"\n+                            }\n+                        ],\n+                        \"restricted\": true,\n                         \"seeAlso\": [\n-                            \"org.apache.nifi.processors.hadoop.FetchHDFS\",\n-                            \"org.apache.nifi.processors.hadoop.GetHDFS\",\n-                            \"org.apache.nifi.processors.hadoop.ListHDFS\",\n-                            \"org.apache.nifi.processors.hadoop.PutHDFS\"\n+                            \"org.apache.nifi.processors.parquet.PutParquet\"\n                         ],\n                         \"sideEffectFree\": false,\n-                        \"stateful\": {\n-                            \"description\": \"The last used transaction id is stored. This is used \",\n-                            \"scopes\": [\n-                                \"CLUSTER\"\n-                            ]\n-                        },\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"A flow file with updated information about a specific event will be sent to this relationship.\",\n+                                \"description\": \"FlowFiles will be routed to this relationship if the content of the file cannot be retrieved, but might be able to be in the future if tried again. This generally indicates that the Fetch should be tried again.\",\n+                                \"name\": \"retry\"\n+                            },\n+                            {\n+                                \"description\": \"FlowFiles will be routed to this relationship once they have been updated with the content of the file\",\n                                 \"name\": \"success\"\n+                            },\n+                            {\n+                                \"description\": \"FlowFiles will be routed to this relationship if the content of the file cannot be retrieved and trying again will likely not be helpful. This would occur, for instance, if the file is not found or if there is a permissions issue\",\n+                                \"name\": \"failure\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n-                        \"supportsBatching\": false,\n+                        \"supportsBatching\": true,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"events\",\n-                            \"filesystem\",\n+                            \"HDFS\",\n+                            \"fetch\",\n+                            \"get\",\n                             \"hadoop\",\n-                            \"inotify\",\n-                            \"notifications\"\n+                            \"ingest\",\n+                            \"parquet\",\n+                            \"record\",\n+                            \"source\"\n                         ],\n-                        \"triggerSerially\": true,\n+                        \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": true,\n-                        \"type\": \"org.apache.nifi.processors.hadoop.inotify.GetHDFSEvents\",\n-                        \"typeDescription\": \"This processor polls the notification events provided by the HdfsAdmin API. Since this uses the HdfsAdmin APIs it is required to run as an HDFS super user. Currently there are six types of events (append, close, create, metadata, rename, and unlink). Please see org.apache.hadoop.hdfs.inotify.Event documentation for full explanations of each event. This processor will poll for new events based on a defined duration. For each event received a new flow file will be created with the expected attributes and the event itself serialized to JSON and written to the flow file's content. For example, if event.type is APPEND then the content of the flow file will contain a JSON file containing the information about the append event. If successful the flow files are sent to the 'success' relationship. Be careful of where the generated flow files are stored. If the flow files are stored in one of processor's watch directories there will be a never ending flow of events. It is also important to be aware that this processor must consume all events. The filtering must happen within the processor. This is because the HDFS admin's event notifications API does not have filtering.\",\n+                        \"type\": \"org.apache.nifi.processors.parquet.FetchParquet\",\n+                        \"typeDescription\": \"Reads from a given Parquet file and writes records to the content of the flow file using the selected record writer. The original Parquet file will remain unchanged, and the content of the flow file will be replaced with records of the selected type. This processor can be used with ListHDFS or ListFile to obtain a listing of files to fetch.\",\n                         \"version\": \"1.27.0\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"This is always application/json.\",\n-                                \"name\": \"mime.type\"\n+                                \"description\": \"When a FlowFile is routed to 'failure', this attribute is added indicating why the file could not be fetched from the given filesystem.\",\n+                                \"name\": \"fetch.failure.reason\"\n                             },\n                             {\n-                                \"description\": \"This will specify the specific HDFS notification event type. Currently there are six types of events (append, close, create, metadata, rename, and unlink).\",\n-                                \"name\": \"hdfs.inotify.event.type\"\n+                                \"description\": \"The number of records in the resulting flow file\",\n+                                \"name\": \"record.count\"\n                             },\n                             {\n-                                \"description\": \"The specific path that the event is tied to.\",\n-                                \"name\": \"hdfs.inotify.event.path\"\n+                                \"description\": \"The hadoop url for the file is stored in this attribute.\",\n+                                \"name\": \"hadoop.file.url\"\n                             }\n                         ]\n-                    }\n-                ],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"1.27.0\"\n-        },\n-        {\n-            \"artifact\": \"nifi-splunk-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [],\n-                \"processors\": [\n+                    },\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-splunk-nar\",\n+                        \"artifact\": \"nifi-parquet-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n                         },\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"1 min\"\n+                            \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n-                        \"defaultYieldDuration\": \"1 sec\",\n+                        \"defaultYieldDuration\": \"100 ms\",\n+                        \"explicitRestrictions\": [\n+                            {\n+                                \"explanation\": \"Provides operator the ability to write any file that NiFi has access to in HDFS or the local filesystem.\",\n+                                \"requiredPermission\": \"write distributed filesystem\"\n+                            }\n+                        ],\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Application\": {\n-                                \"description\": \"The Splunk Application to query.\",\n-                                \"displayName\": \"Application\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Application\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Connection Timeout\": {\n-                                \"defaultValue\": \"5 secs\",\n-                                \"description\": \"Max wait time for connection to the Splunk server.\",\n-                                \"displayName\": \"Connection Timeout\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Connection Timeout\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Earliest Time\": {\n-                                \"description\": \"The value to use for the earliest time when querying. Only used with a Time Range Strategy of Provided. See Splunk's documentation on Search Time Modifiers for guidance in populating this field.\",\n-                                \"displayName\": \"Earliest Time\",\n+                            \"Additional Classpath Resources\": {\n+                                \"description\": \"A comma-separated list of paths to files and/or directories that will be added to the classpath and used for loading native libraries. When specifying a directory, all files with in the directory will be added to the classpath, but further sub-directories will not be included.\",\n+                                \"displayName\": \"Additional Classpath Resources\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Earliest Time\",\n+                                \"name\": \"Additional Classpath Resources\",\n                                 \"required\": false,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"MULTIPLE\",\n+                                    \"resourceTypes\": [\n+                                        \"DIRECTORY\",\n+                                        \"FILE\"\n+                                    ]\n+                                },\n                                 \"sensitive\": false\n                             },\n-                            \"Hostname\": {\n-                                \"defaultValue\": \"localhost\",\n-                                \"description\": \"The ip address or hostname of the Splunk server.\",\n-                                \"displayName\": \"Hostname\",\n+                            \"Directory\": {\n+                                \"description\": \"The parent directory to which files should be written. Will be created if it doesn't exist.\",\n+                                \"displayName\": \"Directory\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Hostname\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Directory\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Latest Time\": {\n-                                \"description\": \"The value to use for the latest time when querying. Only used with a Time Range Strategy of Provided. See Splunk's documentation on Search Time Modifiers for guidance in populating this field.\",\n-                                \"displayName\": \"Latest Time\",\n+                            \"Hadoop Configuration Resources\": {\n+                                \"description\": \"A file or comma separated list of files which contains the Hadoop file system configuration. Without this, Hadoop will search the classpath for a 'core-site.xml' and 'hdfs-site.xml' file or will revert to a default configuration. To use swebhdfs, see 'Additional Details' section of PutHDFS's documentation.\",\n+                                \"displayName\": \"Hadoop Configuration Resources\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Latest Time\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Hadoop Configuration Resources\",\n                                 \"required\": false,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"MULTIPLE\",\n+                                    \"resourceTypes\": [\n+                                        \"FILE\"\n+                                    ]\n+                                },\n                                 \"sensitive\": false\n                             },\n-                            \"Output Mode\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"ATOM\",\n-                                        \"value\": \"ATOM\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"CSV\",\n-                                        \"value\": \"CSV\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"JSON\",\n-                                        \"value\": \"JSON\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"JSON_COLS\",\n-                                        \"value\": \"JSON_COLS\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"JSON_ROWS\",\n-                                        \"value\": \"JSON_ROWS\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"RAW\",\n-                                        \"value\": \"RAW\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"XML\",\n-                                        \"value\": \"XML\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"JSON\",\n-                                \"description\": \"The output mode for the results.\",\n-                                \"displayName\": \"Output Mode\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Output Mode\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Owner\": {\n-                                \"description\": \"The owner to pass to Splunk.\",\n-                                \"displayName\": \"Owner\",\n+                            \"Kerberos Keytab\": {\n+                                \"description\": \"Kerberos keytab associated with the principal. Requires nifi.kerberos.krb5.file to be set in your nifi.properties\",\n+                                \"displayName\": \"Kerberos Keytab\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Owner\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Kerberos Keytab\",\n                                 \"required\": false,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"SINGLE\",\n+                                    \"resourceTypes\": [\n+                                        \"FILE\"\n+                                    ]\n+                                },\n                                 \"sensitive\": false\n                             },\n-                            \"Password\": {\n-                                \"description\": \"The password to authenticate to Splunk.\",\n-                                \"displayName\": \"Password\",\n+                            \"Kerberos Password\": {\n+                                \"description\": \"Kerberos password associated with the principal.\",\n+                                \"displayName\": \"Kerberos Password\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Password\",\n+                                \"name\": \"Kerberos Password\",\n                                 \"required\": false,\n                                 \"sensitive\": true\n                             },\n-                            \"Port\": {\n-                                \"defaultValue\": \"8089\",\n-                                \"description\": \"The port of the Splunk server.\",\n-                                \"displayName\": \"Port\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Port\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Query\": {\n-                                \"defaultValue\": \"search * | head 100\",\n-                                \"description\": \"The query to execute. Typically beginning with a <search> command followed by a search clause, such as <search source=\\\"tcp:7689\\\"> to search for messages received on TCP port 7689.\",\n-                                \"displayName\": \"Query\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Query\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Read Timeout\": {\n-                                \"defaultValue\": \"15 secs\",\n-                                \"description\": \"Max wait time for response from the Splunk server.\",\n-                                \"displayName\": \"Read Timeout\",\n+                            \"Kerberos Principal\": {\n+                                \"description\": \"Kerberos principal to authenticate as. Requires nifi.kerberos.krb5.file to be set in your nifi.properties\",\n+                                \"displayName\": \"Kerberos Principal\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Read Timeout\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Kerberos Principal\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"SSL Context Service\": {\n-                                \"description\": \"The SSL Context Service used to provide client certificate information for TLS/SSL connections.\",\n-                                \"displayName\": \"SSL Context Service\",\n+                            \"Kerberos Relogin Period\": {\n+                                \"defaultValue\": \"4 hours\",\n+                                \"description\": \"Period of time which should pass before attempting a kerberos relogin.\\n\\nThis property has been deprecated, and has no effect on processing. Relogins now occur automatically.\",\n+                                \"displayName\": \"Kerberos Relogin Period\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"SSL Context Service\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Kerberos Relogin Period\",\n                                 \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n+                                \"sensitive\": false\n                             },\n-                            \"Scheme\": {\n+                            \"avro-add-list-element-records\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"https\",\n-                                        \"value\": \"https\"\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"http\",\n-                                        \"value\": \"http\"\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"https\",\n-                                \"description\": \"The scheme for connecting to Splunk.\",\n-                                \"displayName\": \"Scheme\",\n+                                \"defaultValue\": \"true\",\n+                                \"description\": \"Specifies the value for 'parquet.avro.add-list-element-records' in the underlying Parquet library\",\n+                                \"displayName\": \"Avro Add List Element Records\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Scheme\",\n+                                \"name\": \"avro-add-list-element-records\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Security Protocol\": {\n+                            \"avro-write-old-list-structure\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"TLSv1_2\",\n-                                        \"value\": \"TLSv1_2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"TLSv1_1\",\n-                                        \"value\": \"TLSv1_1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"TLSv1\",\n-                                        \"value\": \"TLSv1\"\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"SSLv3\",\n-                                        \"value\": \"SSLv3\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"TLSv1_2\",\n-                                \"description\": \"The security protocol to use for communicating with Splunk.\",\n-                                \"displayName\": \"Security Protocol\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Security Protocol\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Time Field Strategy\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"Search based on the time of the event which may be different than when the event was indexed.\",\n-                                        \"displayName\": \"Event Time\",\n-                                        \"value\": \"Event Time\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Search based on the time the event was indexed in Splunk.\",\n-                                        \"displayName\": \"Index Time\",\n-                                        \"value\": \"Index Time\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"Event Time\",\n-                                \"description\": \"Indicates whether to search by the time attached to the event, or by the time the event was indexed in Splunk.\",\n-                                \"displayName\": \"Time Field Strategy\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Time Field Strategy\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Time Range Strategy\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"The processor will manage the date ranges of the query starting from the beginning of time.\",\n-                                        \"displayName\": \"Managed from Beginning\",\n-                                        \"value\": \"Managed from Beginning\"\n-                                    },\n-                                    {\n-                                        \"description\": \"The processor will manage the date ranges of the query starting from the current time.\",\n-                                        \"displayName\": \"Managed from Current\",\n-                                        \"value\": \"Managed from Current\"\n-                                    },\n-                                    {\n-                                        \"description\": \"The the time range provided through the Earliest Time and Latest Time properties will be used.\",\n-                                        \"displayName\": \"Provided\",\n-                                        \"value\": \"Provided\"\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"Provided\",\n-                                \"description\": \"Indicates how to apply time ranges to each execution of the query. Selecting a managed option allows the processor to apply a time range from the last execution time to the current execution time. When using <Managed from Beginning>, an earliest time will not be applied on the first execution, and thus all records searched. When using <Managed from Current> the earliest time of the first execution will be the initial execution time. When using <Provided>, the time range will come from the Earliest Time and Latest Time properties, or no time range will be applied if these properties are left blank.\",\n-                                \"displayName\": \"Time Range Strategy\",\n+                                \"defaultValue\": \"true\",\n+                                \"description\": \"Specifies the value for 'parquet.avro.write-old-list-structure' in the underlying Parquet library\",\n+                                \"displayName\": \"Avro Write Old List Structure\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Time Range Strategy\",\n+                                \"name\": \"avro-write-old-list-structure\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Time Zone\": {\n+                            \"compression-type\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"Africa/Abidjan\",\n-                                        \"value\": \"Africa/Abidjan\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Africa/Accra\",\n-                                        \"value\": \"Africa/Accra\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Africa/Addis_Ababa\",\n-                                        \"value\": \"Africa/Addis_Ababa\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Africa/Algiers\",\n-                                        \"value\": \"Africa/Algiers\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Africa/Asmara\",\n-                                        \"value\": \"Africa/Asmara\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Africa/Asmera\",\n-                                        \"value\": \"Africa/Asmera\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Africa/Bamako\",\n-                                        \"value\": \"Africa/Bamako\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Africa/Bangui\",\n-                                        \"value\": \"Africa/Bangui\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Africa/Banjul\",\n-                                        \"value\": \"Africa/Banjul\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Africa/Bissau\",\n-                                        \"value\": \"Africa/Bissau\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Africa/Blantyre\",\n-                                        \"value\": \"Africa/Blantyre\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Africa/Brazzaville\",\n-                                        \"value\": \"Africa/Brazzaville\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Africa/Bujumbura\",\n-                                        \"value\": \"Africa/Bujumbura\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Africa/Cairo\",\n-                                        \"value\": \"Africa/Cairo\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Africa/Casablanca\",\n-                                        \"value\": \"Africa/Casablanca\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Africa/Ceuta\",\n-                                        \"value\": \"Africa/Ceuta\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Africa/Conakry\",\n-                                        \"value\": \"Africa/Conakry\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Africa/Dakar\",\n-                                        \"value\": \"Africa/Dakar\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Africa/Dar_es_Salaam\",\n-                                        \"value\": \"Africa/Dar_es_Salaam\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Africa/Djibouti\",\n-                                        \"value\": \"Africa/Djibouti\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Africa/Douala\",\n-                                        \"value\": \"Africa/Douala\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Africa/El_Aaiun\",\n-                                        \"value\": \"Africa/El_Aaiun\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Africa/Freetown\",\n-                                        \"value\": \"Africa/Freetown\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Africa/Gaborone\",\n-                                        \"value\": \"Africa/Gaborone\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Africa/Harare\",\n-                                        \"value\": \"Africa/Harare\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Africa/Johannesburg\",\n-                                        \"value\": \"Africa/Johannesburg\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Africa/Juba\",\n-                                        \"value\": \"Africa/Juba\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Africa/Kampala\",\n-                                        \"value\": \"Africa/Kampala\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Africa/Khartoum\",\n-                                        \"value\": \"Africa/Khartoum\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Africa/Kigali\",\n-                                        \"value\": \"Africa/Kigali\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Africa/Kinshasa\",\n-                                        \"value\": \"Africa/Kinshasa\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Africa/Lagos\",\n-                                        \"value\": \"Africa/Lagos\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Africa/Libreville\",\n-                                        \"value\": \"Africa/Libreville\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Africa/Lome\",\n-                                        \"value\": \"Africa/Lome\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Africa/Luanda\",\n-                                        \"value\": \"Africa/Luanda\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Africa/Lubumbashi\",\n-                                        \"value\": \"Africa/Lubumbashi\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Africa/Lusaka\",\n-                                        \"value\": \"Africa/Lusaka\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Africa/Malabo\",\n-                                        \"value\": \"Africa/Malabo\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Africa/Maputo\",\n-                                        \"value\": \"Africa/Maputo\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Africa/Maseru\",\n-                                        \"value\": \"Africa/Maseru\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Africa/Mbabane\",\n-                                        \"value\": \"Africa/Mbabane\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Africa/Mogadishu\",\n-                                        \"value\": \"Africa/Mogadishu\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Africa/Monrovia\",\n-                                        \"value\": \"Africa/Monrovia\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Africa/Nairobi\",\n-                                        \"value\": \"Africa/Nairobi\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Africa/Ndjamena\",\n-                                        \"value\": \"Africa/Ndjamena\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Africa/Niamey\",\n-                                        \"value\": \"Africa/Niamey\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Africa/Nouakchott\",\n-                                        \"value\": \"Africa/Nouakchott\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Africa/Ouagadougou\",\n-                                        \"value\": \"Africa/Ouagadougou\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Africa/Porto-Novo\",\n-                                        \"value\": \"Africa/Porto-Novo\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Africa/Sao_Tome\",\n-                                        \"value\": \"Africa/Sao_Tome\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Africa/Timbuktu\",\n-                                        \"value\": \"Africa/Timbuktu\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Africa/Tripoli\",\n-                                        \"value\": \"Africa/Tripoli\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Africa/Tunis\",\n-                                        \"value\": \"Africa/Tunis\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Africa/Windhoek\",\n-                                        \"value\": \"Africa/Windhoek\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Adak\",\n-                                        \"value\": \"America/Adak\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Anchorage\",\n-                                        \"value\": \"America/Anchorage\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Anguilla\",\n-                                        \"value\": \"America/Anguilla\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Antigua\",\n-                                        \"value\": \"America/Antigua\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Araguaina\",\n-                                        \"value\": \"America/Araguaina\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Argentina/Buenos_Aires\",\n-                                        \"value\": \"America/Argentina/Buenos_Aires\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Argentina/Catamarca\",\n-                                        \"value\": \"America/Argentina/Catamarca\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Argentina/ComodRivadavia\",\n-                                        \"value\": \"America/Argentina/ComodRivadavia\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Argentina/Cordoba\",\n-                                        \"value\": \"America/Argentina/Cordoba\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Argentina/Jujuy\",\n-                                        \"value\": \"America/Argentina/Jujuy\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Argentina/La_Rioja\",\n-                                        \"value\": \"America/Argentina/La_Rioja\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Argentina/Mendoza\",\n-                                        \"value\": \"America/Argentina/Mendoza\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Argentina/Rio_Gallegos\",\n-                                        \"value\": \"America/Argentina/Rio_Gallegos\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Argentina/Salta\",\n-                                        \"value\": \"America/Argentina/Salta\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Argentina/San_Juan\",\n-                                        \"value\": \"America/Argentina/San_Juan\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Argentina/San_Luis\",\n-                                        \"value\": \"America/Argentina/San_Luis\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Argentina/Tucuman\",\n-                                        \"value\": \"America/Argentina/Tucuman\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Argentina/Ushuaia\",\n-                                        \"value\": \"America/Argentina/Ushuaia\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Aruba\",\n-                                        \"value\": \"America/Aruba\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Asuncion\",\n-                                        \"value\": \"America/Asuncion\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Atikokan\",\n-                                        \"value\": \"America/Atikokan\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Atka\",\n-                                        \"value\": \"America/Atka\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Bahia\",\n-                                        \"value\": \"America/Bahia\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Bahia_Banderas\",\n-                                        \"value\": \"America/Bahia_Banderas\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Barbados\",\n-                                        \"value\": \"America/Barbados\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Belem\",\n-                                        \"value\": \"America/Belem\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Belize\",\n-                                        \"value\": \"America/Belize\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Blanc-Sablon\",\n-                                        \"value\": \"America/Blanc-Sablon\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Boa_Vista\",\n-                                        \"value\": \"America/Boa_Vista\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Bogota\",\n-                                        \"value\": \"America/Bogota\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Boise\",\n-                                        \"value\": \"America/Boise\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Buenos_Aires\",\n-                                        \"value\": \"America/Buenos_Aires\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Cambridge_Bay\",\n-                                        \"value\": \"America/Cambridge_Bay\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Campo_Grande\",\n-                                        \"value\": \"America/Campo_Grande\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Cancun\",\n-                                        \"value\": \"America/Cancun\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Caracas\",\n-                                        \"value\": \"America/Caracas\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Catamarca\",\n-                                        \"value\": \"America/Catamarca\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Cayenne\",\n-                                        \"value\": \"America/Cayenne\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Cayman\",\n-                                        \"value\": \"America/Cayman\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Chicago\",\n-                                        \"value\": \"America/Chicago\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Chihuahua\",\n-                                        \"value\": \"America/Chihuahua\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Coral_Harbour\",\n-                                        \"value\": \"America/Coral_Harbour\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Cordoba\",\n-                                        \"value\": \"America/Cordoba\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Costa_Rica\",\n-                                        \"value\": \"America/Costa_Rica\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Creston\",\n-                                        \"value\": \"America/Creston\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Cuiaba\",\n-                                        \"value\": \"America/Cuiaba\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Curacao\",\n-                                        \"value\": \"America/Curacao\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Danmarkshavn\",\n-                                        \"value\": \"America/Danmarkshavn\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Dawson\",\n-                                        \"value\": \"America/Dawson\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Dawson_Creek\",\n-                                        \"value\": \"America/Dawson_Creek\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Denver\",\n-                                        \"value\": \"America/Denver\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Detroit\",\n-                                        \"value\": \"America/Detroit\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Dominica\",\n-                                        \"value\": \"America/Dominica\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Edmonton\",\n-                                        \"value\": \"America/Edmonton\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Eirunepe\",\n-                                        \"value\": \"America/Eirunepe\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/El_Salvador\",\n-                                        \"value\": \"America/El_Salvador\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Ensenada\",\n-                                        \"value\": \"America/Ensenada\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Fort_Nelson\",\n-                                        \"value\": \"America/Fort_Nelson\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Fort_Wayne\",\n-                                        \"value\": \"America/Fort_Wayne\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Fortaleza\",\n-                                        \"value\": \"America/Fortaleza\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Glace_Bay\",\n-                                        \"value\": \"America/Glace_Bay\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Godthab\",\n-                                        \"value\": \"America/Godthab\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Goose_Bay\",\n-                                        \"value\": \"America/Goose_Bay\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Grand_Turk\",\n-                                        \"value\": \"America/Grand_Turk\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Grenada\",\n-                                        \"value\": \"America/Grenada\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Guadeloupe\",\n-                                        \"value\": \"America/Guadeloupe\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Guatemala\",\n-                                        \"value\": \"America/Guatemala\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Guayaquil\",\n-                                        \"value\": \"America/Guayaquil\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Guyana\",\n-                                        \"value\": \"America/Guyana\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Halifax\",\n-                                        \"value\": \"America/Halifax\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Havana\",\n-                                        \"value\": \"America/Havana\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Hermosillo\",\n-                                        \"value\": \"America/Hermosillo\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Indiana/Indianapolis\",\n-                                        \"value\": \"America/Indiana/Indianapolis\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Indiana/Knox\",\n-                                        \"value\": \"America/Indiana/Knox\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Indiana/Marengo\",\n-                                        \"value\": \"America/Indiana/Marengo\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Indiana/Petersburg\",\n-                                        \"value\": \"America/Indiana/Petersburg\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Indiana/Tell_City\",\n-                                        \"value\": \"America/Indiana/Tell_City\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Indiana/Vevay\",\n-                                        \"value\": \"America/Indiana/Vevay\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Indiana/Vincennes\",\n-                                        \"value\": \"America/Indiana/Vincennes\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Indiana/Winamac\",\n-                                        \"value\": \"America/Indiana/Winamac\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Indianapolis\",\n-                                        \"value\": \"America/Indianapolis\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Inuvik\",\n-                                        \"value\": \"America/Inuvik\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Iqaluit\",\n-                                        \"value\": \"America/Iqaluit\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Jamaica\",\n-                                        \"value\": \"America/Jamaica\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Jujuy\",\n-                                        \"value\": \"America/Jujuy\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Juneau\",\n-                                        \"value\": \"America/Juneau\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Kentucky/Louisville\",\n-                                        \"value\": \"America/Kentucky/Louisville\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Kentucky/Monticello\",\n-                                        \"value\": \"America/Kentucky/Monticello\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Knox_IN\",\n-                                        \"value\": \"America/Knox_IN\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Kralendijk\",\n-                                        \"value\": \"America/Kralendijk\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/La_Paz\",\n-                                        \"value\": \"America/La_Paz\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Lima\",\n-                                        \"value\": \"America/Lima\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Los_Angeles\",\n-                                        \"value\": \"America/Los_Angeles\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Louisville\",\n-                                        \"value\": \"America/Louisville\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Lower_Princes\",\n-                                        \"value\": \"America/Lower_Princes\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Maceio\",\n-                                        \"value\": \"America/Maceio\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Managua\",\n-                                        \"value\": \"America/Managua\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Manaus\",\n-                                        \"value\": \"America/Manaus\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Marigot\",\n-                                        \"value\": \"America/Marigot\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Martinique\",\n-                                        \"value\": \"America/Martinique\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Matamoros\",\n-                                        \"value\": \"America/Matamoros\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Mazatlan\",\n-                                        \"value\": \"America/Mazatlan\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Mendoza\",\n-                                        \"value\": \"America/Mendoza\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Menominee\",\n-                                        \"value\": \"America/Menominee\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Merida\",\n-                                        \"value\": \"America/Merida\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Metlakatla\",\n-                                        \"value\": \"America/Metlakatla\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Mexico_City\",\n-                                        \"value\": \"America/Mexico_City\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Miquelon\",\n-                                        \"value\": \"America/Miquelon\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Moncton\",\n-                                        \"value\": \"America/Moncton\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Monterrey\",\n-                                        \"value\": \"America/Monterrey\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Montevideo\",\n-                                        \"value\": \"America/Montevideo\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Montreal\",\n-                                        \"value\": \"America/Montreal\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Montserrat\",\n-                                        \"value\": \"America/Montserrat\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Nassau\",\n-                                        \"value\": \"America/Nassau\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/New_York\",\n-                                        \"value\": \"America/New_York\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Nipigon\",\n-                                        \"value\": \"America/Nipigon\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Nome\",\n-                                        \"value\": \"America/Nome\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Noronha\",\n-                                        \"value\": \"America/Noronha\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/North_Dakota/Beulah\",\n-                                        \"value\": \"America/North_Dakota/Beulah\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/North_Dakota/Center\",\n-                                        \"value\": \"America/North_Dakota/Center\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/North_Dakota/New_Salem\",\n-                                        \"value\": \"America/North_Dakota/New_Salem\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Nuuk\",\n-                                        \"value\": \"America/Nuuk\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Ojinaga\",\n-                                        \"value\": \"America/Ojinaga\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Panama\",\n-                                        \"value\": \"America/Panama\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Pangnirtung\",\n-                                        \"value\": \"America/Pangnirtung\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Paramaribo\",\n-                                        \"value\": \"America/Paramaribo\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Phoenix\",\n-                                        \"value\": \"America/Phoenix\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Port-au-Prince\",\n-                                        \"value\": \"America/Port-au-Prince\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Port_of_Spain\",\n-                                        \"value\": \"America/Port_of_Spain\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Porto_Acre\",\n-                                        \"value\": \"America/Porto_Acre\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Porto_Velho\",\n-                                        \"value\": \"America/Porto_Velho\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Puerto_Rico\",\n-                                        \"value\": \"America/Puerto_Rico\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Punta_Arenas\",\n-                                        \"value\": \"America/Punta_Arenas\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Rainy_River\",\n-                                        \"value\": \"America/Rainy_River\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Rankin_Inlet\",\n-                                        \"value\": \"America/Rankin_Inlet\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Recife\",\n-                                        \"value\": \"America/Recife\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Regina\",\n-                                        \"value\": \"America/Regina\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Resolute\",\n-                                        \"value\": \"America/Resolute\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Rio_Branco\",\n-                                        \"value\": \"America/Rio_Branco\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Rosario\",\n-                                        \"value\": \"America/Rosario\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Santa_Isabel\",\n-                                        \"value\": \"America/Santa_Isabel\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Santarem\",\n-                                        \"value\": \"America/Santarem\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Santiago\",\n-                                        \"value\": \"America/Santiago\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Santo_Domingo\",\n-                                        \"value\": \"America/Santo_Domingo\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Sao_Paulo\",\n-                                        \"value\": \"America/Sao_Paulo\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Scoresbysund\",\n-                                        \"value\": \"America/Scoresbysund\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Shiprock\",\n-                                        \"value\": \"America/Shiprock\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Sitka\",\n-                                        \"value\": \"America/Sitka\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/St_Barthelemy\",\n-                                        \"value\": \"America/St_Barthelemy\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/St_Johns\",\n-                                        \"value\": \"America/St_Johns\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/St_Kitts\",\n-                                        \"value\": \"America/St_Kitts\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/St_Lucia\",\n-                                        \"value\": \"America/St_Lucia\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/St_Thomas\",\n-                                        \"value\": \"America/St_Thomas\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/St_Vincent\",\n-                                        \"value\": \"America/St_Vincent\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Swift_Current\",\n-                                        \"value\": \"America/Swift_Current\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Tegucigalpa\",\n-                                        \"value\": \"America/Tegucigalpa\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Thule\",\n-                                        \"value\": \"America/Thule\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Thunder_Bay\",\n-                                        \"value\": \"America/Thunder_Bay\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Tijuana\",\n-                                        \"value\": \"America/Tijuana\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Toronto\",\n-                                        \"value\": \"America/Toronto\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Tortola\",\n-                                        \"value\": \"America/Tortola\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Vancouver\",\n-                                        \"value\": \"America/Vancouver\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Virgin\",\n-                                        \"value\": \"America/Virgin\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Whitehorse\",\n-                                        \"value\": \"America/Whitehorse\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Winnipeg\",\n-                                        \"value\": \"America/Winnipeg\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Yakutat\",\n-                                        \"value\": \"America/Yakutat\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"America/Yellowknife\",\n-                                        \"value\": \"America/Yellowknife\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Antarctica/Casey\",\n-                                        \"value\": \"Antarctica/Casey\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Antarctica/Davis\",\n-                                        \"value\": \"Antarctica/Davis\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Antarctica/DumontDUrville\",\n-                                        \"value\": \"Antarctica/DumontDUrville\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Antarctica/Macquarie\",\n-                                        \"value\": \"Antarctica/Macquarie\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Antarctica/Mawson\",\n-                                        \"value\": \"Antarctica/Mawson\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Antarctica/McMurdo\",\n-                                        \"value\": \"Antarctica/McMurdo\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Antarctica/Palmer\",\n-                                        \"value\": \"Antarctica/Palmer\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Antarctica/Rothera\",\n-                                        \"value\": \"Antarctica/Rothera\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Antarctica/South_Pole\",\n-                                        \"value\": \"Antarctica/South_Pole\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Antarctica/Syowa\",\n-                                        \"value\": \"Antarctica/Syowa\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Antarctica/Troll\",\n-                                        \"value\": \"Antarctica/Troll\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Antarctica/Vostok\",\n-                                        \"value\": \"Antarctica/Vostok\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Arctic/Longyearbyen\",\n-                                        \"value\": \"Arctic/Longyearbyen\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Asia/Aden\",\n-                                        \"value\": \"Asia/Aden\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Asia/Almaty\",\n-                                        \"value\": \"Asia/Almaty\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Asia/Amman\",\n-                                        \"value\": \"Asia/Amman\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Asia/Anadyr\",\n-                                        \"value\": \"Asia/Anadyr\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Asia/Aqtau\",\n-                                        \"value\": \"Asia/Aqtau\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Asia/Aqtobe\",\n-                                        \"value\": \"Asia/Aqtobe\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Asia/Ashgabat\",\n-                                        \"value\": \"Asia/Ashgabat\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Asia/Ashkhabad\",\n-                                        \"value\": \"Asia/Ashkhabad\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Asia/Atyrau\",\n-                                        \"value\": \"Asia/Atyrau\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Asia/Baghdad\",\n-                                        \"value\": \"Asia/Baghdad\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Asia/Bahrain\",\n-                                        \"value\": \"Asia/Bahrain\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Asia/Baku\",\n-                                        \"value\": \"Asia/Baku\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Asia/Bangkok\",\n-                                        \"value\": \"Asia/Bangkok\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Asia/Barnaul\",\n-                                        \"value\": \"Asia/Barnaul\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Asia/Beirut\",\n-                                        \"value\": \"Asia/Beirut\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Asia/Bishkek\",\n-                                        \"value\": \"Asia/Bishkek\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Asia/Brunei\",\n-                                        \"value\": \"Asia/Brunei\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Asia/Calcutta\",\n-                                        \"value\": \"Asia/Calcutta\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Asia/Chita\",\n-                                        \"value\": \"Asia/Chita\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Asia/Choibalsan\",\n-                                        \"value\": \"Asia/Choibalsan\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Asia/Chongqing\",\n-                                        \"value\": \"Asia/Chongqing\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Asia/Chungking\",\n-                                        \"value\": \"Asia/Chungking\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Asia/Colombo\",\n-                                        \"value\": \"Asia/Colombo\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Asia/Dacca\",\n-                                        \"value\": \"Asia/Dacca\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Asia/Damascus\",\n-                                        \"value\": \"Asia/Damascus\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Asia/Dhaka\",\n-                                        \"value\": \"Asia/Dhaka\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Asia/Dili\",\n-                                        \"value\": \"Asia/Dili\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Asia/Dubai\",\n-                                        \"value\": \"Asia/Dubai\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Asia/Dushanbe\",\n-                                        \"value\": \"Asia/Dushanbe\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Asia/Famagusta\",\n-                                        \"value\": \"Asia/Famagusta\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Asia/Gaza\",\n-                                        \"value\": \"Asia/Gaza\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Asia/Harbin\",\n-                                        \"value\": \"Asia/Harbin\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Asia/Hebron\",\n-                                        \"value\": \"Asia/Hebron\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Asia/Ho_Chi_Minh\",\n-                                        \"value\": \"Asia/Ho_Chi_Minh\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Asia/Hong_Kong\",\n-                                        \"value\": \"Asia/Hong_Kong\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Asia/Hovd\",\n-                                        \"value\": \"Asia/Hovd\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Asia/Irkutsk\",\n-                                        \"value\": \"Asia/Irkutsk\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Asia/Istanbul\",\n-                                        \"value\": \"Asia/Istanbul\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Asia/Jakarta\",\n-                                        \"value\": \"Asia/Jakarta\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Asia/Jayapura\",\n-                                        \"value\": \"Asia/Jayapura\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Asia/Jerusalem\",\n-                                        \"value\": \"Asia/Jerusalem\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Asia/Kabul\",\n-                                        \"value\": \"Asia/Kabul\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Asia/Kamchatka\",\n-                                        \"value\": \"Asia/Kamchatka\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Asia/Karachi\",\n-                                        \"value\": \"Asia/Karachi\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Asia/Kashgar\",\n-                                        \"value\": \"Asia/Kashgar\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Asia/Kathmandu\",\n-                                        \"value\": \"Asia/Kathmandu\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Asia/Katmandu\",\n-                                        \"value\": \"Asia/Katmandu\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Asia/Khandyga\",\n-                                        \"value\": \"Asia/Khandyga\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Asia/Kolkata\",\n-                                        \"value\": \"Asia/Kolkata\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Asia/Krasnoyarsk\",\n-                                        \"value\": \"Asia/Krasnoyarsk\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Asia/Kuala_Lumpur\",\n-                                        \"value\": \"Asia/Kuala_Lumpur\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Asia/Kuching\",\n-                                        \"value\": \"Asia/Kuching\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Asia/Kuwait\",\n-                                        \"value\": \"Asia/Kuwait\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Asia/Macao\",\n-                                        \"value\": \"Asia/Macao\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Asia/Macau\",\n-                                        \"value\": \"Asia/Macau\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Asia/Magadan\",\n-                                        \"value\": \"Asia/Magadan\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Asia/Makassar\",\n-                                        \"value\": \"Asia/Makassar\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Asia/Manila\",\n-                                        \"value\": \"Asia/Manila\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Asia/Muscat\",\n-                                        \"value\": \"Asia/Muscat\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Asia/Nicosia\",\n-                                        \"value\": \"Asia/Nicosia\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Asia/Novokuznetsk\",\n-                                        \"value\": \"Asia/Novokuznetsk\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Asia/Novosibirsk\",\n-                                        \"value\": \"Asia/Novosibirsk\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Asia/Omsk\",\n-                                        \"value\": \"Asia/Omsk\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Asia/Oral\",\n-                                        \"value\": \"Asia/Oral\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Asia/Phnom_Penh\",\n-                                        \"value\": \"Asia/Phnom_Penh\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Asia/Pontianak\",\n-                                        \"value\": \"Asia/Pontianak\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Asia/Pyongyang\",\n-                                        \"value\": \"Asia/Pyongyang\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Asia/Qatar\",\n-                                        \"value\": \"Asia/Qatar\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Asia/Qostanay\",\n-                                        \"value\": \"Asia/Qostanay\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Asia/Qyzylorda\",\n-                                        \"value\": \"Asia/Qyzylorda\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Asia/Rangoon\",\n-                                        \"value\": \"Asia/Rangoon\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Asia/Riyadh\",\n-                                        \"value\": \"Asia/Riyadh\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Asia/Saigon\",\n-                                        \"value\": \"Asia/Saigon\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Asia/Sakhalin\",\n-                                        \"value\": \"Asia/Sakhalin\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Asia/Samarkand\",\n-                                        \"value\": \"Asia/Samarkand\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Asia/Seoul\",\n-                                        \"value\": \"Asia/Seoul\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Asia/Shanghai\",\n-                                        \"value\": \"Asia/Shanghai\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Asia/Singapore\",\n-                                        \"value\": \"Asia/Singapore\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Asia/Srednekolymsk\",\n-                                        \"value\": \"Asia/Srednekolymsk\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Asia/Taipei\",\n-                                        \"value\": \"Asia/Taipei\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Asia/Tashkent\",\n-                                        \"value\": \"Asia/Tashkent\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Asia/Tbilisi\",\n-                                        \"value\": \"Asia/Tbilisi\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Asia/Tehran\",\n-                                        \"value\": \"Asia/Tehran\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Asia/Tel_Aviv\",\n-                                        \"value\": \"Asia/Tel_Aviv\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Asia/Thimbu\",\n-                                        \"value\": \"Asia/Thimbu\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Asia/Thimphu\",\n-                                        \"value\": \"Asia/Thimphu\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Asia/Tokyo\",\n-                                        \"value\": \"Asia/Tokyo\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Asia/Tomsk\",\n-                                        \"value\": \"Asia/Tomsk\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Asia/Ujung_Pandang\",\n-                                        \"value\": \"Asia/Ujung_Pandang\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Asia/Ulaanbaatar\",\n-                                        \"value\": \"Asia/Ulaanbaatar\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Asia/Ulan_Bator\",\n-                                        \"value\": \"Asia/Ulan_Bator\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Asia/Urumqi\",\n-                                        \"value\": \"Asia/Urumqi\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Asia/Ust-Nera\",\n-                                        \"value\": \"Asia/Ust-Nera\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Asia/Vientiane\",\n-                                        \"value\": \"Asia/Vientiane\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Asia/Vladivostok\",\n-                                        \"value\": \"Asia/Vladivostok\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Asia/Yakutsk\",\n-                                        \"value\": \"Asia/Yakutsk\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Asia/Yangon\",\n-                                        \"value\": \"Asia/Yangon\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Asia/Yekaterinburg\",\n-                                        \"value\": \"Asia/Yekaterinburg\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Asia/Yerevan\",\n-                                        \"value\": \"Asia/Yerevan\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Atlantic/Azores\",\n-                                        \"value\": \"Atlantic/Azores\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Atlantic/Bermuda\",\n-                                        \"value\": \"Atlantic/Bermuda\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Atlantic/Canary\",\n-                                        \"value\": \"Atlantic/Canary\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Atlantic/Cape_Verde\",\n-                                        \"value\": \"Atlantic/Cape_Verde\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Atlantic/Faeroe\",\n-                                        \"value\": \"Atlantic/Faeroe\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Atlantic/Faroe\",\n-                                        \"value\": \"Atlantic/Faroe\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Atlantic/Jan_Mayen\",\n-                                        \"value\": \"Atlantic/Jan_Mayen\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Atlantic/Madeira\",\n-                                        \"value\": \"Atlantic/Madeira\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Atlantic/Reykjavik\",\n-                                        \"value\": \"Atlantic/Reykjavik\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Atlantic/South_Georgia\",\n-                                        \"value\": \"Atlantic/South_Georgia\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Atlantic/St_Helena\",\n-                                        \"value\": \"Atlantic/St_Helena\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Atlantic/Stanley\",\n-                                        \"value\": \"Atlantic/Stanley\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Australia/ACT\",\n-                                        \"value\": \"Australia/ACT\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Australia/Adelaide\",\n-                                        \"value\": \"Australia/Adelaide\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Australia/Brisbane\",\n-                                        \"value\": \"Australia/Brisbane\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Australia/Broken_Hill\",\n-                                        \"value\": \"Australia/Broken_Hill\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Australia/Canberra\",\n-                                        \"value\": \"Australia/Canberra\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Australia/Currie\",\n-                                        \"value\": \"Australia/Currie\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Australia/Darwin\",\n-                                        \"value\": \"Australia/Darwin\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Australia/Eucla\",\n-                                        \"value\": \"Australia/Eucla\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Australia/Hobart\",\n-                                        \"value\": \"Australia/Hobart\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Australia/LHI\",\n-                                        \"value\": \"Australia/LHI\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Australia/Lindeman\",\n-                                        \"value\": \"Australia/Lindeman\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Australia/Lord_Howe\",\n-                                        \"value\": \"Australia/Lord_Howe\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Australia/Melbourne\",\n-                                        \"value\": \"Australia/Melbourne\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Australia/NSW\",\n-                                        \"value\": \"Australia/NSW\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Australia/North\",\n-                                        \"value\": \"Australia/North\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Australia/Perth\",\n-                                        \"value\": \"Australia/Perth\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Australia/Queensland\",\n-                                        \"value\": \"Australia/Queensland\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Australia/South\",\n-                                        \"value\": \"Australia/South\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Australia/Sydney\",\n-                                        \"value\": \"Australia/Sydney\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Australia/Tasmania\",\n-                                        \"value\": \"Australia/Tasmania\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Australia/Victoria\",\n-                                        \"value\": \"Australia/Victoria\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Australia/West\",\n-                                        \"value\": \"Australia/West\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Australia/Yancowinna\",\n-                                        \"value\": \"Australia/Yancowinna\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Brazil/Acre\",\n-                                        \"value\": \"Brazil/Acre\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Brazil/DeNoronha\",\n-                                        \"value\": \"Brazil/DeNoronha\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Brazil/East\",\n-                                        \"value\": \"Brazil/East\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Brazil/West\",\n-                                        \"value\": \"Brazil/West\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"CET\",\n-                                        \"value\": \"CET\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"CST6CDT\",\n-                                        \"value\": \"CST6CDT\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Canada/Atlantic\",\n-                                        \"value\": \"Canada/Atlantic\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Canada/Central\",\n-                                        \"value\": \"Canada/Central\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Canada/Eastern\",\n-                                        \"value\": \"Canada/Eastern\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Canada/Mountain\",\n-                                        \"value\": \"Canada/Mountain\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Canada/Newfoundland\",\n-                                        \"value\": \"Canada/Newfoundland\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Canada/Pacific\",\n-                                        \"value\": \"Canada/Pacific\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Canada/Saskatchewan\",\n-                                        \"value\": \"Canada/Saskatchewan\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Canada/Yukon\",\n-                                        \"value\": \"Canada/Yukon\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Chile/Continental\",\n-                                        \"value\": \"Chile/Continental\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Chile/EasterIsland\",\n-                                        \"value\": \"Chile/EasterIsland\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Cuba\",\n-                                        \"value\": \"Cuba\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"EET\",\n-                                        \"value\": \"EET\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"EST5EDT\",\n-                                        \"value\": \"EST5EDT\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Egypt\",\n-                                        \"value\": \"Egypt\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Eire\",\n-                                        \"value\": \"Eire\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Etc/GMT\",\n-                                        \"value\": \"Etc/GMT\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Etc/GMT+0\",\n-                                        \"value\": \"Etc/GMT+0\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Etc/GMT+1\",\n-                                        \"value\": \"Etc/GMT+1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Etc/GMT+10\",\n-                                        \"value\": \"Etc/GMT+10\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Etc/GMT+11\",\n-                                        \"value\": \"Etc/GMT+11\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Etc/GMT+12\",\n-                                        \"value\": \"Etc/GMT+12\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Etc/GMT+2\",\n-                                        \"value\": \"Etc/GMT+2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Etc/GMT+3\",\n-                                        \"value\": \"Etc/GMT+3\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Etc/GMT+4\",\n-                                        \"value\": \"Etc/GMT+4\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Etc/GMT+5\",\n-                                        \"value\": \"Etc/GMT+5\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Etc/GMT+6\",\n-                                        \"value\": \"Etc/GMT+6\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Etc/GMT+7\",\n-                                        \"value\": \"Etc/GMT+7\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Etc/GMT+8\",\n-                                        \"value\": \"Etc/GMT+8\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Etc/GMT+9\",\n-                                        \"value\": \"Etc/GMT+9\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Etc/GMT-0\",\n-                                        \"value\": \"Etc/GMT-0\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Etc/GMT-1\",\n-                                        \"value\": \"Etc/GMT-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Etc/GMT-10\",\n-                                        \"value\": \"Etc/GMT-10\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Etc/GMT-11\",\n-                                        \"value\": \"Etc/GMT-11\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Etc/GMT-12\",\n-                                        \"value\": \"Etc/GMT-12\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Etc/GMT-13\",\n-                                        \"value\": \"Etc/GMT-13\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Etc/GMT-14\",\n-                                        \"value\": \"Etc/GMT-14\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Etc/GMT-2\",\n-                                        \"value\": \"Etc/GMT-2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Etc/GMT-3\",\n-                                        \"value\": \"Etc/GMT-3\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Etc/GMT-4\",\n-                                        \"value\": \"Etc/GMT-4\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Etc/GMT-5\",\n-                                        \"value\": \"Etc/GMT-5\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Etc/GMT-6\",\n-                                        \"value\": \"Etc/GMT-6\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Etc/GMT-7\",\n-                                        \"value\": \"Etc/GMT-7\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Etc/GMT-8\",\n-                                        \"value\": \"Etc/GMT-8\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Etc/GMT-9\",\n-                                        \"value\": \"Etc/GMT-9\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Etc/GMT0\",\n-                                        \"value\": \"Etc/GMT0\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Etc/Greenwich\",\n-                                        \"value\": \"Etc/Greenwich\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Etc/UCT\",\n-                                        \"value\": \"Etc/UCT\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Etc/UTC\",\n-                                        \"value\": \"Etc/UTC\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Etc/Universal\",\n-                                        \"value\": \"Etc/Universal\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Etc/Zulu\",\n-                                        \"value\": \"Etc/Zulu\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Europe/Amsterdam\",\n-                                        \"value\": \"Europe/Amsterdam\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Europe/Andorra\",\n-                                        \"value\": \"Europe/Andorra\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Europe/Astrakhan\",\n-                                        \"value\": \"Europe/Astrakhan\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Europe/Athens\",\n-                                        \"value\": \"Europe/Athens\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Europe/Belfast\",\n-                                        \"value\": \"Europe/Belfast\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Europe/Belgrade\",\n-                                        \"value\": \"Europe/Belgrade\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Europe/Berlin\",\n-                                        \"value\": \"Europe/Berlin\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Europe/Bratislava\",\n-                                        \"value\": \"Europe/Bratislava\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Europe/Brussels\",\n-                                        \"value\": \"Europe/Brussels\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Europe/Bucharest\",\n-                                        \"value\": \"Europe/Bucharest\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Europe/Budapest\",\n-                                        \"value\": \"Europe/Budapest\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Europe/Busingen\",\n-                                        \"value\": \"Europe/Busingen\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Europe/Chisinau\",\n-                                        \"value\": \"Europe/Chisinau\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Europe/Copenhagen\",\n-                                        \"value\": \"Europe/Copenhagen\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Europe/Dublin\",\n-                                        \"value\": \"Europe/Dublin\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Europe/Gibraltar\",\n-                                        \"value\": \"Europe/Gibraltar\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Europe/Guernsey\",\n-                                        \"value\": \"Europe/Guernsey\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Europe/Helsinki\",\n-                                        \"value\": \"Europe/Helsinki\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Europe/Isle_of_Man\",\n-                                        \"value\": \"Europe/Isle_of_Man\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Europe/Istanbul\",\n-                                        \"value\": \"Europe/Istanbul\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Europe/Jersey\",\n-                                        \"value\": \"Europe/Jersey\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Europe/Kaliningrad\",\n-                                        \"value\": \"Europe/Kaliningrad\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Europe/Kiev\",\n-                                        \"value\": \"Europe/Kiev\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Europe/Kirov\",\n-                                        \"value\": \"Europe/Kirov\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Europe/Lisbon\",\n-                                        \"value\": \"Europe/Lisbon\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Europe/Ljubljana\",\n-                                        \"value\": \"Europe/Ljubljana\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Europe/London\",\n-                                        \"value\": \"Europe/London\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Europe/Luxembourg\",\n-                                        \"value\": \"Europe/Luxembourg\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Europe/Madrid\",\n-                                        \"value\": \"Europe/Madrid\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Europe/Malta\",\n-                                        \"value\": \"Europe/Malta\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Europe/Mariehamn\",\n-                                        \"value\": \"Europe/Mariehamn\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Europe/Minsk\",\n-                                        \"value\": \"Europe/Minsk\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Europe/Monaco\",\n-                                        \"value\": \"Europe/Monaco\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Europe/Moscow\",\n-                                        \"value\": \"Europe/Moscow\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Europe/Nicosia\",\n-                                        \"value\": \"Europe/Nicosia\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Europe/Oslo\",\n-                                        \"value\": \"Europe/Oslo\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Europe/Paris\",\n-                                        \"value\": \"Europe/Paris\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Europe/Podgorica\",\n-                                        \"value\": \"Europe/Podgorica\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Europe/Prague\",\n-                                        \"value\": \"Europe/Prague\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Europe/Riga\",\n-                                        \"value\": \"Europe/Riga\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Europe/Rome\",\n-                                        \"value\": \"Europe/Rome\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Europe/Samara\",\n-                                        \"value\": \"Europe/Samara\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Europe/San_Marino\",\n-                                        \"value\": \"Europe/San_Marino\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Europe/Sarajevo\",\n-                                        \"value\": \"Europe/Sarajevo\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Europe/Saratov\",\n-                                        \"value\": \"Europe/Saratov\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Europe/Simferopol\",\n-                                        \"value\": \"Europe/Simferopol\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Europe/Skopje\",\n-                                        \"value\": \"Europe/Skopje\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Europe/Sofia\",\n-                                        \"value\": \"Europe/Sofia\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Europe/Stockholm\",\n-                                        \"value\": \"Europe/Stockholm\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Europe/Tallinn\",\n-                                        \"value\": \"Europe/Tallinn\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Europe/Tirane\",\n-                                        \"value\": \"Europe/Tirane\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Europe/Tiraspol\",\n-                                        \"value\": \"Europe/Tiraspol\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Europe/Ulyanovsk\",\n-                                        \"value\": \"Europe/Ulyanovsk\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Europe/Uzhgorod\",\n-                                        \"value\": \"Europe/Uzhgorod\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Europe/Vaduz\",\n-                                        \"value\": \"Europe/Vaduz\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Europe/Vatican\",\n-                                        \"value\": \"Europe/Vatican\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Europe/Vienna\",\n-                                        \"value\": \"Europe/Vienna\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Europe/Vilnius\",\n-                                        \"value\": \"Europe/Vilnius\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Europe/Volgograd\",\n-                                        \"value\": \"Europe/Volgograd\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Europe/Warsaw\",\n-                                        \"value\": \"Europe/Warsaw\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Europe/Zagreb\",\n-                                        \"value\": \"Europe/Zagreb\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Europe/Zaporozhye\",\n-                                        \"value\": \"Europe/Zaporozhye\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Europe/Zurich\",\n-                                        \"value\": \"Europe/Zurich\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"GB\",\n-                                        \"value\": \"GB\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"GB-Eire\",\n-                                        \"value\": \"GB-Eire\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"GMT\",\n-                                        \"value\": \"GMT\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"GMT0\",\n-                                        \"value\": \"GMT0\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Greenwich\",\n-                                        \"value\": \"Greenwich\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Hongkong\",\n-                                        \"value\": \"Hongkong\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Iceland\",\n-                                        \"value\": \"Iceland\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Indian/Antananarivo\",\n-                                        \"value\": \"Indian/Antananarivo\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Indian/Chagos\",\n-                                        \"value\": \"Indian/Chagos\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Indian/Christmas\",\n-                                        \"value\": \"Indian/Christmas\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Indian/Cocos\",\n-                                        \"value\": \"Indian/Cocos\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Indian/Comoro\",\n-                                        \"value\": \"Indian/Comoro\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Indian/Kerguelen\",\n-                                        \"value\": \"Indian/Kerguelen\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Indian/Mahe\",\n-                                        \"value\": \"Indian/Mahe\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Indian/Maldives\",\n-                                        \"value\": \"Indian/Maldives\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Indian/Mauritius\",\n-                                        \"value\": \"Indian/Mauritius\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Indian/Mayotte\",\n-                                        \"value\": \"Indian/Mayotte\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Indian/Reunion\",\n-                                        \"value\": \"Indian/Reunion\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Iran\",\n-                                        \"value\": \"Iran\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Israel\",\n-                                        \"value\": \"Israel\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Jamaica\",\n-                                        \"value\": \"Jamaica\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Japan\",\n-                                        \"value\": \"Japan\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Kwajalein\",\n-                                        \"value\": \"Kwajalein\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Libya\",\n-                                        \"value\": \"Libya\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"MET\",\n-                                        \"value\": \"MET\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"MST7MDT\",\n-                                        \"value\": \"MST7MDT\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Mexico/BajaNorte\",\n-                                        \"value\": \"Mexico/BajaNorte\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Mexico/BajaSur\",\n-                                        \"value\": \"Mexico/BajaSur\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Mexico/General\",\n-                                        \"value\": \"Mexico/General\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"NZ\",\n-                                        \"value\": \"NZ\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"NZ-CHAT\",\n-                                        \"value\": \"NZ-CHAT\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Navajo\",\n-                                        \"value\": \"Navajo\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"PRC\",\n-                                        \"value\": \"PRC\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"PST8PDT\",\n-                                        \"value\": \"PST8PDT\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Pacific/Apia\",\n-                                        \"value\": \"Pacific/Apia\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Pacific/Auckland\",\n-                                        \"value\": \"Pacific/Auckland\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Pacific/Bougainville\",\n-                                        \"value\": \"Pacific/Bougainville\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Pacific/Chatham\",\n-                                        \"value\": \"Pacific/Chatham\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Pacific/Chuuk\",\n-                                        \"value\": \"Pacific/Chuuk\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Pacific/Easter\",\n-                                        \"value\": \"Pacific/Easter\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Pacific/Efate\",\n-                                        \"value\": \"Pacific/Efate\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Pacific/Enderbury\",\n-                                        \"value\": \"Pacific/Enderbury\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Pacific/Fakaofo\",\n-                                        \"value\": \"Pacific/Fakaofo\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Pacific/Fiji\",\n-                                        \"value\": \"Pacific/Fiji\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Pacific/Funafuti\",\n-                                        \"value\": \"Pacific/Funafuti\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Pacific/Galapagos\",\n-                                        \"value\": \"Pacific/Galapagos\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Pacific/Gambier\",\n-                                        \"value\": \"Pacific/Gambier\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Pacific/Guadalcanal\",\n-                                        \"value\": \"Pacific/Guadalcanal\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Pacific/Guam\",\n-                                        \"value\": \"Pacific/Guam\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Pacific/Honolulu\",\n-                                        \"value\": \"Pacific/Honolulu\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Pacific/Johnston\",\n-                                        \"value\": \"Pacific/Johnston\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Pacific/Kiritimati\",\n-                                        \"value\": \"Pacific/Kiritimati\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Pacific/Kosrae\",\n-                                        \"value\": \"Pacific/Kosrae\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Pacific/Kwajalein\",\n-                                        \"value\": \"Pacific/Kwajalein\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Pacific/Majuro\",\n-                                        \"value\": \"Pacific/Majuro\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Pacific/Marquesas\",\n-                                        \"value\": \"Pacific/Marquesas\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Pacific/Midway\",\n-                                        \"value\": \"Pacific/Midway\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Pacific/Nauru\",\n-                                        \"value\": \"Pacific/Nauru\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Pacific/Niue\",\n-                                        \"value\": \"Pacific/Niue\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Pacific/Norfolk\",\n-                                        \"value\": \"Pacific/Norfolk\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Pacific/Noumea\",\n-                                        \"value\": \"Pacific/Noumea\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Pacific/Pago_Pago\",\n-                                        \"value\": \"Pacific/Pago_Pago\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Pacific/Palau\",\n-                                        \"value\": \"Pacific/Palau\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Pacific/Pitcairn\",\n-                                        \"value\": \"Pacific/Pitcairn\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Pacific/Pohnpei\",\n-                                        \"value\": \"Pacific/Pohnpei\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Pacific/Ponape\",\n-                                        \"value\": \"Pacific/Ponape\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Pacific/Port_Moresby\",\n-                                        \"value\": \"Pacific/Port_Moresby\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Pacific/Rarotonga\",\n-                                        \"value\": \"Pacific/Rarotonga\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Pacific/Saipan\",\n-                                        \"value\": \"Pacific/Saipan\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Pacific/Samoa\",\n-                                        \"value\": \"Pacific/Samoa\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Pacific/Tahiti\",\n-                                        \"value\": \"Pacific/Tahiti\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Pacific/Tarawa\",\n-                                        \"value\": \"Pacific/Tarawa\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Pacific/Tongatapu\",\n-                                        \"value\": \"Pacific/Tongatapu\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Pacific/Truk\",\n-                                        \"value\": \"Pacific/Truk\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Pacific/Wake\",\n-                                        \"value\": \"Pacific/Wake\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Pacific/Wallis\",\n-                                        \"value\": \"Pacific/Wallis\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Pacific/Yap\",\n-                                        \"value\": \"Pacific/Yap\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Poland\",\n-                                        \"value\": \"Poland\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Portugal\",\n-                                        \"value\": \"Portugal\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"ROK\",\n-                                        \"value\": \"ROK\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Singapore\",\n-                                        \"value\": \"Singapore\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"SystemV/AST4\",\n-                                        \"value\": \"SystemV/AST4\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"SystemV/AST4ADT\",\n-                                        \"value\": \"SystemV/AST4ADT\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"SystemV/CST6\",\n-                                        \"value\": \"SystemV/CST6\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"SystemV/CST6CDT\",\n-                                        \"value\": \"SystemV/CST6CDT\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"SystemV/EST5\",\n-                                        \"value\": \"SystemV/EST5\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"SystemV/EST5EDT\",\n-                                        \"value\": \"SystemV/EST5EDT\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"SystemV/HST10\",\n-                                        \"value\": \"SystemV/HST10\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"SystemV/MST7\",\n-                                        \"value\": \"SystemV/MST7\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"SystemV/MST7MDT\",\n-                                        \"value\": \"SystemV/MST7MDT\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"SystemV/PST8\",\n-                                        \"value\": \"SystemV/PST8\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"SystemV/PST8PDT\",\n-                                        \"value\": \"SystemV/PST8PDT\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"SystemV/YST9\",\n-                                        \"value\": \"SystemV/YST9\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"SystemV/YST9YDT\",\n-                                        \"value\": \"SystemV/YST9YDT\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Turkey\",\n-                                        \"value\": \"Turkey\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"UCT\",\n-                                        \"value\": \"UCT\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"US/Alaska\",\n-                                        \"value\": \"US/Alaska\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"US/Aleutian\",\n-                                        \"value\": \"US/Aleutian\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"US/Arizona\",\n-                                        \"value\": \"US/Arizona\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"US/Central\",\n-                                        \"value\": \"US/Central\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"US/East-Indiana\",\n-                                        \"value\": \"US/East-Indiana\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"US/Eastern\",\n-                                        \"value\": \"US/Eastern\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"US/Hawaii\",\n-                                        \"value\": \"US/Hawaii\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"US/Indiana-Starke\",\n-                                        \"value\": \"US/Indiana-Starke\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"US/Michigan\",\n-                                        \"value\": \"US/Michigan\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"US/Mountain\",\n-                                        \"value\": \"US/Mountain\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"US/Pacific\",\n-                                        \"value\": \"US/Pacific\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"US/Samoa\",\n-                                        \"value\": \"US/Samoa\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"UTC\",\n-                                        \"value\": \"UTC\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Universal\",\n-                                        \"value\": \"Universal\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"W-SU\",\n-                                        \"value\": \"W-SU\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"WET\",\n-                                        \"value\": \"WET\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Zulu\",\n-                                        \"value\": \"Zulu\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"EST\",\n-                                        \"value\": \"EST\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"HST\",\n-                                        \"value\": \"HST\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"MST\",\n-                                        \"value\": \"MST\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"ACT\",\n-                                        \"value\": \"ACT\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"AET\",\n-                                        \"value\": \"AET\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"AGT\",\n-                                        \"value\": \"AGT\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"ART\",\n-                                        \"value\": \"ART\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"AST\",\n-                                        \"value\": \"AST\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"BET\",\n-                                        \"value\": \"BET\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"BST\",\n-                                        \"value\": \"BST\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"CAT\",\n-                                        \"value\": \"CAT\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"CNT\",\n-                                        \"value\": \"CNT\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"CST\",\n-                                        \"value\": \"CST\"\n+                                        \"displayName\": \"UNCOMPRESSED\",\n+                                        \"value\": \"UNCOMPRESSED\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"CTT\",\n-                                        \"value\": \"CTT\"\n+                                        \"displayName\": \"SNAPPY\",\n+                                        \"value\": \"SNAPPY\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"EAT\",\n-                                        \"value\": \"EAT\"\n+                                        \"displayName\": \"GZIP\",\n+                                        \"value\": \"GZIP\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"ECT\",\n-                                        \"value\": \"ECT\"\n+                                        \"displayName\": \"LZO\",\n+                                        \"value\": \"LZO\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"IET\",\n-                                        \"value\": \"IET\"\n+                                        \"displayName\": \"BROTLI\",\n+                                        \"value\": \"BROTLI\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"IST\",\n-                                        \"value\": \"IST\"\n+                                        \"displayName\": \"LZ4\",\n+                                        \"value\": \"LZ4\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"JST\",\n-                                        \"value\": \"JST\"\n+                                        \"displayName\": \"ZSTD\",\n+                                        \"value\": \"ZSTD\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"MIT\",\n-                                        \"value\": \"MIT\"\n-                                    },\n+                                        \"displayName\": \"LZ4_RAW\",\n+                                        \"value\": \"LZ4_RAW\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"UNCOMPRESSED\",\n+                                \"description\": \"The type of compression for the file being written.\",\n+                                \"displayName\": \"Compression Type\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"compression-type\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"dictionary-page-size\": {\n+                                \"description\": \"The dictionary page size used by the Parquet writer. The value is specified in the format of <Data Size> <Data Unit> where Data Unit is one of B, KB, MB, GB, TB.\",\n+                                \"displayName\": \"Dictionary Page Size\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"dictionary-page-size\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"enable-dictionary-encoding\": {\n+                                \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"NET\",\n-                                        \"value\": \"NET\"\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"NST\",\n-                                        \"value\": \"NST\"\n-                                    },\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n+                                    }\n+                                ],\n+                                \"description\": \"Specifies whether dictionary encoding should be enabled for the Parquet writer\",\n+                                \"displayName\": \"Enable Dictionary Encoding\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"enable-dictionary-encoding\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"enable-validation\": {\n+                                \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"PLT\",\n-                                        \"value\": \"PLT\"\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"PNT\",\n-                                        \"value\": \"PNT\"\n-                                    },\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n+                                    }\n+                                ],\n+                                \"description\": \"Specifies whether validation should be enabled for the Parquet writer\",\n+                                \"displayName\": \"Enable Validation\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"enable-validation\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"kerberos-credentials-service\": {\n+                                \"description\": \"Specifies the Kerberos Credentials Controller Service that should be used for authenticating with Kerberos\",\n+                                \"displayName\": \"Kerberos Credentials Service\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"kerberos-credentials-service\",\n+                                \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.kerberos.KerberosCredentialsService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"kerberos-user-service\": {\n+                                \"description\": \"Specifies the Kerberos User Controller Service that should be used for authenticating with Kerberos\",\n+                                \"displayName\": \"Kerberos User Service\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"kerberos-user-service\",\n+                                \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.kerberos.KerberosUserService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"max-padding-size\": {\n+                                \"description\": \"The maximum amount of padding that will be used to align row groups with blocks in the underlying filesystem. If the underlying filesystem is not a block filesystem like HDFS, this has no effect. The value is specified in the format of <Data Size> <Data Unit> where Data Unit is one of B, KB, MB, GB, TB.\",\n+                                \"displayName\": \"Max Padding Size\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"max-padding-size\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"overwrite\": {\n+                                \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"PRT\",\n-                                        \"value\": \"PRT\"\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"PST\",\n-                                        \"value\": \"PST\"\n-                                    },\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"Whether or not to overwrite existing files in the same directory with the same name. When set to false, flow files will be routed to failure when a file exists in the same directory with the same name.\",\n+                                \"displayName\": \"Overwrite Files\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"overwrite\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"page-size\": {\n+                                \"description\": \"The page size used by the Parquet writer. The value is specified in the format of <Data Size> <Data Unit> where Data Unit is one of B, KB, MB, GB, TB.\",\n+                                \"displayName\": \"Page Size\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"page-size\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"permissions-umask\": {\n+                                \"description\": \"A umask represented as an octal number which determines the permissions of files written to HDFS. This overrides the Hadoop Configuration dfs.umaskmode\",\n+                                \"displayName\": \"Permissions umask\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"permissions-umask\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"record-reader\": {\n+                                \"description\": \"The service for reading records from incoming flow files.\",\n+                                \"displayName\": \"Record Reader\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"record-reader\",\n+                                \"required\": true,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"remote-group\": {\n+                                \"description\": \"Changes the group of the HDFS file to this value after it is written. This only works if NiFi is running as a user that has HDFS super user privilege to change group\",\n+                                \"displayName\": \"Remote Group\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"remote-group\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"remote-owner\": {\n+                                \"description\": \"Changes the owner of the HDFS file to this value after it is written. This only works if NiFi is running as a user that has HDFS super user privilege to change owner\",\n+                                \"displayName\": \"Remote Owner\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"remote-owner\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"remove-crc-files\": {\n+                                \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"SST\",\n-                                        \"value\": \"SST\"\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"VST\",\n-                                        \"value\": \"VST\"\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"UTC\",\n-                                \"description\": \"The Time Zone to use for formatting dates when performing a search. Only used with Managed time strategies.\",\n-                                \"displayName\": \"Time Zone\",\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"Specifies whether the corresponding CRC file should be deleted upon successfully writing a Parquet file\",\n+                                \"displayName\": \"Remove CRC Files\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Time Zone\",\n-                                \"required\": true,\n+                                \"name\": \"remove-crc-files\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Token\": {\n-                                \"description\": \"The token to pass to Splunk.\",\n-                                \"displayName\": \"Token\",\n+                            \"row-group-size\": {\n+                                \"description\": \"The row group size used by the Parquet writer. The value is specified in the format of <Data Size> <Data Unit> where Data Unit is one of B, KB, MB, GB, TB.\",\n+                                \"displayName\": \"Row Group Size\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Token\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"row-group-size\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Username\": {\n-                                \"description\": \"The username to authenticate to Splunk.\",\n-                                \"displayName\": \"Username\",\n+                            \"writer-version\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"PARQUET_1_0\",\n+                                        \"value\": \"PARQUET_1_0\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"PARQUET_2_0\",\n+                                        \"value\": \"PARQUET_2_0\"\n+                                    }\n+                                ],\n+                                \"description\": \"Specifies the version used by Parquet writer\",\n+                                \"displayName\": \"Writer Version\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Username\",\n+                                \"name\": \"writer-version\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             }\n                         },\n+                        \"readsAttributes\": [\n+                            {\n+                                \"description\": \"The name of the file to write comes from the value of this attribute.\",\n+                                \"name\": \"filename\"\n+                            }\n+                        ],\n+                        \"restricted\": true,\n                         \"sideEffectFree\": false,\n-                        \"stateful\": {\n-                            \"description\": \"If using one of the managed Time Range Strategies, this processor will store the values of the latest and earliest times from the previous execution so that the next execution of the can pick up where the last execution left off. The state will be cleared and start over if the query is changed.\",\n-                            \"scopes\": [\n-                                \"CLUSTER\"\n-                            ]\n-                        },\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"Results retrieved from Splunk are sent out this relationship.\",\n+                                \"description\": \"Flow Files that could not be processed due to issues that can be retried are transferred to this relationship\",\n+                                \"name\": \"retry\"\n+                            },\n+                            {\n+                                \"description\": \"Flow Files that have been successfully processed are transferred to this relationship\",\n                                 \"name\": \"success\"\n+                            },\n+                            {\n+                                \"description\": \"Flow Files that could not be processed due to issue that cannot be retried are transferred to this relationship\",\n+                                \"name\": \"failure\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n                         \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"get\",\n-                            \"logs\",\n-                            \"splunk\"\n+                            \"HDFS\",\n+                            \"filesystem\",\n+                            \"hadoop\",\n+                            \"parquet\",\n+                            \"put\",\n+                            \"record\"\n                         ],\n-                        \"triggerSerially\": true,\n+                        \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.splunk.GetSplunk\",\n-                        \"typeDescription\": \"Retrieves data from Splunk Enterprise.\",\n+                        \"triggerWhenEmpty\": true,\n+                        \"type\": \"org.apache.nifi.processors.parquet.PutParquet\",\n+                        \"typeDescription\": \"Reads records from an incoming FlowFile using the provided Record Reader, and writes those records to a Parquet file. The schema for the Parquet file must be provided in the processor properties. This processor will first write a temporary dot file and upon successfully writing every record to the dot file, it will rename the dot file to it's final name. If the dot file cannot be renamed, the rename operation will be attempted up to 10 times, and if still not successful, the dot file will be deleted and the flow file will be routed to failure.  If any error occurs while reading records from the input, or writing records to the output, the entire dot file will be removed and the flow file will be routed to failure or retry, depending on the error.\",\n                         \"version\": \"1.27.0\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"The query that performed to produce the FlowFile.\",\n-                                \"name\": \"splunk.query\"\n+                                \"description\": \"The name of the file is stored in this attribute.\",\n+                                \"name\": \"filename\"\n                             },\n                             {\n-                                \"description\": \"The value of the earliest time that was used when performing the query.\",\n-                                \"name\": \"splunk.earliest.time\"\n+                                \"description\": \"The absolute path to the file is stored in this attribute.\",\n+                                \"name\": \"absolute.hdfs.path\"\n                             },\n                             {\n-                                \"description\": \"The value of the latest time that was used when performing the query.\",\n-                                \"name\": \"splunk.latest.time\"\n+                                \"description\": \"The hadoop url for the file is stored in this attribute.\",\n+                                \"name\": \"hadoop.file.url\"\n+                            },\n+                            {\n+                                \"description\": \"The number of records written to the Parquet file\",\n+                                \"name\": \"record.count\"\n                             }\n                         ]\n-                    },\n+                    }\n+                ],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"1.27.0\"\n+        },\n+        {\n+            \"artifact\": \"nifi-html-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [],\n+                \"processors\": [\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-splunk-nar\",\n+                        \"artifact\": \"nifi-html-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -43909,169 +37516,193 @@\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n+                        \"deprecated\": true,\n+                        \"deprecationReason\": \"Unmaintained and planned for removal in version 2.0\",\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Character Set\": {\n-                                \"defaultValue\": \"UTF-8\",\n-                                \"description\": \"Specifies the character set of the data being sent.\",\n-                                \"displayName\": \"Character Set\",\n+                            \"Append Element Value\": {\n+                                \"description\": \"Appends the specified value to the resulting Element\",\n+                                \"displayName\": \"Append Element Value\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Character Set\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Append Element Value\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Hostname\": {\n-                                \"defaultValue\": \"localhost\",\n-                                \"description\": \"Destination hostname or IP address\",\n-                                \"displayName\": \"Hostname\",\n+                            \"Attribute Name\": {\n+                                \"description\": \"When getting the value of a HTML element attribute this value is used as the key to determine which attribute on the selected element should be retrieved. This value is used when the \\\"Output Type\\\" is set to \\\"Attribute\\\". If this value is prefixed with 'abs:', then the extracted attribute value will be converted into an absolute URL form using the specified base URL.\",\n+                                \"displayName\": \"Attribute Name\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Hostname\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Attribute Name\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Idle Connection Expiration\": {\n-                                \"defaultValue\": \"15 seconds\",\n-                                \"description\": \"The amount of time a connection should be held open without being used before closing the connection. A value of 0 seconds will disable this feature.\",\n-                                \"displayName\": \"Idle Connection Expiration\",\n+                            \"CSS Selector\": {\n+                                \"description\": \"CSS selector syntax string used to extract the desired HTML element(s).\",\n+                                \"displayName\": \"CSS Selector\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Idle Connection Expiration\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"CSS Selector\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Max Size of Socket Send Buffer\": {\n-                                \"defaultValue\": \"1 MB\",\n-                                \"description\": \"The maximum size of the socket send buffer that should be used. This is a suggestion to the Operating System to indicate how big the socket buffer should be. If this value is set too low, the buffer may fill up before the data can be read, and incoming data will be dropped.\",\n-                                \"displayName\": \"Max Size of Socket Send Buffer\",\n+                            \"Destination\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"flowfile-attribute\",\n+                                        \"value\": \"flowfile-attribute\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"flowfile-content\",\n+                                        \"value\": \"flowfile-content\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"flowfile-attribute\",\n+                                \"description\": \"Control if element extracted is written as a flowfile attribute or as flowfile content.\",\n+                                \"displayName\": \"Destination\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Max Size of Socket Send Buffer\",\n+                                \"name\": \"Destination\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Message Delimiter\": {\n-                                \"description\": \"Specifies the delimiter to use for splitting apart multiple messages within a single FlowFile. If not specified, the entire content of the FlowFile will be used as a single message. If specified, the contents of the FlowFile will be split on this delimiter and each section sent as a separate message. Note that if messages are delimited and some messages for a given FlowFile are transferred successfully while others are not, the messages will be split into individual FlowFiles, such that those messages that were successfully sent are routed to the 'success' relationship while other messages are sent to the 'failure' relationship.\",\n-                                \"displayName\": \"Message Delimiter\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Message Delimiter\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Port\": {\n-                                \"description\": \"Destination port number\",\n-                                \"displayName\": \"Port\",\n+                            \"HTML Character Encoding\": {\n+                                \"defaultValue\": \"UTF-8\",\n+                                \"description\": \"Character encoding of the input HTML\",\n+                                \"displayName\": \"HTML Character Encoding\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Port\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"HTML Character Encoding\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Protocol\": {\n+                            \"Output Type\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"TCP\",\n-                                        \"value\": \"TCP\"\n+                                        \"displayName\": \"HTML\",\n+                                        \"value\": \"HTML\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"UDP\",\n-                                        \"value\": \"UDP\"\n+                                        \"displayName\": \"Text\",\n+                                        \"value\": \"Text\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Attribute\",\n+                                        \"value\": \"Attribute\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Data\",\n+                                        \"value\": \"Data\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"TCP\",\n-                                \"description\": \"The protocol for communication.\",\n-                                \"displayName\": \"Protocol\",\n+                                \"defaultValue\": \"HTML\",\n+                                \"description\": \"Controls the type of DOM value that is retrieved from the HTML element.\",\n+                                \"displayName\": \"Output Type\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Protocol\",\n+                                \"name\": \"Output Type\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"SSL Context Service\": {\n-                                \"description\": \"Specifies the SSL Context Service to enable TLS socket communication\",\n-                                \"displayName\": \"SSL Context Service\",\n+                            \"Prepend Element Value\": {\n+                                \"description\": \"Prepends the specified value to the resulting Element\",\n+                                \"displayName\": \"Prepend Element Value\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"SSL Context Service\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Prepend Element Value\",\n                                 \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n+                                \"sensitive\": false\n                             },\n-                            \"Timeout\": {\n-                                \"defaultValue\": \"10 seconds\",\n-                                \"description\": \"The timeout for connecting to and communicating with the destination. Does not apply to UDP\",\n-                                \"displayName\": \"Timeout\",\n+                            \"URL\": {\n+                                \"description\": \"Base URL for the HTML page being parsed. This URL will be used to resolve an absolute URL when an attribute value is extracted from a HTML element.\",\n+                                \"displayName\": \"URL\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Timeout\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"URL\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             }\n                         },\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.ModifyHTMLElement\",\n+                            \"org.apache.nifi.PutHTMLElement\"\n+                        ],\n                         \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"FlowFiles that are sent successfully to the destination are sent out this relationship.\",\n+                                \"description\": \"Element could not be found in the HTML document. The original HTML input will remain in the FlowFile content unchanged. Relationship 'original' will not be invoked in this scenario.\",\n+                                \"name\": \"element not found\"\n+                            },\n+                            {\n+                                \"description\": \"Successfully parsed HTML element\",\n                                 \"name\": \"success\"\n                             },\n                             {\n-                                \"description\": \"FlowFiles that failed to send to the destination are sent out this relationship.\",\n-                                \"name\": \"failure\"\n+                                \"description\": \"The original HTML input\",\n+                                \"name\": \"original\"\n+                            },\n+                            {\n+                                \"description\": \"The input HTML syntax is invalid\",\n+                                \"name\": \"invalid html\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n-                        \"supportsBatching\": false,\n+                        \"supportsBatching\": true,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"logs\",\n-                            \"splunk\",\n-                            \"tcp\",\n-                            \"udp\"\n+                            \"css\",\n+                            \"dom\",\n+                            \"element\",\n+                            \"get\",\n+                            \"html\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": true,\n-                        \"type\": \"org.apache.nifi.processors.splunk.PutSplunk\",\n-                        \"typeDescription\": \"Sends logs to Splunk Enterprise over TCP, TCP + TLS/SSL, or UDP. If a Message Delimiter is provided, then this processor will read messages from the incoming FlowFile based on the delimiter, and send each message to Splunk. If a Message Delimiter is not provided then the content of the FlowFile will be sent directly to Splunk as if it were a single message.\",\n-                        \"version\": \"1.27.0\"\n+                        \"triggerWhenEmpty\": false,\n+                        \"type\": \"org.apache.nifi.GetHTMLElement\",\n+                        \"typeDescription\": \"Extracts HTML element values from the incoming flowfile's content using a CSS selector. The incoming HTML is first converted into a HTML Document Object Model so that HTML elements may be selected in the similar manner that CSS selectors are used to apply styles to HTML. The resulting HTML DOM is then \\\"queried\\\" using the user defined CSS selector string. The result of \\\"querying\\\" the HTML DOM may produce 0-N results. If no results are found the flowfile will be transferred to the \\\"element not found\\\" relationship to indicate so to the end user. If N results are found a new flowfile will be created and emitted for each result. The query result will either be placed in the content of the new flowfile or as an attribute of the new flowfile. By default the result is written to an attribute. This can be controlled by the \\\"Destination\\\" property. Resulting query values may also have data prepended or appended to them by setting the value of property \\\"Prepend Element Value\\\" or \\\"Append Element Value\\\". Prepended and appended values are treated as string values and concatenated to the result retrieved from the HTML DOM query operation. A more thorough reference for the CSS selector syntax can be found at \\\"http://jsoup.org/apidocs/org/jsoup/select/Selector.html\\\"\",\n+                        \"version\": \"1.27.0\",\n+                        \"writesAttributes\": [\n+                            {\n+                                \"description\": \"Flowfile attribute where the element result parsed from the HTML using the CSS selector syntax are placed if the destination is a flowfile attribute.\",\n+                                \"name\": \"HTMLElement\"\n+                            }\n+                        ]\n                     },\n                     {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-splunk-nar\",\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-html-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -44079,268 +37710,570 @@\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n+                        \"deprecated\": true,\n+                        \"deprecationReason\": \"Unmaintained and planned for removal in version 2.0\",\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Hostname\": {\n-                                \"defaultValue\": \"localhost\",\n-                                \"description\": \"The ip address or hostname of the Splunk server.\",\n-                                \"displayName\": \"Hostname\",\n+                            \"Attribute Name\": {\n+                                \"description\": \"When modifying the value of an element attribute this value is used as the key to determine which attribute on the selected element will be modified with the new value.\",\n+                                \"displayName\": \"Attribute Name\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Hostname\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Attribute Name\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Owner\": {\n-                                \"description\": \"The owner to pass to Splunk.\",\n-                                \"displayName\": \"Owner\",\n+                            \"CSS Selector\": {\n+                                \"description\": \"CSS selector syntax string used to extract the desired HTML element(s).\",\n+                                \"displayName\": \"CSS Selector\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Owner\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"CSS Selector\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Password\": {\n-                                \"description\": \"The password to authenticate to Splunk.\",\n-                                \"displayName\": \"Password\",\n+                            \"HTML Character Encoding\": {\n+                                \"defaultValue\": \"UTF-8\",\n+                                \"description\": \"Character encoding of the input HTML\",\n+                                \"displayName\": \"HTML Character Encoding\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Password\",\n-                                \"required\": false,\n-                                \"sensitive\": true\n+                                \"name\": \"HTML Character Encoding\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n                             },\n-                            \"Port\": {\n-                                \"defaultValue\": \"8088\",\n-                                \"description\": \"The HTTP Event Collector HTTP Port Number.\",\n-                                \"displayName\": \"HTTP Event Collector Port\",\n+                            \"Modified Value\": {\n+                                \"description\": \"Value to update the found HTML elements with\",\n+                                \"displayName\": \"Modified Value\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Port\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Modified Value\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Scheme\": {\n+                            \"Output Type\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"https\",\n-                                        \"value\": \"https\"\n+                                        \"displayName\": \"HTML\",\n+                                        \"value\": \"HTML\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"http\",\n-                                        \"value\": \"http\"\n+                                        \"displayName\": \"Text\",\n+                                        \"value\": \"Text\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Attribute\",\n+                                        \"value\": \"Attribute\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"https\",\n-                                \"description\": \"The scheme for connecting to Splunk.\",\n-                                \"displayName\": \"Scheme\",\n+                                \"defaultValue\": \"HTML\",\n+                                \"description\": \"Controls whether the HTML element is output as HTML,Text or Data\",\n+                                \"displayName\": \"Output Type\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Scheme\",\n+                                \"name\": \"Output Type\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n+                            }\n+                        },\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.GetHTMLElement\",\n+                            \"org.apache.nifi.PutHTMLElement\"\n+                        ],\n+                        \"sideEffectFree\": false,\n+                        \"supportedRelationships\": [\n+                            {\n+                                \"description\": \"Element could not be found in the HTML document. The original HTML input will remain in the FlowFile content unchanged. Relationship 'original' will not be invoked in this scenario.\",\n+                                \"name\": \"element not found\"\n                             },\n-                            \"Security Protocol\": {\n+                            {\n+                                \"description\": \"Successfully parsed HTML element\",\n+                                \"name\": \"success\"\n+                            },\n+                            {\n+                                \"description\": \"The original HTML input\",\n+                                \"name\": \"original\"\n+                            },\n+                            {\n+                                \"description\": \"The input HTML syntax is invalid\",\n+                                \"name\": \"invalid html\"\n+                            }\n+                        ],\n+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\"\n+                        ],\n+                        \"supportsBatching\": true,\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicRelationships\": false,\n+                        \"supportsEventDriven\": false,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"css\",\n+                            \"dom\",\n+                            \"element\",\n+                            \"html\",\n+                            \"modify\"\n+                        ],\n+                        \"triggerSerially\": false,\n+                        \"triggerWhenAnyDestinationAvailable\": false,\n+                        \"triggerWhenEmpty\": false,\n+                        \"type\": \"org.apache.nifi.ModifyHTMLElement\",\n+                        \"typeDescription\": \"Modifies the value of an existing HTML element. The desired element to be modified is located by using CSS selector syntax. The incoming HTML is first converted into a HTML Document Object Model so that HTML elements may be selected in the similar manner that CSS selectors are used to apply styles to HTML. The resulting HTML DOM is then \\\"queried\\\" using the user defined CSS selector string to find the element the user desires to modify. If the HTML element is found the element's value is updated in the DOM using the value specified \\\"Modified Value\\\" property. All DOM elements that match the CSS selector will be updated. Once all of the DOM elements have been updated the DOM is rendered to HTML and the result replaces the flowfile content with the updated HTML. A more thorough reference for the CSS selector syntax can be found at \\\"http://jsoup.org/apidocs/org/jsoup/select/Selector.html\\\"\",\n+                        \"version\": \"1.27.0\",\n+                        \"writesAttributes\": [\n+                            {\n+                                \"description\": \"Total number of HTML element modifications made\",\n+                                \"name\": \"NumElementsModified\"\n+                            }\n+                        ]\n+                    },\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-html-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"e0c4461\"\n+                        },\n+                        \"defaultBulletinLevel\": \"WARN\",\n+                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": 1,\n+                            \"TIMER_DRIVEN\": 1\n+                        },\n+                        \"defaultPenaltyDuration\": \"30 sec\",\n+                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": \"* * * * * ?\",\n+                            \"TIMER_DRIVEN\": \"0 sec\"\n+                        },\n+                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n+                        \"defaultYieldDuration\": \"1 sec\",\n+                        \"deprecated\": true,\n+                        \"deprecationReason\": \"Unmaintained and planned for removal in version 2.0\",\n+                        \"group\": \"org.apache.nifi\",\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n+                        \"primaryNodeOnly\": false,\n+                        \"propertyDescriptors\": {\n+                            \"CSS Selector\": {\n+                                \"description\": \"CSS selector syntax string used to extract the desired HTML element(s).\",\n+                                \"displayName\": \"CSS Selector\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"CSS Selector\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Element Insert Location Type\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"TLSv1_2\",\n-                                        \"value\": \"TLSv1_2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"TLSv1_1\",\n-                                        \"value\": \"TLSv1_1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"TLSv1\",\n-                                        \"value\": \"TLSv1\"\n+                                        \"displayName\": \"append-html\",\n+                                        \"value\": \"append-html\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"SSLv3\",\n-                                        \"value\": \"SSLv3\"\n+                                        \"displayName\": \"prepend-html\",\n+                                        \"value\": \"prepend-html\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"TLSv1_2\",\n-                                \"description\": \"The security protocol to use for communicating with Splunk.\",\n-                                \"displayName\": \"Security Protocol\",\n+                                \"defaultValue\": \"append-html\",\n+                                \"description\": \"Controls whether the new element is prepended or appended to the children of the Element located by the CSS selector. EX: prepended value '<b>Hi</b>' inside of Element (using CSS Selector 'p') '<p>There</p>' would result in '<p><b>Hi</b>There</p>'. Appending the value would result in '<p>There<b>Hi</b></p>'\",\n+                                \"displayName\": \"Element Insert Location Type\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Security Protocol\",\n-                                \"required\": false,\n+                                \"name\": \"Element Insert Location Type\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Token\": {\n-                                \"description\": \"HTTP Event Collector token starting with the string Splunk. For example 'Splunk 1234578-abcd-1234-abcd-1234abcd'\",\n-                                \"displayName\": \"HTTP Event Collector Token\",\n+                            \"HTML Character Encoding\": {\n+                                \"defaultValue\": \"UTF-8\",\n+                                \"description\": \"Character encoding of the input HTML\",\n+                                \"displayName\": \"HTML Character Encoding\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Token\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"HTML Character Encoding\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Username\": {\n-                                \"description\": \"The username to authenticate to Splunk.\",\n-                                \"displayName\": \"Username\",\n+                            \"Put Value\": {\n+                                \"description\": \"Value used when creating the new Element. Value should be a valid HTML element. The text should be supplied unencoded: characters like '<', '>', etc will be properly HTML encoded in the resulting output.\",\n+                                \"displayName\": \"Put Value\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Put Value\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            }\n+                        },\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.GetHTMLElement\",\n+                            \"org.apache.nifi.ModifyHTMLElement\"\n+                        ],\n+                        \"sideEffectFree\": false,\n+                        \"supportedRelationships\": [\n+                            {\n+                                \"description\": \"Element could not be found in the HTML document. The original HTML input will remain in the FlowFile content unchanged. Relationship 'original' will not be invoked in this scenario.\",\n+                                \"name\": \"element not found\"\n+                            },\n+                            {\n+                                \"description\": \"Successfully parsed HTML element\",\n+                                \"name\": \"success\"\n+                            },\n+                            {\n+                                \"description\": \"The original HTML input\",\n+                                \"name\": \"original\"\n+                            },\n+                            {\n+                                \"description\": \"The input HTML syntax is invalid\",\n+                                \"name\": \"invalid html\"\n+                            }\n+                        ],\n+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\"\n+                        ],\n+                        \"supportsBatching\": true,\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicRelationships\": false,\n+                        \"supportsEventDriven\": false,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"css\",\n+                            \"dom\",\n+                            \"element\",\n+                            \"html\",\n+                            \"put\"\n+                        ],\n+                        \"triggerSerially\": false,\n+                        \"triggerWhenAnyDestinationAvailable\": false,\n+                        \"triggerWhenEmpty\": false,\n+                        \"type\": \"org.apache.nifi.PutHTMLElement\",\n+                        \"typeDescription\": \"Places a new HTML element in the existing HTML DOM. The desired position for the new HTML element is specified by using CSS selector syntax. The incoming HTML is first converted into a HTML Document Object Model so that HTML DOM location may be located in a similar manner that CSS selectors are used to apply styles to HTML. The resulting HTML DOM is then \\\"queried\\\" using the user defined CSS selector string to find the position where the user desires to add the new HTML element. Once the new HTML element is added to the DOM it is rendered to HTML and the result replaces the flowfile content with the updated HTML. A more thorough reference for the CSS selector syntax can be found at \\\"http://jsoup.org/apidocs/org/jsoup/select/Selector.html\\\"\",\n+                        \"version\": \"1.27.0\"\n+                    }\n+                ],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"1.27.0\"\n+        },\n+        {\n+            \"artifact\": \"nifi-groovyx-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [],\n+                \"processors\": [\n+                    {\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-groovyx-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"e0c4461\"\n+                        },\n+                        \"defaultBulletinLevel\": \"WARN\",\n+                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": 1,\n+                            \"EVENT_DRIVEN\": 0,\n+                            \"TIMER_DRIVEN\": 1\n+                        },\n+                        \"defaultPenaltyDuration\": \"30 sec\",\n+                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": \"* * * * * ?\",\n+                            \"TIMER_DRIVEN\": \"0 sec\"\n+                        },\n+                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n+                        \"defaultYieldDuration\": \"1 sec\",\n+                        \"dynamicProperties\": [\n+                            {\n+                                \"description\": \"Updates a script engine property specified by the Dynamic Property's key with the value specified by the Dynamic Property's value. Use `CTL.` to access any controller services, `SQL.` to access any DBCPServices, `RecordReader.` to access RecordReaderFactory instances, or `RecordWriter.` to access any RecordSetWriterFactory instances.\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"name\": \"A script engine property to update\",\n+                                \"value\": \"The value to set it to\"\n+                            }\n+                        ],\n+                        \"explicitRestrictions\": [\n+                            {\n+                                \"explanation\": \"Provides operator the ability to execute arbitrary code assuming all permissions that NiFi has.\",\n+                                \"requiredPermission\": \"execute code\"\n+                            }\n+                        ],\n+                        \"group\": \"org.apache.nifi\",\n+                        \"inputRequirement\": \"INPUT_ALLOWED\",\n+                        \"primaryNodeOnly\": false,\n+                        \"propertyDescriptors\": {\n+                            \"groovyx-additional-classpath\": {\n+                                \"description\": \"Classpath list separated by semicolon or comma. You can use masks like `*`, `*.jar` in file name.\",\n+                                \"displayName\": \"Additional classpath\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Username\",\n+                                \"name\": \"groovyx-additional-classpath\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"character-set\": {\n-                                \"defaultValue\": \"UTF-8\",\n-                                \"description\": \"The name of the character set.\",\n-                                \"displayName\": \"Character Set\",\n+                            \"groovyx-failure-strategy\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"rollback\",\n+                                        \"value\": \"rollback\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"transfer to failure\",\n+                                        \"value\": \"transfer to failure\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"rollback\",\n+                                \"description\": \"What to do with unhandled exceptions. If you want to manage exception by code then keep the default value `rollback`. If `transfer to failure` selected and unhandled exception occurred then all flowFiles received from incoming queues in this session will be transferred to `failure` relationship with additional attributes set: ERROR_MESSAGE and ERROR_STACKTRACE. If `rollback` selected and unhandled exception occurred then all flowFiles received from incoming queues will be penalized and returned. If the processor has no incoming connections then this parameter has no effect.\",\n+                                \"displayName\": \"Failure strategy\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"character-set\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"groovyx-failure-strategy\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"content-type\": {\n-                                \"description\": \"The media type of the event sent to Splunk. If not set, \\\"mime.type\\\" flow file attribute will be used. In case of neither of them is specified, this information will not be sent to the server.\",\n-                                \"displayName\": \"Content Type\",\n+                            \"groovyx-script-body\": {\n+                                \"description\": \"Body of script to execute. Only one of Script File or Script Body may be used\",\n+                                \"displayName\": \"Script Body\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"content-type\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"groovyx-script-body\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"host\": {\n-                                \"description\": \"Specify with the host query string parameter. Sets a default for all events when unspecified.\",\n-                                \"displayName\": \"Host\",\n+                            \"groovyx-script-file\": {\n+                                \"description\": \"Path to script file to execute. Only one of Script File or Script Body may be used\",\n+                                \"displayName\": \"Script File\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"host\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"groovyx-script-file\",\n                                 \"required\": false,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"SINGLE\",\n+                                    \"resourceTypes\": [\n+                                        \"FILE\"\n+                                    ]\n+                                },\n                                 \"sensitive\": false\n+                            }\n+                        },\n+                        \"restricted\": true,\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.processors.script.ExecuteScript\"\n+                        ],\n+                        \"sideEffectFree\": false,\n+                        \"supportedRelationships\": [\n+                            {\n+                                \"description\": \"FlowFiles that were successfully processed\",\n+                                \"name\": \"success\"\n                             },\n-                            \"index\": {\n-                                \"description\": \"Index name. Specify with the index query string parameter. Sets a default for all events when unspecified.\",\n-                                \"displayName\": \"Index\",\n+                            {\n+                                \"description\": \"FlowFiles that failed to be processed\",\n+                                \"name\": \"failure\"\n+                            }\n+                        ],\n+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\",\n+                            \"EVENT_DRIVEN\"\n+                        ],\n+                        \"supportsBatching\": false,\n+                        \"supportsDynamicProperties\": true,\n+                        \"supportsDynamicRelationships\": false,\n+                        \"supportsEventDriven\": true,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"groovy\",\n+                            \"groovyx\",\n+                            \"script\"\n+                        ],\n+                        \"triggerSerially\": false,\n+                        \"triggerWhenAnyDestinationAvailable\": false,\n+                        \"triggerWhenEmpty\": false,\n+                        \"type\": \"org.apache.nifi.processors.groovyx.ExecuteGroovyScript\",\n+                        \"typeDescription\": \"Experimental Extended Groovy script processor. The script is responsible for handling the incoming flow file (transfer to SUCCESS or remove, e.g.) as well as any flow files created by the script. If the handling is incomplete or incorrect, the session will be rolled back.\",\n+                        \"version\": \"1.27.0\"\n+                    }\n+                ],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"1.27.0\"\n+        },\n+        {\n+            \"artifact\": \"nifi-jetty-bundle\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [],\n+                \"processors\": [],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"1.27.0\"\n+        },\n+        {\n+            \"artifact\": \"nifi-salesforce-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [],\n+                \"processors\": [\n+                    {\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-salesforce-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"e0c4461\"\n+                        },\n+                        \"defaultBulletinLevel\": \"WARN\",\n+                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": 1,\n+                            \"TIMER_DRIVEN\": 1\n+                        },\n+                        \"defaultPenaltyDuration\": \"30 sec\",\n+                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": \"* * * * * ?\",\n+                            \"TIMER_DRIVEN\": \"0 sec\"\n+                        },\n+                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n+                        \"defaultYieldDuration\": \"1 sec\",\n+                        \"group\": \"org.apache.nifi\",\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n+                        \"primaryNodeOnly\": false,\n+                        \"propertyDescriptors\": {\n+                            \"oauth2-access-token-provider\": {\n+                                \"description\": \"Service providing OAuth2 Access Tokens for authenticating using the HTTP Authorization Header\",\n+                                \"displayName\": \"OAuth2 Access Token Provider\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"index\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"oauth2-access-token-provider\",\n+                                \"required\": true,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.oauth2.OAuth2AccessTokenProvider\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n                             },\n-                            \"request-channel\": {\n-                                \"description\": \"Identifier of the used request channel.\",\n-                                \"displayName\": \"Splunk Request Channel\",\n+                            \"read-timeout\": {\n+                                \"defaultValue\": \"15 s\",\n+                                \"description\": \"Maximum time allowed for reading a response from the Salesforce REST API\",\n+                                \"displayName\": \"Read Timeout\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"request-channel\",\n+                                \"name\": \"read-timeout\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"source\": {\n-                                \"description\": \"User-defined event source. Sets a default for all events when unspecified.\",\n-                                \"displayName\": \"Source\",\n+                            \"record-reader\": {\n+                                \"description\": \"Specifies the Controller Service to use for parsing incoming data and determining the data's schema\",\n+                                \"displayName\": \"Record Reader\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"source\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"record-reader\",\n+                                \"required\": true,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"salesforce-api-version\": {\n+                                \"defaultValue\": \"54.0\",\n+                                \"description\": \"The version number of the Salesforce REST API appended to the URL after the services/data path. See Salesforce documentation for supported versions\",\n+                                \"displayName\": \"API Version\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"salesforce-api-version\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"source-type\": {\n-                                \"description\": \"User-defined event sourcetype. Sets a default for all events when unspecified.\",\n-                                \"displayName\": \"Source Type\",\n+                            \"salesforce-url\": {\n+                                \"description\": \"The URL of the Salesforce instance including the domain without additional path information, such as https://MyDomainName.my.salesforce.com\",\n+                                \"displayName\": \"Salesforce Instance URL\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"source-type\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"salesforce-url\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             }\n                         },\n                         \"readsAttributes\": [\n                             {\n-                                \"description\": \"Uses as value for HTTP Content-Type header if set.\",\n-                                \"name\": \"mime.type\"\n+                                \"description\": \"The Salesforce object type to upload records to. E.g. Account, Contact, Campaign.\",\n+                                \"name\": \"objectType\"\n                             }\n                         ],\n                         \"seeAlso\": [\n-                            \"org.apache.nifi.processors.splunk.QuerySplunkIndexingStatus\"\n+                            \"org.apache.nifi.processors.salesforce.QuerySalesforceObject\"\n                         ],\n                         \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"FlowFiles that are sent successfully to the destination are sent to this relationship.\",\n+                                \"description\": \"For FlowFiles created as a result of a successful execution.\",\n                                 \"name\": \"success\"\n                             },\n                             {\n-                                \"description\": \"FlowFiles that failed to send to the destination are sent to this relationship.\",\n+                                \"description\": \"For FlowFiles created as a result of an execution error.\",\n                                 \"name\": \"failure\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n                         \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n-                        \"systemResourceConsiderations\": [\n-                            {\n-                                \"description\": \"An instance of this component can cause high usage of this system resource.  Multiple instances or high concurrency settings may result a degradation of performance.\",\n-                                \"resource\": \"MEMORY\"\n-                            }\n-                        ],\n                         \"tags\": [\n-                            \"http\",\n-                            \"logs\",\n-                            \"splunk\"\n+                            \"put\",\n+                            \"salesforce\",\n+                            \"sobject\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.splunk.PutSplunkHTTP\",\n-                        \"typeDescription\": \"Sends flow file content to the specified Splunk server over HTTP or HTTPS. Supports HEC Index Acknowledgement.\",\n+                        \"type\": \"org.apache.nifi.processors.salesforce.PutSalesforceObject\",\n+                        \"typeDescription\": \"Creates new records for the specified Salesforce sObject. The type of the Salesforce object must be set in the input flowfile's 'objectType' attribute. This processor cannot update existing records.\",\n                         \"version\": \"1.27.0\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"The indexing acknowledgement id provided by Splunk.\",\n-                                \"name\": \"splunk.acknowledgement.id\"\n-                            },\n-                            {\n-                                \"description\": \"The time of the response of put request for Splunk.\",\n-                                \"name\": \"splunk.responded.at\"\n+                                \"description\": \"The error message returned by Salesforce.\",\n+                                \"name\": \"error.message\"\n                             }\n                         ]\n                     },\n                     {\n                         \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-splunk-nar\",\n+                        \"artifact\": \"nifi-salesforce-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -44349,485 +38282,813 @@\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"1 min\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_REQUIRED\",\n+                        \"inputRequirement\": \"INPUT_ALLOWED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Hostname\": {\n-                                \"defaultValue\": \"localhost\",\n-                                \"description\": \"The ip address or hostname of the Splunk server.\",\n-                                \"displayName\": \"Hostname\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Hostname\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Owner\": {\n-                                \"description\": \"The owner to pass to Splunk.\",\n-                                \"displayName\": \"Owner\",\n+                            \"age-delay\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"propertyDisplayName\": \"Age Field\",\n+                                        \"propertyName\": \"age-field\"\n+                                    },\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"property-based-query\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Query Type\",\n+                                        \"propertyName\": \"query-type\"\n+                                    }\n+                                ],\n+                                \"description\": \"The ending timestamp of the time window will be adjusted earlier by the amount configured in this property. For example, with a property value of 10 seconds, an ending timestamp of 12:30:45 would be changed to 12:30:35.\",\n+                                \"displayName\": \"Age Delay\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Owner\",\n+                                \"name\": \"age-delay\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Password\": {\n-                                \"description\": \"The password to authenticate to Splunk.\",\n-                                \"displayName\": \"Password\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Password\",\n-                                \"required\": false,\n-                                \"sensitive\": true\n-                            },\n-                            \"Port\": {\n-                                \"defaultValue\": \"8088\",\n-                                \"description\": \"The HTTP Event Collector HTTP Port Number.\",\n-                                \"displayName\": \"HTTP Event Collector Port\",\n+                            \"age-field\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"property-based-query\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Query Type\",\n+                                        \"propertyName\": \"query-type\"\n+                                    }\n+                                ],\n+                                \"description\": \"The name of a TIMESTAMP field that will be used to filter records using a bounded time window.The processor will return only those records with a timestamp value newer than the timestamp recorded after the last processor run.\",\n+                                \"displayName\": \"Age Field\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Port\",\n-                                \"required\": true,\n+                                \"name\": \"age-field\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Scheme\": {\n+                            \"create-zero-record-files\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"https\",\n-                                        \"value\": \"https\"\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"http\",\n-                                        \"value\": \"http\"\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"https\",\n-                                \"description\": \"The scheme for connecting to Splunk.\",\n-                                \"displayName\": \"Scheme\",\n+                                \"defaultValue\": \"false\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"property-based-query\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Query Type\",\n+                                        \"propertyName\": \"query-type\"\n+                                    }\n+                                ],\n+                                \"description\": \"Specifies whether or not to create a FlowFile when the Salesforce REST API does not return any records\",\n+                                \"displayName\": \"Create Zero Record FlowFiles\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Scheme\",\n+                                \"name\": \"create-zero-record-files\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Security Protocol\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"TLSv1_2\",\n-                                        \"value\": \"TLSv1_2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"TLSv1_1\",\n-                                        \"value\": \"TLSv1_1\"\n-                                    },\n+                            \"custom-soql-query\": {\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"TLSv1\",\n-                                        \"value\": \"TLSv1\"\n-                                    },\n+                                        \"dependentValues\": [\n+                                            \"custom-query\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Query Type\",\n+                                        \"propertyName\": \"query-type\"\n+                                    }\n+                                ],\n+                                \"description\": \"Specify the SOQL query to run.\",\n+                                \"displayName\": \"Custom SOQL Query\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"custom-soql-query\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"custom-where-condition\": {\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"SSLv3\",\n-                                        \"value\": \"SSLv3\"\n+                                        \"dependentValues\": [\n+                                            \"property-based-query\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Query Type\",\n+                                        \"propertyName\": \"query-type\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"TLSv1_2\",\n-                                \"description\": \"The security protocol to use for communicating with Splunk.\",\n-                                \"displayName\": \"Security Protocol\",\n+                                \"description\": \"A custom expression to be added in the WHERE clause of the query\",\n+                                \"displayName\": \"Custom WHERE Condition\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Security Protocol\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"custom-where-condition\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Token\": {\n-                                \"description\": \"HTTP Event Collector token starting with the string Splunk. For example 'Splunk 1234578-abcd-1234-abcd-1234abcd'\",\n-                                \"displayName\": \"HTTP Event Collector Token\",\n+                            \"field-names\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"property-based-query\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Query Type\",\n+                                        \"propertyName\": \"query-type\"\n+                                    }\n+                                ],\n+                                \"description\": \"Comma-separated list of field names requested from the sObject to be queried. When this field is left empty, all fields are queried.\",\n+                                \"displayName\": \"Field Names\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Token\",\n+                                \"name\": \"field-names\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Username\": {\n-                                \"description\": \"The username to authenticate to Splunk.\",\n-                                \"displayName\": \"Username\",\n+                            \"initial-age-filter\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"propertyDisplayName\": \"Age Field\",\n+                                        \"propertyName\": \"age-field\"\n+                                    },\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"property-based-query\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Query Type\",\n+                                        \"propertyName\": \"query-type\"\n+                                    }\n+                                ],\n+                                \"description\": \"This property specifies the start time that the processor applies when running the first query.\",\n+                                \"displayName\": \"Initial Age Start Time\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Username\",\n+                                \"name\": \"initial-age-filter\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"max-query-size\": {\n-                                \"defaultValue\": \"10000\",\n-                                \"description\": \"The maximum number of acknowledgement identifiers the outgoing query contains in one batch. It is recommended not to set it too low in order to reduce network communication.\",\n-                                \"displayName\": \"Maximum Query Size\",\n+                            \"oauth2-access-token-provider\": {\n+                                \"description\": \"Service providing OAuth2 Access Tokens for authenticating using the HTTP Authorization Header\",\n+                                \"displayName\": \"OAuth2 Access Token Provider\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"max-query-size\",\n+                                \"name\": \"oauth2-access-token-provider\",\n+                                \"required\": true,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.oauth2.OAuth2AccessTokenProvider\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"query-type\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"Provide query by properties.\",\n+                                        \"displayName\": \"Property Based Query\",\n+                                        \"value\": \"property-based-query\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Provide custom SOQL query.\",\n+                                        \"displayName\": \"Custom Query\",\n+                                        \"value\": \"custom-query\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"property-based-query\",\n+                                \"description\": \"Choose to provide the query by parameters or a full custom query.\",\n+                                \"displayName\": \"Query Type\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"query-type\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"request-channel\": {\n-                                \"description\": \"Identifier of the used request channel.\",\n-                                \"displayName\": \"Splunk Request Channel\",\n+                            \"read-timeout\": {\n+                                \"defaultValue\": \"15 s\",\n+                                \"description\": \"Maximum time allowed for reading a response from the Salesforce REST API\",\n+                                \"displayName\": \"Read Timeout\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"request-channel\",\n+                                \"name\": \"read-timeout\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"ttl\": {\n-                                \"defaultValue\": \"1 hour\",\n-                                \"description\": \"The maximum time the processor tries to acquire acknowledgement confirmation for an index, from the point of registration. After the given amount of time, the processor considers the index as not acknowledged and transfers the FlowFile to the \\\"unacknowledged\\\" relationship.\",\n-                                \"displayName\": \"Maximum Waiting Time\",\n+                            \"record-writer\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"property-based-query\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Query Type\",\n+                                        \"propertyName\": \"query-type\"\n+                                    }\n+                                ],\n+                                \"description\": \"Service used for writing records returned from the Salesforce REST API\",\n+                                \"displayName\": \"Record Writer\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"ttl\",\n+                                \"name\": \"record-writer\",\n+                                \"required\": true,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"salesforce-api-version\": {\n+                                \"defaultValue\": \"54.0\",\n+                                \"description\": \"The version number of the Salesforce REST API appended to the URL after the services/data path. See Salesforce documentation for supported versions\",\n+                                \"displayName\": \"API Version\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"salesforce-api-version\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n-                            }\n-                        },\n-                        \"readsAttributes\": [\n-                            {\n-                                \"description\": \"The indexing acknowledgement id provided by Splunk.\",\n-                                \"name\": \"splunk.acknowledgement.id\"\n                             },\n-                            {\n-                                \"description\": \"The time of the response of put request for Splunk.\",\n-                                \"name\": \"splunk.responded.at\"\n+                            \"salesforce-url\": {\n+                                \"description\": \"The URL of the Salesforce instance including the domain without additional path information, such as https://MyDomainName.my.salesforce.com\",\n+                                \"displayName\": \"Salesforce Instance URL\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"salesforce-url\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"sobject-name\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"property-based-query\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Query Type\",\n+                                        \"propertyName\": \"query-type\"\n+                                    }\n+                                ],\n+                                \"description\": \"The Salesforce sObject to be queried\",\n+                                \"displayName\": \"sObject Name\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"sobject-name\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n                             }\n-                        ],\n+                        },\n                         \"seeAlso\": [\n-                            \"org.apache.nifi.processors.splunk.PutSplunkHTTP\"\n+                            \"org.apache.nifi.processors.salesforce.PutSalesforceObject\"\n                         ],\n                         \"sideEffectFree\": false,\n+                        \"stateful\": {\n+                            \"description\": \"When 'Age Field' is set, after performing a query the time of execution is stored. Subsequent queries will be augmented with an additional condition so that only records that are newer than the stored execution time (adjusted with the optional value of 'Age Delay') will be retrieved. State is stored across the cluster so that this Processor can be run on Primary Node only and if a new Primary Node is selected, the new node can pick up where the previous node left off, without duplicating the data.\",\n+                            \"scopes\": [\n+                                \"CLUSTER\"\n+                            ]\n+                        },\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"A FlowFile is transferred to this relationship when the acknowledgement was successful.\",\n+                                \"description\": \"For FlowFiles created as a result of a successful query.\",\n                                 \"name\": \"success\"\n                             },\n                             {\n-                                \"description\": \"A FlowFile is transferred to this relationship when the acknowledgement was not successful. This can happen when the acknowledgement did not happened within the time period set for Maximum Waiting Time. FlowFiles with acknowledgement id unknown for the Splunk server will be transferred to this relationship after the Maximum Waiting Time is reached.\",\n-                                \"name\": \"unacknowledged\"\n-                            },\n-                            {\n-                                \"description\": \"A FlowFile is transferred to this relationship when the acknowledgement state is not determined. FlowFiles transferred to this relationship might be penalized. This happens when Splunk returns with HTTP 200 but with false response for the acknowledgement id in the flow file attribute.\",\n-                                \"name\": \"undetermined\"\n+                                \"description\": \"The input flowfile gets sent to this relationship when the query fails.\",\n+                                \"name\": \"failure\"\n                             },\n                             {\n-                                \"description\": \"A FlowFile is transferred to this relationship when the acknowledgement was not successful due to errors during the communication. FlowFiles are timing out or unknown by the Splunk server will transferred to \\\"undetermined\\\" relationship.\",\n-                                \"name\": \"failure\"\n+                                \"description\": \"The input flowfile gets sent to this relationship when the query succeeds.\",\n+                                \"name\": \"original\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n                         \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"acknowledgement\",\n-                            \"http\",\n-                            \"logs\",\n-                            \"splunk\"\n+                            \"query\",\n+                            \"salesforce\",\n+                            \"sobject\",\n+                            \"soql\"\n                         ],\n-                        \"triggerSerially\": false,\n+                        \"triggerSerially\": true,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.splunk.QuerySplunkIndexingStatus\",\n-                        \"typeDescription\": \"Queries Splunk server in order to acquire the status of indexing acknowledgement.\",\n-                        \"version\": \"1.27.0\"\n+                        \"type\": \"org.apache.nifi.processors.salesforce.QuerySalesforceObject\",\n+                        \"typeDescription\": \"Retrieves records from a Salesforce sObject. Users can add arbitrary filter conditions by setting the 'Custom WHERE Condition' property. The processor can also run a custom query, although record processing is not supported in that case. Supports incremental retrieval: users can define a field in the 'Age Field' property that will be used to determine when the record was created. When this property is set the processor will retrieve new records. Incremental loading and record-based processing are only supported in property-based queries. It's also possible to define an initial cutoff value for the age, filtering out all older records even for the first run. In case of 'Property Based Query' this processor should run on the Primary Node only. FlowFile attribute 'record.count' indicates how many records were retrieved and written to the output. The processor can accept an optional input FlowFile and reference the FlowFile attributes in the query.\",\n+                        \"version\": \"1.27.0\",\n+                        \"writesAttributes\": [\n+                            {\n+                                \"description\": \"Sets the mime.type attribute to the MIME Type specified by the Record Writer.\",\n+                                \"name\": \"mime.type\"\n+                            },\n+                            {\n+                                \"description\": \"Sets the number of records in the FlowFile.\",\n+                                \"name\": \"record.count\"\n+                            },\n+                            {\n+                                \"description\": \"Sets the total number of records in the FlowFile.\",\n+                                \"name\": \"total.record.count\"\n+                            }\n+                        ]\n                     }\n                 ],\n                 \"reportingTasks\": []\n             },\n             \"group\": \"org.apache.nifi\",\n             \"version\": \"1.27.0\"\n         },\n         {\n-            \"artifact\": \"nifi-aws-service-api-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [],\n-                \"processors\": [],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"1.27.0\"\n-        },\n-        {\n-            \"artifact\": \"nifi-box-services-api-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [],\n-                \"processors\": [],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"1.27.0\"\n-        },\n-        {\n-            \"artifact\": \"nifi-geohash-nar\",\n+            \"artifact\": \"nifi-windows-event-log-nar\",\n             \"componentManifest\": {\n                 \"controllerServices\": [],\n                 \"processors\": [\n                     {\n                         \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-geohash-nar\",\n+                        \"artifact\": \"nifi-windows-event-log-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n-                            \"EVENT_DRIVEN\": 0,\n                             \"TIMER_DRIVEN\": 1\n                         },\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_REQUIRED\",\n+                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"geohash-format\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"BASE32\",\n-                                        \"value\": \"BASE32\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"BINARY\",\n-                                        \"value\": \"BINARY\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"LONG\",\n-                                        \"value\": \"LONG\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"BASE32\",\n-                                \"description\": \"In the ENCODE mode, this property specifies the desired format for encoding geohash; in the DECODE mode, this property specifies the format of geohash provided\",\n-                                \"displayName\": \"Geohash Format\",\n+                            \"channel\": {\n+                                \"defaultValue\": \"System\",\n+                                \"description\": \"The Windows Event Log Channel to listen to.\",\n+                                \"displayName\": \"Channel\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"geohash-format\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"channel\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"geohash-level\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"ENCODE\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Mode\",\n-                                        \"propertyName\": \"mode\"\n-                                    }\n-                                ],\n-                                \"description\": \"The integer precision level(1-12) desired for encoding geohash\",\n-                                \"displayName\": \"Geohash Level\",\n+                            \"inactiveDurationToReconnect\": {\n+                                \"defaultValue\": \"10 mins\",\n+                                \"description\": \"If no new event logs are processed for the specified time period, this processor will try reconnecting to recover from a state where any further messages cannot be consumed. Such situation can happen if Windows Event Log service is restarted, or ERROR_EVT_QUERY_RESULT_STALE (15011) is returned. Setting no duration, e.g. '0 ms' disables auto-reconnection.\",\n+                                \"displayName\": \"Inactive duration to reconnect\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"geohash-level\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"inactiveDurationToReconnect\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"geohash-record-path\": {\n-                                \"description\": \"In the ENCODE mode, this property specifies the record path to put the geohash value; in the DECODE mode, this property specifies the record path to retrieve the geohash value\",\n-                                \"displayName\": \"Geohash Record Path\",\n+                            \"maxBuffer\": {\n+                                \"defaultValue\": \"1048576\",\n+                                \"description\": \"The individual Event Log XMLs are rendered to a buffer.  This specifies the maximum size in bytes that the buffer will be allowed to grow to. (Limiting the maximum size of an individual Event XML.)\",\n+                                \"displayName\": \"Maximum Buffer Size\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"geohash-record-path\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"maxBuffer\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"latitude-record-path\": {\n-                                \"description\": \"In the ENCODE mode, this property specifies the record path to retrieve the latitude values. Latitude values should be in the range of [-90, 90]; invalid values will be logged at warn level. In the DECODE mode, this property specifies the record path to put the latitude value\",\n-                                \"displayName\": \"Latitude Record Path\",\n+                            \"maxQueue\": {\n+                                \"defaultValue\": \"1024\",\n+                                \"description\": \"Events are received asynchronously and must be output as FlowFiles when the processor is triggered.  This specifies the maximum number of events to queue for transformation into FlowFiles.\",\n+                                \"displayName\": \"Maximum queue size\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"latitude-record-path\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"maxQueue\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"longitude-record-path\": {\n-                                \"description\": \"In the ENCODE mode, this property specifies the record path to retrieve the longitude values; Longitude values should be in the range of [-180, 180]; invalid values will be logged at warn level. In the DECODE mode, this property specifies the record path to put the longitude value\",\n-                                \"displayName\": \"Longitude Record Path\",\n+                            \"query\": {\n+                                \"defaultValue\": \"*\",\n+                                \"description\": \"XPath Query to filter events. (See https://msdn.microsoft.com/en-us/library/windows/desktop/dd996910(v=vs.85).aspx for examples.)\",\n+                                \"displayName\": \"XPath Query\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"longitude-record-path\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"query\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            }\n+                        },\n+                        \"sideEffectFree\": false,\n+                        \"supportedRelationships\": [\n+                            {\n+                                \"description\": \"Relationship for successfully consumed events.\",\n+                                \"name\": \"success\"\n+                            }\n+                        ],\n+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\"\n+                        ],\n+                        \"supportsBatching\": false,\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicRelationships\": false,\n+                        \"supportsEventDriven\": false,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"event\",\n+                            \"ingest\",\n+                            \"windows\"\n+                        ],\n+                        \"triggerSerially\": true,\n+                        \"triggerWhenAnyDestinationAvailable\": false,\n+                        \"triggerWhenEmpty\": false,\n+                        \"type\": \"org.apache.nifi.processors.windows.event.log.ConsumeWindowsEventLog\",\n+                        \"typeDescription\": \"Registers a Windows Event Log Subscribe Callback to receive FlowFiles from Events on Windows.  These can be filtered via channel and XPath.\",\n+                        \"version\": \"1.27.0\",\n+                        \"writesAttributes\": [\n+                            {\n+                                \"description\": \"Will set a MIME type value of application/xml.\",\n+                                \"name\": \"mime.type\"\n+                            }\n+                        ]\n+                    }\n+                ],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"1.27.0\"\n+        },\n+        {\n+            \"artifact\": \"nifi-elasticsearch-client-service-api-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [],\n+                \"processors\": [],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"1.27.0\"\n+        },\n+        {\n+            \"artifact\": \"nifi-mongodb-services-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-mongodb-services-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"e0c4461\"\n+                        },\n+                        \"group\": \"org.apache.nifi\",\n+                        \"propertyDescriptors\": {\n+                            \"Database User\": {\n+                                \"description\": \"Database user name\",\n+                                \"displayName\": \"Database User\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Database User\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Password\": {\n+                                \"description\": \"The password for the database user\",\n+                                \"displayName\": \"Password\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Password\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n+                            },\n+                            \"mongo-uri\": {\n+                                \"description\": \"MongoURI, typically of the form: mongodb://host1[:port1][,host2[:port2],...]\",\n+                                \"displayName\": \"Mongo URI\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"mongo-uri\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"mode\": {\n+                            \"ssl-client-auth\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"ENCODE\",\n-                                        \"value\": \"ENCODE\"\n+                                        \"displayName\": \"WANT\",\n+                                        \"value\": \"WANT\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"DECODE\",\n-                                        \"value\": \"DECODE\"\n+                                        \"displayName\": \"REQUIRED\",\n+                                        \"value\": \"REQUIRED\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"NONE\",\n+                                        \"value\": \"NONE\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"ENCODE\",\n-                                \"description\": \"Specifies whether to encode latitude/longitude to geohash or decode geohash to latitude/longitude\",\n-                                \"displayName\": \"Mode\",\n+                                \"defaultValue\": \"REQUIRED\",\n+                                \"description\": \"Client authentication policy when connecting to secure (TLS/SSL) cluster. Possible values are REQUIRED, WANT, NONE. This property is only used when an SSL Context has been defined and enabled.\",\n+                                \"displayName\": \"Client Auth\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"mode\",\n-                                \"required\": true,\n+                                \"name\": \"ssl-client-auth\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"record-reader\": {\n-                                \"description\": \"Specifies the record reader service to use for reading incoming data\",\n-                                \"displayName\": \"Record Reader\",\n+                            \"ssl-context-service\": {\n+                                \"description\": \"The SSL Context Service used to provide client certificate information for TLS/SSL connections.\",\n+                                \"displayName\": \"SSL Context Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"record-reader\",\n-                                \"required\": true,\n+                                \"name\": \"ssl-context-service\",\n+                                \"required\": false,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n                                     \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n+                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n                                     \"version\": \"1.27.0\"\n                                 }\n+                            }\n+                        },\n+                        \"providedApiImplementations\": [\n+                            {\n+                                \"artifact\": \"nifi-mongodb-client-service-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.mongodb.MongoDBClientService\",\n+                                \"version\": \"1.27.0\"\n+                            }\n+                        ],\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"mongo\",\n+                            \"mongodb\",\n+                            \"service\"\n+                        ],\n+                        \"type\": \"org.apache.nifi.mongodb.MongoDBControllerService\",\n+                        \"typeDescription\": \"Provides a controller service that configures a connection to MongoDB and provides access to that connection to other Mongo-related components.\",\n+                        \"version\": \"1.27.0\"\n+                    },\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-mongodb-services-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"e0c4461\"\n+                        },\n+                        \"group\": \"org.apache.nifi\",\n+                        \"propertyDescriptors\": {\n+                            \"mongo-collection-name\": {\n+                                \"description\": \"The name of the collection to use\",\n+                                \"displayName\": \"Mongo Collection Name\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"mongo-collection-name\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n                             },\n-                            \"record-writer\": {\n-                                \"description\": \"Specifies the record writer service to use for writing data\",\n-                                \"displayName\": \"Record Writer\",\n+                            \"mongo-db-name\": {\n+                                \"description\": \"The name of the database to use\",\n+                                \"displayName\": \"Mongo Database Name\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"mongo-db-name\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"mongo-lookup-client-service\": {\n+                                \"description\": \"A MongoDB controller service to use with this lookup service.\",\n+                                \"displayName\": \"Client Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"record-writer\",\n+                                \"name\": \"mongo-lookup-client-service\",\n                                 \"required\": true,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"artifact\": \"nifi-mongodb-client-service-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n+                                    \"type\": \"org.apache.nifi.mongodb.MongoDBClientService\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             },\n-                            \"routing-strategy\": {\n+                            \"mongo-lookup-projection\": {\n+                                \"description\": \"Specifies a projection for limiting which fields will be returned.\",\n+                                \"displayName\": \"Projection\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"mongo-lookup-projection\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"mongo-lookup-value-field\": {\n+                                \"description\": \"The field whose value will be returned when the lookup key(s) match a record. If not specified then the entire MongoDB result document minus the _id field will be returned as a record.\",\n+                                \"displayName\": \"Lookup Value Field\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"mongo-lookup-value-field\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"schema-access-strategy\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"SKIP\",\n-                                        \"value\": \"SKIP\"\n+                                        \"description\": \"The name of the Schema to use is specified by the 'Schema Name' Property. The value of this property is used to lookup the Schema in the configured Schema Registry service.\",\n+                                        \"displayName\": \"Use 'Schema Name' Property\",\n+                                        \"value\": \"schema-name\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"SPLIT\",\n-                                        \"value\": \"SPLIT\"\n+                                        \"description\": \"The text of the Schema itself is specified by the 'Schema Text' Property. The value of this property must be a valid Avro Schema. If Expression Language is used, the value of the 'Schema Text' property must be valid after substituting the expressions.\",\n+                                        \"displayName\": \"Use 'Schema Text' Property\",\n+                                        \"value\": \"schema-text-property\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"REQUIRE\",\n-                                        \"value\": \"REQUIRE\"\n+                                        \"displayName\": \"Infer from Result\",\n+                                        \"value\": \"infer\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"SKIP\",\n-                                \"description\": \"Specifies how to route flowfiles after encoding or decoding being performed. SKIP will enrich those records that can be enriched and skip the rest. The SKIP strategy will route a flowfile to failure only if unable to parse the data. Otherwise, it will route the enriched flowfile to success, and the original input to original. SPLIT will separate the records that have been enriched from those that have not and send them to matched, while unenriched records will be sent to unmatched; the original input flowfile will be sent to original. The SPLIT strategy will route a flowfile to failure only if unable to parse the data. REQUIRE will route a flowfile to success only if all of its records are enriched, and the original input will be sent to original. The REQUIRE strategy will route the original input flowfile to failure if any of its records cannot be enriched or unable to be parsed\",\n-                                \"displayName\": \"Routing Strategy\",\n+                                \"defaultValue\": \"infer\",\n+                                \"description\": \"Specifies how to obtain the schema that is to be used for interpreting the data.\",\n+                                \"displayName\": \"Schema Access Strategy\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"routing-strategy\",\n+                                \"name\": \"schema-access-strategy\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n-                            }\n-                        },\n-                        \"sideEffectFree\": true,\n-                        \"supportedRelationships\": [\n-                            {\n-                                \"description\": \"Flowfiles that are successfully encoded or decoded will be routed to success\",\n-                                \"name\": \"success\"\n                             },\n-                            {\n-                                \"description\": \"Flowfiles that cannot be encoded or decoded will be routed to failure\",\n-                                \"name\": \"failure\"\n+                            \"schema-branch\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"schema-name\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n+                                        \"propertyName\": \"schema-access-strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"Specifies the name of the branch to use when looking up the schema in the Schema Registry property. If the chosen Schema Registry does not support branching, this value will be ignored.\",\n+                                \"displayName\": \"Schema Branch\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"schema-branch\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"schema-name\": {\n+                                \"defaultValue\": \"${schema.name}\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"schema-name\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n+                                        \"propertyName\": \"schema-access-strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"Specifies the name of the schema to lookup in the Schema Registry property\",\n+                                \"displayName\": \"Schema Name\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"schema-name\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"schema-registry\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"confluent-encoded\",\n+                                            \"schema-name\",\n+                                            \"hwx-schema-ref-attributes\",\n+                                            \"hwx-content-encoded-schema\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n+                                        \"propertyName\": \"schema-access-strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"Specifies the Controller Service to use for the Schema Registry\",\n+                                \"displayName\": \"Schema Registry\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"schema-registry\",\n+                                \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.schemaregistry.services.SchemaRegistry\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"schema-text\": {\n+                                \"defaultValue\": \"${avro.schema}\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"schema-text-property\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n+                                        \"propertyName\": \"schema-access-strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"The text of an Avro-formatted Schema\",\n+                                \"displayName\": \"Schema Text\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"schema-text\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n                             },\n+                            \"schema-version\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"schema-name\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n+                                        \"propertyName\": \"schema-access-strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"Specifies the version of the schema to lookup in the Schema Registry. If not specified then the latest version of the schema will be retrieved.\",\n+                                \"displayName\": \"Schema Version\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"schema-version\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            }\n+                        },\n+                        \"providedApiImplementations\": [\n                             {\n-                                \"description\": \"The original input flowfile will be sent to this relationship\",\n-                                \"name\": \"original\"\n+                                \"artifact\": \"nifi-standard-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.lookup.LookupService\",\n+                                \"version\": \"1.27.0\"\n                             }\n                         ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\",\n-                            \"EVENT_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": true,\n                         \"supportsDynamicProperties\": false,\n-                        \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": true,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"geo\",\n-                            \"geohash\",\n+                            \"lookup\",\n+                            \"mongo\",\n+                            \"mongodb\",\n                             \"record\"\n                         ],\n-                        \"triggerSerially\": false,\n-                        \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.geohash.GeohashRecord\",\n-                        \"typeDescription\": \"A record-based processor that encodes and decodes Geohashes from and to latitude/longitude coordinates.\",\n-                        \"version\": \"1.27.0\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"The MIME type indicated by the record writer\",\n-                                \"name\": \"mime.type\"\n-                            },\n-                            {\n-                                \"description\": \"The number of records in the resulting flow file\",\n-                                \"name\": \"record.count\"\n-                            }\n-                        ]\n+                        \"type\": \"org.apache.nifi.mongodb.MongoDBLookupService\",\n+                        \"typeDescription\": \"Provides a lookup service based around MongoDB. Each key that is specified \\nwill be added to a query as-is. For example, if you specify the two keys, \\nuser and email, the resulting query will be { \\\"user\\\": \\\"tester\\\", \\\"email\\\": \\\"tester@test.com\\\" }.\\nThe query is limited to the first result (findOne in the Mongo documentation). If no \\\"Lookup Value Field\\\" is specified then the entire MongoDB result document minus the _id field will be returned as a record.\",\n+                        \"version\": \"1.27.0\"\n                     }\n                 ],\n+                \"processors\": [],\n                 \"reportingTasks\": []\n             },\n             \"group\": \"org.apache.nifi\",\n             \"version\": \"1.27.0\"\n         },\n         {\n             \"artifact\": \"nifi-site-to-site-reporting-nar\",\n@@ -46136,987 +40397,3521 @@\n                     }\n                 ]\n             },\n             \"group\": \"org.apache.nifi\",\n             \"version\": \"1.27.0\"\n         },\n         {\n-            \"artifact\": \"nifi-db-schema-registry-service-nar\",\n+            \"artifact\": \"nifi-spring-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [],\n+                \"processors\": [\n+                    {\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-spring-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"e0c4461\"\n+                        },\n+                        \"defaultBulletinLevel\": \"WARN\",\n+                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": 1,\n+                            \"TIMER_DRIVEN\": 1\n+                        },\n+                        \"defaultPenaltyDuration\": \"30 sec\",\n+                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": \"* * * * * ?\",\n+                            \"TIMER_DRIVEN\": \"0 sec\"\n+                        },\n+                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n+                        \"defaultYieldDuration\": \"1 sec\",\n+                        \"deprecated\": true,\n+                        \"deprecationReason\": \"Alternative event-handling solutions should be used\",\n+                        \"group\": \"org.apache.nifi\",\n+                        \"primaryNodeOnly\": false,\n+                        \"propertyDescriptors\": {\n+                            \"Application Context class path\": {\n+                                \"description\": \"Path to the directory with resources (i.e., JARs, configuration files etc.) required to be on the classpath of the ApplicationContext.\",\n+                                \"displayName\": \"Application Context class path\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Application Context class path\",\n+                                \"required\": true,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"SINGLE\",\n+                                    \"resourceTypes\": [\n+                                        \"DIRECTORY\"\n+                                    ]\n+                                },\n+                                \"sensitive\": false\n+                            },\n+                            \"Application Context config path\": {\n+                                \"description\": \"The path to the Spring Application Context configuration file relative to the classpath\",\n+                                \"displayName\": \"Application Context config path\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Application Context config path\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Receive Timeout\": {\n+                                \"description\": \"Timeout for receiving date from Spring context. Defaults to 0.\",\n+                                \"displayName\": \"Receive Timeout\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Receive Timeout\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Send Timeout\": {\n+                                \"description\": \"Timeout for sending data to Spring Application Context. Defaults to 0.\",\n+                                \"displayName\": \"Send Timeout\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Send Timeout\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            }\n+                        },\n+                        \"sideEffectFree\": false,\n+                        \"supportedRelationships\": [\n+                            {\n+                                \"description\": \"All FlowFiles that are successfully received from Spring Application Context are routed to this relationship\",\n+                                \"name\": \"success\"\n+                            },\n+                            {\n+                                \"description\": \"All FlowFiles that cannot be sent to Spring Application Context are routed to this relationship\",\n+                                \"name\": \"failure\"\n+                            }\n+                        ],\n+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\"\n+                        ],\n+                        \"supportsBatching\": false,\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicRelationships\": false,\n+                        \"supportsEventDriven\": false,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"Get\",\n+                            \"Integration\",\n+                            \"Message\",\n+                            \"Put\",\n+                            \"Spring\"\n+                        ],\n+                        \"triggerSerially\": false,\n+                        \"triggerWhenAnyDestinationAvailable\": false,\n+                        \"triggerWhenEmpty\": true,\n+                        \"type\": \"org.apache.nifi.spring.SpringContextProcessor\",\n+                        \"typeDescription\": \"A Processor that supports sending and receiving data from application defined in Spring Application Context via predefined in/out MessageChannels.\",\n+                        \"version\": \"1.27.0\"\n+                    }\n+                ],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"1.27.0\"\n+        },\n+        {\n+            \"artifact\": \"nifi-network-processors-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [],\n+                \"processors\": [\n+                    {\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-network-processors-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"e0c4461\"\n+                        },\n+                        \"defaultBulletinLevel\": \"WARN\",\n+                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": 1,\n+                            \"EVENT_DRIVEN\": 0,\n+                            \"TIMER_DRIVEN\": 1\n+                        },\n+                        \"defaultPenaltyDuration\": \"30 sec\",\n+                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": \"* * * * * ?\",\n+                            \"TIMER_DRIVEN\": \"0 sec\"\n+                        },\n+                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n+                        \"defaultYieldDuration\": \"1 sec\",\n+                        \"group\": \"org.apache.nifi\",\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n+                        \"primaryNodeOnly\": false,\n+                        \"propertyDescriptors\": {\n+                            \"FIELDS_DESTINATION\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"Parsed data routes as flowfile JSON content\",\n+                                        \"displayName\": \"flowfile-content\",\n+                                        \"value\": \"flowfile-content\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Parsed data routes as flowfile attributes\",\n+                                        \"displayName\": \"flowfile-attribute\",\n+                                        \"value\": \"flowfile-attribute\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"flowfile-content\",\n+                                \"description\": \"Indicates whether the results of the parser are written to the FlowFile content or a FlowFile attribute; if using flowfile-attribute, fields will be populated as attributes. If set to flowfile-content, the netflowv5 field will be converted into a flat JSON object.\",\n+                                \"displayName\": \"Parsed fields destination\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"FIELDS_DESTINATION\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            }\n+                        },\n+                        \"readsAttributes\": [\n+                            {\n+                                \"description\": \"Optionally read if packets are received from UDP datagrams.\",\n+                                \"name\": \"udp.port\"\n+                            }\n+                        ],\n+                        \"sideEffectFree\": true,\n+                        \"supportedRelationships\": [\n+                            {\n+                                \"description\": \"Any FlowFile that is successfully parsed as a netflowv5 data will be transferred to this Relationship.\",\n+                                \"name\": \"success\"\n+                            },\n+                            {\n+                                \"description\": \"Any FlowFile that could not be parsed as a netflowv5 message will be transferred to this Relationship without any attributes being added\",\n+                                \"name\": \"failure\"\n+                            },\n+                            {\n+                                \"description\": \"The original raw content\",\n+                                \"name\": \"original\"\n+                            }\n+                        ],\n+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\",\n+                            \"EVENT_DRIVEN\"\n+                        ],\n+                        \"supportsBatching\": true,\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicRelationships\": false,\n+                        \"supportsEventDriven\": true,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"attributes\",\n+                            \"byte\",\n+                            \"datagram\",\n+                            \"netflow\",\n+                            \"network\",\n+                            \"packet\",\n+                            \"v5\"\n+                        ],\n+                        \"triggerSerially\": false,\n+                        \"triggerWhenAnyDestinationAvailable\": false,\n+                        \"triggerWhenEmpty\": false,\n+                        \"type\": \"org.apache.nifi.processors.network.ParseNetflowv5\",\n+                        \"typeDescription\": \"Parses netflowv5 byte ingest and add to NiFi flowfile as attributes or JSON content.\",\n+                        \"version\": \"1.27.0\",\n+                        \"writesAttributes\": [\n+                            {\n+                                \"description\": \"The key and value generated by the parsing of the header fields.\",\n+                                \"name\": \"netflowv5.header.*\"\n+                            },\n+                            {\n+                                \"description\": \"The key and value generated by the parsing of the record fields.\",\n+                                \"name\": \"netflowv5.record.*\"\n+                            }\n+                        ]\n+                    }\n+                ],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"1.27.0\"\n+        },\n+        {\n+            \"artifact\": \"nifi-web-client-provider-service-nar\",\n             \"componentManifest\": {\n                 \"controllerServices\": [\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-db-schema-registry-service-nar\",\n+                        \"artifact\": \"nifi-web-client-provider-service-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"group\": \"org.apache.nifi\",\n                         \"propertyDescriptors\": {\n-                            \"Catalog Name\": {\n-                                \"description\": \"The name of the catalog used to locate the desired table. This may not apply for the database that you are querying. In this case, leave the field empty. Note that if the property is set and the database is case-sensitive, the catalog name must match the database's catalog name exactly.\",\n-                                \"displayName\": \"Catalog Name\",\n+                            \"connect-timeout\": {\n+                                \"defaultValue\": \"10 secs\",\n+                                \"description\": \"Maximum amount of time to wait before failing during initial socket connection\",\n+                                \"displayName\": \"Connect Timeout\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Catalog Name\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"connect-timeout\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"proxy-configuration-service\": {\n+                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests. If set, it supersedes proxy settings configured per component.\",\n+                                \"displayName\": \"Proxy Configuration Service\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"proxy-configuration-service\",\n                                 \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.proxy.ProxyConfigurationService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"read-timeout\": {\n+                                \"defaultValue\": \"10 secs\",\n+                                \"description\": \"Maximum amount of time to wait before failing while reading socket responses\",\n+                                \"displayName\": \"Read Timeout\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"read-timeout\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Database Connection Pooling Service\": {\n-                                \"description\": \"The Controller Service that is used to obtain a connection to the database for retrieving table information.\",\n-                                \"displayName\": \"Database Connection Pooling Service\",\n+                            \"redirect-handling-strategy\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"FOLLOWED\",\n+                                        \"value\": \"FOLLOWED\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"IGNORED\",\n+                                        \"value\": \"IGNORED\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"FOLLOWED\",\n+                                \"description\": \"Handling strategy for responding to HTTP 301 or 302 redirects received with a Location header\",\n+                                \"displayName\": \"Redirect Handling Strategy\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Database Connection Pooling Service\",\n+                                \"name\": \"redirect-handling-strategy\",\n                                 \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"ssl-context-service\": {\n+                                \"description\": \"SSL Context Service overrides system default TLS settings for HTTPS communication\",\n+                                \"displayName\": \"SSL Context Service\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"ssl-context-service\",\n+                                \"required\": false,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n                                     \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.dbcp.DBCPService\",\n+                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             },\n-                            \"Schema Name\": {\n-                                \"description\": \"The name of the schema that the table belongs to. This may not apply for the database that you are updating. In this case, leave the field empty. Note that if the property is set and the database is case-sensitive, the schema name must match the database's schema name exactly. Also notice that if the same table name exists in multiple schemas and Schema Name is not specified, the service will find those tables and give an error if the different tables have the same column name(s).\",\n-                                \"displayName\": \"Schema Name\",\n+                            \"write-timeout\": {\n+                                \"defaultValue\": \"10 secs\",\n+                                \"description\": \"Maximum amount of time to wait before failing while writing socket requests\",\n+                                \"displayName\": \"Write Timeout\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Schema Name\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"write-timeout\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             }\n                         },\n                         \"providedApiImplementations\": [\n                             {\n                                 \"artifact\": \"nifi-standard-services-api-nar\",\n                                 \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.schemaregistry.services.SchemaRegistry\",\n+                                \"type\": \"org.apache.nifi.web.client.provider.api.WebClientServiceProvider\",\n                                 \"version\": \"1.27.0\"\n                             }\n                         ],\n                         \"supportsDynamicProperties\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"database\",\n-                            \"registry\",\n-                            \"schema\",\n-                            \"table\"\n+                            \"Client\",\n+                            \"HTTP\",\n+                            \"Web\"\n                         ],\n-                        \"type\": \"org.apache.nifi.db.schemaregistry.DatabaseTableSchemaRegistry\",\n-                        \"typeDescription\": \"Provides a service for generating a record schema from a database table definition. The service is configured to use a table name and a database connection fetches the table metadata (i.e. table definition) such as column names, data types, nullability, etc.\",\n+                        \"type\": \"org.apache.nifi.web.client.provider.service.StandardWebClientServiceProvider\",\n+                        \"typeDescription\": \"Web Client Service Provider with support for configuring standard HTTP connection properties\",\n                         \"version\": \"1.27.0\"\n                     }\n                 ],\n                 \"processors\": [],\n                 \"reportingTasks\": []\n             },\n             \"group\": \"org.apache.nifi\",\n             \"version\": \"1.27.0\"\n         },\n         {\n-            \"artifact\": \"nifi-ldap-iaa-providers-nar\",\n+            \"artifact\": \"nifi-update-attribute-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [],\n+                \"processors\": [\n+                    {\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-update-attribute-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"e0c4461\"\n+                        },\n+                        \"defaultBulletinLevel\": \"WARN\",\n+                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": 1,\n+                            \"EVENT_DRIVEN\": 0,\n+                            \"TIMER_DRIVEN\": 1\n+                        },\n+                        \"defaultPenaltyDuration\": \"30 sec\",\n+                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": \"* * * * * ?\",\n+                            \"TIMER_DRIVEN\": \"0 sec\"\n+                        },\n+                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n+                        \"defaultYieldDuration\": \"1 sec\",\n+                        \"dynamicProperties\": [\n+                            {\n+                                \"description\": \"Updates a FlowFile attribute specified by the Dynamic Property's key with the value specified by the Dynamic Property's value\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"name\": \"A FlowFile attribute to update\",\n+                                \"value\": \"The value to set it to\"\n+                            }\n+                        ],\n+                        \"group\": \"org.apache.nifi\",\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n+                        \"primaryNodeOnly\": false,\n+                        \"propertyDescriptors\": {\n+                            \"Delete Attributes Expression\": {\n+                                \"description\": \"Regular expression for attributes to be deleted from FlowFiles.  Existing attributes that match will be deleted regardless of whether they are updated by this processor.\",\n+                                \"displayName\": \"Delete Attributes Expression\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Delete Attributes Expression\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Stateful Variables Initial Value\": {\n+                                \"description\": \"If using state to set/reference variables then this value is used to set the initial value of the stateful variable. This will only be used in the @OnScheduled method when state does not contain a value for the variable. This is required if running statefully but can be empty if needed.\",\n+                                \"displayName\": \"Stateful Variables Initial Value\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Stateful Variables Initial Value\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Store State\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Do not store state\",\n+                                        \"value\": \"Do not store state\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Store state locally\",\n+                                        \"value\": \"Store state locally\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"Do not store state\",\n+                                \"description\": \"Select whether or not state will be stored. Selecting 'Stateless' will offer the default functionality of purely updating the attributes on a FlowFile in a stateless manner. Selecting a stateful option will not only store the attributes on the FlowFile but also in the Processors state. See the 'Stateful Usage' topic of the 'Additional Details' section of this processor's documentation for more information\",\n+                                \"displayName\": \"Store State\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Store State\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"canonical-value-lookup-cache-size\": {\n+                                \"defaultValue\": \"100\",\n+                                \"description\": \"Specifies how many canonical lookup values should be stored in the cache\",\n+                                \"displayName\": \"Cache Value Lookup Cache Size\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"canonical-value-lookup-cache-size\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            }\n+                        },\n+                        \"sideEffectFree\": true,\n+                        \"stateful\": {\n+                            \"description\": \"Gives the option to store values not only on the FlowFile but as stateful variables to be referenced in a recursive manner.\",\n+                            \"scopes\": [\n+                                \"LOCAL\"\n+                            ]\n+                        },\n+                        \"supportedRelationships\": [\n+                            {\n+                                \"description\": \"All successful FlowFiles are routed to this relationship\",\n+                                \"name\": \"success\"\n+                            }\n+                        ],\n+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\",\n+                            \"EVENT_DRIVEN\"\n+                        ],\n+                        \"supportsBatching\": true,\n+                        \"supportsDynamicProperties\": true,\n+                        \"supportsDynamicRelationships\": false,\n+                        \"supportsEventDriven\": true,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"Attribute Expression Language\",\n+                            \"attributes\",\n+                            \"delete\",\n+                            \"modification\",\n+                            \"state\",\n+                            \"update\"\n+                        ],\n+                        \"triggerSerially\": false,\n+                        \"triggerWhenAnyDestinationAvailable\": false,\n+                        \"triggerWhenEmpty\": false,\n+                        \"type\": \"org.apache.nifi.processors.attributes.UpdateAttribute\",\n+                        \"typeDescription\": \"Updates the Attributes for a FlowFile by using the Attribute Expression Language and/or deletes the attributes based on a regular expression\",\n+                        \"version\": \"1.27.0\",\n+                        \"writesAttributes\": [\n+                            {\n+                                \"description\": \"This processor may write or remove zero or more attributes as described in additional details\",\n+                                \"name\": \"See additional details\"\n+                            }\n+                        ]\n+                    }\n+                ],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"1.27.0\"\n+        },\n+        {\n+            \"artifact\": \"nifi-framework-nar\",\n             \"componentManifest\": {\n                 \"controllerServices\": [],\n                 \"processors\": [],\n                 \"reportingTasks\": []\n             },\n             \"group\": \"org.apache.nifi\",\n             \"version\": \"1.27.0\"\n         },\n         {\n-            \"artifact\": \"nifi-hashicorp-vault-nar\",\n+            \"artifact\": \"nifi-kafka-2-6-nar\",\n             \"componentManifest\": {\n                 \"controllerServices\": [\n                     {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-kafka-2-6-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"e0c4461\"\n+                        },\n+                        \"dynamicProperties\": [\n+                            {\n+                                \"description\": \"These properties will be added on the Kafka configuration after loading any provided configuration properties. In the event a dynamic property represents a property that was already set, its value will be ignored and WARN message logged. For the list of available Kafka properties please refer to: http://kafka.apache.org/documentation.html#configuration. \",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"name\": \"The name of a Kafka configuration property.\",\n+                                \"value\": \"The value of a given Kafka configuration property.\"\n+                            }\n+                        ],\n+                        \"group\": \"org.apache.nifi\",\n+                        \"propertyDescriptors\": {\n+                            \"ack.wait.time\": {\n+                                \"defaultValue\": \"5 secs\",\n+                                \"description\": \"After sending a message to Kafka, this indicates the amount of time that we are willing to wait for a response from Kafka. If Kafka does not acknowledge the message within this time period, the FlowFile will be routed to 'failure'.\",\n+                                \"displayName\": \"Acknowledgment Wait Time\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"ack.wait.time\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"acks\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"Records are considered 'transmitted successfully' after successfully writing the content to a Kafka node, without waiting for a response. This provides the best performance but may result in data loss.\",\n+                                        \"displayName\": \"Best Effort\",\n+                                        \"value\": \"0\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Records are considered 'transmitted successfully' if the message is received by a single Kafka node, whether or not it is replicated. This is faster than <Guarantee Replicated Delivery> but can result in data loss if a Kafka node crashes.\",\n+                                        \"displayName\": \"Guarantee Single Node Delivery\",\n+                                        \"value\": \"1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Records are considered 'transmitted unsuccessfully' unless the message is replicated to the appropriate number of Kafka Nodes according to the Topic configuration.\",\n+                                        \"displayName\": \"Guarantee Replicated Delivery\",\n+                                        \"value\": \"all\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"0\",\n+                                \"description\": \"Specifies the requirement for guaranteeing that a message is sent to Kafka. Corresponds to Kafka's 'acks' property.\",\n+                                \"displayName\": \"Delivery Guarantee\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"acks\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"bootstrap.servers\": {\n+                                \"defaultValue\": \"localhost:9092\",\n+                                \"description\": \"Comma-separated list of Kafka Brokers in the format host:port\",\n+                                \"displayName\": \"Kafka Brokers\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"bootstrap.servers\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"compression.type\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"none\",\n+                                        \"value\": \"none\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"gzip\",\n+                                        \"value\": \"gzip\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"snappy\",\n+                                        \"value\": \"snappy\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"lz4\",\n+                                        \"value\": \"lz4\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"none\",\n+                                \"description\": \"This parameter allows you to specify the compression codec for all data generated by this producer.\",\n+                                \"displayName\": \"Compression Type\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"compression.type\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"kerberos-credentials-service\": {\n+                                \"description\": \"Service supporting generalized credentials authentication with Kerberos\",\n+                                \"displayName\": \"Kerberos Credentials Service\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"kerberos-credentials-service\",\n+                                \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.kerberos.KerberosCredentialsService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"kerberos-user-service\": {\n+                                \"description\": \"Service supporting user authentication with Kerberos\",\n+                                \"displayName\": \"Kerberos User Service\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"kerberos-user-service\",\n+                                \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.kerberos.SelfContainedKerberosUserService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"max.block.ms\": {\n+                                \"defaultValue\": \"5 sec\",\n+                                \"description\": \"The amount of time publisher will wait to obtain metadata or wait for the buffer to flush during the 'send' call before failing the entire 'send' call. Corresponds to Kafka's 'max.block.ms' property\",\n+                                \"displayName\": \"Max Metadata Wait Time\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"max.block.ms\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"max.request.size\": {\n+                                \"defaultValue\": \"1 MB\",\n+                                \"description\": \"The maximum size of a request in bytes. Corresponds to Kafka's 'max.request.size' property and defaults to 1 MB (1048576).\",\n+                                \"displayName\": \"Max Request Size\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"max.request.size\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"message-header-encoding\": {\n+                                \"defaultValue\": \"UTF-8\",\n+                                \"description\": \"For any attribute that is added as a message header, as configured via the <Attributes to Send as Headers> property, this property indicates the Character Encoding to use for serializing the headers.\",\n+                                \"displayName\": \"Message Header Encoding\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"message-header-encoding\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"record-sink-record-writer\": {\n+                                \"description\": \"Specifies the Controller Service to use for writing out the records.\",\n+                                \"displayName\": \"Record Writer\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"record-sink-record-writer\",\n+                                \"required\": true,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"sasl.kerberos.service.name\": {\n+                                \"description\": \"The service name that matches the primary name of the Kafka server configured in the broker JAAS configuration\",\n+                                \"displayName\": \"Kerberos Service Name\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"sasl.kerberos.service.name\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"security.protocol\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"PLAINTEXT\",\n+                                        \"value\": \"PLAINTEXT\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"SSL\",\n+                                        \"value\": \"SSL\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"SASL_PLAINTEXT\",\n+                                        \"value\": \"SASL_PLAINTEXT\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"SASL_SSL\",\n+                                        \"value\": \"SASL_SSL\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"PLAINTEXT\",\n+                                \"description\": \"Security protocol used to communicate with brokers. Corresponds to Kafka Client security.protocol property\",\n+                                \"displayName\": \"Security Protocol\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"security.protocol\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"ssl.context.service\": {\n+                                \"description\": \"Service supporting SSL communication with Kafka brokers\",\n+                                \"displayName\": \"SSL Context Service\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"ssl.context.service\",\n+                                \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"topic\": {\n+                                \"description\": \"The name of the Kafka Topic to publish to.\",\n+                                \"displayName\": \"Topic Name\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"topic\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            }\n+                        },\n+                        \"providedApiImplementations\": [\n+                            {\n+                                \"artifact\": \"nifi-standard-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.record.sink.RecordSinkService\",\n+                                \"version\": \"1.27.0\"\n+                            }\n+                        ],\n+                        \"supportsDynamicProperties\": true,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"kafka\",\n+                            \"record\",\n+                            \"sink\"\n+                        ],\n+                        \"type\": \"org.apache.nifi.record.sink.kafka.KafkaRecordSink_2_6\",\n+                        \"typeDescription\": \"Provides a service to write records to a Kafka 2.6+ topic.\",\n+                        \"version\": \"1.27.0\"\n+                    }\n+                ],\n+                \"processors\": [\n+                    {\n                         \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-hashicorp-vault-nar\",\n+                        \"artifact\": \"nifi-kafka-2-6-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n+                        \"defaultBulletinLevel\": \"WARN\",\n+                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": 1,\n+                            \"TIMER_DRIVEN\": 1\n+                        },\n+                        \"defaultPenaltyDuration\": \"30 sec\",\n+                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": \"* * * * * ?\",\n+                            \"TIMER_DRIVEN\": \"0 sec\"\n+                        },\n+                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n+                        \"defaultYieldDuration\": \"1 sec\",\n                         \"dynamicProperties\": [\n                             {\n-                                \"description\": \"Allows any Spring Vault property keys to be specified, as described in (https://docs.spring.io/spring-vault/docs/2.3.x/reference/html/#vault.core.environment-vault-configuration). See Additional Details for more information.\",\n+                                \"description\": \"These properties will be added on the Kafka configuration after loading any provided configuration properties. In the event a dynamic property represents a property that was already set, its value will be ignored and WARN message logged. For the list of available Kafka properties please refer to: http://kafka.apache.org/documentation.html#configuration.\",\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"name\": \"A Spring Vault configuration property name\",\n-                                \"value\": \"The property value\"\n+                                \"name\": \"The name of a Kafka configuration property.\",\n+                                \"value\": \"The value of a given Kafka configuration property.\"\n                             }\n                         ],\n                         \"group\": \"org.apache.nifi\",\n+                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n+                        \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"configuration-strategy\": {\n+                            \"Commit Offsets\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Use properties, including dynamic properties, configured directly in the Controller Service to configure the client\",\n-                                        \"displayName\": \"Direct Properties\",\n-                                        \"value\": \"direct-properties\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n-                                        \"description\": \"Use one or more '.properties' files to configure the client\",\n-                                        \"displayName\": \"Properties Files\",\n-                                        \"value\": \"properties-files\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"true\",\n+                                \"description\": \"Specifies whether or not this Processor should commit the offsets to Kafka after receiving messages. This value should be false when a PublishKafkaRecord processor is expected to commit the offsets using Exactly Once semantics, and should be reserved for dataflows that are designed to run within Stateless NiFi. See Processor's Usage / Additional Details for more information. Note that setting this value to false can lead to significant data duplication or potentially even data loss if the dataflow is not properly configured.\",\n+                                \"displayName\": \"Commit Offsets\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Commit Offsets\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Communications Timeout\": {\n+                                \"defaultValue\": \"60 secs\",\n+                                \"description\": \"Specifies the timeout that the consumer should use when communicating with the Kafka Broker\",\n+                                \"displayName\": \"Communications Timeout\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Communications Timeout\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"auto.offset.reset\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"Automatically reset the offset to the earliest offset\",\n+                                        \"displayName\": \"earliest\",\n+                                        \"value\": \"earliest\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Automatically reset the offset to the latest offset\",\n+                                        \"displayName\": \"latest\",\n+                                        \"value\": \"latest\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Throw exception to the consumer if no previous offset is found for the consumer's group\",\n+                                        \"displayName\": \"none\",\n+                                        \"value\": \"none\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"latest\",\n+                                \"description\": \"Allows you to manage the condition when there is no initial offset in Kafka or if the current offset does not exist any more on the server (e.g. because that data has been deleted). Corresponds to Kafka's 'auto.offset.reset' property.\",\n+                                \"displayName\": \"Offset Reset\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"auto.offset.reset\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"aws.profile.name\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"AWS_MSK_IAM\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"SASL Mechanism\",\n+                                        \"propertyName\": \"sasl.mechanism\"\n+                                    }\n+                                ],\n+                                \"description\": \"The Amazon Web Services Profile to select when multiple profiles are available.\",\n+                                \"displayName\": \"AWS Profile Name\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"aws.profile.name\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"bootstrap.servers\": {\n+                                \"defaultValue\": \"localhost:9092\",\n+                                \"description\": \"Comma-separated list of Kafka Brokers in the format host:port\",\n+                                \"displayName\": \"Kafka Brokers\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"bootstrap.servers\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"group.id\": {\n+                                \"description\": \"A Group ID is used to identify consumers that are within the same consumer group. Corresponds to Kafka's 'group.id' property.\",\n+                                \"displayName\": \"Group ID\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"group.id\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"header-name-regex\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"USE_VALUE\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Output Strategy\",\n+                                        \"propertyName\": \"output-strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"A Regular Expression that is matched against all message headers. Any message header whose name matches the regex will be added to the FlowFile as an Attribute. If not specified, no Header values will be added as FlowFile attributes. If two messages have a different value for the same header and that header is selected by the provided regex, then those two messages must be added to different FlowFiles. As a result, users should be cautious about using a regex like \\\".*\\\" if messages are expected to have header values that are unique per message, such as an identifier or timestamp, because it will prevent NiFi from bundling the messages together efficiently.\",\n+                                \"displayName\": \"Headers to Add as Attributes (Regex)\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"header-name-regex\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"honor-transactions\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"true\",\n+                                \"description\": \"Specifies whether or not NiFi should honor transactional guarantees when communicating with Kafka. If false, the Processor will use an \\\"isolation level\\\" of read_uncomitted. This means that messages will be received as soon as they are written to Kafka but will be pulled, even if the producer cancels the transactions. If this value is true, NiFi will not receive any messages for which the producer's transaction was canceled, but this can result in some latency since the consumer must wait for the producer to finish its entire transaction instead of pulling as the messages become available.\",\n+                                \"displayName\": \"Honor Transactions\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"honor-transactions\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"kerberos-credentials-service\": {\n+                                \"description\": \"Service supporting generalized credentials authentication with Kerberos\",\n+                                \"displayName\": \"Kerberos Credentials Service\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"kerberos-credentials-service\",\n+                                \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.kerberos.KerberosCredentialsService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"kerberos-user-service\": {\n+                                \"description\": \"Service supporting user authentication with Kerberos\",\n+                                \"displayName\": \"Kerberos User Service\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"kerberos-user-service\",\n+                                \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.kerberos.SelfContainedKerberosUserService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"key-attribute-encoding\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"The key is interpreted as a UTF-8 Encoded string.\",\n+                                        \"displayName\": \"UTF-8 Encoded\",\n+                                        \"value\": \"utf-8\"\n+                                    },\n+                                    {\n+                                        \"description\": \"The key is interpreted as arbitrary binary data and is encoded using hexadecimal characters with uppercase letters\",\n+                                        \"displayName\": \"Hex Encoded\",\n+                                        \"value\": \"hex\"\n+                                    },\n+                                    {\n+                                        \"description\": \"The key will not be added as an Attribute\",\n+                                        \"displayName\": \"Do Not Add Key as Attribute\",\n+                                        \"value\": \"do-not-add\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"utf-8\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"USE_VALUE\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Output Strategy\",\n+                                        \"propertyName\": \"output-strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"If the <Separate By Key> property is set to true, FlowFiles that are emitted have an attribute named 'kafka.key'. This property dictates how the value of the attribute should be encoded.\",\n+                                \"displayName\": \"Key Attribute Encoding\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"key-attribute-encoding\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"key-format\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"Format the Kafka ConsumerRecord key as a UTF-8 string.\",\n+                                        \"displayName\": \"String\",\n+                                        \"value\": \"string\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Format the Kafka ConsumerRecord key as a byte array.\",\n+                                        \"displayName\": \"Byte Array\",\n+                                        \"value\": \"byte-array\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Format the Kafka ConsumerRecord key as a record.\",\n+                                        \"displayName\": \"Record\",\n+                                        \"value\": \"record\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"byte-array\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"USE_WRAPPER\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Output Strategy\",\n+                                        \"propertyName\": \"output-strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"Specifies how to represent the Kafka Record's Key in the output\",\n+                                \"displayName\": \"Key Format\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"key-format\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"key-record-reader\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"record\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Key Format\",\n+                                        \"propertyName\": \"key-format\"\n+                                    }\n+                                ],\n+                                \"description\": \"The Record Reader to use for parsing the Kafka Record's key into a Record\",\n+                                \"displayName\": \"Key Record Reader\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"key-record-reader\",\n+                                \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"max-uncommit-offset-wait\": {\n+                                \"defaultValue\": \"1 secs\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"true\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Commit Offsets\",\n+                                        \"propertyName\": \"Commit Offsets\"\n+                                    }\n+                                ],\n+                                \"description\": \"Specifies the maximum amount of time allowed to pass before offsets must be committed. This value impacts how often offsets will be committed.  Committing offsets less often increases throughput but also increases the window of potential data duplication in the event of a rebalance or JVM restart between commits.  This value is also related to maximum poll records and the use of a message demarcator.  When using a message demarcator we can have far more uncommitted messages than when we're not as there is much less for us to keep track of in memory.\",\n+                                \"displayName\": \"Max Uncommitted Time\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"max-uncommit-offset-wait\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"max.poll.records\": {\n+                                \"defaultValue\": \"10000\",\n+                                \"description\": \"Specifies the maximum number of records Kafka should return in a single poll.\",\n+                                \"displayName\": \"Max Poll Records\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"max.poll.records\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"message-header-encoding\": {\n+                                \"defaultValue\": \"UTF-8\",\n+                                \"description\": \"Any message header that is found on a Kafka message will be added to the outbound FlowFile as an attribute. This property indicates the Character Encoding to use for deserializing the headers.\",\n+                                \"displayName\": \"Message Header Encoding\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"message-header-encoding\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"output-strategy\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"Write only the Kafka Record value to the FlowFile record.\",\n+                                        \"displayName\": \"Use Content as Value\",\n+                                        \"value\": \"USE_VALUE\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Write the Kafka Record key, value, headers, and metadata into the FlowFile record. (See processor usage for more information.)\",\n+                                        \"displayName\": \"Use Wrapper\",\n+                                        \"value\": \"USE_WRAPPER\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"USE_VALUE\",\n+                                \"description\": \"The format used to output the Kafka record into a FlowFile record.\",\n+                                \"displayName\": \"Output Strategy\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"output-strategy\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"record-reader\": {\n+                                \"description\": \"The Record Reader to use for incoming FlowFiles\",\n+                                \"displayName\": \"Value Record Reader\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"record-reader\",\n+                                \"required\": true,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"record-writer\": {\n+                                \"description\": \"The Record Writer to use in order to serialize the data before sending to Kafka\",\n+                                \"displayName\": \"Record Value Writer\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"record-writer\",\n+                                \"required\": true,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"sasl.kerberos.keytab\": {\n+                                \"description\": \"Keytab credentials used for authentication with Kerberos\",\n+                                \"displayName\": \"Kerberos Keytab\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"sasl.kerberos.keytab\",\n+                                \"required\": false,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"SINGLE\",\n+                                    \"resourceTypes\": [\n+                                        \"FILE\"\n+                                    ]\n+                                },\n+                                \"sensitive\": false\n+                            },\n+                            \"sasl.kerberos.principal\": {\n+                                \"description\": \"Principal used for authentication with Kerberos\",\n+                                \"displayName\": \"Kerberos Principal\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"sasl.kerberos.principal\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"sasl.kerberos.service.name\": {\n+                                \"description\": \"The service name that matches the primary name of the Kafka server configured in the broker JAAS configuration\",\n+                                \"displayName\": \"Kerberos Service Name\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"sasl.kerberos.service.name\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"sasl.mechanism\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"General Security Services API for Kerberos authentication\",\n+                                        \"displayName\": \"GSSAPI\",\n+                                        \"value\": \"GSSAPI\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Plain username and password authentication\",\n+                                        \"displayName\": \"PLAIN\",\n+                                        \"value\": \"PLAIN\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Salted Challenge Response Authentication Mechanism using SHA-512 with username and password\",\n+                                        \"displayName\": \"SCRAM-SHA-256\",\n+                                        \"value\": \"SCRAM-SHA-256\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Salted Challenge Response Authentication Mechanism using SHA-256 with username and password\",\n+                                        \"displayName\": \"SCRAM-SHA-512\",\n+                                        \"value\": \"SCRAM-SHA-512\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"GSSAPI\",\n+                                \"description\": \"SASL mechanism used for authentication. Corresponds to Kafka Client sasl.mechanism property\",\n+                                \"displayName\": \"SASL Mechanism\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"sasl.mechanism\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"sasl.password\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"PLAIN\",\n+                                            \"SCRAM-SHA-512\",\n+                                            \"SCRAM-SHA-256\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"SASL Mechanism\",\n+                                        \"propertyName\": \"sasl.mechanism\"\n+                                    }\n+                                ],\n+                                \"description\": \"Password provided with configured username when using PLAIN or SCRAM SASL Mechanisms\",\n+                                \"displayName\": \"Password\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"sasl.password\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n+                            },\n+                            \"sasl.token.auth\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"false\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"SCRAM-SHA-512\",\n+                                            \"SCRAM-SHA-256\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"SASL Mechanism\",\n+                                        \"propertyName\": \"sasl.mechanism\"\n+                                    }\n+                                ],\n+                                \"description\": \"Enables or disables Token authentication when using SCRAM SASL Mechanisms\",\n+                                \"displayName\": \"Token Authentication\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"sasl.token.auth\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"sasl.username\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"PLAIN\",\n+                                            \"SCRAM-SHA-512\",\n+                                            \"SCRAM-SHA-256\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"SASL Mechanism\",\n+                                        \"propertyName\": \"sasl.mechanism\"\n+                                    }\n+                                ],\n+                                \"description\": \"Username provided with configured password when using PLAIN or SCRAM SASL Mechanisms\",\n+                                \"displayName\": \"Username\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"sasl.username\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"security.protocol\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"PLAINTEXT\",\n+                                        \"value\": \"PLAINTEXT\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"SSL\",\n+                                        \"value\": \"SSL\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"SASL_PLAINTEXT\",\n+                                        \"value\": \"SASL_PLAINTEXT\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"SASL_SSL\",\n+                                        \"value\": \"SASL_SSL\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"PLAINTEXT\",\n+                                \"description\": \"Security protocol used to communicate with brokers. Corresponds to Kafka Client security.protocol property\",\n+                                \"displayName\": \"Security Protocol\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"security.protocol\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"separate-by-key\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"If true, two Records will only be added to the same FlowFile if both of the Kafka Messages have identical keys.\",\n+                                \"displayName\": \"Separate By Key\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"separate-by-key\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"ssl.context.service\": {\n+                                \"description\": \"Service supporting SSL communication with Kafka brokers\",\n+                                \"displayName\": \"SSL Context Service\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"ssl.context.service\",\n+                                \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"topic\": {\n+                                \"description\": \"The name of the Kafka Topic(s) to pull from. More than one can be supplied if comma separated.\",\n+                                \"displayName\": \"Topic Name(s)\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"topic\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"topic_type\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"Topic is a full topic name or comma separated list of names\",\n+                                        \"displayName\": \"names\",\n+                                        \"value\": \"names\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Topic is a regex using the Java Pattern syntax\",\n+                                        \"displayName\": \"pattern\",\n+                                        \"value\": \"pattern\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"names\",\n+                                \"description\": \"Specifies whether the Topic(s) provided are a comma separated list of names or a single regular expression\",\n+                                \"displayName\": \"Topic Name Format\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"topic_type\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            }\n+                        },\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.processors.kafka.pubsub.ConsumeKafka_2_6\",\n+                            \"org.apache.nifi.processors.kafka.pubsub.PublishKafkaRecord_2_6\",\n+                            \"org.apache.nifi.processors.kafka.pubsub.PublishKafka_2_6\"\n+                        ],\n+                        \"sideEffectFree\": false,\n+                        \"supportedRelationships\": [\n+                            {\n+                                \"description\": \"FlowFiles received from Kafka.  Depending on demarcation strategy it is a flow file per message or a bundle of messages grouped by topic and partition.\",\n+                                \"name\": \"success\"\n+                            },\n+                            {\n+                                \"description\": \"If a message from Kafka cannot be parsed using the configured Record Reader, the contents of the message will be routed to this Relationship as its own individual FlowFile.\",\n+                                \"name\": \"parse.failure\"\n+                            }\n+                        ],\n+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\"\n+                        ],\n+                        \"supportsBatching\": false,\n+                        \"supportsDynamicProperties\": true,\n+                        \"supportsDynamicRelationships\": false,\n+                        \"supportsEventDriven\": false,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"2.6\",\n+                            \"Consume\",\n+                            \"Get\",\n+                            \"Ingest\",\n+                            \"Ingress\",\n+                            \"Kafka\",\n+                            \"PubSub\",\n+                            \"Record\",\n+                            \"Topic\",\n+                            \"avro\",\n+                            \"csv\",\n+                            \"json\"\n+                        ],\n+                        \"triggerSerially\": false,\n+                        \"triggerWhenAnyDestinationAvailable\": false,\n+                        \"triggerWhenEmpty\": false,\n+                        \"type\": \"org.apache.nifi.processors.kafka.pubsub.ConsumeKafkaRecord_2_6\",\n+                        \"typeDescription\": \"Consumes messages from Apache Kafka specifically built against the Kafka 2.6 Consumer API. The complementary NiFi processor for sending messages is PublishKafkaRecord_2_6. Please note that, at this time, the Processor assumes that all records that are retrieved from a given partition have the same schema. If any of the Kafka messages are pulled but cannot be parsed or written with the configured Record Reader or Record Writer, the contents of the message will be written to a separate FlowFile, and that FlowFile will be transferred to the 'parse.failure' relationship. Otherwise, each FlowFile is sent to the 'success' relationship and may contain many individual messages within the single FlowFile. A 'record.count' attribute is added to indicate how many messages are contained in the FlowFile. No two Kafka messages will be placed into the same FlowFile if they have different schemas, or if they have different values for a message header that is included by the <Headers to Add as Attributes> property.\",\n+                        \"version\": \"1.27.0\",\n+                        \"writesAttributes\": [\n+                            {\n+                                \"description\": \"The number of records received\",\n+                                \"name\": \"record.count\"\n+                            },\n+                            {\n+                                \"description\": \"The MIME Type that is provided by the configured Record Writer\",\n+                                \"name\": \"mime.type\"\n+                            },\n+                            {\n+                                \"description\": \"The partition of the topic the records are from\",\n+                                \"name\": \"kafka.partition\"\n+                            },\n+                            {\n+                                \"description\": \"The timestamp of the message in the partition of the topic.\",\n+                                \"name\": \"kafka.timestamp\"\n+                            },\n+                            {\n+                                \"description\": \"The topic records are from\",\n+                                \"name\": \"kafka.topic\"\n+                            }\n+                        ]\n+                    },\n+                    {\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-kafka-2-6-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"e0c4461\"\n+                        },\n+                        \"defaultBulletinLevel\": \"WARN\",\n+                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": 1,\n+                            \"TIMER_DRIVEN\": 1\n+                        },\n+                        \"defaultPenaltyDuration\": \"30 sec\",\n+                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": \"* * * * * ?\",\n+                            \"TIMER_DRIVEN\": \"0 sec\"\n+                        },\n+                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n+                        \"defaultYieldDuration\": \"1 sec\",\n+                        \"dynamicProperties\": [\n+                            {\n+                                \"description\": \"These properties will be added on the Kafka configuration after loading any provided configuration properties. In the event a dynamic property represents a property that was already set, its value will be ignored and WARN message logged. For the list of available Kafka properties please refer to: http://kafka.apache.org/documentation.html#configuration. \",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"name\": \"The name of a Kafka configuration property.\",\n+                                \"value\": \"The value of a given Kafka configuration property.\"\n+                            }\n+                        ],\n+                        \"group\": \"org.apache.nifi\",\n+                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n+                        \"primaryNodeOnly\": false,\n+                        \"propertyDescriptors\": {\n+                            \"Commit Offsets\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"true\",\n+                                \"description\": \"Specifies whether or not this Processor should commit the offsets to Kafka after receiving messages. Typically, we want this value set to true so that messages that are received are not duplicated. However, in certain scenarios, we may want to avoid committing the offsets, that the data can be processed and later acknowledged by PublishKafkaRecord in order to provide Exactly Once semantics. See Processor's Usage / Additional Details for more information.\",\n+                                \"displayName\": \"Commit Offsets\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Commit Offsets\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Communications Timeout\": {\n+                                \"defaultValue\": \"60 secs\",\n+                                \"description\": \"Specifies the timeout that the consumer should use when communicating with the Kafka Broker\",\n+                                \"displayName\": \"Communications Timeout\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Communications Timeout\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"auto.offset.reset\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"Automatically reset the offset to the earliest offset\",\n+                                        \"displayName\": \"earliest\",\n+                                        \"value\": \"earliest\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Automatically reset the offset to the latest offset\",\n+                                        \"displayName\": \"latest\",\n+                                        \"value\": \"latest\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Throw exception to the consumer if no previous offset is found for the consumer's group\",\n+                                        \"displayName\": \"none\",\n+                                        \"value\": \"none\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"latest\",\n+                                \"description\": \"Allows you to manage the condition when there is no initial offset in Kafka or if the current offset does not exist any more on the server (e.g. because that data has been deleted). Corresponds to Kafka's 'auto.offset.reset' property.\",\n+                                \"displayName\": \"Offset Reset\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"auto.offset.reset\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"aws.profile.name\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"AWS_MSK_IAM\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"SASL Mechanism\",\n+                                        \"propertyName\": \"sasl.mechanism\"\n+                                    }\n+                                ],\n+                                \"description\": \"The Amazon Web Services Profile to select when multiple profiles are available.\",\n+                                \"displayName\": \"AWS Profile Name\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"aws.profile.name\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"bootstrap.servers\": {\n+                                \"defaultValue\": \"localhost:9092\",\n+                                \"description\": \"Comma-separated list of Kafka Brokers in the format host:port\",\n+                                \"displayName\": \"Kafka Brokers\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"bootstrap.servers\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"group.id\": {\n+                                \"description\": \"A Group ID is used to identify consumers that are within the same consumer group. Corresponds to Kafka's 'group.id' property.\",\n+                                \"displayName\": \"Group ID\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"group.id\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"header-name-regex\": {\n+                                \"description\": \"A Regular Expression that is matched against all message headers. Any message header whose name matches the regex will be added to the FlowFile as an Attribute. If not specified, no Header values will be added as FlowFile attributes. If two messages have a different value for the same header and that header is selected by the provided regex, then those two messages must be added to different FlowFiles. As a result, users should be cautious about using a regex like \\\".*\\\" if messages are expected to have header values that are unique per message, such as an identifier or timestamp, because it will prevent NiFi from bundling the messages together efficiently.\",\n+                                \"displayName\": \"Headers to Add as Attributes (Regex)\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"header-name-regex\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"honor-transactions\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"true\",\n+                                \"description\": \"Specifies whether or not NiFi should honor transactional guarantees when communicating with Kafka. If false, the Processor will use an \\\"isolation level\\\" of read_uncomitted. This means that messages will be received as soon as they are written to Kafka but will be pulled, even if the producer cancels the transactions. If this value is true, NiFi will not receive any messages for which the producer's transaction was canceled, but this can result in some latency since the consumer must wait for the producer to finish its entire transaction instead of pulling as the messages become available.\",\n+                                \"displayName\": \"Honor Transactions\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"honor-transactions\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"kerberos-credentials-service\": {\n+                                \"description\": \"Service supporting generalized credentials authentication with Kerberos\",\n+                                \"displayName\": \"Kerberos Credentials Service\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"kerberos-credentials-service\",\n+                                \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.kerberos.KerberosCredentialsService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"kerberos-user-service\": {\n+                                \"description\": \"Service supporting user authentication with Kerberos\",\n+                                \"displayName\": \"Kerberos User Service\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"kerberos-user-service\",\n+                                \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.kerberos.SelfContainedKerberosUserService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"key-attribute-encoding\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"The key is interpreted as a UTF-8 Encoded string.\",\n+                                        \"displayName\": \"UTF-8 Encoded\",\n+                                        \"value\": \"utf-8\"\n+                                    },\n+                                    {\n+                                        \"description\": \"The key is interpreted as arbitrary binary data and is encoded using hexadecimal characters with uppercase letters\",\n+                                        \"displayName\": \"Hex Encoded\",\n+                                        \"value\": \"hex\"\n+                                    },\n+                                    {\n+                                        \"description\": \"The key will not be added as an Attribute\",\n+                                        \"displayName\": \"Do Not Add Key as Attribute\",\n+                                        \"value\": \"do-not-add\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"utf-8\",\n+                                \"description\": \"FlowFiles that are emitted have an attribute named 'kafka.key'. This property dictates how the value of the attribute should be encoded.\",\n+                                \"displayName\": \"Key Attribute Encoding\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"key-attribute-encoding\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"max-uncommit-offset-wait\": {\n+                                \"defaultValue\": \"1 secs\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"true\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Commit Offsets\",\n+                                        \"propertyName\": \"Commit Offsets\"\n+                                    }\n+                                ],\n+                                \"description\": \"Specifies the maximum amount of time allowed to pass before offsets must be committed. This value impacts how often offsets will be committed.  Committing offsets less often increases throughput but also increases the window of potential data duplication in the event of a rebalance or JVM restart between commits.  This value is also related to maximum poll records and the use of a message demarcator.  When using a message demarcator we can have far more uncommitted messages than when we're not as there is much less for us to keep track of in memory.\",\n+                                \"displayName\": \"Max Uncommitted Time\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"max-uncommit-offset-wait\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"max.poll.records\": {\n+                                \"defaultValue\": \"10000\",\n+                                \"description\": \"Specifies the maximum number of records Kafka should return in a single poll.\",\n+                                \"displayName\": \"Max Poll Records\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"max.poll.records\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"message-demarcator\": {\n+                                \"description\": \"Since KafkaConsumer receives messages in batches, you have an option to output FlowFiles which contains all Kafka messages in a single batch for a given topic and partition and this property allows you to provide a string (interpreted as UTF-8) to use for demarcating apart multiple Kafka messages. This is an optional property and if not provided each Kafka message received will result in a single FlowFile which  time it is triggered. To enter special character such as 'new line' use CTRL+Enter or Shift+Enter depending on the OS\",\n+                                \"displayName\": \"Message Demarcator\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"message-demarcator\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"message-header-encoding\": {\n+                                \"defaultValue\": \"UTF-8\",\n+                                \"description\": \"Any message header that is found on a Kafka message will be added to the outbound FlowFile as an attribute. This property indicates the Character Encoding to use for deserializing the headers.\",\n+                                \"displayName\": \"Message Header Encoding\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"message-header-encoding\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"sasl.kerberos.keytab\": {\n+                                \"description\": \"Keytab credentials used for authentication with Kerberos\",\n+                                \"displayName\": \"Kerberos Keytab\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"sasl.kerberos.keytab\",\n+                                \"required\": false,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"SINGLE\",\n+                                    \"resourceTypes\": [\n+                                        \"FILE\"\n+                                    ]\n+                                },\n+                                \"sensitive\": false\n+                            },\n+                            \"sasl.kerberos.principal\": {\n+                                \"description\": \"Principal used for authentication with Kerberos\",\n+                                \"displayName\": \"Kerberos Principal\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"sasl.kerberos.principal\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"sasl.kerberos.service.name\": {\n+                                \"description\": \"The service name that matches the primary name of the Kafka server configured in the broker JAAS configuration\",\n+                                \"displayName\": \"Kerberos Service Name\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"sasl.kerberos.service.name\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"sasl.mechanism\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"General Security Services API for Kerberos authentication\",\n+                                        \"displayName\": \"GSSAPI\",\n+                                        \"value\": \"GSSAPI\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Plain username and password authentication\",\n+                                        \"displayName\": \"PLAIN\",\n+                                        \"value\": \"PLAIN\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Salted Challenge Response Authentication Mechanism using SHA-512 with username and password\",\n+                                        \"displayName\": \"SCRAM-SHA-256\",\n+                                        \"value\": \"SCRAM-SHA-256\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Salted Challenge Response Authentication Mechanism using SHA-256 with username and password\",\n+                                        \"displayName\": \"SCRAM-SHA-512\",\n+                                        \"value\": \"SCRAM-SHA-512\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"GSSAPI\",\n+                                \"description\": \"SASL mechanism used for authentication. Corresponds to Kafka Client sasl.mechanism property\",\n+                                \"displayName\": \"SASL Mechanism\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"sasl.mechanism\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"sasl.password\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"PLAIN\",\n+                                            \"SCRAM-SHA-512\",\n+                                            \"SCRAM-SHA-256\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"SASL Mechanism\",\n+                                        \"propertyName\": \"sasl.mechanism\"\n+                                    }\n+                                ],\n+                                \"description\": \"Password provided with configured username when using PLAIN or SCRAM SASL Mechanisms\",\n+                                \"displayName\": \"Password\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"sasl.password\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n+                            },\n+                            \"sasl.token.auth\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"false\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"SCRAM-SHA-512\",\n+                                            \"SCRAM-SHA-256\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"SASL Mechanism\",\n+                                        \"propertyName\": \"sasl.mechanism\"\n+                                    }\n+                                ],\n+                                \"description\": \"Enables or disables Token authentication when using SCRAM SASL Mechanisms\",\n+                                \"displayName\": \"Token Authentication\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"sasl.token.auth\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"sasl.username\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"PLAIN\",\n+                                            \"SCRAM-SHA-512\",\n+                                            \"SCRAM-SHA-256\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"SASL Mechanism\",\n+                                        \"propertyName\": \"sasl.mechanism\"\n+                                    }\n+                                ],\n+                                \"description\": \"Username provided with configured password when using PLAIN or SCRAM SASL Mechanisms\",\n+                                \"displayName\": \"Username\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"sasl.username\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"security.protocol\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"PLAINTEXT\",\n+                                        \"value\": \"PLAINTEXT\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"SSL\",\n+                                        \"value\": \"SSL\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"SASL_PLAINTEXT\",\n+                                        \"value\": \"SASL_PLAINTEXT\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"SASL_SSL\",\n+                                        \"value\": \"SASL_SSL\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"PLAINTEXT\",\n+                                \"description\": \"Security protocol used to communicate with brokers. Corresponds to Kafka Client security.protocol property\",\n+                                \"displayName\": \"Security Protocol\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"security.protocol\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"separate-by-key\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"If true, and the <Message Demarcator> property is set, two messages will only be added to the same FlowFile if both of the Kafka Messages have identical keys.\",\n+                                \"displayName\": \"Separate By Key\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"separate-by-key\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"ssl.context.service\": {\n+                                \"description\": \"Service supporting SSL communication with Kafka brokers\",\n+                                \"displayName\": \"SSL Context Service\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"ssl.context.service\",\n+                                \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"topic\": {\n+                                \"description\": \"The name of the Kafka Topic(s) to pull from. More than one can be supplied if comma separated.\",\n+                                \"displayName\": \"Topic Name(s)\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"topic\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"topic_type\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"Topic is a full topic name or comma separated list of names\",\n+                                        \"displayName\": \"names\",\n+                                        \"value\": \"names\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Topic is a regex using the Java Pattern syntax\",\n+                                        \"displayName\": \"pattern\",\n+                                        \"value\": \"pattern\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"names\",\n+                                \"description\": \"Specifies whether the Topic(s) provided are a comma separated list of names or a single regular expression\",\n+                                \"displayName\": \"Topic Name Format\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"topic_type\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            }\n+                        },\n+                        \"sideEffectFree\": false,\n+                        \"supportedRelationships\": [\n+                            {\n+                                \"description\": \"FlowFiles received from Kafka. Depending on demarcation strategy it is a flow file per message or a bundle of messages grouped by topic and partition.\",\n+                                \"name\": \"success\"\n+                            }\n+                        ],\n+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\"\n+                        ],\n+                        \"supportsBatching\": false,\n+                        \"supportsDynamicProperties\": true,\n+                        \"supportsDynamicRelationships\": false,\n+                        \"supportsEventDriven\": false,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"2.6\",\n+                            \"Consume\",\n+                            \"Get\",\n+                            \"Ingest\",\n+                            \"Ingress\",\n+                            \"Kafka\",\n+                            \"PubSub\",\n+                            \"Topic\"\n+                        ],\n+                        \"triggerSerially\": false,\n+                        \"triggerWhenAnyDestinationAvailable\": false,\n+                        \"triggerWhenEmpty\": false,\n+                        \"type\": \"org.apache.nifi.processors.kafka.pubsub.ConsumeKafka_2_6\",\n+                        \"typeDescription\": \"Consumes messages from Apache Kafka specifically built against the Kafka 2.6 Consumer API. The complementary NiFi processor for sending messages is PublishKafka_2_6.\",\n+                        \"version\": \"1.27.0\",\n+                        \"writesAttributes\": [\n+                            {\n+                                \"description\": \"The number of messages written if more than one\",\n+                                \"name\": \"kafka.count\"\n+                            },\n+                            {\n+                                \"description\": \"The key of message if present and if single message. How the key is encoded depends on the value of the 'Key Attribute Encoding' property.\",\n+                                \"name\": \"kafka.key\"\n+                            },\n+                            {\n+                                \"description\": \"The offset of the message in the partition of the topic.\",\n+                                \"name\": \"kafka.offset\"\n+                            },\n+                            {\n+                                \"description\": \"The timestamp of the message in the partition of the topic.\",\n+                                \"name\": \"kafka.timestamp\"\n+                            },\n+                            {\n+                                \"description\": \"The partition of the topic the message or message bundle is from\",\n+                                \"name\": \"kafka.partition\"\n+                            },\n+                            {\n+                                \"description\": \"The topic the message or message bundle is from\",\n+                                \"name\": \"kafka.topic\"\n+                            },\n+                            {\n+                                \"description\": \"Set to true if the consumed message is a tombstone message\",\n+                                \"name\": \"kafka.tombstone\"\n+                            }\n+                        ]\n+                    },\n+                    {\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-kafka-2-6-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"e0c4461\"\n+                        },\n+                        \"defaultBulletinLevel\": \"WARN\",\n+                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": 1,\n+                            \"TIMER_DRIVEN\": 1\n+                        },\n+                        \"defaultPenaltyDuration\": \"30 sec\",\n+                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": \"* * * * * ?\",\n+                            \"TIMER_DRIVEN\": \"0 sec\"\n+                        },\n+                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n+                        \"defaultYieldDuration\": \"1 sec\",\n+                        \"dynamicProperties\": [\n+                            {\n+                                \"description\": \"These properties will be added on the Kafka configuration after loading any provided configuration properties. In the event a dynamic property represents a property that was already set, its value will be ignored and WARN message logged. For the list of available Kafka properties please refer to: http://kafka.apache.org/documentation.html#configuration. \",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"name\": \"The name of a Kafka configuration property.\",\n+                                \"value\": \"The value of a given Kafka configuration property.\"\n+                            }\n+                        ],\n+                        \"group\": \"org.apache.nifi\",\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n+                        \"primaryNodeOnly\": false,\n+                        \"propertyDescriptors\": {\n+                            \"Failure Strategy\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"When unable to publish records to Kafka, the FlowFile will be routed to the failure relationship.\",\n+                                        \"displayName\": \"Route to Failure\",\n+                                        \"value\": \"Route to Failure\"\n+                                    },\n+                                    {\n+                                        \"description\": \"When unable to publish records to Kafka, the FlowFile will be placed back on the queue so that it will be retried. For flows where FlowFile ordering is important, this strategy can be used along with ensuring that the each processor uses only a single Concurrent Task.\",\n+                                        \"displayName\": \"Rollback\",\n+                                        \"value\": \"Rollback\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"Route to Failure\",\n+                                \"description\": \"Specifies how the processor handles a FlowFile if it is unable to publish the data to Kafka\",\n+                                \"displayName\": \"Failure Strategy\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Failure Strategy\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Record Metadata Strategy\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"The Kafka Record's Topic will be determined using the 'Topic Name' processor property. The partition will be determined using the 'Partition' and 'Partitioner class' properties.\",\n+                                        \"displayName\": \"Use Configured Values\",\n+                                        \"value\": \"Use Configured Values\"\n+                                    },\n+                                    {\n+                                        \"description\": \"The Kafka Record's Topic and Partition will be determined by looking at the /metadata/topic and /metadata/partition fields of the Record, respectively. If these fields are invalid or not present, the Topic Name and Partition/Partitioner class properties of the processor will be considered.\",\n+                                        \"displayName\": \"Metadata From Record\",\n+                                        \"value\": \"Metadata From Record\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"Use Configured Values\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"USE_WRAPPER\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Publish Strategy\",\n+                                        \"propertyName\": \"publish-strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"Specifies whether the Record's metadata (topic and partition) should come from the Record's metadata field or if it should come from the configured Topic Name and Partition / Partitioner class properties\",\n+                                \"displayName\": \"Record Metadata Strategy\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Record Metadata Strategy\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"ack.wait.time\": {\n+                                \"defaultValue\": \"5 secs\",\n+                                \"description\": \"After sending a message to Kafka, this indicates the amount of time that we are willing to wait for a response from Kafka. If Kafka does not acknowledge the message within this time period, the FlowFile will be routed to 'failure'.\",\n+                                \"displayName\": \"Acknowledgment Wait Time\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"ack.wait.time\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"acks\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"FlowFile will be routed to success after successfully sending the content to a Kafka node, without waiting for any acknowledgment from the node at all. This provides the best performance but may result in data loss.\",\n+                                        \"displayName\": \"Best Effort\",\n+                                        \"value\": \"0\"\n+                                    },\n+                                    {\n+                                        \"description\": \"FlowFile will be routed to success if the message is received by a single Kafka node, whether or not it is replicated. This is faster than <Guarantee Replicated Delivery> but can result in data loss if a Kafka node crashes\",\n+                                        \"displayName\": \"Guarantee Single Node Delivery\",\n+                                        \"value\": \"1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"FlowFile will be routed to failure unless the message is replicated to the appropriate number of Kafka Nodes according to the Topic configuration\",\n+                                        \"displayName\": \"Guarantee Replicated Delivery\",\n+                                        \"value\": \"all\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"all\",\n+                                \"description\": \"Specifies the requirement for guaranteeing that a message is sent to Kafka. Corresponds to Kafka's 'acks' property.\",\n+                                \"displayName\": \"Delivery Guarantee\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"acks\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"attribute-name-regex\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"USE_VALUE\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Publish Strategy\",\n+                                        \"propertyName\": \"publish-strategy\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"direct-properties\",\n-                                \"description\": \"Specifies the source of the configuration properties.\",\n-                                \"displayName\": \"Configuration Strategy\",\n+                                \"description\": \"A Regular Expression that is matched against all FlowFile attribute names. Any attribute whose name matches the regex will be added to the Kafka messages as a Header. If not specified, no FlowFile attributes will be added as headers.\",\n+                                \"displayName\": \"Attributes to Send as Headers (Regex)\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"configuration-strategy\",\n+                                \"name\": \"attribute-name-regex\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"aws.profile.name\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"AWS_MSK_IAM\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"SASL Mechanism\",\n+                                        \"propertyName\": \"sasl.mechanism\"\n+                                    }\n+                                ],\n+                                \"description\": \"The Amazon Web Services Profile to select when multiple profiles are available.\",\n+                                \"displayName\": \"AWS Profile Name\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"aws.profile.name\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"bootstrap.servers\": {\n+                                \"defaultValue\": \"localhost:9092\",\n+                                \"description\": \"Comma-separated list of Kafka Brokers in the format host:port\",\n+                                \"displayName\": \"Kafka Brokers\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"bootstrap.servers\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"vault.authentication\": {\n+                            \"compression.type\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"TOKEN\",\n-                                        \"value\": \"TOKEN\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"APPID\",\n-                                        \"value\": \"APPID\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"APPROLE\",\n-                                        \"value\": \"APPROLE\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"AWS_EC2\",\n-                                        \"value\": \"AWS_EC2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"AZURE\",\n-                                        \"value\": \"AZURE\"\n+                                        \"displayName\": \"none\",\n+                                        \"value\": \"none\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"CERT\",\n-                                        \"value\": \"CERT\"\n+                                        \"displayName\": \"gzip\",\n+                                        \"value\": \"gzip\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"CUBBYHOLE\",\n-                                        \"value\": \"CUBBYHOLE\"\n+                                        \"displayName\": \"snappy\",\n+                                        \"value\": \"snappy\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"KUBERNETES\",\n-                                        \"value\": \"KUBERNETES\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"TOKEN\",\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"direct-properties\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Configuration Strategy\",\n-                                        \"propertyName\": \"configuration-strategy\"\n+                                        \"displayName\": \"lz4\",\n+                                        \"value\": \"lz4\"\n                                     }\n                                 ],\n-                                \"description\": \"Vault authentication method, as described in the Spring Vault Environment Configuration documentation (https://docs.spring.io/spring-vault/docs/2.3.x/reference/html/#vault.core.environment-vault-configuration).\",\n-                                \"displayName\": \"Vault Authentication\",\n+                                \"defaultValue\": \"none\",\n+                                \"description\": \"This parameter allows you to specify the compression codec for all data generated by this producer.\",\n+                                \"displayName\": \"Compression Type\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"vault.authentication\",\n+                                \"name\": \"compression.type\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"vault.connection.timeout\": {\n-                                \"defaultValue\": \"5 sec\",\n-                                \"description\": \"The connection timeout for the HashiCorp Vault client\",\n-                                \"displayName\": \"Connection Timeout\",\n+                            \"kerberos-credentials-service\": {\n+                                \"description\": \"Service supporting generalized credentials authentication with Kerberos\",\n+                                \"displayName\": \"Kerberos Credentials Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"vault.connection.timeout\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n+                                \"name\": \"kerberos-credentials-service\",\n+                                \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.kerberos.KerberosCredentialsService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n                             },\n-                            \"vault.properties.files\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"properties-files\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Configuration Strategy\",\n-                                        \"propertyName\": \"configuration-strategy\"\n-                                    }\n-                                ],\n-                                \"description\": \"A comma-separated list of files containing HashiCorp Vault configuration properties, as described in the Spring Vault Environment Configuration documentation (https://docs.spring.io/spring-vault/docs/2.3.x/reference/html/#vault.core.environment-vault-configuration). All of the Spring property keys and authentication-specific property keys are supported.\",\n-                                \"displayName\": \"Vault Properties Files\",\n+                            \"kerberos-user-service\": {\n+                                \"description\": \"Service supporting user authentication with Kerberos\",\n+                                \"displayName\": \"Kerberos User Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"vault.properties.files\",\n+                                \"name\": \"kerberos-user-service\",\n+                                \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.kerberos.SelfContainedKerberosUserService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"max.block.ms\": {\n+                                \"defaultValue\": \"5 sec\",\n+                                \"description\": \"The amount of time publisher will wait to obtain metadata or wait for the buffer to flush during the 'send' call before failing the entire 'send' call. Corresponds to Kafka's 'max.block.ms' property\",\n+                                \"displayName\": \"Max Metadata Wait Time\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"max.block.ms\",\n                                 \"required\": true,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"MULTIPLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\"\n-                                    ]\n-                                },\n                                 \"sensitive\": false\n                             },\n-                            \"vault.read.timeout\": {\n-                                \"defaultValue\": \"15 sec\",\n-                                \"description\": \"The read timeout for the HashiCorp Vault client\",\n-                                \"displayName\": \"Read Timeout\",\n+                            \"max.request.size\": {\n+                                \"defaultValue\": \"1 MB\",\n+                                \"description\": \"The maximum size of a request in bytes. Corresponds to Kafka's 'max.request.size' property and defaults to 1 MB (1048576).\",\n+                                \"displayName\": \"Max Request Size\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"vault.read.timeout\",\n+                                \"name\": \"max.request.size\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"vault.ssl.context.service\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"direct-properties\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Configuration Strategy\",\n-                                        \"propertyName\": \"configuration-strategy\"\n-                                    }\n-                                ],\n-                                \"description\": \"The SSL Context Service used to provide client certificate information for TLS/SSL connections to the HashiCorp Vault server.\",\n-                                \"displayName\": \"SSL Context Service\",\n+                            \"message-header-encoding\": {\n+                                \"defaultValue\": \"UTF-8\",\n+                                \"description\": \"For any attribute that is added as a message header, as configured via the <Attributes to Send as Headers> property, this property indicates the Character Encoding to use for serializing the headers.\",\n+                                \"displayName\": \"Message Header Encoding\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"vault.ssl.context.service\",\n+                                \"name\": \"message-header-encoding\",\n                                 \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n+                                \"sensitive\": false\n                             },\n-                            \"vault.uri\": {\n+                            \"message-key-field\": {\n                                 \"dependencies\": [\n                                     {\n                                         \"dependentValues\": [\n-                                            \"direct-properties\"\n+                                            \"USE_VALUE\"\n                                         ],\n-                                        \"propertyDisplayName\": \"Configuration Strategy\",\n-                                        \"propertyName\": \"configuration-strategy\"\n+                                        \"propertyDisplayName\": \"Publish Strategy\",\n+                                        \"propertyName\": \"publish-strategy\"\n                                     }\n                                 ],\n-                                \"description\": \"The URI of the HashiCorp Vault server (e.g., http://localhost:8200).  Required if not specified in the Bootstrap HashiCorp Vault Configuration File.\",\n-                                \"displayName\": \"Vault URI\",\n+                                \"description\": \"The name of a field in the Input Records that should be used as the Key for the Kafka message.\",\n+                                \"displayName\": \"Message Key Field\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"vault.uri\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"message-key-field\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n-                            }\n-                        },\n-                        \"providedApiImplementations\": [\n-                            {\n-                                \"artifact\": \"nifi-hashicorp-vault-client-service-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.vault.hashicorp.HashiCorpVaultClientService\",\n-                                \"version\": \"1.27.0\"\n-                            }\n-                        ],\n-                        \"supportsDynamicProperties\": true,\n-                        \"supportsSensitiveDynamicProperties\": true,\n-                        \"tags\": [\n-                            \"client\",\n-                            \"hashicorp\",\n-                            \"vault\"\n-                        ],\n-                        \"type\": \"org.apache.nifi.vault.hashicorp.StandardHashiCorpVaultClientService\",\n-                        \"typeDescription\": \"A controller service for interacting with HashiCorp Vault.\",\n-                        \"version\": \"1.27.0\"\n-                    }\n-                ],\n-                \"processors\": [],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"1.27.0\"\n-        },\n-        {\n-            \"artifact\": \"nifi-confluent-platform-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-confluent-platform-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"e0c4461\"\n-                        },\n-                        \"dynamicProperties\": [\n-                            {\n-                                \"description\": \"Properties that begin with 'request.header.' are populated into a map and passed as http headers in REST requests to the Confluent Schema Registry\",\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"name\": \"request.header.*\",\n-                                \"value\": \"String literal, may not be empty\"\n-                            }\n-                        ],\n-                        \"group\": \"org.apache.nifi\",\n-                        \"propertyDescriptors\": {\n-                            \"authentication-type\": {\n+                            },\n+                            \"partition\": {\n+                                \"description\": \"Specifies which Partition Records will go to. How this value is interpreted is dictated by the <Partitioner class> property.\",\n+                                \"displayName\": \"Partition\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"partition\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"partitioner.class\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"BASIC\",\n-                                        \"value\": \"BASIC\"\n+                                        \"description\": \"Messages will be assigned partitions in a round-robin fashion, sending the first message to Partition 1, the next Partition to Partition 2, and so on, wrapping as necessary.\",\n+                                        \"displayName\": \"RoundRobinPartitioner\",\n+                                        \"value\": \"org.apache.nifi.processors.kafka.pubsub.Partitioners$RoundRobinPartitioner\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"NONE\",\n-                                        \"value\": \"NONE\"\n+                                        \"description\": \"The default partitioning strategy will choose the sticky partition that changes when the batch is full (See KIP-480 for details about sticky partitioning).\",\n+                                        \"displayName\": \"DefaultPartitioner\",\n+                                        \"value\": \"org.apache.kafka.clients.producer.internals.DefaultPartitioner\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Interprets the <Partition> property as a RecordPath that will be evaluated against each Record to determine which partition the Record will go to. All Records that have the same value for the given RecordPath will go to the same Partition.\",\n+                                        \"displayName\": \"RecordPath Partitioner\",\n+                                        \"value\": \"org.apache.nifi.processors.kafka.pubsub.Partitioners$RecordPathPartitioner\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Interprets the <Partition> property as Expression Language that will be evaluated against each FlowFile. This Expression will be evaluated once against the FlowFile, so all Records in a given FlowFile will go to the same partition.\",\n+                                        \"displayName\": \"Expression Language Partitioner\",\n+                                        \"value\": \"org.apache.nifi.processors.kafka.pubsub.Partitioners$ExpressionLanguagePartitioner\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"NONE\",\n-                                \"description\": \"HTTP Client Authentication Type for Confluent Schema Registry\",\n-                                \"displayName\": \"Authentication Type\",\n+                                \"defaultValue\": \"org.apache.kafka.clients.producer.internals.DefaultPartitioner\",\n+                                \"description\": \"Specifies which class to use to compute a partition id for a message. Corresponds to Kafka's 'partitioner.class' property.\",\n+                                \"displayName\": \"Partitioner class\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"authentication-type\",\n+                                \"name\": \"partitioner.class\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"cache-expiration\": {\n-                                \"defaultValue\": \"1 hour\",\n-                                \"description\": \"Specifies how long a Schema that is cached should remain in the cache. Once this time period elapses, a cached version of a schema will no longer be used, and the service will have to communicate with the Schema Registry again in order to obtain the schema.\",\n-                                \"displayName\": \"Cache Expiration\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"cache-expiration\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"cache-size\": {\n-                                \"defaultValue\": \"1000\",\n-                                \"description\": \"Specifies how many Schemas should be cached from the Schema Registry\",\n-                                \"displayName\": \"Cache Size\",\n+                            \"publish-strategy\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"Write only the FlowFile content to the Kafka Record value.\",\n+                                        \"displayName\": \"Use Content as Record Value\",\n+                                        \"value\": \"USE_VALUE\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Write the Kafka Record key, value, headers, and metadata into the Kafka Record value.  (See processor usage for more information.)\",\n+                                        \"displayName\": \"Use Wrapper\",\n+                                        \"value\": \"USE_WRAPPER\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"USE_VALUE\",\n+                                \"description\": \"The format used to publish the incoming FlowFile record to Kafka.\",\n+                                \"displayName\": \"Publish Strategy\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"cache-size\",\n+                                \"name\": \"publish-strategy\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"password\": {\n+                            \"record-key-writer\": {\n                                 \"dependencies\": [\n                                     {\n                                         \"dependentValues\": [\n-                                            \"BASIC\"\n+                                            \"USE_WRAPPER\"\n                                         ],\n-                                        \"propertyDisplayName\": \"Authentication Type\",\n-                                        \"propertyName\": \"authentication-type\"\n+                                        \"propertyDisplayName\": \"Publish Strategy\",\n+                                        \"propertyName\": \"publish-strategy\"\n                                     }\n                                 ],\n-                                \"description\": \"Password for authentication to Confluent Schema Registry\",\n-                                \"displayName\": \"Password\",\n+                                \"description\": \"The Record Key Writer to use for outgoing FlowFiles\",\n+                                \"displayName\": \"Record Key Writer\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"password\",\n+                                \"name\": \"record-key-writer\",\n                                 \"required\": false,\n-                                \"sensitive\": true\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n                             },\n-                            \"ssl-context\": {\n-                                \"description\": \"Specifies the SSL Context Service to use for interacting with the Confluent Schema Registry\",\n-                                \"displayName\": \"SSL Context Service\",\n+                            \"record-reader\": {\n+                                \"description\": \"The Record Reader to use for incoming FlowFiles\",\n+                                \"displayName\": \"Record Reader\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"ssl-context\",\n-                                \"required\": false,\n+                                \"name\": \"record-reader\",\n+                                \"required\": true,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n                                     \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n+                                    \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             },\n-                            \"timeout\": {\n-                                \"defaultValue\": \"30 secs\",\n-                                \"description\": \"Specifies how long to wait to receive data from the Schema Registry before considering the communications a failure\",\n-                                \"displayName\": \"Communications Timeout\",\n+                            \"record-writer\": {\n+                                \"description\": \"The Record Writer to use in order to serialize the data before sending to Kafka\",\n+                                \"displayName\": \"Record Writer\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"timeout\",\n+                                \"name\": \"record-writer\",\n                                 \"required\": true,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"sasl.kerberos.keytab\": {\n+                                \"description\": \"Keytab credentials used for authentication with Kerberos\",\n+                                \"displayName\": \"Kerberos Keytab\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"sasl.kerberos.keytab\",\n+                                \"required\": false,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"SINGLE\",\n+                                    \"resourceTypes\": [\n+                                        \"FILE\"\n+                                    ]\n+                                },\n                                 \"sensitive\": false\n                             },\n-                            \"url\": {\n-                                \"defaultValue\": \"http://localhost:8081\",\n-                                \"description\": \"A comma-separated list of URLs of the Schema Registry to interact with\",\n-                                \"displayName\": \"Schema Registry URLs\",\n+                            \"sasl.kerberos.principal\": {\n+                                \"description\": \"Principal used for authentication with Kerberos\",\n+                                \"displayName\": \"Kerberos Principal\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"url\",\n+                                \"name\": \"sasl.kerberos.principal\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"sasl.kerberos.service.name\": {\n+                                \"description\": \"The service name that matches the primary name of the Kafka server configured in the broker JAAS configuration\",\n+                                \"displayName\": \"Kerberos Service Name\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"sasl.kerberos.service.name\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"sasl.mechanism\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"General Security Services API for Kerberos authentication\",\n+                                        \"displayName\": \"GSSAPI\",\n+                                        \"value\": \"GSSAPI\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Plain username and password authentication\",\n+                                        \"displayName\": \"PLAIN\",\n+                                        \"value\": \"PLAIN\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Salted Challenge Response Authentication Mechanism using SHA-512 with username and password\",\n+                                        \"displayName\": \"SCRAM-SHA-256\",\n+                                        \"value\": \"SCRAM-SHA-256\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Salted Challenge Response Authentication Mechanism using SHA-256 with username and password\",\n+                                        \"displayName\": \"SCRAM-SHA-512\",\n+                                        \"value\": \"SCRAM-SHA-512\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"GSSAPI\",\n+                                \"description\": \"SASL mechanism used for authentication. Corresponds to Kafka Client sasl.mechanism property\",\n+                                \"displayName\": \"SASL Mechanism\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"sasl.mechanism\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"username\": {\n+                            \"sasl.password\": {\n                                 \"dependencies\": [\n                                     {\n                                         \"dependentValues\": [\n-                                            \"BASIC\"\n+                                            \"PLAIN\",\n+                                            \"SCRAM-SHA-512\",\n+                                            \"SCRAM-SHA-256\"\n                                         ],\n-                                        \"propertyDisplayName\": \"Authentication Type\",\n-                                        \"propertyName\": \"authentication-type\"\n+                                        \"propertyDisplayName\": \"SASL Mechanism\",\n+                                        \"propertyName\": \"sasl.mechanism\"\n                                     }\n                                 ],\n-                                \"description\": \"Username for authentication to Confluent Schema Registry\",\n-                                \"displayName\": \"Username\",\n+                                \"description\": \"Password provided with configured username when using PLAIN or SCRAM SASL Mechanisms\",\n+                                \"displayName\": \"Password\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"sasl.password\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n+                            },\n+                            \"sasl.token.auth\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"false\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"SCRAM-SHA-512\",\n+                                            \"SCRAM-SHA-256\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"SASL Mechanism\",\n+                                        \"propertyName\": \"sasl.mechanism\"\n+                                    }\n+                                ],\n+                                \"description\": \"Enables or disables Token authentication when using SCRAM SASL Mechanisms\",\n+                                \"displayName\": \"Token Authentication\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"username\",\n+                                \"name\": \"sasl.token.auth\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n-                            }\n-                        },\n-                        \"providedApiImplementations\": [\n-                            {\n-                                \"artifact\": \"nifi-standard-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.schemaregistry.services.SchemaRegistry\",\n-                                \"version\": \"1.27.0\"\n-                            }\n-                        ],\n-                        \"supportsDynamicProperties\": true,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"avro\",\n-                            \"confluent\",\n-                            \"kafka\",\n-                            \"registry\",\n-                            \"schema\"\n-                        ],\n-                        \"type\": \"org.apache.nifi.confluent.schemaregistry.ConfluentSchemaRegistry\",\n-                        \"typeDescription\": \"Provides a Schema Registry that interacts with the Confluent Schema Registry so that those Schemas that are stored in the Confluent Schema Registry can be used in NiFi. The Confluent Schema Registry has a notion of a \\\"subject\\\" for schemas, which is their terminology for a schema name. When a Schema is looked up by name by this registry, it will find a Schema in the Confluent Schema Registry with that subject.\",\n-                        \"version\": \"1.27.0\"\n-                    }\n-                ],\n-                \"processors\": [],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"1.27.0\"\n-        },\n-        {\n-            \"artifact\": \"nifi-kudu-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-kudu-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"e0c4461\"\n-                        },\n-                        \"group\": \"org.apache.nifi\",\n-                        \"propertyDescriptors\": {\n-                            \"kudu-lu-kerberos-credentials-service\": {\n-                                \"description\": \"Specifies the Kerberos Credentials to use for authentication\",\n-                                \"displayName\": \"Kerberos Credentials Service\",\n+                            },\n+                            \"sasl.username\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"PLAIN\",\n+                                            \"SCRAM-SHA-512\",\n+                                            \"SCRAM-SHA-256\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"SASL Mechanism\",\n+                                        \"propertyName\": \"sasl.mechanism\"\n+                                    }\n+                                ],\n+                                \"description\": \"Username provided with configured password when using PLAIN or SCRAM SASL Mechanisms\",\n+                                \"displayName\": \"Username\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"sasl.username\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"security.protocol\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"PLAINTEXT\",\n+                                        \"value\": \"PLAINTEXT\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"SSL\",\n+                                        \"value\": \"SSL\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"SASL_PLAINTEXT\",\n+                                        \"value\": \"SASL_PLAINTEXT\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"SASL_SSL\",\n+                                        \"value\": \"SASL_SSL\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"PLAINTEXT\",\n+                                \"description\": \"Security protocol used to communicate with brokers. Corresponds to Kafka Client security.protocol property\",\n+                                \"displayName\": \"Security Protocol\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"kudu-lu-kerberos-credentials-service\",\n+                                \"name\": \"security.protocol\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"ssl.context.service\": {\n+                                \"description\": \"Service supporting SSL communication with Kafka brokers\",\n+                                \"displayName\": \"SSL Context Service\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"ssl.context.service\",\n                                 \"required\": false,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n                                     \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.kerberos.KerberosCredentialsService\",\n+                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             },\n-                            \"kudu-lu-masters\": {\n-                                \"description\": \"Comma separated addresses of the Kudu masters to connect to.\",\n-                                \"displayName\": \"Kudu Masters\",\n+                            \"topic\": {\n+                                \"description\": \"The name of the Kafka Topic to publish to.\",\n+                                \"displayName\": \"Topic Name\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"kudu-lu-masters\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"topic\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"kudu-lu-operations-timeout-ms\": {\n-                                \"defaultValue\": \"30000ms\",\n-                                \"description\": \"Default timeout used for user operations (using sessions and scanners)\",\n-                                \"displayName\": \"Kudu Operation Timeout\",\n+                            \"transactional-id-prefix\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"true\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Use Transactions\",\n+                                        \"propertyName\": \"use-transactions\"\n+                                    }\n+                                ],\n+                                \"description\": \"When Use Transaction is set to true, KafkaProducer config 'transactional.id' will be a generated UUID and will be prefixed with this string.\",\n+                                \"displayName\": \"Transactional Id Prefix\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"kudu-lu-operations-timeout-ms\",\n+                                \"name\": \"transactional-id-prefix\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"kudu-lu-replica-selection\": {\n+                            \"use-transactions\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Select the closest replica to the client. Replicas are classified from closest to furthest as follows: 1) Local replicas 2) Replicas whose tablet server has the same location as the client 3) All other replicas\",\n-                                        \"displayName\": \"CLOSEST_REPLICA\",\n-                                        \"value\": \"CLOSEST_REPLICA\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n-                                        \"description\": \"Select the LEADER replica\",\n-                                        \"displayName\": \"LEADER_ONLY\",\n-                                        \"value\": \"LEADER_ONLY\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"CLOSEST_REPLICA\",\n-                                \"description\": \"Policy with which to choose amongst multiple replicas\",\n-                                \"displayName\": \"Kudu Replica Selection\",\n+                                \"defaultValue\": \"true\",\n+                                \"description\": \"Specifies whether or not NiFi should provide Transactional guarantees when communicating with Kafka. If there is a problem sending data to Kafka, and this property is set to false, then the messages that have already been sent to Kafka will continue on and be delivered to consumers. If this is set to true, then the Kafka transaction will be rolled back so that those messages are not available to consumers. Setting this to true requires that the <Delivery Guarantee> property be set to \\\"Guarantee Replicated Delivery.\\\"\",\n+                                \"displayName\": \"Use Transactions\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"kudu-lu-replica-selection\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"kudu-lu-return-cols\": {\n-                                \"defaultValue\": \"*\",\n-                                \"description\": \"A comma-separated list of columns to return when scanning. To return all columns set to \\\"*\\\"\",\n-                                \"displayName\": \"Kudu Return Columns\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"kudu-lu-return-cols\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"kudu-lu-table-name\": {\n-                                \"defaultValue\": \"default\",\n-                                \"description\": \"Name of the table to access.\",\n-                                \"displayName\": \"Kudu Table Name\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"kudu-lu-table-name\",\n+                                \"name\": \"use-transactions\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             }\n                         },\n-                        \"providedApiImplementations\": [\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.processors.kafka.pubsub.ConsumeKafkaRecord_2_6\",\n+                            \"org.apache.nifi.processors.kafka.pubsub.ConsumeKafka_2_6\",\n+                            \"org.apache.nifi.processors.kafka.pubsub.PublishKafka_2_6\"\n+                        ],\n+                        \"sideEffectFree\": false,\n+                        \"supportedRelationships\": [\n                             {\n-                                \"artifact\": \"nifi-standard-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.lookup.LookupService\",\n-                                \"version\": \"1.27.0\"\n+                                \"description\": \"FlowFiles for which all content was sent to Kafka.\",\n+                                \"name\": \"success\"\n                             },\n                             {\n-                                \"artifact\": \"nifi-standard-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.lookup.RecordLookupService\",\n-                                \"version\": \"1.27.0\"\n+                                \"description\": \"Any FlowFile that cannot be sent to Kafka will be routed to this Relationship\",\n+                                \"name\": \"failure\"\n                             }\n                         ],\n-                        \"supportsDynamicProperties\": false,\n+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\"\n+                        ],\n+                        \"supportsBatching\": false,\n+                        \"supportsDynamicProperties\": true,\n+                        \"supportsDynamicRelationships\": false,\n+                        \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"enrich\",\n-                            \"key\",\n-                            \"kudu\",\n-                            \"lookup\",\n-                            \"value\"\n+                            \"2.6\",\n+                            \"Apache\",\n+                            \"Kafka\",\n+                            \"Message\",\n+                            \"PubSub\",\n+                            \"Put\",\n+                            \"Record\",\n+                            \"Send\",\n+                            \"avro\",\n+                            \"csv\",\n+                            \"json\",\n+                            \"logs\"\n                         ],\n-                        \"type\": \"org.apache.nifi.controller.kudu.KuduLookupService\",\n-                        \"typeDescription\": \"Lookup a record from Kudu Server associated with the specified key. Binary columns are base64 encoded. Only one matched row will be returned\",\n-                        \"version\": \"1.27.0\"\n-                    }\n-                ],\n-                \"processors\": [\n+                        \"triggerSerially\": false,\n+                        \"triggerWhenAnyDestinationAvailable\": false,\n+                        \"triggerWhenEmpty\": false,\n+                        \"type\": \"org.apache.nifi.processors.kafka.pubsub.PublishKafkaRecord_2_6\",\n+                        \"typeDescription\": \"Sends the contents of a FlowFile as individual records to Apache Kafka using the Kafka 2.6 Producer API. The contents of the FlowFile are expected to be record-oriented data that can be read by the configured Record Reader. The complementary NiFi processor for fetching messages is ConsumeKafkaRecord_2_6.\",\n+                        \"version\": \"1.27.0\",\n+                        \"writesAttributes\": [\n+                            {\n+                                \"description\": \"The number of messages that were sent to Kafka for this FlowFile. This attribute is added only to FlowFiles that are routed to success.\",\n+                                \"name\": \"msg.count\"\n+                            }\n+                        ]\n+                    },\n                     {\n                         \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-kudu-nar\",\n+                        \"artifact\": \"nifi-kafka-2-6-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n-                            \"EVENT_DRIVEN\": 0,\n                             \"TIMER_DRIVEN\": 1\n                         },\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n+                        \"dynamicProperties\": [\n+                            {\n+                                \"description\": \"These properties will be added on the Kafka configuration after loading any provided configuration properties. In the event a dynamic property represents a property that was already set, its value will be ignored and WARN message logged. For the list of available Kafka properties please refer to: http://kafka.apache.org/documentation.html#configuration. \",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"name\": \"The name of a Kafka configuration property.\",\n+                                \"value\": \"The value of a given Kafka configuration property.\"\n+                            }\n+                        ],\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Batch Size\": {\n-                                \"defaultValue\": \"100\",\n-                                \"description\": \"The maximum number of Records to process in a single Kudu-client batch, between 1 - 100000. Depending on your memory size, and data size per row set an appropriate batch size. Gradually increase this number to find out the best one for best performances.\",\n-                                \"displayName\": \"Max Records per Batch\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Batch Size\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Data RecordPath\": {\n-                                \"description\": \"If specified, this property denotes a RecordPath that will be evaluated against each incoming Record and the Record that results from evaluating the RecordPath will be sent to Kudu instead of sending the entire incoming Record. If not specified, the entire incoming Record will be published to Kudu.\",\n-                                \"displayName\": \"Data RecordPath\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Data RecordPath\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n                             \"Failure Strategy\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"The FlowFile containing the Records that failed to insert will be routed to the 'failure' relationship\",\n+                                        \"description\": \"When unable to publish records to Kafka, the FlowFile will be routed to the failure relationship.\",\n                                         \"displayName\": \"Route to Failure\",\n-                                        \"value\": \"route-to-failure\"\n+                                        \"value\": \"Route to Failure\"\n                                     },\n                                     {\n-                                        \"description\": \"If any Record cannot be inserted, all FlowFiles in the session will be rolled back to their input queue. This means that if data cannot be pushed, it will block any subsequent data from be pushed to Kudu as well until the issue is resolved. However, this may be advantageous if a strict ordering is required.\",\n-                                        \"displayName\": \"Rollback Session\",\n-                                        \"value\": \"rollback\"\n+                                        \"description\": \"When unable to publish records to Kafka, the FlowFile will be placed back on the queue so that it will be retried. For flows where FlowFile ordering is important, this strategy can be used along with ensuring that the each processor uses only a single Concurrent Task.\",\n+                                        \"displayName\": \"Rollback\",\n+                                        \"value\": \"Rollback\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"route-to-failure\",\n-                                \"description\": \"If one or more Records in a batch cannot be transferred to Kudu, specifies how to handle the failure\",\n+                                \"defaultValue\": \"Route to Failure\",\n+                                \"description\": \"Specifies how the processor handles a FlowFile if it is unable to publish the data to Kafka\",\n                                 \"displayName\": \"Failure Strategy\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n                                 \"name\": \"Failure Strategy\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"FlowFiles per Batch\": {\n-                                \"defaultValue\": \"1\",\n-                                \"description\": \"The maximum number of FlowFiles to process in a single execution, between 1 - 100000. Depending on your memory size, and data size per row set an appropriate batch size for the number of FlowFiles to process per client connection setup.Gradually increase this number, only if your FlowFiles typically contain a few records.\",\n-                                \"displayName\": \"FlowFiles per Batch\",\n+                            \"ack.wait.time\": {\n+                                \"defaultValue\": \"5 secs\",\n+                                \"description\": \"After sending a message to Kafka, this indicates the amount of time that we are willing to wait for a response from Kafka. If Kafka does not acknowledge the message within this time period, the FlowFile will be routed to 'failure'.\",\n+                                \"displayName\": \"Acknowledgment Wait Time\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"FlowFiles per Batch\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"ack.wait.time\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Flush Mode\": {\n+                            \"acks\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"AUTO_FLUSH_SYNC\",\n-                                        \"value\": \"AUTO_FLUSH_SYNC\"\n+                                        \"description\": \"FlowFile will be routed to success after successfully sending the content to a Kafka node, without waiting for any acknowledgment from the node at all. This provides the best performance but may result in data loss.\",\n+                                        \"displayName\": \"Best Effort\",\n+                                        \"value\": \"0\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"AUTO_FLUSH_BACKGROUND\",\n-                                        \"value\": \"AUTO_FLUSH_BACKGROUND\"\n+                                        \"description\": \"FlowFile will be routed to success if the message is received by a single Kafka node, whether or not it is replicated. This is faster than <Guarantee Replicated Delivery> but can result in data loss if a Kafka node crashes\",\n+                                        \"displayName\": \"Guarantee Single Node Delivery\",\n+                                        \"value\": \"1\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"MANUAL_FLUSH\",\n-                                        \"value\": \"MANUAL_FLUSH\"\n+                                        \"description\": \"FlowFile will be routed to failure unless the message is replicated to the appropriate number of Kafka Nodes according to the Topic configuration\",\n+                                        \"displayName\": \"Guarantee Replicated Delivery\",\n+                                        \"value\": \"all\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"AUTO_FLUSH_BACKGROUND\",\n-                                \"description\": \"Set the new flush mode for a kudu session.\\nAUTO_FLUSH_SYNC: the call returns when the operation is persisted, else it throws an exception.\\nAUTO_FLUSH_BACKGROUND: the call returns when the operation has been added to the buffer. This call should normally perform only fast in-memory operations but it may have to wait when the buffer is full and there's another buffer being flushed.\\nMANUAL_FLUSH: the call returns when the operation has been added to the buffer, else it throws a KuduException if the buffer is full.\",\n-                                \"displayName\": \"Flush Mode\",\n+                                \"defaultValue\": \"all\",\n+                                \"description\": \"Specifies the requirement for guaranteeing that a message is sent to Kafka. Corresponds to Kafka's 'acks' property.\",\n+                                \"displayName\": \"Delivery Guarantee\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Flush Mode\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Handle Schema Drift\": {\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"If set to true, when fields with names that are not in the target Kudu table are encountered, the Kudu table will be altered to include new columns for those fields.\",\n-                                \"displayName\": \"Handle Schema Drift\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Handle Schema Drift\",\n+                                \"name\": \"acks\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Ignore NULL\": {\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"Ignore NULL on Kudu Put Operation, Update only non-Null columns if set true\",\n-                                \"displayName\": \"Ignore NULL\",\n+                            \"attribute-name-regex\": {\n+                                \"description\": \"A Regular Expression that is matched against all FlowFile attribute names. Any attribute whose name matches the regex will be added to the Kafka messages as a Header. If not specified, no FlowFile attributes will be added as headers.\",\n+                                \"displayName\": \"Attributes to Send as Headers (Regex)\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Ignore NULL\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"attribute-name-regex\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Insert Operation\": {\n-                                \"defaultValue\": \"INSERT\",\n-                                \"description\": \"Specify operationType for this processor.\\nValid values are: INSERT, INSERT_IGNORE, UPSERT, UPDATE, DELETE, UPDATE_IGNORE, DELETE_IGNORE. This Property will be ignored if the <Operation RecordPath> property is set.\",\n-                                \"displayName\": \"Kudu Operation Type\",\n+                            \"aws.profile.name\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"AWS_MSK_IAM\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"SASL Mechanism\",\n+                                        \"propertyName\": \"sasl.mechanism\"\n+                                    }\n+                                ],\n+                                \"description\": \"The Amazon Web Services Profile to select when multiple profiles are available.\",\n+                                \"displayName\": \"AWS Profile Name\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Insert Operation\",\n+                                \"name\": \"aws.profile.name\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Kudu Masters\": {\n-                                \"description\": \"Comma separated addresses of the Kudu masters to connect to.\",\n-                                \"displayName\": \"Kudu Masters\",\n+                            \"bootstrap.servers\": {\n+                                \"defaultValue\": \"localhost:9092\",\n+                                \"description\": \"Comma-separated list of Kafka Brokers in the format host:port\",\n+                                \"displayName\": \"Kafka Brokers\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Kudu Masters\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Lowercase Field Names\": {\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"Convert column names to lowercase when finding index of Kudu table columns\",\n-                                \"displayName\": \"Lowercase Field Names\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Lowercase Field Names\",\n+                                \"name\": \"bootstrap.servers\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Operation RecordPath\": {\n-                                \"description\": \"If specified, this property denotes a RecordPath that will be evaluated against each incoming Record in order to determine the Kudu Operation Type. When evaluated, the RecordPath must evaluate to one of the valid Kudu Operation Types (Debezium style operation types are also supported: \\\"r\\\" and \\\"c\\\" for INSERT, \\\"u\\\" for UPDATE, and \\\"d\\\" for DELETE), or the incoming FlowFile will be routed to failure. If this property is specified, the <Kudu Operation Type> property will be ignored.\",\n-                                \"displayName\": \"Operation RecordPath\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Operation RecordPath\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Skip head line\": {\n+                            \"compression.type\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"displayName\": \"none\",\n+                                        \"value\": \"none\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"displayName\": \"gzip\",\n+                                        \"value\": \"gzip\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"snappy\",\n+                                        \"value\": \"snappy\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"lz4\",\n+                                        \"value\": \"lz4\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"Deprecated. Used to ignore header lines, but this should be handled by a RecordReader (e.g. \\\"Treat First Line as Header\\\" property of CSVReader)\",\n-                                \"displayName\": \"Skip head line\",\n+                                \"defaultValue\": \"none\",\n+                                \"description\": \"This parameter allows you to specify the compression codec for all data generated by this producer.\",\n+                                \"displayName\": \"Compression Type\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Skip head line\",\n+                                \"name\": \"compression.type\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Table Name\": {\n-                                \"description\": \"The name of the Kudu Table to put data into\",\n-                                \"displayName\": \"Table Name\",\n+                            \"kafka-key\": {\n+                                \"description\": \"The Key to use for the Message. If not specified, the flow file attribute 'kafka.key' is used as the message key, if it is present.Beware that setting Kafka key and demarcating at the same time may potentially lead to many Kafka messages with the same key.Normally this is not a problem as Kafka does not enforce or assume message and key uniqueness. Still, setting the demarcator and Kafka key at the same time poses a risk of data loss on Kafka. During a topic compaction on Kafka, messages will be deduplicated based on this key.\",\n+                                \"displayName\": \"Kafka Key\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Table Name\",\n-                                \"required\": true,\n+                                \"name\": \"kafka-key\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n                             \"kerberos-credentials-service\": {\n-                                \"description\": \"Specifies the Kerberos Credentials to use for authentication\",\n+                                \"description\": \"Service supporting generalized credentials authentication with Kerberos\",\n                                 \"displayName\": \"Kerberos Credentials Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n                                 \"name\": \"kerberos-credentials-service\",\n                                 \"required\": false,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n                                     \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n                                     \"type\": \"org.apache.nifi.kerberos.KerberosCredentialsService\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             },\n-                            \"kerberos-password\": {\n-                                \"description\": \"The password to use when specifying the principal and password directly in the processor for authenticating via Kerberos.\",\n-                                \"displayName\": \"Kerberos Password\",\n+                            \"kerberos-user-service\": {\n+                                \"description\": \"Service supporting user authentication with Kerberos\",\n+                                \"displayName\": \"Kerberos User Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"kerberos-password\",\n+                                \"name\": \"kerberos-user-service\",\n                                 \"required\": false,\n-                                \"sensitive\": true\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.kerberos.SelfContainedKerberosUserService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n                             },\n-                            \"kerberos-principal\": {\n-                                \"description\": \"The principal to use when specifying the principal and password directly in the processor for authenticating via Kerberos.\",\n-                                \"displayName\": \"Kerberos Principal\",\n+                            \"key-attribute-encoding\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"The key is interpreted as a UTF-8 Encoded string.\",\n+                                        \"displayName\": \"UTF-8 Encoded\",\n+                                        \"value\": \"utf-8\"\n+                                    },\n+                                    {\n+                                        \"description\": \"The key is interpreted as arbitrary binary data that is encoded using hexadecimal characters with uppercase letters.\",\n+                                        \"displayName\": \"Hex Encoded\",\n+                                        \"value\": \"hex\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"utf-8\",\n+                                \"description\": \"FlowFiles that are emitted have an attribute named 'kafka.key'. This property dictates how the value of the attribute should be encoded.\",\n+                                \"displayName\": \"Key Attribute Encoding\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"key-attribute-encoding\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"max.block.ms\": {\n+                                \"defaultValue\": \"5 sec\",\n+                                \"description\": \"The amount of time publisher will wait to obtain metadata or wait for the buffer to flush during the 'send' call before failing the entire 'send' call. Corresponds to Kafka's 'max.block.ms' property\",\n+                                \"displayName\": \"Max Metadata Wait Time\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"kerberos-principal\",\n+                                \"name\": \"max.block.ms\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"max.request.size\": {\n+                                \"defaultValue\": \"1 MB\",\n+                                \"description\": \"The maximum size of a request in bytes. Corresponds to Kafka's 'max.request.size' property and defaults to 1 MB (1048576).\",\n+                                \"displayName\": \"Max Request Size\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"max.request.size\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"message-demarcator\": {\n+                                \"description\": \"Specifies the string (interpreted as UTF-8) to use for demarcating multiple messages within a single FlowFile. If not specified, the entire content of the FlowFile will be used as a single message. If specified, the contents of the FlowFile will be split on this delimiter and each section sent as a separate Kafka message. To enter special character such as 'new line' use CTRL+Enter or Shift+Enter, depending on your OS.\",\n+                                \"displayName\": \"Message Demarcator\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"message-demarcator\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"kerberos-user-service\": {\n-                                \"description\": \"Specifies the Kerberos User Controller Service that should be used for authenticating with Kerberos\",\n-                                \"displayName\": \"Kerberos User Service\",\n+                            \"message-header-encoding\": {\n+                                \"defaultValue\": \"UTF-8\",\n+                                \"description\": \"For any attribute that is added as a message header, as configured via the <Attributes to Send as Headers> property, this property indicates the Character Encoding to use for serializing the headers.\",\n+                                \"displayName\": \"Message Header Encoding\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"kerberos-user-service\",\n+                                \"name\": \"message-header-encoding\",\n                                 \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.kerberos.KerberosUserService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n+                                \"sensitive\": false\n                             },\n-                            \"kudu-keep-alive-period-timeout-ms\": {\n-                                \"defaultValue\": \"15000ms\",\n-                                \"description\": \"Default timeout used for user operations\",\n-                                \"displayName\": \"Kudu Keep Alive Period Timeout\",\n+                            \"partition\": {\n+                                \"description\": \"Specifies which Partition Records will go to.\",\n+                                \"displayName\": \"Partition\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"partition\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"partitioner.class\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"Messages will be assigned partitions in a round-robin fashion, sending the first message to Partition 1, the next Partition to Partition 2, and so on, wrapping as necessary.\",\n+                                        \"displayName\": \"RoundRobinPartitioner\",\n+                                        \"value\": \"org.apache.nifi.processors.kafka.pubsub.Partitioners$RoundRobinPartitioner\"\n+                                    },\n+                                    {\n+                                        \"description\": \"The default partitioning strategy will choose the sticky partition that changes when the batch is full (See KIP-480 for details about sticky partitioning).\",\n+                                        \"displayName\": \"DefaultPartitioner\",\n+                                        \"value\": \"org.apache.kafka.clients.producer.internals.DefaultPartitioner\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Interprets the <Partition> property as Expression Language that will be evaluated against each FlowFile. This Expression will be evaluated once against the FlowFile, so all Records in a given FlowFile will go to the same partition.\",\n+                                        \"displayName\": \"Expression Language Partitioner\",\n+                                        \"value\": \"org.apache.nifi.processors.kafka.pubsub.Partitioners$ExpressionLanguagePartitioner\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"org.apache.kafka.clients.producer.internals.DefaultPartitioner\",\n+                                \"description\": \"Specifies which class to use to compute a partition id for a message. Corresponds to Kafka's 'partitioner.class' property.\",\n+                                \"displayName\": \"Partitioner class\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"partitioner.class\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"sasl.kerberos.keytab\": {\n+                                \"description\": \"Keytab credentials used for authentication with Kerberos\",\n+                                \"displayName\": \"Kerberos Keytab\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"kudu-keep-alive-period-timeout-ms\",\n+                                \"name\": \"sasl.kerberos.keytab\",\n                                 \"required\": false,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"SINGLE\",\n+                                    \"resourceTypes\": [\n+                                        \"FILE\"\n+                                    ]\n+                                },\n                                 \"sensitive\": false\n                             },\n-                            \"kudu-operations-timeout-ms\": {\n-                                \"defaultValue\": \"30000ms\",\n-                                \"description\": \"Default timeout used for user operations (using sessions and scanners)\",\n-                                \"displayName\": \"Kudu Operation Timeout\",\n+                            \"sasl.kerberos.principal\": {\n+                                \"description\": \"Principal used for authentication with Kerberos\",\n+                                \"displayName\": \"Kerberos Principal\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"kudu-operations-timeout-ms\",\n+                                \"name\": \"sasl.kerberos.principal\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"kudu-sasl-protocol-name\": {\n-                                \"defaultValue\": \"kudu\",\n-                                \"description\": \"The SASL protocol name to use for authenticating via Kerberos. Must match the service principal name.\",\n-                                \"displayName\": \"Kudu SASL Protocol Name\",\n+                            \"sasl.kerberos.service.name\": {\n+                                \"description\": \"The service name that matches the primary name of the Kafka server configured in the broker JAAS configuration\",\n+                                \"displayName\": \"Kerberos Service Name\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"kudu-sasl-protocol-name\",\n+                                \"name\": \"sasl.kerberos.service.name\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"record-reader\": {\n-                                \"description\": \"The service for reading records from incoming flow files.\",\n-                                \"displayName\": \"Record Reader\",\n+                            \"sasl.mechanism\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"General Security Services API for Kerberos authentication\",\n+                                        \"displayName\": \"GSSAPI\",\n+                                        \"value\": \"GSSAPI\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Plain username and password authentication\",\n+                                        \"displayName\": \"PLAIN\",\n+                                        \"value\": \"PLAIN\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Salted Challenge Response Authentication Mechanism using SHA-512 with username and password\",\n+                                        \"displayName\": \"SCRAM-SHA-256\",\n+                                        \"value\": \"SCRAM-SHA-256\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Salted Challenge Response Authentication Mechanism using SHA-256 with username and password\",\n+                                        \"displayName\": \"SCRAM-SHA-512\",\n+                                        \"value\": \"SCRAM-SHA-512\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"GSSAPI\",\n+                                \"description\": \"SASL mechanism used for authentication. Corresponds to Kafka Client sasl.mechanism property\",\n+                                \"displayName\": \"SASL Mechanism\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"record-reader\",\n+                                \"name\": \"sasl.mechanism\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"sasl.password\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"PLAIN\",\n+                                            \"SCRAM-SHA-512\",\n+                                            \"SCRAM-SHA-256\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"SASL Mechanism\",\n+                                        \"propertyName\": \"sasl.mechanism\"\n+                                    }\n+                                ],\n+                                \"description\": \"Password provided with configured username when using PLAIN or SCRAM SASL Mechanisms\",\n+                                \"displayName\": \"Password\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"sasl.password\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n+                            },\n+                            \"sasl.token.auth\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"false\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"SCRAM-SHA-512\",\n+                                            \"SCRAM-SHA-256\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"SASL Mechanism\",\n+                                        \"propertyName\": \"sasl.mechanism\"\n+                                    }\n+                                ],\n+                                \"description\": \"Enables or disables Token authentication when using SCRAM SASL Mechanisms\",\n+                                \"displayName\": \"Token Authentication\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"sasl.token.auth\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"sasl.username\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"PLAIN\",\n+                                            \"SCRAM-SHA-512\",\n+                                            \"SCRAM-SHA-256\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"SASL Mechanism\",\n+                                        \"propertyName\": \"sasl.mechanism\"\n+                                    }\n+                                ],\n+                                \"description\": \"Username provided with configured password when using PLAIN or SCRAM SASL Mechanisms\",\n+                                \"displayName\": \"Username\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"sasl.username\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"security.protocol\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"PLAINTEXT\",\n+                                        \"value\": \"PLAINTEXT\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"SSL\",\n+                                        \"value\": \"SSL\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"SASL_PLAINTEXT\",\n+                                        \"value\": \"SASL_PLAINTEXT\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"SASL_SSL\",\n+                                        \"value\": \"SASL_SSL\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"PLAINTEXT\",\n+                                \"description\": \"Security protocol used to communicate with brokers. Corresponds to Kafka Client security.protocol property\",\n+                                \"displayName\": \"Security Protocol\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"security.protocol\",\n                                 \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"ssl.context.service\": {\n+                                \"description\": \"Service supporting SSL communication with Kafka brokers\",\n+                                \"displayName\": \"SSL Context Service\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"ssl.context.service\",\n+                                \"required\": false,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n                                     \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n+                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             },\n-                            \"worker-count\": {\n-                                \"defaultValue\": \"16\",\n-                                \"description\": \"The maximum number of worker threads handling Kudu client read and write operations. Defaults to the number of available processors.\",\n-                                \"displayName\": \"Kudu Client Worker Count\",\n+                            \"topic\": {\n+                                \"description\": \"The name of the Kafka Topic to publish to.\",\n+                                \"displayName\": \"Topic Name\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"topic\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"transactional-id-prefix\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"true\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Use Transactions\",\n+                                        \"propertyName\": \"use-transactions\"\n+                                    }\n+                                ],\n+                                \"description\": \"When Use Transaction is set to true, KafkaProducer config 'transactional.id' will be a generated UUID and will be prefixed with this string.\",\n+                                \"displayName\": \"Transactional Id Prefix\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"transactional-id-prefix\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"use-transactions\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"true\",\n+                                \"description\": \"Specifies whether or not NiFi should provide Transactional guarantees when communicating with Kafka. If there is a problem sending data to Kafka, and this property is set to false, then the messages that have already been sent to Kafka will continue on and be delivered to consumers. If this is set to true, then the Kafka transaction will be rolled back so that those messages are not available to consumers. Setting this to true requires that the <Delivery Guarantee> property be set to \\\"Guarantee Replicated Delivery.\\\"\",\n+                                \"displayName\": \"Use Transactions\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"worker-count\",\n+                                \"name\": \"use-transactions\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             }\n                         },\n+                        \"readsAttributes\": [\n+                            {\n+                                \"description\": \"If this attribute is set to 'true', if the processor is not configured with a demarcator and if the FlowFile's content is null, then a tombstone message with zero bytes will be sent to Kafka.\",\n+                                \"name\": \"kafka.tombstone\"\n+                            }\n+                        ],\n                         \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"A FlowFile is routed to this relationship after it has been successfully stored in Kudu\",\n+                                \"description\": \"FlowFiles for which all content was sent to Kafka.\",\n                                 \"name\": \"success\"\n                             },\n                             {\n-                                \"description\": \"A FlowFile is routed to this relationship if it cannot be sent to Kudu\",\n+                                \"description\": \"Any FlowFile that cannot be sent to Kafka will be routed to this Relationship\",\n                                 \"name\": \"failure\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\",\n-                            \"EVENT_DRIVEN\"\n+                            \"CRON_DRIVEN\"\n                         ],\n-                        \"supportsBatching\": true,\n-                        \"supportsDynamicProperties\": false,\n+                        \"supportsBatching\": false,\n+                        \"supportsDynamicProperties\": true,\n                         \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": true,\n+                        \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n-                        \"systemResourceConsiderations\": [\n-                            {\n-                                \"description\": \"An instance of this component can cause high usage of this system resource.  Multiple instances or high concurrency settings may result a degradation of performance.\",\n-                                \"resource\": \"MEMORY\"\n-                            }\n-                        ],\n                         \"tags\": [\n-                            \"HDFS\",\n-                            \"NoSQL\",\n-                            \"database\",\n-                            \"kudu\",\n-                            \"put\",\n-                            \"record\"\n+                            \"2.6\",\n+                            \"Apache\",\n+                            \"Kafka\",\n+                            \"Message\",\n+                            \"PubSub\",\n+                            \"Put\",\n+                            \"Send\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.kudu.PutKudu\",\n-                        \"typeDescription\": \"Reads records from an incoming FlowFile using the provided Record Reader, and writes those records to the specified Kudu's table. The schema for the Kudu table is inferred from the schema of the Record Reader. If any error occurs while reading records from the input, or writing records to Kudu, the FlowFile will be routed to failure\",\n+                        \"type\": \"org.apache.nifi.processors.kafka.pubsub.PublishKafka_2_6\",\n+                        \"typeDescription\": \"Sends the contents of a FlowFile as a message to Apache Kafka using the Kafka 2.6 Producer API.The messages to send may be individual FlowFiles or may be delimited, using a user-specified delimiter, such as a new-line. The complementary NiFi processor for fetching messages is ConsumeKafka_2_6.\",\n                         \"version\": \"1.27.0\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"Number of records written to Kudu\",\n-                                \"name\": \"record.count\"\n+                                \"description\": \"The number of messages that were sent to Kafka for this FlowFile. This attribute is added only to FlowFiles that are routed to success. If the <Message Demarcator> Property is not set, this will always be 1, but if the Property is set, it may be greater than 1.\",\n+                                \"name\": \"msg.count\"\n                             }\n                         ]\n                     }\n                 ],\n                 \"reportingTasks\": []\n             },\n             \"group\": \"org.apache.nifi\",\n             \"version\": \"1.27.0\"\n         },\n         {\n+            \"artifact\": \"nifi-ccda-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [],\n+                \"processors\": [\n+                    {\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-ccda-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"e0c4461\"\n+                        },\n+                        \"defaultBulletinLevel\": \"WARN\",\n+                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": 1,\n+                            \"TIMER_DRIVEN\": 1\n+                        },\n+                        \"defaultPenaltyDuration\": \"30 sec\",\n+                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": \"* * * * * ?\",\n+                            \"TIMER_DRIVEN\": \"0 sec\"\n+                        },\n+                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n+                        \"defaultYieldDuration\": \"1 sec\",\n+                        \"deprecated\": true,\n+                        \"deprecationReason\": \"Parsing XML elements to FlowFile attributes is not recommend and should be replaced with record-oriented handling\",\n+                        \"group\": \"org.apache.nifi\",\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n+                        \"primaryNodeOnly\": false,\n+                        \"propertyDescriptors\": {\n+                            \"skip-validation\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"true\",\n+                                \"description\": \"Whether or not to validate CDA message values\",\n+                                \"displayName\": \"Skip Validation\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"skip-validation\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            }\n+                        },\n+                        \"sideEffectFree\": true,\n+                        \"supportedRelationships\": [\n+                            {\n+                                \"description\": \"A FlowFile is routed to this relationship if it is properly parsed as CDA and its contents extracted as attributes.\",\n+                                \"name\": \"success\"\n+                            },\n+                            {\n+                                \"description\": \"A FlowFile is routed to this relationship if it cannot be parsed as CDA or its contents extracted as attributes.\",\n+                                \"name\": \"failure\"\n+                            }\n+                        ],\n+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\"\n+                        ],\n+                        \"supportsBatching\": true,\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicRelationships\": false,\n+                        \"supportsEventDriven\": false,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"CCDA\",\n+                            \"attributes\",\n+                            \"extract\",\n+                            \"healthcare\"\n+                        ],\n+                        \"triggerSerially\": false,\n+                        \"triggerWhenAnyDestinationAvailable\": false,\n+                        \"triggerWhenEmpty\": false,\n+                        \"type\": \"org.apache.nifi.processors.ccda.ExtractCCDAAttributes\",\n+                        \"typeDescription\": \"Extracts information from an Consolidated CDA formatted FlowFile and provides individual attributes as FlowFile attributes. The attributes are named as <Parent> <dot> <Key>. If the Parent is repeating, the naming will be <Parent> <underscore> <Parent Index> <dot> <Key>. For example, section.act_07.observation.name=Essential hypertension\",\n+                        \"version\": \"1.27.0\"\n+                    }\n+                ],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"1.27.0\"\n+        },\n+        {\n             \"artifact\": \"nifi-aws-nar\",\n             \"componentManifest\": {\n                 \"controllerServices\": [\n                     {\n                         \"additionalDetails\": false,\n                         \"artifact\": \"nifi-aws-nar\",\n                         \"buildInfo\": {\n@@ -47935,16 +44730,16 @@\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n                                 \"name\": \"custom-signer-module-location\",\n                                 \"required\": false,\n                                 \"resourceDefinition\": {\n                                     \"cardinality\": \"MULTIPLE\",\n                                     \"resourceTypes\": [\n-                                        \"FILE\",\n-                                        \"DIRECTORY\"\n+                                        \"DIRECTORY\",\n+                                        \"FILE\"\n                                     ]\n                                 },\n                                 \"sensitive\": false\n                             },\n                             \"default-credentials\": {\n                                 \"allowableValues\": [\n                                     {\n@@ -56075,16 +52870,16 @@\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n                                 \"name\": \"custom-signer-module-location\",\n                                 \"required\": false,\n                                 \"resourceDefinition\": {\n                                     \"cardinality\": \"MULTIPLE\",\n                                     \"resourceTypes\": [\n-                                        \"FILE\",\n-                                        \"DIRECTORY\"\n+                                        \"DIRECTORY\",\n+                                        \"FILE\"\n                                     ]\n                                 },\n                                 \"sensitive\": false\n                             },\n                             \"proxy-configuration-service\": {\n                                 \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests. If set, it supersedes proxy settings configured per component. Supported proxies: HTTP + AuthN\",\n                                 \"displayName\": \"Proxy Configuration Service\",\n@@ -56611,16 +53406,16 @@\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n                                 \"name\": \"custom-signer-module-location\",\n                                 \"required\": false,\n                                 \"resourceDefinition\": {\n                                     \"cardinality\": \"MULTIPLE\",\n                                     \"resourceTypes\": [\n-                                        \"FILE\",\n-                                        \"DIRECTORY\"\n+                                        \"DIRECTORY\",\n+                                        \"FILE\"\n                                     ]\n                                 },\n                                 \"sensitive\": false\n                             },\n                             \"encryption-service\": {\n                                 \"description\": \"Specifies the Encryption Service Controller used to configure requests. PutS3Object: For backward compatibility, this value is ignored when 'Server Side Encryption' is set. FetchS3Object: Only needs to be configured in case of Server-side Customer Key, Client-side KMS and Client-side Customer Key encryptions.\",\n                                 \"displayName\": \"Encryption Service\",\n@@ -57243,16 +54038,16 @@\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n                                 \"name\": \"custom-signer-module-location\",\n                                 \"required\": false,\n                                 \"resourceDefinition\": {\n                                     \"cardinality\": \"MULTIPLE\",\n                                     \"resourceTypes\": [\n-                                        \"FILE\",\n-                                        \"DIRECTORY\"\n+                                        \"DIRECTORY\",\n+                                        \"FILE\"\n                                     ]\n                                 },\n                                 \"sensitive\": false\n                             },\n                             \"delimiter\": {\n                                 \"description\": \"The string used to delimit directories within the bucket. Please consult the AWS documentation for the correct use of this field.\",\n                                 \"displayName\": \"Delimiter\",\n@@ -58312,16 +55107,16 @@\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n                                 \"name\": \"custom-signer-module-location\",\n                                 \"required\": false,\n                                 \"resourceDefinition\": {\n                                     \"cardinality\": \"MULTIPLE\",\n                                     \"resourceTypes\": [\n-                                        \"FILE\",\n-                                        \"DIRECTORY\"\n+                                        \"DIRECTORY\",\n+                                        \"FILE\"\n                                     ]\n                                 },\n                                 \"sensitive\": false\n                             },\n                             \"encryption-service\": {\n                                 \"description\": \"Specifies the Encryption Service Controller used to configure requests. PutS3Object: For backward compatibility, this value is ignored when 'Server Side Encryption' is set. FetchS3Object: Only needs to be configured in case of Server-side Customer Key, Client-side KMS and Client-side Customer Key encryptions.\",\n                                 \"displayName\": \"Encryption Service\",\n@@ -59044,16 +55839,16 @@\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n                                 \"name\": \"custom-signer-module-location\",\n                                 \"required\": false,\n                                 \"resourceDefinition\": {\n                                     \"cardinality\": \"MULTIPLE\",\n                                     \"resourceTypes\": [\n-                                        \"FILE\",\n-                                        \"DIRECTORY\"\n+                                        \"DIRECTORY\",\n+                                        \"FILE\"\n                                     ]\n                                 },\n                                 \"sensitive\": false\n                             },\n                             \"proxy-configuration-service\": {\n                                 \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests. If set, it supersedes proxy settings configured per component. Supported proxies: HTTP + AuthN\",\n                                 \"displayName\": \"Proxy Configuration Service\",\n@@ -62581,316 +59376,622 @@\n                 ],\n                 \"reportingTasks\": []\n             },\n             \"group\": \"org.apache.nifi\",\n             \"version\": \"1.27.0\"\n         },\n         {\n-            \"artifact\": \"nifi-registry-nar\",\n+            \"artifact\": \"nifi-asana-processors-nar\",\n             \"componentManifest\": {\n-                \"controllerServices\": [\n+                \"controllerServices\": [],\n+                \"processors\": [\n                     {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-registry-nar\",\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-asana-processors-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n-                        \"dynamicProperties\": [\n-                            {\n-                                \"description\": \"Adds a named schema using the JSON string representation of an Avro schema\",\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"name\": \"Schema name\",\n-                                \"value\": \"Schema Content\"\n-                            }\n-                        ],\n+                        \"defaultBulletinLevel\": \"WARN\",\n+                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": 1,\n+                            \"TIMER_DRIVEN\": 1\n+                        },\n+                        \"defaultPenaltyDuration\": \"30 sec\",\n+                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": \"* * * * * ?\",\n+                            \"TIMER_DRIVEN\": \"0 sec\"\n+                        },\n+                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n+                        \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n+                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n+                        \"primaryNodeOnly\": true,\n                         \"propertyDescriptors\": {\n-                            \"avro-reg-validated-field-names\": {\n+                            \"asana-controller-service\": {\n+                                \"description\": \"Specify which controller service to use for accessing Asana.\",\n+                                \"displayName\": \"Asana Client Service\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"asana-controller-service\",\n+                                \"required\": true,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-asana-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.controller.asana.AsanaClientProviderService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"asana-object-type\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"description\": \"Collect tasks matching to the specified conditions.\",\n+                                        \"displayName\": \"Tasks\",\n+                                        \"value\": \"asana-collect-tasks\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"description\": \"Collect attached files of tasks matching to the specified conditions.\",\n+                                        \"displayName\": \"Task Attachments\",\n+                                        \"value\": \"asana-collect-task-attachments\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Collect projects of the workspace.\",\n+                                        \"displayName\": \"Projects\",\n+                                        \"value\": \"asana-collect-projects\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Collect tags of the workspace.\",\n+                                        \"displayName\": \"Tags\",\n+                                        \"value\": \"asana-collect-tags\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Collect users assigned to the workspace.\",\n+                                        \"displayName\": \"Users\",\n+                                        \"value\": \"asana-collect-users\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Collect users assigned to the specified project.\",\n+                                        \"displayName\": \"Members of a Project\",\n+                                        \"value\": \"asana-collect-project-members\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Collect teams of the workspace.\",\n+                                        \"displayName\": \"Teams\",\n+                                        \"value\": \"asana-collect-teams\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Collect users assigned to the specified team.\",\n+                                        \"displayName\": \"Team Members\",\n+                                        \"value\": \"asana-collect-team-members\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Collect stories (comments) of of tasks matching to the specified conditions.\",\n+                                        \"displayName\": \"Stories of Tasks\",\n+                                        \"value\": \"asana-collect-stories\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Collect status updates of the specified project.\",\n+                                        \"displayName\": \"Status Updates of a Project\",\n+                                        \"value\": \"asana-collect-project-status-updates\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Collect attached files of project status updates.\",\n+                                        \"displayName\": \"Attachments of Status Updates\",\n+                                        \"value\": \"asana-collect-project-status-attachments\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Collect various events happening on the specified project and on its' tasks.\",\n+                                        \"displayName\": \"Events of a Project\",\n+                                        \"value\": \"asana-collect-project-events\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"true\",\n-                                \"description\": \"Whether or not to validate the field names in the Avro schema based on Avro naming rules. If set to true, all field names must be valid Avro names, which must begin with [A-Za-z_], and subsequently contain only [A-Za-z0-9_]. If set to false, no validation will be performed on the field names.\",\n-                                \"displayName\": \"Validate Field Names\",\n+                                \"defaultValue\": \"asana-collect-tasks\",\n+                                \"description\": \"Specify what kind of objects to be collected from Asana\",\n+                                \"displayName\": \"Object Type\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"avro-reg-validated-field-names\",\n+                                \"name\": \"asana-object-type\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n-                            }\n-                        },\n-                        \"providedApiImplementations\": [\n-                            {\n-                                \"artifact\": \"nifi-standard-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.schemaregistry.services.SchemaRegistry\",\n-                                \"version\": \"1.27.0\"\n-                            }\n-                        ],\n-                        \"supportsDynamicProperties\": true,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"avro\",\n-                            \"csv\",\n-                            \"json\",\n-                            \"registry\",\n-                            \"schema\"\n-                        ],\n-                        \"type\": \"org.apache.nifi.schemaregistry.services.AvroSchemaRegistry\",\n-                        \"typeDescription\": \"Provides a service for registering and accessing schemas. You can register a schema as a dynamic property where 'name' represents the schema name and 'value' represents the textual representation of the actual schema following the syntax and semantics of Avro's Schema format.\",\n-                        \"version\": \"1.27.0\"\n-                    },\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-registry-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"e0c4461\"\n-                        },\n-                        \"dynamicProperties\": [\n-                            {\n-                                \"description\": \"Adds a named schema using the JSON string representation of a JSON schema\",\n+                            },\n+                            \"asana-output-batch-size\": {\n+                                \"defaultValue\": \"1\",\n+                                \"description\": \"The number of items batched together in a single Flow File. If set to 1 (default), then each item is transferred in a separate Flow File and each will have an asana.gid attribute, to help identifying the fetched item on the server side, if needed. If the batch size is greater than 1, then the specified amount of items are batched together in a single Flow File as a Json array, and the Flow Files won't have the asana.gid attribute.\",\n+                                \"displayName\": \"Output Batch Size\",\n+                                \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n-                                \"name\": \"Schema Name\",\n-                                \"value\": \"Schema Content\"\n-                            }\n-                        ],\n-                        \"group\": \"org.apache.nifi\",\n-                        \"propertyDescriptors\": {\n-                            \"JSON Schema Version\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"Draft Version 4\",\n-                                        \"displayName\": \"Draft 4\",\n-                                        \"value\": \"DRAFT_4\"\n-                                    },\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"asana-output-batch-size\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"asana-project-name\": {\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"Draft Version 6\",\n-                                        \"displayName\": \"Draft 6\",\n-                                        \"value\": \"DRAFT_6\"\n-                                    },\n+                                        \"dependentValues\": [\n+                                            \"asana-collect-project-members\",\n+                                            \"asana-collect-project-status-attachments\",\n+                                            \"asana-collect-project-status-updates\",\n+                                            \"asana-collect-task-attachments\",\n+                                            \"asana-collect-stories\",\n+                                            \"asana-collect-tasks\",\n+                                            \"asana-collect-project-events\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Object Type\",\n+                                        \"propertyName\": \"asana-object-type\"\n+                                    }\n+                                ],\n+                                \"description\": \"Fetch only objects in this project. Case sensitive.\",\n+                                \"displayName\": \"Project Name\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"asana-project-name\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"asana-section-name\": {\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"Draft Version 7\",\n-                                        \"displayName\": \"Draft 7\",\n-                                        \"value\": \"DRAFT_7\"\n-                                    },\n+                                        \"dependentValues\": [\n+                                            \"asana-collect-task-attachments\",\n+                                            \"asana-collect-stories\",\n+                                            \"asana-collect-tasks\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Object Type\",\n+                                        \"propertyName\": \"asana-object-type\"\n+                                    }\n+                                ],\n+                                \"description\": \"Fetch only objects in this section. Case sensitive.\",\n+                                \"displayName\": \"Section Name\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"asana-section-name\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"asana-tag-name\": {\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"Draft Version 2019-09\",\n-                                        \"displayName\": \"Draft 2019-09\",\n-                                        \"value\": \"DRAFT_2019_09\"\n-                                    },\n+                                        \"dependentValues\": [\n+                                            \"asana-collect-task-attachments\",\n+                                            \"asana-collect-stories\",\n+                                            \"asana-collect-tasks\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Object Type\",\n+                                        \"propertyName\": \"asana-object-type\"\n+                                    }\n+                                ],\n+                                \"description\": \"Fetch only objects having this tag. Case sensitive.\",\n+                                \"displayName\": \"Tag\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"asana-tag-name\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"asana-team-name\": {\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"Draft Version 2020-12\",\n-                                        \"displayName\": \"Draft 2020-12\",\n-                                        \"value\": \"DRAFT_2020_12\"\n+                                        \"dependentValues\": [\n+                                            \"asana-collect-team-members\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Object Type\",\n+                                        \"propertyName\": \"asana-object-type\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"DRAFT_2020_12\",\n-                                \"description\": \"The JSON schema specification\",\n-                                \"displayName\": \"JSON Schema Version\",\n+                                \"description\": \"Team name. Case sensitive.\",\n+                                \"displayName\": \"Team\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"JSON Schema Version\",\n-                                \"required\": true,\n+                                \"name\": \"asana-team-name\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n+                            },\n+                            \"distributed-cache-service\": {\n+                                \"description\": \"Cache service to store fetched item fingerprints. These, from the last successful query are stored, in order to enable incremental loading and change detection.\",\n+                                \"displayName\": \"Distributed Cache Service\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"distributed-cache-service\",\n+                                \"required\": true,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.distributed.cache.client.DistributedMapCacheClient\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n                             }\n                         },\n-                        \"providedApiImplementations\": [\n+                        \"sideEffectFree\": false,\n+                        \"supportedRelationships\": [\n                             {\n-                                \"artifact\": \"nifi-standard-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.schemaregistry.services.JsonSchemaRegistry\",\n-                                \"version\": \"1.27.0\"\n+                                \"description\": \"Notification about deleted objects are routed to this relationship. Flow files will not have any payload. IDs of the resources no longer exist are carried by the asana.gid attribute of the generated FlowFiles.\",\n+                                \"name\": \"removed\"\n+                            },\n+                            {\n+                                \"description\": \"Newly collected objects are routed to this relationship.\",\n+                                \"name\": \"new\"\n+                            },\n+                            {\n+                                \"description\": \"Objects that have already been collected earlier, but were updated since, are routed to this relationship.\",\n+                                \"name\": \"updated\"\n                             }\n                         ],\n-                        \"supportsDynamicProperties\": true,\n+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\"\n+                        ],\n+                        \"supportsBatching\": false,\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicRelationships\": false,\n+                        \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n+                        \"systemResourceConsiderations\": [\n+                            {\n+                                \"description\": \"An instance of this component can cause high usage of this system resource.  Multiple instances or high concurrency settings may result a degradation of performance.\",\n+                                \"resource\": \"MEMORY\"\n+                            }\n+                        ],\n                         \"tags\": [\n-                            \"json\",\n-                            \"registry\",\n-                            \"schema\"\n+                            \"asana\",\n+                            \"ingest\",\n+                            \"source\"\n                         ],\n-                        \"type\": \"org.apache.nifi.schemaregistry.services.StandardJsonSchemaRegistry\",\n-                        \"typeDescription\": \"Provides a service for registering and accessing JSON schemas. One can register a schema as a dynamic property where 'name' represents the schema name and 'value' represents the textual representation of the actual schema following the syntax and semantics of the JSON Schema format. Empty schemas and schemas only consisting of whitespace are not acceptable schemas.The registry is heterogeneous registry as it can store schemas of different schema draft versions. By default the registry is configured to store schemas of Draft 2020-12. When a schema is added, the version which is currently is set, is what the schema is saved as.\",\n-                        \"version\": \"1.27.0\"\n+                        \"triggerSerially\": true,\n+                        \"triggerWhenAnyDestinationAvailable\": false,\n+                        \"triggerWhenEmpty\": false,\n+                        \"type\": \"org.apache.nifi.processors.asana.GetAsanaObject\",\n+                        \"typeDescription\": \"This processor collects data from Asana\",\n+                        \"version\": \"1.27.0\",\n+                        \"writesAttributes\": [\n+                            {\n+                                \"description\": \"Global ID of the object in Asana.\",\n+                                \"name\": \"asana.gid\"\n+                            }\n+                        ]\n                     }\n                 ],\n-                \"processors\": [],\n                 \"reportingTasks\": []\n             },\n             \"group\": \"org.apache.nifi\",\n             \"version\": \"1.27.0\"\n         },\n         {\n-            \"artifact\": \"nifi-kafka-1-0-nar\",\n+            \"artifact\": \"nifi-record-sink-service-nar\",\n             \"componentManifest\": {\n                 \"controllerServices\": [\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-kafka-1-0-nar\",\n+                        \"artifact\": \"nifi-record-sink-service-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n-                        \"deprecated\": true,\n-                        \"deprecationAlternatives\": [\n-                            \"org.apache.nifi.record.sink.kafka.KafkaRecordSink_2_6\"\n-                        ],\n-                        \"deprecationReason\": \"\",\n-                        \"dynamicProperties\": [\n-                            {\n-                                \"description\": \"These properties will be added on the Kafka configuration after loading any provided configuration properties. In the event a dynamic property represents a property that was already set, its value will be ignored and WARN message logged. For the list of available Kafka properties please refer to: http://kafka.apache.org/documentation.html#configuration. \",\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"name\": \"The name of a Kafka configuration property.\",\n-                                \"value\": \"The value of a given Kafka configuration property.\"\n-                            }\n-                        ],\n                         \"group\": \"org.apache.nifi\",\n                         \"propertyDescriptors\": {\n-                            \"ack.wait.time\": {\n-                                \"defaultValue\": \"5 secs\",\n-                                \"description\": \"After sending a message to Kafka, this indicates the amount of time that we are willing to wait for a response from Kafka. If Kafka does not acknowledge the message within this time period, the FlowFile will be routed to 'failure'.\",\n-                                \"displayName\": \"Acknowledgment Wait Time\",\n+                            \"bcc\": {\n+                                \"description\": \"The recipients to include in the BCC-Line of the email. Comma separated sequence of addresses following RFC822 syntax.\",\n+                                \"displayName\": \"BCC\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"bcc\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"cc\": {\n+                                \"description\": \"The recipients to include in the CC-Line of the email. Comma separated sequence of addresses following RFC822 syntax.\",\n+                                \"displayName\": \"CC\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"cc\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"from\": {\n+                                \"description\": \"Specifies the Email address to use as the sender. Comma separated sequence of addresses following RFC822 syntax.\",\n+                                \"displayName\": \"From\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"from\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"record-sink-record-writer\": {\n+                                \"description\": \"Specifies the Controller Service to use for writing out the records.\",\n+                                \"displayName\": \"Record Writer\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"ack.wait.time\",\n+                                \"name\": \"record-sink-record-writer\",\n+                                \"required\": true,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"smtp-auth\": {\n+                                \"defaultValue\": \"true\",\n+                                \"description\": \"Flag indicating whether authentication should be used\",\n+                                \"displayName\": \"SMTP Auth\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"smtp-auth\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"acks\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"Records are considered 'transmitted successfully' after successfully writing the content to a Kafka node, without waiting for a response. This provides the best performance but may result in data loss.\",\n-                                        \"displayName\": \"Best Effort\",\n-                                        \"value\": \"0\"\n-                                    },\n+                            \"smtp-hostname\": {\n+                                \"description\": \"The hostname of the SMTP Server that is used to send Email Notifications\",\n+                                \"displayName\": \"SMTP Hostname\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"smtp-hostname\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"smtp-password\": {\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"Records are considered 'transmitted successfully' if the message is received by a single Kafka node, whether or not it is replicated. This is faster than <Guarantee Replicated Delivery> but can result in data loss if a Kafka node crashes.\",\n-                                        \"displayName\": \"Guarantee Single Node Delivery\",\n-                                        \"value\": \"1\"\n-                                    },\n+                                        \"dependentValues\": [\n+                                            \"true\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"SMTP Auth\",\n+                                        \"propertyName\": \"smtp-auth\"\n+                                    }\n+                                ],\n+                                \"description\": \"Password for the SMTP account\",\n+                                \"displayName\": \"SMTP Password\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"smtp-password\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n+                            },\n+                            \"smtp-port\": {\n+                                \"defaultValue\": \"25\",\n+                                \"description\": \"The Port used for SMTP communications\",\n+                                \"displayName\": \"SMTP Port\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"smtp-port\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"smtp-ssl\": {\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"Flag indicating whether SSL should be enabled\",\n+                                \"displayName\": \"SMTP SSL\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"smtp-ssl\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"smtp-starttls\": {\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"Flag indicating whether STARTTLS should be enabled. If the server does not support STARTTLS, the connection continues without the use of TLS\",\n+                                \"displayName\": \"SMTP STARTTLS\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"smtp-starttls\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"smtp-username\": {\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"Records are considered 'transmitted unsuccessfully' unless the message is replicated to the appropriate number of Kafka Nodes according to the Topic configuration.\",\n-                                        \"displayName\": \"Guarantee Replicated Delivery\",\n-                                        \"value\": \"all\"\n+                                        \"dependentValues\": [\n+                                            \"true\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"SMTP Auth\",\n+                                        \"propertyName\": \"smtp-auth\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"0\",\n-                                \"description\": \"Specifies the requirement for guaranteeing that a message is sent to Kafka. Corresponds to Kafka's 'acks' property.\",\n-                                \"displayName\": \"Delivery Guarantee\",\n+                                \"description\": \"Username for the SMTP account\",\n+                                \"displayName\": \"SMTP Username\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"acks\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"smtp-username\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"smtp-xmailer-header\": {\n+                                \"defaultValue\": \"NiFi\",\n+                                \"description\": \"X-Mailer used in the header of the outgoing email\",\n+                                \"displayName\": \"SMTP X-Mailer Header\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"smtp-xmailer-header\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"bootstrap.servers\": {\n-                                \"defaultValue\": \"localhost:9092\",\n-                                \"description\": \"Comma-separated list of Kafka Brokers in the format host:port\",\n-                                \"displayName\": \"Kafka Brokers\",\n+                            \"subject\": {\n+                                \"defaultValue\": \"Message from NiFi\",\n+                                \"description\": \"The email subject\",\n+                                \"displayName\": \"Subject\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"bootstrap.servers\",\n+                                \"name\": \"subject\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"compression.type\": {\n+                            \"to\": {\n+                                \"description\": \"The recipients to include in the To-Line of the email. Comma separated sequence of addresses following RFC822 syntax.\",\n+                                \"displayName\": \"To\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"to\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            }\n+                        },\n+                        \"providedApiImplementations\": [\n+                            {\n+                                \"artifact\": \"nifi-standard-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.record.sink.RecordSinkService\",\n+                                \"version\": \"1.27.0\"\n+                            }\n+                        ],\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"email\",\n+                            \"record\",\n+                            \"send\",\n+                            \"sink\",\n+                            \"smtp\",\n+                            \"write\"\n+                        ],\n+                        \"type\": \"org.apache.nifi.record.sink.EmailRecordSink\",\n+                        \"typeDescription\": \"Provides a RecordSinkService that can be used to send records in email using the specified writer for formatting.\",\n+                        \"version\": \"1.27.0\"\n+                    },\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-record-sink-service-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"e0c4461\"\n+                        },\n+                        \"group\": \"org.apache.nifi\",\n+                        \"propertyDescriptors\": {\n+                            \"logsink-log-level\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"none\",\n-                                        \"value\": \"none\"\n+                                        \"displayName\": \"TRACE\",\n+                                        \"value\": \"TRACE\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"gzip\",\n-                                        \"value\": \"gzip\"\n+                                        \"displayName\": \"DEBUG\",\n+                                        \"value\": \"DEBUG\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"snappy\",\n-                                        \"value\": \"snappy\"\n+                                        \"displayName\": \"INFO\",\n+                                        \"value\": \"INFO\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"lz4\",\n-                                        \"value\": \"lz4\"\n+                                        \"displayName\": \"WARN\",\n+                                        \"value\": \"WARN\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"ERROR\",\n+                                        \"value\": \"ERROR\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"FATAL\",\n+                                        \"value\": \"FATAL\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"NONE\",\n+                                        \"value\": \"NONE\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"none\",\n-                                \"description\": \"This parameter allows you to specify the compression codec for all data generated by this producer.\",\n-                                \"displayName\": \"Compression Type\",\n+                                \"defaultValue\": \"INFO\",\n+                                \"description\": \"The Log Level at which to log records (INFO, DEBUG, e.g.)\",\n+                                \"displayName\": \"Log Level\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"compression.type\",\n+                                \"name\": \"logsink-log-level\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"kerberos-credentials-service\": {\n-                                \"description\": \"Service supporting generalized credentials authentication with Kerberos\",\n-                                \"displayName\": \"Kerberos Credentials Service\",\n+                            \"record-sink-record-writer\": {\n+                                \"description\": \"Specifies the Controller Service to use for writing out the records.\",\n+                                \"displayName\": \"Record Writer\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"kerberos-credentials-service\",\n-                                \"required\": false,\n+                                \"name\": \"record-sink-record-writer\",\n+                                \"required\": true,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n                                     \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.kerberos.KerberosCredentialsService\",\n+                                    \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n                                     \"version\": \"1.27.0\"\n                                 }\n-                            },\n-                            \"max.block.ms\": {\n-                                \"defaultValue\": \"5 sec\",\n-                                \"description\": \"The amount of time publisher will wait to obtain metadata or wait for the buffer to flush during the 'send' call before failing the entire 'send' call. Corresponds to Kafka's 'max.block.ms' property\",\n-                                \"displayName\": \"Max Metadata Wait Time\",\n+                            }\n+                        },\n+                        \"providedApiImplementations\": [\n+                            {\n+                                \"artifact\": \"nifi-standard-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.record.sink.RecordSinkService\",\n+                                \"version\": \"1.27.0\"\n+                            }\n+                        ],\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"log\",\n+                            \"record\",\n+                            \"sink\"\n+                        ],\n+                        \"type\": \"org.apache.nifi.record.sink.LoggingRecordSink\",\n+                        \"typeDescription\": \"Provides a RecordSinkService that can be used to log records to the application log (nifi-app.log, e.g.) using the specified writer for formatting.\",\n+                        \"version\": \"1.27.0\"\n+                    },\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-record-sink-service-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"e0c4461\"\n+                        },\n+                        \"group\": \"org.apache.nifi\",\n+                        \"propertyDescriptors\": {\n+                            \"hostname\": {\n+                                \"description\": \"Destination hostname or IP address\",\n+                                \"displayName\": \"Hostname\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"max.block.ms\",\n+                                \"name\": \"hostname\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"max.request.size\": {\n-                                \"defaultValue\": \"1 MB\",\n-                                \"description\": \"The maximum size of a request in bytes. Corresponds to Kafka's 'max.request.size' property and defaults to 1 MB (1048576).\",\n-                                \"displayName\": \"Max Request Size\",\n+                            \"port\": {\n+                                \"description\": \"Destination port number\",\n+                                \"displayName\": \"Port\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"max.request.size\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"port\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"message-header-encoding\": {\n-                                \"defaultValue\": \"UTF-8\",\n-                                \"description\": \"For any attribute that is added as a message header, as configured via the <Attributes to Send as Headers> property, this property indicates the Character Encoding to use for serializing the headers.\",\n-                                \"displayName\": \"Message Header Encoding\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"message-header-encoding\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n                             \"record-sink-record-writer\": {\n                                 \"description\": \"Specifies the Controller Service to use for writing out the records.\",\n                                 \"displayName\": \"Record Writer\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n                                 \"name\": \"record-sink-record-writer\",\n@@ -62899,141 +60000,261 @@\n                                 \"typeProvidedByValue\": {\n                                     \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n                                     \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             },\n-                            \"sasl.kerberos.service.name\": {\n-                                \"description\": \"The service name that matches the primary name of the Kafka server configured in the broker JAAS configuration\",\n-                                \"displayName\": \"Kerberos Service Name\",\n+                            \"sender-threads\": {\n+                                \"defaultValue\": \"2\",\n+                                \"description\": \"Number of worker threads allocated for handling socket communication\",\n+                                \"displayName\": \"Sender Threads\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"sasl.kerberos.service.name\",\n-                                \"required\": false,\n+                                \"name\": \"sender-threads\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n-                            },\n-                            \"sasl.mechanism\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"General Security Services API for Kerberos authentication\",\n-                                        \"displayName\": \"GSSAPI\",\n-                                        \"value\": \"GSSAPI\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Plain username and password authentication\",\n-                                        \"displayName\": \"PLAIN\",\n-                                        \"value\": \"PLAIN\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Salted Challenge Response Authentication Mechanism using SHA-512 with username and password\",\n-                                        \"displayName\": \"SCRAM-SHA-256\",\n-                                        \"value\": \"SCRAM-SHA-256\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Salted Challenge Response Authentication Mechanism using SHA-256 with username and password\",\n-                                        \"displayName\": \"SCRAM-SHA-512\",\n-                                        \"value\": \"SCRAM-SHA-512\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"GSSAPI\",\n-                                \"description\": \"SASL mechanism used for authentication. Corresponds to Kafka Client sasl.mechanism property\",\n-                                \"displayName\": \"SASL Mechanism\",\n+                            }\n+                        },\n+                        \"providedApiImplementations\": [\n+                            {\n+                                \"artifact\": \"nifi-standard-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.record.sink.RecordSinkService\",\n+                                \"version\": \"1.27.0\"\n+                            }\n+                        ],\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"UDP\",\n+                            \"event\",\n+                            \"record\",\n+                            \"sink\"\n+                        ],\n+                        \"type\": \"org.apache.nifi.record.sink.event.UDPEventRecordSink\",\n+                        \"typeDescription\": \"Format and send Records as UDP Datagram Packets to a configurable destination\",\n+                        \"version\": \"1.27.0\"\n+                    },\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-record-sink-service-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"e0c4461\"\n+                        },\n+                        \"dynamicProperties\": [\n+                            {\n+                                \"description\": \"If 'record.sink.name' attribute contains the name of the dynamic property, then the RecordSinkService (registered in the value) will be selected.\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"name\": \"The name to register the specified RecordSinkService\",\n+                                \"value\": \"The RecordSinkService\"\n+                            }\n+                        ],\n+                        \"group\": \"org.apache.nifi\",\n+                        \"providedApiImplementations\": [\n+                            {\n+                                \"artifact\": \"nifi-standard-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.record.sink.RecordSinkService\",\n+                                \"version\": \"1.27.0\"\n+                            }\n+                        ],\n+                        \"supportsDynamicProperties\": true,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"lookup\",\n+                            \"record\",\n+                            \"sink\"\n+                        ],\n+                        \"type\": \"org.apache.nifi.record.sink.lookup.RecordSinkServiceLookup\",\n+                        \"typeDescription\": \"Provides a RecordSinkService that can be used to dynamically select another RecordSinkService. This service requires an attribute named 'record.sink.name' to be passed in when asking for a connection, and will throw an exception if the attribute is missing. The value of 'record.sink.name' will be used to select the RecordSinkService that has been registered with that name. This will allow multiple RecordSinkServices to be defined and registered, and then selected dynamically at runtime by tagging flow files with the appropriate 'record.sink.name' attribute. Note that this controller service is not intended for use in reporting tasks that employ RecordSinkService instances, such as QueryNiFiReportingTask.\",\n+                        \"version\": \"1.27.0\"\n+                    }\n+                ],\n+                \"processors\": [],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"1.27.0\"\n+        },\n+        {\n+            \"artifact\": \"nifi-http-context-map-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-http-context-map-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"e0c4461\"\n+                        },\n+                        \"group\": \"org.apache.nifi\",\n+                        \"propertyDescriptors\": {\n+                            \"Maximum Outstanding Requests\": {\n+                                \"defaultValue\": \"5000\",\n+                                \"description\": \"The maximum number of HTTP requests that can be outstanding at any one time. Any attempt to register an additional HTTP Request will cause an error\",\n+                                \"displayName\": \"Maximum Outstanding Requests\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"sasl.mechanism\",\n+                                \"name\": \"Maximum Outstanding Requests\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"security.protocol\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"PLAINTEXT\",\n-                                        \"value\": \"PLAINTEXT\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"SSL\",\n-                                        \"value\": \"SSL\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"SASL_PLAINTEXT\",\n-                                        \"value\": \"SASL_PLAINTEXT\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"SASL_SSL\",\n-                                        \"value\": \"SASL_SSL\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"PLAINTEXT\",\n-                                \"description\": \"Security protocol used to communicate with brokers. Corresponds to Kafka Client security.protocol property\",\n-                                \"displayName\": \"Security Protocol\",\n+                            \"Request Expiration\": {\n+                                \"defaultValue\": \"1 min\",\n+                                \"description\": \"Specifies how long an HTTP Request should be left unanswered before being evicted from the cache and being responded to with a Service Unavailable status code\",\n+                                \"displayName\": \"Request Expiration\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"security.protocol\",\n+                                \"name\": \"Request Expiration\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            }\n+                        },\n+                        \"providedApiImplementations\": [\n+                            {\n+                                \"artifact\": \"nifi-standard-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.http.HttpContextMap\",\n+                                \"version\": \"1.27.0\"\n+                            }\n+                        ],\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.processors.standard.HandleHttpRequest\",\n+                            \"org.apache.nifi.processors.standard.HandleHttpResponse\"\n+                        ],\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"http\",\n+                            \"request\",\n+                            \"response\"\n+                        ],\n+                        \"type\": \"org.apache.nifi.http.StandardHttpContextMap\",\n+                        \"typeDescription\": \"Provides the ability to store and retrieve HTTP requests and responses external to a Processor, so that multiple Processors can interact with the same HTTP request.\",\n+                        \"version\": \"1.27.0\"\n+                    }\n+                ],\n+                \"processors\": [],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"1.27.0\"\n+        },\n+        {\n+            \"artifact\": \"nifi-jms-cf-service-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [],\n+                \"processors\": [],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"1.27.0\"\n+        },\n+        {\n+            \"artifact\": \"nifi-box-services-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [\n+                    {\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-box-services-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"e0c4461\"\n+                        },\n+                        \"group\": \"org.apache.nifi\",\n+                        \"propertyDescriptors\": {\n+                            \"app-config-file\": {\n+                                \"description\": \"Full path of an App config JSON file. See Additional Details for more information.\",\n+                                \"displayName\": \"App Config File\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"app-config-file\",\n+                                \"required\": false,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"SINGLE\",\n+                                    \"resourceTypes\": [\n+                                        \"FILE\"\n+                                    ]\n+                                },\n+                                \"sensitive\": false\n+                            },\n+                            \"app-config-json\": {\n+                                \"description\": \"The raw JSON containing an App config. See Additional Details for more information.\",\n+                                \"displayName\": \"App Config JSON\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"app-config-json\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n+                            },\n+                            \"box-account-id\": {\n+                                \"description\": \"The ID of the Box account who owns the accessed resource. Same as 'User Id' under 'App Info' in the App 'General Settings'.\",\n+                                \"displayName\": \"Account ID\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"box-account-id\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"ssl.context.service\": {\n-                                \"description\": \"Service supporting SSL communication with Kafka brokers\",\n-                                \"displayName\": \"SSL Context Service\",\n+                            \"proxy-configuration-service\": {\n+                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests. Supported proxies: HTTP + AuthN\",\n+                                \"displayName\": \"Proxy Configuration Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"ssl.context.service\",\n+                                \"name\": \"proxy-configuration-service\",\n                                 \"required\": false,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n                                     \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n+                                    \"type\": \"org.apache.nifi.proxy.ProxyConfigurationService\",\n                                     \"version\": \"1.27.0\"\n                                 }\n-                            },\n-                            \"topic\": {\n-                                \"description\": \"The name of the Kafka Topic to publish to.\",\n-                                \"displayName\": \"Topic Name\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"topic\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n                             }\n                         },\n                         \"providedApiImplementations\": [\n                             {\n-                                \"artifact\": \"nifi-standard-services-api-nar\",\n+                                \"artifact\": \"nifi-box-services-api-nar\",\n                                 \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.record.sink.RecordSinkService\",\n+                                \"type\": \"org.apache.nifi.box.controllerservices.BoxClientService\",\n                                 \"version\": \"1.27.0\"\n                             }\n                         ],\n-                        \"supportsDynamicProperties\": true,\n+                        \"supportsDynamicProperties\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"kafka\",\n-                            \"record\",\n-                            \"sink\"\n+                            \"box\",\n+                            \"client\",\n+                            \"provider\"\n                         ],\n-                        \"type\": \"org.apache.nifi.record.sink.kafka.KafkaRecordSink_1_0\",\n-                        \"typeDescription\": \"Provides a service to write records to a Kafka 1.x topic.\",\n+                        \"type\": \"org.apache.nifi.box.controllerservices.JsonConfigBasedBoxClientService\",\n+                        \"typeDescription\": \"Provides Box client objects through which Box API calls can be used.\",\n                         \"version\": \"1.27.0\"\n                     }\n                 ],\n+                \"processors\": [],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"1.27.0\"\n+        },\n+        {\n+            \"artifact\": \"nifi-stateless-processor-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [],\n                 \"processors\": [\n                     {\n                         \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-kafka-1-0-nar\",\n+                        \"artifact\": \"nifi-stateless-processor-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -63041,417 +60262,972 @@\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n-                        \"deprecated\": true,\n-                        \"deprecationAlternatives\": [\n-                            \"org.apache.nifi.processors.kafka.pubsub.ConsumeKafkaRecord_2_6\"\n-                        ],\n-                        \"deprecationReason\": \"\",\n                         \"dynamicProperties\": [\n                             {\n-                                \"description\": \"These properties will be added on the Kafka configuration after loading any provided configuration properties. In the event a dynamic property represents a property that was already set, its value will be ignored and WARN message logged. For the list of available Kafka properties please refer to: http://kafka.apache.org/documentation.html#configuration. \",\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"name\": \"The name of a Kafka configuration property.\",\n-                                \"value\": \"The value of a given Kafka configuration property.\"\n+                                \"description\": \"Any dynamic property that is added will be provided to the stateless flow as a Parameter. The name of the property will be the name of the Parameter, and the value of the property will be the value of the Parameter. Because Parameter values may or may not be sensitive, all dynamic properties will be considered sensitive in order to protect their integrity.\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"name\": \"Any Parameter name\",\n+                                \"value\": \"Any value\"\n                             }\n                         ],\n+                        \"explicitRestrictions\": [],\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n+                        \"inputRequirement\": \"INPUT_ALLOWED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"auto.offset.reset\": {\n+                            \"Communications Timeout\": {\n+                                \"defaultValue\": \"15 secs\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"Use NiFi Registry\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Dataflow Specification Strategy\",\n+                                        \"propertyName\": \"Dataflow Specification Strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"Specifies how long to wait before timing out when attempting to communicate with NiFi Registry\",\n+                                \"displayName\": \"Communications Timeout\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Communications Timeout\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Content Storage Strategy\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Automatically reset the offset to the earliest offset\",\n-                                        \"displayName\": \"earliest\",\n-                                        \"value\": \"earliest\"\n+                                        \"description\": \"The FlowFile content will be stored on the NiFi JVM's heap. This is the most efficient option for small FlowFiles but can quickly exhaust the heap with larger FlowFiles, resulting in Out Of Memory Errors and node instability.\",\n+                                        \"displayName\": \"Store Content on Heap\",\n+                                        \"value\": \"Store Content on Heap\"\n                                     },\n                                     {\n-                                        \"description\": \"Automatically reset the offset to the latest offset\",\n-                                        \"displayName\": \"latest\",\n-                                        \"value\": \"latest\"\n-                                    },\n+                                        \"description\": \"The FlowFile content will be stored on disk, within the configured Work Directory. The content will still be cleared between invocations and will not be persisted across restarts.\",\n+                                        \"displayName\": \"Store Content on Disk\",\n+                                        \"value\": \"Store Content on Disk\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"Store Content on Disk\",\n+                                \"description\": \"Specifies where the content of FlowFiles that the Stateless dataflow is operating on should be stored. Note that the data is always considered temporary and may be deleted at any time. It is not intended to be persisted across restarted.\",\n+                                \"displayName\": \"Content Storage Strategy\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Content Storage Strategy\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Dataflow File\": {\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"Throw exception to the consumer if no previous offset is found for the consumer's group\",\n-                                        \"displayName\": \"none\",\n-                                        \"value\": \"none\"\n+                                        \"dependentValues\": [\n+                                            \"Use Local File\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Dataflow Specification Strategy\",\n+                                        \"propertyName\": \"Dataflow Specification Strategy\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"latest\",\n-                                \"description\": \"Allows you to manage the condition when there is no initial offset in Kafka or if the current offset does not exist any more on the server (e.g. because that data has been deleted). Corresponds to Kafka's 'auto.offset.reset' property.\",\n-                                \"displayName\": \"Offset Reset\",\n+                                \"description\": \"The filename or URL that specifies the dataflow that is to be run\",\n+                                \"displayName\": \"Dataflow File/URL\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"auto.offset.reset\",\n+                                \"name\": \"Dataflow File\",\n                                 \"required\": true,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"SINGLE\",\n+                                    \"resourceTypes\": [\n+                                        \"FILE\",\n+                                        \"URL\"\n+                                    ]\n+                                },\n                                 \"sensitive\": false\n                             },\n-                            \"bootstrap.servers\": {\n-                                \"defaultValue\": \"localhost:9092\",\n-                                \"description\": \"Comma-separated list of Kafka Brokers in the format host:port\",\n-                                \"displayName\": \"Kafka Brokers\",\n+                            \"Dataflow Specification Strategy\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"Dataflow to run is stored as a file on the NiFi server or at a URL that is accessible to the NiFi server\",\n+                                        \"displayName\": \"Use Local File or URL\",\n+                                        \"value\": \"Use Local File\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Dataflow to run is stored in NiFi Registry\",\n+                                        \"displayName\": \"Use NiFi Registry\",\n+                                        \"value\": \"Use NiFi Registry\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"Use Local File\",\n+                                \"description\": \"Specifies how the Processor should obtain a copy of the dataflow that it is to run\",\n+                                \"displayName\": \"Dataflow Specification Strategy\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"bootstrap.servers\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Dataflow Specification Strategy\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"group.id\": {\n-                                \"description\": \"A Group ID is used to identify consumers that are within the same consumer group. Corresponds to Kafka's 'group.id' property.\",\n-                                \"displayName\": \"Group ID\",\n+                            \"Dataflow Timeout\": {\n+                                \"defaultValue\": \"60 sec\",\n+                                \"description\": \"If the flow does not complete within this amount of time, the incoming FlowFile, if any, will be routed to the timeout relationship,the dataflow will be cancelled, and the invocation will end.\",\n+                                \"displayName\": \"Dataflow Timeout\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"group.id\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Dataflow Timeout\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"header-name-regex\": {\n-                                \"description\": \"A Regular Expression that is matched against all message headers. Any message header whose name matches the regex will be added to the FlowFile as an Attribute. If not specified, no Header values will be added as FlowFile attributes. If two messages have a different value for the same header and that header is selected by the provided regex, then those two messages must be added to different FlowFiles. As a result, users should be cautious about using a regex like \\\".*\\\" if messages are expected to have header values that are unique per message, such as an identifier or timestamp, because it will prevent NiFi from bundling the messages together efficiently.\",\n-                                \"displayName\": \"Headers to Add as Attributes (Regex)\",\n+                            \"Failure Ports\": {\n+                                \"description\": \"A comma-separated list of the names of Output Ports that exist at the root level of the dataflow. If any FlowFile is routed to one of the Ports whose name is listed here, the dataflow will be considered a failure, and the incoming FlowFile (if any) will be routed to 'failure'. If not specified, all Output Ports will be considered successful.\",\n+                                \"displayName\": \"Failure Ports\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"header-name-regex\",\n+                                \"name\": \"Failure Ports\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"honor-transactions\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n+                            \"Flow Name\": {\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"dependentValues\": [\n+                                            \"Use NiFi Registry\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Dataflow Specification Strategy\",\n+                                        \"propertyName\": \"Dataflow Specification Strategy\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"true\",\n-                                \"description\": \"Specifies whether or not NiFi should honor transactional guarantees when communicating with Kafka. If false, the Processor will use an \\\"isolation level\\\" of read_uncomitted. This means that messages will be received as soon as they are written to Kafka but will be pulled, even if the producer cancels the transactions. If this value is true, NiFi will not receive any messages for which the producer's transaction was canceled, but this can result in some latency since the consumer must wait for the producer to finish its entire transaction instead of pulling as the messages become available.\",\n-                                \"displayName\": \"Honor Transactions\",\n+                                \"description\": \"The name of the flow in the NiFi Registry\",\n+                                \"displayName\": \"Flow Name\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"honor-transactions\",\n+                                \"name\": \"Flow Name\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"kerberos-credentials-service\": {\n-                                \"description\": \"Service supporting generalized credentials authentication with Kerberos\",\n-                                \"displayName\": \"Kerberos Credentials Service\",\n+                            \"Flow Version\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"Use NiFi Registry\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Dataflow Specification Strategy\",\n+                                        \"propertyName\": \"Dataflow Specification Strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"The version of the flow in the NiFi Registry that should be retrieved. If not specified, the latest version will always be used.\",\n+                                \"displayName\": \"Flow Version\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"kerberos-credentials-service\",\n+                                \"name\": \"Flow Version\",\n                                 \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.kerberos.KerberosCredentialsService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n+                                \"sensitive\": false\n                             },\n-                            \"max-uncommit-offset-wait\": {\n-                                \"defaultValue\": \"1 secs\",\n-                                \"description\": \"Specifies the maximum amount of time allowed to pass before offsets must be committed. This value impacts how often offsets will be committed.  Committing offsets less often increases throughput but also increases the window of potential data duplication in the event of a rebalance or JVM restart between commits.  This value is also related to maximum poll records and the use of a message demarcator.  When using a message demarcator we can have far more uncommitted messages than when we're not as there is much less for us to keep track of in memory.\",\n-                                \"displayName\": \"Max Uncommitted Time\",\n+                            \"Input Port\": {\n+                                \"description\": \"Specifies the name of the Input Port to send incoming FlowFiles to. This property is required if this processor has any incoming connections.\",\n+                                \"displayName\": \"Input Port\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Input Port\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Krb5 Conf File\": {\n+                                \"description\": \"The KRB5 Conf file to use for configuring components that rely on Kerberos\",\n+                                \"displayName\": \"Krb5 Conf File\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"max-uncommit-offset-wait\",\n+                                \"name\": \"Krb5 Conf File\",\n                                 \"required\": false,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"SINGLE\",\n+                                    \"resourceTypes\": [\n+                                        \"FILE\"\n+                                    ]\n+                                },\n                                 \"sensitive\": false\n                             },\n-                            \"max.poll.records\": {\n-                                \"defaultValue\": \"10000\",\n-                                \"description\": \"Specifies the maximum number of records Kafka should return in a single poll.\",\n-                                \"displayName\": \"Max Poll Records\",\n+                            \"Max Ingest Data Size\": {\n+                                \"description\": \"During the course of a stateless dataflow, some processors may require more data than they have available in order to proceed. For example, MergeContent may require a minimum number of FlowFiles before it can proceed. In this case, the dataflow may bring in additional data from its source Processor. However, this data may all be held in memory, so this property provides a mechanism for limiting the maximum amount of data that the source Processor can ingest before it will no longer be triggered to ingest additional data.\",\n+                                \"displayName\": \"Max Ingest Data Size\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"max.poll.records\",\n+                                \"name\": \"Max Ingest Data Size\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"message-header-encoding\": {\n-                                \"defaultValue\": \"UTF-8\",\n-                                \"description\": \"Any message header that is found on a Kafka message will be added to the outbound FlowFile as an attribute. This property indicates the Character Encoding to use for deserializing the headers.\",\n-                                \"displayName\": \"Message Header Encoding\",\n+                            \"Max Ingest FlowFiles\": {\n+                                \"description\": \"During the course of a stateless dataflow, some processors may require more data than they have available in order to proceed. For example, MergeContent may require a minimum number of FlowFiles before it can proceed. In this case, the dataflow may bring in additional data from its source Processor. However, this data may all be held in memory, so this property provides a mechanism for limiting the maximum number of FlowFiles that the source Processor can ingest before it will no longer be triggered to ingest additional data.\",\n+                                \"displayName\": \"Max Ingest FlowFiles\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"message-header-encoding\",\n+                                \"name\": \"Max Ingest FlowFiles\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"record-reader\": {\n-                                \"description\": \"The Record Reader to use for incoming FlowFiles\",\n-                                \"displayName\": \"Record Reader\",\n+                            \"Max Input FlowFile Size\": {\n+                                \"defaultValue\": \"1 MB\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"Store Content on Heap\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Content Storage Strategy\",\n+                                        \"propertyName\": \"Content Storage Strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"This Processor is configured to load all incoming FlowFiles into memory. Because of that, it is important to limit the maximum size of any incoming FlowFile that would get loaded into memory, in order to prevent Out Of Memory Errors and excessive Garbage Collection. Any FlowFile whose content size is greater than the configured size will be routed to failure and not sent to the Stateless Engine.\",\n+                                \"displayName\": \"Max Input FlowFile Size\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"record-reader\",\n+                                \"name\": \"Max Input FlowFile Size\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"NAR Directory\": {\n+                                \"defaultValue\": \"./lib\",\n+                                \"description\": \"This directory has three roles: 1) it contains the NiFi Stateless NAR and other necessary libraries required for the Stateless engine to be bootstrapped, 2) it can contain extensions that should be loaded by the Stateless engine, 3) it is used by the Stateless engine to download extensions into.\",\n+                                \"displayName\": \"NAR Directory\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"NAR Directory\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Registry Bucket\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"Use NiFi Registry\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Dataflow Specification Strategy\",\n+                                        \"propertyName\": \"Dataflow Specification Strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"The name of the Bucket in the NiFi Registry that the flow should retrieved from\",\n+                                \"displayName\": \"Registry Bucket\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Registry Bucket\",\n                                 \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Registry SSL Context Service\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"Use NiFi Registry\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Dataflow Specification Strategy\",\n+                                        \"propertyName\": \"Dataflow Specification Strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"The SSL Context Service to use for interacting with the NiFi Registry\",\n+                                \"displayName\": \"Registry SSL Context Service\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Registry SSL Context Service\",\n+                                \"required\": false,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n                                     \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n+                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             },\n-                            \"record-writer\": {\n-                                \"description\": \"The Record Writer to use in order to serialize the data before sending to Kafka\",\n-                                \"displayName\": \"Record Writer\",\n+                            \"Registry URL\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"Use NiFi Registry\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Dataflow Specification Strategy\",\n+                                        \"propertyName\": \"Dataflow Specification Strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"The URL of the NiFi Registry to retrieve the flow from\",\n+                                \"displayName\": \"Registry URL\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"record-writer\",\n+                                \"name\": \"Registry URL\",\n                                 \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Stateless SSL Context Service\": {\n+                                \"description\": \"The SSL Context to use as the Stateless System SSL Context\",\n+                                \"displayName\": \"Stateless SSL Context Service\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Stateless SSL Context Service\",\n+                                \"required\": false,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n                                     \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n+                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             },\n-                            \"sasl.kerberos.keytab\": {\n-                                \"description\": \"Keytab credentials used for authentication with Kerberos\",\n-                                \"displayName\": \"Kerberos Keytab\",\n+                            \"Status Task Interval\": {\n+                                \"description\": \"The Stateless engine periodically logs the status of the dataflow's processors.  This property allows the interval to be changed, or the status logging to be skipped altogether if the property is not set.\",\n+                                \"displayName\": \"Status Task Interval\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"sasl.kerberos.keytab\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Status Task Interval\",\n                                 \"required\": false,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"SINGLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\"\n-                                    ]\n-                                },\n                                 \"sensitive\": false\n                             },\n-                            \"sasl.kerberos.principal\": {\n-                                \"description\": \"Principal used for authentication with Kerberos\",\n-                                \"displayName\": \"Kerberos Principal\",\n+                            \"Work Directory\": {\n+                                \"defaultValue\": \"./work\",\n+                                \"description\": \"A directory that can be used to create temporary files, such as expanding NAR files, temporary FlowFile content, caching the dataflow, etc.\",\n+                                \"displayName\": \"Work Directory\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"sasl.kerberos.principal\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Work Directory\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"additional-nar-directories\": {\n+                                \"description\": \"A comma-separated list of paths for directories that contain extensions that should be loaded by the stateless engine. The engine will not download any extensions into these directories or write to them but will read any NAR files that are found within these directories. The engine will not recurse into subdirectories of these directories.\",\n+                                \"displayName\": \"Additional NAR Directories\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"additional-nar-directories\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            }\n+                        },\n+                        \"restricted\": true,\n+                        \"sideEffectFree\": false,\n+                        \"supportedRelationships\": [\n+                            {\n+                                \"description\": \"If the dataflow fails to complete in the configured amount of time, any incoming FlowFile will be routed to this relationship\",\n+                                \"name\": \"timeout\"\n+                            },\n+                            {\n+                                \"description\": \"If the dataflow fails to process an incoming FlowFile, that FlowFile will be routed to this relationship\",\n+                                \"name\": \"failure\"\n+                            },\n+                            {\n+                                \"description\": \"For any incoming FlowFile that is successfully processed, the original incoming FlowFile will be transferred to this Relationship\",\n+                                \"name\": \"original\"\n+                            },\n+                            {\n+                                \"description\": \"Any FlowFiles that are transferred to an Output Port in the configured dataflow will be routed to this Relationship\",\n+                                \"name\": \"output\"\n+                            }\n+                        ],\n+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\"\n+                        ],\n+                        \"supportsBatching\": true,\n+                        \"supportsDynamicProperties\": true,\n+                        \"supportsDynamicRelationships\": false,\n+                        \"supportsEventDriven\": false,\n+                        \"supportsSensitiveDynamicProperties\": true,\n+                        \"systemResourceConsiderations\": [\n+                            {\n+                                \"description\": \"An instance of this component can cause high usage of this system resource.  Multiple instances or high concurrency settings may result a degradation of performance.\",\n+                                \"resource\": \"CPU\"\n+                            },\n+                            {\n+                                \"description\": \"An instance of this component can cause high usage of this system resource.  Multiple instances or high concurrency settings may result a degradation of performance.\",\n+                                \"resource\": \"DISK\"\n+                            },\n+                            {\n+                                \"description\": \"An instance of this component can cause high usage of this system resource.  Multiple instances or high concurrency settings may result a degradation of performance.\",\n+                                \"resource\": \"MEMORY\"\n+                            },\n+                            {\n+                                \"description\": \"An instance of this component can cause high usage of this system resource.  Multiple instances or high concurrency settings may result a degradation of performance.\",\n+                                \"resource\": \"NETWORK\"\n+                            }\n+                        ],\n+                        \"triggerSerially\": false,\n+                        \"triggerWhenAnyDestinationAvailable\": false,\n+                        \"triggerWhenEmpty\": false,\n+                        \"type\": \"org.apache.nifi.processors.stateless.ExecuteStateless\",\n+                        \"typeDescription\": \"Runs the configured dataflow using the Stateless NiFi engine. Please see documentation in order to understand the differences between the traditional NiFi runtime engine and the Stateless NiFi engine. If the Processor is configured with an incoming connection, the incoming FlowFiles will be queued up into the specified Input Port in the dataflow. Data that is transferred out of the flow via an Output Port will be sent to the 'output' relationship, and an attribute will be added to indicate which Port that FlowFile was transferred to. See Additional Details for more information.\",\n+                        \"version\": \"1.27.0\",\n+                        \"writesAttributes\": [\n+                            {\n+                                \"description\": \"The name of the Output Port that the FlowFile was transferred to\",\n+                                \"name\": \"output.port.name\"\n+                            },\n+                            {\n+                                \"description\": \"If one or more FlowFiles is routed to one of the Output Ports that is configured as a Failure Port, the input FlowFile (if any) will have this attribute added to it, indicating the name of the Port that caused the dataflow to be considered a failure.\",\n+                                \"name\": \"failure.port.name\"\n+                            }\n+                        ]\n+                    }\n+                ],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"1.27.0\"\n+        },\n+        {\n+            \"artifact\": \"nifi-distributed-cache-services-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-distributed-cache-services-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"e0c4461\"\n+                        },\n+                        \"group\": \"org.apache.nifi\",\n+                        \"propertyDescriptors\": {\n+                            \"Communications Timeout\": {\n+                                \"defaultValue\": \"30 secs\",\n+                                \"description\": \"Specifies how long to wait when communicating with the remote server before determining that there is a communications failure if data cannot be sent or received\",\n+                                \"displayName\": \"Communications Timeout\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Communications Timeout\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"SSL Context Service\": {\n+                                \"description\": \"If specified, indicates the SSL Context Service that is used to communicate with the remote server. If not specified, communications will not be encrypted\",\n+                                \"displayName\": \"SSL Context Service\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"SSL Context Service\",\n                                 \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"Server Hostname\": {\n+                                \"description\": \"The name of the server that is running the DistributedMapCacheServer service\",\n+                                \"displayName\": \"Server Hostname\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Server Hostname\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"sasl.kerberos.service.name\": {\n-                                \"description\": \"The service name that matches the primary name of the Kafka server configured in the broker JAAS configuration\",\n-                                \"displayName\": \"Kerberos Service Name\",\n+                            \"Server Port\": {\n+                                \"defaultValue\": \"4557\",\n+                                \"description\": \"The port on the remote server that is to be used when communicating with the DistributedMapCacheServer service\",\n+                                \"displayName\": \"Server Port\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"sasl.kerberos.service.name\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Server Port\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            }\n+                        },\n+                        \"providedApiImplementations\": [\n+                            {\n+                                \"artifact\": \"nifi-standard-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.distributed.cache.client.DistributedMapCacheClient\",\n+                                \"version\": \"1.27.0\"\n+                            },\n+                            {\n+                                \"artifact\": \"nifi-standard-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.distributed.cache.client.AtomicDistributedMapCacheClient\",\n+                                \"version\": \"1.27.0\"\n+                            }\n+                        ],\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.distributed.cache.server.map.DistributedMapCacheServer\",\n+                            \"org.apache.nifi.ssl.StandardSSLContextService\"\n+                        ],\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"cache\",\n+                            \"cluster\",\n+                            \"distributed\",\n+                            \"map\",\n+                            \"state\"\n+                        ],\n+                        \"type\": \"org.apache.nifi.distributed.cache.client.DistributedMapCacheClientService\",\n+                        \"typeDescription\": \"Provides the ability to communicate with a DistributedMapCacheServer. This can be used in order to share a Map between nodes in a NiFi cluster\",\n+                        \"version\": \"1.27.0\"\n+                    },\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-distributed-cache-services-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"e0c4461\"\n+                        },\n+                        \"group\": \"org.apache.nifi\",\n+                        \"propertyDescriptors\": {\n+                            \"Communications Timeout\": {\n+                                \"defaultValue\": \"30 secs\",\n+                                \"description\": \"Specifies how long to wait when communicating with the remote server before determining that there is a communications failure if data cannot be sent or received\",\n+                                \"displayName\": \"Communications Timeout\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Communications Timeout\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"SSL Context Service\": {\n+                                \"description\": \"If specified, indicates the SSL Context Service that is used to communicate with the remote server. If not specified, communications will not be encrypted\",\n+                                \"displayName\": \"SSL Context Service\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"SSL Context Service\",\n                                 \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"Server Hostname\": {\n+                                \"description\": \"The name of the server that is running the DistributedSetCacheServer service\",\n+                                \"displayName\": \"Server Hostname\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Server Hostname\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"sasl.mechanism\": {\n+                            \"Server Port\": {\n+                                \"defaultValue\": \"4557\",\n+                                \"description\": \"The port on the remote server that is to be used when communicating with the DistributedSetCacheServer service\",\n+                                \"displayName\": \"Server Port\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Server Port\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            }\n+                        },\n+                        \"providedApiImplementations\": [\n+                            {\n+                                \"artifact\": \"nifi-standard-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.distributed.cache.client.DistributedSetCacheClient\",\n+                                \"version\": \"1.27.0\"\n+                            }\n+                        ],\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.distributed.cache.server.DistributedSetCacheServer\",\n+                            \"org.apache.nifi.ssl.StandardSSLContextService\"\n+                        ],\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"cache\",\n+                            \"cluster\",\n+                            \"distributed\",\n+                            \"set\",\n+                            \"state\"\n+                        ],\n+                        \"type\": \"org.apache.nifi.distributed.cache.client.DistributedSetCacheClientService\",\n+                        \"typeDescription\": \"Provides the ability to communicate with a DistributedSetCacheServer. This can be used in order to share a Set between nodes in a NiFi cluster\",\n+                        \"version\": \"1.27.0\"\n+                    },\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-distributed-cache-services-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"e0c4461\"\n+                        },\n+                        \"group\": \"org.apache.nifi\",\n+                        \"propertyDescriptors\": {\n+                            \"Eviction Strategy\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"General Security Services API for Kerberos authentication\",\n-                                        \"displayName\": \"GSSAPI\",\n-                                        \"value\": \"GSSAPI\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Plain username and password authentication\",\n-                                        \"displayName\": \"PLAIN\",\n-                                        \"value\": \"PLAIN\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Least Frequently Used\",\n+                                        \"value\": \"Least Frequently Used\"\n                                     },\n                                     {\n-                                        \"description\": \"Salted Challenge Response Authentication Mechanism using SHA-512 with username and password\",\n-                                        \"displayName\": \"SCRAM-SHA-256\",\n-                                        \"value\": \"SCRAM-SHA-256\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Least Recently Used\",\n+                                        \"value\": \"Least Recently Used\"\n                                     },\n                                     {\n-                                        \"description\": \"Salted Challenge Response Authentication Mechanism using SHA-256 with username and password\",\n-                                        \"displayName\": \"SCRAM-SHA-512\",\n-                                        \"value\": \"SCRAM-SHA-512\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"First In, First Out\",\n+                                        \"value\": \"First In, First Out\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"GSSAPI\",\n-                                \"description\": \"SASL mechanism used for authentication. Corresponds to Kafka Client sasl.mechanism property\",\n-                                \"displayName\": \"SASL Mechanism\",\n+                                \"defaultValue\": \"Least Frequently Used\",\n+                                \"description\": \"Determines which strategy should be used to evict values from the cache to make room for new entries\",\n+                                \"displayName\": \"Eviction Strategy\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"sasl.mechanism\",\n+                                \"name\": \"Eviction Strategy\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"security.protocol\": {\n+                            \"Maximum Cache Entries\": {\n+                                \"defaultValue\": \"10000\",\n+                                \"description\": \"The maximum number of cache entries that the cache can hold\",\n+                                \"displayName\": \"Maximum Cache Entries\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Maximum Cache Entries\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Persistence Directory\": {\n+                                \"description\": \"If specified, the cache will be persisted in the given directory; if not specified, the cache will be in-memory only\",\n+                                \"displayName\": \"Persistence Directory\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Persistence Directory\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Port\": {\n+                                \"defaultValue\": \"4557\",\n+                                \"description\": \"The port to listen on for incoming connections\",\n+                                \"displayName\": \"Port\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Port\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"SSL Context Service\": {\n+                                \"description\": \"If specified, this service will be used to create an SSL Context that will be used to secure communications; if not specified, communications will not be secure\",\n+                                \"displayName\": \"SSL Context Service\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"SSL Context Service\",\n+                                \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.ssl.RestrictedSSLContextService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"maximum-read-size\": {\n+                                \"defaultValue\": \"1 MB\",\n+                                \"description\": \"The maximum number of network bytes to read for a single cache item\",\n+                                \"displayName\": \"Maximum Read Size\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"maximum-read-size\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            }\n+                        },\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"cache\",\n+                            \"distinct\",\n+                            \"distributed\",\n+                            \"server\",\n+                            \"set\"\n+                        ],\n+                        \"type\": \"org.apache.nifi.distributed.cache.server.DistributedSetCacheServer\",\n+                        \"typeDescription\": \"Provides a set (collection of unique values) cache that can be accessed over a socket. Interaction with this service is typically accomplished via a DistributedSetCacheClient service.\",\n+                        \"version\": \"1.27.0\"\n+                    },\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-distributed-cache-services-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"e0c4461\"\n+                        },\n+                        \"group\": \"org.apache.nifi\",\n+                        \"propertyDescriptors\": {\n+                            \"Eviction Strategy\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"PLAINTEXT\",\n-                                        \"value\": \"PLAINTEXT\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"SSL\",\n-                                        \"value\": \"SSL\"\n+                                        \"displayName\": \"Least Frequently Used\",\n+                                        \"value\": \"Least Frequently Used\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"SASL_PLAINTEXT\",\n-                                        \"value\": \"SASL_PLAINTEXT\"\n+                                        \"displayName\": \"Least Recently Used\",\n+                                        \"value\": \"Least Recently Used\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"SASL_SSL\",\n-                                        \"value\": \"SASL_SSL\"\n+                                        \"displayName\": \"First In, First Out\",\n+                                        \"value\": \"First In, First Out\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"PLAINTEXT\",\n-                                \"description\": \"Security protocol used to communicate with brokers. Corresponds to Kafka Client security.protocol property\",\n-                                \"displayName\": \"Security Protocol\",\n+                                \"defaultValue\": \"Least Frequently Used\",\n+                                \"description\": \"Determines which strategy should be used to evict values from the cache to make room for new entries\",\n+                                \"displayName\": \"Eviction Strategy\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"security.protocol\",\n+                                \"name\": \"Eviction Strategy\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"ssl.context.service\": {\n-                                \"description\": \"Service supporting SSL communication with Kafka brokers\",\n+                            \"Maximum Cache Entries\": {\n+                                \"defaultValue\": \"10000\",\n+                                \"description\": \"The maximum number of cache entries that the cache can hold\",\n+                                \"displayName\": \"Maximum Cache Entries\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Maximum Cache Entries\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Persistence Directory\": {\n+                                \"description\": \"If specified, the cache will be persisted in the given directory; if not specified, the cache will be in-memory only\",\n+                                \"displayName\": \"Persistence Directory\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Persistence Directory\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Port\": {\n+                                \"defaultValue\": \"4557\",\n+                                \"description\": \"The port to listen on for incoming connections\",\n+                                \"displayName\": \"Port\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Port\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"SSL Context Service\": {\n+                                \"description\": \"If specified, this service will be used to create an SSL Context that will be used to secure communications; if not specified, communications will not be secure\",\n                                 \"displayName\": \"SSL Context Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"ssl.context.service\",\n+                                \"name\": \"SSL Context Service\",\n                                 \"required\": false,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n                                     \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n+                                    \"type\": \"org.apache.nifi.ssl.RestrictedSSLContextService\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             },\n-                            \"topic\": {\n-                                \"description\": \"The name of the Kafka Topic(s) to pull from. More than one can be supplied if comma separated.\",\n-                                \"displayName\": \"Topic Name(s)\",\n+                            \"maximum-read-size\": {\n+                                \"defaultValue\": \"1 MB\",\n+                                \"description\": \"The maximum number of network bytes to read for a single cache item\",\n+                                \"displayName\": \"Maximum Read Size\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"topic\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"maximum-read-size\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            }\n+                        },\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.distributed.cache.client.DistributedMapCacheClientService\",\n+                            \"org.apache.nifi.ssl.StandardSSLContextService\"\n+                        ],\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"cache\",\n+                            \"cluster\",\n+                            \"distributed\",\n+                            \"key/value\",\n+                            \"map\",\n+                            \"server\"\n+                        ],\n+                        \"type\": \"org.apache.nifi.distributed.cache.server.map.DistributedMapCacheServer\",\n+                        \"typeDescription\": \"Provides a map (key/value) cache that can be accessed over a socket. Interaction with this service is typically accomplished via a DistributedMapCacheClient service.\",\n+                        \"version\": \"1.27.0\"\n+                    }\n+                ],\n+                \"processors\": [],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"1.27.0\"\n+        },\n+        {\n+            \"artifact\": \"nifi-avro-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [],\n+                \"processors\": [\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-avro-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"e0c4461\"\n+                        },\n+                        \"defaultBulletinLevel\": \"WARN\",\n+                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": 1,\n+                            \"TIMER_DRIVEN\": 1\n+                        },\n+                        \"defaultPenaltyDuration\": \"30 sec\",\n+                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": \"* * * * * ?\",\n+                            \"TIMER_DRIVEN\": \"0 sec\"\n+                        },\n+                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n+                        \"defaultYieldDuration\": \"1 sec\",\n+                        \"deprecated\": true,\n+                        \"deprecationAlternatives\": [\n+                            \"org.apache.nifi.avro.AvroReader\",\n+                            \"org.apache.nifi.json.JsonRecordSetWriter\",\n+                            \"org.apache.nifi.processors.standard.ConvertRecord\"\n+                        ],\n+                        \"deprecationReason\": \"ConvertAvroToJSON is no longer needed since there is the AvroReader which along with JsonRecordSetWriter can be used in ConvertRecord to achieve the same thing.\",\n+                        \"group\": \"org.apache.nifi\",\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n+                        \"primaryNodeOnly\": false,\n+                        \"propertyDescriptors\": {\n+                            \"Avro schema\": {\n+                                \"description\": \"If the Avro records do not contain the schema (datum only), it must be specified here.\",\n+                                \"displayName\": \"Avro schema\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Avro schema\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"JSON container options\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"none\",\n+                                        \"value\": \"none\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"array\",\n+                                        \"value\": \"array\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"array\",\n+                                \"description\": \"Determines how stream of records is exposed: either as a sequence of single Objects (none) (i.e. writing every Object to a new line), or as an array of Objects (array).\",\n+                                \"displayName\": \"JSON container options\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"JSON container options\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"topic_type\": {\n+                            \"Wrap Single Record\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Topic is a full topic name or comma separated list of names\",\n-                                        \"displayName\": \"names\",\n-                                        \"value\": \"names\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n-                                        \"description\": \"Topic is a regex using the Java Pattern syntax\",\n-                                        \"displayName\": \"pattern\",\n-                                        \"value\": \"pattern\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"names\",\n-                                \"description\": \"Specifies whether the Topic(s) provided are a comma separated list of names or a single regular expression\",\n-                                \"displayName\": \"Topic Name Format\",\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"Determines if the resulting output for empty records or a single record should be wrapped in a container array as specified by 'JSON container options'\",\n+                                \"displayName\": \"Wrap Single Record\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"topic_type\",\n+                                \"name\": \"Wrap Single Record\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             }\n                         },\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.processors.kafka.pubsub.ConsumeKafka_1_0\",\n-                            \"org.apache.nifi.processors.kafka.pubsub.PublishKafkaRecord_1_0\",\n-                            \"org.apache.nifi.processors.kafka.pubsub.PublishKafka_1_0\"\n-                        ],\n-                        \"sideEffectFree\": false,\n+                        \"sideEffectFree\": true,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"FlowFiles received from Kafka.  Depending on demarcation strategy it is a flow file per message or a bundle of messages grouped by topic and partition.\",\n+                                \"description\": \"A FlowFile is routed to this relationship after it has been converted to JSON\",\n                                 \"name\": \"success\"\n                             },\n                             {\n-                                \"description\": \"If a message from Kafka cannot be parsed using the configured Record Reader, the contents of the message will be routed to this Relationship as its own individual FlowFile.\",\n-                                \"name\": \"parse.failure\"\n+                                \"description\": \"A FlowFile is routed to this relationship if it cannot be parsed as Avro or cannot be converted to JSON for any reason\",\n+                                \"name\": \"failure\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n-                        \"supportsBatching\": false,\n-                        \"supportsDynamicProperties\": true,\n+                        \"supportsBatching\": true,\n+                        \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"1.0\",\n-                            \"Consume\",\n-                            \"Get\",\n-                            \"Ingest\",\n-                            \"Ingress\",\n-                            \"Kafka\",\n-                            \"PubSub\",\n-                            \"Record\",\n-                            \"Topic\",\n                             \"avro\",\n-                            \"csv\",\n+                            \"convert\",\n                             \"json\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.kafka.pubsub.ConsumeKafkaRecord_1_0\",\n-                        \"typeDescription\": \"Consumes messages from Apache Kafka specifically built against the Kafka 1.0 Consumer API. The complementary NiFi processor for sending messages is PublishKafkaRecord_1_0. Please note that, at this time, the Processor assumes that all records that are retrieved from a given partition have the same schema. If any of the Kafka messages are pulled but cannot be parsed or written with the configured Record Reader or Record Writer, the contents of the message will be written to a separate FlowFile, and that FlowFile will be transferred to the 'parse.failure' relationship. Otherwise, each FlowFile is sent to the 'success' relationship and may contain many individual messages within the single FlowFile. A 'record.count' attribute is added to indicate how many messages are contained in the FlowFile. No two Kafka messages will be placed into the same FlowFile if they have different schemas, or if they have different values for a message header that is included by the <Headers to Add as Attributes> property.\",\n+                        \"type\": \"org.apache.nifi.processors.avro.ConvertAvroToJSON\",\n+                        \"typeDescription\": \"Converts a Binary Avro record into a JSON object. This processor provides a direct mapping of an Avro field to a JSON field, such that the resulting JSON will have the same hierarchical structure as the Avro document. Note that the Avro schema information will be lost, as this is not a translation from binary Avro to JSON formatted Avro. The output JSON is encoded the UTF-8 encoding. If an incoming FlowFile contains a stream of multiple Avro records, the resultant FlowFile will contain a JSON Array containing all of the Avro records or a sequence of JSON Objects.  If an incoming FlowFile does not contain any records, an empty JSON object is the output. Empty/Single Avro record FlowFile inputs are optionally wrapped in a container as dictated by 'Wrap Single Record'\",\n                         \"version\": \"1.27.0\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"The number of records received\",\n-                                \"name\": \"record.count\"\n-                            },\n-                            {\n-                                \"description\": \"The MIME Type that is provided by the configured Record Writer\",\n+                                \"description\": \"Sets the mime type to application/json\",\n                                 \"name\": \"mime.type\"\n-                            },\n-                            {\n-                                \"description\": \"The partition of the topic the records are from\",\n-                                \"name\": \"kafka.partition\"\n-                            },\n-                            {\n-                                \"description\": \"The timestamp of the message in the partition of the topic.\",\n-                                \"name\": \"kafka.timestamp\"\n-                            },\n-                            {\n-                                \"description\": \"The topic records are from\",\n-                                \"name\": \"kafka.topic\"\n                             }\n                         ]\n                     },\n                     {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-kafka-1-0-nar\",\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-avro-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -63459,398 +61235,666 @@\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n-                        \"deprecated\": true,\n-                        \"deprecationAlternatives\": [\n-                            \"org.apache.nifi.processors.kafka.pubsub.ConsumeKafka_2_6\"\n-                        ],\n-                        \"deprecationReason\": \"\",\n-                        \"dynamicProperties\": [\n-                            {\n-                                \"description\": \"These properties will be added on the Kafka configuration after loading any provided configuration properties. In the event a dynamic property represents a property that was already set, its value will be ignored and WARN message logged. For the list of available Kafka properties please refer to: http://kafka.apache.org/documentation.html#configuration. \",\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"name\": \"The name of a Kafka configuration property.\",\n-                                \"value\": \"The value of a given Kafka configuration property.\"\n-                            }\n-                        ],\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"auto.offset.reset\": {\n+                            \"Count Items\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Automatically reset the offset to the earliest offset\",\n-                                        \"displayName\": \"earliest\",\n-                                        \"value\": \"earliest\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n-                                        \"description\": \"Automatically reset the offset to the latest offset\",\n-                                        \"displayName\": \"latest\",\n-                                        \"value\": \"latest\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"If true the number of items in the datafile will be counted and stored in a FlowFile attribute 'item.count'. The counting is done by reading blocks and getting the number of items for each block, thus avoiding de-serializing. The items being counted will be the top-level items in the datafile. For example, with a schema of type record the items will be the records, and for a schema of type Array the items will be the arrays (not the number of entries in each array).\",\n+                                \"displayName\": \"Count Items\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Count Items\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Fingerprint Algorithm\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"CRC-64-AVRO\",\n+                                        \"value\": \"CRC-64-AVRO\"\n                                     },\n                                     {\n-                                        \"description\": \"Throw exception to the consumer if no previous offset is found for the consumer's group\",\n-                                        \"displayName\": \"none\",\n-                                        \"value\": \"none\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"MD5\",\n+                                        \"value\": \"MD5\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"SHA-256\",\n+                                        \"value\": \"SHA-256\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"latest\",\n-                                \"description\": \"Allows you to manage the condition when there is no initial offset in Kafka or if the current offset does not exist any more on the server (e.g. because that data has been deleted). Corresponds to Kafka's 'auto.offset.reset' property.\",\n-                                \"displayName\": \"Offset Reset\",\n+                                \"defaultValue\": \"CRC-64-AVRO\",\n+                                \"description\": \"The algorithm used to generate the schema fingerprint. Available choices are based on the Avro recommended practices for fingerprint generation.\",\n+                                \"displayName\": \"Fingerprint Algorithm\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"auto.offset.reset\",\n+                                \"name\": \"Fingerprint Algorithm\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"bootstrap.servers\": {\n-                                \"defaultValue\": \"localhost:9092\",\n-                                \"description\": \"Comma-separated list of Kafka Brokers in the format host:port\",\n-                                \"displayName\": \"Kafka Brokers\",\n+                            \"Metadata Keys\": {\n+                                \"description\": \"A comma-separated list of keys indicating key/value pairs to extract from the Avro file header. The key 'avro.schema' can be used to extract the full schema in JSON format, and 'avro.codec' can be used to extract the codec name if one exists.\",\n+                                \"displayName\": \"Metadata Keys\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"bootstrap.servers\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Metadata Keys\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            }\n+                        },\n+                        \"sideEffectFree\": true,\n+                        \"supportedRelationships\": [\n+                            {\n+                                \"description\": \"A FlowFile is routed to this relationship after metadata has been extracted.\",\n+                                \"name\": \"success\"\n+                            },\n+                            {\n+                                \"description\": \"A FlowFile is routed to this relationship if it cannot be parsed as Avro or metadata cannot be extracted for any reason\",\n+                                \"name\": \"failure\"\n+                            }\n+                        ],\n+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\"\n+                        ],\n+                        \"supportsBatching\": true,\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicRelationships\": false,\n+                        \"supportsEventDriven\": false,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"avro\",\n+                            \"metadata\",\n+                            \"schema\"\n+                        ],\n+                        \"triggerSerially\": false,\n+                        \"triggerWhenAnyDestinationAvailable\": false,\n+                        \"triggerWhenEmpty\": false,\n+                        \"type\": \"org.apache.nifi.processors.avro.ExtractAvroMetadata\",\n+                        \"typeDescription\": \"Extracts metadata from the header of an Avro datafile.\",\n+                        \"version\": \"1.27.0\",\n+                        \"writesAttributes\": [\n+                            {\n+                                \"description\": \"The type of the schema (i.e. record, enum, etc.).\",\n+                                \"name\": \"schema.type\"\n+                            },\n+                            {\n+                                \"description\": \"Contains the name when the type is a record, enum or fixed, otherwise contains the name of the primitive type.\",\n+                                \"name\": \"schema.name\"\n+                            },\n+                            {\n+                                \"description\": \"The result of the Fingerprint Algorithm as a Hex string.\",\n+                                \"name\": \"schema.fingerprint\"\n+                            },\n+                            {\n+                                \"description\": \"The total number of items in the datafile, only written if Count Items is set to true.\",\n+                                \"name\": \"item.count\"\n+                            }\n+                        ]\n+                    },\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-avro-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"e0c4461\"\n+                        },\n+                        \"defaultBulletinLevel\": \"WARN\",\n+                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": 1,\n+                            \"TIMER_DRIVEN\": 1\n+                        },\n+                        \"defaultPenaltyDuration\": \"30 sec\",\n+                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": \"* * * * * ?\",\n+                            \"TIMER_DRIVEN\": \"0 sec\"\n+                        },\n+                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n+                        \"defaultYieldDuration\": \"1 sec\",\n+                        \"group\": \"org.apache.nifi\",\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n+                        \"primaryNodeOnly\": false,\n+                        \"propertyDescriptors\": {\n+                            \"Output Size\": {\n+                                \"defaultValue\": \"1\",\n+                                \"description\": \"The number of Avro records to include per split file. In cases where the incoming file has less records than the Output Size, or when the total number of records does not divide evenly by the Output Size, it is possible to get a split file with less records.\",\n+                                \"displayName\": \"Output Size\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Output Size\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"group.id\": {\n-                                \"description\": \"A Group ID is used to identify consumers that are within the same consumer group. Corresponds to Kafka's 'group.id' property.\",\n-                                \"displayName\": \"Group ID\",\n+                            \"Output Strategy\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"Avro's object container file format\",\n+                                        \"displayName\": \"Datafile\",\n+                                        \"value\": \"Datafile\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Bare Avro records\",\n+                                        \"displayName\": \"Bare Record\",\n+                                        \"value\": \"Bare Record\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"Datafile\",\n+                                \"description\": \"Determines the format of the output. Either Avro Datafile, or bare record. Bare record output is only intended for use with systems that already require it, and shouldn't be needed for normal use.\",\n+                                \"displayName\": \"Output Strategy\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"group.id\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Output Strategy\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"header-name-regex\": {\n-                                \"description\": \"A Regular Expression that is matched against all message headers. Any message header whose name matches the regex will be added to the FlowFile as an Attribute. If not specified, no Header values will be added as FlowFile attributes. If two messages have a different value for the same header and that header is selected by the provided regex, then those two messages must be added to different FlowFiles. As a result, users should be cautious about using a regex like \\\".*\\\" if messages are expected to have header values that are unique per message, such as an identifier or timestamp, because it will prevent NiFi from bundling the messages together efficiently.\",\n-                                \"displayName\": \"Headers to Add as Attributes (Regex)\",\n+                            \"Split Strategy\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"Split at Record boundaries\",\n+                                        \"displayName\": \"Record\",\n+                                        \"value\": \"Record\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"Record\",\n+                                \"description\": \"The strategy for splitting the incoming datafile. The Record strategy will read the incoming datafile by de-serializing each record.\",\n+                                \"displayName\": \"Split Strategy\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"header-name-regex\",\n-                                \"required\": false,\n+                                \"name\": \"Split Strategy\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"honor-transactions\": {\n+                            \"Transfer Metadata\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"true\",\n                                         \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"false\",\n                                         \"value\": \"false\"\n                                     }\n                                 ],\n                                 \"defaultValue\": \"true\",\n-                                \"description\": \"Specifies whether or not NiFi should honor transactional guarantees when communicating with Kafka. If false, the Processor will use an \\\"isolation level\\\" of read_uncomitted. This means that messages will be received as soon as they are written to Kafka but will be pulled, even if the producer cancels the transactions. If this value is true, NiFi will not receive any messages for which the producer's transaction was canceled, but this can result in some latency since the consumer must wait for the producer to finish its entire transaction instead of pulling as the messages become available.\",\n-                                \"displayName\": \"Honor Transactions\",\n+                                \"description\": \"Whether or not to transfer metadata from the parent datafile to the children. If the Output Strategy is Bare Record, then the metadata will be stored as FlowFile attributes, otherwise it will be in the Datafile header.\",\n+                                \"displayName\": \"Transfer Metadata\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"honor-transactions\",\n+                                \"name\": \"Transfer Metadata\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n+                            }\n+                        },\n+                        \"sideEffectFree\": true,\n+                        \"supportedRelationships\": [\n+                            {\n+                                \"description\": \"If a FlowFile fails processing for any reason (for example, the FlowFile is not valid Avro), it will be routed to this relationship\",\n+                                \"name\": \"failure\"\n                             },\n-                            \"key-attribute-encoding\": {\n+                            {\n+                                \"description\": \"The original FlowFile that was split. If the FlowFile fails processing, nothing will be sent to this relationship\",\n+                                \"name\": \"original\"\n+                            },\n+                            {\n+                                \"description\": \"All new files split from the original FlowFile will be routed to this relationship\",\n+                                \"name\": \"split\"\n+                            }\n+                        ],\n+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\"\n+                        ],\n+                        \"supportsBatching\": true,\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicRelationships\": false,\n+                        \"supportsEventDriven\": false,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"systemResourceConsiderations\": [\n+                            {\n+                                \"description\": \"An instance of this component can cause high usage of this system resource.  Multiple instances or high concurrency settings may result a degradation of performance.\",\n+                                \"resource\": \"MEMORY\"\n+                            }\n+                        ],\n+                        \"tags\": [\n+                            \"avro\",\n+                            \"split\"\n+                        ],\n+                        \"triggerSerially\": false,\n+                        \"triggerWhenAnyDestinationAvailable\": false,\n+                        \"triggerWhenEmpty\": false,\n+                        \"type\": \"org.apache.nifi.processors.avro.SplitAvro\",\n+                        \"typeDescription\": \"Splits a binary encoded Avro datafile into smaller files based on the configured Output Size. The Output Strategy determines if the smaller files will be Avro datafiles, or bare Avro records with metadata in the FlowFile attributes. The output will always be binary encoded.\",\n+                        \"version\": \"1.27.0\",\n+                        \"writesAttributes\": [\n+                            {\n+                                \"description\": \"All split FlowFiles produced from the same parent FlowFile will have the same randomly generated UUID added for this attribute\",\n+                                \"name\": \"fragment.identifier\"\n+                            },\n+                            {\n+                                \"description\": \"A one-up number that indicates the ordering of the split FlowFiles that were created from a single parent FlowFile\",\n+                                \"name\": \"fragment.index\"\n+                            },\n+                            {\n+                                \"description\": \"The number of split FlowFiles generated from the parent FlowFile\",\n+                                \"name\": \"fragment.count\"\n+                            },\n+                            {\n+                                \"description\": \"The filename of the parent FlowFile\",\n+                                \"name\": \"segment.original.filename \"\n+                            }\n+                        ]\n+                    }\n+                ],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"1.27.0\"\n+        },\n+        {\n+            \"artifact\": \"nifi-geohash-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [],\n+                \"processors\": [\n+                    {\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-geohash-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"e0c4461\"\n+                        },\n+                        \"defaultBulletinLevel\": \"WARN\",\n+                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": 1,\n+                            \"EVENT_DRIVEN\": 0,\n+                            \"TIMER_DRIVEN\": 1\n+                        },\n+                        \"defaultPenaltyDuration\": \"30 sec\",\n+                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": \"* * * * * ?\",\n+                            \"TIMER_DRIVEN\": \"0 sec\"\n+                        },\n+                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n+                        \"defaultYieldDuration\": \"1 sec\",\n+                        \"group\": \"org.apache.nifi\",\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n+                        \"primaryNodeOnly\": false,\n+                        \"propertyDescriptors\": {\n+                            \"geohash-format\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"The key is interpreted as a UTF-8 Encoded string.\",\n-                                        \"displayName\": \"UTF-8 Encoded\",\n-                                        \"value\": \"utf-8\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"BASE32\",\n+                                        \"value\": \"BASE32\"\n                                     },\n                                     {\n-                                        \"description\": \"The key is interpreted as arbitrary binary data and is encoded using hexadecimal characters with uppercase letters\",\n-                                        \"displayName\": \"Hex Encoded\",\n-                                        \"value\": \"hex\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"BINARY\",\n+                                        \"value\": \"BINARY\"\n                                     },\n                                     {\n-                                        \"description\": \"The key will not be added as an Attribute\",\n-                                        \"displayName\": \"Do Not Add Key as Attribute\",\n-                                        \"value\": \"do-not-add\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"LONG\",\n+                                        \"value\": \"LONG\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"utf-8\",\n-                                \"description\": \"FlowFiles that are emitted have an attribute named 'kafka.key'. This property dictates how the value of the attribute should be encoded.\",\n-                                \"displayName\": \"Key Attribute Encoding\",\n+                                \"defaultValue\": \"BASE32\",\n+                                \"description\": \"In the ENCODE mode, this property specifies the desired format for encoding geohash; in the DECODE mode, this property specifies the format of geohash provided\",\n+                                \"displayName\": \"Geohash Format\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"key-attribute-encoding\",\n+                                \"name\": \"geohash-format\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"max-uncommit-offset-wait\": {\n-                                \"defaultValue\": \"1 secs\",\n-                                \"description\": \"Specifies the maximum amount of time allowed to pass before offsets must be committed. This value impacts how often offsets will be committed.  Committing offsets less often increases throughput but also increases the window of potential data duplication in the event of a rebalance or JVM restart between commits.  This value is also related to maximum poll records and the use of a message demarcator.  When using a message demarcator we can have far more uncommitted messages than when we're not as there is much less for us to keep track of in memory.\",\n-                                \"displayName\": \"Max Uncommitted Time\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"max-uncommit-offset-wait\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"max.poll.records\": {\n-                                \"defaultValue\": \"10000\",\n-                                \"description\": \"Specifies the maximum number of records Kafka should return in a single poll.\",\n-                                \"displayName\": \"Max Poll Records\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"max.poll.records\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"message-demarcator\": {\n-                                \"description\": \"Since KafkaConsumer receives messages in batches, you have an option to output FlowFiles which contains all Kafka messages in a single batch for a given topic and partition and this property allows you to provide a string (interpreted as UTF-8) to use for demarcating apart multiple Kafka messages. This is an optional property and if not provided each Kafka message received will result in a single FlowFile which  time it is triggered. To enter special character such as 'new line' use CTRL+Enter or Shift+Enter depending on the OS\",\n-                                \"displayName\": \"Message Demarcator\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"message-demarcator\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"message-header-encoding\": {\n-                                \"defaultValue\": \"UTF-8\",\n-                                \"description\": \"Any message header that is found on a Kafka message will be added to the outbound FlowFile as an attribute. This property indicates the Character Encoding to use for deserializing the headers.\",\n-                                \"displayName\": \"Message Header Encoding\",\n+                            \"geohash-level\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"ENCODE\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Mode\",\n+                                        \"propertyName\": \"mode\"\n+                                    }\n+                                ],\n+                                \"description\": \"The integer precision level(1-12) desired for encoding geohash\",\n+                                \"displayName\": \"Geohash Level\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"message-header-encoding\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"geohash-level\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"sasl.kerberos.keytab\": {\n-                                \"description\": \"Keytab credentials used for authentication with Kerberos\",\n-                                \"displayName\": \"Kerberos Keytab\",\n+                            \"geohash-record-path\": {\n+                                \"description\": \"In the ENCODE mode, this property specifies the record path to put the geohash value; in the DECODE mode, this property specifies the record path to retrieve the geohash value\",\n+                                \"displayName\": \"Geohash Record Path\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"sasl.kerberos.keytab\",\n-                                \"required\": false,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"SINGLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\"\n-                                    ]\n-                                },\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"geohash-record-path\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"sasl.kerberos.principal\": {\n-                                \"description\": \"Principal used for authentication with Kerberos\",\n-                                \"displayName\": \"Kerberos Principal\",\n+                            \"latitude-record-path\": {\n+                                \"description\": \"In the ENCODE mode, this property specifies the record path to retrieve the latitude values. Latitude values should be in the range of [-90, 90]; invalid values will be logged at warn level. In the DECODE mode, this property specifies the record path to put the latitude value\",\n+                                \"displayName\": \"Latitude Record Path\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"sasl.kerberos.principal\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"latitude-record-path\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"sasl.kerberos.service.name\": {\n-                                \"description\": \"The service name that matches the primary name of the Kafka server configured in the broker JAAS configuration\",\n-                                \"displayName\": \"Kerberos Service Name\",\n+                            \"longitude-record-path\": {\n+                                \"description\": \"In the ENCODE mode, this property specifies the record path to retrieve the longitude values; Longitude values should be in the range of [-180, 180]; invalid values will be logged at warn level. In the DECODE mode, this property specifies the record path to put the longitude value\",\n+                                \"displayName\": \"Longitude Record Path\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"sasl.kerberos.service.name\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"longitude-record-path\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"sasl.mechanism\": {\n+                            \"mode\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"General Security Services API for Kerberos authentication\",\n-                                        \"displayName\": \"GSSAPI\",\n-                                        \"value\": \"GSSAPI\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Plain username and password authentication\",\n-                                        \"displayName\": \"PLAIN\",\n-                                        \"value\": \"PLAIN\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Salted Challenge Response Authentication Mechanism using SHA-512 with username and password\",\n-                                        \"displayName\": \"SCRAM-SHA-256\",\n-                                        \"value\": \"SCRAM-SHA-256\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"ENCODE\",\n+                                        \"value\": \"ENCODE\"\n                                     },\n                                     {\n-                                        \"description\": \"Salted Challenge Response Authentication Mechanism using SHA-256 with username and password\",\n-                                        \"displayName\": \"SCRAM-SHA-512\",\n-                                        \"value\": \"SCRAM-SHA-512\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"DECODE\",\n+                                        \"value\": \"DECODE\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"GSSAPI\",\n-                                \"description\": \"SASL mechanism used for authentication. Corresponds to Kafka Client sasl.mechanism property\",\n-                                \"displayName\": \"SASL Mechanism\",\n+                                \"defaultValue\": \"ENCODE\",\n+                                \"description\": \"Specifies whether to encode latitude/longitude to geohash or decode geohash to latitude/longitude\",\n+                                \"displayName\": \"Mode\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"sasl.mechanism\",\n+                                \"name\": \"mode\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"security.protocol\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"PLAINTEXT\",\n-                                        \"value\": \"PLAINTEXT\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"SSL\",\n-                                        \"value\": \"SSL\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"SASL_PLAINTEXT\",\n-                                        \"value\": \"SASL_PLAINTEXT\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"SASL_SSL\",\n-                                        \"value\": \"SASL_SSL\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"PLAINTEXT\",\n-                                \"description\": \"Security protocol used to communicate with brokers. Corresponds to Kafka Client security.protocol property\",\n-                                \"displayName\": \"Security Protocol\",\n+                            \"record-reader\": {\n+                                \"description\": \"Specifies the record reader service to use for reading incoming data\",\n+                                \"displayName\": \"Record Reader\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"security.protocol\",\n+                                \"name\": \"record-reader\",\n                                 \"required\": true,\n-                                \"sensitive\": false\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n                             },\n-                            \"ssl.context.service\": {\n-                                \"description\": \"Service supporting SSL communication with Kafka brokers\",\n-                                \"displayName\": \"SSL Context Service\",\n+                            \"record-writer\": {\n+                                \"description\": \"Specifies the record writer service to use for writing data\",\n+                                \"displayName\": \"Record Writer\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"ssl.context.service\",\n-                                \"required\": false,\n+                                \"name\": \"record-writer\",\n+                                \"required\": true,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n                                     \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n+                                    \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             },\n-                            \"topic\": {\n-                                \"description\": \"The name of the Kafka Topic(s) to pull from. More than one can be supplied if comma separated.\",\n-                                \"displayName\": \"Topic Name(s)\",\n+                            \"routing-strategy\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"SKIP\",\n+                                        \"value\": \"SKIP\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"SPLIT\",\n+                                        \"value\": \"SPLIT\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"REQUIRE\",\n+                                        \"value\": \"REQUIRE\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"SKIP\",\n+                                \"description\": \"Specifies how to route flowfiles after encoding or decoding being performed. SKIP will enrich those records that can be enriched and skip the rest. The SKIP strategy will route a flowfile to failure only if unable to parse the data. Otherwise, it will route the enriched flowfile to success, and the original input to original. SPLIT will separate the records that have been enriched from those that have not and send them to matched, while unenriched records will be sent to unmatched; the original input flowfile will be sent to original. The SPLIT strategy will route a flowfile to failure only if unable to parse the data. REQUIRE will route a flowfile to success only if all of its records are enriched, and the original input will be sent to original. The REQUIRE strategy will route the original input flowfile to failure if any of its records cannot be enriched or unable to be parsed\",\n+                                \"displayName\": \"Routing Strategy\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"topic\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"routing-strategy\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n+                            }\n+                        },\n+                        \"sideEffectFree\": true,\n+                        \"supportedRelationships\": [\n+                            {\n+                                \"description\": \"Flowfiles that are successfully encoded or decoded will be routed to success\",\n+                                \"name\": \"success\"\n                             },\n-                            \"topic_type\": {\n+                            {\n+                                \"description\": \"Flowfiles that cannot be encoded or decoded will be routed to failure\",\n+                                \"name\": \"failure\"\n+                            },\n+                            {\n+                                \"description\": \"The original input flowfile will be sent to this relationship\",\n+                                \"name\": \"original\"\n+                            }\n+                        ],\n+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\",\n+                            \"EVENT_DRIVEN\"\n+                        ],\n+                        \"supportsBatching\": true,\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicRelationships\": false,\n+                        \"supportsEventDriven\": true,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"geo\",\n+                            \"geohash\",\n+                            \"record\"\n+                        ],\n+                        \"triggerSerially\": false,\n+                        \"triggerWhenAnyDestinationAvailable\": false,\n+                        \"triggerWhenEmpty\": false,\n+                        \"type\": \"org.apache.nifi.processors.geohash.GeohashRecord\",\n+                        \"typeDescription\": \"A record-based processor that encodes and decodes Geohashes from and to latitude/longitude coordinates.\",\n+                        \"version\": \"1.27.0\",\n+                        \"writesAttributes\": [\n+                            {\n+                                \"description\": \"The MIME type indicated by the record writer\",\n+                                \"name\": \"mime.type\"\n+                            },\n+                            {\n+                                \"description\": \"The number of records in the resulting flow file\",\n+                                \"name\": \"record.count\"\n+                            }\n+                        ]\n+                    }\n+                ],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"1.27.0\"\n+        },\n+        {\n+            \"artifact\": \"nifi-evtx-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [],\n+                \"processors\": [\n+                    {\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-evtx-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"e0c4461\"\n+                        },\n+                        \"defaultBulletinLevel\": \"WARN\",\n+                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": 1,\n+                            \"EVENT_DRIVEN\": 0,\n+                            \"TIMER_DRIVEN\": 1\n+                        },\n+                        \"defaultPenaltyDuration\": \"30 sec\",\n+                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": \"* * * * * ?\",\n+                            \"TIMER_DRIVEN\": \"0 sec\"\n+                        },\n+                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n+                        \"defaultYieldDuration\": \"1 sec\",\n+                        \"group\": \"org.apache.nifi\",\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n+                        \"primaryNodeOnly\": false,\n+                        \"propertyDescriptors\": {\n+                            \"granularity\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Topic is a full topic name or comma separated list of names\",\n-                                        \"displayName\": \"names\",\n-                                        \"value\": \"names\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Record\",\n+                                        \"value\": \"Record\"\n                                     },\n                                     {\n-                                        \"description\": \"Topic is a regex using the Java Pattern syntax\",\n-                                        \"displayName\": \"pattern\",\n-                                        \"value\": \"pattern\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Chunk\",\n+                                        \"value\": \"Chunk\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"File\",\n+                                        \"value\": \"File\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"names\",\n-                                \"description\": \"Specifies whether the Topic(s) provided are a comma separated list of names or a single regular expression\",\n-                                \"displayName\": \"Topic Name Format\",\n+                                \"defaultValue\": \"Chunk\",\n+                                \"description\": \"Output flow file for each Record, Chunk, or File encountered in the event log\",\n+                                \"displayName\": \"Granularity\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"topic_type\",\n+                                \"name\": \"granularity\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             }\n                         },\n-                        \"sideEffectFree\": false,\n+                        \"readsAttributes\": [\n+                            {\n+                                \"description\": \"The filename of the evtx file\",\n+                                \"name\": \"filename\"\n+                            }\n+                        ],\n+                        \"sideEffectFree\": true,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"FlowFiles received from Kafka. Depending on demarcation strategy it is a flow file per message or a bundle of messages grouped by topic and partition.\",\n+                                \"description\": \"Any FlowFile that was successfully converted from evtx to XML\",\n                                 \"name\": \"success\"\n+                            },\n+                            {\n+                                \"description\": \"Any FlowFile that encountered an exception during conversion will be transferred to this relationship with as much parsing as possible done\",\n+                                \"name\": \"failure\"\n+                            },\n+                            {\n+                                \"description\": \"The unmodified input FlowFile will be transferred to this relationship\",\n+                                \"name\": \"original\"\n+                            },\n+                            {\n+                                \"description\": \"Any bad chunks of records will be transferred to this relationship in their original binary form\",\n+                                \"name\": \"bad chunk\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n+                            \"CRON_DRIVEN\",\n+                            \"EVENT_DRIVEN\"\n                         ],\n-                        \"supportsBatching\": false,\n-                        \"supportsDynamicProperties\": true,\n+                        \"supportsBatching\": true,\n+                        \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": false,\n+                        \"supportsEventDriven\": true,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"1.0\",\n-                            \"Consume\",\n-                            \"Get\",\n-                            \"Ingest\",\n-                            \"Ingress\",\n-                            \"Kafka\",\n-                            \"PubSub\",\n-                            \"Topic\"\n+                            \"event\",\n+                            \"evtx\",\n+                            \"file\",\n+                            \"logs\",\n+                            \"message\",\n+                            \"windows\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.kafka.pubsub.ConsumeKafka_1_0\",\n-                        \"typeDescription\": \"Consumes messages from Apache Kafka specifically built against the Kafka 1.0 Consumer API. The complementary NiFi processor for sending messages is PublishKafka_1_0.\",\n+                        \"type\": \"org.apache.nifi.processors.evtx.ParseEvtx\",\n+                        \"typeDescription\": \"Parses the contents of a Windows Event Log file (evtx) and writes the resulting XML to the FlowFile\",\n                         \"version\": \"1.27.0\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"The number of messages written if more than one\",\n-                                \"name\": \"kafka.count\"\n-                            },\n-                            {\n-                                \"description\": \"The key of message if present and if single message. How the key is encoded depends on the value of the 'Key Attribute Encoding' property.\",\n-                                \"name\": \"kafka.key\"\n-                            },\n-                            {\n-                                \"description\": \"The offset of the message in the partition of the topic.\",\n-                                \"name\": \"kafka.offset\"\n-                            },\n-                            {\n-                                \"description\": \"The timestamp of the message in the partition of the topic.\",\n-                                \"name\": \"kafka.timestamp\"\n-                            },\n-                            {\n-                                \"description\": \"The partition of the topic the message or message bundle is from\",\n-                                \"name\": \"kafka.partition\"\n+                                \"description\": \"The output filename\",\n+                                \"name\": \"filename\"\n                             },\n                             {\n-                                \"description\": \"The topic the message or message bundle is from\",\n-                                \"name\": \"kafka.topic\"\n+                                \"description\": \"The output filetype (application/xml for success and failure relationships, original value for bad chunk and original relationships)\",\n+                                \"name\": \"mime.type\"\n                             }\n                         ]\n-                    },\n+                    }\n+                ],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"1.27.0\"\n+        },\n+        {\n+            \"artifact\": \"nifi-slack-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [],\n+                \"processors\": [\n                     {\n                         \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-kafka-1-0-nar\",\n+                        \"artifact\": \"nifi-slack-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -63860,440 +61904,417 @@\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n                         \"deprecated\": true,\n                         \"deprecationAlternatives\": [\n-                            \"org.apache.nifi.processors.kafka.pubsub.PublishKafkaRecord_2_6\"\n+                            \"org.apache.nifi.processors.slack.PublishSlack\"\n                         ],\n-                        \"deprecationReason\": \"\",\n+                        \"deprecationReason\": \"This Processor is more difficult to configure than necessary, and exposes intricate nuances of the Slack API that need not be exposed. Additionally, it lacks some capabilities, such as responding to messages in threads. It interacts directly with the Slack API instead of making use of the Slack-provided SDK, which makes the Processor much more brittle. Additionally, it does not make clear the differences between PutSlack and PostSlack. Each provides slightly different capabilities. PublishSlack combines the capabilities of both Processors in a simpler configuration that makes use of Slack's standard REST API.\",\n                         \"dynamicProperties\": [\n                             {\n-                                \"description\": \"These properties will be added on the Kafka configuration after loading any provided configuration properties. In the event a dynamic property represents a property that was already set, its value will be ignored and WARN message logged. For the list of available Kafka properties please refer to: http://kafka.apache.org/documentation.html#configuration. \",\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"name\": \"The name of a Kafka configuration property.\",\n-                                \"value\": \"The value of a given Kafka configuration property.\"\n+                                \"description\": \"The property value will be converted to JSON and will be added to the array of attachments in the JSON payload being sent to Slack. The property name will not be used by the processor.\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"name\": \"<Arbitrary name>\",\n+                                \"value\": \"JSON snippet specifying a Slack message \\\"attachment\\\"\"\n                             }\n                         ],\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"ack.wait.time\": {\n-                                \"defaultValue\": \"5 secs\",\n-                                \"description\": \"After sending a message to Kafka, this indicates the amount of time that we are willing to wait for a response from Kafka. If Kafka does not acknowledge the message within this time period, the FlowFile will be routed to 'failure'.\",\n-                                \"displayName\": \"Acknowledgment Wait Time\",\n+                            \"SSL Context Service\": {\n+                                \"description\": \"Specifies an optional SSL Context Service that, if provided, will be used to create connections\",\n+                                \"displayName\": \"SSL Context Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"ack.wait.time\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n+                                \"name\": \"SSL Context Service\",\n+                                \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n                             },\n-                            \"acks\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"FlowFile will be routed to success after successfully sending the content to a Kafka node, without waiting for any acknowledgment from the node at all. This provides the best performance but may result in data loss.\",\n-                                        \"displayName\": \"Best Effort\",\n-                                        \"value\": \"0\"\n-                                    },\n-                                    {\n-                                        \"description\": \"FlowFile will be routed to success if the message is received by a single Kafka node, whether or not it is replicated. This is faster than <Guarantee Replicated Delivery> but can result in data loss if a Kafka node crashes\",\n-                                        \"displayName\": \"Guarantee Single Node Delivery\",\n-                                        \"value\": \"1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"FlowFile will be routed to failure unless the message is replicated to the appropriate number of Kafka Nodes according to the Topic configuration\",\n-                                        \"displayName\": \"Guarantee Replicated Delivery\",\n-                                        \"value\": \"all\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"0\",\n-                                \"description\": \"Specifies the requirement for guaranteeing that a message is sent to Kafka. Corresponds to Kafka's 'acks' property.\",\n-                                \"displayName\": \"Delivery Guarantee\",\n+                            \"access-token\": {\n+                                \"description\": \"OAuth Access Token used for authenticating/authorizing the Slack request sent by NiFi.\",\n+                                \"displayName\": \"Access Token\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"acks\",\n+                                \"name\": \"access-token\",\n                                 \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"attribute-name-regex\": {\n-                                \"description\": \"A Regular Expression that is matched against all FlowFile attribute names. Any attribute whose name matches the regex will be added to the Kafka messages as a Header. If not specified, no FlowFile attributes will be added as headers.\",\n-                                \"displayName\": \"Attributes to Send as Headers (Regex)\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"attribute-name-regex\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n+                                \"sensitive\": true\n                             },\n-                            \"bootstrap.servers\": {\n-                                \"defaultValue\": \"localhost:9092\",\n-                                \"description\": \"Comma-separated list of Kafka Brokers in the format host:port\",\n-                                \"displayName\": \"Kafka Brokers\",\n+                            \"channel\": {\n+                                \"description\": \"Slack channel, private group, or IM channel to send the message to.\",\n+                                \"displayName\": \"Channel\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"bootstrap.servers\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"channel\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"compression.type\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"none\",\n-                                        \"value\": \"none\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"gzip\",\n-                                        \"value\": \"gzip\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"snappy\",\n-                                        \"value\": \"snappy\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"lz4\",\n-                                        \"value\": \"lz4\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"none\",\n-                                \"description\": \"This parameter allows you to specify the compression codec for all data generated by this producer.\",\n-                                \"displayName\": \"Compression Type\",\n+                            \"file-mime-type\": {\n+                                \"defaultValue\": \"${mime.type}\",\n+                                \"description\": \"Mime type of the file to be uploaded. The property value will only be used if 'Upload FlowFile' has been set to 'Yes'. If the property evaluated to null or empty string, then the mime type will be set to 'application/octet-stream' in the Slack message.\",\n+                                \"displayName\": \"File Mime Type\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"compression.type\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"file-mime-type\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"kerberos-credentials-service\": {\n-                                \"description\": \"Service supporting generalized credentials authentication with Kerberos\",\n-                                \"displayName\": \"Kerberos Credentials Service\",\n+                            \"file-name\": {\n+                                \"defaultValue\": \"${filename}\",\n+                                \"description\": \"Name of the file to be uploaded. The property value will only be used if 'Upload FlowFile' has been set to 'Yes'. If the property evaluated to null or empty string, then the file name will be set to 'file' in the Slack message.\",\n+                                \"displayName\": \"File Name\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"kerberos-credentials-service\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"file-name\",\n                                 \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.kerberos.KerberosCredentialsService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n+                                \"sensitive\": false\n                             },\n-                            \"max.block.ms\": {\n-                                \"defaultValue\": \"5 sec\",\n-                                \"description\": \"The amount of time publisher will wait to obtain metadata or wait for the buffer to flush during the 'send' call before failing the entire 'send' call. Corresponds to Kafka's 'max.block.ms' property\",\n-                                \"displayName\": \"Max Metadata Wait Time\",\n+                            \"file-title\": {\n+                                \"description\": \"Title of the file displayed in the Slack message. The property value will only be used if 'Upload FlowFile' has been set to 'Yes'.\",\n+                                \"displayName\": \"File Title\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"max.block.ms\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"file-title\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"max.request.size\": {\n-                                \"defaultValue\": \"1 MB\",\n-                                \"description\": \"The maximum size of a request in bytes. Corresponds to Kafka's 'max.request.size' property and defaults to 1 MB (1048576).\",\n-                                \"displayName\": \"Max Request Size\",\n+                            \"file-upload-url\": {\n+                                \"defaultValue\": \"https://slack.com/api/files.upload\",\n+                                \"description\": \"Slack Web API URL for uploading files to channels. It only needs to be changed if Slack changes its API URL.\",\n+                                \"displayName\": \"File Upload URL\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"max.request.size\",\n+                                \"name\": \"file-upload-url\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"message-header-encoding\": {\n-                                \"defaultValue\": \"UTF-8\",\n-                                \"description\": \"For any attribute that is added as a message header, as configured via the <Attributes to Send as Headers> property, this property indicates the Character Encoding to use for serializing the headers.\",\n-                                \"displayName\": \"Message Header Encoding\",\n+                            \"post-message-url\": {\n+                                \"defaultValue\": \"https://slack.com/api/chat.postMessage\",\n+                                \"description\": \"Slack Web API URL for posting text messages to channels. It only needs to be changed if Slack changes its API URL.\",\n+                                \"displayName\": \"Post Message URL\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"message-header-encoding\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"message-key-field\": {\n-                                \"description\": \"The name of a field in the Input Records that should be used as the Key for the Kafka message.\",\n-                                \"displayName\": \"Message Key Field\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"message-key-field\",\n-                                \"required\": false,\n+                                \"name\": \"post-message-url\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"partition\": {\n-                                \"description\": \"Specifies which Partition Records will go to. How this value is interpreted is dictated by the <Partitioner class> property.\",\n-                                \"displayName\": \"Partition\",\n+                            \"text\": {\n+                                \"description\": \"Text of the Slack message to send. Only required if no attachment has been specified and 'Upload File' has been set to 'No'.\",\n+                                \"displayName\": \"Text\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"partition\",\n+                                \"name\": \"text\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"partitioner.class\": {\n+                            \"upload-flowfile\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Messages will be assigned partitions in a round-robin fashion, sending the first message to Partition 1, the next Partition to Partition 2, and so on, wrapping as necessary.\",\n-                                        \"displayName\": \"RoundRobinPartitioner\",\n-                                        \"value\": \"org.apache.nifi.processors.kafka.pubsub.Partitioners$RoundRobinPartitioner\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Messages will be assigned to random partitions.\",\n-                                        \"displayName\": \"DefaultPartitioner\",\n-                                        \"value\": \"org.apache.kafka.clients.producer.internals.DefaultPartitioner\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Interprets the <Partition> property as a RecordPath that will be evaluated against each Record to determine which partition the Record will go to. All Records that have the same value for the given RecordPath will go to the same Partition.\",\n-                                        \"displayName\": \"RecordPath Partitioner\",\n-                                        \"value\": \"org.apache.nifi.processors.kafka.pubsub.Partitioners$RecordPathPartitioner\"\n+                                        \"description\": \"Upload and attach FlowFile content to the Slack message.\",\n+                                        \"displayName\": \"Yes\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n-                                        \"description\": \"Interprets the <Partition> property as Expression Language that will be evaluated against each FlowFile. This Expression will be evaluated once against the FlowFile, so all Records in a given FlowFile will go to the same partition.\",\n-                                        \"displayName\": \"Expression Language Partitioner\",\n-                                        \"value\": \"org.apache.nifi.processors.kafka.pubsub.Partitioners$ExpressionLanguagePartitioner\"\n+                                        \"description\": \"Don't upload and attach FlowFile content to the Slack message.\",\n+                                        \"displayName\": \"No\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"org.apache.kafka.clients.producer.internals.DefaultPartitioner\",\n-                                \"description\": \"Specifies which class to use to compute a partition id for a message. Corresponds to Kafka's 'partitioner.class' property.\",\n-                                \"displayName\": \"Partitioner class\",\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"Whether or not to upload and attach the FlowFile content to the Slack message.\",\n+                                \"displayName\": \"Upload FlowFile\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"partitioner.class\",\n-                                \"required\": false,\n+                                \"name\": \"upload-flowfile\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n+                            }\n+                        },\n+                        \"sideEffectFree\": false,\n+                        \"supportedRelationships\": [\n+                            {\n+                                \"description\": \"FlowFiles are routed to success after being successfully sent to Slack\",\n+                                \"name\": \"success\"\n                             },\n-                            \"record-reader\": {\n-                                \"description\": \"The Record Reader to use for incoming FlowFiles\",\n-                                \"displayName\": \"Record Reader\",\n+                            {\n+                                \"description\": \"FlowFiles are routed to failure if unable to be sent to Slack\",\n+                                \"name\": \"failure\"\n+                            }\n+                        ],\n+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\"\n+                        ],\n+                        \"supportsBatching\": false,\n+                        \"supportsDynamicProperties\": true,\n+                        \"supportsDynamicRelationships\": false,\n+                        \"supportsEventDriven\": false,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"message\",\n+                            \"notify\",\n+                            \"post\",\n+                            \"slack\",\n+                            \"upload\"\n+                        ],\n+                        \"triggerSerially\": false,\n+                        \"triggerWhenAnyDestinationAvailable\": false,\n+                        \"triggerWhenEmpty\": false,\n+                        \"type\": \"org.apache.nifi.processors.slack.PostSlack\",\n+                        \"typeDescription\": \"Sends a message on Slack. The FlowFile content (e.g. an image) can be uploaded and attached to the message.\",\n+                        \"version\": \"1.27.0\",\n+                        \"writesAttributes\": [\n+                            {\n+                                \"description\": \"The Slack URL of the uploaded file. It will be added if 'Upload FlowFile' has been set to 'Yes'.\",\n+                                \"name\": \"slack.file.url\"\n+                            }\n+                        ]\n+                    },\n+                    {\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-slack-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"e0c4461\"\n+                        },\n+                        \"defaultBulletinLevel\": \"WARN\",\n+                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": 1,\n+                            \"TIMER_DRIVEN\": 1\n+                        },\n+                        \"defaultPenaltyDuration\": \"30 sec\",\n+                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": \"* * * * * ?\",\n+                            \"TIMER_DRIVEN\": \"0 sec\"\n+                        },\n+                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n+                        \"defaultYieldDuration\": \"3 sec\",\n+                        \"group\": \"org.apache.nifi\",\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n+                        \"primaryNodeOnly\": false,\n+                        \"propertyDescriptors\": {\n+                            \"Access Token\": {\n+                                \"description\": \"OAuth Access Token used for authenticating/authorizing the Slack request sent by NiFi. This may be either a User Token or a Bot Token. The token must be granted the chat:write scope. Additionally, in order to upload FlowFile contents as an attachment, it must be granted files:write.\",\n+                                \"displayName\": \"Access Token\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"record-reader\",\n+                                \"name\": \"Access Token\",\n                                 \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n+                                \"sensitive\": true\n                             },\n-                            \"record-writer\": {\n-                                \"description\": \"The Record Writer to use in order to serialize the data before sending to Kafka\",\n-                                \"displayName\": \"Record Writer\",\n+                            \"Channel\": {\n+                                \"description\": \"The name or identifier of the channel to send the message to. If using a channel name, it must be prefixed with the # character. For example, #general. This is valid only for public channels. Otherwise, the unique identifier of the channel to publish to must be provided.\",\n+                                \"displayName\": \"Channel\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"record-writer\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Channel\",\n                                 \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            },\n-                            \"sasl.kerberos.keytab\": {\n-                                \"description\": \"Keytab credentials used for authentication with Kerberos\",\n-                                \"displayName\": \"Kerberos Keytab\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"sasl.kerberos.keytab\",\n-                                \"required\": false,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"SINGLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\"\n-                                    ]\n-                                },\n-                                \"sensitive\": false\n-                            },\n-                            \"sasl.kerberos.principal\": {\n-                                \"description\": \"Principal used for authentication with Kerberos\",\n-                                \"displayName\": \"Kerberos Principal\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"sasl.kerberos.principal\",\n-                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"sasl.kerberos.service.name\": {\n-                                \"description\": \"The service name that matches the primary name of the Kafka server configured in the broker JAAS configuration\",\n-                                \"displayName\": \"Kerberos Service Name\",\n+                            \"Character Set\": {\n+                                \"defaultValue\": \"UTF-8\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"Send FlowFile Content as Message\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Publish Strategy\",\n+                                        \"propertyName\": \"Publish Strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"Specifies the name of the Character Set used to encode the FlowFile contents.\",\n+                                \"displayName\": \"Character Set\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"sasl.kerberos.service.name\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Character Set\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"security.protocol\": {\n+                            \"Include FlowFile Content as Attachment\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"PLAINTEXT\",\n-                                        \"value\": \"PLAINTEXT\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"SSL\",\n-                                        \"value\": \"SSL\"\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"SASL_PLAINTEXT\",\n-                                        \"value\": \"SASL_PLAINTEXT\"\n-                                    },\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"false\",\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"SASL_SSL\",\n-                                        \"value\": \"SASL_SSL\"\n+                                        \"dependentValues\": [\n+                                            \"Use 'Message Text' Property\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Publish Strategy\",\n+                                        \"propertyName\": \"Publish Strategy\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"PLAINTEXT\",\n-                                \"description\": \"Security protocol used to communicate with brokers. Corresponds to Kafka Client security.protocol property\",\n-                                \"displayName\": \"Security Protocol\",\n+                                \"description\": \"Specifies whether or not the contents of the FlowFile should be uploaded as an attachment to the Slack message.\",\n+                                \"displayName\": \"Include FlowFile Content as Attachment\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"security.protocol\",\n+                                \"name\": \"Include FlowFile Content as Attachment\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"ssl.context.service\": {\n-                                \"description\": \"Service supporting SSL communication with Kafka brokers\",\n-                                \"displayName\": \"SSL Context Service\",\n+                            \"Max FlowFile Size\": {\n+                                \"defaultValue\": \"1 MB\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"true\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Include FlowFile Content as Attachment\",\n+                                        \"propertyName\": \"Include FlowFile Content as Attachment\"\n+                                    }\n+                                ],\n+                                \"description\": \"The maximum size of a FlowFile that can be sent to Slack. If any FlowFile exceeds this size, it will be routed to failure. This plays an important role because the entire contents of the file must be loaded into NiFi's heap in order to send the data to Slack.\",\n+                                \"displayName\": \"Max FlowFile Size\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"ssl.context.service\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n+                                \"name\": \"Max FlowFile Size\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n                             },\n-                            \"topic\": {\n-                                \"description\": \"The name of the Kafka Topic to publish to.\",\n-                                \"displayName\": \"Topic Name\",\n+                            \"Message Text\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"Use 'Message Text' Property\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Publish Strategy\",\n+                                        \"propertyName\": \"Publish Strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"The text of the message to send to Slack.\",\n+                                \"displayName\": \"Message Text\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"topic\",\n+                                \"name\": \"Message Text\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"transactional-id-prefix\": {\n-                                \"description\": \"When Use Transaction is set to true, KafkaProducer config 'transactional.id' will be a generated UUID and will be prefixed with this string.\",\n-                                \"displayName\": \"Transactional Id Prefix\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"transactional-id-prefix\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"use-transactions\": {\n+                            \"Publish Strategy\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"description\": \"The contents of the FlowFile will be sent as the message text.\",\n+                                        \"displayName\": \"Send FlowFile Content as Message\",\n+                                        \"value\": \"Send FlowFile Content as Message\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"description\": \"The value of the Message Text Property will be sent as the message text.\",\n+                                        \"displayName\": \"Use 'Message Text' Property\",\n+                                        \"value\": \"Use 'Message Text' Property\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"true\",\n-                                \"description\": \"Specifies whether or not NiFi should provide Transactional guarantees when communicating with Kafka. If there is a problem sending data to Kafka, and this property is set to false, then the messages that have already been sent to Kafka will continue on and be delivered to consumers. If this is set to true, then the Kafka transaction will be rolled back so that those messages are not available to consumers. Setting this to true requires that the <Delivery Guarantee> property be set to \\\"Guarantee Replicated Delivery.\\\"\",\n-                                \"displayName\": \"Use Transactions\",\n+                                \"defaultValue\": \"Send FlowFile Content as Message\",\n+                                \"description\": \"Specifies how the Processor will send the message or file to Slack.\",\n+                                \"displayName\": \"Publish Strategy\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"use-transactions\",\n+                                \"name\": \"Publish Strategy\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n+                            },\n+                            \"Thread Timestamp\": {\n+                                \"description\": \"The Timestamp identifier for the thread that this message is to be a part of. If not specified, the message will be a top-level message instead of being in a thread.\",\n+                                \"displayName\": \"Thread Timestamp\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Thread Timestamp\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n                             }\n                         },\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.processors.kafka.pubsub.ConsumeKafkaRecord_1_0\",\n-                            \"org.apache.nifi.processors.kafka.pubsub.ConsumeKafka_1_0\",\n-                            \"org.apache.nifi.processors.kafka.pubsub.PublishKafka_1_0\"\n-                        ],\n                         \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"FlowFiles for which all content was sent to Kafka.\",\n+                                \"description\": \"FlowFiles are routed to success after being successfully sent to Slack\",\n                                 \"name\": \"success\"\n                             },\n                             {\n-                                \"description\": \"Any FlowFile that cannot be sent to Kafka will be routed to this Relationship\",\n+                                \"description\": \"FlowFiles are routed to 'rate limited' if the Rate Limit has been exceeded\",\n+                                \"name\": \"rate limited\"\n+                            },\n+                            {\n+                                \"description\": \"FlowFiles are routed to 'failure' if unable to be sent to Slack for any other reason\",\n                                 \"name\": \"failure\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n                         \"supportsBatching\": false,\n-                        \"supportsDynamicProperties\": true,\n+                        \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"1.0\",\n-                            \"Apache\",\n-                            \"Kafka\",\n-                            \"Message\",\n-                            \"PubSub\",\n-                            \"Put\",\n-                            \"Record\",\n-                            \"Send\",\n-                            \"avro\",\n-                            \"csv\",\n-                            \"json\",\n-                            \"logs\"\n+                            \"chat.postMessage\",\n+                            \"conversation\",\n+                            \"publish\",\n+                            \"send\",\n+                            \"slack\",\n+                            \"social media\",\n+                            \"team\",\n+                            \"text\",\n+                            \"unstructured\",\n+                            \"upload\",\n+                            \"write\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.kafka.pubsub.PublishKafkaRecord_1_0\",\n-                        \"typeDescription\": \"Sends the contents of a FlowFile as individual records to Apache Kafka using the Kafka 1.0 Producer API. The contents of the FlowFile are expected to be record-oriented data that can be read by the configured Record Reader. The complementary NiFi processor for fetching messages is ConsumeKafkaRecord_1_0.\",\n+                        \"type\": \"org.apache.nifi.processors.slack.PublishSlack\",\n+                        \"typeDescription\": \"Posts a message to the specified Slack channel. The content of the message can be either a user-defined message that makes use of Expression Language or the contents of the FlowFile can be sent as the message. If sending a user-defined message, the contents of the FlowFile may also be optionally uploaded as a file attachment.\",\n                         \"version\": \"1.27.0\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"The number of messages that were sent to Kafka for this FlowFile. This attribute is added only to FlowFiles that are routed to success.\",\n-                                \"name\": \"msg.count\"\n+                                \"description\": \"The ID of the Slack Channel from which the messages were retrieved\",\n+                                \"name\": \"slack.channel.id\"\n+                            },\n+                            {\n+                                \"description\": \"The timestamp of the slack messages that was sent; this is used by Slack as a unique identifier\",\n+                                \"name\": \"slack.ts\"\n                             }\n                         ]\n                     },\n                     {\n                         \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-kafka-1-0-nar\",\n+                        \"artifact\": \"nifi-slack-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -64303,967 +62324,1485 @@\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n                         \"deprecated\": true,\n                         \"deprecationAlternatives\": [\n-                            \"org.apache.nifi.processors.kafka.pubsub.PublishKafka_2_6\"\n+                            \"org.apache.nifi.processors.slack.PublishSlack\"\n                         ],\n-                        \"deprecationReason\": \"\",\n+                        \"deprecationReason\": \"This Processor makes use of a Webhook URL, rather than Slack's REST API. As a result, the Processor is more difficult to configure than necessary and requires special permissions for the Slack Application / Bot. These permissions must be granted for every channel that the application is to respond to, which makes setup and maintenance difficult. Additionally, it does not make clear the differences between PutSlack and PostSlack. Each provides slightly different capabilities. PublishSlack combines the capabilities of both Processors in a simpler configuration that makes use of Slack's standard REST API.\",\n                         \"dynamicProperties\": [\n                             {\n-                                \"description\": \"These properties will be added on the Kafka configuration after loading any provided configuration properties. In the event a dynamic property represents a property that was already set, its value will be ignored and WARN message logged. For the list of available Kafka properties please refer to: http://kafka.apache.org/documentation.html#configuration. \",\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"name\": \"The name of a Kafka configuration property.\",\n-                                \"value\": \"The value of a given Kafka configuration property.\"\n+                                \"description\": \"Converts the contents of each value specified by the Dynamic Property's value to JSON and appends it to the payload being sent to Slack.\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"name\": \"A JSON object to add to Slack's \\\"attachments\\\" JSON payload.\",\n+                                \"value\": \"JSON-formatted string to add to Slack's payload JSON appended to the \\\"attachments\\\" JSON array.\"\n                             }\n                         ],\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"ack.wait.time\": {\n-                                \"defaultValue\": \"5 secs\",\n-                                \"description\": \"After sending a message to Kafka, this indicates the amount of time that we are willing to wait for a response from Kafka. If Kafka does not acknowledge the message within this time period, the FlowFile will be routed to 'failure'.\",\n-                                \"displayName\": \"Acknowledgment Wait Time\",\n+                            \"SSL Context Service\": {\n+                                \"description\": \"Specifies an optional SSL Context Service that, if provided, will be used to create connections\",\n+                                \"displayName\": \"SSL Context Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"ack.wait.time\",\n+                                \"name\": \"SSL Context Service\",\n+                                \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"channel\": {\n+                                \"description\": \"A public channel using #channel or direct message using @username. If not specified, the default webhook channel as specified in Slack's Incoming Webhooks web interface is used.\",\n+                                \"displayName\": \"Channel\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"channel\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"icon-emoji\": {\n+                                \"description\": \"Icon Emoji to be used for the message. Must begin and end with a colon, e.g. :ghost:\",\n+                                \"displayName\": \"Icon Emoji\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"icon-emoji\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"icon-url\": {\n+                                \"description\": \"Icon URL to be used for the message\",\n+                                \"displayName\": \"Icon URL\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"icon-url\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"username\": {\n+                                \"description\": \"The displayed Slack username\",\n+                                \"displayName\": \"Username\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"username\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"webhook-text\": {\n+                                \"description\": \"The text sent in the webhook message\",\n+                                \"displayName\": \"Webhook Text\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"webhook-text\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"acks\": {\n+                            \"webhook-url\": {\n+                                \"description\": \"The POST URL provided by Slack to send messages into a channel.\",\n+                                \"displayName\": \"Webhook URL\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"webhook-url\",\n+                                \"required\": true,\n+                                \"sensitive\": true\n+                            }\n+                        },\n+                        \"sideEffectFree\": false,\n+                        \"supportedRelationships\": [\n+                            {\n+                                \"description\": \"FlowFiles are routed to success after being successfully sent to Slack\",\n+                                \"name\": \"success\"\n+                            },\n+                            {\n+                                \"description\": \"FlowFiles are routed to failure if unable to be sent to Slack\",\n+                                \"name\": \"failure\"\n+                            }\n+                        ],\n+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\"\n+                        ],\n+                        \"supportsBatching\": false,\n+                        \"supportsDynamicProperties\": true,\n+                        \"supportsDynamicRelationships\": false,\n+                        \"supportsEventDriven\": false,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"notify\",\n+                            \"put\",\n+                            \"slack\"\n+                        ],\n+                        \"triggerSerially\": false,\n+                        \"triggerWhenAnyDestinationAvailable\": false,\n+                        \"triggerWhenEmpty\": false,\n+                        \"type\": \"org.apache.nifi.processors.slack.PutSlack\",\n+                        \"typeDescription\": \"Sends a message to your team on slack.com\",\n+                        \"version\": \"1.27.0\"\n+                    }\n+                ],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"1.27.0\"\n+        },\n+        {\n+            \"artifact\": \"nifi-oauth2-provider-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-oauth2-provider-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"e0c4461\"\n+                        },\n+                        \"deprecated\": true,\n+                        \"deprecationAlternatives\": [\n+                            \"org.apache.nifi.oauth2.StandardOauth2AccessTokenProvider\"\n+                        ],\n+                        \"deprecationReason\": \"\",\n+                        \"group\": \"org.apache.nifi\",\n+                        \"propertyDescriptors\": {\n+                            \"oauth2-access-token-url\": {\n+                                \"defaultValue\": \"\",\n+                                \"description\": \"The full endpoint of the URL where access tokens are handled.\",\n+                                \"displayName\": \"Access Token Url\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"oauth2-access-token-url\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"oauth2-ssl-context\": {\n+                                \"description\": \"\",\n+                                \"displayName\": \"SSL Context\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"oauth2-ssl-context\",\n+                                \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            }\n+                        },\n+                        \"providedApiImplementations\": [\n+                            {\n+                                \"artifact\": \"nifi-standard-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.oauth2.OAuth2TokenProvider\",\n+                                \"version\": \"1.27.0\"\n+                            }\n+                        ],\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"authorization\",\n+                            \"oauth2\",\n+                            \"provider\"\n+                        ],\n+                        \"type\": \"org.apache.nifi.oauth2.OAuth2TokenProviderImpl\",\n+                        \"typeDescription\": \"This controller service provides a way of working with access and refresh tokens via the password and client_credential grant flows in the OAuth2 specification. It is meant to provide a way for components to get a token from an oauth2 provider and pass that token as a part of a header to another service.\",\n+                        \"version\": \"1.27.0\"\n+                    },\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-oauth2-provider-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"e0c4461\"\n+                        },\n+                        \"group\": \"org.apache.nifi\",\n+                        \"propertyDescriptors\": {\n+                            \"HTTP Protocols\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"FlowFile will be routed to success after successfully sending the content to a Kafka node, without waiting for any acknowledgment from the node at all. This provides the best performance but may result in data loss.\",\n-                                        \"displayName\": \"Best Effort\",\n-                                        \"value\": \"0\"\n+                                        \"description\": \"HTTP/1.1\",\n+                                        \"displayName\": \"http/1.1\",\n+                                        \"value\": \"HTTP_1_1\"\n                                     },\n                                     {\n-                                        \"description\": \"FlowFile will be routed to success if the message is received by a single Kafka node, whether or not it is replicated. This is faster than <Guarantee Replicated Delivery> but can result in data loss if a Kafka node crashes\",\n-                                        \"displayName\": \"Guarantee Single Node Delivery\",\n-                                        \"value\": \"1\"\n+                                        \"description\": \"HTTP/2 and HTTP/1.1 negotiated based on requested protocols\",\n+                                        \"displayName\": \"h2 http/1.1\",\n+                                        \"value\": \"H2_HTTP_1_1\"\n                                     },\n                                     {\n-                                        \"description\": \"FlowFile will be routed to failure unless the message is replicated to the appropriate number of Kafka Nodes according to the Topic configuration\",\n-                                        \"displayName\": \"Guarantee Replicated Delivery\",\n-                                        \"value\": \"all\"\n+                                        \"description\": \"HTTP/2\",\n+                                        \"displayName\": \"h2\",\n+                                        \"value\": \"H2\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"0\",\n-                                \"description\": \"Specifies the requirement for guaranteeing that a message is sent to Kafka. Corresponds to Kafka's 'acks' property.\",\n-                                \"displayName\": \"Delivery Guarantee\",\n+                                \"defaultValue\": \"H2_HTTP_1_1\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"propertyDisplayName\": \"SSL Context Service\",\n+                                        \"propertyName\": \"ssl-context-service\"\n+                                    }\n+                                ],\n+                                \"description\": \"HTTP Protocols supported for Application Layer Protocol Negotiation with TLS\",\n+                                \"displayName\": \"HTTP Protocols\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"acks\",\n+                                \"name\": \"HTTP Protocols\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"attribute-name-regex\": {\n-                                \"description\": \"A Regular Expression that is matched against all FlowFile attribute names. Any attribute whose name matches the regex will be added to the Kafka messages as a Header. If not specified, no FlowFile attributes will be added as headers.\",\n-                                \"displayName\": \"Attributes to Send as Headers (Regex)\",\n+                            \"audience\": {\n+                                \"description\": \"Audience for the access token request defined in RFC 8693 Section 2.1\",\n+                                \"displayName\": \"Audience\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"attribute-name-regex\",\n+                                \"name\": \"audience\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"bootstrap.servers\": {\n-                                \"defaultValue\": \"localhost:9092\",\n-                                \"description\": \"Comma-separated list of Kafka Brokers in the format host:port\",\n-                                \"displayName\": \"Kafka Brokers\",\n+                            \"authorization-server-url\": {\n+                                \"description\": \"The URL of the authorization server that issues access tokens.\",\n+                                \"displayName\": \"Authorization Server URL\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"bootstrap.servers\",\n+                                \"name\": \"authorization-server-url\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"compression.type\": {\n+                            \"client-authentication-strategy\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"none\",\n-                                        \"value\": \"none\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"gzip\",\n-                                        \"value\": \"gzip\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"snappy\",\n-                                        \"value\": \"snappy\"\n+                                        \"description\": \"Send client authentication in request body. RFC 6749 Section 2.3.1 recommends Basic Authentication instead of request body.\",\n+                                        \"displayName\": \"REQUEST_BODY\",\n+                                        \"value\": \"REQUEST_BODY\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"lz4\",\n-                                        \"value\": \"lz4\"\n+                                        \"description\": \"Send client authentication using HTTP Basic authentication.\",\n+                                        \"displayName\": \"BASIC_AUTHENTICATION\",\n+                                        \"value\": \"BASIC_AUTHENTICATION\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"none\",\n-                                \"description\": \"This parameter allows you to specify the compression codec for all data generated by this producer.\",\n-                                \"displayName\": \"Compression Type\",\n+                                \"defaultValue\": \"REQUEST_BODY\",\n+                                \"description\": \"Strategy for authenticating the client against the OAuth2 token provider service.\",\n+                                \"displayName\": \"Client Authentication Strategy\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"compression.type\",\n+                                \"name\": \"client-authentication-strategy\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"kafka-key\": {\n-                                \"description\": \"The Key to use for the Message. If not specified, the flow file attribute 'kafka.key' is used as the message key, if it is present.Beware that setting Kafka key and demarcating at the same time may potentially lead to many Kafka messages with the same key.Normally this is not a problem as Kafka does not enforce or assume message and key uniqueness. Still, setting the demarcator and Kafka key at the same time poses a risk of data loss on Kafka. During a topic compaction on Kafka, messages will be deduplicated based on this key.\",\n-                                \"displayName\": \"Kafka Key\",\n+                            \"client-id\": {\n+                                \"description\": \"\",\n+                                \"displayName\": \"Client ID\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"kafka-key\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"client-id\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"key-attribute-encoding\": {\n+                            \"client-secret\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"propertyDisplayName\": \"Client ID\",\n+                                        \"propertyName\": \"client-id\"\n+                                    }\n+                                ],\n+                                \"description\": \"\",\n+                                \"displayName\": \"Client secret\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"client-secret\",\n+                                \"required\": true,\n+                                \"sensitive\": true\n+                            },\n+                            \"grant-type\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"The key is interpreted as a UTF-8 Encoded string.\",\n-                                        \"displayName\": \"UTF-8 Encoded\",\n-                                        \"value\": \"utf-8\"\n+                                        \"description\": \"Resource Owner Password Credentials Grant. Used to access resources available to users. Requires username and password and usually Client ID and Client Secret.\",\n+                                        \"displayName\": \"User Password\",\n+                                        \"value\": \"password\"\n                                     },\n                                     {\n-                                        \"description\": \"The key is interpreted as arbitrary binary data and is encoded using hexadecimal characters with uppercase letters\",\n-                                        \"displayName\": \"Hex Encoded\",\n-                                        \"value\": \"hex\"\n+                                        \"description\": \"Client Credentials Grant. Used to access resources available to clients. Requires Client ID and Client Secret.\",\n+                                        \"displayName\": \"Client Credentials\",\n+                                        \"value\": \"client_credentials\"\n                                     },\n                                     {\n-                                        \"description\": \"The key will not be added as an Attribute\",\n-                                        \"displayName\": \"Do Not Add Key as Attribute\",\n-                                        \"value\": \"do-not-add\"\n+                                        \"description\": \"Refresh Token Grant. Used to get fresh access tokens based on a previously acquired refresh token. Requires Client ID and Client Secret (apart from Refresh Token).\",\n+                                        \"displayName\": \"Refresh Token\",\n+                                        \"value\": \"refresh_token\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"utf-8\",\n-                                \"description\": \"FlowFiles that are emitted have an attribute named 'kafka.key'. This property dictates how the value of the attribute should be encoded.\",\n-                                \"displayName\": \"Key Attribute Encoding\",\n+                                \"defaultValue\": \"password\",\n+                                \"description\": \"The OAuth2 Grant Type to be used when acquiring an access token.\",\n+                                \"displayName\": \"Grant Type\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"key-attribute-encoding\",\n+                                \"name\": \"grant-type\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"max.block.ms\": {\n-                                \"defaultValue\": \"5 sec\",\n-                                \"description\": \"The amount of time publisher will wait to obtain metadata or wait for the buffer to flush during the 'send' call before failing the entire 'send' call. Corresponds to Kafka's 'max.block.ms' property\",\n-                                \"displayName\": \"Max Metadata Wait Time\",\n+                            \"proxy-configuration-service\": {\n+                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests. Supported proxies: HTTP + AuthN\",\n+                                \"displayName\": \"Proxy Configuration Service\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"proxy-configuration-service\",\n+                                \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.proxy.ProxyConfigurationService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"refresh-token\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"refresh_token\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Grant Type\",\n+                                        \"propertyName\": \"grant-type\"\n+                                    }\n+                                ],\n+                                \"description\": \"Refresh Token.\",\n+                                \"displayName\": \"Refresh Token\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"max.block.ms\",\n+                                \"name\": \"refresh-token\",\n                                 \"required\": true,\n-                                \"sensitive\": false\n+                                \"sensitive\": true\n                             },\n-                            \"max.request.size\": {\n-                                \"defaultValue\": \"1 MB\",\n-                                \"description\": \"The maximum size of a request in bytes. Corresponds to Kafka's 'max.request.size' property and defaults to 1 MB (1048576).\",\n-                                \"displayName\": \"Max Request Size\",\n+                            \"refresh-window\": {\n+                                \"defaultValue\": \"0 s\",\n+                                \"description\": \"The service will attempt to refresh tokens expiring within the refresh window, subtracting the configured duration from the token expiration.\",\n+                                \"displayName\": \"Refresh Window\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"max.request.size\",\n+                                \"name\": \"refresh-window\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"message-demarcator\": {\n-                                \"description\": \"Specifies the string (interpreted as UTF-8) to use for demarcating multiple messages within a single FlowFile. If not specified, the entire content of the FlowFile will be used as a single message. If specified, the contents of the FlowFile will be split on this delimiter and each section sent as a separate Kafka message. To enter special character such as 'new line' use CTRL+Enter or Shift+Enter, depending on your OS.\",\n-                                \"displayName\": \"Message Demarcator\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"message-demarcator\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"message-header-encoding\": {\n-                                \"defaultValue\": \"UTF-8\",\n-                                \"description\": \"For any attribute that is added as a message header, as configured via the <Attributes to Send as Headers> property, this property indicates the Character Encoding to use for serializing the headers.\",\n-                                \"displayName\": \"Message Header Encoding\",\n+                            \"resource\": {\n+                                \"description\": \"Resource URI for the access token request defined in RFC 8707 Section 2\",\n+                                \"displayName\": \"Resource\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"message-header-encoding\",\n+                                \"name\": \"resource\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"partition\": {\n-                                \"description\": \"Specifies which Partition Records will go to.\",\n-                                \"displayName\": \"Partition\",\n+                            \"scope\": {\n+                                \"description\": \"Space-delimited, case-sensitive list of scopes of the access request (as per the OAuth 2.0 specification)\",\n+                                \"displayName\": \"Scope\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"partition\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"scope\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"partitioner.class\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"Messages will be assigned partitions in a round-robin fashion, sending the first message to Partition 1, the next Partition to Partition 2, and so on, wrapping as necessary.\",\n-                                        \"displayName\": \"RoundRobinPartitioner\",\n-                                        \"value\": \"org.apache.nifi.processors.kafka.pubsub.Partitioners$RoundRobinPartitioner\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Messages will be assigned to random partitions.\",\n-                                        \"displayName\": \"DefaultPartitioner\",\n-                                        \"value\": \"org.apache.kafka.clients.producer.internals.DefaultPartitioner\"\n-                                    },\n+                            \"service-password\": {\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"Interprets the <Partition> property as Expression Language that will be evaluated against each FlowFile. This Expression will be evaluated once against the FlowFile, so all Records in a given FlowFile will go to the same partition.\",\n-                                        \"displayName\": \"Expression Language Partitioner\",\n-                                        \"value\": \"org.apache.nifi.processors.kafka.pubsub.Partitioners$ExpressionLanguagePartitioner\"\n+                                        \"dependentValues\": [\n+                                            \"password\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Grant Type\",\n+                                        \"propertyName\": \"grant-type\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"org.apache.kafka.clients.producer.internals.DefaultPartitioner\",\n-                                \"description\": \"Specifies which class to use to compute a partition id for a message. Corresponds to Kafka's 'partitioner.class' property.\",\n-                                \"displayName\": \"Partitioner class\",\n+                                \"description\": \"Password for the username on the service that is being accessed.\",\n+                                \"displayName\": \"Password\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"partitioner.class\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"sasl.kerberos.keytab\": {\n-                                \"description\": \"Keytab credentials used for authentication with Kerberos\",\n-                                \"displayName\": \"Kerberos Keytab\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"sasl.kerberos.keytab\",\n-                                \"required\": false,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"SINGLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\"\n-                                    ]\n-                                },\n-                                \"sensitive\": false\n-                            },\n-                            \"sasl.kerberos.principal\": {\n-                                \"description\": \"Principal used for authentication with Kerberos\",\n-                                \"displayName\": \"Kerberos Principal\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"sasl.kerberos.principal\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"sasl.kerberos.service.name\": {\n-                                \"description\": \"The service name that matches the primary name of the Kafka server configured in the broker JAAS configuration\",\n-                                \"displayName\": \"Kerberos Service Name\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"sasl.kerberos.service.name\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n+                                \"name\": \"service-password\",\n+                                \"required\": true,\n+                                \"sensitive\": true\n                             },\n-                            \"security.protocol\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"PLAINTEXT\",\n-                                        \"value\": \"PLAINTEXT\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"SSL\",\n-                                        \"value\": \"SSL\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"SASL_PLAINTEXT\",\n-                                        \"value\": \"SASL_PLAINTEXT\"\n-                                    },\n+                            \"service-user-name\": {\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"SASL_SSL\",\n-                                        \"value\": \"SASL_SSL\"\n+                                        \"dependentValues\": [\n+                                            \"password\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Grant Type\",\n+                                        \"propertyName\": \"grant-type\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"PLAINTEXT\",\n-                                \"description\": \"Security protocol used to communicate with brokers. Corresponds to Kafka Client security.protocol property\",\n-                                \"displayName\": \"Security Protocol\",\n+                                \"description\": \"Username on the service that is being accessed.\",\n+                                \"displayName\": \"Username\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"security.protocol\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"service-user-name\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"ssl.context.service\": {\n-                                \"description\": \"Service supporting SSL communication with Kafka brokers\",\n+                            \"ssl-context-service\": {\n+                                \"description\": \"\",\n                                 \"displayName\": \"SSL Context Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"ssl.context.service\",\n+                                \"name\": \"ssl-context-service\",\n                                 \"required\": false,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n                                     \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n                                     \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n                                     \"version\": \"1.27.0\"\n                                 }\n-                            },\n-                            \"topic\": {\n-                                \"description\": \"The name of the Kafka Topic to publish to.\",\n-                                \"displayName\": \"Topic Name\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"topic\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"transactional-id-prefix\": {\n-                                \"description\": \"When Use Transaction is set to true, KafkaProducer config 'transactional.id' will be a generated UUID and will be prefixed with this string.\",\n-                                \"displayName\": \"Transactional Id Prefix\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"transactional-id-prefix\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"use-transactions\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"true\",\n-                                \"description\": \"Specifies whether or not NiFi should provide Transactional guarantees when communicating with Kafka. If there is a problem sending data to Kafka, and this property is set to false, then the messages that have already been sent to Kafka will continue on and be delivered to consumers. If this is set to true, then the Kafka transaction will be rolled back so that those messages are not available to consumers. Setting this to true requires that the <Delivery Guarantee> property be set to \\\"Guarantee Replicated Delivery.\\\"\",\n-                                \"displayName\": \"Use Transactions\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"use-transactions\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n                             }\n                         },\n-                        \"sideEffectFree\": false,\n-                        \"supportedRelationships\": [\n-                            {\n-                                \"description\": \"FlowFiles for which all content was sent to Kafka.\",\n-                                \"name\": \"success\"\n-                            },\n+                        \"providedApiImplementations\": [\n                             {\n-                                \"description\": \"Any FlowFile that cannot be sent to Kafka will be routed to this Relationship\",\n-                                \"name\": \"failure\"\n+                                \"artifact\": \"nifi-standard-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.oauth2.OAuth2AccessTokenProvider\",\n+                                \"version\": \"1.27.0\"\n                             }\n                         ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": false,\n-                        \"supportsDynamicProperties\": true,\n-                        \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": false,\n+                        \"supportsDynamicProperties\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"1.0\",\n-                            \"Apache\",\n-                            \"Kafka\",\n-                            \"Message\",\n-                            \"PubSub\",\n-                            \"Put\",\n-                            \"Send\"\n+                            \"access token\",\n+                            \"authorization\",\n+                            \"http\",\n+                            \"oauth2\",\n+                            \"provider\"\n                         ],\n-                        \"triggerSerially\": false,\n-                        \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.kafka.pubsub.PublishKafka_1_0\",\n-                        \"typeDescription\": \"Sends the contents of a FlowFile as a message to Apache Kafka using the Kafka 1.0 Producer API.The messages to send may be individual FlowFiles or may be delimited, using a user-specified delimiter, such as a new-line. The complementary NiFi processor for fetching messages is ConsumeKafka_1_0.\",\n-                        \"version\": \"1.27.0\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"The number of messages that were sent to Kafka for this FlowFile. This attribute is added only to FlowFiles that are routed to success. If the <Message Demarcator> Property is not set, this will always be 1, but if the Property is set, it may be greater than 1.\",\n-                                \"name\": \"msg.count\"\n-                            }\n-                        ]\n+                        \"type\": \"org.apache.nifi.oauth2.StandardOauth2AccessTokenProvider\",\n+                        \"typeDescription\": \"Provides OAuth 2.0 access tokens that can be used as Bearer authorization header in HTTP requests. Can use either Resource Owner Password Credentials Grant or Client Credentials Grant. Client authentication can be done with either HTTP Basic authentication or in the request body.\",\n+                        \"version\": \"1.27.0\"\n                     }\n                 ],\n+                \"processors\": [],\n                 \"reportingTasks\": []\n             },\n             \"group\": \"org.apache.nifi\",\n             \"version\": \"1.27.0\"\n         },\n         {\n-            \"artifact\": \"nifi-opentelemetry-nar\",\n+            \"artifact\": \"nifi-hazelcast-services-nar\",\n             \"componentManifest\": {\n-                \"controllerServices\": [],\n-                \"processors\": [\n+                \"controllerServices\": [\n                     {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-opentelemetry-nar\",\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-hazelcast-services-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n-                        \"defaultBulletinLevel\": \"WARN\",\n-                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": 1,\n-                            \"TIMER_DRIVEN\": 1\n-                        },\n-                        \"defaultPenaltyDuration\": \"30 sec\",\n-                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"25 ms\"\n-                        },\n-                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n-                        \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n-                        \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Address\": {\n-                                \"defaultValue\": \"0.0.0.0\",\n-                                \"description\": \"Internet Protocol Address on which to listen for OTLP Export Service Requests. The default value enables listening on all addresses.\",\n-                                \"displayName\": \"Address\",\n+                            \"hazelcast-cache-manager\": {\n+                                \"description\": \"A Hazelcast Cache Manager which manages connections to Hazelcast and provides cache instances.\",\n+                                \"displayName\": \"Hazelcast Cache Manager\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Address\",\n+                                \"name\": \"hazelcast-cache-manager\",\n+                                \"required\": true,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-hazelcast-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.hazelcast.services.cachemanager.HazelcastCacheManager\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"hazelcast-cache-name\": {\n+                                \"description\": \"The name of a given cache. A Hazelcast cluster may handle multiple independent caches, each identified by a name. Clients using caches with the same name are working on the same data structure within Hazelcast.\",\n+                                \"displayName\": \"Hazelcast Cache Name\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"hazelcast-cache-name\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Batch Size\": {\n-                                \"defaultValue\": \"100\",\n-                                \"description\": \"Maximum number of OTLP request resource elements included in each FlowFile produced\",\n-                                \"displayName\": \"Batch Size\",\n+                            \"hazelcast-entry-ttl\": {\n+                                \"defaultValue\": \"5 min\",\n+                                \"description\": \"Indicates how long the written entries should exist in Hazelcast. Setting it to '0 secs' means that the datawill exists until its deletion or until the Hazelcast server is shut down. Using `EmbeddedHazelcastCacheManager` ascache manager will not provide policies to limit the size of the cache.\",\n+                                \"displayName\": \"Hazelcast Entry Lifetime\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Batch Size\",\n+                                \"name\": \"hazelcast-entry-ttl\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n+                            }\n+                        },\n+                        \"providedApiImplementations\": [\n+                            {\n+                                \"artifact\": \"nifi-standard-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.distributed.cache.client.AtomicDistributedMapCacheClient\",\n+                                \"version\": \"1.27.0\"\n                             },\n-                            \"Client Authentication\": {\n+                            {\n+                                \"artifact\": \"nifi-standard-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.distributed.cache.client.DistributedMapCacheClient\",\n+                                \"version\": \"1.27.0\"\n+                            }\n+                        ],\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"cache\",\n+                            \"hazelcast\",\n+                            \"map\"\n+                        ],\n+                        \"type\": \"org.apache.nifi.hazelcast.services.cacheclient.HazelcastMapCacheClient\",\n+                        \"typeDescription\": \"An implementation of DistributedMapCacheClient that uses Hazelcast as the backing cache. This service relies on an other controller service, manages the actual Hazelcast calls, set in Hazelcast Cache Manager.\",\n+                        \"version\": \"1.27.0\"\n+                    },\n+                    {\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-hazelcast-services-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"e0c4461\"\n+                        },\n+                        \"group\": \"org.apache.nifi\",\n+                        \"propertyDescriptors\": {\n+                            \"hazelcast-cluster-name\": {\n+                                \"defaultValue\": \"nifi\",\n+                                \"description\": \"Name of the Hazelcast cluster.\",\n+                                \"displayName\": \"Hazelcast Cluster Name\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"hazelcast-cluster-name\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"hazelcast-clustering-strategy\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"WANT\",\n-                                        \"value\": \"WANT\"\n+                                        \"description\": \"No high availability or data replication is provided, every node has access only to the data stored locally.\",\n+                                        \"displayName\": \"None\",\n+                                        \"value\": \"none\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"REQUIRED\",\n-                                        \"value\": \"REQUIRED\"\n+                                        \"description\": \"Creates Hazelcast cluster based on the NiFi cluster: It expects every NiFi nodes to have a running Hazelcast instance on the same port as specified in the Hazelcast Port property. No explicit listing of the instances is needed.\",\n+                                        \"displayName\": \"All Nodes\",\n+                                        \"value\": \"all_nodes\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"NONE\",\n-                                        \"value\": \"NONE\"\n+                                        \"description\": \"Works with an explicit list of Hazelcast instances, creating a cluster using the listed instances. This provides greater control, making it possible to utilize only certain nodes as Hazelcast servers. The list of Hazelcast instances can be set in the property \\\"Hazelcast Instances\\\". The list items must refer to hosts within the NiFi cluster, no external Hazelcast is allowed. NiFi nodes are not listed will be join to the Hazelcast cluster as clients.\",\n+                                        \"displayName\": \"Explicit\",\n+                                        \"value\": \"explicit\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"WANT\",\n-                                \"description\": \"Client authentication policy for TLS communication with HTTPS\",\n-                                \"displayName\": \"Client Authentication\",\n+                                \"defaultValue\": \"none\",\n+                                \"description\": \"Specifies with what strategy the Hazelcast cluster should be created.\",\n+                                \"displayName\": \"Hazelcast Clustering Strategy\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Client Authentication\",\n+                                \"name\": \"hazelcast-clustering-strategy\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Port\": {\n-                                \"defaultValue\": \"4317\",\n-                                \"description\": \"TCP port number on which to listen for OTLP Export Service Requests over HTTP and gRPC\",\n-                                \"displayName\": \"Port\",\n+                            \"hazelcast-instances\": {\n+                                \"description\": \"Only used with \\\"Explicit\\\" Clustering Strategy! List of NiFi instance host names which should be part of the Hazelcast cluster. Host names are separated by comma. The port specified in the \\\"Hazelcast Port\\\" property will be used as server port. The list must contain every instance that will be part of the cluster. Other instances will join the Hazelcast cluster as clients.\",\n+                                \"displayName\": \"Hazelcast Instances\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"hazelcast-instances\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"hazelcast-port\": {\n+                                \"defaultValue\": \"5701\",\n+                                \"description\": \"Port for the Hazelcast instance to use.\",\n+                                \"displayName\": \"Hazelcast Port\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"hazelcast-port\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            }\n+                        },\n+                        \"providedApiImplementations\": [\n+                            {\n+                                \"artifact\": \"nifi-hazelcast-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.hazelcast.services.cachemanager.HazelcastCacheManager\",\n+                                \"version\": \"1.27.0\"\n+                            }\n+                        ],\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"cache\",\n+                            \"hazelcast\"\n+                        ],\n+                        \"type\": \"org.apache.nifi.hazelcast.services.cachemanager.EmbeddedHazelcastCacheManager\",\n+                        \"typeDescription\": \"A service that runs embedded Hazelcast and provides cache instances backed by that. The server does not ask for authentication, it is recommended to run it within secured network.\",\n+                        \"version\": \"1.27.0\"\n+                    },\n+                    {\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-hazelcast-services-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"e0c4461\"\n+                        },\n+                        \"group\": \"org.apache.nifi\",\n+                        \"propertyDescriptors\": {\n+                            \"hazelcast-cluster-name\": {\n+                                \"defaultValue\": \"nifi\",\n+                                \"description\": \"Name of the Hazelcast cluster.\",\n+                                \"displayName\": \"Hazelcast Cluster Name\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"hazelcast-cluster-name\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"hazelcast-connection-timeout\": {\n+                                \"defaultValue\": \"20 secs\",\n+                                \"description\": \"The maximum amount of time the client tries to connect or reconnect before giving up.\",\n+                                \"displayName\": \"Hazelcast Connection Timeout\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Port\",\n+                                \"name\": \"hazelcast-connection-timeout\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Queue Capacity\": {\n-                                \"defaultValue\": \"1000\",\n-                                \"description\": \"Maximum number of OTLP request resource elements that can be received and queued\",\n-                                \"displayName\": \"Queue Capacity\",\n+                            \"hazelcast-retry-backoff-initial\": {\n+                                \"defaultValue\": \"1 secs\",\n+                                \"description\": \"The amount of time the client waits before it tries to reestablish connection for the first time.\",\n+                                \"displayName\": \"Hazelcast Initial Backoff\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Queue Capacity\",\n+                                \"name\": \"hazelcast-retry-backoff-initial\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"SSL Context Service\": {\n-                                \"description\": \"SSL Context Service enables TLS communication for HTTPS\",\n-                                \"displayName\": \"SSL Context Service\",\n+                            \"hazelcast-retry-backoff-maximum\": {\n+                                \"defaultValue\": \"5 secs\",\n+                                \"description\": \"The maximum amount of time the client waits before it tries to reestablish connection.\",\n+                                \"displayName\": \"Hazelcast Maximum Backoff\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"SSL Context Service\",\n+                                \"name\": \"hazelcast-retry-backoff-maximum\",\n                                 \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n+                                \"sensitive\": false\n                             },\n-                            \"Worker Threads\": {\n-                                \"defaultValue\": \"2\",\n-                                \"description\": \"Number of threads responsible for decoding and queuing incoming OTLP Export Service Requests\",\n-                                \"displayName\": \"Worker Threads\",\n+                            \"hazelcast-retry-backoff-multiplier\": {\n+                                \"defaultValue\": \"1.5\",\n+                                \"description\": \"A multiplier by which the wait time is increased before each attempt to reestablish connection.\",\n+                                \"displayName\": \"Hazelcast Backoff Multiplier\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Worker Threads\",\n+                                \"name\": \"hazelcast-retry-backoff-multiplier\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"hazelcast-server-address\": {\n+                                \"description\": \"Addresses of one or more the Hazelcast instances, using {host:port} format, separated by comma.\",\n+                                \"displayName\": \"Hazelcast Server Address\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"hazelcast-server-address\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             }\n                         },\n-                        \"sideEffectFree\": false,\n-                        \"supportedRelationships\": [\n+                        \"providedApiImplementations\": [\n                             {\n-                                \"description\": \"Export Service Requests containing OTLP Telemetry\",\n-                                \"name\": \"success\"\n+                                \"artifact\": \"nifi-hazelcast-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.hazelcast.services.cachemanager.HazelcastCacheManager\",\n+                                \"version\": \"1.27.0\"\n                             }\n                         ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n-                        \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"OTLP\",\n-                            \"OTel\",\n-                            \"OpenTelemetry\",\n-                            \"logs\",\n-                            \"metrics\",\n-                            \"telemetry\",\n-                            \"traces\"\n+                            \"cache\",\n+                            \"hazelcast\"\n                         ],\n-                        \"triggerSerially\": false,\n-                        \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.opentelemetry.ListenOTLP\",\n-                        \"typeDescription\": \"Collect OpenTelemetry messages over HTTP or gRPC. Supports standard Export Service Request messages for logs, metrics, and traces. Implements OpenTelemetry OTLP Specification 1.0.0 with OTLP/gRPC and OTLP/HTTP. Provides protocol detection using the HTTP Content-Type header.\",\n-                        \"version\": \"1.27.0\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"Content-Type set to application/json\",\n-                                \"name\": \"mime.type\"\n-                            },\n+                        \"type\": \"org.apache.nifi.hazelcast.services.cachemanager.ExternalHazelcastCacheManager\",\n+                        \"typeDescription\": \"A service that provides cache instances backed by Hazelcast running outside of NiFi.\",\n+                        \"version\": \"1.27.0\"\n+                    }\n+                ],\n+                \"processors\": [],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"1.27.0\"\n+        },\n+        {\n+            \"artifact\": \"nifi-ldap-iaa-providers-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [],\n+                \"processors\": [],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"1.27.0\"\n+        },\n+        {\n+            \"artifact\": \"nifi-file-resource-service-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-file-resource-service-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"e0c4461\"\n+                        },\n+                        \"explicitRestrictions\": [\n                             {\n-                                \"description\": \"OpenTelemetry Resource Type: LOGS, METRICS, or TRACES\",\n-                                \"name\": \"resource.type\"\n-                            },\n+                                \"explanation\": \"Provides operator the ability to read from any file that NiFi has access to.\",\n+                                \"requiredPermission\": \"read filesystem\"\n+                            }\n+                        ],\n+                        \"group\": \"org.apache.nifi\",\n+                        \"propertyDescriptors\": {\n+                            \"file-path\": {\n+                                \"defaultValue\": \"${absolute.path}/${filename}\",\n+                                \"description\": \"Path to a file that can be accessed locally.\",\n+                                \"displayName\": \"File Path\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"file-path\",\n+                                \"required\": true,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"SINGLE\",\n+                                    \"resourceTypes\": [\n+                                        \"FILE\"\n+                                    ]\n+                                },\n+                                \"sensitive\": false\n+                            }\n+                        },\n+                        \"providedApiImplementations\": [\n                             {\n-                                \"description\": \"Count of resource elements included in messages\",\n-                                \"name\": \"resource.count\"\n+                                \"artifact\": \"nifi-standard-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.fileresource.service.api.FileResourceService\",\n+                                \"version\": \"1.27.0\"\n                             }\n-                        ]\n+                        ],\n+                        \"restricted\": true,\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"file\",\n+                            \"resource\"\n+                        ],\n+                        \"type\": \"org.apache.nifi.fileresource.service.StandardFileResourceService\",\n+                        \"typeDescription\": \"Provides a file resource for other components. The file needs to be available locally by Nifi (e.g. local disk or mounted storage). NiFi needs to have read permission to the file.\",\n+                        \"version\": \"1.27.0\"\n                     }\n                 ],\n+                \"processors\": [],\n                 \"reportingTasks\": []\n             },\n             \"group\": \"org.apache.nifi\",\n             \"version\": \"1.27.0\"\n         },\n         {\n-            \"artifact\": \"nifi-pgp-nar\",\n+            \"artifact\": \"nifi-airtable-nar\",\n             \"componentManifest\": {\n                 \"controllerServices\": [],\n                 \"processors\": [\n                     {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-pgp-nar\",\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-airtable-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n                         },\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"0 sec\"\n+                            \"TIMER_DRIVEN\": \"1 min\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n-                        \"defaultYieldDuration\": \"1 sec\",\n+                        \"defaultYieldDuration\": \"15 sec\",\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_REQUIRED\",\n-                        \"primaryNodeOnly\": false,\n+                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n+                        \"primaryNodeOnly\": true,\n                         \"propertyDescriptors\": {\n-                            \"decryption-strategy\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"Produce decrypted content read from literal data ignoring signatures\",\n-                                        \"displayName\": \"DECRYPTED\",\n-                                        \"value\": \"DECRYPTED\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Produce decrypted content packaged as an OpenPGP message for additional processing\",\n-                                        \"displayName\": \"PACKAGED\",\n-                                        \"value\": \"PACKAGED\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"DECRYPTED\",\n-                                \"description\": \"Strategy for writing files to success after decryption\",\n-                                \"displayName\": \"Decryption Strategy\",\n+                            \"api-key\": {\n+                                \"description\": \"The REST API key to use in queries. Should be generated on Airtable's account page.\",\n+                                \"displayName\": \"API Key\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"decryption-strategy\",\n+                                \"name\": \"api-key\",\n+                                \"required\": true,\n+                                \"sensitive\": true\n+                            },\n+                            \"api-url\": {\n+                                \"defaultValue\": \"https://api.airtable.com/v0\",\n+                                \"description\": \"The URL for the Airtable REST API including the domain and the path to the API (e.g. https://api.airtable.com/v0).\",\n+                                \"displayName\": \"API URL\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"api-url\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"passphrase\": {\n-                                \"description\": \"Passphrase used for decrypting data encrypted with Password-Based Encryption\",\n-                                \"displayName\": \"Passphrase\",\n+                            \"base-id\": {\n+                                \"description\": \"The ID of the Airtable base to be queried.\",\n+                                \"displayName\": \"Base ID\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"passphrase\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"base-id\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"custom-filter\": {\n+                                \"description\": \"Filter records by Airtable's formulas.\",\n+                                \"displayName\": \"Custom Filter\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"custom-filter\",\n                                 \"required\": false,\n-                                \"sensitive\": true\n+                                \"sensitive\": false\n                             },\n-                            \"private-key-service\": {\n-                                \"description\": \"PGP Private Key Service for decrypting data encrypted with Public Key Encryption\",\n-                                \"displayName\": \"Private Key Service\",\n+                            \"fields\": {\n+                                \"description\": \"Comma-separated list of fields to query from the table. Both the field's name and ID can be used.\",\n+                                \"displayName\": \"Fields\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"fields\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"max-records-per-flowfile\": {\n+                                \"description\": \"The maximum number of result records that will be included in a single FlowFile. This will allow you to break up very large result sets into multiple FlowFiles. If no value specified, then all records are returned in a single FlowFile.\",\n+                                \"displayName\": \"Max Records Per FlowFile\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"max-records-per-flowfile\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"query-page-size\": {\n+                                \"description\": \"Number of records to be fetched in a page. Should be between 1 and 100 inclusively.\",\n+                                \"displayName\": \"Query Page Size\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"query-page-size\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"query-time-window-lag\": {\n+                                \"defaultValue\": \"3 s\",\n+                                \"description\": \"The amount of lag to be applied to the query time window's end point. Set this property to avoid missing records when the clock of your local machines and Airtable servers' clock are not in sync. Must be greater than or equal to 1 second.\",\n+                                \"displayName\": \"Query Time Window Lag\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"query-time-window-lag\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"table-id\": {\n+                                \"description\": \"The name or the ID of the Airtable table to be queried.\",\n+                                \"displayName\": \"Table ID\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"table-id\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"web-client-service-provider\": {\n+                                \"description\": \"Web Client Service Provider to use for Airtable REST API requests\",\n+                                \"displayName\": \"Web Client Service Provider\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"private-key-service\",\n-                                \"required\": false,\n+                                \"name\": \"web-client-service-provider\",\n+                                \"required\": true,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-pgp-service-api-nar\",\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.pgp.service.api.PGPPrivateKeyService\",\n+                                    \"type\": \"org.apache.nifi.web.client.provider.api.WebClientServiceProvider\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             }\n                         },\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.processors.pgp.EncryptContentPGP\",\n-                            \"org.apache.nifi.processors.pgp.SignContentPGP\",\n-                            \"org.apache.nifi.processors.pgp.VerifyContentPGP\"\n-                        ],\n                         \"sideEffectFree\": false,\n+                        \"stateful\": {\n+                            \"description\": \"The last successful query's time is stored in order to enable incremental loading. The initial query returns all the records in the table and each subsequent query filters the records by their last modified time. In other words, if a record is updated after the last successful query only the updated records will be returned in the next query. State is stored across the cluster, so this Processor can run only on the Primary Node and if a new Primary Node is selected, the new node can pick up where the previous one left off without duplicating the data.\",\n+                            \"scopes\": [\n+                                \"CLUSTER\"\n+                            ]\n+                        },\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"Decryption Succeeded\",\n+                                \"description\": \"For FlowFiles created as a result of a successful query.\",\n                                 \"name\": \"success\"\n-                            },\n-                            {\n-                                \"description\": \"Decryption Failed\",\n-                                \"name\": \"failure\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n                         \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"Encryption\",\n-                            \"GPG\",\n-                            \"OpenPGP\",\n-                            \"PGP\",\n-                            \"RFC 4880\"\n+                            \"airtable\",\n+                            \"database\",\n+                            \"query\"\n                         ],\n-                        \"triggerSerially\": false,\n+                        \"triggerSerially\": true,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.pgp.DecryptContentPGP\",\n-                        \"typeDescription\": \"Decrypt contents of OpenPGP messages. Using the Packaged Decryption Strategy preserves OpenPGP encoding to support subsequent signature verification.\",\n+                        \"triggerWhenEmpty\": true,\n+                        \"type\": \"org.apache.nifi.processors.airtable.QueryAirtableTable\",\n+                        \"typeDescription\": \"Query records from an Airtable table. Records are incrementally retrieved based on the last modified time of the records. Records can also be further filtered by setting the 'Custom Filter' property which supports the formulas provided by the Airtable API. This processor is intended to be run on the Primary Node only.\",\n                         \"version\": \"1.27.0\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"Filename from decrypted Literal Data\",\n-                                \"name\": \"pgp.literal.data.filename\"\n+                                \"description\": \"Sets the number of records in the FlowFile.\",\n+                                \"name\": \"record.count\"\n                             },\n                             {\n-                                \"description\": \"Modified Date from decrypted Literal Data\",\n-                                \"name\": \"pgp.literal.data.modified\"\n+                                \"description\": \"If 'Max Records Per FlowFile' is set then all FlowFiles from the same query result set will have the same value for the fragment.identifier attribute. This can then be used to correlate the results.\",\n+                                \"name\": \"fragment.identifier\"\n                             },\n                             {\n-                                \"description\": \"Symmetric-Key Algorithm Block Cipher\",\n-                                \"name\": \"pgp.symmetric.key.algorithm.block.cipher\"\n+                                \"description\": \"If 'Max Records Per FlowFile' is set then this is the total number of FlowFiles produced by a single ResultSet. This can be used in conjunction with the fragment.identifier attribute in order to know how many FlowFiles belonged to the same incoming ResultSet.\",\n+                                \"name\": \"fragment.count\"\n                             },\n                             {\n-                                \"description\": \"Symmetric-Key Algorithm Identifier\",\n-                                \"name\": \"pgp.symmetric.key.algorithm.id\"\n+                                \"description\": \"If 'Max Records Per FlowFile' is set then the position of this FlowFile in the list of outgoing FlowFiles that were all derived from the same result set FlowFile. This can be used in conjunction with the fragment.identifier attribute to know which FlowFiles originated from the same query result set and in what order FlowFiles were produced\",\n+                                \"name\": \"fragment.index\"\n                             }\n                         ]\n-                    },\n+                    }\n+                ],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"1.27.0\"\n+        },\n+        {\n+            \"artifact\": \"nifi-elasticsearch-restapi-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [],\n+                \"processors\": [\n                     {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-pgp-nar\",\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-elasticsearch-restapi-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n                         },\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"0 sec\"\n+                            \"TIMER_DRIVEN\": \"1 min\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n+                        \"dynamicProperties\": [\n+                            {\n+                                \"description\": \"Adds the specified property name/value as a query parameter in the Elasticsearch URL used for processing. These parameters will override any matching parameters in the query request body. For SCROLL type queries, these parameters are only used in the initial (first page) query as the Elasticsearch Scroll API does not support the same query parameters for subsequent pages of data.\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"name\": \"The name of a URL query parameter to add\",\n+                                \"value\": \"The value of the URL query parameter\"\n+                            }\n+                        ],\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_REQUIRED\",\n-                        \"primaryNodeOnly\": false,\n+                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n+                        \"primaryNodeOnly\": true,\n                         \"propertyDescriptors\": {\n-                            \"compression-algorithm\": {\n+                            \"el-query-attribute\": {\n+                                \"description\": \"If set, the executed query will be set on each result flowfile in the specified attribute.\",\n+                                \"displayName\": \"Query Attribute\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"el-query-attribute\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"el-rest-client-service\": {\n+                                \"description\": \"An Elasticsearch client service to use for running queries.\",\n+                                \"displayName\": \"Client Service\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"el-rest-client-service\",\n+                                \"required\": true,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-elasticsearch-client-service-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.elasticsearch.ElasticSearchClientService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"el-rest-fetch-index\": {\n+                                \"description\": \"The name of the index to use.\",\n+                                \"displayName\": \"Index\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"el-rest-fetch-index\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"el-rest-format-aggregations\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"UNCOMPRESSED\",\n-                                        \"value\": \"UNCOMPRESSED\"\n+                                        \"description\": \"Contains full Elasticsearch Aggregation, including Buckets and Metadata.\",\n+                                        \"displayName\": \"FULL\",\n+                                        \"value\": \"FULL\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"ZIP\",\n-                                        \"value\": \"ZIP\"\n+                                        \"description\": \"Bucket Content only.\",\n+                                        \"displayName\": \"BUCKETS_ONLY\",\n+                                        \"value\": \"BUCKETS_ONLY\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"ZLIB\",\n-                                        \"value\": \"ZLIB\"\n+                                        \"description\": \"Aggregation Metadata only.\",\n+                                        \"displayName\": \"METADATA_ONLY\",\n+                                        \"value\": \"METADATA_ONLY\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"FULL\",\n+                                \"description\": \"Format of Aggregation output.\",\n+                                \"displayName\": \"Aggregation Results Format\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"el-rest-format-aggregations\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"el-rest-format-hits\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"Contains full Elasticsearch Hit, including Document Source and Metadata.\",\n+                                        \"displayName\": \"FULL\",\n+                                        \"value\": \"FULL\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"BZIP2\",\n-                                        \"value\": \"BZIP2\"\n+                                        \"description\": \"Document Source only (where present).\",\n+                                        \"displayName\": \"SOURCE_ONLY\",\n+                                        \"value\": \"SOURCE_ONLY\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Hit Metadata only.\",\n+                                        \"displayName\": \"METADATA_ONLY\",\n+                                        \"value\": \"METADATA_ONLY\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"ZIP\",\n-                                \"description\": \"Compression Algorithm for encryption\",\n-                                \"displayName\": \"Compression Algorithm\",\n+                                \"defaultValue\": \"FULL\",\n+                                \"description\": \"Format of Hits output.\",\n+                                \"displayName\": \"Search Results Format\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"compression-algorithm\",\n+                                \"name\": \"el-rest-format-hits\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"file-encoding\": {\n+                            \"el-rest-output-no-hits\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"ASCII\",\n-                                        \"value\": \"ASCII\"\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"BINARY\",\n-                                        \"value\": \"BINARY\"\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"BINARY\",\n-                                \"description\": \"File Encoding for encryption\",\n-                                \"displayName\": \"File Encoding\",\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"Output a \\\"hits\\\" flowfile even if no hits found for query. If true, an empty \\\"hits\\\" flowfile will be output even if \\\"aggregations\\\" are output.\",\n+                                \"displayName\": \"Output No Hits\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"file-encoding\",\n+                                \"name\": \"el-rest-output-no-hits\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"passphrase\": {\n-                                \"description\": \"Passphrase used for encrypting data with Password-Based Encryption\",\n-                                \"displayName\": \"Passphrase\",\n+                            \"el-rest-pagination-keep-alive\": {\n+                                \"defaultValue\": \"10 mins\",\n+                                \"description\": \"Pagination \\\"keep_alive\\\" period. Period Elasticsearch will keep the scroll/pit cursor alive in between requests (this is not the time expected for all pages to be returned, but the maximum allowed time for requests between page retrievals).\",\n+                                \"displayName\": \"Pagination Keep Alive\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"passphrase\",\n-                                \"required\": false,\n-                                \"sensitive\": true\n+                                \"name\": \"el-rest-pagination-keep-alive\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n                             },\n-                            \"public-key-search\": {\n-                                \"dependencies\": [\n+                            \"el-rest-pagination-type\": {\n+                                \"allowableValues\": [\n                                     {\n-                                        \"propertyDisplayName\": \"Public Key Service\",\n-                                        \"propertyName\": \"public-key-service\"\n+                                        \"description\": \"Use Elasticsearch \\\"_scroll\\\" API to page results. Does not accept additional query parameters.\",\n+                                        \"displayName\": \"SCROLL\",\n+                                        \"value\": \"pagination-scroll\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Use Elasticsearch \\\"search_after\\\" _search API to page sorted results.\",\n+                                        \"displayName\": \"SEARCH_AFTER\",\n+                                        \"value\": \"pagination-search_after\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Use Elasticsearch (7.10+ with XPack) \\\"point in time\\\" _search API to page sorted results.\",\n+                                        \"displayName\": \"POINT_IN_TIME\",\n+                                        \"value\": \"pagination-pit\"\n                                     }\n                                 ],\n-                                \"description\": \"PGP Public Key Search will be used to match against the User ID or Key ID when formatted as uppercase hexadecimal string of 16 characters\",\n-                                \"displayName\": \"Public Key Search\",\n+                                \"defaultValue\": \"pagination-scroll\",\n+                                \"description\": \"Pagination method to use. Not all types are available for all Elasticsearch versions, check the Elasticsearch docs to confirm which are applicable and recommended for your service.\",\n+                                \"displayName\": \"Pagination Type\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"public-key-search\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"el-rest-pagination-type\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"public-key-service\": {\n-                                \"description\": \"PGP Public Key Service for encrypting data with Public Key Encryption\",\n-                                \"displayName\": \"Public Key Service\",\n+                            \"el-rest-split-up-aggregations\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"Flowfile per hit.\",\n+                                        \"displayName\": \"PER_HIT\",\n+                                        \"value\": \"splitUp-yes\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Flowfile per response.\",\n+                                        \"displayName\": \"PER_RESPONSE\",\n+                                        \"value\": \"splitUp-no\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"splitUp-no\",\n+                                \"description\": \"Output a flowfile containing all aggregations or one flowfile for each individual aggregation.\",\n+                                \"displayName\": \"Aggregation Results Split\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"public-key-service\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-pgp-service-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.pgp.service.api.PGPPublicKeyService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n+                                \"name\": \"el-rest-split-up-aggregations\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n                             },\n-                            \"symmetric-key-algorithm\": {\n+                            \"el-rest-split-up-hits\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"AES_128\",\n-                                        \"value\": \"AES_128\"\n+                                        \"description\": \"Flowfile per hit.\",\n+                                        \"displayName\": \"PER_HIT\",\n+                                        \"value\": \"splitUp-yes\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"AES_192\",\n-                                        \"value\": \"AES_192\"\n+                                        \"description\": \"Flowfile per response.\",\n+                                        \"displayName\": \"PER_RESPONSE\",\n+                                        \"value\": \"splitUp-no\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"AES_256\",\n-                                        \"value\": \"AES_256\"\n-                                    },\n+                                        \"description\": \"Combine results from all query responses (one flowfile per entire paginated result set of hits). Note that aggregations cannot be paged, they are generated across the entire result set and returned as part of the first page. Results are output with one JSON object per line (allowing hits to be combined from multiple pages without loading all results into memory).\",\n+                                        \"displayName\": \"PER_QUERY\",\n+                                        \"value\": \"splitUp-query\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"splitUp-no\",\n+                                \"description\": \"Output a flowfile containing all hits or one flowfile for each individual hit or one flowfile containing all hits from all paged responses.\",\n+                                \"displayName\": \"Search Results Split\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"el-rest-split-up-hits\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"el-rest-type\": {\n+                                \"description\": \"The type of this document (used by Elasticsearch for indexing and searching).\",\n+                                \"displayName\": \"Type\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"el-rest-type\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"es-rest-additional-filters\": {\n+                                \"description\": \"One or more query filters in JSON syntax, not Lucene syntax. Ex: [{\\\"match\\\":{\\\"somefield\\\":\\\"somevalue\\\"}}, {\\\"match\\\":{\\\"anotherfield\\\":\\\"anothervalue\\\"}}]. These filters wil be used as part of a Bool query's filter.\",\n+                                \"displayName\": \"Additional Filters\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"es-rest-additional-filters\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"es-rest-query-aggs\": {\n+                                \"description\": \"One or more query aggregations (or \\\"aggs\\\"), in JSON syntax. Ex: {\\\"items\\\": {\\\"terms\\\": {\\\"field\\\": \\\"product\\\", \\\"size\\\": 10}}}\",\n+                                \"displayName\": \"Aggregations\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"es-rest-query-aggs\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"es-rest-query-fields\": {\n+                                \"description\": \"Fields of indexed documents to be retrieved, in JSON syntax. Ex: [\\\"user.id\\\", \\\"http.response.*\\\", {\\\"field\\\": \\\"@timestamp\\\", \\\"format\\\": \\\"epoch_millis\\\"}]\",\n+                                \"displayName\": \"Fields\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"es-rest-query-fields\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"es-rest-query-script-fields\": {\n+                                \"description\": \"Fields to created using script evaluation at query runtime, in JSON syntax. Ex: {\\\"test1\\\": {\\\"script\\\": {\\\"lang\\\": \\\"painless\\\", \\\"source\\\": \\\"doc['price'].value * 2\\\"}}, \\\"test2\\\": {\\\"script\\\": {\\\"lang\\\": \\\"painless\\\", \\\"source\\\": \\\"doc['price'].value * params.factor\\\", \\\"params\\\": {\\\"factor\\\": 2.0}}}}\",\n+                                \"displayName\": \"Script Fields\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"es-rest-query-script-fields\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"es-rest-query-sort\": {\n+                                \"description\": \"Sort results by one or more fields, in JSON syntax. Ex: [{\\\"price\\\" : {\\\"order\\\" : \\\"asc\\\", \\\"mode\\\" : \\\"avg\\\"}}, {\\\"post_date\\\" : {\\\"format\\\": \\\"strict_date_optional_time_nanos\\\"}}]\",\n+                                \"displayName\": \"Sort\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"es-rest-query-sort\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"es-rest-range-field\": {\n+                                \"description\": \"Field to be tracked as part of an Elasticsearch Range query using a \\\"gt\\\" bound match. This field must exist within the Elasticsearch document for it to be retrieved.\",\n+                                \"displayName\": \"Range Query Field\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"es-rest-range-field\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"es-rest-range-format\": {\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"CAMELLIA_128\",\n-                                        \"value\": \"CAMELLIA_128\"\n-                                    },\n+                                        \"propertyDisplayName\": \"Initial Value\",\n+                                        \"propertyName\": \"es-rest-range-initial-value\"\n+                                    }\n+                                ],\n+                                \"description\": \"If the \\\"Range Query Field\\\" is a Date field, convert the \\\"Initial Value\\\" to a date with this format. If not specified, Elasticsearch will use the date format provided by the \\\"Range Query Field\\\"'s mapping. For valid syntax, see https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-date-format.html\",\n+                                \"displayName\": \"Initial Value Date Format\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"es-rest-range-format\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"es-rest-range-initial-value\": {\n+                                \"description\": \"The initial value to use for the query if the processor has not run previously. If the processor has run previously and stored a value in its state, this property will be ignored. If no value is provided, and the processor has not previously run, no Range query bounds will be used, i.e. all documents will be retrieved in the specified \\\"Sort Order\\\".\",\n+                                \"displayName\": \"Initial Value\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"es-rest-range-initial-value\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"es-rest-range-time-zone\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"propertyDisplayName\": \"Initial Value\",\n+                                        \"propertyName\": \"es-rest-range-initial-value\"\n+                                    }\n+                                ],\n+                                \"description\": \"If the \\\"Range Query Field\\\" is a Date field, convert the \\\"Initial Value\\\" to UTC with this time zone. Valid values are ISO 8601 UTC offsets, such as \\\"+01:00\\\" or \\\"-08:00\\\", and IANA time zone IDs, such as \\\"Europe/London\\\".\",\n+                                \"displayName\": \"Initial Value Date Time Zone\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"es-rest-range-time-zone\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"es-rest-size\": {\n+                                \"description\": \"The maximum number of documents to retrieve in the query. If the query is paginated, this \\\"size\\\" applies to each page of the query, not the \\\"size\\\" of the entire result set.\",\n+                                \"displayName\": \"Size\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"es-rest-size\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"es-rest-sort-order\": {\n+                                \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"CAMELLIA_192\",\n-                                        \"value\": \"CAMELLIA_192\"\n+                                        \"displayName\": \"asc\",\n+                                        \"value\": \"asc\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"CAMELLIA_256\",\n-                                        \"value\": \"CAMELLIA_256\"\n+                                        \"displayName\": \"desc\",\n+                                        \"value\": \"desc\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"AES_256\",\n-                                \"description\": \"Symmetric-Key Algorithm for encryption\",\n-                                \"displayName\": \"Symmetric-Key Algorithm\",\n+                                \"defaultValue\": \"asc\",\n+                                \"description\": \"The order in which to sort the \\\"Range Query Field\\\". A \\\"sort\\\" clause for the \\\"Range Query Field\\\" field will be prepended to any provided \\\"Sort\\\" clauses. If a \\\"sort\\\" clause already exists for the \\\"Range Query Field\\\" field, it will not be updated.\",\n+                                \"displayName\": \"Sort Order\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"symmetric-key-algorithm\",\n+                                \"name\": \"es-rest-sort-order\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             }\n                         },\n                         \"seeAlso\": [\n-                            \"org.apache.nifi.processors.pgp.DecryptContentPGP\",\n-                            \"org.apache.nifi.processors.pgp.SignContentPGP\",\n-                            \"org.apache.nifi.processors.pgp.VerifyContentPGP\"\n+                            \"org.apache.nifi.processors.elasticsearch.PaginatedJsonQueryElasticsearch\",\n+                            \"org.apache.nifi.processors.elasticsearch.SearchElasticsearch\"\n                         ],\n                         \"sideEffectFree\": false,\n+                        \"stateful\": {\n+                            \"description\": \"The pagination state (scrollId, searchAfter, pitId, hitCount, pageCount, pageExpirationTimestamp, trackingRangeValue) is retained in between invocations of this processor until the Scroll/PiT has expired (when the current time is later than the last query execution plus the Pagination Keep Alive interval).\",\n+                            \"scopes\": [\n+                                \"CLUSTER\"\n+                            ]\n+                        },\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"Encryption Succeeded\",\n-                                \"name\": \"success\"\n+                                \"description\": \"Aggregations are routed to this relationship.\",\n+                                \"name\": \"aggregations\"\n                             },\n                             {\n-                                \"description\": \"Encryption Failed\",\n-                                \"name\": \"failure\"\n+                                \"description\": \"Search hits are routed to this relationship.\",\n+                                \"name\": \"hits\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n                         \"supportsBatching\": false,\n-                        \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicProperties\": true,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n+                        \"systemResourceConsiderations\": [\n+                            {\n+                                \"description\": \"Care should be taken on the size of each page because each response from Elasticsearch will be loaded into memory all at once and converted into the resulting flowfiles.\",\n+                                \"resource\": \"MEMORY\"\n+                            }\n+                        ],\n                         \"tags\": [\n-                            \"Encryption\",\n-                            \"GPG\",\n-                            \"OpenPGP\",\n-                            \"PGP\",\n-                            \"RFC 4880\"\n+                            \"elasticsearch\",\n+                            \"elasticsearch5\",\n+                            \"elasticsearch6\",\n+                            \"elasticsearch7\",\n+                            \"elasticsearch8\",\n+                            \"json\",\n+                            \"page\",\n+                            \"query\",\n+                            \"scroll\",\n+                            \"search\"\n                         ],\n-                        \"triggerSerially\": false,\n+                        \"triggerSerially\": true,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.pgp.EncryptContentPGP\",\n-                        \"typeDescription\": \"Encrypt contents using OpenPGP. The processor reads input and detects OpenPGP messages to avoid unnecessary additional wrapping in Literal Data packets.\",\n+                        \"type\": \"org.apache.nifi.processors.elasticsearch.ConsumeElasticsearch\",\n+                        \"typeDescription\": \"A processor that repeatedly runs a paginated query against a field using a Range query to consume new Documents from an Elasticsearch index/query. The processor will retrieve multiple pages of results until either no more results are available or the Pagination Keep Alive expiration is reached, after which the Range query will automatically update the field constraint based on the last retrieved Document value.\",\n                         \"version\": \"1.27.0\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"Symmetric-Key Algorithm\",\n-                                \"name\": \"pgp.symmetric.key.algorithm\"\n-                            },\n-                            {\n-                                \"description\": \"Symmetric-Key Algorithm Block Cipher\",\n-                                \"name\": \"pgp.symmetric.key.algorithm.block.cipher\"\n-                            },\n-                            {\n-                                \"description\": \"Symmetric-Key Algorithm Key Size\",\n-                                \"name\": \"pgp.symmetric.key.algorithm.key.size\"\n-                            },\n-                            {\n-                                \"description\": \"Symmetric-Key Algorithm Identifier\",\n-                                \"name\": \"pgp.symmetric.key.algorithm.id\"\n+                                \"description\": \"application/json\",\n+                                \"name\": \"mime.type\"\n                             },\n                             {\n-                                \"description\": \"File Encoding\",\n-                                \"name\": \"pgp.file.encoding\"\n+                                \"description\": \"The number of the page (request), starting from 1, in which the results were returned that are in the output flowfile\",\n+                                \"name\": \"page.number\"\n                             },\n                             {\n-                                \"description\": \"Compression Algorithm\",\n-                                \"name\": \"pgp.compression.algorithm\"\n+                                \"description\": \"The number of hits that are in the output flowfile\",\n+                                \"name\": \"hit.count\"\n                             },\n                             {\n-                                \"description\": \"Compression Algorithm Identifier\",\n-                                \"name\": \"pgp.compression.algorithm.id\"\n+                                \"description\": \"The error message provided by Elasticsearch if there is an error querying the index.\",\n+                                \"name\": \"elasticsearch.query.error\"\n                             }\n                         ]\n                     },\n                     {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-pgp-nar\",\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-elasticsearch-restapi-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -65271,233 +63810,188 @@\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n+                        \"dynamicProperties\": [\n+                            {\n+                                \"description\": \"Adds the specified property name/value as a query parameter in the Elasticsearch URL used for processing. These parameters will override any matching parameters in the query request body\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"name\": \"The name of a URL query parameter to add\",\n+                                \"value\": \"The value of the URL query parameter\"\n+                            }\n+                        ],\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_REQUIRED\",\n+                        \"inputRequirement\": \"INPUT_ALLOWED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"compression-algorithm\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"UNCOMPRESSED\",\n-                                        \"value\": \"UNCOMPRESSED\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"ZIP\",\n-                                        \"value\": \"ZIP\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"ZLIB\",\n-                                        \"value\": \"ZLIB\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"BZIP2\",\n-                                        \"value\": \"BZIP2\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"ZIP\",\n-                                \"description\": \"Compression Algorithm for signing\",\n-                                \"displayName\": \"Compression Algorithm\",\n+                            \"el-query-attribute\": {\n+                                \"description\": \"If set, the executed query will be set on each result flowfile in the specified attribute.\",\n+                                \"displayName\": \"Query Attribute\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"compression-algorithm\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"el-query-attribute\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"file-encoding\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"ASCII\",\n-                                        \"value\": \"ASCII\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"BINARY\",\n-                                        \"value\": \"BINARY\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"BINARY\",\n-                                \"description\": \"File Encoding for signing\",\n-                                \"displayName\": \"File Encoding\",\n+                            \"el-rest-client-service\": {\n+                                \"description\": \"An Elasticsearch client service to use for running queries.\",\n+                                \"displayName\": \"Client Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"file-encoding\",\n+                                \"name\": \"el-rest-client-service\",\n+                                \"required\": true,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-elasticsearch-client-service-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.elasticsearch.ElasticSearchClientService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"el-rest-fetch-index\": {\n+                                \"description\": \"The name of the index to use.\",\n+                                \"displayName\": \"Index\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"el-rest-fetch-index\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"hash-algorithm\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"SHA256\",\n-                                        \"value\": \"SHA256\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"SHA384\",\n-                                        \"value\": \"SHA384\"\n-                                    },\n+                            \"el-rest-query\": {\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"SHA512\",\n-                                        \"value\": \"SHA512\"\n+                                        \"dependentValues\": [\n+                                            \"full\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Query Definition Style\",\n+                                        \"propertyName\": \"el-rest-query-definition-style\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"SHA512\",\n-                                \"description\": \"Hash Algorithm for signing\",\n-                                \"displayName\": \"Hash Algorithm\",\n+                                \"description\": \"A query in JSON syntax, not Lucene syntax. Ex: {\\\"query\\\":{\\\"match\\\":{\\\"somefield\\\":\\\"somevalue\\\"}}}. If this parameter is not set, the query will be read from the flowfile content. If the query (property and flowfile content) is empty, a default empty JSON Object will be used, which will result in a \\\"match_all\\\" query in Elasticsearch.\",\n+                                \"displayName\": \"Query\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"hash-algorithm\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"el-rest-query\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"private-key-id\": {\n-                                \"description\": \"PGP Private Key Identifier formatted as uppercase hexadecimal string of 16 characters used for signing\",\n-                                \"displayName\": \"Private Key ID\",\n+                            \"el-rest-query-clause\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"build\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Query Definition Style\",\n+                                        \"propertyName\": \"el-rest-query-definition-style\"\n+                                    }\n+                                ],\n+                                \"description\": \"A \\\"query\\\" clause in JSON syntax, not Lucene syntax. Ex: {\\\"match\\\":{\\\"somefield\\\":\\\"somevalue\\\"}}. If the query is empty, a default JSON Object will be used, which will result in a \\\"match_all\\\" query in Elasticsearch.\",\n+                                \"displayName\": \"Query Clause\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"private-key-id\",\n-                                \"required\": true,\n+                                \"name\": \"el-rest-query-clause\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"private-key-service\": {\n-                                \"description\": \"PGP Private Key Service for generating content signatures\",\n-                                \"displayName\": \"Private Key Service\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"private-key-service\",\n-                                \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-pgp-service-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.pgp.service.api.PGPPrivateKeyService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            },\n-                            \"signing-strategy\": {\n+                            \"el-rest-query-definition-style\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Produce signed content packaged as an OpenPGP message\",\n-                                        \"displayName\": \"SIGNED\",\n-                                        \"value\": \"SIGNED\"\n+                                        \"description\": \"Provide the full Query.\",\n+                                        \"displayName\": \"FULL_QUERY\",\n+                                        \"value\": \"full\"\n                                     },\n                                     {\n-                                        \"description\": \"Produce detached signature based on associated content packaged according to OpenPGP encoding\",\n-                                        \"displayName\": \"DETACHED\",\n-                                        \"value\": \"DETACHED\"\n+                                        \"description\": \"Build the Query from separate JSON objects.\",\n+                                        \"displayName\": \"BUILD_QUERY\",\n+                                        \"value\": \"build\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"SIGNED\",\n-                                \"description\": \"Strategy for writing files to success after signing\",\n-                                \"displayName\": \"Signing Strategy\",\n+                                \"defaultValue\": \"full\",\n+                                \"description\": \"How the JSON Query will be defined for use by the processor.\",\n+                                \"displayName\": \"Query Definition Style\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"signing-strategy\",\n+                                \"name\": \"el-rest-query-definition-style\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n+                            },\n+                            \"el-rest-type\": {\n+                                \"description\": \"The type of this document (used by Elasticsearch for indexing and searching).\",\n+                                \"displayName\": \"Type\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"el-rest-type\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n                             }\n                         },\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.processors.pgp.DecryptContentPGP\",\n-                            \"org.apache.nifi.processors.pgp.EncryptContentPGP\",\n-                            \"org.apache.nifi.processors.pgp.VerifyContentPGP\"\n-                        ],\n                         \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"Content signing succeeded\",\n+                                \"description\": \"All flowfiles that fail due to server/cluster availability go to this relationship.\",\n+                                \"name\": \"retry\"\n+                            },\n+                            {\n+                                \"description\": \"If the \\\"by query\\\" operation succeeds, and a flowfile was read, it will be sent to this relationship.\",\n                                 \"name\": \"success\"\n                             },\n                             {\n-                                \"description\": \"Content signing failed\",\n+                                \"description\": \"If the \\\"by query\\\" operation fails, and a flowfile was read, it will be sent to this relationship.\",\n                                 \"name\": \"failure\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n                         \"supportsBatching\": false,\n-                        \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicProperties\": true,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"Encryption\",\n-                            \"GPG\",\n-                            \"OpenPGP\",\n-                            \"PGP\",\n-                            \"RFC 4880\",\n-                            \"Signing\"\n+                            \"delete\",\n+                            \"elastic\",\n+                            \"elasticsearch\",\n+                            \"elasticsearch5\",\n+                            \"elasticsearch6\",\n+                            \"elasticsearch7\",\n+                            \"elasticsearch8\",\n+                            \"query\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.pgp.SignContentPGP\",\n-                        \"typeDescription\": \"Sign content using OpenPGP Private Keys\",\n+                        \"type\": \"org.apache.nifi.processors.elasticsearch.DeleteByQueryElasticsearch\",\n+                        \"typeDescription\": \"Delete from an Elasticsearch index using a query. The query can be loaded from a flowfile body or from the Query parameter.\",\n                         \"version\": \"1.27.0\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"Compression Algorithm\",\n-                                \"name\": \"pgp.compression.algorithm\"\n-                            },\n-                            {\n-                                \"description\": \"Compression Algorithm Identifier\",\n-                                \"name\": \"pgp.compression.algorithm.id\"\n-                            },\n-                            {\n-                                \"description\": \"File Encoding\",\n-                                \"name\": \"pgp.file.encoding\"\n-                            },\n-                            {\n-                                \"description\": \"Signature Algorithm including key and hash algorithm names\",\n-                                \"name\": \"pgp.signature.algorithm\"\n-                            },\n-                            {\n-                                \"description\": \"Signature Hash Algorithm Identifier\",\n-                                \"name\": \"pgp.signature.hash.algorithm.id\"\n-                            },\n-                            {\n-                                \"description\": \"Signature Key Algorithm Identifier\",\n-                                \"name\": \"pgp.signature.key.algorithm.id\"\n-                            },\n-                            {\n-                                \"description\": \"Signature Public Key Identifier\",\n-                                \"name\": \"pgp.signature.key.id\"\n-                            },\n-                            {\n-                                \"description\": \"Signature Type Identifier\",\n-                                \"name\": \"pgp.signature.type.id\"\n+                                \"description\": \"The amount of time that it took to complete the delete operation in ms.\",\n+                                \"name\": \"elasticsearch.delete.took\"\n                             },\n                             {\n-                                \"description\": \"Signature Version Number\",\n-                                \"name\": \"pgp.signature.version\"\n+                                \"description\": \"The error message provided by Elasticsearch if there is an error running the delete.\",\n+                                \"name\": \"elasticsearch.delete.error\"\n                             }\n                         ]\n                     },\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-pgp-nar\",\n+                        \"artifact\": \"nifi-elasticsearch-restapi-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -65505,3768 +63999,3471 @@\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n+                        \"dynamicProperties\": [\n+                            {\n+                                \"description\": \"Adds the specified property name/value as a query parameter in the Elasticsearch URL used for processing.\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"name\": \"The name of a URL query parameter to add\",\n+                                \"value\": \"The value of the URL query parameter\"\n+                            }\n+                        ],\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_REQUIRED\",\n+                        \"inputRequirement\": \"INPUT_ALLOWED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"public-key-service\": {\n-                                \"description\": \"PGP Public Key Service for verifying signatures with Public Key Encryption\",\n-                                \"displayName\": \"Public Key Service\",\n+                            \"el-rest-client-service\": {\n+                                \"description\": \"An Elasticsearch client service to use for running queries.\",\n+                                \"displayName\": \"Client Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"public-key-service\",\n+                                \"name\": \"el-rest-client-service\",\n                                 \"required\": true,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-pgp-service-api-nar\",\n+                                    \"artifact\": \"nifi-elasticsearch-client-service-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.pgp.service.api.PGPPublicKeyService\",\n+                                    \"type\": \"org.apache.nifi.elasticsearch.ElasticSearchClientService\",\n                                     \"version\": \"1.27.0\"\n                                 }\n+                            },\n+                            \"el-rest-fetch-index\": {\n+                                \"description\": \"The name of the index to use.\",\n+                                \"displayName\": \"Index\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"el-rest-fetch-index\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"el-rest-type\": {\n+                                \"description\": \"The type of this document (used by Elasticsearch for indexing and searching).\",\n+                                \"displayName\": \"Type\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"el-rest-type\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"get-es-attribute-name\": {\n+                                \"defaultValue\": \"elasticsearch.doc\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"flowfile-attribute\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Destination\",\n+                                        \"propertyName\": \"get-es-destination\"\n+                                    }\n+                                ],\n+                                \"description\": \"The name of the FlowFile attribute to use for the retrieved document output.\",\n+                                \"displayName\": \"Attribute Name\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"get-es-attribute-name\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"get-es-destination\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"Output the retrieved document as the FlowFile content.\",\n+                                        \"displayName\": \"FlowFile Content\",\n+                                        \"value\": \"flowfile-content\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Output the retrieved document as a FlowFile attribute specified by the Attribute Name.\",\n+                                        \"displayName\": \"FlowFile Attribute\",\n+                                        \"value\": \"flowfile-attribute\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"flowfile-content\",\n+                                \"description\": \"Indicates whether the retrieved document is written to the FlowFile content or a FlowFile attribute.\",\n+                                \"displayName\": \"Destination\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"get-es-destination\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"get-es-id\": {\n+                                \"description\": \"The _id of the document to retrieve.\",\n+                                \"displayName\": \"Document Id\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"get-es-id\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n                             }\n                         },\n                         \"seeAlso\": [\n-                            \"org.apache.nifi.processors.pgp.DecryptContentPGP\",\n-                            \"org.apache.nifi.processors.pgp.EncryptContentPGP\",\n-                            \"org.apache.nifi.processors.pgp.SignContentPGP\"\n+                            \"org.apache.nifi.processors.elasticsearch.JsonQueryElasticsearch\"\n                         ],\n                         \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"Signature Verification Succeeded\",\n-                                \"name\": \"success\"\n+                                \"description\": \"All flowfiles that fail due to server/cluster availability go to this relationship.\",\n+                                \"name\": \"retry\"\n                             },\n                             {\n-                                \"description\": \"Signature Verification Failed\",\n+                                \"description\": \"Fetched documents are routed to this relationship.\",\n+                                \"name\": \"document\"\n+                            },\n+                            {\n+                                \"description\": \"A FlowFile is routed to this relationship if the specified document does not exist in the Elasticsearch cluster.\",\n+                                \"name\": \"not_found\"\n+                            },\n+                            {\n+                                \"description\": \"All flowfiles that fail for reasons unrelated to server availability go to this relationship.\",\n                                 \"name\": \"failure\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n                         \"supportsBatching\": false,\n-                        \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicProperties\": true,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"Encryption\",\n-                            \"GPG\",\n-                            \"OpenPGP\",\n-                            \"PGP\",\n-                            \"RFC 4880\",\n-                            \"Signing\"\n+                            \"elasticsearch\",\n+                            \"elasticsearch5\",\n+                            \"elasticsearch6\",\n+                            \"elasticsearch7\",\n+                            \"elasticsearch8\",\n+                            \"index\",\n+                            \"json\",\n+                            \"put\",\n+                            \"record\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.pgp.VerifyContentPGP\",\n-                        \"typeDescription\": \"Verify signatures using OpenPGP Public Keys\",\n+                        \"type\": \"org.apache.nifi.processors.elasticsearch.GetElasticsearch\",\n+                        \"typeDescription\": \"Elasticsearch get processor that uses the official Elastic REST client libraries to fetch a single document from Elasticsearch by _id. Note that the full body of the document will be read into memory before being written to a FlowFile for transfer.\",\n                         \"version\": \"1.27.0\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"Filename from Literal Data\",\n-                                \"name\": \"pgp.literal.data.filename\"\n-                            },\n-                            {\n-                                \"description\": \"Modified Date Time from Literal Data in milliseconds\",\n-                                \"name\": \"pgp.literal.data.modified\"\n-                            },\n-                            {\n-                                \"description\": \"Signature Creation Time in milliseconds\",\n-                                \"name\": \"pgp.signature.created\"\n-                            },\n-                            {\n-                                \"description\": \"Signature Algorithm including key and hash algorithm names\",\n-                                \"name\": \"pgp.signature.algorithm\"\n-                            },\n-                            {\n-                                \"description\": \"Signature Hash Algorithm Identifier\",\n-                                \"name\": \"pgp.signature.hash.algorithm.id\"\n-                            },\n-                            {\n-                                \"description\": \"Signature Key Algorithm Identifier\",\n-                                \"name\": \"pgp.signature.key.algorithm.id\"\n+                                \"description\": \"The filename attribute is set to the document identifier\",\n+                                \"name\": \"filename\"\n                             },\n                             {\n-                                \"description\": \"Signature Public Key Identifier\",\n-                                \"name\": \"pgp.signature.key.id\"\n+                                \"description\": \"The Elasticsearch index containing the document\",\n+                                \"name\": \"elasticsearch.index\"\n                             },\n                             {\n-                                \"description\": \"Signature Type Identifier\",\n-                                \"name\": \"pgp.signature.type.id\"\n+                                \"description\": \"The Elasticsearch document type\",\n+                                \"name\": \"elasticsearch.type\"\n                             },\n                             {\n-                                \"description\": \"Signature Version Number\",\n-                                \"name\": \"pgp.signature.version\"\n+                                \"description\": \"The error message provided by Elasticsearch if there is an error fetching the document.\",\n+                                \"name\": \"elasticsearch.get.error\"\n                             }\n                         ]\n-                    }\n-                ],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"1.27.0\"\n-        },\n-        {\n-            \"artifact\": \"nifi-pgp-service-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-pgp-service-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"e0c4461\"\n-                        },\n-                        \"group\": \"org.apache.nifi\",\n-                        \"propertyDescriptors\": {\n-                            \"key-password\": {\n-                                \"description\": \"Password used for decrypting Private Keys\",\n-                                \"displayName\": \"Key Password\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"key-password\",\n-                                \"required\": true,\n-                                \"sensitive\": true\n-                            },\n-                            \"keyring\": {\n-                                \"description\": \"PGP Keyring or Secret Key encoded in ASCII Armor\",\n-                                \"displayName\": \"Keyring\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"keyring\",\n-                                \"required\": false,\n-                                \"sensitive\": true\n-                            },\n-                            \"keyring-file\": {\n-                                \"description\": \"File path to PGP Keyring or Secret Key encoded in binary or ASCII Armor\",\n-                                \"displayName\": \"Keyring File\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"keyring-file\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            }\n-                        },\n-                        \"providedApiImplementations\": [\n-                            {\n-                                \"artifact\": \"nifi-pgp-service-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.pgp.service.api.PGPPrivateKeyService\",\n-                                \"version\": \"1.27.0\"\n-                            }\n-                        ],\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"Encryption\",\n-                            \"GPG\",\n-                            \"Key\",\n-                            \"OpenPGP\",\n-                            \"PGP\",\n-                            \"Private\",\n-                            \"RFC 4880\"\n-                        ],\n-                        \"type\": \"org.apache.nifi.pgp.service.standard.StandardPGPPrivateKeyService\",\n-                        \"typeDescription\": \"PGP Private Key Service provides Private Keys loaded from files or properties\",\n-                        \"version\": \"1.27.0\"\n                     },\n                     {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-pgp-service-nar\",\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-elasticsearch-restapi-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n-                        \"group\": \"org.apache.nifi\",\n-                        \"propertyDescriptors\": {\n-                            \"keyring\": {\n-                                \"description\": \"PGP Keyring or Public Key encoded in ASCII Armor\",\n-                                \"displayName\": \"Keyring\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"keyring\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"keyring-file\": {\n-                                \"description\": \"File path to PGP Keyring or Public Key encoded in binary or ASCII Armor\",\n-                                \"displayName\": \"Keyring File\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"keyring-file\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            }\n+                        \"defaultBulletinLevel\": \"WARN\",\n+                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": 1,\n+                            \"EVENT_DRIVEN\": 0,\n+                            \"TIMER_DRIVEN\": 1\n                         },\n-                        \"providedApiImplementations\": [\n+                        \"defaultPenaltyDuration\": \"30 sec\",\n+                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": \"* * * * * ?\",\n+                            \"TIMER_DRIVEN\": \"0 sec\"\n+                        },\n+                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n+                        \"defaultYieldDuration\": \"1 sec\",\n+                        \"dynamicProperties\": [\n                             {\n-                                \"artifact\": \"nifi-pgp-service-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.pgp.service.api.PGPPublicKeyService\",\n-                                \"version\": \"1.27.0\"\n+                                \"description\": \"Adds the specified property name/value as a query parameter in the Elasticsearch URL used for processing. These parameters will override any matching parameters in the query request body\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"name\": \"The name of a URL query parameter to add\",\n+                                \"value\": \"The value of the URL query parameter\"\n                             }\n                         ],\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"Encryption\",\n-                            \"GPG\",\n-                            \"Key\",\n-                            \"OpenPGP\",\n-                            \"PGP\",\n-                            \"Private\",\n-                            \"RFC 4880\"\n-                        ],\n-                        \"type\": \"org.apache.nifi.pgp.service.standard.StandardPGPPublicKeyService\",\n-                        \"typeDescription\": \"PGP Public Key Service providing Public Keys loaded from files\",\n-                        \"version\": \"1.27.0\"\n-                    }\n-                ],\n-                \"processors\": [],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"1.27.0\"\n-        },\n-        {\n-            \"artifact\": \"nifi-hbase_2-client-service-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-hbase_2-client-service-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"e0c4461\"\n-                        },\n                         \"group\": \"org.apache.nifi\",\n+                        \"inputRequirement\": \"INPUT_ALLOWED\",\n+                        \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"HBase Cache Table Name\": {\n-                                \"description\": \"Name of the table on HBase to use for the cache.\",\n-                                \"displayName\": \"HBase Cache Table Name\",\n+                            \"el-query-attribute\": {\n+                                \"description\": \"If set, the executed query will be set on each result flowfile in the specified attribute.\",\n+                                \"displayName\": \"Query Attribute\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"HBase Cache Table Name\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"el-query-attribute\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"HBase Client Service\": {\n-                                \"description\": \"Specifies the HBase Client Controller Service to use for accessing HBase.\",\n-                                \"displayName\": \"HBase Client Service\",\n+                            \"el-rest-client-service\": {\n+                                \"description\": \"An Elasticsearch client service to use for running queries.\",\n+                                \"displayName\": \"Client Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"HBase Client Service\",\n+                                \"name\": \"el-rest-client-service\",\n                                 \"required\": true,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"artifact\": \"nifi-elasticsearch-client-service-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.hbase.HBaseClientService\",\n+                                    \"type\": \"org.apache.nifi.elasticsearch.ElasticSearchClientService\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             },\n-                            \"HBase Column Family\": {\n-                                \"defaultValue\": \"f\",\n-                                \"description\": \"Name of the column family on HBase to use for the cache.\",\n-                                \"displayName\": \"HBase Column Family\",\n+                            \"el-rest-fetch-index\": {\n+                                \"description\": \"The name of the index to use.\",\n+                                \"displayName\": \"Index\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"HBase Column Family\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"el-rest-fetch-index\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"HBase Column Qualifier\": {\n-                                \"defaultValue\": \"q\",\n-                                \"description\": \"Name of the column qualifier on HBase to use for the cache\",\n-                                \"displayName\": \"HBase Column Qualifier\",\n+                            \"el-rest-format-aggregations\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"Contains full Elasticsearch Aggregation, including Buckets and Metadata.\",\n+                                        \"displayName\": \"FULL\",\n+                                        \"value\": \"FULL\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Bucket Content only.\",\n+                                        \"displayName\": \"BUCKETS_ONLY\",\n+                                        \"value\": \"BUCKETS_ONLY\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Aggregation Metadata only.\",\n+                                        \"displayName\": \"METADATA_ONLY\",\n+                                        \"value\": \"METADATA_ONLY\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"FULL\",\n+                                \"description\": \"Format of Aggregation output.\",\n+                                \"displayName\": \"Aggregation Results Format\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"HBase Column Qualifier\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"el-rest-format-aggregations\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"hb-lu-authorizations\": {\n-                                \"description\": \"The list of authorization tokens to be used with cell visibility if it is enabled. These will be used to override the default authorization list for the user accessing HBase.\",\n-                                \"displayName\": \"Authorizations\",\n+                            \"el-rest-format-hits\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"Contains full Elasticsearch Hit, including Document Source and Metadata.\",\n+                                        \"displayName\": \"FULL\",\n+                                        \"value\": \"FULL\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Document Source only (where present).\",\n+                                        \"displayName\": \"SOURCE_ONLY\",\n+                                        \"value\": \"SOURCE_ONLY\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Hit Metadata only.\",\n+                                        \"displayName\": \"METADATA_ONLY\",\n+                                        \"value\": \"METADATA_ONLY\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"FULL\",\n+                                \"description\": \"Format of Hits output.\",\n+                                \"displayName\": \"Search Results Format\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"hb-lu-authorizations\",\n-                                \"required\": false,\n+                                \"name\": \"el-rest-format-hits\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"hbase-cache-visibility-expression\": {\n-                                \"defaultValue\": \"\",\n-                                \"description\": \"The default visibility expression to apply to cells when visibility expression support is enabled.\",\n-                                \"displayName\": \"Visibility Expression\",\n+                            \"el-rest-output-no-hits\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"Output a \\\"hits\\\" flowfile even if no hits found for query. If true, an empty \\\"hits\\\" flowfile will be output even if \\\"aggregations\\\" are output.\",\n+                                \"displayName\": \"Output No Hits\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"hbase-cache-visibility-expression\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"el-rest-output-no-hits\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n-                            }\n-                        },\n-                        \"providedApiImplementations\": [\n-                            {\n-                                \"artifact\": \"nifi-standard-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.distributed.cache.client.DistributedMapCacheClient\",\n-                                \"version\": \"1.27.0\"\n                             },\n-                            {\n-                                \"artifact\": \"nifi-standard-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.distributed.cache.client.AtomicDistributedMapCacheClient\",\n-                                \"version\": \"1.27.0\"\n-                            }\n-                        ],\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.hbase.HBase_2_ClientService\"\n-                        ],\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"cache\",\n-                            \"cluster\",\n-                            \"distributed\",\n-                            \"hbase\",\n-                            \"map\",\n-                            \"state\"\n-                        ],\n-                        \"type\": \"org.apache.nifi.hbase.HBase_2_ClientMapCacheService\",\n-                        \"typeDescription\": \"Provides the ability to use an HBase table as a cache, in place of a DistributedMapCache. Uses a HBase_2_ClientService controller to communicate with HBase.\",\n-                        \"version\": \"1.27.0\"\n-                    },\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-hbase_2-client-service-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"e0c4461\"\n-                        },\n-                        \"dynamicProperties\": [\n-                            {\n-                                \"description\": \"These properties will be set on the HBase configuration after loading any provided configuration files.\",\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"name\": \"The name of an HBase configuration property.\",\n-                                \"value\": \"The value of the given HBase configuration property.\"\n-                            }\n-                        ],\n-                        \"explicitRestrictions\": [\n-                            {\n-                                \"explanation\": \"Client JAR Location can reference resources over HTTP\",\n-                                \"requiredPermission\": \"reference remote resources\"\n-                            }\n-                        ],\n-                        \"group\": \"org.apache.nifi\",\n-                        \"propertyDescriptors\": {\n-                            \"HBase Client Retries\": {\n-                                \"defaultValue\": \"1\",\n-                                \"description\": \"The number of times the HBase client will retry connecting. Required if Hadoop Configuration Files are not provided.\",\n-                                \"displayName\": \"HBase Client Retries\",\n+                            \"el-rest-query\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"full\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Query Definition Style\",\n+                                        \"propertyName\": \"el-rest-query-definition-style\"\n+                                    }\n+                                ],\n+                                \"description\": \"A query in JSON syntax, not Lucene syntax. Ex: {\\\"query\\\":{\\\"match\\\":{\\\"somefield\\\":\\\"somevalue\\\"}}}. If this parameter is not set, the query will be read from the flowfile content. If the query (property and flowfile content) is empty, a default empty JSON Object will be used, which will result in a \\\"match_all\\\" query in Elasticsearch.\",\n+                                \"displayName\": \"Query\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"HBase Client Retries\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"el-rest-query\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Hadoop Configuration Files\": {\n-                                \"description\": \"Comma-separated list of Hadoop Configuration files, such as hbase-site.xml and core-site.xml for kerberos, including full paths to the files.\",\n-                                \"displayName\": \"Hadoop Configuration Files\",\n+                            \"el-rest-query-clause\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"build\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Query Definition Style\",\n+                                        \"propertyName\": \"el-rest-query-definition-style\"\n+                                    }\n+                                ],\n+                                \"description\": \"A \\\"query\\\" clause in JSON syntax, not Lucene syntax. Ex: {\\\"match\\\":{\\\"somefield\\\":\\\"somevalue\\\"}}. If the query is empty, a default JSON Object will be used, which will result in a \\\"match_all\\\" query in Elasticsearch.\",\n+                                \"displayName\": \"Query Clause\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Hadoop Configuration Files\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"el-rest-query-clause\",\n                                 \"required\": false,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"MULTIPLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\",\n-                                        \"DIRECTORY\"\n-                                    ]\n-                                },\n                                 \"sensitive\": false\n                             },\n-                            \"Kerberos Keytab\": {\n-                                \"description\": \"Kerberos keytab associated with the principal. Requires nifi.kerberos.krb5.file to be set in your nifi.properties\",\n-                                \"displayName\": \"Kerberos Keytab\",\n+                            \"el-rest-query-definition-style\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"Provide the full Query.\",\n+                                        \"displayName\": \"FULL_QUERY\",\n+                                        \"value\": \"full\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Build the Query from separate JSON objects.\",\n+                                        \"displayName\": \"BUILD_QUERY\",\n+                                        \"value\": \"build\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"full\",\n+                                \"description\": \"How the JSON Query will be defined for use by the processor.\",\n+                                \"displayName\": \"Query Definition Style\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Kerberos Keytab\",\n-                                \"required\": false,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"SINGLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\"\n-                                    ]\n-                                },\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"el-rest-query-definition-style\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Kerberos Password\": {\n-                                \"description\": \"Kerberos password associated with the principal.\",\n-                                \"displayName\": \"Kerberos Password\",\n+                            \"el-rest-split-up-aggregations\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"Flowfile per hit.\",\n+                                        \"displayName\": \"PER_HIT\",\n+                                        \"value\": \"splitUp-yes\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Flowfile per response.\",\n+                                        \"displayName\": \"PER_RESPONSE\",\n+                                        \"value\": \"splitUp-no\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"splitUp-no\",\n+                                \"description\": \"Output a flowfile containing all aggregations or one flowfile for each individual aggregation.\",\n+                                \"displayName\": \"Aggregation Results Split\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Kerberos Password\",\n-                                \"required\": false,\n-                                \"sensitive\": true\n+                                \"name\": \"el-rest-split-up-aggregations\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n                             },\n-                            \"Kerberos Principal\": {\n-                                \"description\": \"Kerberos principal to authenticate as. Requires nifi.kerberos.krb5.file to be set in your nifi.properties\",\n-                                \"displayName\": \"Kerberos Principal\",\n+                            \"el-rest-split-up-hits\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"Flowfile per hit.\",\n+                                        \"displayName\": \"PER_HIT\",\n+                                        \"value\": \"splitUp-yes\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Flowfile per response.\",\n+                                        \"displayName\": \"PER_RESPONSE\",\n+                                        \"value\": \"splitUp-no\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"splitUp-no\",\n+                                \"description\": \"Output a flowfile containing all hits or one flowfile for each individual hit.\",\n+                                \"displayName\": \"Search Results Split\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Kerberos Principal\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"el-rest-split-up-hits\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Phoenix Client JAR Location\": {\n-                                \"description\": \"The full path to the Phoenix client JAR. Required if Phoenix is installed on top of HBase.\",\n-                                \"displayName\": \"Phoenix Client JAR Location\",\n+                            \"el-rest-type\": {\n+                                \"description\": \"The type of this document (used by Elasticsearch for indexing and searching).\",\n+                                \"displayName\": \"Type\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Phoenix Client JAR Location\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"el-rest-type\",\n                                 \"required\": false,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"SINGLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\",\n-                                        \"DIRECTORY\",\n-                                        \"URL\"\n-                                    ]\n-                                },\n                                 \"sensitive\": false\n                             },\n-                            \"ZooKeeper Client Port\": {\n-                                \"description\": \"The port on which ZooKeeper is accepting client connections. Required if Hadoop Configuration Files are not provided.\",\n-                                \"displayName\": \"ZooKeeper Client Port\",\n+                            \"es-rest-query-aggs\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"build\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Query Definition Style\",\n+                                        \"propertyName\": \"el-rest-query-definition-style\"\n+                                    }\n+                                ],\n+                                \"description\": \"One or more query aggregations (or \\\"aggs\\\"), in JSON syntax. Ex: {\\\"items\\\": {\\\"terms\\\": {\\\"field\\\": \\\"product\\\", \\\"size\\\": 10}}}\",\n+                                \"displayName\": \"Aggregations\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"ZooKeeper Client Port\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"es-rest-query-aggs\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"ZooKeeper Quorum\": {\n-                                \"description\": \"Comma-separated list of ZooKeeper hosts for HBase. Required if Hadoop Configuration Files are not provided.\",\n-                                \"displayName\": \"ZooKeeper Quorum\",\n+                            \"es-rest-query-fields\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"build\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Query Definition Style\",\n+                                        \"propertyName\": \"el-rest-query-definition-style\"\n+                                    }\n+                                ],\n+                                \"description\": \"Fields of indexed documents to be retrieved, in JSON syntax. Ex: [\\\"user.id\\\", \\\"http.response.*\\\", {\\\"field\\\": \\\"@timestamp\\\", \\\"format\\\": \\\"epoch_millis\\\"}]\",\n+                                \"displayName\": \"Fields\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"ZooKeeper Quorum\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"es-rest-query-fields\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"ZooKeeper ZNode Parent\": {\n-                                \"description\": \"The ZooKeeper ZNode Parent value for HBase (example: /hbase). Required if Hadoop Configuration Files are not provided.\",\n-                                \"displayName\": \"ZooKeeper ZNode Parent\",\n+                            \"es-rest-query-script-fields\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"build\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Query Definition Style\",\n+                                        \"propertyName\": \"el-rest-query-definition-style\"\n+                                    }\n+                                ],\n+                                \"description\": \"Fields to created using script evaluation at query runtime, in JSON syntax. Ex: {\\\"test1\\\": {\\\"script\\\": {\\\"lang\\\": \\\"painless\\\", \\\"source\\\": \\\"doc['price'].value * 2\\\"}}, \\\"test2\\\": {\\\"script\\\": {\\\"lang\\\": \\\"painless\\\", \\\"source\\\": \\\"doc['price'].value * params.factor\\\", \\\"params\\\": {\\\"factor\\\": 2.0}}}}\",\n+                                \"displayName\": \"Script Fields\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"ZooKeeper ZNode Parent\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"es-rest-query-script-fields\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"kerberos-credentials-service\": {\n-                                \"description\": \"Specifies the Kerberos Credentials Controller Service that should be used for authenticating with Kerberos\",\n-                                \"displayName\": \"Kerberos Credentials Service\",\n+                            \"es-rest-query-sort\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"build\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Query Definition Style\",\n+                                        \"propertyName\": \"el-rest-query-definition-style\"\n+                                    }\n+                                ],\n+                                \"description\": \"Sort results by one or more fields, in JSON syntax. Ex: [{\\\"price\\\" : {\\\"order\\\" : \\\"asc\\\", \\\"mode\\\" : \\\"avg\\\"}}, {\\\"post_date\\\" : {\\\"format\\\": \\\"strict_date_optional_time_nanos\\\"}}]\",\n+                                \"displayName\": \"Sort\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"kerberos-credentials-service\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"es-rest-query-sort\",\n                                 \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.kerberos.KerberosCredentialsService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n+                                \"sensitive\": false\n                             },\n-                            \"kerberos-user-service\": {\n-                                \"description\": \"Specifies the Kerberos User Controller Service that should be used for authenticating with Kerberos\",\n-                                \"displayName\": \"Kerberos User Service\",\n+                            \"es-rest-size\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"build\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Query Definition Style\",\n+                                        \"propertyName\": \"el-rest-query-definition-style\"\n+                                    }\n+                                ],\n+                                \"description\": \"The maximum number of documents to retrieve in the query. If the query is paginated, this \\\"size\\\" applies to each page of the query, not the \\\"size\\\" of the entire result set.\",\n+                                \"displayName\": \"Size\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"kerberos-user-service\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"es-rest-size\",\n                                 \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.kerberos.KerberosUserService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n+                                \"sensitive\": false\n                             }\n                         },\n-                        \"providedApiImplementations\": [\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.processors.elasticsearch.PaginatedJsonQueryElasticsearch\"\n+                        ],\n+                        \"sideEffectFree\": false,\n+                        \"supportedRelationships\": [\n                             {\n-                                \"artifact\": \"nifi-standard-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.hbase.HBaseClientService\",\n-                                \"version\": \"1.27.0\"\n+                                \"description\": \"Aggregations are routed to this relationship.\",\n+                                \"name\": \"aggregations\"\n+                            },\n+                            {\n+                                \"description\": \"All flowfiles that fail for reasons unrelated to server availability go to this relationship.\",\n+                                \"name\": \"failure\"\n+                            },\n+                            {\n+                                \"description\": \"All original flowfiles that don't cause an error to occur go to this relationship.\",\n+                                \"name\": \"original\"\n+                            },\n+                            {\n+                                \"description\": \"Search hits are routed to this relationship.\",\n+                                \"name\": \"hits\"\n                             }\n                         ],\n-                        \"restricted\": true,\n+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\",\n+                            \"EVENT_DRIVEN\"\n+                        ],\n+                        \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": true,\n+                        \"supportsDynamicRelationships\": false,\n+                        \"supportsEventDriven\": true,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"client\",\n-                            \"hbase\"\n+                            \"elasticsearch\",\n+                            \"elasticsearch5\",\n+                            \"elasticsearch6\",\n+                            \"elasticsearch7\",\n+                            \"elasticsearch8\",\n+                            \"get\",\n+                            \"json\",\n+                            \"query\",\n+                            \"read\"\n                         ],\n-                        \"type\": \"org.apache.nifi.hbase.HBase_2_ClientService\",\n-                        \"typeDescription\": \"Implementation of HBaseClientService using the HBase 2.1.1 client. This service can be configured by providing a comma-separated list of configuration files, or by specifying values for the other properties. If configuration files are provided, they will be loaded first, and the values of the additional properties will override the values from the configuration files. In addition, any user defined properties on the processor will also be passed to the HBase configuration.\",\n-                        \"version\": \"1.27.0\"\n+                        \"triggerSerially\": false,\n+                        \"triggerWhenAnyDestinationAvailable\": false,\n+                        \"triggerWhenEmpty\": false,\n+                        \"type\": \"org.apache.nifi.processors.elasticsearch.JsonQueryElasticsearch\",\n+                        \"typeDescription\": \"A processor that allows the user to run a query (with aggregations) written with the Elasticsearch JSON DSL. It does not automatically paginate queries for the user. If an incoming relationship is added to this processor, it will use the flowfile's content for the query. Care should be taken on the size of the query because the entire response from Elasticsearch will be loaded into memory all at once and converted into the resulting flowfiles.\",\n+                        \"version\": \"1.27.0\",\n+                        \"writesAttributes\": [\n+                            {\n+                                \"description\": \"application/json\",\n+                                \"name\": \"mime.type\"\n+                            },\n+                            {\n+                                \"description\": \"The name of the aggregation whose results are in the output flowfile\",\n+                                \"name\": \"aggregation.name\"\n+                            },\n+                            {\n+                                \"description\": \"The number of the aggregation whose results are in the output flowfile\",\n+                                \"name\": \"aggregation.number\"\n+                            },\n+                            {\n+                                \"description\": \"The number of hits that are in the output flowfile\",\n+                                \"name\": \"hit.count\"\n+                            },\n+                            {\n+                                \"description\": \"The error message provided by Elasticsearch if there is an error querying the index.\",\n+                                \"name\": \"elasticsearch.query.error\"\n+                            }\n+                        ]\n                     },\n                     {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-hbase_2-client-service-nar\",\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-elasticsearch-restapi-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n+                        \"defaultBulletinLevel\": \"WARN\",\n+                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": 1,\n+                            \"EVENT_DRIVEN\": 0,\n+                            \"TIMER_DRIVEN\": 1\n+                        },\n+                        \"defaultPenaltyDuration\": \"30 sec\",\n+                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": \"* * * * * ?\",\n+                            \"TIMER_DRIVEN\": \"0 sec\"\n+                        },\n+                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n+                        \"defaultYieldDuration\": \"1 sec\",\n+                        \"dynamicProperties\": [\n+                            {\n+                                \"description\": \"Adds the specified property name/value as a query parameter in the Elasticsearch URL used for processing. These parameters will override any matching parameters in the query request body. For SCROLL type queries, these parameters are only used in the initial (first page) query as the Elasticsearch Scroll API does not support the same query parameters for subsequent pages of data.\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"name\": \"The name of a URL query parameter to add\",\n+                                \"value\": \"The value of the URL query parameter\"\n+                            }\n+                        ],\n                         \"group\": \"org.apache.nifi\",\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n+                        \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"hb-lu-authorizations\": {\n-                                \"description\": \"The list of authorization tokens to be used with cell visibility if it is enabled. These will be used to override the default authorization list for the user accessing HBase.\",\n-                                \"displayName\": \"Authorizations\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"hb-lu-authorizations\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"hb-lu-charset\": {\n-                                \"defaultValue\": \"UTF-8\",\n-                                \"description\": \"Specifies the character set used to decode bytes retrieved from HBase.\",\n-                                \"displayName\": \"Character Set\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"hb-lu-charset\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"hb-lu-return-cols\": {\n-                                \"description\": \"A comma-separated list of \\\\\\\"<colFamily>:<colQualifier>\\\\\\\" pairs to return when scanning. To return all columns for a given family, leave off the qualifier such as \\\\\\\"<colFamily1>,<colFamily2>\\\\\\\".\",\n-                                \"displayName\": \"Columns\",\n+                            \"el-query-attribute\": {\n+                                \"description\": \"If set, the executed query will be set on each result flowfile in the specified attribute.\",\n+                                \"displayName\": \"Query Attribute\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"hb-lu-return-cols\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"el-query-attribute\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"hb-lu-table-name\": {\n-                                \"description\": \"The name of the table where look ups will be run.\",\n-                                \"displayName\": \"Table Name\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"hb-lu-table-name\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"hbase-client-service\": {\n-                                \"description\": \"Specifies the HBase Client Controller Service to use for accessing HBase.\",\n-                                \"displayName\": \"HBase Client Service\",\n+                            \"el-rest-client-service\": {\n+                                \"description\": \"An Elasticsearch client service to use for running queries.\",\n+                                \"displayName\": \"Client Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"hbase-client-service\",\n+                                \"name\": \"el-rest-client-service\",\n                                 \"required\": true,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"artifact\": \"nifi-elasticsearch-client-service-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.hbase.HBaseClientService\",\n+                                    \"type\": \"org.apache.nifi.elasticsearch.ElasticSearchClientService\",\n                                     \"version\": \"1.27.0\"\n                                 }\n-                            }\n-                        },\n-                        \"providedApiImplementations\": [\n-                            {\n-                                \"artifact\": \"nifi-standard-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.lookup.LookupService\",\n-                                \"version\": \"1.27.0\"\n-                            }\n-                        ],\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"hbase\",\n-                            \"lookup\",\n-                            \"record\",\n-                            \"service\"\n-                        ],\n-                        \"type\": \"org.apache.nifi.hbase.HBase_2_RecordLookupService\",\n-                        \"typeDescription\": \"A lookup service that retrieves one or more columns from HBase and returns them as a record. The lookup coordinates must contain 'rowKey' which will be the HBase row id.\",\n-                        \"version\": \"1.27.0\"\n-                    }\n-                ],\n-                \"processors\": [],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"1.27.0\"\n-        },\n-        {\n-            \"artifact\": \"nifi-lookup-services-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-lookup-services-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"e0c4461\"\n-                        },\n-                        \"explicitRestrictions\": [\n-                            {\n-                                \"explanation\": \"Provides operator the ability to read from any file that NiFi has access to.\",\n-                                \"requiredPermission\": \"read filesystem\"\n-                            }\n-                        ],\n-                        \"group\": \"org.apache.nifi\",\n-                        \"propertyDescriptors\": {\n-                            \"CSV Format\": {\n+                            },\n+                            \"el-rest-fetch-index\": {\n+                                \"description\": \"The name of the index to use.\",\n+                                \"displayName\": \"Index\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"el-rest-fetch-index\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"el-rest-format-aggregations\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"The format of the CSV is configured by using the properties of this Controller Service, such as Value Separator\",\n-                                        \"displayName\": \"Custom Format\",\n-                                        \"value\": \"custom\"\n-                                    },\n-                                    {\n-                                        \"description\": \"CSV data follows the RFC 4180 Specification defined at https://tools.ietf.org/html/rfc4180\",\n-                                        \"displayName\": \"RFC 4180\",\n-                                        \"value\": \"rfc-4180\"\n+                                        \"description\": \"Contains full Elasticsearch Aggregation, including Buckets and Metadata.\",\n+                                        \"displayName\": \"FULL\",\n+                                        \"value\": \"FULL\"\n                                     },\n                                     {\n-                                        \"description\": \"CSV data follows the format used by Microsoft Excel\",\n-                                        \"displayName\": \"Microsoft Excel\",\n-                                        \"value\": \"excel\"\n+                                        \"description\": \"Bucket Content only.\",\n+                                        \"displayName\": \"BUCKETS_ONLY\",\n+                                        \"value\": \"BUCKETS_ONLY\"\n                                     },\n                                     {\n-                                        \"description\": \"CSV data is Tab-Delimited instead of Comma Delimited\",\n-                                        \"displayName\": \"Tab-Delimited\",\n-                                        \"value\": \"tdf\"\n-                                    },\n+                                        \"description\": \"Aggregation Metadata only.\",\n+                                        \"displayName\": \"METADATA_ONLY\",\n+                                        \"value\": \"METADATA_ONLY\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"FULL\",\n+                                \"description\": \"Format of Aggregation output.\",\n+                                \"displayName\": \"Aggregation Results Format\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"el-rest-format-aggregations\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"el-rest-format-hits\": {\n+                                \"allowableValues\": [\n                                     {\n-                                        \"description\": \"CSV data follows the format used by MySQL\",\n-                                        \"displayName\": \"MySQL Format\",\n-                                        \"value\": \"mysql\"\n+                                        \"description\": \"Contains full Elasticsearch Hit, including Document Source and Metadata.\",\n+                                        \"displayName\": \"FULL\",\n+                                        \"value\": \"FULL\"\n                                     },\n                                     {\n-                                        \"description\": \"The format used by Informix when issuing the UNLOAD TO file_name command\",\n-                                        \"displayName\": \"Informix Unload\",\n-                                        \"value\": \"informix-unload\"\n+                                        \"description\": \"Document Source only (where present).\",\n+                                        \"displayName\": \"SOURCE_ONLY\",\n+                                        \"value\": \"SOURCE_ONLY\"\n                                     },\n                                     {\n-                                        \"description\": \"The format used by Informix when issuing the UNLOAD TO file_name command with escaping disabled\",\n-                                        \"displayName\": \"Informix Unload Escape Disabled\",\n-                                        \"value\": \"informix-unload-csv\"\n-                                    },\n+                                        \"description\": \"Hit Metadata only.\",\n+                                        \"displayName\": \"METADATA_ONLY\",\n+                                        \"value\": \"METADATA_ONLY\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"FULL\",\n+                                \"description\": \"Format of Hits output.\",\n+                                \"displayName\": \"Search Results Format\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"el-rest-format-hits\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"el-rest-output-no-hits\": {\n+                                \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Same as custom format. Available for compatibility reasons.\",\n-                                        \"displayName\": \"Default Format\",\n-                                        \"value\": \"default\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n-                                        \"description\": \"Same as RFC 4180. Available for compatibility reasons.\",\n-                                        \"displayName\": \"RFC4180\",\n-                                        \"value\": \"RFC4180\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"default\",\n-                                \"description\": \"Specifies which \\\"format\\\" the CSV data is in, or specifies if custom formatting should be used.\",\n-                                \"displayName\": \"CSV Format\",\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"Output a \\\"hits\\\" flowfile even if no hits found for query. If true, an empty \\\"hits\\\" flowfile will be output even if \\\"aggregations\\\" are output.\",\n+                                \"displayName\": \"Output No Hits\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"CSV Format\",\n+                                \"name\": \"el-rest-output-no-hits\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Character Set\": {\n-                                \"defaultValue\": \"UTF-8\",\n-                                \"description\": \"The Character Encoding that is used to decode the CSV file.\",\n-                                \"displayName\": \"Character Set\",\n+                            \"el-rest-pagination-keep-alive\": {\n+                                \"defaultValue\": \"10 mins\",\n+                                \"description\": \"Pagination \\\"keep_alive\\\" period. Period Elasticsearch will keep the scroll/pit cursor alive in between requests (this is not the time expected for all pages to be returned, but the maximum allowed time for requests between page retrievals).\",\n+                                \"displayName\": \"Pagination Keep Alive\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Character Set\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"el-rest-pagination-keep-alive\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Comment Marker\": {\n-                                \"dependencies\": [\n+                            \"el-rest-pagination-type\": {\n+                                \"allowableValues\": [\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"custom\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"CSV Format\",\n-                                        \"propertyName\": \"CSV Format\"\n+                                        \"description\": \"Use Elasticsearch \\\"_scroll\\\" API to page results. Does not accept additional query parameters.\",\n+                                        \"displayName\": \"SCROLL\",\n+                                        \"value\": \"pagination-scroll\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Use Elasticsearch \\\"search_after\\\" _search API to page sorted results.\",\n+                                        \"displayName\": \"SEARCH_AFTER\",\n+                                        \"value\": \"pagination-search_after\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Use Elasticsearch (7.10+ with XPack) \\\"point in time\\\" _search API to page sorted results.\",\n+                                        \"displayName\": \"POINT_IN_TIME\",\n+                                        \"value\": \"pagination-pit\"\n                                     }\n                                 ],\n-                                \"description\": \"The character that is used to denote the start of a comment. Any line that begins with this comment will be ignored.\",\n-                                \"displayName\": \"Comment Marker\",\n+                                \"defaultValue\": \"pagination-scroll\",\n+                                \"description\": \"Pagination method to use. Not all types are available for all Elasticsearch versions, check the Elasticsearch docs to confirm which are applicable and recommended for your service.\",\n+                                \"displayName\": \"Pagination Type\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Comment Marker\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"el-rest-pagination-type\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Escape Character\": {\n-                                \"defaultValue\": \"\\\\\",\n+                            \"el-rest-query\": {\n                                 \"dependencies\": [\n                                     {\n                                         \"dependentValues\": [\n-                                            \"custom\"\n+                                            \"full\"\n                                         ],\n-                                        \"propertyDisplayName\": \"CSV Format\",\n-                                        \"propertyName\": \"CSV Format\"\n+                                        \"propertyDisplayName\": \"Query Definition Style\",\n+                                        \"propertyName\": \"el-rest-query-definition-style\"\n                                     }\n                                 ],\n-                                \"description\": \"The character that is used to escape characters that would otherwise have a specific meaning to the CSV Parser. If the property has been specified via Expression Language but the expression gets evaluated to an invalid Escape Character at runtime, then it will be skipped and the default Escape Character will be used. Setting it to an empty string means no escape character should be used.\",\n-                                \"displayName\": \"Escape Character\",\n+                                \"description\": \"A query in JSON syntax, not Lucene syntax. Ex: {\\\"query\\\":{\\\"match\\\":{\\\"somefield\\\":\\\"somevalue\\\"}}}. If this parameter is not set, the query will be read from the flowfile content. If the query (property and flowfile content) is empty, a default empty JSON Object will be used, which will result in a \\\"match_all\\\" query in Elasticsearch.\",\n+                                \"displayName\": \"Query\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Escape Character\",\n-                                \"required\": true,\n+                                \"name\": \"el-rest-query\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Quote Character\": {\n-                                \"defaultValue\": \"\\\"\",\n+                            \"el-rest-query-clause\": {\n                                 \"dependencies\": [\n                                     {\n                                         \"dependentValues\": [\n-                                            \"custom\"\n+                                            \"build\"\n                                         ],\n-                                        \"propertyDisplayName\": \"CSV Format\",\n-                                        \"propertyName\": \"CSV Format\"\n+                                        \"propertyDisplayName\": \"Query Definition Style\",\n+                                        \"propertyName\": \"el-rest-query-definition-style\"\n                                     }\n                                 ],\n-                                \"description\": \"The character that is used to quote values so that escape characters do not have to be used. If the property has been specified via Expression Language but the expression gets evaluated to an invalid Quote Character at runtime, then it will be skipped and the default Quote Character will be used.\",\n-                                \"displayName\": \"Quote Character\",\n+                                \"description\": \"A \\\"query\\\" clause in JSON syntax, not Lucene syntax. Ex: {\\\"match\\\":{\\\"somefield\\\":\\\"somevalue\\\"}}. If the query is empty, a default JSON Object will be used, which will result in a \\\"match_all\\\" query in Elasticsearch.\",\n+                                \"displayName\": \"Query Clause\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Quote Character\",\n-                                \"required\": true,\n+                                \"name\": \"el-rest-query-clause\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Quote Mode\": {\n+                            \"el-rest-query-definition-style\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"All values will be quoted using the configured quote character.\",\n-                                        \"displayName\": \"Quote All Values\",\n-                                        \"value\": \"ALL\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Values will be quoted only if they are contain special characters such as newline characters or field separators.\",\n-                                        \"displayName\": \"Quote Minimal\",\n-                                        \"value\": \"MINIMAL\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Values will be quoted unless the value is a number.\",\n-                                        \"displayName\": \"Quote Non-Numeric Values\",\n-                                        \"value\": \"NON_NUMERIC\"\n+                                        \"description\": \"Provide the full Query.\",\n+                                        \"displayName\": \"FULL_QUERY\",\n+                                        \"value\": \"full\"\n                                     },\n                                     {\n-                                        \"description\": \"Values will not be quoted. Instead, all special characters will be escaped using the configured escape character.\",\n-                                        \"displayName\": \"Do Not Quote Values\",\n-                                        \"value\": \"NONE\"\n+                                        \"description\": \"Build the Query from separate JSON objects.\",\n+                                        \"displayName\": \"BUILD_QUERY\",\n+                                        \"value\": \"build\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"MINIMAL\",\n-                                \"dependencies\": [\n+                                \"defaultValue\": \"full\",\n+                                \"description\": \"How the JSON Query will be defined for use by the processor.\",\n+                                \"displayName\": \"Query Definition Style\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"el-rest-query-definition-style\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"el-rest-split-up-aggregations\": {\n+                                \"allowableValues\": [\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"custom\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"CSV Format\",\n-                                        \"propertyName\": \"CSV Format\"\n+                                        \"description\": \"Flowfile per hit.\",\n+                                        \"displayName\": \"PER_HIT\",\n+                                        \"value\": \"splitUp-yes\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Flowfile per response.\",\n+                                        \"displayName\": \"PER_RESPONSE\",\n+                                        \"value\": \"splitUp-no\"\n                                     }\n                                 ],\n-                                \"description\": \"Specifies how fields should be quoted when they are written\",\n-                                \"displayName\": \"Quote Mode\",\n+                                \"defaultValue\": \"splitUp-no\",\n+                                \"description\": \"Output a flowfile containing all aggregations or one flowfile for each individual aggregation.\",\n+                                \"displayName\": \"Aggregation Results Split\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Quote Mode\",\n+                                \"name\": \"el-rest-split-up-aggregations\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Trim Fields\": {\n+                            \"el-rest-split-up-hits\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"description\": \"Flowfile per hit.\",\n+                                        \"displayName\": \"PER_HIT\",\n+                                        \"value\": \"splitUp-yes\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"true\",\n-                                \"dependencies\": [\n+                                        \"description\": \"Flowfile per response.\",\n+                                        \"displayName\": \"PER_RESPONSE\",\n+                                        \"value\": \"splitUp-no\"\n+                                    },\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"custom\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"CSV Format\",\n-                                        \"propertyName\": \"CSV Format\"\n+                                        \"description\": \"Combine results from all query responses (one flowfile per entire paginated result set of hits). Note that aggregations cannot be paged, they are generated across the entire result set and returned as part of the first page. Results are output with one JSON object per line (allowing hits to be combined from multiple pages without loading all results into memory).\",\n+                                        \"displayName\": \"PER_QUERY\",\n+                                        \"value\": \"splitUp-query\"\n                                     }\n                                 ],\n-                                \"description\": \"Whether or not white space should be removed from the beginning and end of fields\",\n-                                \"displayName\": \"Trim Fields\",\n+                                \"defaultValue\": \"splitUp-no\",\n+                                \"description\": \"Output a flowfile containing all hits or one flowfile for each individual hit or one flowfile containing all hits from all paged responses.\",\n+                                \"displayName\": \"Search Results Split\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Trim Fields\",\n+                                \"name\": \"el-rest-split-up-hits\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Value Separator\": {\n-                                \"defaultValue\": \",\",\n+                            \"el-rest-type\": {\n+                                \"description\": \"The type of this document (used by Elasticsearch for indexing and searching).\",\n+                                \"displayName\": \"Type\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"el-rest-type\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"es-rest-query-aggs\": {\n                                 \"dependencies\": [\n                                     {\n                                         \"dependentValues\": [\n-                                            \"custom\"\n+                                            \"build\"\n                                         ],\n-                                        \"propertyDisplayName\": \"CSV Format\",\n-                                        \"propertyName\": \"CSV Format\"\n+                                        \"propertyDisplayName\": \"Query Definition Style\",\n+                                        \"propertyName\": \"el-rest-query-definition-style\"\n                                     }\n                                 ],\n-                                \"description\": \"The character that is used to separate values/fields in a CSV Record. If the property has been specified via Expression Language but the expression gets evaluated to an invalid Value Separator at runtime, then it will be skipped and the default Value Separator will be used.\",\n-                                \"displayName\": \"Value Separator\",\n+                                \"description\": \"One or more query aggregations (or \\\"aggs\\\"), in JSON syntax. Ex: {\\\"items\\\": {\\\"terms\\\": {\\\"field\\\": \\\"product\\\", \\\"size\\\": 10}}}\",\n+                                \"displayName\": \"Aggregations\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Value Separator\",\n-                                \"required\": true,\n+                                \"name\": \"es-rest-query-aggs\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"csv-file\": {\n-                                \"description\": \"Path to a CSV File in which the key value pairs can be looked up.\",\n-                                \"displayName\": \"CSV File\",\n+                            \"es-rest-query-fields\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"build\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Query Definition Style\",\n+                                        \"propertyName\": \"el-rest-query-definition-style\"\n+                                    }\n+                                ],\n+                                \"description\": \"Fields of indexed documents to be retrieved, in JSON syntax. Ex: [\\\"user.id\\\", \\\"http.response.*\\\", {\\\"field\\\": \\\"@timestamp\\\", \\\"format\\\": \\\"epoch_millis\\\"}]\",\n+                                \"displayName\": \"Fields\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"csv-file\",\n-                                \"required\": true,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"SINGLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\"\n-                                    ]\n-                                },\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"es-rest-query-fields\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"ignore-duplicates\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n+                            \"es-rest-query-script-fields\": {\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"dependentValues\": [\n+                                            \"build\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Query Definition Style\",\n+                                        \"propertyName\": \"el-rest-query-definition-style\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"true\",\n-                                \"description\": \"Ignore duplicate keys for records in the CSV file.\",\n-                                \"displayName\": \"Ignore Duplicates\",\n+                                \"description\": \"Fields to created using script evaluation at query runtime, in JSON syntax. Ex: {\\\"test1\\\": {\\\"script\\\": {\\\"lang\\\": \\\"painless\\\", \\\"source\\\": \\\"doc['price'].value * 2\\\"}}, \\\"test2\\\": {\\\"script\\\": {\\\"lang\\\": \\\"painless\\\", \\\"source\\\": \\\"doc['price'].value * params.factor\\\", \\\"params\\\": {\\\"factor\\\": 2.0}}}}\",\n+                                \"displayName\": \"Script Fields\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"ignore-duplicates\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"es-rest-query-script-fields\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"lookup-key-column\": {\n-                                \"description\": \"The field in the CSV file that will serve as the lookup key. This is the field that will be matched against the property specified in the lookup processor.\",\n-                                \"displayName\": \"Lookup Key Column\",\n+                            \"es-rest-query-sort\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"build\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Query Definition Style\",\n+                                        \"propertyName\": \"el-rest-query-definition-style\"\n+                                    }\n+                                ],\n+                                \"description\": \"Sort results by one or more fields, in JSON syntax. Ex: [{\\\"price\\\" : {\\\"order\\\" : \\\"asc\\\", \\\"mode\\\" : \\\"avg\\\"}}, {\\\"post_date\\\" : {\\\"format\\\": \\\"strict_date_optional_time_nanos\\\"}}]\",\n+                                \"displayName\": \"Sort\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"lookup-key-column\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"es-rest-query-sort\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n-                            }\n-                        },\n-                        \"providedApiImplementations\": [\n-                            {\n-                                \"artifact\": \"nifi-standard-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.lookup.LookupService\",\n-                                \"version\": \"1.27.0\"\n                             },\n-                            {\n-                                \"artifact\": \"nifi-standard-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.lookup.RecordLookupService\",\n-                                \"version\": \"1.27.0\"\n-                            }\n-                        ],\n-                        \"restricted\": true,\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"cache\",\n-                            \"csv\",\n-                            \"enrich\",\n-                            \"join\",\n-                            \"key\",\n-                            \"lookup\",\n-                            \"record\",\n-                            \"reloadable\",\n-                            \"value\"\n-                        ],\n-                        \"type\": \"org.apache.nifi.lookup.CSVRecordLookupService\",\n-                        \"typeDescription\": \"A reloadable CSV file-based lookup service. When the lookup key is found in the CSV file, the columns are returned as a Record. All returned fields will be strings. The first line of the csv file is considered as header.\",\n-                        \"version\": \"1.27.0\"\n-                    },\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-lookup-services-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"e0c4461\"\n-                        },\n-                        \"group\": \"org.apache.nifi\",\n-                        \"propertyDescriptors\": {\n-                            \"character-encoding\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"ISO-8859-1\",\n-                                        \"value\": \"ISO-8859-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"UTF-8\",\n-                                        \"value\": \"UTF-8\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"UTF-16\",\n-                                        \"value\": \"UTF-16\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"UTF-16LE\",\n-                                        \"value\": \"UTF-16LE\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"UTF-16BE\",\n-                                        \"value\": \"UTF-16BE\"\n-                                    },\n+                            \"es-rest-size\": {\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"US-ASCII\",\n-                                        \"value\": \"US-ASCII\"\n+                                        \"dependentValues\": [\n+                                            \"build\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Query Definition Style\",\n+                                        \"propertyName\": \"el-rest-query-definition-style\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"UTF-8\",\n-                                \"description\": \"Specifies a character encoding to use.\",\n-                                \"displayName\": \"Character Encoding\",\n+                                \"description\": \"The maximum number of documents to retrieve in the query. If the query is paginated, this \\\"size\\\" applies to each page of the query, not the \\\"size\\\" of the entire result set.\",\n+                                \"displayName\": \"Size\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"character-encoding\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"es-rest-size\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n-                            },\n-                            \"distributed-map-cache-service\": {\n-                                \"description\": \"The Controller Service that is used to get the cached values.\",\n-                                \"displayName\": \"Distributed Cache Service\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"distributed-map-cache-service\",\n-                                \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.distributed.cache.client.DistributedMapCacheClient\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n                             }\n                         },\n-                        \"providedApiImplementations\": [\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.processors.elasticsearch.ConsumeElasticsearch\",\n+                            \"org.apache.nifi.processors.elasticsearch.JsonQueryElasticsearch\",\n+                            \"org.apache.nifi.processors.elasticsearch.SearchElasticsearch\"\n+                        ],\n+                        \"sideEffectFree\": false,\n+                        \"supportedRelationships\": [\n                             {\n-                                \"artifact\": \"nifi-standard-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.lookup.StringLookupService\",\n-                                \"version\": \"1.27.0\"\n+                                \"description\": \"Aggregations are routed to this relationship.\",\n+                                \"name\": \"aggregations\"\n                             },\n                             {\n-                                \"artifact\": \"nifi-standard-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.lookup.LookupService\",\n-                                \"version\": \"1.27.0\"\n+                                \"description\": \"All flowfiles that fail for reasons unrelated to server availability go to this relationship.\",\n+                                \"name\": \"failure\"\n+                            },\n+                            {\n+                                \"description\": \"All original flowfiles that don't cause an error to occur go to this relationship.\",\n+                                \"name\": \"original\"\n+                            },\n+                            {\n+                                \"description\": \"Search hits are routed to this relationship.\",\n+                                \"name\": \"hits\"\n                             }\n                         ],\n-                        \"supportsDynamicProperties\": false,\n+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\",\n+                            \"EVENT_DRIVEN\"\n+                        ],\n+                        \"supportsBatching\": false,\n+                        \"supportsDynamicProperties\": true,\n+                        \"supportsDynamicRelationships\": false,\n+                        \"supportsEventDriven\": true,\n                         \"supportsSensitiveDynamicProperties\": false,\n+                        \"systemResourceConsiderations\": [\n+                            {\n+                                \"description\": \"Care should be taken on the size of each page because each response from Elasticsearch will be loaded into memory all at once and converted into the resulting flowfiles.\",\n+                                \"resource\": \"MEMORY\"\n+                            }\n+                        ],\n                         \"tags\": [\n-                            \"cache\",\n-                            \"distributed\",\n-                            \"enrich\",\n-                            \"key\",\n-                            \"lookup\",\n-                            \"map\",\n-                            \"value\"\n+                            \"elasticsearch\",\n+                            \"elasticsearch5\",\n+                            \"elasticsearch6\",\n+                            \"elasticsearch7\",\n+                            \"elasticsearch8\",\n+                            \"json\",\n+                            \"page\",\n+                            \"query\",\n+                            \"read\",\n+                            \"scroll\"\n                         ],\n-                        \"type\": \"org.apache.nifi.lookup.DistributedMapCacheLookupService\",\n-                        \"typeDescription\": \"Allows to choose a distributed map cache client to retrieve the value associated to a key. The coordinates that are passed to the lookup must contain the key 'key'.\",\n-                        \"version\": \"1.27.0\"\n-                    },\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-lookup-services-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"e0c4461\"\n-                        },\n-                        \"explicitRestrictions\": [\n+                        \"triggerSerially\": false,\n+                        \"triggerWhenAnyDestinationAvailable\": false,\n+                        \"triggerWhenEmpty\": false,\n+                        \"type\": \"org.apache.nifi.processors.elasticsearch.PaginatedJsonQueryElasticsearch\",\n+                        \"typeDescription\": \"A processor that allows the user to run a paginated query (with aggregations) written with the Elasticsearch JSON DSL. It will use the flowfile's content for the query unless the QUERY attribute is populated. Search After/Point in Time queries must include a valid \\\"sort\\\" field.\",\n+                        \"version\": \"1.27.0\",\n+                        \"writesAttributes\": [\n+                            {\n+                                \"description\": \"application/json\",\n+                                \"name\": \"mime.type\"\n+                            },\n+                            {\n+                                \"description\": \"The name of the aggregation whose results are in the output flowfile\",\n+                                \"name\": \"aggregation.name\"\n+                            },\n+                            {\n+                                \"description\": \"The number of the aggregation whose results are in the output flowfile\",\n+                                \"name\": \"aggregation.number\"\n+                            },\n                             {\n-                                \"explanation\": \"Provides operator the ability to read from any file that NiFi has access to.\",\n-                                \"requiredPermission\": \"read filesystem\"\n-                            }\n-                        ],\n-                        \"group\": \"org.apache.nifi\",\n-                        \"propertyDescriptors\": {\n-                            \"configuration-file\": {\n-                                \"description\": \"A configuration file\",\n-                                \"displayName\": \"Configuration File\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"configuration-file\",\n-                                \"required\": true,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"SINGLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\"\n-                                    ]\n-                                },\n-                                \"sensitive\": false\n-                            }\n-                        },\n-                        \"providedApiImplementations\": [\n+                                \"description\": \"The number of the page (request), starting from 1, in which the results were returned that are in the output flowfile\",\n+                                \"name\": \"page.number\"\n+                            },\n                             {\n-                                \"artifact\": \"nifi-standard-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.lookup.StringLookupService\",\n-                                \"version\": \"1.27.0\"\n+                                \"description\": \"The number of hits that are in the output flowfile\",\n+                                \"name\": \"hit.count\"\n                             },\n                             {\n-                                \"artifact\": \"nifi-standard-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.lookup.LookupService\",\n-                                \"version\": \"1.27.0\"\n+                                \"description\": \"The error message provided by Elasticsearch if there is an error querying the index.\",\n+                                \"name\": \"elasticsearch.query.error\"\n                             }\n-                        ],\n-                        \"restricted\": true,\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"cache\",\n-                            \"enrich\",\n-                            \"join\",\n-                            \"key\",\n-                            \"lookup\",\n-                            \"properties\",\n-                            \"reloadable\",\n-                            \"value\"\n-                        ],\n-                        \"type\": \"org.apache.nifi.lookup.PropertiesFileLookupService\",\n-                        \"typeDescription\": \"A reloadable properties file-based lookup service\",\n-                        \"version\": \"1.27.0\"\n+                        ]\n                     },\n                     {\n                         \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-lookup-services-nar\",\n+                        \"artifact\": \"nifi-elasticsearch-restapi-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n+                        \"defaultBulletinLevel\": \"WARN\",\n+                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": 1,\n+                            \"TIMER_DRIVEN\": 1\n+                        },\n+                        \"defaultPenaltyDuration\": \"30 sec\",\n+                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": \"* * * * * ?\",\n+                            \"TIMER_DRIVEN\": \"0 sec\"\n+                        },\n+                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n+                        \"defaultYieldDuration\": \"1 sec\",\n                         \"dynamicProperties\": [\n                             {\n-                                \"description\": \"All dynamic properties are added as HTTP headers with the name as the header name and the value as the header value.\",\n+                                \"description\": \"Prefix: BULK: - adds the specified property name/value as a Bulk request header in the Elasticsearch Bulk API body used for processing. If the value is null or blank, the Bulk header will be omitted for the document operation. These parameters will override any matching parameters in the _bulk request body.\",\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"name\": \"*\",\n-                                \"value\": \"*\"\n+                                \"name\": \"The name of the Bulk request header\",\n+                                \"value\": \"The value of the Bulk request header\"\n+                            },\n+                            {\n+                                \"description\": \"Adds the specified property name/value as a query parameter in the Elasticsearch URL used for processing. These parameters will override any matching parameters in the _bulk request body. If FlowFiles are batched, only the first FlowFile in the batch is used to evaluate property values.\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"name\": \"The name of a URL query parameter to add\",\n+                                \"value\": \"The value of the URL query parameter\"\n                             }\n                         ],\n                         \"group\": \"org.apache.nifi\",\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n+                        \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"proxy-configuration-service\": {\n-                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests. If set, it supersedes proxy settings configured per component. Supported proxies: HTTP + AuthN, SOCKS In case of SOCKS, it is not guaranteed that the selected SOCKS Version will be used by the processor.\",\n-                                \"displayName\": \"Proxy Configuration Service\",\n+                            \"el-rest-client-service\": {\n+                                \"description\": \"An Elasticsearch client service to use for running queries.\",\n+                                \"displayName\": \"Client Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"proxy-configuration-service\",\n-                                \"required\": false,\n+                                \"name\": \"el-rest-client-service\",\n+                                \"required\": true,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"artifact\": \"nifi-elasticsearch-client-service-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.proxy.ProxyConfigurationService\",\n+                                    \"type\": \"org.apache.nifi.elasticsearch.ElasticSearchClientService\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             },\n-                            \"rest-lookup-basic-auth-password\": {\n-                                \"description\": \"The password to be used by the client to authenticate against the Remote URL.\",\n-                                \"displayName\": \"Basic Authentication Password\",\n+                            \"el-rest-fetch-index\": {\n+                                \"description\": \"The name of the index to use.\",\n+                                \"displayName\": \"Index\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"rest-lookup-basic-auth-password\",\n-                                \"required\": false,\n-                                \"sensitive\": true\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"el-rest-fetch-index\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n                             },\n-                            \"rest-lookup-basic-auth-username\": {\n-                                \"description\": \"The username to be used by the client to authenticate against the Remote URL.  Cannot include control characters (0-31), ':', or DEL (127).\",\n-                                \"displayName\": \"Basic Authentication Username\",\n+                            \"el-rest-type\": {\n+                                \"description\": \"The type of this document (used by Elasticsearch for indexing and searching).\",\n+                                \"displayName\": \"Type\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"rest-lookup-basic-auth-username\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"el-rest-type\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"rest-lookup-connection-timeout\": {\n-                                \"defaultValue\": \"5 secs\",\n-                                \"description\": \"Max wait time for connection to remote service.\",\n-                                \"displayName\": \"Connection Timeout\",\n+                            \"put-es-json-charset\": {\n+                                \"defaultValue\": \"UTF-8\",\n+                                \"description\": \"Specifies the character set of the document data.\",\n+                                \"displayName\": \"Character Set\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"rest-lookup-connection-timeout\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"put-es-json-charset\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"rest-lookup-digest-auth\": {\n+                            \"put-es-json-dynamic_templates\": {\n+                                \"description\": \"The dynamic_templates for the document. Must be parsable as a JSON Object. Requires Elasticsearch 7+\",\n+                                \"displayName\": \"Dynamic Templates\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"put-es-json-dynamic_templates\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"put-es-json-error-documents\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"true\",\n                                         \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"false\",\n                                         \"value\": \"false\"\n                                     }\n                                 ],\n                                 \"defaultValue\": \"false\",\n-                                \"description\": \"Whether to communicate with the website using Digest Authentication. 'Basic Authentication Username' and 'Basic Authentication Password' are used for authentication.\",\n-                                \"displayName\": \"Use Digest Authentication\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"rest-lookup-digest-auth\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"rest-lookup-read-timeout\": {\n-                                \"defaultValue\": \"15 secs\",\n-                                \"description\": \"Max wait time for response from remote service.\",\n-                                \"displayName\": \"Read Timeout\",\n+                                \"description\": \"If this configuration property is true, the response from Elasticsearch will be examined for failed documents and the FlowFile(s) associated with the failed document(s) will be sent to the \\\"errors\\\" relationship with \\\"elasticsearch.bulk.error\\\" attributes.\",\n+                                \"displayName\": \"Output Error Documents\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"rest-lookup-read-timeout\",\n+                                \"name\": \"put-es-json-error-documents\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"rest-lookup-record-path\": {\n-                                \"description\": \"An optional record path that can be used to define where in a record to get the real data to merge into the record set to be enriched. See documentation for examples of when this might be useful.\",\n-                                \"displayName\": \"Record Path\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"rest-lookup-record-path\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"rest-lookup-record-reader\": {\n-                                \"description\": \"The record reader to use for loading the payload and handling it as a record set.\",\n-                                \"displayName\": \"Record Reader\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"rest-lookup-record-reader\",\n-                                \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            },\n-                            \"rest-lookup-ssl-context-service\": {\n-                                \"description\": \"The SSL Context Service used to provide client certificate information for TLS/SSL connections.\",\n-                                \"displayName\": \"SSL Context Service\",\n+                            \"put-es-json-id-attr\": {\n+                                \"description\": \"The name of the FlowFile attribute containing the identifier for the document. If the Index Operation is \\\"index\\\", this property may be left empty or evaluate to an empty value, in which case the document's identifier will be auto-generated by Elasticsearch. For all other Index Operations, the attribute must evaluate to a non-empty value.\",\n+                                \"displayName\": \"Identifier Attribute\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"rest-lookup-ssl-context-service\",\n+                                \"name\": \"put-es-json-id-attr\",\n                                 \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            },\n-                            \"rest-lookup-url\": {\n-                                \"description\": \"The URL for the REST endpoint. Expression language is evaluated against the lookup key/value pairs, not flowfile attributes.\",\n-                                \"displayName\": \"URL\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"rest-lookup-url\",\n-                                \"required\": true,\n                                 \"sensitive\": false\n-                            }\n-                        },\n-                        \"providedApiImplementations\": [\n-                            {\n-                                \"artifact\": \"nifi-standard-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.lookup.LookupService\",\n-                                \"version\": \"1.27.0\"\n                             },\n-                            {\n-                                \"artifact\": \"nifi-standard-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.lookup.RecordLookupService\",\n-                                \"version\": \"1.27.0\"\n-                            }\n-                        ],\n-                        \"supportsDynamicProperties\": true,\n-                        \"supportsSensitiveDynamicProperties\": true,\n-                        \"tags\": [\n-                            \"http\",\n-                            \"json\",\n-                            \"lookup\",\n-                            \"rest\",\n-                            \"xml\"\n-                        ],\n-                        \"type\": \"org.apache.nifi.lookup.RestLookupService\",\n-                        \"typeDescription\": \"Use a REST service to look up values.\",\n-                        \"version\": \"1.27.0\"\n-                    },\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-lookup-services-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"e0c4461\"\n-                        },\n-                        \"explicitRestrictions\": [\n-                            {\n-                                \"explanation\": \"Provides operator the ability to read from any file that NiFi has access to.\",\n-                                \"requiredPermission\": \"read filesystem\"\n-                            }\n-                        ],\n-                        \"group\": \"org.apache.nifi\",\n-                        \"propertyDescriptors\": {\n-                            \"CSV Format\": {\n+                            \"put-es-json-not_found-is-error\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"The format of the CSV is configured by using the properties of this Controller Service, such as Value Separator\",\n-                                        \"displayName\": \"Custom Format\",\n-                                        \"value\": \"custom\"\n-                                    },\n-                                    {\n-                                        \"description\": \"CSV data follows the RFC 4180 Specification defined at https://tools.ietf.org/html/rfc4180\",\n-                                        \"displayName\": \"RFC 4180\",\n-                                        \"value\": \"rfc-4180\"\n-                                    },\n-                                    {\n-                                        \"description\": \"CSV data follows the format used by Microsoft Excel\",\n-                                        \"displayName\": \"Microsoft Excel\",\n-                                        \"value\": \"excel\"\n-                                    },\n-                                    {\n-                                        \"description\": \"CSV data is Tab-Delimited instead of Comma Delimited\",\n-                                        \"displayName\": \"Tab-Delimited\",\n-                                        \"value\": \"tdf\"\n-                                    },\n-                                    {\n-                                        \"description\": \"CSV data follows the format used by MySQL\",\n-                                        \"displayName\": \"MySQL Format\",\n-                                        \"value\": \"mysql\"\n-                                    },\n-                                    {\n-                                        \"description\": \"The format used by Informix when issuing the UNLOAD TO file_name command\",\n-                                        \"displayName\": \"Informix Unload\",\n-                                        \"value\": \"informix-unload\"\n-                                    },\n-                                    {\n-                                        \"description\": \"The format used by Informix when issuing the UNLOAD TO file_name command with escaping disabled\",\n-                                        \"displayName\": \"Informix Unload Escape Disabled\",\n-                                        \"value\": \"informix-unload-csv\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Same as custom format. Available for compatibility reasons.\",\n-                                        \"displayName\": \"Default Format\",\n-                                        \"value\": \"default\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n-                                        \"description\": \"Same as RFC 4180. Available for compatibility reasons.\",\n-                                        \"displayName\": \"RFC4180\",\n-                                        \"value\": \"RFC4180\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"default\",\n-                                \"description\": \"Specifies which \\\"format\\\" the CSV data is in, or specifies if custom formatting should be used.\",\n-                                \"displayName\": \"CSV Format\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"CSV Format\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Character Set\": {\n-                                \"defaultValue\": \"UTF-8\",\n-                                \"description\": \"The Character Encoding that is used to decode the CSV file.\",\n-                                \"displayName\": \"Character Set\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Character Set\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Comment Marker\": {\n+                                \"defaultValue\": \"true\",\n                                 \"dependencies\": [\n                                     {\n                                         \"dependentValues\": [\n-                                            \"custom\"\n+                                            \"true\"\n                                         ],\n-                                        \"propertyDisplayName\": \"CSV Format\",\n-                                        \"propertyName\": \"CSV Format\"\n+                                        \"propertyDisplayName\": \"Output Error Documents\",\n+                                        \"propertyName\": \"put-es-json-error-documents\"\n                                     }\n                                 ],\n-                                \"description\": \"The character that is used to denote the start of a comment. Any line that begins with this comment will be ignored.\",\n-                                \"displayName\": \"Comment Marker\",\n+                                \"description\": \"If true, \\\"not_found\\\" Elasticsearch Document associated FlowFiles will be routed to the \\\"success\\\" relationship, otherwise to the \\\"errors\\\" relationship. If Output Error Responses is \\\"true\\\" then \\\"not_found\\\" responses from Elasticsearch will be sent to the error_responses relationship\",\n+                                \"displayName\": \"Treat \\\"Not Found\\\" as Success\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Comment Marker\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"put-es-json-not_found-is-error\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Escape Character\": {\n-                                \"defaultValue\": \"\\\\\",\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"custom\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"CSV Format\",\n-                                        \"propertyName\": \"CSV Format\"\n-                                    }\n-                                ],\n-                                \"description\": \"The character that is used to escape characters that would otherwise have a specific meaning to the CSV Parser. If the property has been specified via Expression Language but the expression gets evaluated to an invalid Escape Character at runtime, then it will be skipped and the default Escape Character will be used. Setting it to an empty string means no escape character should be used.\",\n-                                \"displayName\": \"Escape Character\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Escape Character\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Quote Character\": {\n-                                \"defaultValue\": \"\\\"\",\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"custom\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"CSV Format\",\n-                                        \"propertyName\": \"CSV Format\"\n-                                    }\n-                                ],\n-                                \"description\": \"The character that is used to quote values so that escape characters do not have to be used. If the property has been specified via Expression Language but the expression gets evaluated to an invalid Quote Character at runtime, then it will be skipped and the default Quote Character will be used.\",\n-                                \"displayName\": \"Quote Character\",\n+                            \"put-es-json-script\": {\n+                                \"description\": \"The script for the document update/upsert. Only applies to Update/Upsert operations. Must be parsable as JSON Object. If left blank, the FlowFile content will be used for document update/upsert\",\n+                                \"displayName\": \"Script\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Quote Character\",\n-                                \"required\": true,\n+                                \"name\": \"put-es-json-script\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Quote Mode\": {\n+                            \"put-es-json-scripted-upsert\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"All values will be quoted using the configured quote character.\",\n-                                        \"displayName\": \"Quote All Values\",\n-                                        \"value\": \"ALL\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Values will be quoted only if they are contain special characters such as newline characters or field separators.\",\n-                                        \"displayName\": \"Quote Minimal\",\n-                                        \"value\": \"MINIMAL\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Values will be quoted unless the value is a number.\",\n-                                        \"displayName\": \"Quote Non-Numeric Values\",\n-                                        \"value\": \"NON_NUMERIC\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n-                                        \"description\": \"Values will not be quoted. Instead, all special characters will be escaped using the configured escape character.\",\n-                                        \"displayName\": \"Do Not Quote Values\",\n-                                        \"value\": \"NONE\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"MINIMAL\",\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"custom\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"CSV Format\",\n-                                        \"propertyName\": \"CSV Format\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"description\": \"Specifies how fields should be quoted when they are written\",\n-                                \"displayName\": \"Quote Mode\",\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"Whether to add the scripted_upsert flag to the Upsert Operation. Forces Elasticsearch to execute the Script whether or not the document exists, defaults to false. If the Upsert Document provided (from FlowFile content) will be empty, but sure to set the Client Service controller service's Suppress Null/Empty Values to Never Suppress or no \\\"upsert\\\" doc will be, included in the request to Elasticsearch and the operation will not create a new document for the script to execute against, resulting in a \\\"not_found\\\" error\",\n+                                \"displayName\": \"Scripted Upsert\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Quote Mode\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"put-es-json-scripted-upsert\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Trim Fields\": {\n+                            \"put-es-output-error-responses\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"true\",\n                                         \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"false\",\n                                         \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"true\",\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"custom\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"CSV Format\",\n-                                        \"propertyName\": \"CSV Format\"\n-                                    }\n-                                ],\n-                                \"description\": \"Whether or not white space should be removed from the beginning and end of fields\",\n-                                \"displayName\": \"Trim Fields\",\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"If this is enabled, response messages from Elasticsearch marked as \\\"error\\\" will be output to the \\\"error_responses\\\" relationship.This does not impact the output of flowfiles to the \\\"success\\\" or \\\"errors\\\" relationships\",\n+                                \"displayName\": \"Output Error Responses\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Trim Fields\",\n-                                \"required\": true,\n+                                \"name\": \"put-es-output-error-responses\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Value Separator\": {\n-                                \"defaultValue\": \",\",\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"custom\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"CSV Format\",\n-                                        \"propertyName\": \"CSV Format\"\n-                                    }\n-                                ],\n-                                \"description\": \"The character that is used to separate values/fields in a CSV Record. If the property has been specified via Expression Language but the expression gets evaluated to an invalid Value Separator at runtime, then it will be skipped and the default Value Separator will be used.\",\n-                                \"displayName\": \"Value Separator\",\n+                            \"put-es-record-batch-size\": {\n+                                \"defaultValue\": \"100\",\n+                                \"description\": \"The preferred number of FlowFiles to send over in a single batch.\",\n+                                \"displayName\": \"Batch Size\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Value Separator\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"put-es-record-batch-size\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"csv-file\": {\n-                                \"description\": \"Path to a CSV File in which the key value pairs can be looked up.\",\n-                                \"displayName\": \"CSV File\",\n+                            \"put-es-record-index-op\": {\n+                                \"defaultValue\": \"index\",\n+                                \"description\": \"The type of the operation used to index (create, delete, index, update, upsert)\",\n+                                \"displayName\": \"Index Operation\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"csv-file\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"put-es-record-index-op\",\n                                 \"required\": true,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"SINGLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\"\n-                                    ]\n-                                },\n                                 \"sensitive\": false\n                             },\n-                            \"ignore-duplicates\": {\n+                            \"put-es-record-log-error-responses\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"true\",\n                                         \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"false\",\n                                         \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"true\",\n-                                \"description\": \"Ignore duplicate keys for records in the CSV file.\",\n-                                \"displayName\": \"Ignore Duplicates\",\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"If this is enabled, errors will be logged to the NiFi logs at the error log level. Otherwise, they will only be logged if debug logging is enabled on NiFi as a whole. The purpose of this option is to give the user the ability to debug failed operations without having to turn on debug logging.\",\n+                                \"displayName\": \"Log Error Responses\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"ignore-duplicates\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"lookup-key-column\": {\n-                                \"description\": \"The field in the CSV file that will serve as the lookup key. This is the field that will be matched against the property specified in the lookup processor.\",\n-                                \"displayName\": \"Lookup Key Column\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"lookup-key-column\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"lookup-value-column\": {\n-                                \"description\": \"Lookup value column.\",\n-                                \"displayName\": \"Lookup Value Column\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"lookup-value-column\",\n-                                \"required\": true,\n+                                \"name\": \"put-es-record-log-error-responses\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             }\n                         },\n-                        \"providedApiImplementations\": [\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.processors.elasticsearch.PutElasticsearchRecord\"\n+                        ],\n+                        \"sideEffectFree\": false,\n+                        \"supportedRelationships\": [\n                             {\n-                                \"artifact\": \"nifi-standard-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.lookup.StringLookupService\",\n-                                \"version\": \"1.27.0\"\n+                                \"description\": \"All flowfiles that fail due to server/cluster availability go to this relationship.\",\n+                                \"name\": \"retry\"\n                             },\n                             {\n-                                \"artifact\": \"nifi-standard-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.lookup.LookupService\",\n-                                \"version\": \"1.27.0\"\n+                                \"description\": \"All flowfiles that succeed in being transferred into Elasticsearch go here. Documents received by the Elasticsearch _bulk API may still result in errors on the Elasticsearch side. The Elasticsearch response will need to be examined to determine whether any Document(s)/Record(s) resulted in errors.\",\n+                                \"name\": \"success\"\n+                            },\n+                            {\n+                                \"description\": \"All flowfiles that fail for reasons unrelated to server availability go to this relationship.\",\n+                                \"name\": \"failure\"\n+                            },\n+                            {\n+                                \"description\": \"If a \\\"Output Error Documents\\\" is set, any FlowFile(s) corresponding to Elasticsearch document(s) that resulted in an \\\"error\\\" (within Elasticsearch) will be routed here.\",\n+                                \"name\": \"errors\"\n                             }\n                         ],\n-                        \"restricted\": true,\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"cache\",\n-                            \"csv\",\n-                            \"enrich\",\n-                            \"join\",\n-                            \"key\",\n-                            \"lookup\",\n-                            \"reloadable\",\n-                            \"value\"\n+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\"\n                         ],\n-                        \"type\": \"org.apache.nifi.lookup.SimpleCsvFileLookupService\",\n-                        \"typeDescription\": \"A reloadable CSV file-based lookup service. The first line of the csv file is considered as header.\",\n-                        \"version\": \"1.27.0\"\n-                    },\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-lookup-services-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"e0c4461\"\n-                        },\n-                        \"dynamicProperties\": [\n+                        \"supportsBatching\": false,\n+                        \"supportsDynamicProperties\": true,\n+                        \"supportsDynamicRelationships\": false,\n+                        \"supportsEventDriven\": false,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"systemResourceConsiderations\": [\n                             {\n-                                \"description\": \"Allows users to add key/value pairs as User-defined Properties. Each property that is added can be looked up by Property Name. The coordinates that are passed to the lookup must contain the key 'key'.\",\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"name\": \"A key that can be looked up\",\n-                                \"value\": \"The value for the key\"\n+                                \"description\": \"The Batch of FlowFiles will be stored in memory until the bulk operation is performed.\",\n+                                \"resource\": \"MEMORY\"\n                             }\n                         ],\n-                        \"group\": \"org.apache.nifi\",\n-                        \"providedApiImplementations\": [\n+                        \"tags\": [\n+                            \"elasticsearch\",\n+                            \"elasticsearch5\",\n+                            \"elasticsearch6\",\n+                            \"elasticsearch7\",\n+                            \"elasticsearch8\",\n+                            \"index\",\n+                            \"json\",\n+                            \"put\"\n+                        ],\n+                        \"triggerSerially\": false,\n+                        \"triggerWhenAnyDestinationAvailable\": false,\n+                        \"triggerWhenEmpty\": false,\n+                        \"type\": \"org.apache.nifi.processors.elasticsearch.PutElasticsearchJson\",\n+                        \"typeDescription\": \"An Elasticsearch put processor that uses the official Elastic REST client libraries. Each FlowFile is treated as a document to be sent to the Elasticsearch _bulk API. Multiple FlowFiles can be batched together into each Request sent to Elasticsearch.\",\n+                        \"version\": \"1.27.0\",\n+                        \"writesAttributes\": [\n                             {\n-                                \"artifact\": \"nifi-standard-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.lookup.StringLookupService\",\n-                                \"version\": \"1.27.0\"\n+                                \"description\": \"The error message if there is an issue parsing the FlowFile, sending the parsed document to Elasticsearch or parsing the Elasticsearch response\",\n+                                \"name\": \"elasticsearch.put.error\"\n                             },\n                             {\n-                                \"artifact\": \"nifi-standard-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.lookup.LookupService\",\n-                                \"version\": \"1.27.0\"\n+                                \"description\": \"The _bulk response if there was an error during processing the document within Elasticsearch.\",\n+                                \"name\": \"elasticsearch.bulk.error\"\n                             }\n-                        ],\n-                        \"supportsDynamicProperties\": true,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"enrich\",\n-                            \"key\",\n-                            \"lookup\",\n-                            \"value\"\n-                        ],\n-                        \"type\": \"org.apache.nifi.lookup.SimpleKeyValueLookupService\",\n-                        \"typeDescription\": \"Allows users to add key/value pairs as User-defined Properties. Each property that is added can be looked up by Property Name. The coordinates that are passed to the lookup must contain the key 'key'.\",\n-                        \"version\": \"1.27.0\"\n+                        ]\n                     },\n                     {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-lookup-services-nar\",\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-elasticsearch-restapi-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n-                        \"explicitRestrictions\": [\n-                            {\n-                                \"explanation\": \"Provides operator the ability to read from any file that NiFi has access to.\",\n-                                \"requiredPermission\": \"read filesystem\"\n-                            }\n-                        ],\n-                        \"group\": \"org.apache.nifi\",\n-                        \"propertyDescriptors\": {\n-                            \"configuration-file\": {\n-                                \"description\": \"A configuration file\",\n-                                \"displayName\": \"Configuration File\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"configuration-file\",\n-                                \"required\": true,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"SINGLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\"\n-                                    ]\n-                                },\n-                                \"sensitive\": false\n-                            }\n+                        \"defaultBulletinLevel\": \"WARN\",\n+                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": 1,\n+                            \"TIMER_DRIVEN\": 1\n                         },\n-                        \"providedApiImplementations\": [\n+                        \"defaultPenaltyDuration\": \"30 sec\",\n+                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": \"* * * * * ?\",\n+                            \"TIMER_DRIVEN\": \"0 sec\"\n+                        },\n+                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n+                        \"defaultYieldDuration\": \"1 sec\",\n+                        \"dynamicProperties\": [\n                             {\n-                                \"artifact\": \"nifi-standard-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.lookup.StringLookupService\",\n-                                \"version\": \"1.27.0\"\n+                                \"description\": \"Prefix: BULK: - adds the specified property name/value as a Bulk request header in the Elasticsearch Bulk API body used for processing. If the Record Path expression results in a null or blank value, the Bulk header will be omitted for the document operation. These parameters will override any matching parameters in the _bulk request body.\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"name\": \"The name of the Bulk request header\",\n+                                \"value\": \"A Record Path expression to retrieve the Bulk request header value\"\n                             },\n                             {\n-                                \"artifact\": \"nifi-standard-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.lookup.LookupService\",\n-                                \"version\": \"1.27.0\"\n+                                \"description\": \"Adds the specified property name/value as a query parameter in the Elasticsearch URL used for processing. These parameters will override any matching parameters in the _bulk request body\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"name\": \"The name of a URL query parameter to add\",\n+                                \"value\": \"The value of the URL query parameter\"\n                             }\n                         ],\n-                        \"restricted\": true,\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"cache\",\n-                            \"enrich\",\n-                            \"join\",\n-                            \"key\",\n-                            \"lookup\",\n-                            \"reloadable\",\n-                            \"value\",\n-                            \"xml\"\n-                        ],\n-                        \"type\": \"org.apache.nifi.lookup.XMLFileLookupService\",\n-                        \"typeDescription\": \"A reloadable XML file-based lookup service. This service uses Apache Commons Configuration. Example XML configuration file and how to access specific configuration can be found at http://commons.apache.org/proper/commons-configuration/userguide/howto_hierarchical.html. External entity processing is disabled.\",\n-                        \"version\": \"1.27.0\"\n-                    },\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-lookup-services-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"e0c4461\"\n-                        },\n                         \"group\": \"org.apache.nifi\",\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n+                        \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Cache Expiration\": {\n-                                \"description\": \"Time interval to clear all cache entries. If the Cache Size is zero then this property is ignored.\",\n-                                \"displayName\": \"Cache Expiration\",\n+                            \"el-rest-client-service\": {\n+                                \"description\": \"An Elasticsearch client service to use for running queries.\",\n+                                \"displayName\": \"Client Service\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Cache Expiration\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"el-rest-client-service\",\n+                                \"required\": true,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-elasticsearch-client-service-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.elasticsearch.ElasticSearchClientService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n                             },\n-                            \"dbf-default-precision\": {\n-                                \"defaultValue\": \"10\",\n-                                \"description\": \"When a DECIMAL/NUMBER value is written as a 'decimal' Avro logical type, a specific 'precision' denoting number of available digits is required. Generally, precision is defined by column data type definition or database engines default. However undefined precision (0) can be returned from some database engines. 'Default Decimal Precision' is used when writing those undefined precision numbers.\",\n-                                \"displayName\": \"Default Decimal Precision\",\n+                            \"el-rest-fetch-index\": {\n+                                \"description\": \"The name of the index to use.\",\n+                                \"displayName\": \"Index\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"dbf-default-precision\",\n+                                \"name\": \"el-rest-fetch-index\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"dbf-default-scale\": {\n-                                \"defaultValue\": \"0\",\n-                                \"description\": \"When a DECIMAL/NUMBER value is written as a 'decimal' Avro logical type, a specific 'scale' denoting number of available decimal digits is required. Generally, scale is defined by column data type definition or database engines default. However when undefined precision (0) is returned, scale can also be uncertain with some database engines. 'Default Decimal Scale' is used when writing those undefined numbers. If a value has more decimals than specified scale, then the value will be rounded-up, e.g. 1.53 becomes 2 with scale 0, and 1.5 with scale 1.\",\n-                                \"displayName\": \"Default Decimal Scale\",\n+                            \"el-rest-type\": {\n+                                \"description\": \"The type of this document (used by Elasticsearch for indexing and searching).\",\n+                                \"displayName\": \"Type\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"dbf-default-scale\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"dbrecord-lookup-cache-size\": {\n-                                \"defaultValue\": \"0\",\n-                                \"description\": \"Specifies how many lookup values/records should be cached. The cache is shared for all tables and keeps a map of lookup values to records. Setting this property to zero means no caching will be done and the table will be queried for each lookup value in each record. If the lookup table changes often or the most recent data must be retrieved, do not use the cache.\",\n-                                \"displayName\": \"Cache Size\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"dbrecord-lookup-cache-size\",\n-                                \"required\": true,\n+                                \"name\": \"el-rest-type\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"dbrecord-lookup-clear-cache-on-enabled\": {\n+                            \"put-es-output-error-responses\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"true\",\n                                         \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"false\",\n                                         \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"true\",\n-                                \"description\": \"Whether to clear the cache when this service is enabled. If the Cache Size is zero then this property is ignored. Clearing the cache when the service is enabled ensures that the service will first go to the database to get the most recent data.\",\n-                                \"displayName\": \"Clear Cache on Enabled\",\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"If this is enabled, response messages from Elasticsearch marked as \\\"error\\\" will be output to the \\\"error_responses\\\" relationship.This does not impact the output of flowfiles to the \\\"success\\\" or \\\"errors\\\" relationships\",\n+                                \"displayName\": \"Output Error Responses\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"dbrecord-lookup-clear-cache-on-enabled\",\n-                                \"required\": true,\n+                                \"name\": \"put-es-output-error-responses\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"dbrecord-lookup-dbcp-service\": {\n-                                \"description\": \"The Controller Service that is used to obtain connection to database\",\n-                                \"displayName\": \"Database Connection Pooling Service\",\n+                            \"put-es-record-at-timestamp\": {\n+                                \"description\": \"The value to use as the @timestamp field (required for Elasticsearch Data Streams)\",\n+                                \"displayName\": \"@timestamp Value\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"dbrecord-lookup-dbcp-service\",\n-                                \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.dbcp.DBCPService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"put-es-record-at-timestamp\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n                             },\n-                            \"dbrecord-lookup-key-column\": {\n-                                \"description\": \"The column in the table that will serve as the lookup key. This is the column that will be matched against the property specified in the lookup processor. Note that this may be case-sensitive depending on the database.\",\n-                                \"displayName\": \"Lookup Key Column\",\n+                            \"put-es-record-at-timestamp-date-format\": {\n+                                \"description\": \"Specifies the format to use when writing Date fields. If not specified, the default format 'yyyy-MM-dd' is used. If specified, the value must match the Java Simple Date Format (for example, MM/dd/yyyy for a two-digit month, followed by a two-digit day, followed by a four-digit year, all separated by '/' characters, as in 01/25/2017).\",\n+                                \"displayName\": \"Date Format\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"dbrecord-lookup-key-column\",\n-                                \"required\": true,\n+                                \"name\": \"put-es-record-at-timestamp-date-format\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"dbrecord-lookup-table-name\": {\n-                                \"description\": \"The name of the database table to be queried. Note that this may be case-sensitive depending on the database.\",\n-                                \"displayName\": \"Table Name\",\n+                            \"put-es-record-at-timestamp-path\": {\n+                                \"description\": \"A RecordPath pointing to a field in the record(s) that contains the @timestamp for the document. If left blank the @timestamp will be determined using the main @timestamp property\",\n+                                \"displayName\": \"@timestamp Record Path\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"dbrecord-lookup-table-name\",\n-                                \"required\": true,\n+                                \"name\": \"put-es-record-at-timestamp-path\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"dbrecord-lookup-value-columns\": {\n-                                \"description\": \"A comma-delimited list of columns in the table that will be returned when the lookup key matches. Note that this may be case-sensitive depending on the database.\",\n-                                \"displayName\": \"Lookup Value Columns\",\n+                            \"put-es-record-at-timestamp-time-format\": {\n+                                \"description\": \"Specifies the format to use when writing Time fields. If not specified, the default format 'HH:mm:ss' is used. If specified, the value must match the Java Simple Date Format (for example, HH:mm:ss for a two-digit hour in 24-hour format, followed by a two-digit minute, followed by a two-digit second, all separated by ':' characters, as in 18:04:15).\",\n+                                \"displayName\": \"Time Format\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"dbrecord-lookup-value-columns\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"put-es-record-at-timestamp-time-format\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n-                            }\n-                        },\n-                        \"providedApiImplementations\": [\n-                            {\n-                                \"artifact\": \"nifi-standard-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.lookup.LookupService\",\n-                                \"version\": \"1.27.0\"\n                             },\n-                            {\n-                                \"artifact\": \"nifi-standard-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.lookup.RecordLookupService\",\n-                                \"version\": \"1.27.0\"\n-                            }\n-                        ],\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"cache\",\n-                            \"database\",\n-                            \"enrich\",\n-                            \"join\",\n-                            \"key\",\n-                            \"lookup\",\n-                            \"rdbms\",\n-                            \"record\",\n-                            \"reloadable\",\n-                            \"value\"\n-                        ],\n-                        \"type\": \"org.apache.nifi.lookup.db.DatabaseRecordLookupService\",\n-                        \"typeDescription\": \"A relational-database-based lookup service. When the lookup key is found in the database, the specified columns (or all if Lookup Value Columns are not specified) are returned as a Record. Only one row will be returned for each lookup, duplicate database entries are ignored.\",\n-                        \"version\": \"1.27.0\"\n-                    },\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-lookup-services-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"e0c4461\"\n-                        },\n-                        \"group\": \"org.apache.nifi\",\n-                        \"propertyDescriptors\": {\n-                            \"Cache Expiration\": {\n-                                \"description\": \"Time interval to clear all cache entries. If the Cache Size is zero then this property is ignored.\",\n-                                \"displayName\": \"Cache Expiration\",\n+                            \"put-es-record-at-timestamp-timestamp-format\": {\n+                                \"description\": \"Specifies the format to use when writing Timestamp fields. If not specified, the default format 'yyyy-MM-dd HH:mm:ss' is used. If specified, the value must match the Java Simple Date Format (for example, MM/dd/yyyy HH:mm:ss for a two-digit month, followed by a two-digit day, followed by a four-digit year, all separated by '/' characters; and then followed by a two-digit hour in 24-hour format, followed by a two-digit minute, followed by a two-digit second, all separated by ':' characters, as in 01/25/2017 18:04:15).\",\n+                                \"displayName\": \"Timestamp Format\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Cache Expiration\",\n+                                \"name\": \"put-es-record-at-timestamp-timestamp-format\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"dbrecord-lookup-cache-size\": {\n-                                \"defaultValue\": \"0\",\n-                                \"description\": \"Specifies how many lookup values/records should be cached. The cache is shared for all tables and keeps a map of lookup values to records. Setting this property to zero means no caching will be done and the table will be queried for each lookup value in each record. If the lookup table changes often or the most recent data must be retrieved, do not use the cache.\",\n-                                \"displayName\": \"Cache Size\",\n+                            \"put-es-record-batch-size\": {\n+                                \"defaultValue\": \"100\",\n+                                \"description\": \"The number of records to send over in a single batch.\",\n+                                \"displayName\": \"Batch Size\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"dbrecord-lookup-cache-size\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"put-es-record-batch-size\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"dbrecord-lookup-clear-cache-on-enabled\": {\n+                            \"put-es-record-bulk-error-groups\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"true\",\n                                         \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"false\",\n                                         \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"true\",\n-                                \"description\": \"Whether to clear the cache when this service is enabled. If the Cache Size is zero then this property is ignored. Clearing the cache when the service is enabled ensures that the service will first go to the database to get the most recent data.\",\n-                                \"displayName\": \"Clear Cache on Enabled\",\n+                                \"defaultValue\": \"false\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"propertyDisplayName\": \"Result Record Writer\",\n+                                        \"propertyName\": \"put-es-record-error-writer\"\n+                                    }\n+                                ],\n+                                \"description\": \"If this configuration property is set, the response from Elasticsearch will be examined for _bulk errors. The failed records written to the \\\"errors\\\" relationship will be grouped by error type and the error related to the first record within the FlowFile added to the FlowFile as \\\"elasticsearch.bulk.error\\\". If \\\"Treat \\\"Not Found\\\" as Success\\\" is \\\"false\\\" then records associated with \\\"not_found\\\" Elasticsearch document responses will also be send to the \\\"errors\\\" relationship.\",\n+                                \"displayName\": \"Group Results by Bulk Error Type\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"dbrecord-lookup-clear-cache-on-enabled\",\n-                                \"required\": true,\n+                                \"name\": \"put-es-record-bulk-error-groups\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"dbrecord-lookup-dbcp-service\": {\n-                                \"description\": \"The Controller Service that is used to obtain connection to database\",\n-                                \"displayName\": \"Database Connection Pooling Service\",\n+                            \"put-es-record-dynamic-templates-path\": {\n+                                \"description\": \"A RecordPath pointing to a field in the record(s) that contains the dynamic_templates for the document. Field must be Map-type compatible (e.g. a Map or Record) or a String parsable into a JSON Object. Requires Elasticsearch 7+\",\n+                                \"displayName\": \"Dynamic Templates Record Path\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"put-es-record-dynamic-templates-path\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"put-es-record-error-writer\": {\n+                                \"description\": \"If this configuration property is set, the response from Elasticsearch will be examined for failed records and the failed records will be written to a record set with this record writer service and sent to the \\\"errors\\\" relationship. Successful records will be written to a record set with this record writer service and sent to the \\\"successful_records\\\" relationship.\",\n+                                \"displayName\": \"Result Record Writer\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"dbrecord-lookup-dbcp-service\",\n-                                \"required\": true,\n+                                \"name\": \"put-es-record-error-writer\",\n+                                \"required\": false,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n                                     \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.dbcp.DBCPService\",\n+                                    \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             },\n-                            \"dbrecord-lookup-key-column\": {\n-                                \"description\": \"The column in the table that will serve as the lookup key. This is the column that will be matched against the property specified in the lookup processor. Note that this may be case-sensitive depending on the database.\",\n-                                \"displayName\": \"Lookup Key Column\",\n+                            \"put-es-record-id-path\": {\n+                                \"description\": \"A record path expression to retrieve the ID field for use with Elasticsearch. If left blank the ID will be automatically generated by Elasticsearch.\",\n+                                \"displayName\": \"ID Record Path\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"dbrecord-lookup-key-column\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"put-es-record-id-path\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"dbrecord-lookup-table-name\": {\n-                                \"description\": \"The name of the database table to be queried. Note that this may be case-sensitive depending on the database.\",\n-                                \"displayName\": \"Table Name\",\n+                            \"put-es-record-index-op\": {\n+                                \"defaultValue\": \"index\",\n+                                \"description\": \"The type of the operation used to index (create, delete, index, update, upsert)\",\n+                                \"displayName\": \"Index Operation\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"dbrecord-lookup-table-name\",\n+                                \"name\": \"put-es-record-index-op\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"lookup-value-column\": {\n-                                \"description\": \"The column whose value will be returned when the Lookup value is matched\",\n-                                \"displayName\": \"Lookup Value Column\",\n+                            \"put-es-record-index-op-path\": {\n+                                \"description\": \"A record path expression to retrieve the Index Operation field for use with Elasticsearch. If left blank the Index Operation will be determined using the main Index Operation property.\",\n+                                \"displayName\": \"Index Operation Record Path\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"lookup-value-column\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"put-es-record-index-op-path\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n-                            }\n-                        },\n-                        \"providedApiImplementations\": [\n-                            {\n-                                \"artifact\": \"nifi-standard-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.lookup.StringLookupService\",\n-                                \"version\": \"1.27.0\"\n                             },\n-                            {\n-                                \"artifact\": \"nifi-standard-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.lookup.LookupService\",\n-                                \"version\": \"1.27.0\"\n-                            }\n-                        ],\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"cache\",\n-                            \"database\",\n-                            \"enrich\",\n-                            \"join\",\n-                            \"key\",\n-                            \"lookup\",\n-                            \"rdbms\",\n-                            \"reloadable\",\n-                            \"value\"\n-                        ],\n-                        \"type\": \"org.apache.nifi.lookup.db.SimpleDatabaseLookupService\",\n-                        \"typeDescription\": \"A relational-database-based lookup service. When the lookup key is found in the database, the specified lookup value column is returned. Only one value will be returned for each lookup, duplicate database entries are ignored.\",\n-                        \"version\": \"1.27.0\"\n-                    },\n-                    {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-lookup-services-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"e0c4461\"\n-                        },\n-                        \"group\": \"org.apache.nifi\",\n-                        \"propertyDescriptors\": {\n-                            \"database-file\": {\n-                                \"description\": \"Path to Maxmind IP Enrichment Database File\",\n-                                \"displayName\": \"MaxMind Database File\",\n+                            \"put-es-record-index-record-path\": {\n+                                \"description\": \"A record path expression to retrieve the index field for use with Elasticsearch. If left blank the index will be determined using the main index property.\",\n+                                \"displayName\": \"Index Record Path\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"database-file\",\n-                                \"required\": true,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"SINGLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\"\n-                                    ]\n-                                },\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"put-es-record-index-record-path\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"lookup-anonymous-ip\": {\n+                            \"put-es-record-log-error-responses\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"true\",\n                                         \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"false\",\n                                         \"value\": \"false\"\n                                     }\n                                 ],\n                                 \"defaultValue\": \"false\",\n-                                \"description\": \"Specifies whether or not information about whether or not the IP address belongs to an anonymous network should be returned.\",\n-                                \"displayName\": \"Lookup Anonymous IP Information\",\n+                                \"description\": \"If this is enabled, errors will be logged to the NiFi logs at the error log level. Otherwise, they will only be logged if debug logging is enabled on NiFi as a whole. The purpose of this option is to give the user the ability to debug failed operations without having to turn on debug logging.\",\n+                                \"displayName\": \"Log Error Responses\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"lookup-anonymous-ip\",\n-                                \"required\": true,\n+                                \"name\": \"put-es-record-log-error-responses\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"lookup-city\": {\n+                            \"put-es-record-not_found-is-error\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"true\",\n                                         \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"false\",\n                                         \"value\": \"false\"\n                                     }\n                                 ],\n                                 \"defaultValue\": \"true\",\n-                                \"description\": \"Specifies whether or not information about the geographic information, such as cities, corresponding to the IP address should be returned\",\n-                                \"displayName\": \"Lookup Geo Enrichment\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"propertyDisplayName\": \"Result Record Writer\",\n+                                        \"propertyName\": \"put-es-record-error-writer\"\n+                                    }\n+                                ],\n+                                \"description\": \"If true, \\\"not_found\\\" Elasticsearch Document associated Records will be routed to the \\\"successful_records\\\" relationship, otherwise to the \\\"errors\\\" relationship. If Output Error Responses is \\\"true\\\" then \\\"not_found\\\" responses from Elasticsearch will be sent to the error_responses relationship.\",\n+                                \"displayName\": \"Treat \\\"Not Found\\\" as Success\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"lookup-city\",\n-                                \"required\": true,\n+                                \"name\": \"put-es-record-not_found-is-error\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"lookup-connection-type\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"Specifies whether or not information about the Connection Type corresponding to the IP address should be returned. If true, the lookup will contain a 'connectionType' field that (if populated) will contain a value of 'Dialup', 'Cable/DSL', 'Corporate', or 'Cellular'\",\n-                                \"displayName\": \"Lookup Connection Type\",\n+                            \"put-es-record-reader\": {\n+                                \"description\": \"The record reader to use for reading incoming records from flowfiles.\",\n+                                \"displayName\": \"Record Reader\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"lookup-connection-type\",\n+                                \"name\": \"put-es-record-reader\",\n                                 \"required\": true,\n-                                \"sensitive\": false\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n                             },\n-                            \"lookup-domain\": {\n+                            \"put-es-record-retain-at-timestamp-field\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"true\",\n                                         \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"false\",\n                                         \"value\": \"false\"\n                                     }\n                                 ],\n                                 \"defaultValue\": \"false\",\n-                                \"description\": \"Specifies whether or not information about the Domain Name corresponding to the IP address should be returned. If true, the lookup will contain second-level domain information, such as foo.com but will not contain bar.foo.com\",\n-                                \"displayName\": \"Lookup Domain Name\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"propertyDisplayName\": \"@timestamp Record Path\",\n+                                        \"propertyName\": \"put-es-record-at-timestamp-path\"\n+                                    }\n+                                ],\n+                                \"description\": \"Whether to retain the existing field used as the @timestamp Record Path.\",\n+                                \"displayName\": \"Retain @timestamp (Record Path)\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"lookup-domain\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"put-es-record-retain-at-timestamp-field\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"lookup-isp\": {\n+                            \"put-es-record-retain-id-field\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"true\",\n                                         \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"false\",\n                                         \"value\": \"false\"\n                                     }\n                                 ],\n                                 \"defaultValue\": \"false\",\n-                                \"description\": \"Specifies whether or not information about the Information Service Provider corresponding to the IP address should be returned\",\n-                                \"displayName\": \"Lookup ISP\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"lookup-isp\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            }\n-                        },\n-                        \"providedApiImplementations\": [\n-                            {\n-                                \"artifact\": \"nifi-standard-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.lookup.LookupService\",\n-                                \"version\": \"1.27.0\"\n-                            },\n-                            {\n-                                \"artifact\": \"nifi-standard-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.lookup.RecordLookupService\",\n-                                \"version\": \"1.27.0\"\n-                            }\n-                        ],\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"anonymous\",\n-                            \"cellular\",\n-                            \"domain\",\n-                            \"enrich\",\n-                            \"geo\",\n-                            \"ip\",\n-                            \"ipgeo\",\n-                            \"isp\",\n-                            \"lookup\",\n-                            \"maxmind\",\n-                            \"tor\"\n-                        ],\n-                        \"type\": \"org.apache.nifi.lookup.maxmind.IPLookupService\",\n-                        \"typeDescription\": \"A lookup service that provides several types of enrichment information for IP addresses. The service is configured by providing a MaxMind Database file and specifying which types of enrichment should be provided for an IP Address or Hostname. Each type of enrichment is a separate lookup, so configuring the service to provide all of the available enrichment data may be slower than returning only a portion of the available enrichments. In order to use this service, a lookup must be performed using key of 'ip' and a value that is a valid IP address or hostname. View the Usage of this component and choose to view Additional Details for more information, such as the Schema that pertains to the information that is returned.\",\n-                        \"version\": \"1.27.0\"\n-                    }\n-                ],\n-                \"processors\": [],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"1.27.0\"\n-        },\n-        {\n-            \"artifact\": \"nifi-evtx-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [],\n-                \"processors\": [\n-                    {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-evtx-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"e0c4461\"\n-                        },\n-                        \"defaultBulletinLevel\": \"WARN\",\n-                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": 1,\n-                            \"EVENT_DRIVEN\": 0,\n-                            \"TIMER_DRIVEN\": 1\n-                        },\n-                        \"defaultPenaltyDuration\": \"30 sec\",\n-                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"0 sec\"\n-                        },\n-                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n-                        \"defaultYieldDuration\": \"1 sec\",\n-                        \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_REQUIRED\",\n-                        \"primaryNodeOnly\": false,\n-                        \"propertyDescriptors\": {\n-                            \"granularity\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Record\",\n-                                        \"value\": \"Record\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Chunk\",\n-                                        \"value\": \"Chunk\"\n-                                    },\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"File\",\n-                                        \"value\": \"File\"\n+                                        \"propertyDisplayName\": \"ID Record Path\",\n+                                        \"propertyName\": \"put-es-record-id-path\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"Chunk\",\n-                                \"description\": \"Output flow file for each Record, Chunk, or File encountered in the event log\",\n-                                \"displayName\": \"Granularity\",\n+                                \"description\": \"Whether to retain the existing field used as the ID Record Path.\",\n+                                \"displayName\": \"Retain ID (Record Path)\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"granularity\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"put-es-record-retain-id-field\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"put-es-record-script-path\": {\n+                                \"description\": \"A RecordPath pointing to a field in the record(s) that contains the script for the document update/upsert. Only applies to Update/Upsert operations. Field must be Map-type compatible (e.g. a Map or a Record) or a String parsable into a JSON Object\",\n+                                \"displayName\": \"Script Record Path\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"put-es-record-script-path\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"put-es-record-scripted-upsert-path\": {\n+                                \"description\": \"A RecordPath pointing to a field in the record(s) that contains the scripted_upsert boolean flag. Whether to add the scripted_upsert flag to the Upsert Operation. Forces Elasticsearch to execute the Script whether or not the document exists, defaults to false. If the Upsert Document provided (from FlowFile content) will be empty, but sure to set the Client Service controller service's Suppress Null/Empty Values to Never Suppress or no \\\"upsert\\\" doc will be, included in the request to Elasticsearch and the operation will not create a new document for the script to execute against, resulting in a \\\"not_found\\\" error\",\n+                                \"displayName\": \"Scripted Upsert Record Path\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"put-es-record-scripted-upsert-path\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"put-es-record-type-record-path\": {\n+                                \"description\": \"A record path expression to retrieve the type field for use with Elasticsearch. If left blank the type will be determined using the main type property.\",\n+                                \"displayName\": \"Type Record Path\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"put-es-record-type-record-path\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             }\n                         },\n-                        \"readsAttributes\": [\n-                            {\n-                                \"description\": \"The filename of the evtx file\",\n-                                \"name\": \"filename\"\n-                            }\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.processors.elasticsearch.PutElasticsearchJson\"\n                         ],\n-                        \"sideEffectFree\": true,\n+                        \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"Any FlowFile that was successfully converted from evtx to XML\",\n+                                \"description\": \"All flowfiles that fail due to server/cluster availability go to this relationship.\",\n+                                \"name\": \"retry\"\n+                            },\n+                            {\n+                                \"description\": \"All flowfiles that succeed in being transferred into Elasticsearch go here. Documents received by the Elasticsearch _bulk API may still result in errors on the Elasticsearch side. The Elasticsearch response will need to be examined to determine whether any Document(s)/Record(s) resulted in errors.\",\n                                 \"name\": \"success\"\n                             },\n                             {\n-                                \"description\": \"Any FlowFile that encountered an exception during conversion will be transferred to this relationship with as much parsing as possible done\",\n-                                \"name\": \"failure\"\n+                                \"description\": \"If a \\\"Result Record Writer\\\" is set, any Record(s) corresponding to Elasticsearch document(s) that did not result in an \\\"error\\\" (within Elasticsearch) will be routed here.\",\n+                                \"name\": \"successful_records\"\n                             },\n                             {\n-                                \"description\": \"The unmodified input FlowFile will be transferred to this relationship\",\n-                                \"name\": \"original\"\n+                                \"description\": \"All flowfiles that fail for reasons unrelated to server availability go to this relationship.\",\n+                                \"name\": \"failure\"\n                             },\n                             {\n-                                \"description\": \"Any bad chunks of records will be transferred to this relationship in their original binary form\",\n-                                \"name\": \"bad chunk\"\n+                                \"description\": \"If a \\\"Result Record Writer\\\" is set, any Record(s) corresponding to Elasticsearch document(s) that resulted in an \\\"error\\\" (within Elasticsearch) will be routed here.\",\n+                                \"name\": \"errors\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\",\n-                            \"EVENT_DRIVEN\"\n+                            \"CRON_DRIVEN\"\n                         ],\n-                        \"supportsBatching\": true,\n-                        \"supportsDynamicProperties\": false,\n+                        \"supportsBatching\": false,\n+                        \"supportsDynamicProperties\": true,\n                         \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": true,\n+                        \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n+                        \"systemResourceConsiderations\": [\n+                            {\n+                                \"description\": \"The Batch of Records will be stored in memory until the bulk operation is performed.\",\n+                                \"resource\": \"MEMORY\"\n+                            }\n+                        ],\n                         \"tags\": [\n-                            \"event\",\n-                            \"evtx\",\n-                            \"file\",\n-                            \"logs\",\n-                            \"message\",\n-                            \"windows\"\n+                            \"elasticsearch\",\n+                            \"elasticsearch5\",\n+                            \"elasticsearch6\",\n+                            \"elasticsearch7\",\n+                            \"elasticsearch8\",\n+                            \"index\",\n+                            \"json\",\n+                            \"put\",\n+                            \"record\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.evtx.ParseEvtx\",\n-                        \"typeDescription\": \"Parses the contents of a Windows Event Log file (evtx) and writes the resulting XML to the FlowFile\",\n+                        \"type\": \"org.apache.nifi.processors.elasticsearch.PutElasticsearchRecord\",\n+                        \"typeDescription\": \"A record-aware Elasticsearch put processor that uses the official Elastic REST client libraries. Each Record within the FlowFile is converted into a document to be sent to the Elasticsearch _bulk APi. Multiple documents can be batched into each Request sent to Elasticsearch. Each document's Bulk operation can be configured using Record Path expressions.\",\n                         \"version\": \"1.27.0\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"The output filename\",\n-                                \"name\": \"filename\"\n+                                \"description\": \"The error message if there is an issue parsing the FlowFile records, sending the parsed documents to Elasticsearch or parsing the Elasticsearch response.\",\n+                                \"name\": \"elasticsearch.put.error\"\n                             },\n                             {\n-                                \"description\": \"The output filetype (application/xml for success and failure relationships, original value for bad chunk and original relationships)\",\n-                                \"name\": \"mime.type\"\n+                                \"description\": \"The number of records that generated errors in the Elasticsearch _bulk API.\",\n+                                \"name\": \"elasticsearch.put.error.count\"\n+                            },\n+                            {\n+                                \"description\": \"The number of records that were successfully processed by the Elasticsearch _bulk API.\",\n+                                \"name\": \"elasticsearch.put.success.count\"\n+                            },\n+                            {\n+                                \"description\": \"The _bulk response if there was an error during processing the record within Elasticsearch.\",\n+                                \"name\": \"elasticsearch.bulk.error\"\n                             }\n                         ]\n-                    }\n-                ],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"1.27.0\"\n-        },\n-        {\n-            \"artifact\": \"nifi-single-user-iaa-providers-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [],\n-                \"processors\": [],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"1.27.0\"\n-        },\n-        {\n-            \"artifact\": \"nifi-cassandra-services-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [\n+                    },\n                     {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-cassandra-services-nar\",\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-elasticsearch-restapi-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n-                        \"deprecated\": true,\n-                        \"deprecationReason\": \"DataStax 3 driver for Cassandra is no longer the current version and requires new components.\",\n+                        \"defaultBulletinLevel\": \"WARN\",\n+                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": 1,\n+                            \"TIMER_DRIVEN\": 1\n+                        },\n+                        \"defaultPenaltyDuration\": \"30 sec\",\n+                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": \"* * * * * ?\",\n+                            \"TIMER_DRIVEN\": \"1 min\"\n+                        },\n+                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n+                        \"defaultYieldDuration\": \"1 sec\",\n+                        \"dynamicProperties\": [\n+                            {\n+                                \"description\": \"Adds the specified property name/value as a query parameter in the Elasticsearch URL used for processing. These parameters will override any matching parameters in the query request body. For SCROLL type queries, these parameters are only used in the initial (first page) query as the Elasticsearch Scroll API does not support the same query parameters for subsequent pages of data.\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"name\": \"The name of a URL query parameter to add\",\n+                                \"value\": \"The value of the URL query parameter\"\n+                            }\n+                        ],\n                         \"group\": \"org.apache.nifi\",\n+                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n+                        \"primaryNodeOnly\": true,\n                         \"propertyDescriptors\": {\n-                            \"cassandra-dmc-key-field-name\": {\n-                                \"description\": \"The name of the field that acts as the unique key. (The CQL type should be \\\"blob\\\")\",\n-                                \"displayName\": \"Key Field Name\",\n+                            \"el-query-attribute\": {\n+                                \"description\": \"If set, the executed query will be set on each result flowfile in the specified attribute.\",\n+                                \"displayName\": \"Query Attribute\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"cassandra-dmc-key-field-name\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"el-query-attribute\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"cassandra-dmc-session-provider\": {\n-                                \"description\": \"The client service that will configure the cassandra client connection.\",\n-                                \"displayName\": \"Session Provider\",\n+                            \"el-rest-client-service\": {\n+                                \"description\": \"An Elasticsearch client service to use for running queries.\",\n+                                \"displayName\": \"Client Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"cassandra-dmc-session-provider\",\n+                                \"name\": \"el-rest-client-service\",\n                                 \"required\": true,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-cassandra-services-api-nar\",\n+                                    \"artifact\": \"nifi-elasticsearch-client-service-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.cassandra.CassandraSessionProviderService\",\n+                                    \"type\": \"org.apache.nifi.elasticsearch.ElasticSearchClientService\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             },\n-                            \"cassandra-dmc-table-name\": {\n-                                \"description\": \"The name of the table where the cache will be stored.\",\n-                                \"displayName\": \"Table Name\",\n+                            \"el-rest-fetch-index\": {\n+                                \"description\": \"The name of the index to use.\",\n+                                \"displayName\": \"Index\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"cassandra-dmc-table-name\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"el-rest-fetch-index\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"cassandra-dmc-ttl\": {\n-                                \"description\": \"If configured, this will set a TTL (Time to Live) for each row inserted into the table so that old cache items expire after a certain period of time.\",\n-                                \"displayName\": \"TTL\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"cassandra-dmc-ttl\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"cassandra-dmc-value-field-name\": {\n-                                \"description\": \"The name of the field that will store the value. (The CQL type should be \\\"blob\\\")\",\n-                                \"displayName\": \"Value Field Name\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"cassandra-dmc-value-field-name\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            }\n-                        },\n-                        \"providedApiImplementations\": [\n-                            {\n-                                \"artifact\": \"nifi-standard-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.distributed.cache.client.DistributedMapCacheClient\",\n-                                \"version\": \"1.27.0\"\n-                            }\n-                        ],\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"cache\",\n-                            \"cassandra\",\n-                            \"distributed\",\n-                            \"map\"\n-                        ],\n-                        \"type\": \"org.apache.nifi.controller.cassandra.CassandraDistributedMapCache\",\n-                        \"typeDescription\": \"Provides a DistributedMapCache client that is based on Apache Cassandra.\",\n-                        \"version\": \"1.27.0\"\n-                    },\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-cassandra-services-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"e0c4461\"\n-                        },\n-                        \"deprecated\": true,\n-                        \"deprecationReason\": \"DataStax 3 driver for Cassandra is no longer the current version and requires new components.\",\n-                        \"group\": \"org.apache.nifi\",\n-                        \"propertyDescriptors\": {\n-                            \"Cassandra Contact Points\": {\n-                                \"description\": \"Contact points are addresses of Cassandra nodes. The list of contact points should be comma-separated and in hostname:port format. Example node1:port,node2:port,.... The default client port for Cassandra is 9042, but the port(s) must be explicitly specified.\",\n-                                \"displayName\": \"Cassandra Contact Points\",\n+                            \"el-rest-format-aggregations\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"Contains full Elasticsearch Aggregation, including Buckets and Metadata.\",\n+                                        \"displayName\": \"FULL\",\n+                                        \"value\": \"FULL\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Bucket Content only.\",\n+                                        \"displayName\": \"BUCKETS_ONLY\",\n+                                        \"value\": \"BUCKETS_ONLY\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Aggregation Metadata only.\",\n+                                        \"displayName\": \"METADATA_ONLY\",\n+                                        \"value\": \"METADATA_ONLY\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"FULL\",\n+                                \"description\": \"Format of Aggregation output.\",\n+                                \"displayName\": \"Aggregation Results Format\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Cassandra Contact Points\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"el-rest-format-aggregations\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Client Auth\": {\n+                            \"el-rest-format-hits\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"WANT\",\n-                                        \"value\": \"WANT\"\n+                                        \"description\": \"Contains full Elasticsearch Hit, including Document Source and Metadata.\",\n+                                        \"displayName\": \"FULL\",\n+                                        \"value\": \"FULL\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"REQUIRED\",\n-                                        \"value\": \"REQUIRED\"\n+                                        \"description\": \"Document Source only (where present).\",\n+                                        \"displayName\": \"SOURCE_ONLY\",\n+                                        \"value\": \"SOURCE_ONLY\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"NONE\",\n-                                        \"value\": \"NONE\"\n+                                        \"description\": \"Hit Metadata only.\",\n+                                        \"displayName\": \"METADATA_ONLY\",\n+                                        \"value\": \"METADATA_ONLY\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"REQUIRED\",\n-                                \"description\": \"Client authentication policy when connecting to secure (TLS/SSL) cluster. Possible values are REQUIRED, WANT, NONE. This property is only used when an SSL Context has been defined and enabled.\",\n-                                \"displayName\": \"Client Auth\",\n+                                \"defaultValue\": \"FULL\",\n+                                \"description\": \"Format of Hits output.\",\n+                                \"displayName\": \"Search Results Format\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Client Auth\",\n-                                \"required\": false,\n+                                \"name\": \"el-rest-format-hits\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Compression Type\": {\n+                            \"el-rest-output-no-hits\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"NONE\",\n-                                        \"value\": \"NONE\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"SNAPPY\",\n-                                        \"value\": \"SNAPPY\"\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"LZ4\",\n-                                        \"value\": \"LZ4\"\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"NONE\",\n-                                \"description\": \"Enable compression at transport-level requests and responses\",\n-                                \"displayName\": \"Compression Type\",\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"Output a \\\"hits\\\" flowfile even if no hits found for query. If true, an empty \\\"hits\\\" flowfile will be output even if \\\"aggregations\\\" are output.\",\n+                                \"displayName\": \"Output No Hits\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Compression Type\",\n-                                \"required\": false,\n+                                \"name\": \"el-rest-output-no-hits\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Consistency Level\": {\n+                            \"el-rest-pagination-keep-alive\": {\n+                                \"defaultValue\": \"10 mins\",\n+                                \"description\": \"Pagination \\\"keep_alive\\\" period. Period Elasticsearch will keep the scroll/pit cursor alive in between requests (this is not the time expected for all pages to be returned, but the maximum allowed time for requests between page retrievals).\",\n+                                \"displayName\": \"Pagination Keep Alive\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"el-rest-pagination-keep-alive\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"el-rest-pagination-type\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"ANY\",\n-                                        \"value\": \"ANY\"\n+                                        \"description\": \"Use Elasticsearch \\\"_scroll\\\" API to page results. Does not accept additional query parameters.\",\n+                                        \"displayName\": \"SCROLL\",\n+                                        \"value\": \"pagination-scroll\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"ONE\",\n-                                        \"value\": \"ONE\"\n+                                        \"description\": \"Use Elasticsearch \\\"search_after\\\" _search API to page sorted results.\",\n+                                        \"displayName\": \"SEARCH_AFTER\",\n+                                        \"value\": \"pagination-search_after\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"TWO\",\n-                                        \"value\": \"TWO\"\n-                                    },\n+                                        \"description\": \"Use Elasticsearch (7.10+ with XPack) \\\"point in time\\\" _search API to page sorted results.\",\n+                                        \"displayName\": \"POINT_IN_TIME\",\n+                                        \"value\": \"pagination-pit\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"pagination-scroll\",\n+                                \"description\": \"Pagination method to use. Not all types are available for all Elasticsearch versions, check the Elasticsearch docs to confirm which are applicable and recommended for your service.\",\n+                                \"displayName\": \"Pagination Type\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"el-rest-pagination-type\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"el-rest-query\": {\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"THREE\",\n-                                        \"value\": \"THREE\"\n-                                    },\n+                                        \"dependentValues\": [\n+                                            \"full\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Query Definition Style\",\n+                                        \"propertyName\": \"el-rest-query-definition-style\"\n+                                    }\n+                                ],\n+                                \"description\": \"A query in JSON syntax, not Lucene syntax. Ex: {\\\"query\\\":{\\\"match\\\":{\\\"somefield\\\":\\\"somevalue\\\"}}}. If the query is empty, a default JSON Object will be used, which will result in a \\\"match_all\\\" query in Elasticsearch.\",\n+                                \"displayName\": \"Query\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"el-rest-query\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"el-rest-query-clause\": {\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"QUORUM\",\n-                                        \"value\": \"QUORUM\"\n-                                    },\n+                                        \"dependentValues\": [\n+                                            \"build\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Query Definition Style\",\n+                                        \"propertyName\": \"el-rest-query-definition-style\"\n+                                    }\n+                                ],\n+                                \"description\": \"A \\\"query\\\" clause in JSON syntax, not Lucene syntax. Ex: {\\\"match\\\":{\\\"somefield\\\":\\\"somevalue\\\"}}. If the query is empty, a default JSON Object will be used, which will result in a \\\"match_all\\\" query in Elasticsearch.\",\n+                                \"displayName\": \"Query Clause\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"el-rest-query-clause\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"el-rest-query-definition-style\": {\n+                                \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"ALL\",\n-                                        \"value\": \"ALL\"\n+                                        \"description\": \"Provide the full Query.\",\n+                                        \"displayName\": \"FULL_QUERY\",\n+                                        \"value\": \"full\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"LOCAL_QUORUM\",\n-                                        \"value\": \"LOCAL_QUORUM\"\n-                                    },\n+                                        \"description\": \"Build the Query from separate JSON objects.\",\n+                                        \"displayName\": \"BUILD_QUERY\",\n+                                        \"value\": \"build\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"full\",\n+                                \"description\": \"How the JSON Query will be defined for use by the processor.\",\n+                                \"displayName\": \"Query Definition Style\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"el-rest-query-definition-style\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"el-rest-split-up-aggregations\": {\n+                                \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"EACH_QUORUM\",\n-                                        \"value\": \"EACH_QUORUM\"\n+                                        \"description\": \"Flowfile per hit.\",\n+                                        \"displayName\": \"PER_HIT\",\n+                                        \"value\": \"splitUp-yes\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"SERIAL\",\n-                                        \"value\": \"SERIAL\"\n+                                        \"description\": \"Flowfile per response.\",\n+                                        \"displayName\": \"PER_RESPONSE\",\n+                                        \"value\": \"splitUp-no\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"splitUp-no\",\n+                                \"description\": \"Output a flowfile containing all aggregations or one flowfile for each individual aggregation.\",\n+                                \"displayName\": \"Aggregation Results Split\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"el-rest-split-up-aggregations\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"el-rest-split-up-hits\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"Flowfile per hit.\",\n+                                        \"displayName\": \"PER_HIT\",\n+                                        \"value\": \"splitUp-yes\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"LOCAL_SERIAL\",\n-                                        \"value\": \"LOCAL_SERIAL\"\n+                                        \"description\": \"Flowfile per response.\",\n+                                        \"displayName\": \"PER_RESPONSE\",\n+                                        \"value\": \"splitUp-no\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"LOCAL_ONE\",\n-                                        \"value\": \"LOCAL_ONE\"\n+                                        \"description\": \"Combine results from all query responses (one flowfile per entire paginated result set of hits). Note that aggregations cannot be paged, they are generated across the entire result set and returned as part of the first page. Results are output with one JSON object per line (allowing hits to be combined from multiple pages without loading all results into memory).\",\n+                                        \"displayName\": \"PER_QUERY\",\n+                                        \"value\": \"splitUp-query\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"ONE\",\n-                                \"description\": \"The strategy for how many replicas must respond before results are returned.\",\n-                                \"displayName\": \"Consistency Level\",\n+                                \"defaultValue\": \"splitUp-no\",\n+                                \"description\": \"Output a flowfile containing all hits or one flowfile for each individual hit or one flowfile containing all hits from all paged responses.\",\n+                                \"displayName\": \"Search Results Split\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Consistency Level\",\n+                                \"name\": \"el-rest-split-up-hits\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Keyspace\": {\n-                                \"description\": \"The Cassandra Keyspace to connect to. If no keyspace is specified, the query will need to include the keyspace name before any table reference, in case of 'query' native processors or if the processor supports the 'Table' property, the keyspace name has to be provided with the table name in the form of <KEYSPACE>.<TABLE>\",\n-                                \"displayName\": \"Keyspace\",\n+                            \"el-rest-type\": {\n+                                \"description\": \"The type of this document (used by Elasticsearch for indexing and searching).\",\n+                                \"displayName\": \"Type\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Keyspace\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"el-rest-type\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Password\": {\n-                                \"description\": \"Password to access the Cassandra cluster\",\n-                                \"displayName\": \"Password\",\n+                            \"es-rest-query-aggs\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"build\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Query Definition Style\",\n+                                        \"propertyName\": \"el-rest-query-definition-style\"\n+                                    }\n+                                ],\n+                                \"description\": \"One or more query aggregations (or \\\"aggs\\\"), in JSON syntax. Ex: {\\\"items\\\": {\\\"terms\\\": {\\\"field\\\": \\\"product\\\", \\\"size\\\": 10}}}\",\n+                                \"displayName\": \"Aggregations\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Password\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"es-rest-query-aggs\",\n                                 \"required\": false,\n-                                \"sensitive\": true\n+                                \"sensitive\": false\n                             },\n-                            \"SSL Context Service\": {\n-                                \"description\": \"The SSL Context Service used to provide client certificate information for TLS/SSL connections.\",\n-                                \"displayName\": \"SSL Context Service\",\n+                            \"es-rest-query-fields\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"build\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Query Definition Style\",\n+                                        \"propertyName\": \"el-rest-query-definition-style\"\n+                                    }\n+                                ],\n+                                \"description\": \"Fields of indexed documents to be retrieved, in JSON syntax. Ex: [\\\"user.id\\\", \\\"http.response.*\\\", {\\\"field\\\": \\\"@timestamp\\\", \\\"format\\\": \\\"epoch_millis\\\"}]\",\n+                                \"displayName\": \"Fields\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"SSL Context Service\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"es-rest-query-fields\",\n                                 \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n+                                \"sensitive\": false\n                             },\n-                            \"Username\": {\n-                                \"description\": \"Username to access the Cassandra cluster\",\n-                                \"displayName\": \"Username\",\n+                            \"es-rest-query-script-fields\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"build\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Query Definition Style\",\n+                                        \"propertyName\": \"el-rest-query-definition-style\"\n+                                    }\n+                                ],\n+                                \"description\": \"Fields to created using script evaluation at query runtime, in JSON syntax. Ex: {\\\"test1\\\": {\\\"script\\\": {\\\"lang\\\": \\\"painless\\\", \\\"source\\\": \\\"doc['price'].value * 2\\\"}}, \\\"test2\\\": {\\\"script\\\": {\\\"lang\\\": \\\"painless\\\", \\\"source\\\": \\\"doc['price'].value * params.factor\\\", \\\"params\\\": {\\\"factor\\\": 2.0}}}}\",\n+                                \"displayName\": \"Script Fields\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Username\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"es-rest-query-script-fields\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"connect-timeout-ms\": {\n-                                \"description\": \"Connection timeout (in milliseconds). 0 means no timeout. If no value is set, the underlying default will be used.\",\n-                                \"displayName\": \"Connect Timout (ms)\",\n+                            \"es-rest-query-sort\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"build\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Query Definition Style\",\n+                                        \"propertyName\": \"el-rest-query-definition-style\"\n+                                    }\n+                                ],\n+                                \"description\": \"Sort results by one or more fields, in JSON syntax. Ex: [{\\\"price\\\" : {\\\"order\\\" : \\\"asc\\\", \\\"mode\\\" : \\\"avg\\\"}}, {\\\"post_date\\\" : {\\\"format\\\": \\\"strict_date_optional_time_nanos\\\"}}]\",\n+                                \"displayName\": \"Sort\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"connect-timeout-ms\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"es-rest-query-sort\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"read-timeout-ms\": {\n-                                \"description\": \"Read timeout (in milliseconds). 0 means no timeout. If no value is set, the underlying default will be used.\",\n-                                \"displayName\": \"Read Timout (ms)\",\n+                            \"es-rest-size\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"build\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Query Definition Style\",\n+                                        \"propertyName\": \"el-rest-query-definition-style\"\n+                                    }\n+                                ],\n+                                \"description\": \"The maximum number of documents to retrieve in the query. If the query is paginated, this \\\"size\\\" applies to each page of the query, not the \\\"size\\\" of the entire result set.\",\n+                                \"displayName\": \"Size\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"read-timeout-ms\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"es-rest-size\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             }\n                         },\n-                        \"providedApiImplementations\": [\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.processors.elasticsearch.ConsumeElasticsearch\",\n+                            \"org.apache.nifi.processors.elasticsearch.PaginatedJsonQueryElasticsearch\"\n+                        ],\n+                        \"sideEffectFree\": false,\n+                        \"stateful\": {\n+                            \"description\": \"The pagination state (scrollId, searchAfter, pitId, hitCount, pageCount, pageExpirationTimestamp) is retained in between invocations of this processor until the Scroll/PiT has expired (when the current time is later than the last query execution plus the Pagination Keep Alive interval).\",\n+                            \"scopes\": [\n+                                \"LOCAL\"\n+                            ]\n+                        },\n+                        \"supportedRelationships\": [\n                             {\n-                                \"artifact\": \"nifi-cassandra-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.cassandra.CassandraSessionProviderService\",\n-                                \"version\": \"1.27.0\"\n+                                \"description\": \"Aggregations are routed to this relationship.\",\n+                                \"name\": \"aggregations\"\n+                            },\n+                            {\n+                                \"description\": \"Search hits are routed to this relationship.\",\n+                                \"name\": \"hits\"\n                             }\n                         ],\n-                        \"supportsDynamicProperties\": false,\n+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\"\n+                        ],\n+                        \"supportsBatching\": false,\n+                        \"supportsDynamicProperties\": true,\n+                        \"supportsDynamicRelationships\": false,\n+                        \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n+                        \"systemResourceConsiderations\": [\n+                            {\n+                                \"description\": \"Care should be taken on the size of each page because each response from Elasticsearch will be loaded into memory all at once and converted into the resulting flowfiles.\",\n+                                \"resource\": \"MEMORY\"\n+                            }\n+                        ],\n                         \"tags\": [\n-                            \"cassandra\",\n-                            \"connection\",\n-                            \"database\",\n-                            \"dbcp\",\n-                            \"pooling\"\n+                            \"elasticsearch\",\n+                            \"elasticsearch5\",\n+                            \"elasticsearch6\",\n+                            \"elasticsearch7\",\n+                            \"elasticsearch8\",\n+                            \"json\",\n+                            \"page\",\n+                            \"query\",\n+                            \"scroll\",\n+                            \"search\"\n                         ],\n-                        \"type\": \"org.apache.nifi.service.CassandraSessionProvider\",\n-                        \"typeDescription\": \"Provides connection session for Cassandra processors to work with Apache Cassandra.\",\n-                        \"version\": \"1.27.0\"\n-                    }\n-                ],\n-                \"processors\": [],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"1.27.0\"\n-        },\n-        {\n-            \"artifact\": \"nifi-dbcp-service-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [\n+                        \"triggerSerially\": true,\n+                        \"triggerWhenAnyDestinationAvailable\": false,\n+                        \"triggerWhenEmpty\": false,\n+                        \"type\": \"org.apache.nifi.processors.elasticsearch.SearchElasticsearch\",\n+                        \"typeDescription\": \"A processor that allows the user to repeatedly run a paginated query (with aggregations) written with the Elasticsearch JSON DSL. Search After/Point in Time queries must include a valid \\\"sort\\\" field. The processor will retrieve multiple pages of results until either no more results are available or the Pagination Keep Alive expiration is reached, after which the query will restart with the first page of results being retrieved.\",\n+                        \"version\": \"1.27.0\",\n+                        \"writesAttributes\": [\n+                            {\n+                                \"description\": \"application/json\",\n+                                \"name\": \"mime.type\"\n+                            },\n+                            {\n+                                \"description\": \"The name of the aggregation whose results are in the output flowfile\",\n+                                \"name\": \"aggregation.name\"\n+                            },\n+                            {\n+                                \"description\": \"The number of the aggregation whose results are in the output flowfile\",\n+                                \"name\": \"aggregation.number\"\n+                            },\n+                            {\n+                                \"description\": \"The number of the page (request), starting from 1, in which the results were returned that are in the output flowfile\",\n+                                \"name\": \"page.number\"\n+                            },\n+                            {\n+                                \"description\": \"The number of hits that are in the output flowfile\",\n+                                \"name\": \"hit.count\"\n+                            },\n+                            {\n+                                \"description\": \"The error message provided by Elasticsearch if there is an error querying the index.\",\n+                                \"name\": \"elasticsearch.query.error\"\n+                            }\n+                        ]\n+                    },\n                     {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-dbcp-service-nar\",\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-elasticsearch-restapi-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n+                        \"defaultBulletinLevel\": \"WARN\",\n+                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": 1,\n+                            \"TIMER_DRIVEN\": 1\n+                        },\n+                        \"defaultPenaltyDuration\": \"30 sec\",\n+                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": \"* * * * * ?\",\n+                            \"TIMER_DRIVEN\": \"0 sec\"\n+                        },\n+                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n+                        \"defaultYieldDuration\": \"1 sec\",\n                         \"dynamicProperties\": [\n                             {\n-                                \"description\": \"JDBC driver property name and value applied to JDBC connections.\",\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"name\": \"JDBC property name\",\n-                                \"value\": \"JDBC property value\"\n-                            },\n-                            {\n-                                \"description\": \"JDBC driver property name prefixed with 'SENSITIVE.' handled as a sensitive property.\",\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"name\": \"SENSITIVE.JDBC property name\",\n-                                \"value\": \"JDBC property value\"\n-                            }\n-                        ],\n-                        \"explicitRestrictions\": [\n-                            {\n-                                \"explanation\": \"Database Driver Location can reference resources over HTTP\",\n-                                \"requiredPermission\": \"reference remote resources\"\n+                                \"description\": \"Adds the specified property name/value as a query parameter in the Elasticsearch URL used for processing. These parameters will override any matching parameters in the query request body\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"name\": \"The name of a URL query parameter to add\",\n+                                \"value\": \"The value of the URL query parameter\"\n                             }\n                         ],\n                         \"group\": \"org.apache.nifi\",\n+                        \"inputRequirement\": \"INPUT_ALLOWED\",\n+                        \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Database Connection URL\": {\n-                                \"description\": \"A database connection URL used to connect to a database. May contain database system name, host, port, database name and some parameters. The exact syntax of a database connection URL is specified by your DBMS.\",\n-                                \"displayName\": \"Database Connection URL\",\n+                            \"el-query-attribute\": {\n+                                \"description\": \"If set, the executed query will be set on each result flowfile in the specified attribute.\",\n+                                \"displayName\": \"Query Attribute\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Database Connection URL\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"el-query-attribute\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Database Driver Class Name\": {\n-                                \"description\": \"Database driver class name\",\n-                                \"displayName\": \"Database Driver Class Name\",\n+                            \"el-rest-client-service\": {\n+                                \"description\": \"An Elasticsearch client service to use for running queries.\",\n+                                \"displayName\": \"Client Service\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Database Driver Class Name\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"el-rest-client-service\",\n+                                \"required\": true,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-elasticsearch-client-service-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.elasticsearch.ElasticSearchClientService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"el-rest-fetch-index\": {\n+                                \"description\": \"The name of the index to use.\",\n+                                \"displayName\": \"Index\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"el-rest-fetch-index\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Database User\": {\n-                                \"description\": \"Database user name\",\n-                                \"displayName\": \"Database User\",\n+                            \"el-rest-query\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"full\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Query Definition Style\",\n+                                        \"propertyName\": \"el-rest-query-definition-style\"\n+                                    }\n+                                ],\n+                                \"description\": \"A query in JSON syntax, not Lucene syntax. Ex: {\\\"query\\\":{\\\"match\\\":{\\\"somefield\\\":\\\"somevalue\\\"}}}. If this parameter is not set, the query will be read from the flowfile content. If the query (property and flowfile content) is empty, a default empty JSON Object will be used, which will result in a \\\"match_all\\\" query in Elasticsearch.\",\n+                                \"displayName\": \"Query\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Database User\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"el-rest-query\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Max Total Connections\": {\n-                                \"defaultValue\": \"8\",\n-                                \"description\": \"The maximum number of active connections that can be allocated from this pool at the same time,  or negative for no limit.\",\n-                                \"displayName\": \"Max Total Connections\",\n+                            \"el-rest-query-clause\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"build\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Query Definition Style\",\n+                                        \"propertyName\": \"el-rest-query-definition-style\"\n+                                    }\n+                                ],\n+                                \"description\": \"A \\\"query\\\" clause in JSON syntax, not Lucene syntax. Ex: {\\\"match\\\":{\\\"somefield\\\":\\\"somevalue\\\"}}. If the query is empty, a default JSON Object will be used, which will result in a \\\"match_all\\\" query in Elasticsearch.\",\n+                                \"displayName\": \"Query Clause\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Max Total Connections\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"el-rest-query-clause\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Max Wait Time\": {\n-                                \"defaultValue\": \"500 millis\",\n-                                \"description\": \"The maximum amount of time that the pool will wait (when there are no available connections)  for a connection to be returned before failing, or -1 to wait indefinitely. \",\n-                                \"displayName\": \"Max Wait Time\",\n+                            \"el-rest-query-definition-style\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"Provide the full Query.\",\n+                                        \"displayName\": \"FULL_QUERY\",\n+                                        \"value\": \"full\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Build the Query from separate JSON objects.\",\n+                                        \"displayName\": \"BUILD_QUERY\",\n+                                        \"value\": \"build\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"full\",\n+                                \"description\": \"How the JSON Query will be defined for use by the processor.\",\n+                                \"displayName\": \"Query Definition Style\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Max Wait Time\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"el-rest-query-definition-style\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Password\": {\n-                                \"description\": \"The password for the database user\",\n-                                \"displayName\": \"Password\",\n+                            \"el-rest-script\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"build\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Query Definition Style\",\n+                                        \"propertyName\": \"el-rest-query-definition-style\"\n+                                    }\n+                                ],\n+                                \"description\": \"A \\\"script\\\" to execute during the operation, in JSON syntax. Ex: {\\\"source\\\": \\\"ctx._source.count++\\\", \\\"lang\\\": \\\"painless\\\"}\",\n+                                \"displayName\": \"Script\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Password\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"el-rest-script\",\n                                 \"required\": false,\n-                                \"sensitive\": true\n+                                \"sensitive\": false\n                             },\n-                            \"Validation-query\": {\n-                                \"description\": \"Validation query used to validate connections before returning them. When connection is invalid, it gets dropped and new valid connection will be returned. Note!! Using validation might have some performance penalty.\",\n-                                \"displayName\": \"Validation query\",\n+                            \"el-rest-type\": {\n+                                \"description\": \"The type of this document (used by Elasticsearch for indexing and searching).\",\n+                                \"displayName\": \"Type\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Validation-query\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"el-rest-type\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n+                            }\n+                        },\n+                        \"sideEffectFree\": false,\n+                        \"supportedRelationships\": [\n+                            {\n+                                \"description\": \"All flowfiles that fail due to server/cluster availability go to this relationship.\",\n+                                \"name\": \"retry\"\n                             },\n-                            \"database-driver-locations\": {\n-                                \"description\": \"Comma-separated list of files/folders and/or URLs containing the driver JAR and its dependencies (if any). For example '/var/tmp/mariadb-java-client-1.1.7.jar'\",\n-                                \"displayName\": \"Database Driver Location(s)\",\n+                            {\n+                                \"description\": \"If the \\\"by query\\\" operation succeeds, and a flowfile was read, it will be sent to this relationship.\",\n+                                \"name\": \"success\"\n+                            },\n+                            {\n+                                \"description\": \"If the \\\"by query\\\" operation fails, and a flowfile was read, it will be sent to this relationship.\",\n+                                \"name\": \"failure\"\n+                            }\n+                        ],\n+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\"\n+                        ],\n+                        \"supportsBatching\": false,\n+                        \"supportsDynamicProperties\": true,\n+                        \"supportsDynamicRelationships\": false,\n+                        \"supportsEventDriven\": false,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"elastic\",\n+                            \"elasticsearch\",\n+                            \"elasticsearch5\",\n+                            \"elasticsearch6\",\n+                            \"elasticsearch7\",\n+                            \"elasticsearch8\",\n+                            \"query\",\n+                            \"update\"\n+                        ],\n+                        \"triggerSerially\": false,\n+                        \"triggerWhenAnyDestinationAvailable\": false,\n+                        \"triggerWhenEmpty\": false,\n+                        \"type\": \"org.apache.nifi.processors.elasticsearch.UpdateByQueryElasticsearch\",\n+                        \"typeDescription\": \"Update documents in an Elasticsearch index using a query. The query can be loaded from a flowfile body or from the Query parameter. The loaded Query can contain any JSON accepted by Elasticsearch's _update_by_query API, for example a \\\"query\\\" object to identify what documents are to be updated, plus a \\\"script\\\" to define the updates to perform.\",\n+                        \"version\": \"1.27.0\",\n+                        \"writesAttributes\": [\n+                            {\n+                                \"description\": \"The amount of time that it took to complete the update operation in ms.\",\n+                                \"name\": \"elasticsearch.update.took\"\n+                            },\n+                            {\n+                                \"description\": \"The error message provided by Elasticsearch if there is an error running the update.\",\n+                                \"name\": \"elasticsearch.update.error\"\n+                            }\n+                        ]\n+                    }\n+                ],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"1.27.0\"\n+        },\n+        {\n+            \"artifact\": \"nifi-enrich-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [],\n+                \"processors\": [\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-enrich-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"e0c4461\"\n+                        },\n+                        \"defaultBulletinLevel\": \"WARN\",\n+                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": 1,\n+                            \"EVENT_DRIVEN\": 0,\n+                            \"TIMER_DRIVEN\": 1\n+                        },\n+                        \"defaultPenaltyDuration\": \"30 sec\",\n+                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": \"* * * * * ?\",\n+                            \"TIMER_DRIVEN\": \"0 sec\"\n+                        },\n+                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n+                        \"defaultYieldDuration\": \"1 sec\",\n+                        \"group\": \"org.apache.nifi\",\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n+                        \"primaryNodeOnly\": false,\n+                        \"propertyDescriptors\": {\n+                            \"Geo Database File\": {\n+                                \"description\": \"Path to Maxmind IP Enrichment Database File\",\n+                                \"displayName\": \"MaxMind Database File\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"database-driver-locations\",\n-                                \"required\": false,\n+                                \"name\": \"Geo Database File\",\n+                                \"required\": true,\n                                 \"resourceDefinition\": {\n-                                    \"cardinality\": \"MULTIPLE\",\n+                                    \"cardinality\": \"SINGLE\",\n                                     \"resourceTypes\": [\n-                                        \"FILE\",\n                                         \"DIRECTORY\",\n-                                        \"URL\"\n+                                        \"FILE\"\n                                     ]\n                                 },\n                                 \"sensitive\": false\n                             },\n-                            \"dbcp-max-conn-lifetime\": {\n-                                \"defaultValue\": \"-1\",\n-                                \"description\": \"The maximum lifetime of a connection. After this time is exceeded the connection will fail the next activation, passivation or validation test. A value of zero or less means the connection has an infinite lifetime.\",\n-                                \"displayName\": \"Max Connection Lifetime\",\n+                            \"IP Address Attribute\": {\n+                                \"description\": \"The name of an attribute whose value is a dotted decimal IP address for which enrichment should occur\",\n+                                \"displayName\": \"IP Address Attribute\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"dbcp-max-conn-lifetime\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"IP Address Attribute\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"dbcp-max-idle-conns\": {\n-                                \"defaultValue\": \"8\",\n-                                \"description\": \"The maximum number of connections that can remain idle in the pool without extra ones being released. Set to any negative value to allow unlimited idle connections.\",\n-                                \"displayName\": \"Max Idle Connections\",\n+                            \"Log Level\": {\n+                                \"defaultValue\": \"WARN\",\n+                                \"description\": \"The Log Level to use when an IP is not found in the database. Accepted values: INFO, DEBUG, WARN, ERROR.\",\n+                                \"displayName\": \"Log Level\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"dbcp-max-idle-conns\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Log Level\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n+                            }\n+                        },\n+                        \"sideEffectFree\": true,\n+                        \"supportedRelationships\": [\n+                            {\n+                                \"description\": \"Where to route flow files after unsuccessfully enriching attributes because no data was found\",\n+                                \"name\": \"not found\"\n                             },\n-                            \"dbcp-min-evictable-idle-time\": {\n-                                \"defaultValue\": \"30 mins\",\n-                                \"description\": \"The minimum amount of time a connection may sit idle in the pool before it is eligible for eviction.\",\n-                                \"displayName\": \"Minimum Evictable Idle Time\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"dbcp-min-evictable-idle-time\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n+                            {\n+                                \"description\": \"Where to route flow files after successfully enriching attributes with data provided by database\",\n+                                \"name\": \"found\"\n+                            }\n+                        ],\n+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\",\n+                            \"EVENT_DRIVEN\"\n+                        ],\n+                        \"supportsBatching\": true,\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicRelationships\": false,\n+                        \"supportsEventDriven\": true,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"enrich\",\n+                            \"geo\",\n+                            \"ip\",\n+                            \"maxmind\"\n+                        ],\n+                        \"triggerSerially\": false,\n+                        \"triggerWhenAnyDestinationAvailable\": false,\n+                        \"triggerWhenEmpty\": false,\n+                        \"type\": \"org.apache.nifi.processors.GeoEnrichIP\",\n+                        \"typeDescription\": \"Looks up geolocation information for an IP address and adds the geo information to FlowFile attributes. The geo data is provided as a MaxMind database. The attribute that contains the IP address to lookup is provided by the 'IP Address Attribute' property. If the name of the attribute provided is 'X', then the the attributes added by enrichment will take the form X.geo.<fieldName>\",\n+                        \"version\": \"1.27.0\",\n+                        \"writesAttributes\": [\n+                            {\n+                                \"description\": \"The number of microseconds that the geo lookup took\",\n+                                \"name\": \"X.geo.lookup.micros\"\n                             },\n-                            \"dbcp-min-idle-conns\": {\n-                                \"defaultValue\": \"0\",\n-                                \"description\": \"The minimum number of connections that can remain idle in the pool without extra ones being created. Set to or zero to allow no idle connections.\",\n-                                \"displayName\": \"Minimum Idle Connections\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"dbcp-min-idle-conns\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n+                            {\n+                                \"description\": \"The city identified for the IP address\",\n+                                \"name\": \"X.geo.city\"\n                             },\n-                            \"dbcp-soft-min-evictable-idle-time\": {\n-                                \"defaultValue\": \"-1\",\n-                                \"description\": \"The minimum amount of time a connection may sit idle in the pool before it is eligible for eviction by the idle connection evictor, with the extra condition that at least a minimum number of idle connections remain in the pool. When the not-soft version of this option is set to a positive value, it is examined first by the idle connection evictor: when idle connections are visited by the evictor, idle time is first compared against it (without considering the number of idle connections in the pool) and then against this soft option, including the minimum idle connections constraint.\",\n-                                \"displayName\": \"Soft Minimum Evictable Idle Time\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"dbcp-soft-min-evictable-idle-time\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n+                            {\n+                                \"description\": \"The accuracy radius if provided by the database (in Kilometers)\",\n+                                \"name\": \"X.geo.accuracy\"\n                             },\n-                            \"dbcp-time-between-eviction-runs\": {\n-                                \"defaultValue\": \"-1\",\n-                                \"description\": \"The time period to sleep between runs of the idle connection evictor thread. When non-positive, no idle connection evictor thread will be run.\",\n-                                \"displayName\": \"Time Between Eviction Runs\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"dbcp-time-between-eviction-runs\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n+                            {\n+                                \"description\": \"The latitude identified for this IP address\",\n+                                \"name\": \"X.geo.latitude\"\n                             },\n-                            \"kerberos-credentials-service\": {\n-                                \"description\": \"Specifies the Kerberos Credentials Controller Service that should be used for authenticating with Kerberos\",\n-                                \"displayName\": \"Kerberos Credentials Service\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"kerberos-credentials-service\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.kerberos.KerberosCredentialsService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n+                            {\n+                                \"description\": \"The longitude identified for this IP address\",\n+                                \"name\": \"X.geo.longitude\"\n                             },\n-                            \"kerberos-password\": {\n-                                \"description\": \"The password to use when specifying the principal and password directly in the processor for authenticating via Kerberos.\",\n-                                \"displayName\": \"Kerberos Password\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"kerberos-password\",\n-                                \"required\": false,\n-                                \"sensitive\": true\n+                            {\n+                                \"description\": \"Each subdivision that is identified for this IP address is added with a one-up number appended to the attribute name, starting with 0\",\n+                                \"name\": \"X.geo.subdivision.N\"\n                             },\n-                            \"kerberos-principal\": {\n-                                \"description\": \"The principal to use when specifying the principal and password directly in the processor for authenticating via Kerberos.\",\n-                                \"displayName\": \"Kerberos Principal\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"kerberos-principal\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n+                            {\n+                                \"description\": \"The ISO code for the subdivision that is identified by X.geo.subdivision.N\",\n+                                \"name\": \"X.geo.subdivision.isocode.N\"\n                             },\n-                            \"kerberos-user-service\": {\n-                                \"description\": \"Specifies the Kerberos User Controller Service that should be used for authenticating with Kerberos\",\n-                                \"displayName\": \"Kerberos User Service\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"kerberos-user-service\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.kerberos.KerberosUserService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            }\n-                        },\n-                        \"providedApiImplementations\": [\n                             {\n-                                \"artifact\": \"nifi-standard-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.dbcp.DBCPService\",\n-                                \"version\": \"1.27.0\"\n-                            }\n-                        ],\n-                        \"restricted\": true,\n-                        \"supportsDynamicProperties\": true,\n-                        \"supportsSensitiveDynamicProperties\": true,\n-                        \"tags\": [\n-                            \"connection\",\n-                            \"database\",\n-                            \"dbcp\",\n-                            \"jdbc\",\n-                            \"pooling\",\n-                            \"store\"\n-                        ],\n-                        \"type\": \"org.apache.nifi.dbcp.DBCPConnectionPool\",\n-                        \"typeDescription\": \"Provides Database Connection Pooling Service. Connections can be asked from pool and returned after usage.\",\n-                        \"version\": \"1.27.0\"\n-                    },\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-dbcp-service-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"e0c4461\"\n-                        },\n-                        \"dynamicProperties\": [\n+                                \"description\": \"The country identified for this IP address\",\n+                                \"name\": \"X.geo.country\"\n+                            },\n                             {\n-                                \"description\": \"If 'database.name' attribute contains the name of the dynamic property, then the DBCPService (registered in the value) will be selected.\",\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"name\": \"The name to register DBCPService\",\n-                                \"value\": \"The DBCPService\"\n-                            }\n-                        ],\n-                        \"group\": \"org.apache.nifi\",\n-                        \"providedApiImplementations\": [\n+                                \"description\": \"The ISO Code for the country identified\",\n+                                \"name\": \"X.geo.country.isocode\"\n+                            },\n                             {\n-                                \"artifact\": \"nifi-standard-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.dbcp.DBCPService\",\n-                                \"version\": \"1.27.0\"\n+                                \"description\": \"The postal code for the country identified\",\n+                                \"name\": \"X.geo.postalcode\"\n                             }\n-                        ],\n-                        \"supportsDynamicProperties\": true,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"connection\",\n-                            \"database\",\n-                            \"dbcp\",\n-                            \"jdbc\",\n-                            \"pooling\",\n-                            \"store\"\n-                        ],\n-                        \"type\": \"org.apache.nifi.dbcp.DBCPConnectionPoolLookup\",\n-                        \"typeDescription\": \"Provides a DBCPService that can be used to dynamically select another DBCPService. This service requires an attribute named 'database.name' to be passed in when asking for a connection, and will throw an exception if the attribute is missing. The value of 'database.name' will be used to select the DBCPService that has been registered with that name. This will allow multiple DBCPServices to be defined and registered, and then selected dynamically at runtime by tagging flow files with the appropriate 'database.name' attribute.\",\n-                        \"version\": \"1.27.0\"\n+                        ]\n                     },\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-dbcp-service-nar\",\n+                        \"artifact\": \"nifi-enrich-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n-                        \"dynamicProperties\": [\n-                            {\n-                                \"description\": \"Specifies a property name and value to be set on the JDBC connection(s). If Expression Language is used, evaluation will be performed upon the controller service being enabled. Note that no flow file input (attributes, e.g.) is available for use in Expression Language constructs for these properties.\",\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"name\": \"JDBC property name\",\n-                                \"value\": \"JDBC property value\"\n-                            }\n-                        ],\n-                        \"explicitRestrictions\": [\n-                            {\n-                                \"explanation\": \"Database Driver Location can reference resources over HTTP\",\n-                                \"requiredPermission\": \"reference remote resources\"\n-                            }\n-                        ],\n+                        \"defaultBulletinLevel\": \"WARN\",\n+                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": 1,\n+                            \"TIMER_DRIVEN\": 1\n+                        },\n+                        \"defaultPenaltyDuration\": \"30 sec\",\n+                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": \"* * * * * ?\",\n+                            \"TIMER_DRIVEN\": \"0 sec\"\n+                        },\n+                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n+                        \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n+                        \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"hikaricp-connection-url\": {\n-                                \"description\": \"A database connection URL used to connect to a database. May contain database system name, host, port, database name and some parameters. The exact syntax of a database connection URL is specified by your DBMS.\",\n-                                \"displayName\": \"Database Connection URL\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"hikaricp-connection-url\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"hikaricp-driver-classname\": {\n-                                \"description\": \"The fully-qualified class name of the JDBC driver. Example: com.mysql.jdbc.Driver\",\n-                                \"displayName\": \"Database Driver Class Name\",\n+                            \"Geo Database File\": {\n+                                \"description\": \"Path to Maxmind IP Enrichment Database File\",\n+                                \"displayName\": \"MaxMind Database File\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"hikaricp-driver-classname\",\n+                                \"name\": \"Geo Database File\",\n                                 \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"hikaricp-driver-locations\": {\n-                                \"description\": \"Comma-separated list of files/folders and/or URLs containing the driver JAR and its dependencies (if any). For example '/var/tmp/mariadb-java-client-1.1.7.jar'\",\n-                                \"displayName\": \"Database Driver Location(s)\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"hikaricp-driver-locations\",\n-                                \"required\": false,\n                                 \"resourceDefinition\": {\n-                                    \"cardinality\": \"MULTIPLE\",\n+                                    \"cardinality\": \"SINGLE\",\n                                     \"resourceTypes\": [\n-                                        \"FILE\",\n                                         \"DIRECTORY\",\n-                                        \"URL\"\n+                                        \"FILE\"\n                                     ]\n                                 },\n                                 \"sensitive\": false\n                             },\n-                            \"hikaricp-kerberos-user-service\": {\n-                                \"description\": \"Specifies the Kerberos User Controller Service that should be used for authenticating with Kerberos\",\n-                                \"displayName\": \"Kerberos User Service\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"hikaricp-kerberos-user-service\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.kerberos.KerberosUserService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            },\n-                            \"hikaricp-max-conn-lifetime\": {\n-                                \"defaultValue\": \"-1\",\n-                                \"description\": \"The maximum lifetime of a connection. After this time is exceeded the connection will fail the next activation, passivation or validation test. A value of zero or less means the connection has an infinite lifetime.\",\n-                                \"displayName\": \"Max Connection Lifetime\",\n+                            \"Log Level\": {\n+                                \"defaultValue\": \"WARN\",\n+                                \"description\": \"The Log Level to use when an IP is not found in the database. Accepted values: INFO, DEBUG, WARN, ERROR.\",\n+                                \"displayName\": \"Log Level\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"hikaricp-max-conn-lifetime\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Log Level\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"hikaricp-max-total-conns\": {\n-                                \"defaultValue\": \"10\",\n-                                \"description\": \"This property controls the maximum size that the pool is allowed to reach, including both idle and in-use connections. Basically this value will determine the maximum number of actual connections to the database backend. A reasonable value for this is best determined by your execution environment. When the pool reaches this size, and no idle connections are available, the service will block for up to connectionTimeout milliseconds before timing out.\",\n-                                \"displayName\": \"Max Total Connections\",\n+                            \"geo-enrich-ip-city-record-path\": {\n+                                \"description\": \"Record path for putting the city identified for the IP address\",\n+                                \"displayName\": \"City Record Path\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"hikaricp-max-total-conns\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"geo-enrich-ip-city-record-path\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"hikaricp-max-wait-time\": {\n-                                \"defaultValue\": \"500 millis\",\n-                                \"description\": \"The maximum amount of time that the pool will wait (when there are no available connections)  for a connection to be returned before failing, or 0 <time units> to wait indefinitely. \",\n-                                \"displayName\": \"Max Wait Time\",\n+                            \"geo-enrich-ip-country-iso-record-path\": {\n+                                \"description\": \"Record path for putting the ISO Code for the country identified\",\n+                                \"displayName\": \"Country ISO Code Record Path\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"hikaricp-max-wait-time\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"geo-enrich-ip-country-iso-record-path\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"hikaricp-min-idle-conns\": {\n-                                \"defaultValue\": \"10\",\n-                                \"description\": \"This property controls the minimum number of idle connections that HikariCP tries to maintain in the pool. If the idle connections dip below this value and total connections in the pool are less than 'Max Total Connections', HikariCP will make a best effort to add additional connections quickly and efficiently. It is recommended that this property to be set equal to 'Max Total Connections'.\",\n-                                \"displayName\": \"Minimum Idle Connections\",\n+                            \"geo-enrich-ip-country-postal-record-path\": {\n+                                \"description\": \"Record path for putting the postal code for the country identified\",\n+                                \"displayName\": \"Country Postal Code Record Path\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"hikaricp-min-idle-conns\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"geo-enrich-ip-country-postal-record-path\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"hikaricp-password\": {\n-                                \"description\": \"The password for the database user\",\n-                                \"displayName\": \"Password\",\n+                            \"geo-enrich-ip-country-record-path\": {\n+                                \"description\": \"Record path for putting the country identified for this IP address\",\n+                                \"displayName\": \"Country Record Path\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"hikaricp-password\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"geo-enrich-ip-country-record-path\",\n                                 \"required\": false,\n-                                \"sensitive\": true\n+                                \"sensitive\": false\n                             },\n-                            \"hikaricp-username\": {\n-                                \"description\": \"Database user name\",\n-                                \"displayName\": \"Database User\",\n+                            \"geo-enrich-ip-ip-record-path\": {\n+                                \"description\": \"The record path to retrieve the IP address for doing the lookup.\",\n+                                \"displayName\": \"IP Address Record Path\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"hikaricp-username\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"geo-enrich-ip-ip-record-path\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"hikaricp-validation-query\": {\n-                                \"description\": \"Validation Query used to validate connections before returning them. When connection is invalid, it gets dropped and new valid connection will be returned. NOTE: Using validation might have some performance penalty.\",\n-                                \"displayName\": \"Validation Query\",\n+                            \"geo-enrich-ip-latitude-record-path\": {\n+                                \"description\": \"Record path for putting the latitude identified for this IP address\",\n+                                \"displayName\": \"Latitude Record Path\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"hikaricp-validation-query\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"geo-enrich-ip-latitude-record-path\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n-                            }\n-                        },\n-                        \"providedApiImplementations\": [\n-                            {\n-                                \"artifact\": \"nifi-standard-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.dbcp.DBCPService\",\n-                                \"version\": \"1.27.0\"\n-                            }\n-                        ],\n-                        \"restricted\": true,\n-                        \"supportsDynamicProperties\": true,\n-                        \"supportsSensitiveDynamicProperties\": true,\n-                        \"tags\": [\n-                            \"connection\",\n-                            \"database\",\n-                            \"dbcp\",\n-                            \"hikari\",\n-                            \"jdbc\",\n-                            \"pooling\",\n-                            \"store\"\n-                        ],\n-                        \"type\": \"org.apache.nifi.dbcp.HikariCPConnectionPool\",\n-                        \"typeDescription\": \"Provides Database Connection Pooling Service based on HikariCP. Connections can be asked from pool and returned after usage.\",\n-                        \"version\": \"1.27.0\"\n-                    },\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-dbcp-service-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"e0c4461\"\n-                        },\n-                        \"group\": \"org.apache.nifi\",\n-                        \"propertyDescriptors\": {\n-                            \"db-record-sink-catalog-name\": {\n-                                \"description\": \"The name of the catalog that the statement should update. This may not apply for the database that you are updating. In this case, leave the field empty\",\n-                                \"displayName\": \"Catalog Name\",\n+                            },\n+                            \"geo-enrich-ip-longitude-record-path\": {\n+                                \"description\": \"Record path for putting the longitude identified for this IP address\",\n+                                \"displayName\": \"Longitude Record Path\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"db-record-sink-catalog-name\",\n+                                \"name\": \"geo-enrich-ip-longitude-record-path\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"db-record-sink-dcbp-service\": {\n-                                \"description\": \"The Controller Service that is used to obtain a connection to the database for sending records.\",\n-                                \"displayName\": \"Database Connection Pooling Service\",\n+                            \"geo-enrich-ip-record-reader\": {\n+                                \"description\": \"Record reader service to use for reading the flowfile contents.\",\n+                                \"displayName\": \"Record Reader\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"db-record-sink-dcbp-service\",\n+                                \"name\": \"geo-enrich-ip-record-reader\",\n                                 \"required\": true,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n                                     \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.dbcp.DBCPService\",\n+                                    \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             },\n-                            \"db-record-sink-query-timeout\": {\n-                                \"defaultValue\": \"0 seconds\",\n-                                \"description\": \"The maximum amount of time allowed for a running SQL statement , zero means there is no limit. Max time less than 1 second will be equal to zero.\",\n-                                \"displayName\": \"Max Wait Time\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"db-record-sink-query-timeout\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"db-record-sink-quoted-identifiers\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"Enabling this option will cause all column names to be quoted, allowing you to use reserved words as column names in your tables.\",\n-                                \"displayName\": \"Quote Column Identifiers\",\n+                            \"geo-enrich-ip-record-writer\": {\n+                                \"description\": \"Record writer service to use for enriching the flowfile contents.\",\n+                                \"displayName\": \"Record Writer\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"db-record-sink-quoted-identifiers\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n+                                \"name\": \"geo-enrich-ip-record-writer\",\n+                                \"required\": true,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n                             },\n-                            \"db-record-sink-quoted-table-identifiers\": {\n+                            \"geo-enrich-ip-split-found-not-found\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"true\",\n                                         \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"false\",\n                                         \"value\": \"false\"\n                                     }\n                                 ],\n                                 \"defaultValue\": \"false\",\n-                                \"description\": \"Enabling this option will cause the table name to be quoted to support the use of special characters in the table name.\",\n-                                \"displayName\": \"Quote Table Identifiers\",\n+                                \"description\": \"Separate records that have been enriched from ones that have not. Default behavior is to send everything to the found relationship if even one record is enriched.\",\n+                                \"displayName\": \"Separate Enriched From Not Enriched\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"db-record-sink-quoted-table-identifiers\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"db-record-sink-schema-name\": {\n-                                \"description\": \"The name of the schema that the table belongs to. This may not apply for the database that you are updating. In this case, leave the field empty\",\n-                                \"displayName\": \"Schema Name\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"db-record-sink-schema-name\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"db-record-sink-table-name\": {\n-                                \"description\": \"The name of the table that the statement should affect.\",\n-                                \"displayName\": \"Table Name\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"db-record-sink-table-name\",\n+                                \"name\": \"geo-enrich-ip-split-found-not-found\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n-                            },\n-                            \"db-record-sink-translate-field-names\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"true\",\n-                                \"description\": \"If true, the Processor will attempt to translate field names into the appropriate column names for the table specified. If false, the field names must match the column names exactly, or the column will not be updated\",\n-                                \"displayName\": \"Translate Field Names\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"db-record-sink-translate-field-names\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"db-record-sink-unmatched-column-behavior\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"Any column in the database that does not have a field in the document will be assumed to not be required.  No notification will be logged\",\n-                                        \"displayName\": \"Ignore Unmatched Columns\",\n-                                        \"value\": \"Ignore Unmatched Columns\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Any column in the database that does not have a field in the document will be assumed to not be required.  A warning will be logged\",\n-                                        \"displayName\": \"Warn on Unmatched Columns\",\n-                                        \"value\": \"Warn on Unmatched Columns\"\n-                                    },\n-                                    {\n-                                        \"description\": \"A flow will fail if any column in the database that does not have a field in the document.  An error will be logged\",\n-                                        \"displayName\": \"Fail on Unmatched Columns\",\n-                                        \"value\": \"Fail on Unmatched Columns\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"Fail on Unmatched Columns\",\n-                                \"description\": \"If an incoming record does not have a field mapping for all of the database table's columns, this property specifies how to handle the situation\",\n-                                \"displayName\": \"Unmatched Column Behavior\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"db-record-sink-unmatched-column-behavior\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"db-record-sink-unmatched-field-behavior\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"Any field in the document that cannot be mapped to a column in the database is ignored\",\n-                                        \"displayName\": \"Ignore Unmatched Fields\",\n-                                        \"value\": \"Ignore Unmatched Fields\"\n-                                    },\n-                                    {\n-                                        \"description\": \"If the document has any field that cannot be mapped to a column in the database, the FlowFile will be routed to the failure relationship\",\n-                                        \"displayName\": \"Fail on Unmatched Fields\",\n-                                        \"value\": \"Fail on Unmatched Fields\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"Ignore Unmatched Fields\",\n-                                \"description\": \"If an incoming record has a field that does not map to any of the database table's columns, this property specifies how to handle the situation\",\n-                                \"displayName\": \"Unmatched Field Behavior\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"db-record-sink-unmatched-field-behavior\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n                             }\n                         },\n-                        \"providedApiImplementations\": [\n+                        \"sideEffectFree\": false,\n+                        \"supportedRelationships\": [\n                             {\n-                                \"artifact\": \"nifi-standard-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.record.sink.RecordSinkService\",\n-                                \"version\": \"1.27.0\"\n+                                \"description\": \"Where to route flow files after unsuccessfully enriching attributes because no data was found\",\n+                                \"name\": \"not found\"\n+                            },\n+                            {\n+                                \"description\": \"The original input flowfile goes to this relationship regardless of whether the content was enriched or not.\",\n+                                \"name\": \"original\"\n+                            },\n+                            {\n+                                \"description\": \"Where to route flow files after successfully enriching attributes with data provided by database\",\n+                                \"name\": \"found\"\n                             }\n                         ],\n+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\"\n+                        ],\n+                        \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicRelationships\": false,\n+                        \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"connection\",\n-                            \"database\",\n-                            \"db\",\n-                            \"jdbc\",\n+                            \"enrich\",\n+                            \"geo\",\n+                            \"ip\",\n+                            \"maxmind\",\n                             \"record\"\n                         ],\n-                        \"type\": \"org.apache.nifi.record.sink.db.DatabaseRecordSink\",\n-                        \"typeDescription\": \"Provides a service to write records using a configured database connection.\",\n+                        \"triggerSerially\": false,\n+                        \"triggerWhenAnyDestinationAvailable\": false,\n+                        \"triggerWhenEmpty\": false,\n+                        \"type\": \"org.apache.nifi.processors.GeoEnrichIPRecord\",\n+                        \"typeDescription\": \"Looks up geolocation information for an IP address and adds the geo information to FlowFile attributes. The geo data is provided as a MaxMind database. This version uses the NiFi Record API to allow large scale enrichment of record-oriented data sets. Each field provided by the MaxMind database can be directed to a field of the user's choosing by providing a record path for that field configuration. \",\n                         \"version\": \"1.27.0\"\n-                    }\n-                ],\n-                \"processors\": [],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"1.27.0\"\n-        },\n-        {\n-            \"artifact\": \"nifi-datadog-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [],\n-                \"processors\": [],\n-                \"reportingTasks\": [\n+                    },\n                     {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-datadog-nar\",\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-enrich-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n+                        \"defaultBulletinLevel\": \"WARN\",\n+                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": 1,\n+                            \"EVENT_DRIVEN\": 0,\n+                            \"TIMER_DRIVEN\": 1\n+                        },\n+                        \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n-                        \"deprecated\": true,\n-                        \"deprecationReason\": \"This reporting task is deprecated and will be removed in NiFi 2.x.\",\n+                        \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n+                        \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"API key\": {\n-                                \"description\": \"Datadog API key. If specified value is 'agent', local Datadog agent will be used.\",\n-                                \"displayName\": \"API key\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"API key\",\n-                                \"required\": false,\n-                                \"sensitive\": true\n-                            },\n-                            \"Datadog transport\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"Metrics will be sent via locally installed Datadog agent. Datadog agent needs to be installed manually before using this option\",\n-                                        \"displayName\": \"Datadog Agent\",\n-                                        \"value\": \"Datadog Agent\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Metrics will be sent via HTTP transport with no need of Agent installed. Datadog API key needs to be set\",\n-                                        \"displayName\": \"Datadog HTTP\",\n-                                        \"value\": \"Datadog HTTP\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"Datadog HTTP\",\n-                                \"description\": \"Transport through which metrics will be sent to Datadog\",\n-                                \"displayName\": \"Datadog transport\",\n+                            \"Geo Database File\": {\n+                                \"description\": \"Path to Maxmind IP Enrichment Database File\",\n+                                \"displayName\": \"MaxMind Database File\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Datadog transport\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Geo Database File\",\n                                 \"required\": true,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"SINGLE\",\n+                                    \"resourceTypes\": [\n+                                        \"DIRECTORY\",\n+                                        \"FILE\"\n+                                    ]\n+                                },\n                                 \"sensitive\": false\n                             },\n-                            \"Environment\": {\n-                                \"defaultValue\": \"dev\",\n-                                \"description\": \"Environment, dataflow is running in. This property will be included as metrics tag.\",\n-                                \"displayName\": \"Environment\",\n+                            \"IP Address Attribute\": {\n+                                \"description\": \"The name of an attribute whose value is a dotted decimal IP address for which enrichment should occur\",\n+                                \"displayName\": \"IP Address Attribute\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Environment\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"IP Address Attribute\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Metrics prefix\": {\n-                                \"defaultValue\": \"nifi\",\n-                                \"description\": \"Prefix to be added before every metric\",\n-                                \"displayName\": \"Metrics prefix\",\n+                            \"Log Level\": {\n+                                \"defaultValue\": \"WARN\",\n+                                \"description\": \"The Log Level to use when an IP is not found in the database. Accepted values: INFO, DEBUG, WARN, ERROR.\",\n+                                \"displayName\": \"Log Level\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Metrics prefix\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Log Level\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             }\n                         },\n+                        \"sideEffectFree\": true,\n+                        \"supportedRelationships\": [\n+                            {\n+                                \"description\": \"Where to route flow files after unsuccessfully enriching attributes because no data was found\",\n+                                \"name\": \"not found\"\n+                            },\n+                            {\n+                                \"description\": \"Where to route flow files after successfully enriching attributes with data provided by database\",\n+                                \"name\": \"found\"\n+                            }\n+                        ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n+                            \"CRON_DRIVEN\",\n+                            \"EVENT_DRIVEN\"\n                         ],\n+                        \"supportsBatching\": true,\n                         \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicRelationships\": false,\n+                        \"supportsEventDriven\": true,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"datadog\",\n-                            \"metrics\",\n-                            \"reporting\"\n+                            \"ISP\",\n+                            \"enrich\",\n+                            \"ip\",\n+                            \"maxmind\"\n                         ],\n-                        \"type\": \"org.apache.nifi.reporting.datadog.DataDogReportingTask\",\n-                        \"typeDescription\": \"Publishes metrics from NiFi to datadog. For accurate and informative reporting, components should have unique names.\",\n-                        \"version\": \"1.27.0\"\n-                    }\n-                ]\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"1.27.0\"\n-        },\n-        {\n-            \"artifact\": \"nifi-jslt-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [],\n-                \"processors\": [\n+                        \"triggerSerially\": false,\n+                        \"triggerWhenAnyDestinationAvailable\": false,\n+                        \"triggerWhenEmpty\": false,\n+                        \"type\": \"org.apache.nifi.processors.ISPEnrichIP\",\n+                        \"typeDescription\": \"Looks up ISP information for an IP address and adds the information to FlowFile attributes. The ISP data is provided as a MaxMind ISP database. (Note that this is NOT the same as the GeoLite database utilized by some geo enrichment tools). The attribute that contains the IP address to lookup is provided by the 'IP Address Attribute' property. If the name of the attribute provided is 'X', then the the attributes added by enrichment will take the form X.isp.<fieldName>\",\n+                        \"version\": \"1.27.0\",\n+                        \"writesAttributes\": [\n+                            {\n+                                \"description\": \"The number of microseconds that the geo lookup took\",\n+                                \"name\": \"X.isp.lookup.micros\"\n+                            },\n+                            {\n+                                \"description\": \"The Autonomous System Number (ASN) identified for the IP address\",\n+                                \"name\": \"X.isp.asn\"\n+                            },\n+                            {\n+                                \"description\": \"The Organization Associated with the ASN identified\",\n+                                \"name\": \"X.isp.asn.organization\"\n+                            },\n+                            {\n+                                \"description\": \"The name of the ISP associated with the IP address provided\",\n+                                \"name\": \"X.isp.name\"\n+                            },\n+                            {\n+                                \"description\": \"The Organization associated with the IP address provided\",\n+                                \"name\": \"X.isp.organization\"\n+                            }\n+                        ]\n+                    },\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-jslt-nar\",\n+                        \"artifact\": \"nifi-enrich-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n+                            \"EVENT_DRIVEN\": 0,\n                             \"TIMER_DRIVEN\": 1\n                         },\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"jslt-transform-cache-size\": {\n-                                \"defaultValue\": \"1\",\n-                                \"description\": \"Compiling a JSLT Transform can be fairly expensive. Ideally, this will be done only once. However, if the Expression Language is used in the transform, we may need a new Transform for each FlowFile. This value controls how many of those Transforms we cache in memory in order to avoid having to compile the Transform each time.\",\n-                                \"displayName\": \"Transform Cache Size\",\n+                            \"DNS_QUERY_TYPE\": {\n+                                \"defaultValue\": \"TXT\",\n+                                \"description\": \"The DNS query type to be used by the processor (e.g. TXT, A)\",\n+                                \"displayName\": \"DNS Query Type\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"jslt-transform-cache-size\",\n+                                \"name\": \"DNS_QUERY_TYPE\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"jslt-transform-pretty_print\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"Apply pretty-print formatting to the output of the JSLT transform\",\n-                                \"displayName\": \"Pretty Print\",\n+                            \"DNS_RETRIES\": {\n+                                \"defaultValue\": \"1\",\n+                                \"description\": \"The number of attempts before giving up and moving on\",\n+                                \"displayName\": \"DNS Query Retries\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"jslt-transform-pretty_print\",\n+                                \"name\": \"DNS_RETRIES\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"jslt-transform-result-filter\": {\n-                                \"defaultValue\": \". != null and . != {} and . != []\",\n-                                \"description\": \"A filter for output JSON results using a JSLT expression. This property supports changing the default filter, which removes JSON objects with null values, empty objects and empty arrays from the output JSON. This JSLT must return true for each JSON object to be included and false for each object to be removed. Using a filter value of \\\"true\\\" to disables filtering.\",\n-                                \"displayName\": \"Transform Result Filter\",\n+                            \"DNS_SERVER\": {\n+                                \"description\": \"A comma separated list of  DNS servers to be used. (Defaults to system wide if none is used)\",\n+                                \"displayName\": \"DNS Servers\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"jslt-transform-result-filter\",\n+                                \"name\": \"DNS_SERVER\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"DNS_TIMEOUT\": {\n+                                \"defaultValue\": \"1500 ms\",\n+                                \"description\": \"The amount of time to wait until considering a query as failed\",\n+                                \"displayName\": \"DNS Query Timeout\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"DNS_TIMEOUT\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"jslt-transform-transformation\": {\n-                                \"description\": \"JSLT Transformation for transform of JSON data. Any NiFi Expression Language present will be evaluated first to get the final transform to be applied. The JSLT Tutorial provides an overview of supported expressions: https://github.com/schibsted/jslt/blob/master/tutorial.md\",\n-                                \"displayName\": \"JSLT Transformation\",\n+                            \"QUERY_INPUT\": {\n+                                \"description\": \"The value that should be used to populate the query\",\n+                                \"displayName\": \"Lookup value\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"jslt-transform-transformation\",\n+                                \"name\": \"QUERY_INPUT\",\n                                 \"required\": true,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"SINGLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\",\n-                                        \"TEXT\"\n-                                    ]\n-                                },\n                                 \"sensitive\": false\n                             },\n-                            \"jslt-transform-transformation-strategy\": {\n+                            \"QUERY_PARSER\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Apply transformation to entire FlowFile content JSON\",\n-                                        \"displayName\": \"Entire FlowFile\",\n-                                        \"value\": \"ENTIRE_FLOWFILE\"\n+                                        \"description\": \"Use a delimiter character or RegEx  to split the results into attributes\",\n+                                        \"displayName\": \"Split\",\n+                                        \"value\": \"Split\"\n                                     },\n                                     {\n-                                        \"description\": \"Apply transformation each JSON Object in an array\",\n-                                        \"displayName\": \"Each JSON Object\",\n-                                        \"value\": \"EACH_OBJECT\"\n+                                        \"description\": \"Use a regular expression to split the results into attributes \",\n+                                        \"displayName\": \"RegEx\",\n+                                        \"value\": \"RegEx\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Do not split results\",\n+                                        \"displayName\": \"None\",\n+                                        \"value\": \"None\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"ENTIRE_FLOWFILE\",\n-                                \"description\": \"Whether to apply the JSLT transformation to the entire FlowFile contents or each JSON object in the root-level array\",\n-                                \"displayName\": \"Transformation Strategy\",\n+                                \"defaultValue\": \"None\",\n+                                \"description\": \"The method used to slice the results into attribute groups\",\n+                                \"displayName\": \"Results Parser\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"jslt-transform-transformation-strategy\",\n+                                \"name\": \"QUERY_PARSER\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n+                            },\n+                            \"QUERY_PARSER_INPUT\": {\n+                                \"description\": \"Choice between a splitter and regex matcher used to parse the results of the query into attribute groups.\\nNOTE: This is a multiline regular expression, therefore, the DFM should decide how to handle trailing new line characters.\",\n+                                \"displayName\": \"Parser RegEx\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"QUERY_PARSER_INPUT\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n                             }\n                         },\n                         \"sideEffectFree\": true,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"The FlowFile with transformed content will be routed to this relationship\",\n-                                \"name\": \"success\"\n+                                \"description\": \"Where to route flow files if data enrichment query rendered no results\",\n+                                \"name\": \"not found\"\n                             },\n                             {\n-                                \"description\": \"If a FlowFile fails processing for any reason (for example, the FlowFile is not valid JSON), it will be routed to this relationship\",\n-                                \"name\": \"failure\"\n+                                \"description\": \"Where to route flow files after successfully enriching attributes with data\",\n+                                \"name\": \"found\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n+                            \"CRON_DRIVEN\",\n+                            \"EVENT_DRIVEN\"\n                         ],\n                         \"supportsBatching\": true,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": false,\n+                        \"supportsEventDriven\": true,\n                         \"supportsSensitiveDynamicProperties\": false,\n-                        \"systemResourceConsiderations\": [\n-                            {\n-                                \"description\": \"An instance of this component can cause high usage of this system resource.  Multiple instances or high concurrency settings may result a degradation of performance.\",\n-                                \"resource\": \"MEMORY\"\n-                            }\n-                        ],\n                         \"tags\": [\n-                            \"jslt\",\n-                            \"json\",\n-                            \"transform\"\n+                            \"dns\",\n+                            \"enrich\",\n+                            \"ip\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.jslt.JSLTTransformJSON\",\n-                        \"typeDescription\": \"Applies a JSLT transformation to the FlowFile JSON payload. A new FlowFile is created with transformed content and is routed to the 'success' relationship. If the JSLT transform fails, the original FlowFile is routed to the 'failure' relationship.\",\n+                        \"type\": \"org.apache.nifi.processors.enrich.QueryDNS\",\n+                        \"typeDescription\": \"A powerful DNS query processor primary designed to enrich DataFlows with DNS based APIs (e.g. RBLs, ShadowServer's ASN lookup) but that can be also used to perform regular DNS lookups.\",\n                         \"version\": \"1.27.0\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"Always set to application/json\",\n-                                \"name\": \"mime.type\"\n+                                \"description\": \"The captured fields of the DNS query response for each of the records received\",\n+                                \"name\": \"enrich.dns.record*.group*\"\n                             }\n                         ]\n-                    }\n-                ],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"1.27.0\"\n-        },\n-        {\n-            \"artifact\": \"nifi-mongodb-services-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [\n+                    },\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-mongodb-services-nar\",\n+                        \"artifact\": \"nifi-enrich-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n+                        \"defaultBulletinLevel\": \"WARN\",\n+                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": 1,\n+                            \"EVENT_DRIVEN\": 0,\n+                            \"TIMER_DRIVEN\": 1\n+                        },\n+                        \"defaultPenaltyDuration\": \"30 sec\",\n+                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": \"* * * * * ?\",\n+                            \"TIMER_DRIVEN\": \"0 sec\"\n+                        },\n+                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n+                        \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n+                        \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Database User\": {\n-                                \"description\": \"Database user name\",\n-                                \"displayName\": \"Database User\",\n+                            \"BATCH_SIZE\": {\n+                                \"defaultValue\": \"25\",\n+                                \"description\": \"The number of incoming FlowFiles to process in a single execution of this processor. \",\n+                                \"displayName\": \"Batch Size\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Database User\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"BATCH_SIZE\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Password\": {\n-                                \"description\": \"The password for the database user\",\n-                                \"displayName\": \"Password\",\n+                            \"BULK_PROTOCOL\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"The evaluated input of each flowfile is enclosed within begin and end tags. Each row contains a delimited set of fields\",\n+                                        \"displayName\": \"Begin/End\",\n+                                        \"value\": \"Begin/End\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Queries are made without any particular dialect\",\n+                                        \"displayName\": \"None\",\n+                                        \"value\": \"None\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"None\",\n+                                \"description\": \"The protocol used to perform the bulk query. \",\n+                                \"displayName\": \"Bulk Protocol\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Password\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"BULK_PROTOCOL\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"KEY_GROUP\": {\n+                                \"description\": \"When performing a batched lookup, the following RegEx numbered capture group or Column number will be used to match the whois server response with the lookup field\",\n+                                \"displayName\": \"Key lookup group (multiline / batch)\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"KEY_GROUP\",\n                                 \"required\": false,\n-                                \"sensitive\": true\n+                                \"sensitive\": false\n                             },\n-                            \"mongo-uri\": {\n-                                \"description\": \"MongoURI, typically of the form: mongodb://host1[:port1][,host2[:port2],...]\",\n-                                \"displayName\": \"Mongo URI\",\n+                            \"QUERY_INPUT\": {\n+                                \"description\": \"The value that should be used to populate the query\",\n+                                \"displayName\": \"Lookup value\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"mongo-uri\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"QUERY_INPUT\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"ssl-client-auth\": {\n+                            \"QUERY_PARSER\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"WANT\",\n-                                        \"value\": \"WANT\"\n+                                        \"description\": \"Use a delimiter character or RegEx  to split the results into attributes\",\n+                                        \"displayName\": \"Split\",\n+                                        \"value\": \"Split\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"REQUIRED\",\n-                                        \"value\": \"REQUIRED\"\n+                                        \"description\": \"Use a regular expression to split the results into attributes \",\n+                                        \"displayName\": \"RegEx\",\n+                                        \"value\": \"RegEx\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"NONE\",\n-                                        \"value\": \"NONE\"\n+                                        \"description\": \"Do not split results\",\n+                                        \"displayName\": \"None\",\n+                                        \"value\": \"None\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"REQUIRED\",\n-                                \"description\": \"Client authentication policy when connecting to secure (TLS/SSL) cluster. Possible values are REQUIRED, WANT, NONE. This property is only used when an SSL Context has been defined and enabled.\",\n-                                \"displayName\": \"Client Auth\",\n+                                \"defaultValue\": \"None\",\n+                                \"description\": \"The method used to slice the results into attribute groups\",\n+                                \"displayName\": \"Results Parser\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"ssl-client-auth\",\n+                                \"name\": \"QUERY_PARSER\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"QUERY_PARSER_INPUT\": {\n+                                \"description\": \"Choice between a splitter and regex matcher used to parse the results of the query into attribute groups.\\nNOTE: This is a multiline regular expression, therefore, the DFM should decide how to handle trailing new line characters.\",\n+                                \"displayName\": \"Parser RegEx\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"QUERY_PARSER_INPUT\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"ssl-context-service\": {\n-                                \"description\": \"The SSL Context Service used to provide client certificate information for TLS/SSL connections.\",\n-                                \"displayName\": \"SSL Context Service\",\n+                            \"WHOIS_QUERY_TYPE\": {\n+                                \"description\": \"The Whois query type to be used by the processor (if used)\",\n+                                \"displayName\": \"Whois Query Type\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"ssl-context-service\",\n+                                \"name\": \"WHOIS_QUERY_TYPE\",\n                                 \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n+                                \"sensitive\": false\n+                            },\n+                            \"WHOIS_SERVER\": {\n+                                \"description\": \"The Whois server to be used\",\n+                                \"displayName\": \"Whois Server\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"WHOIS_SERVER\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"WHOIS_SERVER_PORT\": {\n+                                \"defaultValue\": \"43\",\n+                                \"description\": \"The TCP port of the remote Whois server\",\n+                                \"displayName\": \"Whois Server Port\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"WHOIS_SERVER_PORT\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"WHOIS_TIMEOUT\": {\n+                                \"defaultValue\": \"1500 ms\",\n+                                \"description\": \"The amount of time to wait until considering a query as failed\",\n+                                \"displayName\": \"Whois Query Timeout\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"WHOIS_TIMEOUT\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n                             }\n                         },\n-                        \"providedApiImplementations\": [\n+                        \"sideEffectFree\": true,\n+                        \"supportedRelationships\": [\n                             {\n-                                \"artifact\": \"nifi-mongodb-client-service-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.mongodb.MongoDBClientService\",\n-                                \"version\": \"1.27.0\"\n+                                \"description\": \"Where to route flow files if data enrichment query rendered no results\",\n+                                \"name\": \"not found\"\n+                            },\n+                            {\n+                                \"description\": \"Where to route flow files after successfully enriching attributes with data\",\n+                                \"name\": \"found\"\n                             }\n                         ],\n+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\",\n+                            \"EVENT_DRIVEN\"\n+                        ],\n+                        \"supportsBatching\": true,\n                         \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicRelationships\": false,\n+                        \"supportsEventDriven\": true,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"mongo\",\n-                            \"mongodb\",\n-                            \"service\"\n+                            \"enrich\",\n+                            \"ip\",\n+                            \"whois\"\n                         ],\n-                        \"type\": \"org.apache.nifi.mongodb.MongoDBControllerService\",\n-                        \"typeDescription\": \"Provides a controller service that configures a connection to MongoDB and provides access to that connection to other Mongo-related components.\",\n-                        \"version\": \"1.27.0\"\n-                    },\n+                        \"triggerSerially\": false,\n+                        \"triggerWhenAnyDestinationAvailable\": false,\n+                        \"triggerWhenEmpty\": false,\n+                        \"type\": \"org.apache.nifi.processors.enrich.QueryWhois\",\n+                        \"typeDescription\": \"A powerful whois query processor primary designed to enrich DataFlows with whois based APIs (e.g. ShadowServer's ASN lookup) but that can be also used to perform regular whois lookups.\",\n+                        \"version\": \"1.27.0\",\n+                        \"writesAttributes\": [\n+                            {\n+                                \"description\": \"The captured fields of the Whois query response for each of the records received\",\n+                                \"name\": \"enrich.dns.record*.group*\"\n+                            }\n+                        ]\n+                    }\n+                ],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"1.27.0\"\n+        },\n+        {\n+            \"artifact\": \"nifi-protobuf-services-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [\n                     {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-mongodb-services-nar\",\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-protobuf-services-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"group\": \"org.apache.nifi\",\n                         \"propertyDescriptors\": {\n-                            \"mongo-collection-name\": {\n-                                \"description\": \"The name of the collection to use\",\n-                                \"displayName\": \"Mongo Collection Name\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"mongo-collection-name\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"mongo-db-name\": {\n-                                \"description\": \"The name of the database to use\",\n-                                \"displayName\": \"Mongo Database Name\",\n+                            \"Message Type\": {\n+                                \"description\": \"Fully qualified name of the Protocol Buffers message type including its package (eg. mypackage.MyMessage). The .proto files configured in 'Proto Directory' must contain the definition of this message type.\",\n+                                \"displayName\": \"Message Type\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"mongo-db-name\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Message Type\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"mongo-lookup-client-service\": {\n-                                \"description\": \"A MongoDB controller service to use with this lookup service.\",\n-                                \"displayName\": \"Client Service\",\n+                            \"Proto Directory\": {\n+                                \"description\": \"Directory containing Protocol Buffers message definition (.proto) file(s).\",\n+                                \"displayName\": \"Proto Directory\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"mongo-lookup-client-service\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Proto Directory\",\n                                 \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-mongodb-client-service-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.mongodb.MongoDBClientService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            },\n-                            \"mongo-lookup-projection\": {\n-                                \"description\": \"Specifies a projection for limiting which fields will be returned.\",\n-                                \"displayName\": \"Projection\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"mongo-lookup-projection\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"mongo-lookup-value-field\": {\n-                                \"description\": \"The field whose value will be returned when the lookup key(s) match a record. If not specified then the entire MongoDB result document minus the _id field will be returned as a record.\",\n-                                \"displayName\": \"Lookup Value Field\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"mongo-lookup-value-field\",\n-                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n                             \"schema-access-strategy\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"The name of the Schema to use is specified by the 'Schema Name' Property. The value of this property is used to lookup the Schema in the configured Schema Registry service.\",\n                                         \"displayName\": \"Use 'Schema Name' Property\",\n@@ -69274,20 +67471,35 @@\n                                     },\n                                     {\n                                         \"description\": \"The text of the Schema itself is specified by the 'Schema Text' Property. The value of this property must be a valid Avro Schema. If Expression Language is used, the value of the 'Schema Text' property must be valid after substituting the expressions.\",\n                                         \"displayName\": \"Use 'Schema Text' Property\",\n                                         \"value\": \"schema-text-property\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Infer from Result\",\n-                                        \"value\": \"infer\"\n+                                        \"description\": \"The FlowFile contains 3 Attributes that will be used to lookup a Schema from the configured Schema Registry: 'schema.identifier', 'schema.version', and 'schema.protocol.version'\",\n+                                        \"displayName\": \"HWX Schema Reference Attributes\",\n+                                        \"value\": \"hwx-schema-ref-attributes\"\n+                                    },\n+                                    {\n+                                        \"description\": \"The content of the FlowFile contains a reference to a schema in the Schema Registry service. The reference is encoded as a single byte indicating the 'protocol version', followed by 8 bytes indicating the schema identifier, and finally 4 bytes indicating the schema version, as per the Hortonworks Schema Registry serializers and deserializers, found at https://github.com/hortonworks/registry\",\n+                                        \"displayName\": \"HWX Content-Encoded Schema Reference\",\n+                                        \"value\": \"hwx-content-encoded-schema\"\n+                                    },\n+                                    {\n+                                        \"description\": \"The content of the FlowFile contains a reference to a schema in the Schema Registry service. The reference is encoded as a single 'Magic Byte' followed by 4 bytes representing the identifier of the schema, as outlined at http://docs.confluent.io/current/schema-registry/docs/serializer-formatter.html. This is based on version 3.2.x of the Confluent Schema Registry.\",\n+                                        \"displayName\": \"Confluent Content-Encoded Schema Reference\",\n+                                        \"value\": \"confluent-encoded\"\n+                                    },\n+                                    {\n+                                        \"description\": \"The record schema is generated from the provided proto file\",\n+                                        \"displayName\": \"Generate from Proto file\",\n+                                        \"value\": \"generate-from-proto-file\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"infer\",\n+                                \"defaultValue\": \"generate-from-proto-file\",\n                                 \"description\": \"Specifies how to obtain the schema that is to be used for interpreting the data.\",\n                                 \"displayName\": \"Schema Access Strategy\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n                                 \"name\": \"schema-access-strategy\",\n                                 \"required\": true,\n@@ -69322,16 +67534,16 @@\n                                         \"propertyDisplayName\": \"Schema Access Strategy\",\n                                         \"propertyName\": \"schema-access-strategy\"\n                                     }\n                                 ],\n                                 \"description\": \"Specifies the name of the schema to lookup in the Schema Registry property\",\n                                 \"displayName\": \"Schema Name\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n                                 \"name\": \"schema-name\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n                             \"schema-registry\": {\n                                 \"dependencies\": [\n                                     {\n@@ -69400,155 +67612,42 @@\n                                 \"sensitive\": false\n                             }\n                         },\n                         \"providedApiImplementations\": [\n                             {\n                                 \"artifact\": \"nifi-standard-services-api-nar\",\n                                 \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.lookup.LookupService\",\n+                                \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n                                 \"version\": \"1.27.0\"\n                             }\n                         ],\n                         \"supportsDynamicProperties\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"lookup\",\n-                            \"mongo\",\n-                            \"mongodb\",\n+                            \"parser\",\n+                            \"protobuf\",\n+                            \"reader\",\n                             \"record\"\n                         ],\n-                        \"type\": \"org.apache.nifi.mongodb.MongoDBLookupService\",\n-                        \"typeDescription\": \"Provides a lookup service based around MongoDB. Each key that is specified \\nwill be added to a query as-is. For example, if you specify the two keys, \\nuser and email, the resulting query will be { \\\"user\\\": \\\"tester\\\", \\\"email\\\": \\\"tester@test.com\\\" }.\\nThe query is limited to the first result (findOne in the Mongo documentation). If no \\\"Lookup Value Field\\\" is specified then the entire MongoDB result document minus the _id field will be returned as a record.\",\n+                        \"type\": \"org.apache.nifi.services.protobuf.ProtobufReader\",\n+                        \"typeDescription\": \"Parses a Protocol Buffers message from binary format.\",\n                         \"version\": \"1.27.0\"\n                     }\n                 ],\n                 \"processors\": [],\n                 \"reportingTasks\": []\n             },\n             \"group\": \"org.apache.nifi\",\n             \"version\": \"1.27.0\"\n         },\n         {\n-            \"artifact\": \"nifi-windows-event-log-nar\",\n+            \"artifact\": \"nifi-server-nar\",\n             \"componentManifest\": {\n                 \"controllerServices\": [],\n-                \"processors\": [\n-                    {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-windows-event-log-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"e0c4461\"\n-                        },\n-                        \"defaultBulletinLevel\": \"WARN\",\n-                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": 1,\n-                            \"TIMER_DRIVEN\": 1\n-                        },\n-                        \"defaultPenaltyDuration\": \"30 sec\",\n-                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"0 sec\"\n-                        },\n-                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n-                        \"defaultYieldDuration\": \"1 sec\",\n-                        \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n-                        \"primaryNodeOnly\": false,\n-                        \"propertyDescriptors\": {\n-                            \"channel\": {\n-                                \"defaultValue\": \"System\",\n-                                \"description\": \"The Windows Event Log Channel to listen to.\",\n-                                \"displayName\": \"Channel\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"channel\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"inactiveDurationToReconnect\": {\n-                                \"defaultValue\": \"10 mins\",\n-                                \"description\": \"If no new event logs are processed for the specified time period, this processor will try reconnecting to recover from a state where any further messages cannot be consumed. Such situation can happen if Windows Event Log service is restarted, or ERROR_EVT_QUERY_RESULT_STALE (15011) is returned. Setting no duration, e.g. '0 ms' disables auto-reconnection.\",\n-                                \"displayName\": \"Inactive duration to reconnect\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"inactiveDurationToReconnect\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"maxBuffer\": {\n-                                \"defaultValue\": \"1048576\",\n-                                \"description\": \"The individual Event Log XMLs are rendered to a buffer.  This specifies the maximum size in bytes that the buffer will be allowed to grow to. (Limiting the maximum size of an individual Event XML.)\",\n-                                \"displayName\": \"Maximum Buffer Size\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"maxBuffer\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"maxQueue\": {\n-                                \"defaultValue\": \"1024\",\n-                                \"description\": \"Events are received asynchronously and must be output as FlowFiles when the processor is triggered.  This specifies the maximum number of events to queue for transformation into FlowFiles.\",\n-                                \"displayName\": \"Maximum queue size\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"maxQueue\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"query\": {\n-                                \"defaultValue\": \"*\",\n-                                \"description\": \"XPath Query to filter events. (See https://msdn.microsoft.com/en-us/library/windows/desktop/dd996910(v=vs.85).aspx for examples.)\",\n-                                \"displayName\": \"XPath Query\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"query\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            }\n-                        },\n-                        \"sideEffectFree\": false,\n-                        \"supportedRelationships\": [\n-                            {\n-                                \"description\": \"Relationship for successfully consumed events.\",\n-                                \"name\": \"success\"\n-                            }\n-                        ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": false,\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": false,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"event\",\n-                            \"ingest\",\n-                            \"windows\"\n-                        ],\n-                        \"triggerSerially\": true,\n-                        \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.windows.event.log.ConsumeWindowsEventLog\",\n-                        \"typeDescription\": \"Registers a Windows Event Log Subscribe Callback to receive FlowFiles from Events on Windows.  These can be filtered via channel and XPath.\",\n-                        \"version\": \"1.27.0\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"Will set a MIME type value of application/xml.\",\n-                                \"name\": \"mime.type\"\n-                            }\n-                        ]\n-                    }\n-                ],\n+                \"processors\": [],\n                 \"reportingTasks\": []\n             },\n             \"group\": \"org.apache.nifi\",\n             \"version\": \"1.27.0\"\n         },\n         {\n             \"artifact\": \"nifi-hbase-nar\",\n@@ -71217,31 +69316,21 @@\n                 ],\n                 \"reportingTasks\": []\n             },\n             \"group\": \"org.apache.nifi\",\n             \"version\": \"1.27.0\"\n         },\n         {\n-            \"artifact\": \"nifi-kerberos-iaa-providers-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [],\n-                \"processors\": [],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"1.27.0\"\n-        },\n-        {\n-            \"artifact\": \"nifi-slack-nar\",\n+            \"artifact\": \"nifi-cipher-nar\",\n             \"componentManifest\": {\n                 \"controllerServices\": [],\n                 \"processors\": [\n                     {\n                         \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-slack-nar\",\n+                        \"artifact\": \"nifi-cipher-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -71249,419 +69338,651 @@\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n-                        \"deprecated\": true,\n-                        \"deprecationAlternatives\": [\n-                            \"org.apache.nifi.processors.slack.PublishSlack\"\n-                        ],\n-                        \"deprecationReason\": \"This Processor is more difficult to configure than necessary, and exposes intricate nuances of the Slack API that need not be exposed. Additionally, it lacks some capabilities, such as responding to messages in threads. It interacts directly with the Slack API instead of making use of the Slack-provided SDK, which makes the Processor much more brittle. Additionally, it does not make clear the differences between PutSlack and PostSlack. Each provides slightly different capabilities. PublishSlack combines the capabilities of both Processors in a simpler configuration that makes use of Slack's standard REST API.\",\n-                        \"dynamicProperties\": [\n-                            {\n-                                \"description\": \"The property value will be converted to JSON and will be added to the array of attachments in the JSON payload being sent to Slack. The property name will not be used by the processor.\",\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"name\": \"<Arbitrary name>\",\n-                                \"value\": \"JSON snippet specifying a Slack message \\\"attachment\\\"\"\n-                            }\n-                        ],\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"SSL Context Service\": {\n-                                \"description\": \"Specifies an optional SSL Context Service that, if provided, will be used to create connections\",\n-                                \"displayName\": \"SSL Context Service\",\n+                            \"cipher-algorithm-mode\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"Cipher Blocking Chaining Mode\",\n+                                        \"displayName\": \"CBC\",\n+                                        \"value\": \"CBC\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Counter Mode\",\n+                                        \"displayName\": \"CTR\",\n+                                        \"value\": \"CTR\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Galois/Counter Mode supporting Authenticated Encryption with Associated Data\",\n+                                        \"displayName\": \"GCM\",\n+                                        \"value\": \"GCM\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"GCM\",\n+                                \"description\": \"Block cipher mode of operation for decryption using the Advanced Encryption Standard\",\n+                                \"displayName\": \"Cipher Algorithm Mode\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"SSL Context Service\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n+                                \"name\": \"cipher-algorithm-mode\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n                             },\n-                            \"access-token\": {\n-                                \"description\": \"OAuth Access Token used for authenticating/authorizing the Slack request sent by NiFi.\",\n-                                \"displayName\": \"Access Token\",\n+                            \"cipher-algorithm-padding\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"NoPadding\",\n+                                        \"displayName\": \"NoPadding\",\n+                                        \"value\": \"NoPadding\"\n+                                    },\n+                                    {\n+                                        \"description\": \"PKCS5Padding\",\n+                                        \"displayName\": \"PKCS5Padding\",\n+                                        \"value\": \"PKCS5Padding\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"NoPadding\",\n+                                \"description\": \"Padding specification used in cipher operation for decryption using the Advanced Encryption Standard\",\n+                                \"displayName\": \"Cipher Algorithm Padding\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"access-token\",\n+                                \"name\": \"cipher-algorithm-padding\",\n                                 \"required\": true,\n-                                \"sensitive\": true\n+                                \"sensitive\": false\n                             },\n-                            \"channel\": {\n-                                \"description\": \"Slack channel, private group, or IM channel to send the message to.\",\n-                                \"displayName\": \"Channel\",\n+                            \"key-specification\": {\n+                                \"description\": \"Specification providing the raw secret key or a password from which to derive a secret key\",\n+                                \"displayName\": \"Key Specification\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"channel\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"key-specification\",\n                                 \"required\": true,\n-                                \"sensitive\": false\n+                                \"sensitive\": true\n                             },\n-                            \"file-mime-type\": {\n-                                \"defaultValue\": \"${mime.type}\",\n-                                \"description\": \"Mime type of the file to be uploaded. The property value will only be used if 'Upload FlowFile' has been set to 'Yes'. If the property evaluated to null or empty string, then the mime type will be set to 'application/octet-stream' in the Slack message.\",\n-                                \"displayName\": \"File Mime Type\",\n+                            \"key-specification-format\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"Raw secret key provided as a hexadecimal string\",\n+                                        \"displayName\": \"RAW\",\n+                                        \"value\": \"RAW\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Password string for use with a Key Derivation Function to produce a secret key\",\n+                                        \"displayName\": \"PASSWORD\",\n+                                        \"value\": \"PASSWORD\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"PASSWORD\",\n+                                \"description\": \"Format describing the configured Key Specification\",\n+                                \"displayName\": \"Key Specification Format\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"file-mime-type\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"key-specification-format\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n+                            }\n+                        },\n+                        \"sideEffectFree\": true,\n+                        \"supportedRelationships\": [\n+                            {\n+                                \"description\": \"Decryption succeeded\",\n+                                \"name\": \"success\"\n                             },\n-                            \"file-name\": {\n-                                \"defaultValue\": \"${filename}\",\n-                                \"description\": \"Name of the file to be uploaded. The property value will only be used if 'Upload FlowFile' has been set to 'Yes'. If the property evaluated to null or empty string, then the file name will be set to 'file' in the Slack message.\",\n-                                \"displayName\": \"File Name\",\n+                            {\n+                                \"description\": \"Decryption failed\",\n+                                \"name\": \"failure\"\n+                            }\n+                        ],\n+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\"\n+                        ],\n+                        \"supportsBatching\": true,\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicRelationships\": false,\n+                        \"supportsEventDriven\": false,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"AES\",\n+                            \"Argon2\",\n+                            \"PBKDF2\",\n+                            \"bcrypt\",\n+                            \"cryptography\",\n+                            \"decipher\",\n+                            \"decrypt\",\n+                            \"scrypt\"\n+                        ],\n+                        \"triggerSerially\": false,\n+                        \"triggerWhenAnyDestinationAvailable\": false,\n+                        \"triggerWhenEmpty\": false,\n+                        \"type\": \"org.apache.nifi.processors.cipher.DecryptContent\",\n+                        \"typeDescription\": \"Decrypt content encrypted with AES and encoded according conventions added in NiFi 0.5.0 for the EncryptContent Processor. The Processor reads the first 256 bytes to determine the presence of a cryptographic salt based on finding the 'NiFiSALT' delimiter. The salt is not present for content encrypted with a raw hexadecimal key. The Processor determines the presence of the initialization vector based on finding the 'NiFiIV' delimiter.The salt format indicates the Key Derivation Function that the Processor uses to generate a secret key based on a configured password. The Processor derives keys with a size of 128 bits according to the conventions implemented in NiFi 0.5.0.\",\n+                        \"version\": \"1.27.0\"\n+                    },\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-cipher-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"e0c4461\"\n+                        },\n+                        \"defaultBulletinLevel\": \"WARN\",\n+                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": 1,\n+                            \"TIMER_DRIVEN\": 1\n+                        },\n+                        \"defaultPenaltyDuration\": \"30 sec\",\n+                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": \"* * * * * ?\",\n+                            \"TIMER_DRIVEN\": \"0 sec\"\n+                        },\n+                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n+                        \"defaultYieldDuration\": \"1 sec\",\n+                        \"group\": \"org.apache.nifi\",\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n+                        \"primaryNodeOnly\": false,\n+                        \"propertyDescriptors\": {\n+                            \"Private Key Identities\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"PROPERTIES\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Private Key Source\",\n+                                        \"propertyName\": \"Private Key Source\"\n+                                    }\n+                                ],\n+                                \"description\": \"One or more X25519 Private Key Identities, separated with newlines, encoded according to the age specification, starting with AGE-SECRET-KEY-1\",\n+                                \"displayName\": \"Private Key Identities\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"file-name\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Private Key Identities\",\n+                                \"required\": true,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"SINGLE\",\n+                                    \"resourceTypes\": [\n+                                        \"TEXT\"\n+                                    ]\n+                                },\n+                                \"sensitive\": true\n                             },\n-                            \"file-title\": {\n-                                \"description\": \"Title of the file displayed in the Slack message. The property value will only be used if 'Upload FlowFile' has been set to 'Yes'.\",\n-                                \"displayName\": \"File Title\",\n+                            \"Private Key Identity Resources\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"RESOURCES\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Private Key Source\",\n+                                        \"propertyName\": \"Private Key Source\"\n+                                    }\n+                                ],\n+                                \"description\": \"One or more files or URLs containing X25519 Private Key Identities, separated with newlines, encoded according to the age specification, starting with AGE-SECRET-KEY-1\",\n+                                \"displayName\": \"Private Key Identity Resources\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"file-title\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Private Key Identity Resources\",\n+                                \"required\": true,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"MULTIPLE\",\n+                                    \"resourceTypes\": [\n+                                        \"FILE\",\n+                                        \"URL\"\n+                                    ]\n+                                },\n                                 \"sensitive\": false\n                             },\n-                            \"file-upload-url\": {\n-                                \"defaultValue\": \"https://slack.com/api/files.upload\",\n-                                \"description\": \"Slack Web API URL for uploading files to channels. It only needs to be changed if Slack changes its API URL.\",\n-                                \"displayName\": \"File Upload URL\",\n+                            \"Private Key Source\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"Load one or more keys from configured properties\",\n+                                        \"displayName\": \"PROPERTIES\",\n+                                        \"value\": \"PROPERTIES\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Load one or more keys from files or URLs\",\n+                                        \"displayName\": \"RESOURCES\",\n+                                        \"value\": \"RESOURCES\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"PROPERTIES\",\n+                                \"description\": \"Source of information determines the loading strategy for X25519 Private Key Identities\",\n+                                \"displayName\": \"Private Key Source\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"file-upload-url\",\n+                                \"name\": \"Private Key Source\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n+                            }\n+                        },\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.processors.cipher.EncryptContentAge\"\n+                        ],\n+                        \"sideEffectFree\": false,\n+                        \"supportedRelationships\": [\n+                            {\n+                                \"description\": \"Decryption Completed\",\n+                                \"name\": \"success\"\n                             },\n-                            \"post-message-url\": {\n-                                \"defaultValue\": \"https://slack.com/api/chat.postMessage\",\n-                                \"description\": \"Slack Web API URL for posting text messages to channels. It only needs to be changed if Slack changes its API URL.\",\n-                                \"displayName\": \"Post Message URL\",\n+                            {\n+                                \"description\": \"Decryption Failed\",\n+                                \"name\": \"failure\"\n+                            }\n+                        ],\n+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\"\n+                        ],\n+                        \"supportsBatching\": true,\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicRelationships\": false,\n+                        \"supportsEventDriven\": false,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"ChaCha20-Poly1305\",\n+                            \"X25519\",\n+                            \"age\",\n+                            \"age-encryption.org\",\n+                            \"encryption\"\n+                        ],\n+                        \"triggerSerially\": false,\n+                        \"triggerWhenAnyDestinationAvailable\": false,\n+                        \"triggerWhenEmpty\": false,\n+                        \"type\": \"org.apache.nifi.processors.cipher.DecryptContentAge\",\n+                        \"typeDescription\": \"Decrypt content using the age-encryption.org/v1 specification. Detects binary or ASCII armored content encoding using the initial file header bytes. The age standard uses ChaCha20-Poly1305 for authenticated encryption of the payload. The age-keygen command supports generating X25519 key pairs for encryption and decryption operations.\",\n+                        \"version\": \"1.27.0\"\n+                    },\n+                    {\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-cipher-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"e0c4461\"\n+                        },\n+                        \"defaultBulletinLevel\": \"WARN\",\n+                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": 1,\n+                            \"TIMER_DRIVEN\": 1\n+                        },\n+                        \"defaultPenaltyDuration\": \"30 sec\",\n+                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": \"* * * * * ?\",\n+                            \"TIMER_DRIVEN\": \"0 sec\"\n+                        },\n+                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n+                        \"defaultYieldDuration\": \"1 sec\",\n+                        \"group\": \"org.apache.nifi\",\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n+                        \"primaryNodeOnly\": false,\n+                        \"propertyDescriptors\": {\n+                            \"encryption-scheme\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"PKCS12 with MD5 digest and Advanced Encryption Standard in Cipher Block Chaining mode using 128 bit keys.\",\n+                                        \"displayName\": \"PBE_WITH_MD5_AND_AES_CBC_128\",\n+                                        \"value\": \"PBEWITHMD5AND128BITAES-CBC-OPENSSL\"\n+                                    },\n+                                    {\n+                                        \"description\": \"PKCS12 with MD5 digest and Advanced Encryption Standard in Cipher Block Chaining mode using 192 bit keys.\",\n+                                        \"displayName\": \"PBE_WITH_MD5_AND_AES_CBC_192\",\n+                                        \"value\": \"PBEWITHMD5AND192BITAES-CBC-OPENSSL\"\n+                                    },\n+                                    {\n+                                        \"description\": \"PKCS12 with MD5 digest and Advanced Encryption Standard in Cipher Block Chaining mode using 256 bit keys.\",\n+                                        \"displayName\": \"PBE_WITH_MD5_AND_AES_CBC_256\",\n+                                        \"value\": \"PBEWITHMD5AND256BITAES-CBC-OPENSSL\"\n+                                    },\n+                                    {\n+                                        \"description\": \"PKCS5 Scheme 1 with MD5 digest and Data Encryption Standard 64 bit keys. OID 1.2.840.113549.1.5.3\",\n+                                        \"displayName\": \"PBE_WITH_MD5_AND_DES\",\n+                                        \"value\": \"PBEWITHMD5ANDDES\"\n+                                    },\n+                                    {\n+                                        \"description\": \"PKCS Scheme 1 with MD5 digest and Rivest Cipher 2. OID 1.2.840.113549.1.5.6\",\n+                                        \"displayName\": \"PBE_WITH_MD5_AND_RC2\",\n+                                        \"value\": \"PBEWITHMD5ANDRC2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"PKCS12 with SHA-1 digest and Advanced Encryption Standard in Cipher Block Chaining mode using 128 bit keys.\",\n+                                        \"displayName\": \"PBE_WITH_SHA1_AND_AES_CBC_128\",\n+                                        \"value\": \"PBEWITHSHAAND128BITAES-CBC-BC\"\n+                                    },\n+                                    {\n+                                        \"description\": \"PKCS12 with SHA-1 digest and Advanced Encryption Standard in Cipher Block Chaining mode using 192 bit keys.\",\n+                                        \"displayName\": \"PBE_WITH_SHA1_AND_AES_CBC_192\",\n+                                        \"value\": \"PBEWITHSHAAND192BITAES-CBC-BC\"\n+                                    },\n+                                    {\n+                                        \"description\": \"PKCS12 with SHA-1 digest and Advanced Encryption Standard in Cipher Block Chaining mode using 256 bit keys.\",\n+                                        \"displayName\": \"PBE_WITH_SHA1_AND_AES_CBC_256\",\n+                                        \"value\": \"PBEWITHSHAAND256BITAES-CBC-BC\"\n+                                    },\n+                                    {\n+                                        \"description\": \"PKCS5 Scheme 1 with SHA-1 digest and Data Encryption Standard. OID 1.2.840.113549.1.5.10\",\n+                                        \"displayName\": \"PBE_WITH_SHA1_AND_DES\",\n+                                        \"value\": \"PBEWITHSHA1ANDDES\"\n+                                    },\n+                                    {\n+                                        \"description\": \"PKCS12 with SHA-1 digest and Triple Data Encryption Standard 128 bit keys. OID 1.2.840.113549.1.12.1.4\",\n+                                        \"displayName\": \"PBE_WITH_SHA1_AND_DESEDE_128\",\n+                                        \"value\": \"PBEWITHSHAAND2-KEYTRIPLEDES-CBC\"\n+                                    },\n+                                    {\n+                                        \"description\": \"PKCS12 with SHA-1 digest and Triple Data Encryption Standard 192 bit keys. OID 1.2.840.113549.1.12.1.3\",\n+                                        \"displayName\": \"PBE_WITH_SHA1_AND_DESEDE_192\",\n+                                        \"value\": \"PBEWITHSHAAND3-KEYTRIPLEDES-CBC\"\n+                                    },\n+                                    {\n+                                        \"description\": \"PKCS5 Scheme 1 with SHA-1 digest and Rivest Cipher 2. OID 1.2.840.113549.1.5.11\",\n+                                        \"displayName\": \"PBE_WITH_SHA1_AND_RC2\",\n+                                        \"value\": \"PBEWITHSHA1ANDRC2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"PKCS12 with SHA-1 digest and Rivest Cipher 2 128 bit keys. OID 1.2.840.113549.1.12.1.5\",\n+                                        \"displayName\": \"PBE_WITH_SHA1_AND_RC2_128\",\n+                                        \"value\": \"PBEWITHSHAAND128BITRC2-CBC\"\n+                                    },\n+                                    {\n+                                        \"description\": \"PKCS12 with SHA-1 digest and Rivest Cipher 2 40 bit keys. OID 1.2.840.113549.1.12.1.6\",\n+                                        \"displayName\": \"PBE_WITH_SHA1_AND_RC2_40\",\n+                                        \"value\": \"PBEWITHSHAAND40BITRC2-CBC\"\n+                                    },\n+                                    {\n+                                        \"description\": \"PKCS12 with SHA-1 digest and Rivest Cipher 4 128 bit keys. OID 1.2.840.113549.1.12.1.1\",\n+                                        \"displayName\": \"PBE_WITH_SHA1_AND_RC4_128\",\n+                                        \"value\": \"PBEWITHSHAAND128BITRC4\"\n+                                    },\n+                                    {\n+                                        \"description\": \"PKCS12 with SHA-1 digest and Rivest Cipher 4 40 bit keys. OID 1.2.840.113549.1.12.1.2\",\n+                                        \"displayName\": \"PBE_WITH_SHA1_AND_RC4_40\",\n+                                        \"value\": \"PBEWITHSHAAND40BITRC4\"\n+                                    },\n+                                    {\n+                                        \"description\": \"PKCS12 with SHA-1 digest and Twofish in Cipher Block Chaining mode using 256 bit keys.\",\n+                                        \"displayName\": \"PBE_WITH_SHA1_AND_TWOFISH\",\n+                                        \"value\": \"PBEWITHSHAANDTWOFISH-CBC\"\n+                                    },\n+                                    {\n+                                        \"description\": \"PKCS12 with SHA-256 digest and Advanced Encryption Standard in Cipher Block Chaining mode using 128 bit keys.\",\n+                                        \"displayName\": \"PBE_WITH_SHA256_AND_AES_CBC_128\",\n+                                        \"value\": \"PBEWITHSHA256AND128BITAES-CBC-BC\"\n+                                    },\n+                                    {\n+                                        \"description\": \"PKCS12 with SHA-256 digest and Advanced Encryption Standard in Cipher Block Chaining mode using 192 bit keys.\",\n+                                        \"displayName\": \"PBE_WITH_SHA256_AND_AES_CBC_192\",\n+                                        \"value\": \"PBEWITHSHA256AND192BITAES-CBC-BC\"\n+                                    },\n+                                    {\n+                                        \"description\": \"PKCS12 with SHA-256 digest and Advanced Encryption Standard in Cipher Block Chaining mode using 256 bit keys.\",\n+                                        \"displayName\": \"PBE_WITH_SHA256_AND_AES_CBC_256\",\n+                                        \"value\": \"PBEWITHSHA256AND256BITAES-CBC-BC\"\n+                                    }\n+                                ],\n+                                \"description\": \"Password-Based Encryption Scheme including PBES1 described in RFC 8018, and others defined according to PKCS12 and Bouncy Castle implementations\",\n+                                \"displayName\": \"Encryption Scheme\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"post-message-url\",\n+                                \"name\": \"encryption-scheme\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"text\": {\n-                                \"description\": \"Text of the Slack message to send. Only required if no attachment has been specified and 'Upload File' has been set to 'No'.\",\n-                                \"displayName\": \"Text\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"text\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"upload-flowfile\": {\n+                            \"key-derivation-strategy\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Upload and attach FlowFile content to the Slack message.\",\n-                                        \"displayName\": \"Yes\",\n-                                        \"value\": \"true\"\n+                                        \"description\": \"OpenSSL Envelope BytesToKey using a digest algorithm with one iteration and optional salt of eight bytes\",\n+                                        \"displayName\": \"OPENSSL_EVP_BYTES_TO_KEY\",\n+                                        \"value\": \"OPENSSL_EVP_BYTES_TO_KEY\"\n                                     },\n                                     {\n-                                        \"description\": \"Don't upload and attach FlowFile content to the Slack message.\",\n-                                        \"displayName\": \"No\",\n-                                        \"value\": \"false\"\n+                                        \"description\": \"Jasypt Java Simplified Encryption using a digest algorithm with 1000 iterations and required salt of eight or sixteen bytes\",\n+                                        \"displayName\": \"JASYPT_STANDARD\",\n+                                        \"value\": \"JASYPT_STANDARD\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"Whether or not to upload and attach the FlowFile content to the Slack message.\",\n-                                \"displayName\": \"Upload FlowFile\",\n+                                \"description\": \"Strategy for reading salt from encoded contents and deriving the decryption key according to the number of function iterations\",\n+                                \"displayName\": \"Key Derivation Strategy\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"upload-flowfile\",\n+                                \"name\": \"key-derivation-strategy\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n+                            },\n+                            \"password\": {\n+                                \"description\": \"Password required for Password-Based Encryption Schemes\",\n+                                \"displayName\": \"Password\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"password\",\n+                                \"required\": true,\n+                                \"sensitive\": true\n                             }\n                         },\n-                        \"sideEffectFree\": false,\n+                        \"sideEffectFree\": true,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"FlowFiles are routed to success after being successfully sent to Slack\",\n+                                \"description\": \"Decryption succeeded\",\n                                 \"name\": \"success\"\n                             },\n                             {\n-                                \"description\": \"FlowFiles are routed to failure if unable to be sent to Slack\",\n+                                \"description\": \"Decryption failed\",\n                                 \"name\": \"failure\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n-                        \"supportsBatching\": false,\n-                        \"supportsDynamicProperties\": true,\n+                        \"supportsBatching\": true,\n+                        \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"message\",\n-                            \"notify\",\n-                            \"post\",\n-                            \"slack\",\n-                            \"upload\"\n+                            \"Jasypt\",\n+                            \"OpenSSL\",\n+                            \"PBES1\",\n+                            \"PKCS5\",\n+                            \"cryptography\",\n+                            \"decipher\",\n+                            \"decrypt\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.slack.PostSlack\",\n-                        \"typeDescription\": \"Sends a message on Slack. The FlowFile content (e.g. an image) can be uploaded and attached to the message.\",\n+                        \"type\": \"org.apache.nifi.processors.cipher.DecryptContentCompatibility\",\n+                        \"typeDescription\": \"Decrypt content using password-based encryption schemes with legacy algorithms supporting historical compatibility modes.\",\n                         \"version\": \"1.27.0\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"The Slack URL of the uploaded file. It will be added if 'Upload FlowFile' has been set to 'Yes'.\",\n-                                \"name\": \"slack.file.url\"\n+                                \"description\": \"Password-Based Encryption Scheme\",\n+                                \"name\": \"pbe.scheme\"\n+                            },\n+                            {\n+                                \"description\": \"Password-Based Encryption Block Cipher\",\n+                                \"name\": \"pbe.symmetric.cipher\"\n+                            },\n+                            {\n+                                \"description\": \"Password-Based Encryption Digest Algorithm\",\n+                                \"name\": \"pbe.digest.algorithm\"\n                             }\n                         ]\n                     },\n                     {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-slack-nar\",\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-cipher-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n                         },\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n-                        \"defaultYieldDuration\": \"3 sec\",\n+                        \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Access Token\": {\n-                                \"description\": \"OAuth Access Token used for authenticating/authorizing the Slack request sent by NiFi. This may be either a User Token or a Bot Token. The token must be granted the chat:write scope. Additionally, in order to upload FlowFile contents as an attachment, it must be granted files:write.\",\n-                                \"displayName\": \"Access Token\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Access Token\",\n-                                \"required\": true,\n-                                \"sensitive\": true\n-                            },\n-                            \"Channel\": {\n-                                \"description\": \"The name or identifier of the channel to send the message to. If using a channel name, it must be prefixed with the # character. For example, #general. This is valid only for public channels. Otherwise, the unique identifier of the channel to publish to must be provided.\",\n-                                \"displayName\": \"Channel\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Channel\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Character Set\": {\n-                                \"defaultValue\": \"UTF-8\",\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"Send FlowFile Content as Message\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Publish Strategy\",\n-                                        \"propertyName\": \"Publish Strategy\"\n-                                    }\n-                                ],\n-                                \"description\": \"Specifies the name of the Character Set used to encode the FlowFile contents.\",\n-                                \"displayName\": \"Character Set\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Character Set\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Include FlowFile Content as Attachment\": {\n+                            \"File Encoding\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"description\": \"Binary encoding\",\n+                                        \"displayName\": \"BINARY\",\n+                                        \"value\": \"BINARY\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"false\",\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"Use 'Message Text' Property\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Publish Strategy\",\n-                                        \"propertyName\": \"Publish Strategy\"\n+                                        \"description\": \"ASCII Armor encoding\",\n+                                        \"displayName\": \"ASCII\",\n+                                        \"value\": \"ASCII\"\n                                     }\n                                 ],\n-                                \"description\": \"Specifies whether or not the contents of the FlowFile should be uploaded as an attachment to the Slack message.\",\n-                                \"displayName\": \"Include FlowFile Content as Attachment\",\n+                                \"defaultValue\": \"BINARY\",\n+                                \"description\": \"Output encoding for encrypted files. Binary encoding provides optimal processing performance.\",\n+                                \"displayName\": \"File Encoding\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Include FlowFile Content as Attachment\",\n+                                \"name\": \"File Encoding\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Max FlowFile Size\": {\n-                                \"defaultValue\": \"1 MB\",\n+                            \"Public Key Recipient Resources\": {\n                                 \"dependencies\": [\n                                     {\n                                         \"dependentValues\": [\n-                                            \"true\"\n+                                            \"RESOURCES\"\n                                         ],\n-                                        \"propertyDisplayName\": \"Include FlowFile Content as Attachment\",\n-                                        \"propertyName\": \"Include FlowFile Content as Attachment\"\n+                                        \"propertyDisplayName\": \"Public Key Source\",\n+                                        \"propertyName\": \"Public Key Source\"\n                                     }\n                                 ],\n-                                \"description\": \"The maximum size of a FlowFile that can be sent to Slack. If any FlowFile exceeds this size, it will be routed to failure. This plays an important role because the entire contents of the file must be loaded into NiFi's heap in order to send the data to Slack.\",\n-                                \"displayName\": \"Max FlowFile Size\",\n+                                \"description\": \"One or more files or URLs containing X25519 Public Key Recipients, separated with newlines, encoded according to the age specification, starting with age1\",\n+                                \"displayName\": \"Public Key Recipient Resources\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Max FlowFile Size\",\n+                                \"name\": \"Public Key Recipient Resources\",\n                                 \"required\": true,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"MULTIPLE\",\n+                                    \"resourceTypes\": [\n+                                        \"FILE\",\n+                                        \"URL\"\n+                                    ]\n+                                },\n                                 \"sensitive\": false\n                             },\n-                            \"Message Text\": {\n+                            \"Public Key Recipients\": {\n                                 \"dependencies\": [\n                                     {\n                                         \"dependentValues\": [\n-                                            \"Use 'Message Text' Property\"\n+                                            \"PROPERTIES\"\n                                         ],\n-                                        \"propertyDisplayName\": \"Publish Strategy\",\n-                                        \"propertyName\": \"Publish Strategy\"\n+                                        \"propertyDisplayName\": \"Public Key Source\",\n+                                        \"propertyName\": \"Public Key Source\"\n                                     }\n                                 ],\n-                                \"description\": \"The text of the message to send to Slack.\",\n-                                \"displayName\": \"Message Text\",\n+                                \"description\": \"One or more X25519 Public Key Recipients, separated with newlines, encoded according to the age specification, starting with age1\",\n+                                \"displayName\": \"Public Key Recipients\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Message Text\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Public Key Recipients\",\n                                 \"required\": true,\n-                                \"sensitive\": false\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"SINGLE\",\n+                                    \"resourceTypes\": [\n+                                        \"TEXT\"\n+                                    ]\n+                                },\n+                                \"sensitive\": true\n                             },\n-                            \"Publish Strategy\": {\n+                            \"Public Key Source\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"The contents of the FlowFile will be sent as the message text.\",\n-                                        \"displayName\": \"Send FlowFile Content as Message\",\n-                                        \"value\": \"Send FlowFile Content as Message\"\n+                                        \"description\": \"Load one or more keys from configured properties\",\n+                                        \"displayName\": \"PROPERTIES\",\n+                                        \"value\": \"PROPERTIES\"\n                                     },\n                                     {\n-                                        \"description\": \"The value of the Message Text Property will be sent as the message text.\",\n-                                        \"displayName\": \"Use 'Message Text' Property\",\n-                                        \"value\": \"Use 'Message Text' Property\"\n+                                        \"description\": \"Load one or more keys from files or URLs\",\n+                                        \"displayName\": \"RESOURCES\",\n+                                        \"value\": \"RESOURCES\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"Send FlowFile Content as Message\",\n-                                \"description\": \"Specifies how the Processor will send the message or file to Slack.\",\n-                                \"displayName\": \"Publish Strategy\",\n+                                \"defaultValue\": \"PROPERTIES\",\n+                                \"description\": \"Source of information determines the loading strategy for X25519 Public Key Recipients\",\n+                                \"displayName\": \"Public Key Source\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Publish Strategy\",\n+                                \"name\": \"Public Key Source\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n-                            },\n-                            \"Thread Timestamp\": {\n-                                \"description\": \"The Timestamp identifier for the thread that this message is to be a part of. If not specified, the message will be a top-level message instead of being in a thread.\",\n-                                \"displayName\": \"Thread Timestamp\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Thread Timestamp\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n                             }\n                         },\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.processors.cipher.DecryptContentAge\"\n+                        ],\n                         \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"FlowFiles are routed to success after being successfully sent to Slack\",\n+                                \"description\": \"Encryption Completed\",\n                                 \"name\": \"success\"\n                             },\n                             {\n-                                \"description\": \"FlowFiles are routed to 'rate limited' if the Rate Limit has been exceeded\",\n-                                \"name\": \"rate limited\"\n-                            },\n-                            {\n-                                \"description\": \"FlowFiles are routed to 'failure' if unable to be sent to Slack for any other reason\",\n+                                \"description\": \"Encryption Failed\",\n                                 \"name\": \"failure\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n-                        \"supportsBatching\": false,\n+                        \"supportsBatching\": true,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"chat.postMessage\",\n-                            \"conversation\",\n-                            \"publish\",\n-                            \"send\",\n-                            \"slack\",\n-                            \"social media\",\n-                            \"team\",\n-                            \"text\",\n-                            \"unstructured\",\n-                            \"upload\",\n-                            \"write\"\n+                            \"ChaCha20-Poly1305\",\n+                            \"X25519\",\n+                            \"age\",\n+                            \"age-encryption.org\",\n+                            \"encryption\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.slack.PublishSlack\",\n-                        \"typeDescription\": \"Posts a message to the specified Slack channel. The content of the message can be either a user-defined message that makes use of Expression Language or the contents of the FlowFile can be sent as the message. If sending a user-defined message, the contents of the FlowFile may also be optionally uploaded as a file attachment.\",\n-                        \"version\": \"1.27.0\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"The ID of the Slack Channel from which the messages were retrieved\",\n-                                \"name\": \"slack.channel.id\"\n-                            },\n-                            {\n-                                \"description\": \"The timestamp of the slack messages that was sent; this is used by Slack as a unique identifier\",\n-                                \"name\": \"slack.ts\"\n-                            }\n-                        ]\n+                        \"type\": \"org.apache.nifi.processors.cipher.EncryptContentAge\",\n+                        \"typeDescription\": \"Encrypt content using the age-encryption.org/v1 specification. Supports binary or ASCII armored content encoding using configurable properties. The age standard uses ChaCha20-Poly1305 for authenticated encryption of the payload. The age-keygen command supports generating X25519 key pairs for encryption and decryption operations.\",\n+                        \"version\": \"1.27.0\"\n                     },\n                     {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-slack-nar\",\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-cipher-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -71669,264 +69990,173 @@\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n-                        \"deprecated\": true,\n-                        \"deprecationAlternatives\": [\n-                            \"org.apache.nifi.processors.slack.PublishSlack\"\n-                        ],\n-                        \"deprecationReason\": \"This Processor makes use of a Webhook URL, rather than Slack's REST API. As a result, the Processor is more difficult to configure than necessary and requires special permissions for the Slack Application / Bot. These permissions must be granted for every channel that the application is to respond to, which makes setup and maintenance difficult. Additionally, it does not make clear the differences between PutSlack and PostSlack. Each provides slightly different capabilities. PublishSlack combines the capabilities of both Processors in a simpler configuration that makes use of Slack's standard REST API.\",\n-                        \"dynamicProperties\": [\n-                            {\n-                                \"description\": \"Converts the contents of each value specified by the Dynamic Property's value to JSON and appends it to the payload being sent to Slack.\",\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"name\": \"A JSON object to add to Slack's \\\"attachments\\\" JSON payload.\",\n-                                \"value\": \"JSON-formatted string to add to Slack's payload JSON appended to the \\\"attachments\\\" JSON array.\"\n-                            }\n-                        ],\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"SSL Context Service\": {\n-                                \"description\": \"Specifies an optional SSL Context Service that, if provided, will be used to create connections\",\n-                                \"displayName\": \"SSL Context Service\",\n+                            \"mac-algorithm\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"HmacSHA256\",\n+                                        \"value\": \"HmacSHA256\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"HmacSHA512\",\n+                                        \"value\": \"HmacSHA512\"\n+                                    }\n+                                ],\n+                                \"description\": \"Hashed Message Authentication Code Function\",\n+                                \"displayName\": \"Message Authentication Code Algorithm\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"SSL Context Service\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            },\n-                            \"channel\": {\n-                                \"description\": \"A public channel using #channel or direct message using @username. If not specified, the default webhook channel as specified in Slack's Incoming Webhooks web interface is used.\",\n-                                \"displayName\": \"Channel\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"channel\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"icon-emoji\": {\n-                                \"description\": \"Icon Emoji to be used for the message. Must begin and end with a colon, e.g. :ghost:\",\n-                                \"displayName\": \"Icon Emoji\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"icon-emoji\",\n-                                \"required\": false,\n+                                \"name\": \"mac-algorithm\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"icon-url\": {\n-                                \"description\": \"Icon URL to be used for the message\",\n-                                \"displayName\": \"Icon URL\",\n+                            \"message-authentication-code\": {\n+                                \"description\": \"The MAC to compare with the calculated value\",\n+                                \"displayName\": \"Message Authentication Code\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"icon-url\",\n-                                \"required\": false,\n+                                \"name\": \"message-authentication-code\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"username\": {\n-                                \"description\": \"The displayed Slack username\",\n-                                \"displayName\": \"Username\",\n+                            \"message-authentication-code-encoding\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"HEXADECIMAL\",\n+                                        \"value\": \"HEXADECIMAL\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"BASE64\",\n+                                        \"value\": \"BASE64\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"HEXADECIMAL\",\n+                                \"description\": \"Encoding of the Message Authentication Code\",\n+                                \"displayName\": \"Message Authentication Code Encoding\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"username\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"message-authentication-code-encoding\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"webhook-text\": {\n-                                \"description\": \"The text sent in the webhook message\",\n-                                \"displayName\": \"Webhook Text\",\n+                            \"secret-key\": {\n+                                \"description\": \"Secret key to calculate the hash\",\n+                                \"displayName\": \"Secret Key\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"webhook-text\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"secret-key\",\n                                 \"required\": true,\n-                                \"sensitive\": false\n+                                \"sensitive\": true\n                             },\n-                            \"webhook-url\": {\n-                                \"description\": \"The POST URL provided by Slack to send messages into a channel.\",\n-                                \"displayName\": \"Webhook URL\",\n+                            \"secret-key-encoding\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"UTF8\",\n+                                        \"value\": \"UTF8\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"HEXADECIMAL\",\n+                                        \"value\": \"HEXADECIMAL\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"BASE64\",\n+                                        \"value\": \"BASE64\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"HEXADECIMAL\",\n+                                \"description\": \"Encoding of the Secret Key\",\n+                                \"displayName\": \"Secret Key Encoding\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"webhook-url\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"secret-key-encoding\",\n                                 \"required\": true,\n-                                \"sensitive\": true\n+                                \"sensitive\": false\n                             }\n                         },\n                         \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"FlowFiles are routed to success after being successfully sent to Slack\",\n+                                \"description\": \"Signature Verification Succeeded\",\n                                 \"name\": \"success\"\n                             },\n                             {\n-                                \"description\": \"FlowFiles are routed to failure if unable to be sent to Slack\",\n+                                \"description\": \"Signature Verification Failed\",\n                                 \"name\": \"failure\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n-                        \"supportsBatching\": false,\n-                        \"supportsDynamicProperties\": true,\n+                        \"supportsBatching\": true,\n+                        \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"notify\",\n-                            \"put\",\n-                            \"slack\"\n+                            \"Authentication\",\n+                            \"HMAC\",\n+                            \"MAC\",\n+                            \"Signing\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.slack.PutSlack\",\n-                        \"typeDescription\": \"Sends a message to your team on slack.com\",\n-                        \"version\": \"1.27.0\"\n-                    }\n-                ],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"1.27.0\"\n-        },\n-        {\n-            \"artifact\": \"nifi-hadoop-libraries-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [],\n-                \"processors\": [],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"1.27.0\"\n-        },\n-        {\n-            \"artifact\": \"nifi-metrics-reporter-service-api-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [],\n-                \"processors\": [],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"1.27.0\"\n-        },\n-        {\n-            \"artifact\": \"nifi-standard-shared-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [],\n-                \"processors\": [],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"1.27.0\"\n-        },\n-        {\n-            \"artifact\": \"nifi-redis-service-api-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [],\n-                \"processors\": [],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"1.27.0\"\n-        },\n-        {\n-            \"artifact\": \"nifi-asana-services-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-asana-services-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"e0c4461\"\n-                        },\n-                        \"group\": \"org.apache.nifi\",\n-                        \"propertyDescriptors\": {\n-                            \"asana-api-url\": {\n-                                \"defaultValue\": \"https://app.asana.com/api/1.0\",\n-                                \"description\": \"Base URL of Asana API. Leave it as default, unless you have your own Asana instance serving on a different URL. (typical for on-premise installations)\",\n-                                \"displayName\": \"API URL\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"asana-api-url\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n+                        \"type\": \"org.apache.nifi.processors.cipher.VerifyContentMAC\",\n+                        \"typeDescription\": \"Calculates a Message Authentication Code using the provided Secret Key and compares it with the provided MAC property\",\n+                        \"version\": \"1.27.0\",\n+                        \"writesAttributes\": [\n+                            {\n+                                \"description\": \"Calculated Message Authentication Code encoded by the selected encoding\",\n+                                \"name\": \"mac.calculated\"\n                             },\n-                            \"asana-personal-access-token\": {\n-                                \"description\": \"Similarly to entering your username/password into a website, when you access your Asana data via the API you need to authenticate. Personal Access Token (PAT) is an authentication mechanism for accessing the API. You can generate a PAT from the Asana developer console. Refer to Asana Authentication Quick Start for detailed instructions on getting started.\",\n-                                \"displayName\": \"Personal Access Token\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"asana-personal-access-token\",\n-                                \"required\": true,\n-                                \"sensitive\": true\n+                            {\n+                                \"description\": \"The Encoding of the Hashed Message Authentication Code\",\n+                                \"name\": \"mac.encoding\"\n                             },\n-                            \"asana-workspace-name\": {\n-                                \"description\": \"Specify which Asana workspace to use. Case sensitive. A workspace is the highest-level organizational unit in Asana. All projects and tasks have an associated workspace. An organization is a special kind of workspace that represents a company. In an organization, you can group your projects into teams.\",\n-                                \"displayName\": \"Workspace\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"asana-workspace-name\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            }\n-                        },\n-                        \"providedApiImplementations\": [\n                             {\n-                                \"artifact\": \"nifi-asana-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.controller.asana.AsanaClientProviderService\",\n-                                \"version\": \"1.27.0\"\n+                                \"description\": \"Hashed Message Authentication Code Algorithm\",\n+                                \"name\": \"mac.algorithm\"\n                             }\n-                        ],\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"asana\",\n-                            \"authentication\",\n-                            \"service\"\n-                        ],\n-                        \"type\": \"org.apache.nifi.controller.asana.StandardAsanaClientProviderService\",\n-                        \"typeDescription\": \"Common service to authenticate with Asana, and to work on a specified workspace.\",\n-                        \"version\": \"1.27.0\"\n+                        ]\n                     }\n                 ],\n-                \"processors\": [],\n                 \"reportingTasks\": []\n             },\n             \"group\": \"org.apache.nifi\",\n             \"version\": \"1.27.0\"\n         },\n         {\n-            \"artifact\": \"nifi-hl7-nar\",\n+            \"artifact\": \"nifi-amqp-nar\",\n             \"componentManifest\": {\n                 \"controllerServices\": [],\n                 \"processors\": [\n                     {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-hl7-nar\",\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-amqp-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -71935,552 +70165,736 @@\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_REQUIRED\",\n+                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Character Encoding\": {\n-                                \"defaultValue\": \"UTF-8\",\n-                                \"description\": \"The Character Encoding that is used to encode the HL7 data\",\n-                                \"displayName\": \"Character Encoding\",\n+                            \"AMQP Version\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"0.9.1\",\n+                                        \"value\": \"0.9.1\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"0.9.1\",\n+                                \"description\": \"AMQP Version. Currently only supports AMQP v0.9.1.\",\n+                                \"displayName\": \"AMQP Version\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Character Encoding\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"AMQP Version\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"hl7-input-version\": {\n+                            \"Brokers\": {\n+                                \"description\": \"A comma-separated list of known AMQP Brokers in the format <host>:<port> (e.g., localhost:5672). If this is set, Host Name and Port are ignored. Only include hosts from the same AMQP cluster.\",\n+                                \"displayName\": \"Brokers\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Brokers\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Host Name\": {\n+                                \"defaultValue\": \"localhost\",\n+                                \"description\": \"Network address of AMQP broker (e.g., localhost). If Brokers is set, then this property is ignored.\",\n+                                \"displayName\": \"Host Name\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Host Name\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Password\": {\n+                                \"description\": \"Password used for authentication and authorization.\",\n+                                \"displayName\": \"Password\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Password\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n+                            },\n+                            \"Port\": {\n+                                \"defaultValue\": \"5672\",\n+                                \"description\": \"Numeric value identifying Port of AMQP broker (e.g., 5671). If Brokers is set, then this property is ignored.\",\n+                                \"displayName\": \"Port\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Port\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Queue\": {\n+                                \"description\": \"The name of the existing AMQP Queue from which messages will be consumed. Usually pre-defined by AMQP administrator. \",\n+                                \"displayName\": \"Queue\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Queue\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"User Name\": {\n+                                \"description\": \"User Name used for authentication and authorization.\",\n+                                \"displayName\": \"User Name\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"User Name\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Virtual Host\": {\n+                                \"description\": \"Virtual Host name which segregates AMQP system for enhanced security.\",\n+                                \"displayName\": \"Virtual Host\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Virtual Host\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"auto.acknowledge\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"autodetect\",\n-                                        \"value\": \"autodetect\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"2.2\",\n-                                        \"value\": \"2.2\"\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"2.3\",\n-                                        \"value\": \"2.3\"\n-                                    },\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \" If false (Non-Auto-Acknowledge), the messages will be acknowledged by the processor after transferring the FlowFiles to success and committing the NiFi session. Non-Auto-Acknowledge mode provides 'at-least-once' delivery semantics. If true (Auto-Acknowledge), messages that are delivered to the AMQP Client will be auto-acknowledged by the AMQP Broker just after sending them out. This generally will provide better throughput but will also result in messages being lost upon restart/crash of the AMQP Broker, NiFi or the processor. Auto-Acknowledge mode provides 'at-most-once' delivery semantics and it is recommended only if loosing messages is acceptable.\",\n+                                \"displayName\": \"Auto-Acknowledge Messages\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"auto.acknowledge\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"batch.size\": {\n+                                \"defaultValue\": \"10\",\n+                                \"description\": \"The maximum number of messages that should be processed in a single session. Once this many messages have been received (or once no more messages are readily available), the messages received will be transferred to the 'success' relationship and the messages will be acknowledged to the AMQP Broker. Setting this value to a larger number could result in better performance, particularly for very small messages, but can also result in more messages being duplicated upon sudden restart of NiFi.\",\n+                                \"displayName\": \"Batch Size\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"batch.size\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"cert-authentication\": {\n+                                \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"2.3.1\",\n-                                        \"value\": \"2.3.1\"\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"2.4\",\n-                                        \"value\": \"2.4\"\n-                                    },\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"Authenticate using the SSL certificate rather than user name/password.\",\n+                                \"displayName\": \"Use Client Certificate Authentication\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"cert-authentication\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"header.format\": {\n+                                \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"2.5\",\n-                                        \"value\": \"2.5\"\n+                                        \"description\": \"Put all headers as a string with the specified separator in the attribute 'amqp$headers'.\",\n+                                        \"displayName\": \"Comma-Separated String\",\n+                                        \"value\": \"Comma-Separated String\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"2.5.1\",\n-                                        \"value\": \"2.5.1\"\n+                                        \"description\": \"Format all headers as JSON string and output in the attribute 'amqp$headers'. It will include keys with null value as well.\",\n+                                        \"displayName\": \"JSON String\",\n+                                        \"value\": \"JSON String\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"2.6\",\n-                                        \"value\": \"2.6\"\n+                                        \"description\": \"Put each header as attribute of the flow file with a prefix specified in the properties\",\n+                                        \"displayName\": \"FlowFile Attributes\",\n+                                        \"value\": \"FlowFile Attributes\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"autodetect\",\n-                                \"description\": \"The HL7 version to use for parsing and validation\",\n-                                \"displayName\": \"HL7 Input Version\",\n+                                \"defaultValue\": \"Comma-Separated String\",\n+                                \"description\": \"Defines how to output headers from the received message\",\n+                                \"displayName\": \"Header Output Format\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"hl7-input-version\",\n+                                \"name\": \"header.format\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"parse-segment-fields\": {\n-                                \"allowableValues\": [\n+                            \"header.key.prefix\": {\n+                                \"defaultValue\": \"consume.amqp\",\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n+                                        \"dependentValues\": [\n+                                            \"FlowFile Attributes\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Header Output Format\",\n+                                        \"propertyName\": \"header.format\"\n+                                    }\n+                                ],\n+                                \"description\": \"Text to be prefixed to header keys as the are added to the FlowFile attributes. Processor will append '.' to the value of this property\",\n+                                \"displayName\": \"Header Key Prefix\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"header.key.prefix\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"header.separator\": {\n+                                \"defaultValue\": \",\",\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"dependentValues\": [\n+                                            \"Comma-Separated String\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Header Output Format\",\n+                                        \"propertyName\": \"header.format\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"Whether or not to parse HL7 segment fields into attributes\",\n-                                \"displayName\": \"Parse Segment Fields\",\n+                                \"description\": \"The character that is used to separate key-value for header in String. The value must be only one character.\",\n+                                \"displayName\": \"Header Separator\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"parse-segment-fields\",\n+                                \"name\": \"header.separator\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"prefetch.count\": {\n+                                \"defaultValue\": \"0\",\n+                                \"description\": \"The maximum number of unacknowledged messages for the consumer. If consumer has this number of unacknowledged messages, AMQP broker will no longer send new messages until consumer acknowledges some of the messages already delivered to it.Allowed values: from 0 to 65535. 0 means no limit\",\n+                                \"displayName\": \"Prefetch Count\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"prefetch.count\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"skip-validation\": {\n+                            \"remove.curly.braces\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"displayName\": \"True\",\n+                                        \"value\": \"True\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"displayName\": \"False\",\n+                                        \"value\": \"False\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"true\",\n-                                \"description\": \"Whether or not to validate HL7 message values\",\n-                                \"displayName\": \"Skip Validation\",\n+                                \"defaultValue\": \"False\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"Comma-Separated String\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Header Output Format\",\n+                                        \"propertyName\": \"header.format\"\n+                                    }\n+                                ],\n+                                \"description\": \"If true Remove Curly Braces, Curly Braces in the header will be automatically remove.\",\n+                                \"displayName\": \"Remove Curly Braces\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"skip-validation\",\n-                                \"required\": true,\n+                                \"name\": \"remove.curly.braces\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"use-segment-names\": {\n+                            \"ssl-client-auth\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"displayName\": \"WANT\",\n+                                        \"value\": \"WANT\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"displayName\": \"REQUIRED\",\n+                                        \"value\": \"REQUIRED\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"NONE\",\n+                                        \"value\": \"NONE\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"Whether or not to use HL7 segment names in attributes\",\n-                                \"displayName\": \"Use Segment Names\",\n+                                \"defaultValue\": \"NONE\",\n+                                \"description\": \"The property has no effect and therefore deprecated.\",\n+                                \"displayName\": \"Client Auth\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"use-segment-names\",\n-                                \"required\": true,\n+                                \"name\": \"ssl-client-auth\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n+                            },\n+                            \"ssl-context-service\": {\n+                                \"description\": \"The SSL Context Service used to provide client certificate information for TLS/SSL connections.\",\n+                                \"displayName\": \"SSL Context Service\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"ssl-context-service\",\n+                                \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n                             }\n                         },\n-                        \"sideEffectFree\": true,\n+                        \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"A FlowFile is routed to this relationship if it is properly parsed as HL7 and its attributes extracted\",\n+                                \"description\": \"All FlowFiles that are received from the AMQP queue are routed to this relationship\",\n                                 \"name\": \"success\"\n-                            },\n-                            {\n-                                \"description\": \"A FlowFile is routed to this relationship if it cannot be mapped to FlowFile Attributes. This would happen if the FlowFile does not contain valid HL7 data\",\n-                                \"name\": \"failure\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n-                        \"supportsBatching\": true,\n+                        \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"HL7\",\n-                            \"attributes\",\n-                            \"extract\",\n-                            \"health level 7\",\n-                            \"healthcare\"\n+                            \"amqp\",\n+                            \"consume\",\n+                            \"get\",\n+                            \"message\",\n+                            \"rabbit\",\n+                            \"receive\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.hl7.ExtractHL7Attributes\",\n-                        \"typeDescription\": \"Extracts information from an HL7 (Health Level 7) formatted FlowFile and adds the information as FlowFile Attributes. The attributes are named as <Segment Name> <dot> <Field Index>. If the segment is repeating, the naming will be <Segment Name> <underscore> <Segment Index> <dot> <Field Index>. For example, we may have an attribute named \\\"MHS.12\\\" with a value of \\\"2.1\\\" and an attribute named \\\"OBX_11.3\\\" with a value of \\\"93000^CPT4\\\".\",\n-                        \"version\": \"1.27.0\"\n+                        \"type\": \"org.apache.nifi.amqp.processors.ConsumeAMQP\",\n+                        \"typeDescription\": \"Consumes AMQP Messages from an AMQP Broker using the AMQP 0.9.1 protocol. Each message that is received from the AMQP Broker will be emitted as its own FlowFile to the 'success' relationship.\",\n+                        \"version\": \"1.27.0\",\n+                        \"writesAttributes\": [\n+                            {\n+                                \"description\": \"The App ID field from the AMQP Message\",\n+                                \"name\": \"amqp$appId\"\n+                            },\n+                            {\n+                                \"description\": \"The Content Encoding reported by the AMQP Message\",\n+                                \"name\": \"amqp$contentEncoding\"\n+                            },\n+                            {\n+                                \"description\": \"The Content Type reported by the AMQP Message\",\n+                                \"name\": \"amqp$contentType\"\n+                            },\n+                            {\n+                                \"description\": \"The headers present on the AMQP Message. Added only if processor is configured to output this attribute.\",\n+                                \"name\": \"amqp$headers\"\n+                            },\n+                            {\n+                                \"description\": \"Each message header will be inserted with this attribute name, if processor is configured to output headers as attribute\",\n+                                \"name\": \"<Header Key Prefix>.<attribute>\"\n+                            },\n+                            {\n+                                \"description\": \"The numeric indicator for the Message's Delivery Mode\",\n+                                \"name\": \"amqp$deliveryMode\"\n+                            },\n+                            {\n+                                \"description\": \"The Message priority\",\n+                                \"name\": \"amqp$priority\"\n+                            },\n+                            {\n+                                \"description\": \"The Message's Correlation ID\",\n+                                \"name\": \"amqp$correlationId\"\n+                            },\n+                            {\n+                                \"description\": \"The value of the Message's Reply-To field\",\n+                                \"name\": \"amqp$replyTo\"\n+                            },\n+                            {\n+                                \"description\": \"The Message Expiration\",\n+                                \"name\": \"amqp$expiration\"\n+                            },\n+                            {\n+                                \"description\": \"The unique ID of the Message\",\n+                                \"name\": \"amqp$messageId\"\n+                            },\n+                            {\n+                                \"description\": \"The timestamp of the Message, as the number of milliseconds since epoch\",\n+                                \"name\": \"amqp$timestamp\"\n+                            },\n+                            {\n+                                \"description\": \"The type of message\",\n+                                \"name\": \"amqp$type\"\n+                            },\n+                            {\n+                                \"description\": \"The ID of the user\",\n+                                \"name\": \"amqp$userId\"\n+                            },\n+                            {\n+                                \"description\": \"The ID of the AMQP Cluster\",\n+                                \"name\": \"amqp$clusterId\"\n+                            },\n+                            {\n+                                \"description\": \"The routingKey of the AMQP Message\",\n+                                \"name\": \"amqp$routingKey\"\n+                            },\n+                            {\n+                                \"description\": \"The exchange from which AMQP Message was received\",\n+                                \"name\": \"amqp$exchange\"\n+                            }\n+                        ]\n                     },\n                     {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-hl7-nar\",\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-amqp-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n-                            \"EVENT_DRIVEN\": 0,\n                             \"TIMER_DRIVEN\": 1\n                         },\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n-                        \"dynamicProperties\": [\n-                            {\n-                                \"description\": \"If a FlowFile matches the query, it will be routed to a relationship with the name of the property\",\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"name\": \"Name of a Relationship\",\n-                                \"value\": \"An HL7 Query Language query\"\n-                            }\n-                        ],\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Character Encoding\": {\n-                                \"defaultValue\": \"UTF-8\",\n-                                \"description\": \"The Character Encoding that is used to encode the HL7 data\",\n-                                \"displayName\": \"Character Encoding\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Character Encoding\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            }\n-                        },\n-                        \"sideEffectFree\": true,\n-                        \"supportedRelationships\": [\n-                            {\n-                                \"description\": \"Any FlowFile that cannot be parsed as HL7 will be routed to this relationship\",\n-                                \"name\": \"failure\"\n-                            },\n-                            {\n-                                \"description\": \"The original FlowFile that comes into this processor will be routed to this relationship, unless it is routed to 'failure'\",\n-                                \"name\": \"original\"\n-                            }\n-                        ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\",\n-                            \"EVENT_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": true,\n-                        \"supportsDynamicProperties\": true,\n-                        \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": true,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"HL7\",\n-                            \"Health Level 7\",\n-                            \"healthcare\",\n-                            \"route\"\n-                        ],\n-                        \"triggerSerially\": false,\n-                        \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.hl7.RouteHL7\",\n-                        \"typeDescription\": \"Routes incoming HL7 data according to user-defined queries. To add a query, add a new property to the processor. The name of the property will become a new relationship for the processor, and the value is an HL7 Query Language query. If a FlowFile matches the query, a copy of the FlowFile will be routed to the associated relationship.\",\n-                        \"version\": \"1.27.0\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"The name of the relationship to which the FlowFile was routed\",\n-                                \"name\": \"RouteHL7.Route\"\n-                            }\n-                        ]\n-                    }\n-                ],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"1.27.0\"\n-        },\n-        {\n-            \"artifact\": \"nifi-kafka-2-6-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-kafka-2-6-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"e0c4461\"\n-                        },\n-                        \"dynamicProperties\": [\n-                            {\n-                                \"description\": \"These properties will be added on the Kafka configuration after loading any provided configuration properties. In the event a dynamic property represents a property that was already set, its value will be ignored and WARN message logged. For the list of available Kafka properties please refer to: http://kafka.apache.org/documentation.html#configuration. \",\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"name\": \"The name of a Kafka configuration property.\",\n-                                \"value\": \"The value of a given Kafka configuration property.\"\n-                            }\n-                        ],\n-                        \"group\": \"org.apache.nifi\",\n-                        \"propertyDescriptors\": {\n-                            \"ack.wait.time\": {\n-                                \"defaultValue\": \"5 secs\",\n-                                \"description\": \"After sending a message to Kafka, this indicates the amount of time that we are willing to wait for a response from Kafka. If Kafka does not acknowledge the message within this time period, the FlowFile will be routed to 'failure'.\",\n-                                \"displayName\": \"Acknowledgment Wait Time\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"ack.wait.time\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"acks\": {\n+                            \"AMQP Version\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Records are considered 'transmitted successfully' after successfully writing the content to a Kafka node, without waiting for a response. This provides the best performance but may result in data loss.\",\n-                                        \"displayName\": \"Best Effort\",\n-                                        \"value\": \"0\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Records are considered 'transmitted successfully' if the message is received by a single Kafka node, whether or not it is replicated. This is faster than <Guarantee Replicated Delivery> but can result in data loss if a Kafka node crashes.\",\n-                                        \"displayName\": \"Guarantee Single Node Delivery\",\n-                                        \"value\": \"1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Records are considered 'transmitted unsuccessfully' unless the message is replicated to the appropriate number of Kafka Nodes according to the Topic configuration.\",\n-                                        \"displayName\": \"Guarantee Replicated Delivery\",\n-                                        \"value\": \"all\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"0.9.1\",\n+                                        \"value\": \"0.9.1\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"0\",\n-                                \"description\": \"Specifies the requirement for guaranteeing that a message is sent to Kafka. Corresponds to Kafka's 'acks' property.\",\n-                                \"displayName\": \"Delivery Guarantee\",\n+                                \"defaultValue\": \"0.9.1\",\n+                                \"description\": \"AMQP Version. Currently only supports AMQP v0.9.1.\",\n+                                \"displayName\": \"AMQP Version\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"acks\",\n+                                \"name\": \"AMQP Version\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"bootstrap.servers\": {\n-                                \"defaultValue\": \"localhost:9092\",\n-                                \"description\": \"Comma-separated list of Kafka Brokers in the format host:port\",\n-                                \"displayName\": \"Kafka Brokers\",\n+                            \"Brokers\": {\n+                                \"description\": \"A comma-separated list of known AMQP Brokers in the format <host>:<port> (e.g., localhost:5672). If this is set, Host Name and Port are ignored. Only include hosts from the same AMQP cluster.\",\n+                                \"displayName\": \"Brokers\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"bootstrap.servers\",\n-                                \"required\": true,\n+                                \"name\": \"Brokers\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"compression.type\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"none\",\n-                                        \"value\": \"none\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"gzip\",\n-                                        \"value\": \"gzip\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"snappy\",\n-                                        \"value\": \"snappy\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"lz4\",\n-                                        \"value\": \"lz4\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"none\",\n-                                \"description\": \"This parameter allows you to specify the compression codec for all data generated by this producer.\",\n-                                \"displayName\": \"Compression Type\",\n+                            \"Exchange Name\": {\n+                                \"defaultValue\": \"\",\n+                                \"description\": \"The name of the AMQP Exchange the messages will be sent to. Usually provided by the AMQP administrator (e.g., 'amq.direct'). It is an optional property. If kept empty the messages will be sent to a default AMQP exchange.\",\n+                                \"displayName\": \"Exchange Name\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"compression.type\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Exchange Name\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"kerberos-credentials-service\": {\n-                                \"description\": \"Service supporting generalized credentials authentication with Kerberos\",\n-                                \"displayName\": \"Kerberos Credentials Service\",\n+                            \"Host Name\": {\n+                                \"defaultValue\": \"localhost\",\n+                                \"description\": \"Network address of AMQP broker (e.g., localhost). If Brokers is set, then this property is ignored.\",\n+                                \"displayName\": \"Host Name\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"kerberos-credentials-service\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Host Name\",\n                                 \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.kerberos.KerberosCredentialsService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n+                                \"sensitive\": false\n                             },\n-                            \"kerberos-user-service\": {\n-                                \"description\": \"Service supporting user authentication with Kerberos\",\n-                                \"displayName\": \"Kerberos User Service\",\n+                            \"Password\": {\n+                                \"description\": \"Password used for authentication and authorization.\",\n+                                \"displayName\": \"Password\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"kerberos-user-service\",\n+                                \"name\": \"Password\",\n                                 \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.kerberos.SelfContainedKerberosUserService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n+                                \"sensitive\": true\n                             },\n-                            \"max.block.ms\": {\n-                                \"defaultValue\": \"5 sec\",\n-                                \"description\": \"The amount of time publisher will wait to obtain metadata or wait for the buffer to flush during the 'send' call before failing the entire 'send' call. Corresponds to Kafka's 'max.block.ms' property\",\n-                                \"displayName\": \"Max Metadata Wait Time\",\n+                            \"Port\": {\n+                                \"defaultValue\": \"5672\",\n+                                \"description\": \"Numeric value identifying Port of AMQP broker (e.g., 5671). If Brokers is set, then this property is ignored.\",\n+                                \"displayName\": \"Port\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"max.block.ms\",\n-                                \"required\": true,\n+                                \"name\": \"Port\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"max.request.size\": {\n-                                \"defaultValue\": \"1 MB\",\n-                                \"description\": \"The maximum size of a request in bytes. Corresponds to Kafka's 'max.request.size' property and defaults to 1 MB (1048576).\",\n-                                \"displayName\": \"Max Request Size\",\n+                            \"Routing Key\": {\n+                                \"description\": \"The name of the Routing Key that will be used by AMQP to route messages from the exchange to a destination queue(s). Usually provided by the administrator (e.g., 'myKey')In the event when messages are sent to a default exchange this property corresponds to a destination queue name, otherwise a binding from the Exchange to a Queue via Routing Key must be set (usually by the AMQP administrator)\",\n+                                \"displayName\": \"Routing Key\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"max.request.size\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Routing Key\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"message-header-encoding\": {\n-                                \"defaultValue\": \"UTF-8\",\n-                                \"description\": \"For any attribute that is added as a message header, as configured via the <Attributes to Send as Headers> property, this property indicates the Character Encoding to use for serializing the headers.\",\n-                                \"displayName\": \"Message Header Encoding\",\n+                            \"User Name\": {\n+                                \"description\": \"User Name used for authentication and authorization.\",\n+                                \"displayName\": \"User Name\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"message-header-encoding\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"User Name\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"record-sink-record-writer\": {\n-                                \"description\": \"Specifies the Controller Service to use for writing out the records.\",\n-                                \"displayName\": \"Record Writer\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"record-sink-record-writer\",\n-                                \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            },\n-                            \"sasl.kerberos.service.name\": {\n-                                \"description\": \"The service name that matches the primary name of the Kafka server configured in the broker JAAS configuration\",\n-                                \"displayName\": \"Kerberos Service Name\",\n+                            \"Virtual Host\": {\n+                                \"description\": \"Virtual Host name which segregates AMQP system for enhanced security.\",\n+                                \"displayName\": \"Virtual Host\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"sasl.kerberos.service.name\",\n+                                \"name\": \"Virtual Host\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"security.protocol\": {\n+                            \"cert-authentication\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"PLAINTEXT\",\n-                                        \"value\": \"PLAINTEXT\"\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"SSL\",\n-                                        \"value\": \"SSL\"\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"Authenticate using the SSL certificate rather than user name/password.\",\n+                                \"displayName\": \"Use Client Certificate Authentication\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"cert-authentication\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"header.separator\": {\n+                                \"defaultValue\": \",\",\n+                                \"description\": \"The character that is used to split key-value for headers. The value must only one character. Otherwise you will get an error message\",\n+                                \"displayName\": \"Header Separator\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"header.separator\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"ssl-client-auth\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"WANT\",\n+                                        \"value\": \"WANT\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"SASL_PLAINTEXT\",\n-                                        \"value\": \"SASL_PLAINTEXT\"\n+                                        \"displayName\": \"REQUIRED\",\n+                                        \"value\": \"REQUIRED\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"SASL_SSL\",\n-                                        \"value\": \"SASL_SSL\"\n+                                        \"displayName\": \"NONE\",\n+                                        \"value\": \"NONE\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"PLAINTEXT\",\n-                                \"description\": \"Security protocol used to communicate with brokers. Corresponds to Kafka Client security.protocol property\",\n-                                \"displayName\": \"Security Protocol\",\n+                                \"defaultValue\": \"NONE\",\n+                                \"description\": \"The property has no effect and therefore deprecated.\",\n+                                \"displayName\": \"Client Auth\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"security.protocol\",\n-                                \"required\": true,\n+                                \"name\": \"ssl-client-auth\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"ssl.context.service\": {\n-                                \"description\": \"Service supporting SSL communication with Kafka brokers\",\n+                            \"ssl-context-service\": {\n+                                \"description\": \"The SSL Context Service used to provide client certificate information for TLS/SSL connections.\",\n                                 \"displayName\": \"SSL Context Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"ssl.context.service\",\n+                                \"name\": \"ssl-context-service\",\n                                 \"required\": false,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n                                     \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n                                     \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n                                     \"version\": \"1.27.0\"\n                                 }\n-                            },\n-                            \"topic\": {\n-                                \"description\": \"The name of the Kafka Topic to publish to.\",\n-                                \"displayName\": \"Topic Name\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"topic\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n                             }\n                         },\n-                        \"providedApiImplementations\": [\n+                        \"readsAttributes\": [\n                             {\n-                                \"artifact\": \"nifi-standard-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.record.sink.RecordSinkService\",\n-                                \"version\": \"1.27.0\"\n+                                \"description\": \"The App ID field to set on the AMQP Message\",\n+                                \"name\": \"amqp$appId\"\n+                            },\n+                            {\n+                                \"description\": \"The Content Encoding to set on the AMQP Message\",\n+                                \"name\": \"amqp$contentEncoding\"\n+                            },\n+                            {\n+                                \"description\": \"The Content Type to set on the AMQP Message\",\n+                                \"name\": \"amqp$contentType\"\n+                            },\n+                            {\n+                                \"description\": \"The headers to set on the AMQP Message\",\n+                                \"name\": \"amqp$headers\"\n+                            },\n+                            {\n+                                \"description\": \"The numeric indicator for the Message's Delivery Mode\",\n+                                \"name\": \"amqp$deliveryMode\"\n+                            },\n+                            {\n+                                \"description\": \"The Message priority\",\n+                                \"name\": \"amqp$priority\"\n+                            },\n+                            {\n+                                \"description\": \"The Message's Correlation ID\",\n+                                \"name\": \"amqp$correlationId\"\n+                            },\n+                            {\n+                                \"description\": \"The value of the Message's Reply-To field\",\n+                                \"name\": \"amqp$replyTo\"\n+                            },\n+                            {\n+                                \"description\": \"The Message Expiration\",\n+                                \"name\": \"amqp$expiration\"\n+                            },\n+                            {\n+                                \"description\": \"The unique ID of the Message\",\n+                                \"name\": \"amqp$messageId\"\n+                            },\n+                            {\n+                                \"description\": \"The timestamp of the Message, as the number of milliseconds since epoch\",\n+                                \"name\": \"amqp$timestamp\"\n+                            },\n+                            {\n+                                \"description\": \"The type of message\",\n+                                \"name\": \"amqp$type\"\n+                            },\n+                            {\n+                                \"description\": \"The ID of the user\",\n+                                \"name\": \"amqp$userId\"\n+                            },\n+                            {\n+                                \"description\": \"The ID of the AMQP Cluster\",\n+                                \"name\": \"amqp$clusterId\"\n                             }\n                         ],\n-                        \"supportsDynamicProperties\": true,\n+                        \"sideEffectFree\": false,\n+                        \"supportedRelationships\": [\n+                            {\n+                                \"description\": \"All FlowFiles that are sent to the AMQP destination are routed to this relationship\",\n+                                \"name\": \"success\"\n+                            },\n+                            {\n+                                \"description\": \"All FlowFiles that cannot be routed to the AMQP destination are routed to this relationship\",\n+                                \"name\": \"failure\"\n+                            }\n+                        ],\n+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\"\n+                        ],\n+                        \"supportsBatching\": false,\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicRelationships\": false,\n+                        \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n+                        \"systemResourceConsiderations\": [\n+                            {\n+                                \"description\": \"An instance of this component can cause high usage of this system resource.  Multiple instances or high concurrency settings may result a degradation of performance.\",\n+                                \"resource\": \"MEMORY\"\n+                            }\n+                        ],\n                         \"tags\": [\n-                            \"kafka\",\n-                            \"record\",\n-                            \"sink\"\n+                            \"amqp\",\n+                            \"message\",\n+                            \"publish\",\n+                            \"put\",\n+                            \"rabbit\",\n+                            \"send\"\n                         ],\n-                        \"type\": \"org.apache.nifi.record.sink.kafka.KafkaRecordSink_2_6\",\n-                        \"typeDescription\": \"Provides a service to write records to a Kafka 2.6+ topic.\",\n+                        \"triggerSerially\": false,\n+                        \"triggerWhenAnyDestinationAvailable\": false,\n+                        \"triggerWhenEmpty\": false,\n+                        \"type\": \"org.apache.nifi.amqp.processors.PublishAMQP\",\n+                        \"typeDescription\": \"Creates an AMQP Message from the contents of a FlowFile and sends the message to an AMQP Exchange. In a typical AMQP exchange model, the message that is sent to the AMQP Exchange will be routed based on the 'Routing Key' to its final destination in the queue (the binding). If due to some misconfiguration the binding between the Exchange, Routing Key and Queue is not set up, the message will have no final destination and will return (i.e., the data will not make it to the queue). If that happens you will see a log in both app-log and bulletin stating to that effect, and the FlowFile will be routed to the 'failure' relationship.\",\n                         \"version\": \"1.27.0\"\n                     }\n                 ],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"1.27.0\"\n+        },\n+        {\n+            \"artifact\": \"nifi-mqtt-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [],\n                 \"processors\": [\n                     {\n                         \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-kafka-2-6-nar\",\n+                        \"artifact\": \"nifi-mqtt-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -72488,719 +70902,470 @@\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n-                        \"dynamicProperties\": [\n-                            {\n-                                \"description\": \"These properties will be added on the Kafka configuration after loading any provided configuration properties. In the event a dynamic property represents a property that was already set, its value will be ignored and WARN message logged. For the list of available Kafka properties please refer to: http://kafka.apache.org/documentation.html#configuration.\",\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"name\": \"The name of a Kafka configuration property.\",\n-                                \"value\": \"The value of a given Kafka configuration property.\"\n-                            }\n-                        ],\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_FORBIDDEN\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Commit Offsets\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"true\",\n-                                \"description\": \"Specifies whether or not this Processor should commit the offsets to Kafka after receiving messages. This value should be false when a PublishKafkaRecord processor is expected to commit the offsets using Exactly Once semantics, and should be reserved for dataflows that are designed to run within Stateless NiFi. See Processor's Usage / Additional Details for more information. Note that setting this value to false can lead to significant data duplication or potentially even data loss if the dataflow is not properly configured.\",\n-                                \"displayName\": \"Commit Offsets\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Commit Offsets\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Communications Timeout\": {\n-                                \"defaultValue\": \"60 secs\",\n-                                \"description\": \"Specifies the timeout that the consumer should use when communicating with the Kafka Broker\",\n-                                \"displayName\": \"Communications Timeout\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Communications Timeout\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"auto.offset.reset\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"Automatically reset the offset to the earliest offset\",\n-                                        \"displayName\": \"earliest\",\n-                                        \"value\": \"earliest\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Automatically reset the offset to the latest offset\",\n-                                        \"displayName\": \"latest\",\n-                                        \"value\": \"latest\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Throw exception to the consumer if no previous offset is found for the consumer's group\",\n-                                        \"displayName\": \"none\",\n-                                        \"value\": \"none\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"latest\",\n-                                \"description\": \"Allows you to manage the condition when there is no initial offset in Kafka or if the current offset does not exist any more on the server (e.g. because that data has been deleted). Corresponds to Kafka's 'auto.offset.reset' property.\",\n-                                \"displayName\": \"Offset Reset\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"auto.offset.reset\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"aws.profile.name\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"AWS_MSK_IAM\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"SASL Mechanism\",\n-                                        \"propertyName\": \"sasl.mechanism\"\n-                                    }\n-                                ],\n-                                \"description\": \"The Amazon Web Services Profile to select when multiple profiles are available.\",\n-                                \"displayName\": \"AWS Profile Name\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"aws.profile.name\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"bootstrap.servers\": {\n-                                \"defaultValue\": \"localhost:9092\",\n-                                \"description\": \"Comma-separated list of Kafka Brokers in the format host:port\",\n-                                \"displayName\": \"Kafka Brokers\",\n+                            \"Broker URI\": {\n+                                \"description\": \"The URI(s) to use to connect to the MQTT broker (e.g., tcp://localhost:1883). The 'tcp', 'ssl', 'ws' and 'wss' schemes are supported. In order to use 'ssl', the SSL Context Service property must be set. When a comma-separated URI list is set (e.g., tcp://localhost:1883,tcp://localhost:1884), the processor will use a round-robin algorithm to connect to the brokers on connection failure.\",\n+                                \"displayName\": \"Broker URI\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"bootstrap.servers\",\n+                                \"name\": \"Broker URI\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"group.id\": {\n-                                \"description\": \"A Group ID is used to identify consumers that are within the same consumer group. Corresponds to Kafka's 'group.id' property.\",\n-                                \"displayName\": \"Group ID\",\n+                            \"Client ID\": {\n+                                \"description\": \"MQTT client ID to use. If not set, a UUID will be generated.\",\n+                                \"displayName\": \"Client ID\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"group.id\",\n-                                \"required\": true,\n+                                \"name\": \"Client ID\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"header-name-regex\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"USE_VALUE\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Output Strategy\",\n-                                        \"propertyName\": \"output-strategy\"\n-                                    }\n-                                ],\n-                                \"description\": \"A Regular Expression that is matched against all message headers. Any message header whose name matches the regex will be added to the FlowFile as an Attribute. If not specified, no Header values will be added as FlowFile attributes. If two messages have a different value for the same header and that header is selected by the provided regex, then those two messages must be added to different FlowFiles. As a result, users should be cautious about using a regex like \\\".*\\\" if messages are expected to have header values that are unique per message, such as an identifier or timestamp, because it will prevent NiFi from bundling the messages together efficiently.\",\n-                                \"displayName\": \"Headers to Add as Attributes (Regex)\",\n+                            \"Connection Timeout (seconds)\": {\n+                                \"defaultValue\": \"30\",\n+                                \"description\": \"Maximum time interval the client will wait for the network connection to the MQTT server to be established. The default timeout is 30 seconds. A value of 0 disables timeout processing meaning the client will wait until the network connection is made successfully or fails.\",\n+                                \"displayName\": \"Connection Timeout (seconds)\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"header-name-regex\",\n+                                \"name\": \"Connection Timeout (seconds)\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"honor-transactions\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"true\",\n-                                \"description\": \"Specifies whether or not NiFi should honor transactional guarantees when communicating with Kafka. If false, the Processor will use an \\\"isolation level\\\" of read_uncomitted. This means that messages will be received as soon as they are written to Kafka but will be pulled, even if the producer cancels the transactions. If this value is true, NiFi will not receive any messages for which the producer's transaction was canceled, but this can result in some latency since the consumer must wait for the producer to finish its entire transaction instead of pulling as the messages become available.\",\n-                                \"displayName\": \"Honor Transactions\",\n+                            \"Group ID\": {\n+                                \"description\": \"MQTT consumer group ID to use. If group ID not set, client will connect as individual consumer.\",\n+                                \"displayName\": \"Group ID\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"honor-transactions\",\n-                                \"required\": true,\n+                                \"name\": \"Group ID\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"kerberos-credentials-service\": {\n-                                \"description\": \"Service supporting generalized credentials authentication with Kerberos\",\n-                                \"displayName\": \"Kerberos Credentials Service\",\n+                            \"Keep Alive Interval (seconds)\": {\n+                                \"defaultValue\": \"60\",\n+                                \"description\": \"Defines the maximum time interval between messages sent or received. It enables the client to detect if the server is no longer available, without having to wait for the TCP/IP timeout. The client will ensure that at least one message travels across the network within each keep alive period. In the absence of a data-related message during the time period, the client sends a very small \\\"ping\\\" message, which the server will acknowledge. A value of 0 disables keepalive processing in the client.\",\n+                                \"displayName\": \"Keep Alive Interval (seconds)\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"kerberos-credentials-service\",\n+                                \"name\": \"Keep Alive Interval (seconds)\",\n                                 \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.kerberos.KerberosCredentialsService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n+                                \"sensitive\": false\n                             },\n-                            \"kerberos-user-service\": {\n-                                \"description\": \"Service supporting user authentication with Kerberos\",\n-                                \"displayName\": \"Kerberos User Service\",\n+                            \"Last Will Message\": {\n+                                \"description\": \"The message to send as the client's Last Will.\",\n+                                \"displayName\": \"Last Will Message\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"kerberos-user-service\",\n+                                \"name\": \"Last Will Message\",\n                                 \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.kerberos.SelfContainedKerberosUserService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n+                                \"sensitive\": false\n                             },\n-                            \"key-attribute-encoding\": {\n+                            \"Last Will QoS Level\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"The key is interpreted as a UTF-8 Encoded string.\",\n-                                        \"displayName\": \"UTF-8 Encoded\",\n-                                        \"value\": \"utf-8\"\n+                                        \"description\": \"Best effort delivery. A message won\\u2019t be acknowledged by the receiver or stored and redelivered by the sender. This is often called \\u201cfire and forget\\u201d and provides the same guarantee as the underlying TCP protocol.\",\n+                                        \"displayName\": \"0 - At most once\",\n+                                        \"value\": \"0\"\n                                     },\n                                     {\n-                                        \"description\": \"The key is interpreted as arbitrary binary data and is encoded using hexadecimal characters with uppercase letters\",\n-                                        \"displayName\": \"Hex Encoded\",\n-                                        \"value\": \"hex\"\n+                                        \"description\": \"Guarantees that a message will be delivered at least once to the receiver. The message can also be delivered more than once\",\n+                                        \"displayName\": \"1 - At least once\",\n+                                        \"value\": \"1\"\n                                     },\n                                     {\n-                                        \"description\": \"The key will not be added as an Attribute\",\n-                                        \"displayName\": \"Do Not Add Key as Attribute\",\n-                                        \"value\": \"do-not-add\"\n+                                        \"description\": \"Guarantees that each message is received only once by the counterpart. It is the safest and also the slowest quality of service level. The guarantee is provided by two round-trip flows between sender and receiver.\",\n+                                        \"displayName\": \"2 - Exactly once\",\n+                                        \"value\": \"2\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"utf-8\",\n+                                \"defaultValue\": \"0\",\n                                 \"dependencies\": [\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"USE_VALUE\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Output Strategy\",\n-                                        \"propertyName\": \"output-strategy\"\n+                                        \"propertyDisplayName\": \"Last Will Message\",\n+                                        \"propertyName\": \"Last Will Message\"\n                                     }\n                                 ],\n-                                \"description\": \"If the <Separate By Key> property is set to true, FlowFiles that are emitted have an attribute named 'kafka.key'. This property dictates how the value of the attribute should be encoded.\",\n-                                \"displayName\": \"Key Attribute Encoding\",\n+                                \"description\": \"QoS level to be used when publishing the Last Will Message.\",\n+                                \"displayName\": \"Last Will QoS Level\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"key-attribute-encoding\",\n+                                \"name\": \"Last Will QoS Level\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"key-format\": {\n+                            \"Last Will Retain\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Format the Kafka ConsumerRecord key as a UTF-8 string.\",\n-                                        \"displayName\": \"String\",\n-                                        \"value\": \"string\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Format the Kafka ConsumerRecord key as a byte array.\",\n-                                        \"displayName\": \"Byte Array\",\n-                                        \"value\": \"byte-array\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n-                                        \"description\": \"Format the Kafka ConsumerRecord key as a record.\",\n-                                        \"displayName\": \"Record\",\n-                                        \"value\": \"record\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"byte-array\",\n+                                \"defaultValue\": \"false\",\n                                 \"dependencies\": [\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"USE_WRAPPER\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Output Strategy\",\n-                                        \"propertyName\": \"output-strategy\"\n+                                        \"propertyDisplayName\": \"Last Will Message\",\n+                                        \"propertyName\": \"Last Will Message\"\n                                     }\n                                 ],\n-                                \"description\": \"Specifies how to represent the Kafka Record's Key in the output\",\n-                                \"displayName\": \"Key Format\",\n+                                \"description\": \"Whether to retain the client's Last Will.\",\n+                                \"displayName\": \"Last Will Retain\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"key-format\",\n+                                \"name\": \"Last Will Retain\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"key-record-reader\": {\n+                            \"Last Will Topic\": {\n                                 \"dependencies\": [\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"record\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Key Format\",\n-                                        \"propertyName\": \"key-format\"\n+                                        \"propertyDisplayName\": \"Last Will Message\",\n+                                        \"propertyName\": \"Last Will Message\"\n                                     }\n                                 ],\n-                                \"description\": \"The Record Reader to use for parsing the Kafka Record's key into a Record\",\n-                                \"displayName\": \"Key Record Reader\",\n+                                \"description\": \"The topic to send the client's Last Will to.\",\n+                                \"displayName\": \"Last Will Topic\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"key-record-reader\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n+                                \"name\": \"Last Will Topic\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n                             },\n-                            \"max-uncommit-offset-wait\": {\n-                                \"defaultValue\": \"1 secs\",\n-                                \"dependencies\": [\n+                            \"MQTT Specification Version\": {\n+                                \"allowableValues\": [\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"true\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Commit Offsets\",\n-                                        \"propertyName\": \"Commit Offsets\"\n+                                        \"description\": \"Start with v3.1.1 and fallback to v3.1.0 if not supported by a broker\",\n+                                        \"displayName\": \"v3 AUTO\",\n+                                        \"value\": \"0\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"v5.0\",\n+                                        \"value\": \"5\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"v3.1.1\",\n+                                        \"value\": \"4\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"v3.1.0\",\n+                                        \"value\": \"3\"\n                                     }\n                                 ],\n-                                \"description\": \"Specifies the maximum amount of time allowed to pass before offsets must be committed. This value impacts how often offsets will be committed.  Committing offsets less often increases throughput but also increases the window of potential data duplication in the event of a rebalance or JVM restart between commits.  This value is also related to maximum poll records and the use of a message demarcator.  When using a message demarcator we can have far more uncommitted messages than when we're not as there is much less for us to keep track of in memory.\",\n-                                \"displayName\": \"Max Uncommitted Time\",\n+                                \"defaultValue\": \"0\",\n+                                \"description\": \"The MQTT specification version when connecting with the broker. See the allowable value descriptions for more details.\",\n+                                \"displayName\": \"MQTT Specification Version\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"max-uncommit-offset-wait\",\n-                                \"required\": false,\n+                                \"name\": \"MQTT Specification Version\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"max.poll.records\": {\n-                                \"defaultValue\": \"10000\",\n-                                \"description\": \"Specifies the maximum number of records Kafka should return in a single poll.\",\n-                                \"displayName\": \"Max Poll Records\",\n+                            \"Max Queue Size\": {\n+                                \"description\": \"The MQTT messages are always being sent to subscribers on a topic regardless of how frequently the processor is scheduled to run. If the 'Run Schedule' is significantly behind the rate at which the messages are arriving to this processor, then a back up can occur in the internal queue of this processor. This property specifies the maximum number of messages this processor will hold in memory at one time in the internal queue. This data would be lost in case of a NiFi restart.\",\n+                                \"displayName\": \"Max Queue Size\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"max.poll.records\",\n-                                \"required\": false,\n+                                \"name\": \"Max Queue Size\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"message-header-encoding\": {\n-                                \"defaultValue\": \"UTF-8\",\n-                                \"description\": \"Any message header that is found on a Kafka message will be added to the outbound FlowFile as an attribute. This property indicates the Character Encoding to use for deserializing the headers.\",\n-                                \"displayName\": \"Message Header Encoding\",\n+                            \"Password\": {\n+                                \"description\": \"Password to use when connecting to the broker\",\n+                                \"displayName\": \"Password\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"message-header-encoding\",\n+                                \"name\": \"Password\",\n                                 \"required\": false,\n-                                \"sensitive\": false\n+                                \"sensitive\": true\n                             },\n-                            \"output-strategy\": {\n+                            \"Quality of Service(QoS)\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Write only the Kafka Record value to the FlowFile record.\",\n-                                        \"displayName\": \"Use Content as Value\",\n-                                        \"value\": \"USE_VALUE\"\n+                                        \"description\": \"Best effort delivery. A message won\\u2019t be acknowledged by the receiver or stored and redelivered by the sender. This is often called \\u201cfire and forget\\u201d and provides the same guarantee as the underlying TCP protocol.\",\n+                                        \"displayName\": \"0 - At most once\",\n+                                        \"value\": \"0\"\n                                     },\n                                     {\n-                                        \"description\": \"Write the Kafka Record key, value, headers, and metadata into the FlowFile record. (See processor usage for more information.)\",\n-                                        \"displayName\": \"Use Wrapper\",\n-                                        \"value\": \"USE_WRAPPER\"\n+                                        \"description\": \"Guarantees that a message will be delivered at least once to the receiver. The message can also be delivered more than once\",\n+                                        \"displayName\": \"1 - At least once\",\n+                                        \"value\": \"1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Guarantees that each message is received only once by the counterpart. It is the safest and also the slowest quality of service level. The guarantee is provided by two round-trip flows between sender and receiver.\",\n+                                        \"displayName\": \"2 - Exactly once\",\n+                                        \"value\": \"2\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"USE_VALUE\",\n-                                \"description\": \"The format used to output the Kafka record into a FlowFile record.\",\n-                                \"displayName\": \"Output Strategy\",\n+                                \"defaultValue\": \"0\",\n+                                \"description\": \"The Quality of Service (QoS) to receive the message with. Accepts values '0', '1' or '2'; '0' for 'at most once', '1' for 'at least once', '2' for 'exactly once'.\",\n+                                \"displayName\": \"Quality of Service (QoS)\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"output-strategy\",\n+                                \"name\": \"Quality of Service(QoS)\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"record-reader\": {\n-                                \"description\": \"The Record Reader to use for incoming FlowFiles\",\n-                                \"displayName\": \"Value Record Reader\",\n+                            \"SSL Context Service\": {\n+                                \"description\": \"The SSL Context Service used to provide client certificate information for TLS/SSL connections.\",\n+                                \"displayName\": \"SSL Context Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"record-reader\",\n-                                \"required\": true,\n+                                \"name\": \"SSL Context Service\",\n+                                \"required\": false,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n                                     \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n+                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             },\n-                            \"record-writer\": {\n-                                \"description\": \"The Record Writer to use in order to serialize the data before sending to Kafka\",\n-                                \"displayName\": \"Record Value Writer\",\n+                            \"Session Expiry Interval\": {\n+                                \"defaultValue\": \"24 hrs\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"5\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"MQTT Specification Version\",\n+                                        \"propertyName\": \"MQTT Specification Version\"\n+                                    },\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"false\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Session state\",\n+                                        \"propertyName\": \"Session state\"\n+                                    }\n+                                ],\n+                                \"description\": \"After this interval the broker will expire the client and clear the session state.\",\n+                                \"displayName\": \"Session Expiry Interval\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"record-writer\",\n-                                \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            },\n-                            \"sasl.kerberos.keytab\": {\n-                                \"description\": \"Keytab credentials used for authentication with Kerberos\",\n-                                \"displayName\": \"Kerberos Keytab\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"sasl.kerberos.keytab\",\n-                                \"required\": false,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"SINGLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\"\n-                                    ]\n-                                },\n-                                \"sensitive\": false\n-                            },\n-                            \"sasl.kerberos.principal\": {\n-                                \"description\": \"Principal used for authentication with Kerberos\",\n-                                \"displayName\": \"Kerberos Principal\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"sasl.kerberos.principal\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"sasl.kerberos.service.name\": {\n-                                \"description\": \"The service name that matches the primary name of the Kafka server configured in the broker JAAS configuration\",\n-                                \"displayName\": \"Kerberos Service Name\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"sasl.kerberos.service.name\",\n+                                \"name\": \"Session Expiry Interval\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"sasl.mechanism\": {\n+                            \"Session state\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"General Security Services API for Kerberos authentication\",\n-                                        \"displayName\": \"GSSAPI\",\n-                                        \"value\": \"GSSAPI\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Plain username and password authentication\",\n-                                        \"displayName\": \"PLAIN\",\n-                                        \"value\": \"PLAIN\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Salted Challenge Response Authentication Mechanism using SHA-512 with username and password\",\n-                                        \"displayName\": \"SCRAM-SHA-256\",\n-                                        \"value\": \"SCRAM-SHA-256\"\n+                                        \"description\": \"Client and Server discard any previous session and start a new one. This session lasts as long as the network connection. State data associated with this session is not reused in any subsequent session\",\n+                                        \"displayName\": \"Clean Session\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n-                                        \"description\": \"Salted Challenge Response Authentication Mechanism using SHA-256 with username and password\",\n-                                        \"displayName\": \"SCRAM-SHA-512\",\n-                                        \"value\": \"SCRAM-SHA-512\"\n+                                        \"description\": \"Server resumes communications with the client based on state from the current session (as identified by the ClientID). The client and server store the session after the client and server are disconnected. After the disconnection of a session that was not a clean session, the server stores further QoS 1 and QoS 2 messages that match any subscriptions that the client had at the time of disconnection as part of the session state\",\n+                                        \"displayName\": \"Resume Session\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"GSSAPI\",\n-                                \"description\": \"SASL mechanism used for authentication. Corresponds to Kafka Client sasl.mechanism property\",\n-                                \"displayName\": \"SASL Mechanism\",\n+                                \"defaultValue\": \"true\",\n+                                \"description\": \"Whether to start a fresh or resume previous flows. See the allowable value descriptions for more details.\",\n+                                \"displayName\": \"Session state\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"sasl.mechanism\",\n+                                \"name\": \"Session state\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"sasl.password\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"PLAIN\",\n-                                            \"SCRAM-SHA-512\",\n-                                            \"SCRAM-SHA-256\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"SASL Mechanism\",\n-                                        \"propertyName\": \"sasl.mechanism\"\n-                                    }\n-                                ],\n-                                \"description\": \"Password provided with configured username when using PLAIN or SCRAM SASL Mechanisms\",\n-                                \"displayName\": \"Password\",\n+                            \"Topic Filter\": {\n+                                \"description\": \"The MQTT topic filter to designate the topics to subscribe to.\",\n+                                \"displayName\": \"Topic Filter\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"sasl.password\",\n+                                \"name\": \"Topic Filter\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Username\": {\n+                                \"description\": \"Username to use when connecting to the broker\",\n+                                \"displayName\": \"Username\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Username\",\n                                 \"required\": false,\n-                                \"sensitive\": true\n+                                \"sensitive\": false\n                             },\n-                            \"sasl.token.auth\": {\n+                            \"add-attributes-as-fields\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"true\",\n                                         \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"false\",\n                                         \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"false\",\n+                                \"defaultValue\": \"true\",\n                                 \"dependencies\": [\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"SCRAM-SHA-512\",\n-                                            \"SCRAM-SHA-256\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"SASL Mechanism\",\n-                                        \"propertyName\": \"sasl.mechanism\"\n+                                        \"propertyDisplayName\": \"Record Reader\",\n+                                        \"propertyName\": \"record-reader\"\n                                     }\n                                 ],\n-                                \"description\": \"Enables or disables Token authentication when using SCRAM SASL Mechanisms\",\n-                                \"displayName\": \"Token Authentication\",\n+                                \"description\": \"If setting this property to true, default fields are going to be added in each record: _topic, _qos, _isDuplicate, _isRetained.\",\n+                                \"displayName\": \"Add attributes as fields\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"sasl.token.auth\",\n-                                \"required\": false,\n+                                \"name\": \"add-attributes-as-fields\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"sasl.username\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"PLAIN\",\n-                                            \"SCRAM-SHA-512\",\n-                                            \"SCRAM-SHA-256\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"SASL Mechanism\",\n-                                        \"propertyName\": \"sasl.mechanism\"\n-                                    }\n-                                ],\n-                                \"description\": \"Username provided with configured password when using PLAIN or SCRAM SASL Mechanisms\",\n-                                \"displayName\": \"Username\",\n+                            \"message-demarcator\": {\n+                                \"description\": \"With this property, you have an option to output FlowFiles which contains multiple messages. This property allows you to provide a string (interpreted as UTF-8) to use for demarcating apart multiple messages. This is an optional property ; if not provided, and if not defining a Record Reader/Writer, each message received will result in a single FlowFile. To enter special character such as 'new line' use CTRL+Enter or Shift+Enter depending on the OS.\",\n+                                \"displayName\": \"Message Demarcator\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"sasl.username\",\n+                                \"name\": \"message-demarcator\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"security.protocol\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"PLAINTEXT\",\n-                                        \"value\": \"PLAINTEXT\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"SSL\",\n-                                        \"value\": \"SSL\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"SASL_PLAINTEXT\",\n-                                        \"value\": \"SASL_PLAINTEXT\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"SASL_SSL\",\n-                                        \"value\": \"SASL_SSL\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"PLAINTEXT\",\n-                                \"description\": \"Security protocol used to communicate with brokers. Corresponds to Kafka Client security.protocol property\",\n-                                \"displayName\": \"Security Protocol\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"security.protocol\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"separate-by-key\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"If true, two Records will only be added to the same FlowFile if both of the Kafka Messages have identical keys.\",\n-                                \"displayName\": \"Separate By Key\",\n+                            \"record-reader\": {\n+                                \"description\": \"The Record Reader to use for parsing received MQTT Messages into Records.\",\n+                                \"displayName\": \"Record Reader\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"separate-by-key\",\n+                                \"name\": \"record-reader\",\n                                 \"required\": false,\n-                                \"sensitive\": false\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n                             },\n-                            \"ssl.context.service\": {\n-                                \"description\": \"Service supporting SSL communication with Kafka brokers\",\n-                                \"displayName\": \"SSL Context Service\",\n+                            \"record-writer\": {\n+                                \"description\": \"The Record Writer to use for serializing Records before writing them to a FlowFile.\",\n+                                \"displayName\": \"Record Writer\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"ssl.context.service\",\n+                                \"name\": \"record-writer\",\n                                 \"required\": false,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n                                     \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n+                                    \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n                                     \"version\": \"1.27.0\"\n                                 }\n-                            },\n-                            \"topic\": {\n-                                \"description\": \"The name of the Kafka Topic(s) to pull from. More than one can be supplied if comma separated.\",\n-                                \"displayName\": \"Topic Name(s)\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"topic\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"topic_type\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"Topic is a full topic name or comma separated list of names\",\n-                                        \"displayName\": \"names\",\n-                                        \"value\": \"names\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Topic is a regex using the Java Pattern syntax\",\n-                                        \"displayName\": \"pattern\",\n-                                        \"value\": \"pattern\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"names\",\n-                                \"description\": \"Specifies whether the Topic(s) provided are a comma separated list of names or a single regular expression\",\n-                                \"displayName\": \"Topic Name Format\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"topic_type\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n                             }\n                         },\n                         \"seeAlso\": [\n-                            \"org.apache.nifi.processors.kafka.pubsub.ConsumeKafka_2_6\",\n-                            \"org.apache.nifi.processors.kafka.pubsub.PublishKafkaRecord_2_6\",\n-                            \"org.apache.nifi.processors.kafka.pubsub.PublishKafka_2_6\"\n+                            \"org.apache.nifi.processors.mqtt.PublishMQTT\"\n                         ],\n                         \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"FlowFiles received from Kafka.  Depending on demarcation strategy it is a flow file per message or a bundle of messages grouped by topic and partition.\",\n-                                \"name\": \"success\"\n+                                \"description\": \"If a message cannot be parsed using the configured Record Reader, the contents of the message will be routed to this Relationship as its own individual FlowFile.\",\n+                                \"name\": \"parse.failure\"\n                             },\n                             {\n-                                \"description\": \"If a message from Kafka cannot be parsed using the configured Record Reader, the contents of the message will be routed to this Relationship as its own individual FlowFile.\",\n-                                \"name\": \"parse.failure\"\n+                                \"description\": \"The MQTT message output\",\n+                                \"name\": \"Message\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n                         \"supportsBatching\": false,\n-                        \"supportsDynamicProperties\": true,\n+                        \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n+                        \"systemResourceConsiderations\": [\n+                            {\n+                                \"description\": \"The 'Max Queue Size' specifies the maximum number of messages that can be hold in memory by NiFi by a single instance of this processor. A high value for this property could represent a lot of data being stored in memory.\",\n+                                \"resource\": \"MEMORY\"\n+                            }\n+                        ],\n                         \"tags\": [\n-                            \"2.6\",\n-                            \"Consume\",\n-                            \"Get\",\n-                            \"Ingest\",\n-                            \"Ingress\",\n-                            \"Kafka\",\n-                            \"PubSub\",\n-                            \"Record\",\n-                            \"Topic\",\n-                            \"avro\",\n-                            \"csv\",\n-                            \"json\"\n+                            \"IOT\",\n+                            \"MQTT\",\n+                            \"consume\",\n+                            \"listen\",\n+                            \"subscribe\"\n                         ],\n-                        \"triggerSerially\": false,\n+                        \"triggerSerially\": true,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.kafka.pubsub.ConsumeKafkaRecord_2_6\",\n-                        \"typeDescription\": \"Consumes messages from Apache Kafka specifically built against the Kafka 2.6 Consumer API. The complementary NiFi processor for sending messages is PublishKafkaRecord_2_6. Please note that, at this time, the Processor assumes that all records that are retrieved from a given partition have the same schema. If any of the Kafka messages are pulled but cannot be parsed or written with the configured Record Reader or Record Writer, the contents of the message will be written to a separate FlowFile, and that FlowFile will be transferred to the 'parse.failure' relationship. Otherwise, each FlowFile is sent to the 'success' relationship and may contain many individual messages within the single FlowFile. A 'record.count' attribute is added to indicate how many messages are contained in the FlowFile. No two Kafka messages will be placed into the same FlowFile if they have different schemas, or if they have different values for a message header that is included by the <Headers to Add as Attributes> property.\",\n+                        \"type\": \"org.apache.nifi.processors.mqtt.ConsumeMQTT\",\n+                        \"typeDescription\": \"Subscribes to a topic and receives messages from an MQTT broker\",\n                         \"version\": \"1.27.0\",\n                         \"writesAttributes\": [\n                             {\n                                 \"description\": \"The number of records received\",\n                                 \"name\": \"record.count\"\n                             },\n                             {\n-                                \"description\": \"The MIME Type that is provided by the configured Record Writer\",\n-                                \"name\": \"mime.type\"\n+                                \"description\": \"MQTT broker that was the message source\",\n+                                \"name\": \"mqtt.broker\"\n                             },\n                             {\n-                                \"description\": \"The partition of the topic the records are from\",\n-                                \"name\": \"kafka.partition\"\n+                                \"description\": \"MQTT topic on which message was received\",\n+                                \"name\": \"mqtt.topic\"\n                             },\n                             {\n-                                \"description\": \"The timestamp of the message in the partition of the topic.\",\n-                                \"name\": \"kafka.timestamp\"\n+                                \"description\": \"The quality of service for this message.\",\n+                                \"name\": \"mqtt.qos\"\n                             },\n                             {\n-                                \"description\": \"The topic records are from\",\n-                                \"name\": \"kafka.topic\"\n+                                \"description\": \"Whether or not this message might be a duplicate of one which has already been received.\",\n+                                \"name\": \"mqtt.isDuplicate\"\n+                            },\n+                            {\n+                                \"description\": \"Whether or not this message was from a current publisher, or was \\\"retained\\\" by the server as the last message published on the topic.\",\n+                                \"name\": \"mqtt.isRetained\"\n                             }\n                         ]\n                     },\n                     {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-kafka-2-6-nar\",\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-mqtt-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -73208,1090 +71373,871 @@\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n-                        \"dynamicProperties\": [\n-                            {\n-                                \"description\": \"These properties will be added on the Kafka configuration after loading any provided configuration properties. In the event a dynamic property represents a property that was already set, its value will be ignored and WARN message logged. For the list of available Kafka properties please refer to: http://kafka.apache.org/documentation.html#configuration. \",\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"name\": \"The name of a Kafka configuration property.\",\n-                                \"value\": \"The value of a given Kafka configuration property.\"\n-                            }\n-                        ],\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Commit Offsets\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"true\",\n-                                \"description\": \"Specifies whether or not this Processor should commit the offsets to Kafka after receiving messages. Typically, we want this value set to true so that messages that are received are not duplicated. However, in certain scenarios, we may want to avoid committing the offsets, that the data can be processed and later acknowledged by PublishKafkaRecord in order to provide Exactly Once semantics. See Processor's Usage / Additional Details for more information.\",\n-                                \"displayName\": \"Commit Offsets\",\n+                            \"Broker URI\": {\n+                                \"description\": \"The URI(s) to use to connect to the MQTT broker (e.g., tcp://localhost:1883). The 'tcp', 'ssl', 'ws' and 'wss' schemes are supported. In order to use 'ssl', the SSL Context Service property must be set. When a comma-separated URI list is set (e.g., tcp://localhost:1883,tcp://localhost:1884), the processor will use a round-robin algorithm to connect to the brokers on connection failure.\",\n+                                \"displayName\": \"Broker URI\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Broker URI\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Client ID\": {\n+                                \"description\": \"MQTT client ID to use. If not set, a UUID will be generated.\",\n+                                \"displayName\": \"Client ID\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Client ID\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Connection Timeout (seconds)\": {\n+                                \"defaultValue\": \"30\",\n+                                \"description\": \"Maximum time interval the client will wait for the network connection to the MQTT server to be established. The default timeout is 30 seconds. A value of 0 disables timeout processing meaning the client will wait until the network connection is made successfully or fails.\",\n+                                \"displayName\": \"Connection Timeout (seconds)\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Commit Offsets\",\n+                                \"name\": \"Connection Timeout (seconds)\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Communications Timeout\": {\n-                                \"defaultValue\": \"60 secs\",\n-                                \"description\": \"Specifies the timeout that the consumer should use when communicating with the Kafka Broker\",\n-                                \"displayName\": \"Communications Timeout\",\n+                            \"Keep Alive Interval (seconds)\": {\n+                                \"defaultValue\": \"60\",\n+                                \"description\": \"Defines the maximum time interval between messages sent or received. It enables the client to detect if the server is no longer available, without having to wait for the TCP/IP timeout. The client will ensure that at least one message travels across the network within each keep alive period. In the absence of a data-related message during the time period, the client sends a very small \\\"ping\\\" message, which the server will acknowledge. A value of 0 disables keepalive processing in the client.\",\n+                                \"displayName\": \"Keep Alive Interval (seconds)\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Communications Timeout\",\n-                                \"required\": true,\n+                                \"name\": \"Keep Alive Interval (seconds)\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"auto.offset.reset\": {\n+                            \"Last Will Message\": {\n+                                \"description\": \"The message to send as the client's Last Will.\",\n+                                \"displayName\": \"Last Will Message\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Last Will Message\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Last Will QoS Level\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Automatically reset the offset to the earliest offset\",\n-                                        \"displayName\": \"earliest\",\n-                                        \"value\": \"earliest\"\n+                                        \"description\": \"Best effort delivery. A message won\\u2019t be acknowledged by the receiver or stored and redelivered by the sender. This is often called \\u201cfire and forget\\u201d and provides the same guarantee as the underlying TCP protocol.\",\n+                                        \"displayName\": \"0 - At most once\",\n+                                        \"value\": \"0\"\n                                     },\n                                     {\n-                                        \"description\": \"Automatically reset the offset to the latest offset\",\n-                                        \"displayName\": \"latest\",\n-                                        \"value\": \"latest\"\n+                                        \"description\": \"Guarantees that a message will be delivered at least once to the receiver. The message can also be delivered more than once\",\n+                                        \"displayName\": \"1 - At least once\",\n+                                        \"value\": \"1\"\n                                     },\n                                     {\n-                                        \"description\": \"Throw exception to the consumer if no previous offset is found for the consumer's group\",\n-                                        \"displayName\": \"none\",\n-                                        \"value\": \"none\"\n+                                        \"description\": \"Guarantees that each message is received only once by the counterpart. It is the safest and also the slowest quality of service level. The guarantee is provided by two round-trip flows between sender and receiver.\",\n+                                        \"displayName\": \"2 - Exactly once\",\n+                                        \"value\": \"2\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"latest\",\n-                                \"description\": \"Allows you to manage the condition when there is no initial offset in Kafka or if the current offset does not exist any more on the server (e.g. because that data has been deleted). Corresponds to Kafka's 'auto.offset.reset' property.\",\n-                                \"displayName\": \"Offset Reset\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"auto.offset.reset\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"aws.profile.name\": {\n+                                \"defaultValue\": \"0\",\n                                 \"dependencies\": [\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"AWS_MSK_IAM\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"SASL Mechanism\",\n-                                        \"propertyName\": \"sasl.mechanism\"\n+                                        \"propertyDisplayName\": \"Last Will Message\",\n+                                        \"propertyName\": \"Last Will Message\"\n                                     }\n                                 ],\n-                                \"description\": \"The Amazon Web Services Profile to select when multiple profiles are available.\",\n-                                \"displayName\": \"AWS Profile Name\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"aws.profile.name\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"bootstrap.servers\": {\n-                                \"defaultValue\": \"localhost:9092\",\n-                                \"description\": \"Comma-separated list of Kafka Brokers in the format host:port\",\n-                                \"displayName\": \"Kafka Brokers\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"bootstrap.servers\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"group.id\": {\n-                                \"description\": \"A Group ID is used to identify consumers that are within the same consumer group. Corresponds to Kafka's 'group.id' property.\",\n-                                \"displayName\": \"Group ID\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"group.id\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"header-name-regex\": {\n-                                \"description\": \"A Regular Expression that is matched against all message headers. Any message header whose name matches the regex will be added to the FlowFile as an Attribute. If not specified, no Header values will be added as FlowFile attributes. If two messages have a different value for the same header and that header is selected by the provided regex, then those two messages must be added to different FlowFiles. As a result, users should be cautious about using a regex like \\\".*\\\" if messages are expected to have header values that are unique per message, such as an identifier or timestamp, because it will prevent NiFi from bundling the messages together efficiently.\",\n-                                \"displayName\": \"Headers to Add as Attributes (Regex)\",\n+                                \"description\": \"QoS level to be used when publishing the Last Will Message.\",\n+                                \"displayName\": \"Last Will QoS Level\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"header-name-regex\",\n-                                \"required\": false,\n+                                \"name\": \"Last Will QoS Level\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"honor-transactions\": {\n+                            \"Last Will Retain\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"true\",\n                                         \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"false\",\n                                         \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"true\",\n-                                \"description\": \"Specifies whether or not NiFi should honor transactional guarantees when communicating with Kafka. If false, the Processor will use an \\\"isolation level\\\" of read_uncomitted. This means that messages will be received as soon as they are written to Kafka but will be pulled, even if the producer cancels the transactions. If this value is true, NiFi will not receive any messages for which the producer's transaction was canceled, but this can result in some latency since the consumer must wait for the producer to finish its entire transaction instead of pulling as the messages become available.\",\n-                                \"displayName\": \"Honor Transactions\",\n+                                \"defaultValue\": \"false\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"propertyDisplayName\": \"Last Will Message\",\n+                                        \"propertyName\": \"Last Will Message\"\n+                                    }\n+                                ],\n+                                \"description\": \"Whether to retain the client's Last Will.\",\n+                                \"displayName\": \"Last Will Retain\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"honor-transactions\",\n+                                \"name\": \"Last Will Retain\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"kerberos-credentials-service\": {\n-                                \"description\": \"Service supporting generalized credentials authentication with Kerberos\",\n-                                \"displayName\": \"Kerberos Credentials Service\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"kerberos-credentials-service\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.kerberos.KerberosCredentialsService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            },\n-                            \"kerberos-user-service\": {\n-                                \"description\": \"Service supporting user authentication with Kerberos\",\n-                                \"displayName\": \"Kerberos User Service\",\n+                            \"Last Will Topic\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"propertyDisplayName\": \"Last Will Message\",\n+                                        \"propertyName\": \"Last Will Message\"\n+                                    }\n+                                ],\n+                                \"description\": \"The topic to send the client's Last Will to.\",\n+                                \"displayName\": \"Last Will Topic\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"kerberos-user-service\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.kerberos.SelfContainedKerberosUserService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n+                                \"name\": \"Last Will Topic\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n                             },\n-                            \"key-attribute-encoding\": {\n+                            \"MQTT Specification Version\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"The key is interpreted as a UTF-8 Encoded string.\",\n-                                        \"displayName\": \"UTF-8 Encoded\",\n-                                        \"value\": \"utf-8\"\n+                                        \"description\": \"Start with v3.1.1 and fallback to v3.1.0 if not supported by a broker\",\n+                                        \"displayName\": \"v3 AUTO\",\n+                                        \"value\": \"0\"\n                                     },\n                                     {\n-                                        \"description\": \"The key is interpreted as arbitrary binary data and is encoded using hexadecimal characters with uppercase letters\",\n-                                        \"displayName\": \"Hex Encoded\",\n-                                        \"value\": \"hex\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"v5.0\",\n+                                        \"value\": \"5\"\n                                     },\n                                     {\n-                                        \"description\": \"The key will not be added as an Attribute\",\n-                                        \"displayName\": \"Do Not Add Key as Attribute\",\n-                                        \"value\": \"do-not-add\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"v3.1.1\",\n+                                        \"value\": \"4\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"v3.1.0\",\n+                                        \"value\": \"3\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"utf-8\",\n-                                \"description\": \"FlowFiles that are emitted have an attribute named 'kafka.key'. This property dictates how the value of the attribute should be encoded.\",\n-                                \"displayName\": \"Key Attribute Encoding\",\n+                                \"defaultValue\": \"0\",\n+                                \"description\": \"The MQTT specification version when connecting with the broker. See the allowable value descriptions for more details.\",\n+                                \"displayName\": \"MQTT Specification Version\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"key-attribute-encoding\",\n+                                \"name\": \"MQTT Specification Version\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"max-uncommit-offset-wait\": {\n-                                \"defaultValue\": \"1 secs\",\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"true\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Commit Offsets\",\n-                                        \"propertyName\": \"Commit Offsets\"\n-                                    }\n-                                ],\n-                                \"description\": \"Specifies the maximum amount of time allowed to pass before offsets must be committed. This value impacts how often offsets will be committed.  Committing offsets less often increases throughput but also increases the window of potential data duplication in the event of a rebalance or JVM restart between commits.  This value is also related to maximum poll records and the use of a message demarcator.  When using a message demarcator we can have far more uncommitted messages than when we're not as there is much less for us to keep track of in memory.\",\n-                                \"displayName\": \"Max Uncommitted Time\",\n+                            \"Password\": {\n+                                \"description\": \"Password to use when connecting to the broker\",\n+                                \"displayName\": \"Password\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"max-uncommit-offset-wait\",\n+                                \"name\": \"Password\",\n                                 \"required\": false,\n-                                \"sensitive\": false\n+                                \"sensitive\": true\n                             },\n-                            \"max.poll.records\": {\n-                                \"defaultValue\": \"10000\",\n-                                \"description\": \"Specifies the maximum number of records Kafka should return in a single poll.\",\n-                                \"displayName\": \"Max Poll Records\",\n+                            \"Quality of Service(QoS)\": {\n+                                \"description\": \"The Quality of Service (QoS) to send the message with. Accepts three values '0', '1' and '2'; '0' for 'at most once', '1' for 'at least once', '2' for 'exactly once'. Expression language is allowed in order to support publishing messages with different QoS but the end value of the property must be either '0', '1' or '2'. \",\n+                                \"displayName\": \"Quality of Service (QoS)\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"max.poll.records\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Quality of Service(QoS)\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"message-demarcator\": {\n-                                \"description\": \"Since KafkaConsumer receives messages in batches, you have an option to output FlowFiles which contains all Kafka messages in a single batch for a given topic and partition and this property allows you to provide a string (interpreted as UTF-8) to use for demarcating apart multiple Kafka messages. This is an optional property and if not provided each Kafka message received will result in a single FlowFile which  time it is triggered. To enter special character such as 'new line' use CTRL+Enter or Shift+Enter depending on the OS\",\n-                                \"displayName\": \"Message Demarcator\",\n+                            \"Retain Message\": {\n+                                \"description\": \"Whether or not the retain flag should be set on the MQTT message.\",\n+                                \"displayName\": \"Retain Message\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"message-demarcator\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Retain Message\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"message-header-encoding\": {\n-                                \"defaultValue\": \"UTF-8\",\n-                                \"description\": \"Any message header that is found on a Kafka message will be added to the outbound FlowFile as an attribute. This property indicates the Character Encoding to use for deserializing the headers.\",\n-                                \"displayName\": \"Message Header Encoding\",\n+                            \"SSL Context Service\": {\n+                                \"description\": \"The SSL Context Service used to provide client certificate information for TLS/SSL connections.\",\n+                                \"displayName\": \"SSL Context Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"message-header-encoding\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"sasl.kerberos.keytab\": {\n-                                \"description\": \"Keytab credentials used for authentication with Kerberos\",\n-                                \"displayName\": \"Kerberos Keytab\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"sasl.kerberos.keytab\",\n-                                \"required\": false,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"SINGLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\"\n-                                    ]\n-                                },\n-                                \"sensitive\": false\n-                            },\n-                            \"sasl.kerberos.principal\": {\n-                                \"description\": \"Principal used for authentication with Kerberos\",\n-                                \"displayName\": \"Kerberos Principal\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"sasl.kerberos.principal\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"sasl.kerberos.service.name\": {\n-                                \"description\": \"The service name that matches the primary name of the Kafka server configured in the broker JAAS configuration\",\n-                                \"displayName\": \"Kerberos Service Name\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"sasl.kerberos.service.name\",\n+                                \"name\": \"SSL Context Service\",\n                                 \"required\": false,\n-                                \"sensitive\": false\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n                             },\n-                            \"sasl.mechanism\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"General Security Services API for Kerberos authentication\",\n-                                        \"displayName\": \"GSSAPI\",\n-                                        \"value\": \"GSSAPI\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Plain username and password authentication\",\n-                                        \"displayName\": \"PLAIN\",\n-                                        \"value\": \"PLAIN\"\n-                                    },\n+                            \"Session Expiry Interval\": {\n+                                \"defaultValue\": \"24 hrs\",\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"Salted Challenge Response Authentication Mechanism using SHA-512 with username and password\",\n-                                        \"displayName\": \"SCRAM-SHA-256\",\n-                                        \"value\": \"SCRAM-SHA-256\"\n+                                        \"dependentValues\": [\n+                                            \"5\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"MQTT Specification Version\",\n+                                        \"propertyName\": \"MQTT Specification Version\"\n                                     },\n                                     {\n-                                        \"description\": \"Salted Challenge Response Authentication Mechanism using SHA-256 with username and password\",\n-                                        \"displayName\": \"SCRAM-SHA-512\",\n-                                        \"value\": \"SCRAM-SHA-512\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"GSSAPI\",\n-                                \"description\": \"SASL mechanism used for authentication. Corresponds to Kafka Client sasl.mechanism property\",\n-                                \"displayName\": \"SASL Mechanism\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"sasl.mechanism\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"sasl.password\": {\n-                                \"dependencies\": [\n-                                    {\n                                         \"dependentValues\": [\n-                                            \"PLAIN\",\n-                                            \"SCRAM-SHA-512\",\n-                                            \"SCRAM-SHA-256\"\n+                                            \"false\"\n                                         ],\n-                                        \"propertyDisplayName\": \"SASL Mechanism\",\n-                                        \"propertyName\": \"sasl.mechanism\"\n+                                        \"propertyDisplayName\": \"Session state\",\n+                                        \"propertyName\": \"Session state\"\n                                     }\n                                 ],\n-                                \"description\": \"Password provided with configured username when using PLAIN or SCRAM SASL Mechanisms\",\n-                                \"displayName\": \"Password\",\n+                                \"description\": \"After this interval the broker will expire the client and clear the session state.\",\n+                                \"displayName\": \"Session Expiry Interval\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"sasl.password\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Session Expiry Interval\",\n                                 \"required\": false,\n-                                \"sensitive\": true\n+                                \"sensitive\": false\n                             },\n-                            \"sasl.token.auth\": {\n+                            \"Session state\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n+                                        \"description\": \"Client and Server discard any previous session and start a new one. This session lasts as long as the network connection. State data associated with this session is not reused in any subsequent session\",\n+                                        \"displayName\": \"Clean Session\",\n                                         \"value\": \"true\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n+                                        \"description\": \"Server resumes communications with the client based on state from the current session (as identified by the ClientID). The client and server store the session after the client and server are disconnected. After the disconnection of a session that was not a clean session, the server stores further QoS 1 and QoS 2 messages that match any subscriptions that the client had at the time of disconnection as part of the session state\",\n+                                        \"displayName\": \"Resume Session\",\n                                         \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"false\",\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"SCRAM-SHA-512\",\n-                                            \"SCRAM-SHA-256\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"SASL Mechanism\",\n-                                        \"propertyName\": \"sasl.mechanism\"\n-                                    }\n-                                ],\n-                                \"description\": \"Enables or disables Token authentication when using SCRAM SASL Mechanisms\",\n-                                \"displayName\": \"Token Authentication\",\n+                                \"defaultValue\": \"true\",\n+                                \"description\": \"Whether to start a fresh or resume previous flows. See the allowable value descriptions for more details.\",\n+                                \"displayName\": \"Session state\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"sasl.token.auth\",\n-                                \"required\": false,\n+                                \"name\": \"Session state\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"sasl.username\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"PLAIN\",\n-                                            \"SCRAM-SHA-512\",\n-                                            \"SCRAM-SHA-256\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"SASL Mechanism\",\n-                                        \"propertyName\": \"sasl.mechanism\"\n-                                    }\n-                                ],\n-                                \"description\": \"Username provided with configured password when using PLAIN or SCRAM SASL Mechanisms\",\n+                            \"Topic\": {\n+                                \"description\": \"The topic to publish the message to.\",\n+                                \"displayName\": \"Topic\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Topic\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Username\": {\n+                                \"description\": \"Username to use when connecting to the broker\",\n                                 \"displayName\": \"Username\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"sasl.username\",\n+                                \"name\": \"Username\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"security.protocol\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"PLAINTEXT\",\n-                                        \"value\": \"PLAINTEXT\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"SSL\",\n-                                        \"value\": \"SSL\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"SASL_PLAINTEXT\",\n-                                        \"value\": \"SASL_PLAINTEXT\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"SASL_SSL\",\n-                                        \"value\": \"SASL_SSL\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"PLAINTEXT\",\n-                                \"description\": \"Security protocol used to communicate with brokers. Corresponds to Kafka Client security.protocol property\",\n-                                \"displayName\": \"Security Protocol\",\n+                            \"message-demarcator\": {\n+                                \"description\": \"With this property, you have an option to publish multiple messages from a single FlowFile. This property allows you to provide a string (interpreted as UTF-8) to use for demarcating apart the FlowFile content. This is an optional property ; if not provided, and if not defining a Record Reader/Writer, each FlowFile will be published as a single message. To enter special character such as 'new line' use CTRL+Enter or Shift+Enter depending on the OS.\",\n+                                \"displayName\": \"Message Demarcator\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"security.protocol\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"message-demarcator\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"separate-by-key\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"If true, and the <Message Demarcator> property is set, two messages will only be added to the same FlowFile if both of the Kafka Messages have identical keys.\",\n-                                \"displayName\": \"Separate By Key\",\n+                            \"record-reader\": {\n+                                \"description\": \"The Record Reader to use for parsing the incoming FlowFile into Records.\",\n+                                \"displayName\": \"Record Reader\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"separate-by-key\",\n+                                \"name\": \"record-reader\",\n                                 \"required\": false,\n-                                \"sensitive\": false\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n                             },\n-                            \"ssl.context.service\": {\n-                                \"description\": \"Service supporting SSL communication with Kafka brokers\",\n-                                \"displayName\": \"SSL Context Service\",\n+                            \"record-writer\": {\n+                                \"description\": \"The Record Writer to use for serializing Records before publishing them as an MQTT Message.\",\n+                                \"displayName\": \"Record Writer\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"ssl.context.service\",\n+                                \"name\": \"record-writer\",\n                                 \"required\": false,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n                                     \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n+                                    \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n                                     \"version\": \"1.27.0\"\n                                 }\n+                            }\n+                        },\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.processors.mqtt.ConsumeMQTT\"\n+                        ],\n+                        \"sideEffectFree\": false,\n+                        \"supportedRelationships\": [\n+                            {\n+                                \"description\": \"FlowFiles that are sent successfully to the destination are transferred to this relationship.\",\n+                                \"name\": \"success\"\n                             },\n-                            \"topic\": {\n-                                \"description\": \"The name of the Kafka Topic(s) to pull from. More than one can be supplied if comma separated.\",\n-                                \"displayName\": \"Topic Name(s)\",\n+                            {\n+                                \"description\": \"FlowFiles that failed to send to the destination are transferred to this relationship.\",\n+                                \"name\": \"failure\"\n+                            }\n+                        ],\n+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\"\n+                        ],\n+                        \"supportsBatching\": true,\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicRelationships\": false,\n+                        \"supportsEventDriven\": false,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"systemResourceConsiderations\": [\n+                            {\n+                                \"description\": \"An instance of this component can cause high usage of this system resource.  Multiple instances or high concurrency settings may result a degradation of performance.\",\n+                                \"resource\": \"MEMORY\"\n+                            }\n+                        ],\n+                        \"tags\": [\n+                            \"IOT\",\n+                            \"MQTT\",\n+                            \"publish\"\n+                        ],\n+                        \"triggerSerially\": false,\n+                        \"triggerWhenAnyDestinationAvailable\": false,\n+                        \"triggerWhenEmpty\": false,\n+                        \"type\": \"org.apache.nifi.processors.mqtt.PublishMQTT\",\n+                        \"typeDescription\": \"Publishes a message to an MQTT topic\",\n+                        \"version\": \"1.27.0\"\n+                    }\n+                ],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"1.27.0\"\n+        },\n+        {\n+            \"artifact\": \"nifi-box-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [],\n+                \"processors\": [\n+                    {\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-box-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"e0c4461\"\n+                        },\n+                        \"defaultBulletinLevel\": \"WARN\",\n+                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": 1,\n+                            \"TIMER_DRIVEN\": 1\n+                        },\n+                        \"defaultPenaltyDuration\": \"30 sec\",\n+                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": \"* * * * * ?\",\n+                            \"TIMER_DRIVEN\": \"0 sec\"\n+                        },\n+                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n+                        \"defaultYieldDuration\": \"1 sec\",\n+                        \"group\": \"org.apache.nifi\",\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n+                        \"primaryNodeOnly\": false,\n+                        \"propertyDescriptors\": {\n+                            \"box-client-service\": {\n+                                \"description\": \"Controller Service used to obtain a Box API connection.\",\n+                                \"displayName\": \"Box Client Service\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"topic\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"box-client-service\",\n                                 \"required\": true,\n-                                \"sensitive\": false\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-box-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.box.controllerservices.BoxClientService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n                             },\n-                            \"topic_type\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"Topic is a full topic name or comma separated list of names\",\n-                                        \"displayName\": \"names\",\n-                                        \"value\": \"names\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Topic is a regex using the Java Pattern syntax\",\n-                                        \"displayName\": \"pattern\",\n-                                        \"value\": \"pattern\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"names\",\n-                                \"description\": \"Specifies whether the Topic(s) provided are a comma separated list of names or a single regular expression\",\n-                                \"displayName\": \"Topic Name Format\",\n+                            \"box-file-id\": {\n+                                \"defaultValue\": \"${box.id}\",\n+                                \"description\": \"The ID of the File to fetch\",\n+                                \"displayName\": \"File ID\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"topic_type\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"box-file-id\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             }\n                         },\n+                        \"readsAttributes\": [\n+                            {\n+                                \"description\": \"The id of the file\",\n+                                \"name\": \"box.id\"\n+                            }\n+                        ],\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.processors.box.ListBoxFile\",\n+                            \"org.apache.nifi.processors.box.PutBoxFile\"\n+                        ],\n                         \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"FlowFiles received from Kafka. Depending on demarcation strategy it is a flow file per message or a bundle of messages grouped by topic and partition.\",\n+                                \"description\": \"A FlowFile will be routed here for each successfully fetched File.\",\n                                 \"name\": \"success\"\n+                            },\n+                            {\n+                                \"description\": \"A FlowFile will be routed here for each File for which fetch was attempted but failed.\",\n+                                \"name\": \"failure\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n                         \"supportsBatching\": false,\n-                        \"supportsDynamicProperties\": true,\n+                        \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"2.6\",\n-                            \"Consume\",\n-                            \"Get\",\n-                            \"Ingest\",\n-                            \"Ingress\",\n-                            \"Kafka\",\n-                            \"PubSub\",\n-                            \"Topic\"\n+                            \"box\",\n+                            \"fetch\",\n+                            \"storage\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.kafka.pubsub.ConsumeKafka_2_6\",\n-                        \"typeDescription\": \"Consumes messages from Apache Kafka specifically built against the Kafka 2.6 Consumer API. The complementary NiFi processor for sending messages is PublishKafka_2_6.\",\n+                        \"type\": \"org.apache.nifi.processors.box.FetchBoxFile\",\n+                        \"typeDescription\": \"Fetches files from a Box Folder. Designed to be used in tandem with ListBoxFile.\",\n                         \"version\": \"1.27.0\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"The number of messages written if more than one\",\n-                                \"name\": \"kafka.count\"\n+                                \"description\": \"The id of the file\",\n+                                \"name\": \"box.id\"\n                             },\n                             {\n-                                \"description\": \"The key of message if present and if single message. How the key is encoded depends on the value of the 'Key Attribute Encoding' property.\",\n-                                \"name\": \"kafka.key\"\n+                                \"description\": \"The name of the file\",\n+                                \"name\": \"filename\"\n                             },\n                             {\n-                                \"description\": \"The offset of the message in the partition of the topic.\",\n-                                \"name\": \"kafka.offset\"\n+                                \"description\": \"The folder path where the file is located\",\n+                                \"name\": \"path\"\n                             },\n                             {\n-                                \"description\": \"The timestamp of the message in the partition of the topic.\",\n-                                \"name\": \"kafka.timestamp\"\n+                                \"description\": \"The size of the file\",\n+                                \"name\": \"box.size\"\n                             },\n                             {\n-                                \"description\": \"The partition of the topic the message or message bundle is from\",\n-                                \"name\": \"kafka.partition\"\n+                                \"description\": \"The last modified time of the file\",\n+                                \"name\": \"box.timestamp\"\n                             },\n                             {\n-                                \"description\": \"The topic the message or message bundle is from\",\n-                                \"name\": \"kafka.topic\"\n+                                \"description\": \"The error code returned by Box\",\n+                                \"name\": \"error.code\"\n                             },\n                             {\n-                                \"description\": \"Set to true if the consumed message is a tombstone message\",\n-                                \"name\": \"kafka.tombstone\"\n+                                \"description\": \"The error message returned by Box\",\n+                                \"name\": \"error.message\"\n                             }\n                         ]\n                     },\n                     {\n                         \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-kafka-2-6-nar\",\n+                        \"artifact\": \"nifi-box-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n                         },\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"0 sec\"\n+                            \"TIMER_DRIVEN\": \"1 min\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n-                        \"dynamicProperties\": [\n-                            {\n-                                \"description\": \"These properties will be added on the Kafka configuration after loading any provided configuration properties. In the event a dynamic property represents a property that was already set, its value will be ignored and WARN message logged. For the list of available Kafka properties please refer to: http://kafka.apache.org/documentation.html#configuration. \",\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"name\": \"The name of a Kafka configuration property.\",\n-                                \"value\": \"The value of a given Kafka configuration property.\"\n-                            }\n-                        ],\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_REQUIRED\",\n-                        \"primaryNodeOnly\": false,\n+                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n+                        \"primaryNodeOnly\": true,\n                         \"propertyDescriptors\": {\n-                            \"Failure Strategy\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"When unable to publish records to Kafka, the FlowFile will be routed to the failure relationship.\",\n-                                        \"displayName\": \"Route to Failure\",\n-                                        \"value\": \"Route to Failure\"\n-                                    },\n-                                    {\n-                                        \"description\": \"When unable to publish records to Kafka, the FlowFile will be placed back on the queue so that it will be retried. For flows where FlowFile ordering is important, this strategy can be used along with ensuring that the each processor uses only a single Concurrent Task.\",\n-                                        \"displayName\": \"Rollback\",\n-                                        \"value\": \"Rollback\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"Route to Failure\",\n-                                \"description\": \"Specifies how the processor handles a FlowFile if it is unable to publish the data to Kafka\",\n-                                \"displayName\": \"Failure Strategy\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Failure Strategy\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Record Metadata Strategy\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"The Kafka Record's Topic will be determined using the 'Topic Name' processor property. The partition will be determined using the 'Partition' and 'Partitioner class' properties.\",\n-                                        \"displayName\": \"Use Configured Values\",\n-                                        \"value\": \"Use Configured Values\"\n-                                    },\n-                                    {\n-                                        \"description\": \"The Kafka Record's Topic and Partition will be determined by looking at the /metadata/topic and /metadata/partition fields of the Record, respectively. If these fields are invalid or not present, the Topic Name and Partition/Partitioner class properties of the processor will be considered.\",\n-                                        \"displayName\": \"Metadata From Record\",\n-                                        \"value\": \"Metadata From Record\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"Use Configured Values\",\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"USE_WRAPPER\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Publish Strategy\",\n-                                        \"propertyName\": \"publish-strategy\"\n-                                    }\n-                                ],\n-                                \"description\": \"Specifies whether the Record's metadata (topic and partition) should come from the Record's metadata field or if it should come from the configured Topic Name and Partition / Partitioner class properties\",\n-                                \"displayName\": \"Record Metadata Strategy\",\n+                            \"box-client-service\": {\n+                                \"description\": \"Controller Service used to obtain a Box API connection.\",\n+                                \"displayName\": \"Box Client Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Record Metadata Strategy\",\n+                                \"name\": \"box-client-service\",\n                                 \"required\": true,\n-                                \"sensitive\": false\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-box-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.box.controllerservices.BoxClientService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n                             },\n-                            \"ack.wait.time\": {\n-                                \"defaultValue\": \"5 secs\",\n-                                \"description\": \"After sending a message to Kafka, this indicates the amount of time that we are willing to wait for a response from Kafka. If Kafka does not acknowledge the message within this time period, the FlowFile will be routed to 'failure'.\",\n-                                \"displayName\": \"Acknowledgment Wait Time\",\n+                            \"box-folder-id\": {\n+                                \"description\": \"The ID of the folder from which to pull list of files.\",\n+                                \"displayName\": \"Folder ID\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"ack.wait.time\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"box-folder-id\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"acks\": {\n+                            \"et-initial-listing-target\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"FlowFile will be routed to success after successfully sending the content to a Kafka node, without waiting for any acknowledgment from the node at all. This provides the best performance but may result in data loss.\",\n-                                        \"displayName\": \"Best Effort\",\n-                                        \"value\": \"0\"\n-                                    },\n-                                    {\n-                                        \"description\": \"FlowFile will be routed to success if the message is received by a single Kafka node, whether or not it is replicated. This is faster than <Guarantee Replicated Delivery> but can result in data loss if a Kafka node crashes\",\n-                                        \"displayName\": \"Guarantee Single Node Delivery\",\n-                                        \"value\": \"1\"\n+                                        \"description\": \"Ignore entities having timestamp older than the specified 'Tracking Time Window' at the initial listing activity.\",\n+                                        \"displayName\": \"Tracking Time Window\",\n+                                        \"value\": \"window\"\n                                     },\n                                     {\n-                                        \"description\": \"FlowFile will be routed to failure unless the message is replicated to the appropriate number of Kafka Nodes according to the Topic configuration\",\n-                                        \"displayName\": \"Guarantee Replicated Delivery\",\n+                                        \"description\": \"Regardless of entities timestamp, all existing entities will be listed at the initial listing activity.\",\n+                                        \"displayName\": \"All Available\",\n                                         \"value\": \"all\"\n                                     }\n                                 ],\n                                 \"defaultValue\": \"all\",\n-                                \"description\": \"Specifies the requirement for guaranteeing that a message is sent to Kafka. Corresponds to Kafka's 'acks' property.\",\n-                                \"displayName\": \"Delivery Guarantee\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"acks\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"attribute-name-regex\": {\n                                 \"dependencies\": [\n                                     {\n                                         \"dependentValues\": [\n-                                            \"USE_VALUE\"\n+                                            \"entities\"\n                                         ],\n-                                        \"propertyDisplayName\": \"Publish Strategy\",\n-                                        \"propertyName\": \"publish-strategy\"\n+                                        \"propertyDisplayName\": \"Listing Strategy\",\n+                                        \"propertyName\": \"listing-strategy\"\n                                     }\n                                 ],\n-                                \"description\": \"A Regular Expression that is matched against all FlowFile attribute names. Any attribute whose name matches the regex will be added to the Kafka messages as a Header. If not specified, no FlowFile attributes will be added as headers.\",\n-                                \"displayName\": \"Attributes to Send as Headers (Regex)\",\n+                                \"description\": \"Specify how initial listing should be handled. Used by 'Tracking Entities' strategy.\",\n+                                \"displayName\": \"Entity Tracking Initial Listing Target\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"attribute-name-regex\",\n+                                \"name\": \"et-initial-listing-target\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"aws.profile.name\": {\n+                            \"et-state-cache\": {\n                                 \"dependencies\": [\n                                     {\n                                         \"dependentValues\": [\n-                                            \"AWS_MSK_IAM\"\n+                                            \"entities\"\n                                         ],\n-                                        \"propertyDisplayName\": \"SASL Mechanism\",\n-                                        \"propertyName\": \"sasl.mechanism\"\n-                                    }\n-                                ],\n-                                \"description\": \"The Amazon Web Services Profile to select when multiple profiles are available.\",\n-                                \"displayName\": \"AWS Profile Name\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"aws.profile.name\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"bootstrap.servers\": {\n-                                \"defaultValue\": \"localhost:9092\",\n-                                \"description\": \"Comma-separated list of Kafka Brokers in the format host:port\",\n-                                \"displayName\": \"Kafka Brokers\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"bootstrap.servers\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"compression.type\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"none\",\n-                                        \"value\": \"none\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"gzip\",\n-                                        \"value\": \"gzip\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"snappy\",\n-                                        \"value\": \"snappy\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"lz4\",\n-                                        \"value\": \"lz4\"\n+                                        \"propertyDisplayName\": \"Listing Strategy\",\n+                                        \"propertyName\": \"listing-strategy\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"none\",\n-                                \"description\": \"This parameter allows you to specify the compression codec for all data generated by this producer.\",\n-                                \"displayName\": \"Compression Type\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"compression.type\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"kerberos-credentials-service\": {\n-                                \"description\": \"Service supporting generalized credentials authentication with Kerberos\",\n-                                \"displayName\": \"Kerberos Credentials Service\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"kerberos-credentials-service\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.kerberos.KerberosCredentialsService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            },\n-                            \"kerberos-user-service\": {\n-                                \"description\": \"Service supporting user authentication with Kerberos\",\n-                                \"displayName\": \"Kerberos User Service\",\n+                                \"description\": \"Listed entities are stored in the specified cache storage so that this processor can resume listing across NiFi restart or in case of primary node change. 'Tracking Entities' strategy require tracking information of all listed entities within the last 'Tracking Time Window'. To support large number of entities, the strategy uses DistributedMapCache instead of managed state. Cache key format is 'ListedEntities::{processorId}(::{nodeId})'. If it tracks per node listed entities, then the optional '::{nodeId}' part is added to manage state separately. E.g. cluster wide cache key = 'ListedEntities::8dda2321-0164-1000-50fa-3042fe7d6a7b', per node cache key = 'ListedEntities::8dda2321-0164-1000-50fa-3042fe7d6a7b::nifi-node3' The stored cache content is Gzipped JSON string. The cache key will be deleted when target listing configuration is changed. Used by 'Tracking Entities' strategy.\",\n+                                \"displayName\": \"Entity Tracking State Cache\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"kerberos-user-service\",\n+                                \"name\": \"et-state-cache\",\n                                 \"required\": false,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n                                     \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.kerberos.SelfContainedKerberosUserService\",\n+                                    \"type\": \"org.apache.nifi.distributed.cache.client.DistributedMapCacheClient\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             },\n-                            \"max.block.ms\": {\n-                                \"defaultValue\": \"5 sec\",\n-                                \"description\": \"The amount of time publisher will wait to obtain metadata or wait for the buffer to flush during the 'send' call before failing the entire 'send' call. Corresponds to Kafka's 'max.block.ms' property\",\n-                                \"displayName\": \"Max Metadata Wait Time\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"max.block.ms\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"max.request.size\": {\n-                                \"defaultValue\": \"1 MB\",\n-                                \"description\": \"The maximum size of a request in bytes. Corresponds to Kafka's 'max.request.size' property and defaults to 1 MB (1048576).\",\n-                                \"displayName\": \"Max Request Size\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"max.request.size\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"message-header-encoding\": {\n-                                \"defaultValue\": \"UTF-8\",\n-                                \"description\": \"For any attribute that is added as a message header, as configured via the <Attributes to Send as Headers> property, this property indicates the Character Encoding to use for serializing the headers.\",\n-                                \"displayName\": \"Message Header Encoding\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"message-header-encoding\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"message-key-field\": {\n+                            \"et-time-window\": {\n+                                \"defaultValue\": \"3 hours\",\n                                 \"dependencies\": [\n                                     {\n                                         \"dependentValues\": [\n-                                            \"USE_VALUE\"\n+                                            \"entities\"\n                                         ],\n-                                        \"propertyDisplayName\": \"Publish Strategy\",\n-                                        \"propertyName\": \"publish-strategy\"\n+                                        \"propertyDisplayName\": \"Listing Strategy\",\n+                                        \"propertyName\": \"listing-strategy\"\n                                     }\n                                 ],\n-                                \"description\": \"The name of a field in the Input Records that should be used as the Key for the Kafka message.\",\n-                                \"displayName\": \"Message Key Field\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"message-key-field\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"partition\": {\n-                                \"description\": \"Specifies which Partition Records will go to. How this value is interpreted is dictated by the <Partitioner class> property.\",\n-                                \"displayName\": \"Partition\",\n+                                \"description\": \"Specify how long this processor should track already-listed entities. 'Tracking Entities' strategy can pick any entity whose timestamp is inside the specified time window. For example, if set to '30 minutes', any entity having timestamp in recent 30 minutes will be the listing target when this processor runs. A listed entity is considered 'new/updated' and a FlowFile is emitted if one of following condition meets: 1. does not exist in the already-listed entities, 2. has newer timestamp than the cached entity, 3. has different size than the cached entity. If a cached entity's timestamp becomes older than specified time window, that entity will be removed from the cached already-listed entities. Used by 'Tracking Entities' strategy.\",\n+                                \"displayName\": \"Entity Tracking Time Window\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"partition\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"et-time-window\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"partitioner.class\": {\n+                            \"listing-strategy\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Messages will be assigned partitions in a round-robin fashion, sending the first message to Partition 1, the next Partition to Partition 2, and so on, wrapping as necessary.\",\n-                                        \"displayName\": \"RoundRobinPartitioner\",\n-                                        \"value\": \"org.apache.nifi.processors.kafka.pubsub.Partitioners$RoundRobinPartitioner\"\n+                                        \"description\": \"This strategy tracks the latest timestamp of listed entity to determine new/updated entities. Since it only tracks few timestamps, it can manage listing state efficiently. However, any newly added, or updated entity having timestamp older than the tracked latest timestamp can not be picked by this strategy. For example, such situation can happen in a file system if a file with old timestamp is copied or moved into the target directory without its last modified timestamp being updated. Also may miss files when multiple subdirectories are being written at the same time while listing is running.\",\n+                                        \"displayName\": \"Tracking Timestamps\",\n+                                        \"value\": \"timestamps\"\n                                     },\n                                     {\n-                                        \"description\": \"The default partitioning strategy will choose the sticky partition that changes when the batch is full (See KIP-480 for details about sticky partitioning).\",\n-                                        \"displayName\": \"DefaultPartitioner\",\n-                                        \"value\": \"org.apache.kafka.clients.producer.internals.DefaultPartitioner\"\n+                                        \"description\": \"This strategy tracks information of all the listed entities within the latest 'Entity Tracking Time Window' to determine new/updated entities. This strategy can pick entities having old timestamp that can be missed with 'Tracking Timestamps'. Works even when multiple subdirectories are being written at the same time while listing is running. However additional DistributedMapCache controller service is required and more JVM heap memory is used. See the description of 'Entity Tracking Time Window' property for further details on how it works.\",\n+                                        \"displayName\": \"Tracking Entities\",\n+                                        \"value\": \"entities\"\n                                     },\n                                     {\n-                                        \"description\": \"Interprets the <Partition> property as a RecordPath that will be evaluated against each Record to determine which partition the Record will go to. All Records that have the same value for the given RecordPath will go to the same Partition.\",\n-                                        \"displayName\": \"RecordPath Partitioner\",\n-                                        \"value\": \"org.apache.nifi.processors.kafka.pubsub.Partitioners$RecordPathPartitioner\"\n+                                        \"description\": \"This strategy uses a sliding time window. The window starts where the previous window ended and ends with the 'current time'. One cycle will list files with modification time falling within the time window. Works even when multiple subdirectories are being written at the same time while listing is running. IMPORTANT: This strategy works properly only if the time on both the system hosting NiFi and the one hosting the files are accurate.\",\n+                                        \"displayName\": \"Time Window\",\n+                                        \"value\": \"time-window\"\n                                     },\n                                     {\n-                                        \"description\": \"Interprets the <Partition> property as Expression Language that will be evaluated against each FlowFile. This Expression will be evaluated once against the FlowFile, so all Records in a given FlowFile will go to the same partition.\",\n-                                        \"displayName\": \"Expression Language Partitioner\",\n-                                        \"value\": \"org.apache.nifi.processors.kafka.pubsub.Partitioners$ExpressionLanguagePartitioner\"\n+                                        \"description\": \"This strategy lists an entity without any tracking. The same entity will be listed each time on executing this processor. It is recommended to change the default run schedule value. Any property that related to the persisting state will be disregarded.\",\n+                                        \"displayName\": \"No Tracking\",\n+                                        \"value\": \"none\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"org.apache.kafka.clients.producer.internals.DefaultPartitioner\",\n-                                \"description\": \"Specifies which class to use to compute a partition id for a message. Corresponds to Kafka's 'partitioner.class' property.\",\n-                                \"displayName\": \"Partitioner class\",\n+                                \"defaultValue\": \"timestamps\",\n+                                \"description\": \"Specify how to determine new/updated entities. See each strategy descriptions for detail.\",\n+                                \"displayName\": \"Listing Strategy\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"partitioner.class\",\n-                                \"required\": false,\n+                                \"name\": \"listing-strategy\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"publish-strategy\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"Write only the FlowFile content to the Kafka Record value.\",\n-                                        \"displayName\": \"Use Content as Record Value\",\n-                                        \"value\": \"USE_VALUE\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Write the Kafka Record key, value, headers, and metadata into the Kafka Record value.  (See processor usage for more information.)\",\n-                                        \"displayName\": \"Use Wrapper\",\n-                                        \"value\": \"USE_WRAPPER\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"USE_VALUE\",\n-                                \"description\": \"The format used to publish the incoming FlowFile record to Kafka.\",\n-                                \"displayName\": \"Publish Strategy\",\n+                            \"min-age\": {\n+                                \"defaultValue\": \"0 sec\",\n+                                \"description\": \"The minimum age a file must be in order to be considered; any files younger than this will be ignored.\",\n+                                \"displayName\": \"Minimum File Age\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"publish-strategy\",\n+                                \"name\": \"min-age\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"record-key-writer\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"USE_WRAPPER\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Publish Strategy\",\n-                                        \"propertyName\": \"publish-strategy\"\n-                                    }\n-                                ],\n-                                \"description\": \"The Record Key Writer to use for outgoing FlowFiles\",\n-                                \"displayName\": \"Record Key Writer\",\n+                            \"record-writer\": {\n+                                \"description\": \"Specifies the Record Writer to use for creating the listing. If not specified, one FlowFile will be created for each entity that is listed. If the Record Writer is specified, all entities will be written to a single FlowFile instead of adding attributes to individual FlowFiles.\",\n+                                \"displayName\": \"Record Writer\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"record-key-writer\",\n+                                \"name\": \"record-writer\",\n                                 \"required\": false,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n                                     \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n                                     \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             },\n-                            \"record-reader\": {\n-                                \"description\": \"The Record Reader to use for incoming FlowFiles\",\n-                                \"displayName\": \"Record Reader\",\n+                            \"recursive-search\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"true\",\n+                                \"description\": \"When 'true', will include list of files from sub-folders. Otherwise, will return only files that are within the folder defined by the 'Folder ID' property.\",\n+                                \"displayName\": \"Search Recursively\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"record-reader\",\n+                                \"name\": \"recursive-search\",\n                                 \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n+                                \"sensitive\": false\n+                            }\n+                        },\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.processors.box.FetchBoxFile\",\n+                            \"org.apache.nifi.processors.box.PutBoxFile\"\n+                        ],\n+                        \"sideEffectFree\": false,\n+                        \"stateful\": {\n+                            \"description\": \"The processor stores necessary data to be able to keep track what files have been listed already. What exactly needs to be stored depends on the 'Listing Strategy'.\",\n+                            \"scopes\": [\n+                                \"CLUSTER\"\n+                            ]\n+                        },\n+                        \"supportedRelationships\": [\n+                            {\n+                                \"description\": \"All FlowFiles that are received are routed to success\",\n+                                \"name\": \"success\"\n+                            }\n+                        ],\n+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\"\n+                        ],\n+                        \"supportsBatching\": false,\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicRelationships\": false,\n+                        \"supportsEventDriven\": false,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"box\",\n+                            \"storage\"\n+                        ],\n+                        \"triggerSerially\": true,\n+                        \"triggerWhenAnyDestinationAvailable\": false,\n+                        \"triggerWhenEmpty\": false,\n+                        \"type\": \"org.apache.nifi.processors.box.ListBoxFile\",\n+                        \"typeDescription\": \"Lists files in a Box folder. Each listed file may result in one FlowFile, the metadata being written as FlowFile attributes. Or - in case the 'Record Writer' property is set - the entire result is written as records to a single FlowFile. This Processor is designed to run on Primary Node only in a cluster. If the primary node changes, the new Primary Node will pick up where the previous node left off without duplicating all of the data.\",\n+                        \"version\": \"1.27.0\",\n+                        \"writesAttributes\": [\n+                            {\n+                                \"description\": \"The id of the file\",\n+                                \"name\": \"box.id\"\n                             },\n-                            \"record-writer\": {\n-                                \"description\": \"The Record Writer to use in order to serialize the data before sending to Kafka\",\n-                                \"displayName\": \"Record Writer\",\n+                            {\n+                                \"description\": \"The name of the file\",\n+                                \"name\": \"filename\"\n+                            },\n+                            {\n+                                \"description\": \"The folder path where the file is located\",\n+                                \"name\": \"path\"\n+                            },\n+                            {\n+                                \"description\": \"The size of the file\",\n+                                \"name\": \"box.size\"\n+                            },\n+                            {\n+                                \"description\": \"The last modified time of the file\",\n+                                \"name\": \"box.timestamp\"\n+                            }\n+                        ]\n+                    },\n+                    {\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-box-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"e0c4461\"\n+                        },\n+                        \"defaultBulletinLevel\": \"WARN\",\n+                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": 1,\n+                            \"TIMER_DRIVEN\": 1\n+                        },\n+                        \"defaultPenaltyDuration\": \"30 sec\",\n+                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": \"* * * * * ?\",\n+                            \"TIMER_DRIVEN\": \"0 sec\"\n+                        },\n+                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n+                        \"defaultYieldDuration\": \"1 sec\",\n+                        \"group\": \"org.apache.nifi\",\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n+                        \"primaryNodeOnly\": false,\n+                        \"propertyDescriptors\": {\n+                            \"box-client-service\": {\n+                                \"description\": \"Controller Service used to obtain a Box API connection.\",\n+                                \"displayName\": \"Box Client Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"record-writer\",\n+                                \"name\": \"box-client-service\",\n                                 \"required\": true,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"artifact\": \"nifi-box-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n+                                    \"type\": \"org.apache.nifi.box.controllerservices.BoxClientService\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             },\n-                            \"sasl.kerberos.keytab\": {\n-                                \"description\": \"Keytab credentials used for authentication with Kerberos\",\n-                                \"displayName\": \"Kerberos Keytab\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"sasl.kerberos.keytab\",\n-                                \"required\": false,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"SINGLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\"\n-                                    ]\n-                                },\n-                                \"sensitive\": false\n-                            },\n-                            \"sasl.kerberos.principal\": {\n-                                \"description\": \"Principal used for authentication with Kerberos\",\n-                                \"displayName\": \"Kerberos Principal\",\n+                            \"box-folder-id\": {\n+                                \"description\": \"The ID of the folder where the file is uploaded. Please see Additional Details to obtain Folder ID.\",\n+                                \"displayName\": \"Folder ID\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"sasl.kerberos.principal\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"box-folder-id\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"sasl.kerberos.service.name\": {\n-                                \"description\": \"The service name that matches the primary name of the Kafka server configured in the broker JAAS configuration\",\n-                                \"displayName\": \"Kerberos Service Name\",\n+                            \"chunked-upload-threshold\": {\n+                                \"defaultValue\": \"20 MB\",\n+                                \"description\": \"The maximum size of the content which is uploaded at once. FlowFiles larger than this threshold are uploaded in chunks. Chunked upload is allowed for files larger than 20 MB. It is recommended to use chunked upload for files exceeding 50 MB.\",\n+                                \"displayName\": \"Chunked Upload Threshold\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"sasl.kerberos.service.name\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"chunked-upload-threshold\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"sasl.mechanism\": {\n+                            \"conflict-resolution-strategy\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"General Security Services API for Kerberos authentication\",\n-                                        \"displayName\": \"GSSAPI\",\n-                                        \"value\": \"GSSAPI\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Plain username and password authentication\",\n-                                        \"displayName\": \"PLAIN\",\n-                                        \"value\": \"PLAIN\"\n+                                        \"description\": \"Handle file conflict as failure.\",\n+                                        \"displayName\": \"fail\",\n+                                        \"value\": \"fail\"\n                                     },\n                                     {\n-                                        \"description\": \"Salted Challenge Response Authentication Mechanism using SHA-512 with username and password\",\n-                                        \"displayName\": \"SCRAM-SHA-256\",\n-                                        \"value\": \"SCRAM-SHA-256\"\n+                                        \"description\": \"Ignore conflict, do not change the original file.\",\n+                                        \"displayName\": \"ignore\",\n+                                        \"value\": \"ignore\"\n                                     },\n                                     {\n-                                        \"description\": \"Salted Challenge Response Authentication Mechanism using SHA-256 with username and password\",\n-                                        \"displayName\": \"SCRAM-SHA-512\",\n-                                        \"value\": \"SCRAM-SHA-512\"\n+                                        \"description\": \"Replace existing file in case of conflict.\",\n+                                        \"displayName\": \"replace\",\n+                                        \"value\": \"replace\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"GSSAPI\",\n-                                \"description\": \"SASL mechanism used for authentication. Corresponds to Kafka Client sasl.mechanism property\",\n-                                \"displayName\": \"SASL Mechanism\",\n+                                \"defaultValue\": \"fail\",\n+                                \"description\": \"Indicates what should happen when a file with the same name already exists in the specified Box folder.\",\n+                                \"displayName\": \"Conflict Resolution Strategy\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"sasl.mechanism\",\n+                                \"name\": \"conflict-resolution-strategy\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"sasl.password\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"PLAIN\",\n-                                            \"SCRAM-SHA-512\",\n-                                            \"SCRAM-SHA-256\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"SASL Mechanism\",\n-                                        \"propertyName\": \"sasl.mechanism\"\n-                                    }\n-                                ],\n-                                \"description\": \"Password provided with configured username when using PLAIN or SCRAM SASL Mechanisms\",\n-                                \"displayName\": \"Password\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"sasl.password\",\n-                                \"required\": false,\n-                                \"sensitive\": true\n-                            },\n-                            \"sasl.token.auth\": {\n+                            \"create-folder\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"true\",\n                                         \"value\": \"true\"\n                                     },\n                                     {\n@@ -74299,845 +72245,717 @@\n                                         \"displayName\": \"false\",\n                                         \"value\": \"false\"\n                                     }\n                                 ],\n                                 \"defaultValue\": \"false\",\n                                 \"dependencies\": [\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"SCRAM-SHA-512\",\n-                                            \"SCRAM-SHA-256\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"SASL Mechanism\",\n-                                        \"propertyName\": \"sasl.mechanism\"\n-                                    }\n-                                ],\n-                                \"description\": \"Enables or disables Token authentication when using SCRAM SASL Mechanisms\",\n-                                \"displayName\": \"Token Authentication\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"sasl.token.auth\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"sasl.username\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"PLAIN\",\n-                                            \"SCRAM-SHA-512\",\n-                                            \"SCRAM-SHA-256\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"SASL Mechanism\",\n-                                        \"propertyName\": \"sasl.mechanism\"\n-                                    }\n-                                ],\n-                                \"description\": \"Username provided with configured password when using PLAIN or SCRAM SASL Mechanisms\",\n-                                \"displayName\": \"Username\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"sasl.username\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"security.protocol\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"PLAINTEXT\",\n-                                        \"value\": \"PLAINTEXT\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"SSL\",\n-                                        \"value\": \"SSL\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"SASL_PLAINTEXT\",\n-                                        \"value\": \"SASL_PLAINTEXT\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"SASL_SSL\",\n-                                        \"value\": \"SASL_SSL\"\n+                                        \"propertyDisplayName\": \"Subfolder Name\",\n+                                        \"propertyName\": \"subfolder-name\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"PLAINTEXT\",\n-                                \"description\": \"Security protocol used to communicate with brokers. Corresponds to Kafka Client security.protocol property\",\n-                                \"displayName\": \"Security Protocol\",\n+                                \"description\": \"Specifies whether to check if the subfolder exists and to automatically create it if it does not. Permission to list folders is required. \",\n+                                \"displayName\": \"Create Subfolder\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"security.protocol\",\n+                                \"name\": \"create-folder\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"ssl.context.service\": {\n-                                \"description\": \"Service supporting SSL communication with Kafka brokers\",\n-                                \"displayName\": \"SSL Context Service\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"ssl.context.service\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            },\n-                            \"topic\": {\n-                                \"description\": \"The name of the Kafka Topic to publish to.\",\n-                                \"displayName\": \"Topic Name\",\n+                            \"file-name\": {\n+                                \"defaultValue\": \"${filename}\",\n+                                \"description\": \"The name of the file to upload to the specified Box folder.\",\n+                                \"displayName\": \"Filename\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"topic\",\n+                                \"name\": \"file-name\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"transactional-id-prefix\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"true\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Use Transactions\",\n-                                        \"propertyName\": \"use-transactions\"\n-                                    }\n-                                ],\n-                                \"description\": \"When Use Transaction is set to true, KafkaProducer config 'transactional.id' will be a generated UUID and will be prefixed with this string.\",\n-                                \"displayName\": \"Transactional Id Prefix\",\n+                            \"subfolder-name\": {\n+                                \"description\": \"The name (path) of the subfolder where files are uploaded. The subfolder name is relative to the folder specified by 'Folder ID'. Example: subFolder, subFolder1/subfolder2\",\n+                                \"displayName\": \"Subfolder Name\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"transactional-id-prefix\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"subfolder-name\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n-                            },\n-                            \"use-transactions\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"true\",\n-                                \"description\": \"Specifies whether or not NiFi should provide Transactional guarantees when communicating with Kafka. If there is a problem sending data to Kafka, and this property is set to false, then the messages that have already been sent to Kafka will continue on and be delivered to consumers. If this is set to true, then the Kafka transaction will be rolled back so that those messages are not available to consumers. Setting this to true requires that the <Delivery Guarantee> property be set to \\\"Guarantee Replicated Delivery.\\\"\",\n-                                \"displayName\": \"Use Transactions\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"use-transactions\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n                             }\n                         },\n+                        \"readsAttributes\": [\n+                            {\n+                                \"description\": \"Uses the FlowFile's filename as the filename for the Box object.\",\n+                                \"name\": \"filename\"\n+                            }\n+                        ],\n                         \"seeAlso\": [\n-                            \"org.apache.nifi.processors.kafka.pubsub.ConsumeKafkaRecord_2_6\",\n-                            \"org.apache.nifi.processors.kafka.pubsub.ConsumeKafka_2_6\",\n-                            \"org.apache.nifi.processors.kafka.pubsub.PublishKafka_2_6\"\n+                            \"org.apache.nifi.processors.box.FetchBoxFile\",\n+                            \"org.apache.nifi.processors.box.ListBoxFile\"\n                         ],\n                         \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"FlowFiles for which all content was sent to Kafka.\",\n+                                \"description\": \"Files that have been successfully written to Box are transferred to this relationship.\",\n                                 \"name\": \"success\"\n                             },\n                             {\n-                                \"description\": \"Any FlowFile that cannot be sent to Kafka will be routed to this Relationship\",\n+                                \"description\": \"Files that could not be written to Box for some reason are transferred to this relationship.\",\n                                 \"name\": \"failure\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n                         \"supportsBatching\": false,\n-                        \"supportsDynamicProperties\": true,\n+                        \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"2.6\",\n-                            \"Apache\",\n-                            \"Kafka\",\n-                            \"Message\",\n-                            \"PubSub\",\n-                            \"Put\",\n-                            \"Record\",\n-                            \"Send\",\n-                            \"avro\",\n-                            \"csv\",\n-                            \"json\",\n-                            \"logs\"\n+                            \"box\",\n+                            \"put\",\n+                            \"storage\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.kafka.pubsub.PublishKafkaRecord_2_6\",\n-                        \"typeDescription\": \"Sends the contents of a FlowFile as individual records to Apache Kafka using the Kafka 2.6 Producer API. The contents of the FlowFile are expected to be record-oriented data that can be read by the configured Record Reader. The complementary NiFi processor for fetching messages is ConsumeKafkaRecord_2_6.\",\n+                        \"type\": \"org.apache.nifi.processors.box.PutBoxFile\",\n+                        \"typeDescription\": \"Puts content to a Box folder.\",\n                         \"version\": \"1.27.0\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"The number of messages that were sent to Kafka for this FlowFile. This attribute is added only to FlowFiles that are routed to success.\",\n-                                \"name\": \"msg.count\"\n+                                \"description\": \"The id of the file\",\n+                                \"name\": \"box.id\"\n+                            },\n+                            {\n+                                \"description\": \"The name of the file\",\n+                                \"name\": \"filename\"\n+                            },\n+                            {\n+                                \"description\": \"The folder path where the file is located\",\n+                                \"name\": \"path\"\n+                            },\n+                            {\n+                                \"description\": \"The size of the file\",\n+                                \"name\": \"box.size\"\n+                            },\n+                            {\n+                                \"description\": \"The last modified time of the file\",\n+                                \"name\": \"box.timestamp\"\n+                            },\n+                            {\n+                                \"description\": \"The error code returned by Box\",\n+                                \"name\": \"error.code\"\n+                            },\n+                            {\n+                                \"description\": \"The error message returned by Box\",\n+                                \"name\": \"error.message\"\n                             }\n                         ]\n-                    },\n+                    }\n+                ],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"1.27.0\"\n+        },\n+        {\n+            \"artifact\": \"nifi-mongodb-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [],\n+                \"processors\": [\n                     {\n                         \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-kafka-2-6-nar\",\n+                        \"artifact\": \"nifi-mongodb-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n+                            \"EVENT_DRIVEN\": 0,\n                             \"TIMER_DRIVEN\": 1\n                         },\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n-                        \"dynamicProperties\": [\n-                            {\n-                                \"description\": \"These properties will be added on the Kafka configuration after loading any provided configuration properties. In the event a dynamic property represents a property that was already set, its value will be ignored and WARN message logged. For the list of available Kafka properties please refer to: http://kafka.apache.org/documentation.html#configuration. \",\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"name\": \"The name of a Kafka configuration property.\",\n-                                \"value\": \"The value of a given Kafka configuration property.\"\n-                            }\n-                        ],\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Failure Strategy\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"When unable to publish records to Kafka, the FlowFile will be routed to the failure relationship.\",\n-                                        \"displayName\": \"Route to Failure\",\n-                                        \"value\": \"Route to Failure\"\n-                                    },\n-                                    {\n-                                        \"description\": \"When unable to publish records to Kafka, the FlowFile will be placed back on the queue so that it will be retried. For flows where FlowFile ordering is important, this strategy can be used along with ensuring that the each processor uses only a single Concurrent Task.\",\n-                                        \"displayName\": \"Rollback\",\n-                                        \"value\": \"Rollback\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"Route to Failure\",\n-                                \"description\": \"Specifies how the processor handles a FlowFile if it is unable to publish the data to Kafka\",\n-                                \"displayName\": \"Failure Strategy\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Failure Strategy\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"ack.wait.time\": {\n-                                \"defaultValue\": \"5 secs\",\n-                                \"description\": \"After sending a message to Kafka, this indicates the amount of time that we are willing to wait for a response from Kafka. If Kafka does not acknowledge the message within this time period, the FlowFile will be routed to 'failure'.\",\n-                                \"displayName\": \"Acknowledgment Wait Time\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"ack.wait.time\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"acks\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"FlowFile will be routed to success after successfully sending the content to a Kafka node, without waiting for any acknowledgment from the node at all. This provides the best performance but may result in data loss.\",\n-                                        \"displayName\": \"Best Effort\",\n-                                        \"value\": \"0\"\n-                                    },\n-                                    {\n-                                        \"description\": \"FlowFile will be routed to success if the message is received by a single Kafka node, whether or not it is replicated. This is faster than <Guarantee Replicated Delivery> but can result in data loss if a Kafka node crashes\",\n-                                        \"displayName\": \"Guarantee Single Node Delivery\",\n-                                        \"value\": \"1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"FlowFile will be routed to failure unless the message is replicated to the appropriate number of Kafka Nodes according to the Topic configuration\",\n-                                        \"displayName\": \"Guarantee Replicated Delivery\",\n-                                        \"value\": \"all\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"all\",\n-                                \"description\": \"Specifies the requirement for guaranteeing that a message is sent to Kafka. Corresponds to Kafka's 'acks' property.\",\n-                                \"displayName\": \"Delivery Guarantee\",\n+                            \"Mongo Collection Name\": {\n+                                \"description\": \"The name of the collection to use\",\n+                                \"displayName\": \"Mongo Collection Name\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"acks\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Mongo Collection Name\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"attribute-name-regex\": {\n-                                \"description\": \"A Regular Expression that is matched against all FlowFile attribute names. Any attribute whose name matches the regex will be added to the Kafka messages as a Header. If not specified, no FlowFile attributes will be added as headers.\",\n-                                \"displayName\": \"Attributes to Send as Headers (Regex)\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"attribute-name-regex\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"aws.profile.name\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"AWS_MSK_IAM\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"SASL Mechanism\",\n-                                        \"propertyName\": \"sasl.mechanism\"\n-                                    }\n-                                ],\n-                                \"description\": \"The Amazon Web Services Profile to select when multiple profiles are available.\",\n-                                \"displayName\": \"AWS Profile Name\",\n+                            \"Mongo Database Name\": {\n+                                \"description\": \"The name of the database to use\",\n+                                \"displayName\": \"Mongo Database Name\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"aws.profile.name\",\n-                                \"required\": false,\n+                                \"name\": \"Mongo Database Name\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"bootstrap.servers\": {\n-                                \"defaultValue\": \"localhost:9092\",\n-                                \"description\": \"Comma-separated list of Kafka Brokers in the format host:port\",\n-                                \"displayName\": \"Kafka Brokers\",\n+                            \"Mongo URI\": {\n+                                \"description\": \"MongoURI, typically of the form: mongodb://host1[:port1][,host2[:port2],...]\",\n+                                \"displayName\": \"Mongo URI\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"bootstrap.servers\",\n-                                \"required\": true,\n+                                \"name\": \"Mongo URI\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"compression.type\": {\n+                            \"Write Concern\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"none\",\n-                                        \"value\": \"none\"\n+                                        \"displayName\": \"ACKNOWLEDGED\",\n+                                        \"value\": \"ACKNOWLEDGED\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"gzip\",\n-                                        \"value\": \"gzip\"\n+                                        \"displayName\": \"UNACKNOWLEDGED\",\n+                                        \"value\": \"UNACKNOWLEDGED\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"snappy\",\n-                                        \"value\": \"snappy\"\n+                                        \"displayName\": \"FSYNCED\",\n+                                        \"value\": \"FSYNCED\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"lz4\",\n-                                        \"value\": \"lz4\"\n+                                        \"displayName\": \"JOURNALED\",\n+                                        \"value\": \"JOURNALED\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"REPLICA_ACKNOWLEDGED\",\n+                                        \"value\": \"REPLICA_ACKNOWLEDGED\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"MAJORITY\",\n+                                        \"value\": \"MAJORITY\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"W1\",\n+                                        \"value\": \"W1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"W2\",\n+                                        \"value\": \"W2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"W3\",\n+                                        \"value\": \"W3\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"none\",\n-                                \"description\": \"This parameter allows you to specify the compression codec for all data generated by this producer.\",\n-                                \"displayName\": \"Compression Type\",\n+                                \"defaultValue\": \"ACKNOWLEDGED\",\n+                                \"description\": \"The write concern to use\",\n+                                \"displayName\": \"Write Concern\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"compression.type\",\n+                                \"name\": \"Write Concern\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"kafka-key\": {\n-                                \"description\": \"The Key to use for the Message. If not specified, the flow file attribute 'kafka.key' is used as the message key, if it is present.Beware that setting Kafka key and demarcating at the same time may potentially lead to many Kafka messages with the same key.Normally this is not a problem as Kafka does not enforce or assume message and key uniqueness. Still, setting the demarcator and Kafka key at the same time poses a risk of data loss on Kafka. During a topic compaction on Kafka, messages will be deduplicated based on this key.\",\n-                                \"displayName\": \"Kafka Key\",\n+                            \"delete-mongo-delete-mode\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"Delete only the first document that matches the query.\",\n+                                        \"displayName\": \"Delete One\",\n+                                        \"value\": \"one\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Delete every document that matches the query.\",\n+                                        \"displayName\": \"Delete Many\",\n+                                        \"value\": \"many\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Read the 'mongodb.delete.mode attribute and use that mode. Acceptable values are 'many' and 'one.'\",\n+                                        \"displayName\": \"Use 'mongodb.delete.mode' attribute\",\n+                                        \"value\": \"attr\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"one\",\n+                                \"description\": \"Choose between deleting one document by query or many documents by query.\",\n+                                \"displayName\": \"Delete Mode\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"kafka-key\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"delete-mongo-delete-mode\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"kerberos-credentials-service\": {\n-                                \"description\": \"Service supporting generalized credentials authentication with Kerberos\",\n-                                \"displayName\": \"Kerberos Credentials Service\",\n+                            \"delete-mongo-fail-on-no-delete\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"Fail when no documents are deleted.\",\n+                                        \"displayName\": \"True\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Do not fail when nothing is deleted.\",\n+                                        \"displayName\": \"False\",\n+                                        \"value\": \"false\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"true\",\n+                                \"description\": \"Determines whether to send the flowfile to the success or failure relationship if nothing is successfully deleted.\",\n+                                \"displayName\": \"Fail When Nothing Is Deleted\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"kerberos-credentials-service\",\n+                                \"name\": \"delete-mongo-fail-on-no-delete\",\n                                 \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.kerberos.KerberosCredentialsService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n+                                \"sensitive\": false\n                             },\n-                            \"kerberos-user-service\": {\n-                                \"description\": \"Service supporting user authentication with Kerberos\",\n-                                \"displayName\": \"Kerberos User Service\",\n+                            \"mongo-client-service\": {\n+                                \"description\": \"If configured, this property will use the assigned client service for connection pooling.\",\n+                                \"displayName\": \"Client Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"kerberos-user-service\",\n+                                \"name\": \"mongo-client-service\",\n                                 \"required\": false,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"artifact\": \"nifi-mongodb-client-service-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.kerberos.SelfContainedKerberosUserService\",\n+                                    \"type\": \"org.apache.nifi.mongodb.MongoDBClientService\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             },\n-                            \"key-attribute-encoding\": {\n+                            \"ssl-client-auth\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"The key is interpreted as a UTF-8 Encoded string.\",\n-                                        \"displayName\": \"UTF-8 Encoded\",\n-                                        \"value\": \"utf-8\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"WANT\",\n+                                        \"value\": \"WANT\"\n                                     },\n                                     {\n-                                        \"description\": \"The key is interpreted as arbitrary binary data that is encoded using hexadecimal characters with uppercase letters.\",\n-                                        \"displayName\": \"Hex Encoded\",\n-                                        \"value\": \"hex\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"REQUIRED\",\n+                                        \"value\": \"REQUIRED\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"NONE\",\n+                                        \"value\": \"NONE\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"utf-8\",\n-                                \"description\": \"FlowFiles that are emitted have an attribute named 'kafka.key'. This property dictates how the value of the attribute should be encoded.\",\n-                                \"displayName\": \"Key Attribute Encoding\",\n+                                \"defaultValue\": \"REQUIRED\",\n+                                \"description\": \"Client authentication policy when connecting to secure (TLS/SSL) cluster. Possible values are REQUIRED, WANT, NONE. This property is only used when an SSL Context has been defined and enabled.\",\n+                                \"displayName\": \"Client Auth\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"key-attribute-encoding\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"max.block.ms\": {\n-                                \"defaultValue\": \"5 sec\",\n-                                \"description\": \"The amount of time publisher will wait to obtain metadata or wait for the buffer to flush during the 'send' call before failing the entire 'send' call. Corresponds to Kafka's 'max.block.ms' property\",\n-                                \"displayName\": \"Max Metadata Wait Time\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"max.block.ms\",\n-                                \"required\": true,\n+                                \"name\": \"ssl-client-auth\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"max.request.size\": {\n-                                \"defaultValue\": \"1 MB\",\n-                                \"description\": \"The maximum size of a request in bytes. Corresponds to Kafka's 'max.request.size' property and defaults to 1 MB (1048576).\",\n-                                \"displayName\": \"Max Request Size\",\n+                            \"ssl-context-service\": {\n+                                \"description\": \"The SSL Context Service used to provide client certificate information for TLS/SSL connections.\",\n+                                \"displayName\": \"SSL Context Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"max.request.size\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n+                                \"name\": \"ssl-context-service\",\n+                                \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            }\n+                        },\n+                        \"readsAttributes\": [\n+                            {\n+                                \"description\": \"Configurable parameter for controlling delete mode on a per-flowfile basis. The process must be configured to use this option. Acceptable values are 'one' and 'many.'\",\n+                                \"name\": \"mongodb.delete.mode\"\n+                            }\n+                        ],\n+                        \"sideEffectFree\": false,\n+                        \"supportedRelationships\": [\n+                            {\n+                                \"description\": \"All FlowFiles that are written to MongoDB are routed to this relationship\",\n+                                \"name\": \"success\"\n                             },\n-                            \"message-demarcator\": {\n-                                \"description\": \"Specifies the string (interpreted as UTF-8) to use for demarcating multiple messages within a single FlowFile. If not specified, the entire content of the FlowFile will be used as a single message. If specified, the contents of the FlowFile will be split on this delimiter and each section sent as a separate Kafka message. To enter special character such as 'new line' use CTRL+Enter or Shift+Enter, depending on your OS.\",\n-                                \"displayName\": \"Message Demarcator\",\n+                            {\n+                                \"description\": \"All FlowFiles that cannot be written to MongoDB are routed to this relationship\",\n+                                \"name\": \"failure\"\n+                            }\n+                        ],\n+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\",\n+                            \"EVENT_DRIVEN\"\n+                        ],\n+                        \"supportsBatching\": false,\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicRelationships\": false,\n+                        \"supportsEventDriven\": true,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"delete\",\n+                            \"mongo\",\n+                            \"mongodb\"\n+                        ],\n+                        \"triggerSerially\": false,\n+                        \"triggerWhenAnyDestinationAvailable\": false,\n+                        \"triggerWhenEmpty\": false,\n+                        \"type\": \"org.apache.nifi.processors.mongodb.DeleteMongo\",\n+                        \"typeDescription\": \"Executes a delete query against a MongoDB collection. The query is provided in the body of the flowfile and the user can select whether it will delete one or many documents that match it.\",\n+                        \"version\": \"1.27.0\"\n+                    },\n+                    {\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-mongodb-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"e0c4461\"\n+                        },\n+                        \"defaultBulletinLevel\": \"WARN\",\n+                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": 1,\n+                            \"TIMER_DRIVEN\": 1\n+                        },\n+                        \"defaultPenaltyDuration\": \"30 sec\",\n+                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": \"* * * * * ?\",\n+                            \"TIMER_DRIVEN\": \"0 sec\"\n+                        },\n+                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n+                        \"defaultYieldDuration\": \"1 sec\",\n+                        \"group\": \"org.apache.nifi\",\n+                        \"inputRequirement\": \"INPUT_ALLOWED\",\n+                        \"primaryNodeOnly\": false,\n+                        \"propertyDescriptors\": {\n+                            \"Batch Size\": {\n+                                \"description\": \"The number of elements to be returned from the server in one batch\",\n+                                \"displayName\": \"Batch Size\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"message-demarcator\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"message-header-encoding\": {\n-                                \"defaultValue\": \"UTF-8\",\n-                                \"description\": \"For any attribute that is added as a message header, as configured via the <Attributes to Send as Headers> property, this property indicates the Character Encoding to use for serializing the headers.\",\n-                                \"displayName\": \"Message Header Encoding\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"message-header-encoding\",\n+                                \"name\": \"Batch Size\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"partition\": {\n-                                \"description\": \"Specifies which Partition Records will go to.\",\n-                                \"displayName\": \"Partition\",\n+                            \"Limit\": {\n+                                \"description\": \"The maximum number of elements to return\",\n+                                \"displayName\": \"Limit\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"partition\",\n+                                \"name\": \"Limit\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"partitioner.class\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"Messages will be assigned partitions in a round-robin fashion, sending the first message to Partition 1, the next Partition to Partition 2, and so on, wrapping as necessary.\",\n-                                        \"displayName\": \"RoundRobinPartitioner\",\n-                                        \"value\": \"org.apache.nifi.processors.kafka.pubsub.Partitioners$RoundRobinPartitioner\"\n-                                    },\n-                                    {\n-                                        \"description\": \"The default partitioning strategy will choose the sticky partition that changes when the batch is full (See KIP-480 for details about sticky partitioning).\",\n-                                        \"displayName\": \"DefaultPartitioner\",\n-                                        \"value\": \"org.apache.kafka.clients.producer.internals.DefaultPartitioner\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Interprets the <Partition> property as Expression Language that will be evaluated against each FlowFile. This Expression will be evaluated once against the FlowFile, so all Records in a given FlowFile will go to the same partition.\",\n-                                        \"displayName\": \"Expression Language Partitioner\",\n-                                        \"value\": \"org.apache.nifi.processors.kafka.pubsub.Partitioners$ExpressionLanguagePartitioner\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"org.apache.kafka.clients.producer.internals.DefaultPartitioner\",\n-                                \"description\": \"Specifies which class to use to compute a partition id for a message. Corresponds to Kafka's 'partitioner.class' property.\",\n-                                \"displayName\": \"Partitioner class\",\n+                            \"Mongo Collection Name\": {\n+                                \"description\": \"The name of the collection to use\",\n+                                \"displayName\": \"Mongo Collection Name\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"partitioner.class\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Mongo Collection Name\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"sasl.kerberos.keytab\": {\n-                                \"description\": \"Keytab credentials used for authentication with Kerberos\",\n-                                \"displayName\": \"Kerberos Keytab\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"sasl.kerberos.keytab\",\n-                                \"required\": false,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"SINGLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\"\n-                                    ]\n-                                },\n+                            \"Mongo Database Name\": {\n+                                \"description\": \"The name of the database to use\",\n+                                \"displayName\": \"Mongo Database Name\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Mongo Database Name\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"sasl.kerberos.principal\": {\n-                                \"description\": \"Principal used for authentication with Kerberos\",\n-                                \"displayName\": \"Kerberos Principal\",\n+                            \"Mongo URI\": {\n+                                \"description\": \"MongoURI, typically of the form: mongodb://host1[:port1][,host2[:port2],...]\",\n+                                \"displayName\": \"Mongo URI\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"sasl.kerberos.principal\",\n+                                \"name\": \"Mongo URI\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"sasl.kerberos.service.name\": {\n-                                \"description\": \"The service name that matches the primary name of the Kafka server configured in the broker JAAS configuration\",\n-                                \"displayName\": \"Kerberos Service Name\",\n+                            \"Projection\": {\n+                                \"description\": \"The fields to be returned from the documents in the result set; must be a valid BSON document\",\n+                                \"displayName\": \"Projection\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"sasl.kerberos.service.name\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Projection\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"sasl.mechanism\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"General Security Services API for Kerberos authentication\",\n-                                        \"displayName\": \"GSSAPI\",\n-                                        \"value\": \"GSSAPI\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Plain username and password authentication\",\n-                                        \"displayName\": \"PLAIN\",\n-                                        \"value\": \"PLAIN\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Salted Challenge Response Authentication Mechanism using SHA-512 with username and password\",\n-                                        \"displayName\": \"SCRAM-SHA-256\",\n-                                        \"value\": \"SCRAM-SHA-256\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Salted Challenge Response Authentication Mechanism using SHA-256 with username and password\",\n-                                        \"displayName\": \"SCRAM-SHA-512\",\n-                                        \"value\": \"SCRAM-SHA-512\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"GSSAPI\",\n-                                \"description\": \"SASL mechanism used for authentication. Corresponds to Kafka Client sasl.mechanism property\",\n-                                \"displayName\": \"SASL Mechanism\",\n+                            \"Query\": {\n+                                \"description\": \"The selection criteria to do the lookup. If the field is left blank, it will look for input from an incoming connection from another processor to provide the query as a valid JSON document inside of the FlowFile's body. If this field is left blank and a timer is enabled instead of an incoming connection, that will result in a full collection fetch using a \\\"{}\\\" query.\",\n+                                \"displayName\": \"Query\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"sasl.mechanism\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Query\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"sasl.password\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"PLAIN\",\n-                                            \"SCRAM-SHA-512\",\n-                                            \"SCRAM-SHA-256\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"SASL Mechanism\",\n-                                        \"propertyName\": \"sasl.mechanism\"\n-                                    }\n-                                ],\n-                                \"description\": \"Password provided with configured username when using PLAIN or SCRAM SASL Mechanisms\",\n-                                \"displayName\": \"Password\",\n+                            \"Sort\": {\n+                                \"description\": \"The fields by which to sort; must be a valid BSON document\",\n+                                \"displayName\": \"Sort\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"sasl.password\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Sort\",\n                                 \"required\": false,\n-                                \"sensitive\": true\n+                                \"sensitive\": false\n                             },\n-                            \"sasl.token.auth\": {\n+                            \"get-mongo-send-empty\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"true\",\n                                         \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"false\",\n                                         \"value\": \"false\"\n                                     }\n                                 ],\n                                 \"defaultValue\": \"false\",\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"SCRAM-SHA-512\",\n-                                            \"SCRAM-SHA-256\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"SASL Mechanism\",\n-                                        \"propertyName\": \"sasl.mechanism\"\n-                                    }\n-                                ],\n-                                \"description\": \"Enables or disables Token authentication when using SCRAM SASL Mechanisms\",\n-                                \"displayName\": \"Token Authentication\",\n+                                \"description\": \"If a query executes successfully, but returns no results, send an empty JSON document signifying no result.\",\n+                                \"displayName\": \"Send Empty Result\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"sasl.token.auth\",\n+                                \"name\": \"get-mongo-send-empty\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"sasl.username\": {\n-                                \"dependencies\": [\n+                            \"json-type\": {\n+                                \"allowableValues\": [\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"PLAIN\",\n-                                            \"SCRAM-SHA-512\",\n-                                            \"SCRAM-SHA-256\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"SASL Mechanism\",\n-                                        \"propertyName\": \"sasl.mechanism\"\n+                                        \"description\": \"Use MongoDB's \\\"extended JSON\\\". This is the JSON generated with toJson() on a MongoDB Document from the Java driver\",\n+                                        \"displayName\": \"Extended JSON\",\n+                                        \"value\": \"Extended\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Generate a JSON document that conforms to typical JSON conventions instead of Mongo-specific conventions.\",\n+                                        \"displayName\": \"Standard JSON\",\n+                                        \"value\": \"Standard\"\n                                     }\n                                 ],\n-                                \"description\": \"Username provided with configured password when using PLAIN or SCRAM SASL Mechanisms\",\n-                                \"displayName\": \"Username\",\n+                                \"defaultValue\": \"Extended\",\n+                                \"description\": \"By default, MongoDB's Java driver returns \\\"extended JSON\\\". Some of the features of this variant of JSON may cause problems for other JSON parsers that expect only standard JSON types and conventions. This configuration setting  controls whether to use extended JSON or provide a clean view that conforms to standard JSON.\",\n+                                \"displayName\": \"JSON Type\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"sasl.username\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"json-type\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"mongo-charset\": {\n+                                \"defaultValue\": \"UTF-8\",\n+                                \"description\": \"Specifies the character set of the document data.\",\n+                                \"displayName\": \"Character Set\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"mongo-charset\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"mongo-client-service\": {\n+                                \"description\": \"If configured, this property will use the assigned client service for connection pooling.\",\n+                                \"displayName\": \"Client Service\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"mongo-client-service\",\n+                                \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-mongodb-client-service-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.mongodb.MongoDBClientService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"mongo-date-format\": {\n+                                \"defaultValue\": \"yyyy-MM-dd'T'HH:mm:ss'Z'\",\n+                                \"description\": \"The date format string to use for formatting Date fields that are returned from Mongo. It is only applied when the JSON output format is set to Standard JSON. Full documentation for format characters can be found here: https://docs.oracle.com/javase/8/docs/api/java/text/SimpleDateFormat.html\",\n+                                \"displayName\": \"Date Format\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"mongo-date-format\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"security.protocol\": {\n+                            \"mongo-query-attribute\": {\n+                                \"description\": \"If set, the query will be written to a specified attribute on the output flowfiles.\",\n+                                \"displayName\": \"Query Output Attribute\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"mongo-query-attribute\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"results-per-flowfile\": {\n+                                \"description\": \"How many results to put into a FlowFile at once. The whole body will be treated as a JSON array of results.\",\n+                                \"displayName\": \"Results Per FlowFile\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"results-per-flowfile\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"ssl-client-auth\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"PLAINTEXT\",\n-                                        \"value\": \"PLAINTEXT\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"SSL\",\n-                                        \"value\": \"SSL\"\n+                                        \"displayName\": \"WANT\",\n+                                        \"value\": \"WANT\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"SASL_PLAINTEXT\",\n-                                        \"value\": \"SASL_PLAINTEXT\"\n+                                        \"displayName\": \"REQUIRED\",\n+                                        \"value\": \"REQUIRED\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"SASL_SSL\",\n-                                        \"value\": \"SASL_SSL\"\n+                                        \"displayName\": \"NONE\",\n+                                        \"value\": \"NONE\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"PLAINTEXT\",\n-                                \"description\": \"Security protocol used to communicate with brokers. Corresponds to Kafka Client security.protocol property\",\n-                                \"displayName\": \"Security Protocol\",\n+                                \"defaultValue\": \"REQUIRED\",\n+                                \"description\": \"Client authentication policy when connecting to secure (TLS/SSL) cluster. Possible values are REQUIRED, WANT, NONE. This property is only used when an SSL Context has been defined and enabled.\",\n+                                \"displayName\": \"Client Auth\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"security.protocol\",\n-                                \"required\": true,\n+                                \"name\": \"ssl-client-auth\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"ssl.context.service\": {\n-                                \"description\": \"Service supporting SSL communication with Kafka brokers\",\n+                            \"ssl-context-service\": {\n+                                \"description\": \"The SSL Context Service used to provide client certificate information for TLS/SSL connections.\",\n                                 \"displayName\": \"SSL Context Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"ssl.context.service\",\n+                                \"name\": \"ssl-context-service\",\n                                 \"required\": false,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n                                     \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n                                     \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             },\n-                            \"topic\": {\n-                                \"description\": \"The name of the Kafka Topic to publish to.\",\n-                                \"displayName\": \"Topic Name\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"topic\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"transactional-id-prefix\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"true\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Use Transactions\",\n-                                        \"propertyName\": \"use-transactions\"\n-                                    }\n-                                ],\n-                                \"description\": \"When Use Transaction is set to true, KafkaProducer config 'transactional.id' will be a generated UUID and will be prefixed with this string.\",\n-                                \"displayName\": \"Transactional Id Prefix\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"transactional-id-prefix\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"use-transactions\": {\n+                            \"use-pretty-printing\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"true\",\n+                                        \"displayName\": \"True\",\n                                         \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"false\",\n+                                        \"displayName\": \"False\",\n                                         \"value\": \"false\"\n                                     }\n                                 ],\n                                 \"defaultValue\": \"true\",\n-                                \"description\": \"Specifies whether or not NiFi should provide Transactional guarantees when communicating with Kafka. If there is a problem sending data to Kafka, and this property is set to false, then the messages that have already been sent to Kafka will continue on and be delivered to consumers. If this is set to true, then the Kafka transaction will be rolled back so that those messages are not available to consumers. Setting this to true requires that the <Delivery Guarantee> property be set to \\\"Guarantee Replicated Delivery.\\\"\",\n-                                \"displayName\": \"Use Transactions\",\n+                                \"description\": \"Choose whether or not to pretty print the JSON from the results of the query. Choosing 'True' can greatly increase the space requirements on disk depending on the complexity of the JSON document\",\n+                                \"displayName\": \"Pretty Print Results JSON\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"use-transactions\",\n+                                \"name\": \"use-pretty-printing\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             }\n                         },\n-                        \"readsAttributes\": [\n-                            {\n-                                \"description\": \"If this attribute is set to 'true', if the processor is not configured with a demarcator and if the FlowFile's content is null, then a tombstone message with zero bytes will be sent to Kafka.\",\n-                                \"name\": \"kafka.tombstone\"\n-                            }\n-                        ],\n                         \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"FlowFiles for which all content was sent to Kafka.\",\n+                                \"description\": \"All FlowFiles that have the results of a successful query execution go here.\",\n                                 \"name\": \"success\"\n                             },\n                             {\n-                                \"description\": \"Any FlowFile that cannot be sent to Kafka will be routed to this Relationship\",\n+                                \"description\": \"All input FlowFiles that are part of a failed query execution go here.\",\n                                 \"name\": \"failure\"\n+                            },\n+                            {\n+                                \"description\": \"All input FlowFiles that are part of a successful query execution go here.\",\n+                                \"name\": \"original\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n                         \"supportsBatching\": false,\n-                        \"supportsDynamicProperties\": true,\n+                        \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"2.6\",\n-                            \"Apache\",\n-                            \"Kafka\",\n-                            \"Message\",\n-                            \"PubSub\",\n-                            \"Put\",\n-                            \"Send\"\n+                            \"get\",\n+                            \"mongodb\",\n+                            \"read\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.kafka.pubsub.PublishKafka_2_6\",\n-                        \"typeDescription\": \"Sends the contents of a FlowFile as a message to Apache Kafka using the Kafka 2.6 Producer API.The messages to send may be individual FlowFiles or may be delimited, using a user-specified delimiter, such as a new-line. The complementary NiFi processor for fetching messages is ConsumeKafka_2_6.\",\n+                        \"type\": \"org.apache.nifi.processors.mongodb.GetMongo\",\n+                        \"typeDescription\": \"Creates FlowFiles from documents in MongoDB loaded by a user-specified query.\",\n                         \"version\": \"1.27.0\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"The number of messages that were sent to Kafka for this FlowFile. This attribute is added only to FlowFiles that are routed to success. If the <Message Demarcator> Property is not set, this will always be 1, but if the Property is set, it may be greater than 1.\",\n-                                \"name\": \"msg.count\"\n+                                \"description\": \"The database where the results came from.\",\n+                                \"name\": \"mongo.database.name\"\n+                            },\n+                            {\n+                                \"description\": \"The collection where the results came from.\",\n+                                \"name\": \"mongo.collection.name\"\n                             }\n                         ]\n-                    }\n-                ],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"1.27.0\"\n-        },\n-        {\n-            \"artifact\": \"nifi-smb-client-api-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [],\n-                \"processors\": [],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"1.27.0\"\n-        },\n-        {\n-            \"artifact\": \"nifi-server-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [],\n-                \"processors\": [],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"1.27.0\"\n-        },\n-        {\n-            \"artifact\": \"nifi-spring-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [],\n-                \"processors\": [\n+                    },\n                     {\n                         \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-spring-nar\",\n+                        \"artifact\": \"nifi-mongodb-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -75145,1449 +72963,1220 @@\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n-                        \"deprecated\": true,\n-                        \"deprecationReason\": \"Alternative event-handling solutions should be used\",\n                         \"group\": \"org.apache.nifi\",\n+                        \"inputRequirement\": \"INPUT_ALLOWED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Application Context class path\": {\n-                                \"description\": \"Path to the directory with resources (i.e., JARs, configuration files etc.) required to be on the classpath of the ApplicationContext.\",\n-                                \"displayName\": \"Application Context class path\",\n+                            \"Batch Size\": {\n+                                \"description\": \"The number of elements to be returned from the server in one batch\",\n+                                \"displayName\": \"Batch Size\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Application Context class path\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Batch Size\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Limit\": {\n+                                \"description\": \"The maximum number of elements to return\",\n+                                \"displayName\": \"Limit\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Limit\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Mongo Collection Name\": {\n+                                \"description\": \"The name of the collection to use\",\n+                                \"displayName\": \"Mongo Collection Name\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Mongo Collection Name\",\n                                 \"required\": true,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"SINGLE\",\n-                                    \"resourceTypes\": [\n-                                        \"DIRECTORY\"\n-                                    ]\n-                                },\n                                 \"sensitive\": false\n                             },\n-                            \"Application Context config path\": {\n-                                \"description\": \"The path to the Spring Application Context configuration file relative to the classpath\",\n-                                \"displayName\": \"Application Context config path\",\n+                            \"Mongo Database Name\": {\n+                                \"description\": \"The name of the database to use\",\n+                                \"displayName\": \"Mongo Database Name\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Application Context config path\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Mongo Database Name\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Receive Timeout\": {\n-                                \"description\": \"Timeout for receiving date from Spring context. Defaults to 0.\",\n-                                \"displayName\": \"Receive Timeout\",\n+                            \"Projection\": {\n+                                \"description\": \"The fields to be returned from the documents in the result set; must be a valid BSON document\",\n+                                \"displayName\": \"Projection\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Receive Timeout\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Projection\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Send Timeout\": {\n-                                \"description\": \"Timeout for sending data to Spring Application Context. Defaults to 0.\",\n-                                \"displayName\": \"Send Timeout\",\n+                            \"Query\": {\n+                                \"description\": \"The selection criteria to do the lookup. If the field is left blank, it will look for input from an incoming connection from another processor to provide the query as a valid JSON document inside of the FlowFile's body. If this field is left blank and a timer is enabled instead of an incoming connection, that will result in a full collection fetch using a \\\"{}\\\" query.\",\n+                                \"displayName\": \"Query\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Query\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Sort\": {\n+                                \"description\": \"The fields by which to sort; must be a valid BSON document\",\n+                                \"displayName\": \"Sort\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Sort\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"get-mongo-record-writer-factory\": {\n+                                \"description\": \"The record writer to use to write the result sets.\",\n+                                \"displayName\": \"Record Writer\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Send Timeout\",\n+                                \"name\": \"get-mongo-record-writer-factory\",\n+                                \"required\": true,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"mongo-client-service\": {\n+                                \"description\": \"If configured, this property will use the assigned client service for connection pooling.\",\n+                                \"displayName\": \"Client Service\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"mongo-client-service\",\n+                                \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-mongodb-client-service-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.mongodb.MongoDBClientService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"mongo-query-attribute\": {\n+                                \"description\": \"If set, the query will be written to a specified attribute on the output flowfiles.\",\n+                                \"displayName\": \"Query Output Attribute\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"mongo-query-attribute\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n+                            },\n+                            \"mongodb-schema-name\": {\n+                                \"defaultValue\": \"${schema.name}\",\n+                                \"description\": \"The name of the schema in the configured schema registry to use for the query results.\",\n+                                \"displayName\": \"Schema Name\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"mongodb-schema-name\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n                             }\n                         },\n                         \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"All FlowFiles that are successfully received from Spring Application Context are routed to this relationship\",\n+                                \"description\": \"All FlowFiles that have the results of a successful query execution go here.\",\n                                 \"name\": \"success\"\n                             },\n                             {\n-                                \"description\": \"All FlowFiles that cannot be sent to Spring Application Context are routed to this relationship\",\n+                                \"description\": \"All input FlowFiles that are part of a failed query execution go here.\",\n                                 \"name\": \"failure\"\n+                            },\n+                            {\n+                                \"description\": \"All input FlowFiles that are part of a successful query execution go here.\",\n+                                \"name\": \"original\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n                         \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"Get\",\n-                            \"Integration\",\n-                            \"Message\",\n-                            \"Put\",\n-                            \"Spring\"\n+                            \"fetch\",\n+                            \"get\",\n+                            \"json\",\n+                            \"mongo\",\n+                            \"mongodb\",\n+                            \"record\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": true,\n-                        \"type\": \"org.apache.nifi.spring.SpringContextProcessor\",\n-                        \"typeDescription\": \"A Processor that supports sending and receiving data from application defined in Spring Application Context via predefined in/out MessageChannels.\",\n-                        \"version\": \"1.27.0\"\n-                    }\n-                ],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"1.27.0\"\n-        },\n-        {\n-            \"artifact\": \"nifi-jms-cf-service-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [],\n-                \"processors\": [],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"1.27.0\"\n-        },\n-        {\n-            \"artifact\": \"nifi-zendesk-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [],\n-                \"processors\": [\n+                        \"triggerWhenEmpty\": false,\n+                        \"type\": \"org.apache.nifi.processors.mongodb.GetMongoRecord\",\n+                        \"typeDescription\": \"A record-based version of GetMongo that uses the Record writers to write the MongoDB result set.\",\n+                        \"version\": \"1.27.0\",\n+                        \"writesAttributes\": [\n+                            {\n+                                \"description\": \"The database where the results came from.\",\n+                                \"name\": \"mongo.database.name\"\n+                            },\n+                            {\n+                                \"description\": \"The collection where the results came from.\",\n+                                \"name\": \"mongo.collection.name\"\n+                            }\n+                        ]\n+                    },\n                     {\n                         \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-zendesk-nar\",\n+                        \"artifact\": \"nifi-mongodb-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n+                            \"EVENT_DRIVEN\": 0,\n                             \"TIMER_DRIVEN\": 1\n                         },\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"1 min\"\n+                            \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n-                        \"defaultYieldDuration\": \"20 sec\",\n+                        \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n-                        \"primaryNodeOnly\": true,\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n+                        \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"web-client-service-provider\": {\n-                                \"description\": \"Controller service for HTTP client operations.\",\n-                                \"displayName\": \"Web Client Service Provider\",\n+                            \"Character Set\": {\n+                                \"defaultValue\": \"UTF-8\",\n+                                \"description\": \"The Character Set in which the data is encoded\",\n+                                \"displayName\": \"Character Set\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"web-client-service-provider\",\n+                                \"name\": \"Character Set\",\n                                 \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.web.client.provider.api.WebClientServiceProvider\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n+                                \"sensitive\": false\n                             },\n-                            \"zendesk-authentication-type-name\": {\n+                            \"Mode\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Password of Zendesk login user.\",\n-                                        \"displayName\": \"Password\",\n-                                        \"value\": \"password\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"insert\",\n+                                        \"value\": \"insert\"\n                                     },\n                                     {\n-                                        \"description\": \"Authentication token generated in Zendesk Admin menu for API access.\",\n-                                        \"displayName\": \"Token\",\n-                                        \"value\": \"token\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"update\",\n+                                        \"value\": \"update\"\n                                     }\n                                 ],\n-                                \"description\": \"Type of authentication to Zendesk API.\",\n-                                \"displayName\": \"Authentication Type\",\n+                                \"defaultValue\": \"insert\",\n+                                \"description\": \"Indicates whether the processor should insert or update content\",\n+                                \"displayName\": \"Mode\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"zendesk-authentication-type-name\",\n+                                \"name\": \"Mode\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"zendesk-authentication-value-name\": {\n-                                \"description\": \"Password or authentication token for Zendesk login user.\",\n-                                \"displayName\": \"Authentication Credential\",\n+                            \"Mongo Collection Name\": {\n+                                \"description\": \"The name of the collection to use\",\n+                                \"displayName\": \"Mongo Collection Name\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"zendesk-authentication-value-name\",\n+                                \"name\": \"Mongo Collection Name\",\n                                 \"required\": true,\n-                                \"sensitive\": true\n+                                \"sensitive\": false\n                             },\n-                            \"zendesk-export-method\": {\n+                            \"Mongo Database Name\": {\n+                                \"description\": \"The name of the database to use\",\n+                                \"displayName\": \"Mongo Database Name\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Mongo Database Name\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Mongo URI\": {\n+                                \"description\": \"MongoURI, typically of the form: mongodb://host1[:port1][,host2[:port2],...]\",\n+                                \"displayName\": \"Mongo URI\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Mongo URI\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Update Query Key\": {\n+                                \"description\": \"Key name used to build the update query criteria; this property is valid only when using update mode, otherwise it is ignored. Example: _id\",\n+                                \"displayName\": \"Update Query Key\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Update Query Key\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Upsert\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"In cursor-based incremental exports, each page of results includes an \\\"after\\\" cursor pointer to use as the starting cursor for the next page of results.\",\n-                                        \"displayName\": \"Cursor Based\",\n-                                        \"value\": \"cursor\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n-                                        \"description\": \"In time-based incremental exports, each page of results includes an end time to use as the start time for the next page of results.\",\n-                                        \"displayName\": \"Time Based\",\n-                                        \"value\": \"time\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"description\": \"Method for incremental export.\",\n-                                \"displayName\": \"Export Method\",\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"When true, inserts a document if no document matches the update query criteria; this property is valid only when using update mode, otherwise it is ignored\",\n+                                \"displayName\": \"Upsert\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"zendesk-export-method\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"zendesk-query-start-timestamp\": {\n-                                \"description\": \"Initial timestamp to query Zendesk API from in Unix timestamp seconds format.\",\n-                                \"displayName\": \"Query Start Timestamp\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"zendesk-query-start-timestamp\",\n+                                \"name\": \"Upsert\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"zendesk-resource\": {\n+                            \"Write Concern\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Tickets are the means through which end users (customers) communicate with agents in Zendesk Support.\",\n-                                        \"displayName\": \"Tickets\",\n-                                        \"value\": \"/api/v2/incremental/tickets\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"ACKNOWLEDGED\",\n+                                        \"value\": \"ACKNOWLEDGED\"\n                                     },\n                                     {\n-                                        \"description\": \"Stream of changes that occurred on tickets. Each event is tied to an update on a ticket and contains all the fields that were updated in that change.\",\n-                                        \"displayName\": \"Ticket Events\",\n-                                        \"value\": \"/api/v2/incremental/ticket_events\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"UNACKNOWLEDGED\",\n+                                        \"value\": \"UNACKNOWLEDGED\"\n                                     },\n                                     {\n-                                        \"description\": \"Ticket metric events API can be used to track reply times, agent work times, and requester wait times.\",\n-                                        \"displayName\": \"Ticket Metric Events\",\n-                                        \"value\": \"/api/v2/incremental/ticket_metric_events\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"FSYNCED\",\n+                                        \"value\": \"FSYNCED\"\n                                     },\n                                     {\n-                                        \"description\": \"Zendesk Support has three types of users: end users (customers), agents, and administrators.\",\n-                                        \"displayName\": \"Users\",\n-                                        \"value\": \"/api/v2/incremental/users\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"JOURNALED\",\n+                                        \"value\": \"JOURNALED\"\n                                     },\n                                     {\n-                                        \"description\": \"Just as agents can be segmented into groups in Zendesk Support, customers (end-users) can be segmented into organizations.\",\n-                                        \"displayName\": \"Organizations\",\n-                                        \"value\": \"/api/v2/incremental/organizations\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"REPLICA_ACKNOWLEDGED\",\n+                                        \"value\": \"REPLICA_ACKNOWLEDGED\"\n                                     },\n                                     {\n-                                        \"description\": \"Articles are content items such as help topics or tech notes contained in sections.\",\n-                                        \"displayName\": \"Articles\",\n-                                        \"value\": \"/api/v2/help_center/incremental/articles\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"MAJORITY\",\n+                                        \"value\": \"MAJORITY\"\n                                     },\n                                     {\n-                                        \"description\": \"When a recipient responds to an NPS survey, their rating, comment, and last survey date are captured.\",\n-                                        \"displayName\": \"NPS - Responses\",\n-                                        \"value\": \"/api/v2/nps/incremental/responses\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"W1\",\n+                                        \"value\": \"W1\"\n                                     },\n                                     {\n-                                        \"description\": \"Every NPS survey is delivered to one or multiple recipients. For most businesses that use Zendesk Support, the recipients are customers. Agents and admins will never receive surveys.\",\n-                                        \"displayName\": \"NPS - Recipients\",\n-                                        \"value\": \"/api/v2/nps/incremental/recipients\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"W2\",\n+                                        \"value\": \"W2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"W3\",\n+                                        \"value\": \"W3\"\n                                     }\n                                 ],\n-                                \"description\": \"The particular Zendesk resource which is meant to be exported.\",\n-                                \"displayName\": \"Resource\",\n+                                \"defaultValue\": \"ACKNOWLEDGED\",\n+                                \"description\": \"The write concern to use\",\n+                                \"displayName\": \"Write Concern\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"zendesk-resource\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"zendesk-subdomain\": {\n-                                \"description\": \"Name of the Zendesk subdomain.\",\n-                                \"displayName\": \"Subdomain Name\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"zendesk-subdomain\",\n+                                \"name\": \"Write Concern\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"zendesk-user\": {\n-                                \"description\": \"Login user to Zendesk subdomain.\",\n-                                \"displayName\": \"User Name\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"zendesk-user\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            }\n-                        },\n-                        \"sideEffectFree\": false,\n-                        \"stateful\": {\n-                            \"description\": \"Paging cursor for Zendesk API is stored. Cursor is updated after each successful request.\",\n-                            \"scopes\": [\n-                                \"CLUSTER\"\n-                            ]\n-                        },\n-                        \"supportedRelationships\": [\n-                            {\n-                                \"description\": \"For FlowFiles created as a result of a successful HTTP request.\",\n-                                \"name\": \"success\"\n-                            }\n-                        ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": false,\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": false,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"zendesk\"\n-                        ],\n-                        \"triggerSerially\": true,\n-                        \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.zendesk.GetZendesk\",\n-                        \"typeDescription\": \"Incrementally fetches data from Zendesk API.\",\n-                        \"version\": \"1.27.0\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"The number of records fetched by the processor.\",\n-                                \"name\": \"record.count\"\n-                            }\n-                        ]\n-                    },\n-                    {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-zendesk-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"e0c4461\"\n-                        },\n-                        \"defaultBulletinLevel\": \"WARN\",\n-                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": 1,\n-                            \"TIMER_DRIVEN\": 1\n-                        },\n-                        \"defaultPenaltyDuration\": \"30 sec\",\n-                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"0 sec\"\n-                        },\n-                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n-                        \"defaultYieldDuration\": \"1 sec\",\n-                        \"dynamicProperties\": [\n-                            {\n-                                \"description\": \"Additional property to be added to the Zendesk request object.\",\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"name\": \"The path in the request object to add. The value needs be a valid JsonPointer.\",\n-                                \"value\": \"The path in the incoming record to get the value from.\"\n-                            }\n-                        ],\n-                        \"group\": \"org.apache.nifi\",\n-                        \"primaryNodeOnly\": false,\n-                        \"propertyDescriptors\": {\n-                            \"web-client-service-provider\": {\n-                                \"description\": \"Controller service for HTTP client operations.\",\n-                                \"displayName\": \"Web Client Service Provider\",\n+                            \"mongo-client-service\": {\n+                                \"description\": \"If configured, this property will use the assigned client service for connection pooling.\",\n+                                \"displayName\": \"Client Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"web-client-service-provider\",\n-                                \"required\": true,\n+                                \"name\": \"mongo-client-service\",\n+                                \"required\": false,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"artifact\": \"nifi-mongodb-client-service-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.web.client.provider.api.WebClientServiceProvider\",\n+                                    \"type\": \"org.apache.nifi.mongodb.MongoDBClientService\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             },\n-                            \"zendesk-authentication-type-name\": {\n+                            \"put-mongo-update-mode\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Password of Zendesk login user.\",\n-                                        \"displayName\": \"Password\",\n-                                        \"value\": \"password\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"With whole document\",\n+                                        \"value\": \"doc\"\n                                     },\n                                     {\n-                                        \"description\": \"Authentication token generated in Zendesk Admin menu for API access.\",\n-                                        \"displayName\": \"Token\",\n-                                        \"value\": \"token\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"With operators enabled\",\n+                                        \"value\": \"operators\"\n                                     }\n                                 ],\n-                                \"description\": \"Type of authentication to Zendesk API.\",\n-                                \"displayName\": \"Authentication Type\",\n+                                \"defaultValue\": \"doc\",\n+                                \"description\": \"Choose an update mode. You can either supply a JSON document to use as a direct replacement or specify a document that contains update operators like $set, $unset, and $inc. When Operators mode is enabled, the flowfile content is expected to be the operator part for example: {$set:{\\\"key\\\": \\\"value\\\"},$inc:{\\\"count\\\":1234}} and the update query will come from the configured Update Query property.\",\n+                                \"displayName\": \"Update Mode\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"zendesk-authentication-type-name\",\n+                                \"name\": \"put-mongo-update-mode\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"zendesk-authentication-value-name\": {\n-                                \"description\": \"Password or authentication token for Zendesk login user.\",\n-                                \"displayName\": \"Authentication Credential\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"zendesk-authentication-value-name\",\n-                                \"required\": true,\n-                                \"sensitive\": true\n-                            },\n-                            \"zendesk-comment-body\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"propertyDisplayName\": \"Record Reader\",\n-                                        \"propertyName\": \"zendesk-record-reader\"\n-                                    }\n-                                ],\n-                                \"description\": \"The content or the path to the comment body in the incoming record.\",\n-                                \"displayName\": \"Comment Body\",\n+                            \"putmongo-update-query\": {\n+                                \"description\": \"Specify a full MongoDB query to be used for the lookup query to do an update/upsert.\",\n+                                \"displayName\": \"Update Query\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"zendesk-comment-body\",\n-                                \"required\": true,\n+                                \"name\": \"putmongo-update-query\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"zendesk-priority\": {\n-                                \"dependencies\": [\n+                            \"ssl-client-auth\": {\n+                                \"allowableValues\": [\n                                     {\n-                                        \"propertyDisplayName\": \"Record Reader\",\n-                                        \"propertyName\": \"zendesk-record-reader\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"WANT\",\n+                                        \"value\": \"WANT\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"REQUIRED\",\n+                                        \"value\": \"REQUIRED\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"NONE\",\n+                                        \"value\": \"NONE\"\n                                     }\n                                 ],\n-                                \"description\": \"The content or the path to the priority in the incoming record.\",\n-                                \"displayName\": \"Priority\",\n+                                \"defaultValue\": \"REQUIRED\",\n+                                \"description\": \"Client authentication policy when connecting to secure (TLS/SSL) cluster. Possible values are REQUIRED, WANT, NONE. This property is only used when an SSL Context has been defined and enabled.\",\n+                                \"displayName\": \"Client Auth\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"zendesk-priority\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"ssl-client-auth\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"zendesk-record-reader\": {\n-                                \"description\": \"Specifies the Controller Service to use for parsing incoming data and determining the data's schema.\",\n-                                \"displayName\": \"Record Reader\",\n+                            \"ssl-context-service\": {\n+                                \"description\": \"The SSL Context Service used to provide client certificate information for TLS/SSL connections.\",\n+                                \"displayName\": \"SSL Context Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"zendesk-record-reader\",\n+                                \"name\": \"ssl-context-service\",\n                                 \"required\": false,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n                                     \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n+                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n                                     \"version\": \"1.27.0\"\n                                 }\n-                            },\n-                            \"zendesk-subdomain\": {\n-                                \"description\": \"Name of the Zendesk subdomain.\",\n-                                \"displayName\": \"Subdomain Name\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"zendesk-subdomain\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"zendesk-subject\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"propertyDisplayName\": \"Record Reader\",\n-                                        \"propertyName\": \"zendesk-record-reader\"\n-                                    }\n-                                ],\n-                                \"description\": \"The content or the path to the subject in the incoming record.\",\n-                                \"displayName\": \"Subject\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"zendesk-subject\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"zendesk-type\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"propertyDisplayName\": \"Record Reader\",\n-                                        \"propertyName\": \"zendesk-record-reader\"\n-                                    }\n-                                ],\n-                                \"description\": \"The content or the path to the type in the incoming record.\",\n-                                \"displayName\": \"Type\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"zendesk-type\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"zendesk-user\": {\n-                                \"description\": \"Login user to Zendesk subdomain.\",\n-                                \"displayName\": \"User Name\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"zendesk-user\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n                             }\n                         },\n                         \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"For FlowFiles created as a result of a successful HTTP request.\",\n+                                \"description\": \"All FlowFiles that are written to MongoDB are routed to this relationship\",\n                                 \"name\": \"success\"\n                             },\n                             {\n-                                \"description\": \"A FlowFile is routed to this relationship if the operation failed and retrying the operation will also fail, such as an invalid data or schema.\",\n+                                \"description\": \"All FlowFiles that cannot be written to MongoDB are routed to this relationship\",\n                                 \"name\": \"failure\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n+                            \"CRON_DRIVEN\",\n+                            \"EVENT_DRIVEN\"\n                         ],\n                         \"supportsBatching\": false,\n-                        \"supportsDynamicProperties\": true,\n+                        \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": false,\n+                        \"supportsEventDriven\": true,\n                         \"supportsSensitiveDynamicProperties\": false,\n+                        \"systemResourceConsiderations\": [\n+                            {\n+                                \"description\": \"An instance of this component can cause high usage of this system resource.  Multiple instances or high concurrency settings may result a degradation of performance.\",\n+                                \"resource\": \"MEMORY\"\n+                            }\n+                        ],\n                         \"tags\": [\n-                            \"zendesk, ticket\"\n+                            \"insert\",\n+                            \"mongodb\",\n+                            \"put\",\n+                            \"update\",\n+                            \"write\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.zendesk.PutZendeskTicket\",\n-                        \"typeDescription\": \"Create Zendesk tickets using the Zendesk API.\",\n-                        \"version\": \"1.27.0\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"The number of records processed.\",\n-                                \"name\": \"record.count\"\n-                            },\n-                            {\n-                                \"description\": \"The error code of from the response.\",\n-                                \"name\": \"error.code\"\n-                            },\n-                            {\n-                                \"description\": \"The error message of from the response.\",\n-                                \"name\": \"error.message\"\n-                            }\n-                        ]\n-                    }\n-                ],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"1.27.0\"\n-        },\n-        {\n-            \"artifact\": \"nifi-elasticsearch-client-service-api-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [],\n-                \"processors\": [],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"1.27.0\"\n-        },\n-        {\n-            \"artifact\": \"nifi-shopify-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [],\n-                \"processors\": [\n+                        \"type\": \"org.apache.nifi.processors.mongodb.PutMongo\",\n+                        \"typeDescription\": \"Writes the contents of a FlowFile to MongoDB\",\n+                        \"version\": \"1.27.0\"\n+                    },\n                     {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-shopify-nar\",\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-mongodb-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n+                            \"EVENT_DRIVEN\": 0,\n                             \"TIMER_DRIVEN\": 1\n                         },\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"1 min\"\n+                            \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n-                        \"primaryNodeOnly\": true,\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n+                        \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"CUSTOMERS\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"The Customer resource stores information about a shop's customers, such as their contact details, their order history, and whether they've agreed to receive email marketing.\",\n-                                        \"displayName\": \"Customers\",\n-                                        \"value\": \"customers\"\n-                                    }\n-                                ],\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"CUSTOMERS\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Object Category\",\n-                                        \"propertyName\": \"object-category\"\n-                                    }\n-                                ],\n-                                \"description\": \"Customer resource to query\",\n-                                \"displayName\": \"Customer Category\",\n+                            \"Mongo Collection Name\": {\n+                                \"description\": \"The name of the collection to use\",\n+                                \"displayName\": \"Mongo Collection Name\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"CUSTOMERS\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Mongo Collection Name\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"DISCOUNTS\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"The PriceRule resource can be used to get discounts using conditions\",\n-                                        \"displayName\": \"Price Rules\",\n-                                        \"value\": \"price_rules\"\n-                                    }\n-                                ],\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"DISCOUNTS\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Object Category\",\n-                                        \"propertyName\": \"object-category\"\n-                                    }\n-                                ],\n-                                \"description\": \"Discount resource to query\",\n-                                \"displayName\": \"Discount Category\",\n+                            \"Mongo Database Name\": {\n+                                \"description\": \"The name of the database to use\",\n+                                \"displayName\": \"Mongo Database Name\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"DISCOUNTS\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Mongo Database Name\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"INVENTORY\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"A location represents a geographical location where your stores, pop-up stores, headquarters and warehouses exist.\",\n-                                        \"displayName\": \"Locations\",\n-                                        \"value\": \"locations\"\n-                                    }\n-                                ],\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"INVENTORY\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Object Category\",\n-                                        \"propertyName\": \"object-category\"\n-                                    }\n-                                ],\n-                                \"description\": \"Inventory resource to query\",\n-                                \"displayName\": \"Inventory Category\",\n+                            \"Mongo URI\": {\n+                                \"description\": \"MongoURI, typically of the form: mongodb://host1[:port1][,host2[:port2],...]\",\n+                                \"displayName\": \"Mongo URI\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"INVENTORY\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Mongo URI\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"ONLINE_STORE\": {\n+                            \"Write Concern\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Shopify shops come with a built-in blogging engine, allowing a shop to have one or more blogs.\",\n-                                        \"displayName\": \"Blogs\",\n-                                        \"value\": \"blogs\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"ACKNOWLEDGED\",\n+                                        \"value\": \"ACKNOWLEDGED\"\n                                     },\n                                     {\n-                                        \"description\": \"A comment is a reader's response to an article in a blog.\",\n-                                        \"displayName\": \"Comments\",\n-                                        \"value\": \"comments\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"UNACKNOWLEDGED\",\n+                                        \"value\": \"UNACKNOWLEDGED\"\n                                     },\n                                     {\n-                                        \"description\": \"Shopify stores come with a tool for creating basic HTML web pages.\",\n-                                        \"displayName\": \"Pages\",\n-                                        \"value\": \"pages\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"FSYNCED\",\n+                                        \"value\": \"FSYNCED\"\n                                     },\n                                     {\n-                                        \"description\": \"A redirect causes a visitor on a specific path on the shop's site to be automatically sent to a different location.\",\n-                                        \"displayName\": \"Redirects\",\n-                                        \"value\": \"redirects\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"JOURNALED\",\n+                                        \"value\": \"JOURNALED\"\n                                     },\n                                     {\n-                                        \"description\": \"The ScriptTag resource represents remote JavaScript code that is loaded into the pages of a shop's storefront or the order status page of checkout.\",\n-                                        \"displayName\": \"Script Tags\",\n-                                        \"value\": \"script_tags\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"REPLICA_ACKNOWLEDGED\",\n+                                        \"value\": \"REPLICA_ACKNOWLEDGED\"\n                                     },\n                                     {\n-                                        \"description\": \"A theme controls the look and feel of a Shopify online store.\",\n-                                        \"displayName\": \"Themes\",\n-                                        \"value\": \"themes\"\n-                                    }\n-                                ],\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"ONLINE_STORE\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Object Category\",\n-                                        \"propertyName\": \"object-category\"\n-                                    }\n-                                ],\n-                                \"description\": \"Online Store resource to query\",\n-                                \"displayName\": \"Online Store Category\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"ONLINE_STORE\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"ORDERS\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"A checkout is considered abandoned after the customer has added contact information, but before the customer has completed their purchase.\",\n-                                        \"displayName\": \"Abandoned Checkouts\",\n-                                        \"value\": \"checkouts\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"MAJORITY\",\n+                                        \"value\": \"MAJORITY\"\n                                     },\n                                     {\n-                                        \"description\": \"Merchants can use draft orders to create orders on behalf of their customers.\",\n-                                        \"displayName\": \"Draft Orders\",\n-                                        \"value\": \"draft_orders\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"W1\",\n+                                        \"value\": \"W1\"\n                                     },\n                                     {\n-                                        \"description\": \"An order is a customer's request to purchase one or more products from a shop.\",\n-                                        \"displayName\": \"Orders\",\n-                                        \"value\": \"orders\"\n-                                    }\n-                                ],\n-                                \"dependencies\": [\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"W2\",\n+                                        \"value\": \"W2\"\n+                                    },\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"ORDERS\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Object Category\",\n-                                        \"propertyName\": \"object-category\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"W3\",\n+                                        \"value\": \"W3\"\n                                     }\n                                 ],\n-                                \"description\": \"Order resource to query\",\n-                                \"displayName\": \"Order Category\",\n+                                \"defaultValue\": \"ACKNOWLEDGED\",\n+                                \"description\": \"The write concern to use\",\n+                                \"displayName\": \"Write Concern\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"ORDERS\",\n+                                \"name\": \"Write Concern\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"PRODUCT\": {\n+                            \"bypass-validation\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Collects are meant for managing the relationship between products and custom collections.\",\n-                                        \"displayName\": \"Collects\",\n-                                        \"value\": \"collects\"\n-                                    },\n-                                    {\n-                                        \"description\": \"A custom collection is a grouping of products that a merchant can create to make their store easier to browse. \",\n-                                        \"displayName\": \"Custom Collections\",\n-                                        \"value\": \"custom_collections\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Get products in a merchant's store \",\n-                                        \"displayName\": \"Products\",\n-                                        \"value\": \"products\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"True\",\n+                                        \"value\": \"True\"\n                                     },\n                                     {\n-                                        \"description\": \"A smart collection is a grouping of products defined by rules that are set by the merchant.\",\n-                                        \"displayName\": \"Smart Collections\",\n-                                        \"value\": \"smart_collections\"\n-                                    }\n-                                ],\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"PRODUCT\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Object Category\",\n-                                        \"propertyName\": \"object-category\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"False\",\n+                                        \"value\": \"False\"\n                                     }\n                                 ],\n-                                \"description\": \"Product resource to query\",\n-                                \"displayName\": \"Product Category\",\n+                                \"defaultValue\": \"True\",\n+                                \"description\": \"Bypass schema validation during insert/upsert\",\n+                                \"displayName\": \"Bypass Validation\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"PRODUCT\",\n+                                \"name\": \"bypass-validation\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"SALES_CHANNELS\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"A CollectionListing resource represents a product collection that a merchant has made available to your sales channel.\",\n-                                        \"displayName\": \"Collection Listings\",\n-                                        \"value\": \"collection_listings\"\n-                                    },\n-                                    {\n-                                        \"description\": \"A ProductListing resource represents a Product which is available to your sales channel.\",\n-                                        \"displayName\": \"Product Listings\",\n-                                        \"value\": \"product_listings\"\n-                                    }\n-                                ],\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"SALES_CHANNELS\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Object Category\",\n-                                        \"propertyName\": \"object-category\"\n-                                    }\n-                                ],\n-                                \"description\": \"Sales Channel resource to query\",\n-                                \"displayName\": \"Sales Channel Category\",\n+                            \"insert_count\": {\n+                                \"defaultValue\": \"100\",\n+                                \"description\": \"The number of records to group together for one single insert/upsert operation against MongoDB.\",\n+                                \"displayName\": \"Batch Size\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"SALES_CHANNELS\",\n+                                \"name\": \"insert_count\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"STORE_PROPERTIES\": {\n+                            \"mongo-client-service\": {\n+                                \"description\": \"If configured, this property will use the assigned client service for connection pooling.\",\n+                                \"displayName\": \"Client Service\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"mongo-client-service\",\n+                                \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-mongodb-client-service-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.mongodb.MongoDBClientService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"ordered\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"The Country resource represents the tax rates applied to orders from the different countries where a shop sells its products.\",\n-                                        \"displayName\": \"Countries\",\n-                                        \"value\": \"countries\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Merchants who use Shopify Payments can allow customers to pay in their local currency on the online store.\",\n-                                        \"displayName\": \"Currencies\",\n-                                        \"value\": \"currencies\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Policy resource can be used to access the policies that a merchant has configured for their shop, such as their refund and privacy policies.\",\n-                                        \"displayName\": \"Policies\",\n-                                        \"value\": \"policies\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"True\",\n+                                        \"value\": \"True\"\n                                     },\n                                     {\n-                                        \"description\": \"ShippingZone resource can be used to view shipping zones and their countries, provinces, and shipping rates.\",\n-                                        \"displayName\": \"Shipping Zones\",\n-                                        \"value\": \"shipping_zones\"\n-                                    }\n-                                ],\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"STORE_PROPERTIES\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Object Category\",\n-                                        \"propertyName\": \"object-category\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"False\",\n+                                        \"value\": \"False\"\n                                     }\n                                 ],\n-                                \"description\": \"Store Property resource to query\",\n-                                \"displayName\": \"Store Property Category\",\n+                                \"defaultValue\": \"False\",\n+                                \"description\": \"Perform ordered or unordered operations\",\n+                                \"displayName\": \"Ordered\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"STORE_PROPERTIES\",\n+                                \"name\": \"ordered\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"access-token\": {\n-                                \"description\": \"Access Token to authenticate requests\",\n-                                \"displayName\": \"Access Token\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"access-token\",\n-                                \"required\": true,\n-                                \"sensitive\": true\n-                            },\n-                            \"api-version\": {\n-                                \"defaultValue\": \"2022-10\",\n-                                \"description\": \"The Shopify REST API version\",\n-                                \"displayName\": \"API Version\",\n+                            \"record-reader\": {\n+                                \"description\": \"Specifies the Controller Service to use for parsing incoming data and determining the data's schema\",\n+                                \"displayName\": \"Record Reader\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"api-version\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"record-reader\",\n                                 \"required\": true,\n-                                \"sensitive\": false\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n                             },\n-                            \"incremental-delay\": {\n-                                \"defaultValue\": \"3 sec\",\n-                                \"dependencies\": [\n+                            \"ssl-client-auth\": {\n+                                \"allowableValues\": [\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"true\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Incremental Loading\",\n-                                        \"propertyName\": \"is-incremental\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"WANT\",\n+                                        \"value\": \"WANT\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"REQUIRED\",\n+                                        \"value\": \"REQUIRED\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"NONE\",\n+                                        \"value\": \"NONE\"\n                                     }\n                                 ],\n-                                \"description\": \"The ending timestamp of the time window will be adjusted earlier by the amount configured in this property. For example, with a property value of 10 seconds, an ending timestamp of 12:30:45 would be changed to 12:30:35. Set this property to avoid missing objects when the clock of your local machines and Shopify servers' clock are not in sync.\",\n-                                \"displayName\": \"Incremental Delay\",\n+                                \"defaultValue\": \"REQUIRED\",\n+                                \"description\": \"Client authentication policy when connecting to secure (TLS/SSL) cluster. Possible values are REQUIRED, WANT, NONE. This property is only used when an SSL Context has been defined and enabled.\",\n+                                \"displayName\": \"Client Auth\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"incremental-delay\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"ssl-client-auth\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"incremental-initial-start-time\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"true\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Incremental Loading\",\n-                                        \"propertyName\": \"is-incremental\"\n-                                    }\n-                                ],\n-                                \"description\": \"This property specifies the start time when running the first request. Represents an ISO 8601-encoded date and time string. For example, 3:50 pm on September 7, 2019 in the time zone of UTC (Coordinated Universal Time) is represented as \\\"2019-09-07T15:50:00Z\\\".\",\n-                                \"displayName\": \"Incremental Initial Start Time\",\n+                            \"ssl-context-service\": {\n+                                \"description\": \"The SSL Context Service used to provide client certificate information for TLS/SSL connections.\",\n+                                \"displayName\": \"SSL Context Service\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"incremental-initial-start-time\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"ssl-context-service\",\n                                 \"required\": false,\n-                                \"sensitive\": false\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n                             },\n-                            \"is-incremental\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"true\",\n-                                \"description\": \"The processor can incrementally load the queried objects so that each object is queried exactly once. For each query, the processor queries objects which were created or modified after the previous run time but before the current time.\",\n-                                \"displayName\": \"Incremental Loading\",\n+                            \"update-key-fields\": {\n+                                \"description\": \"Comma separated list of fields based on which to identify documents that need to be updated. If this property is set NiFi will attempt an upsert operation on all documents. If this property is not set all documents will be inserted.\",\n+                                \"displayName\": \"Update Key Fields\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"is-incremental\",\n-                                \"required\": true,\n+                                \"name\": \"update-key-fields\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"object-category\": {\n+                            \"update-mode\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Query a Customer resource\",\n-                                        \"displayName\": \"Customers\",\n-                                        \"value\": \"CUSTOMERS\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Query a Discount resource\",\n-                                        \"displayName\": \"Discounts\",\n-                                        \"value\": \"DISCOUNTS\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Query an Inventory resource\",\n-                                        \"displayName\": \"Inventory\",\n-                                        \"value\": \"INVENTORY\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Query an Online Store resource\",\n-                                        \"displayName\": \"Online Store\",\n-                                        \"value\": \"ONLINE_STORE\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Query an Order resource\",\n-                                        \"displayName\": \"Orders\",\n-                                        \"value\": \"ORDERS\"\n+                                        \"description\": \"Updates only the first document that matches the query.\",\n+                                        \"displayName\": \"Update One\",\n+                                        \"value\": \"one\"\n                                     },\n                                     {\n-                                        \"description\": \"Query a Product resource\",\n-                                        \"displayName\": \"Products\",\n-                                        \"value\": \"PRODUCT\"\n+                                        \"description\": \"Updates every document that matches the query.\",\n+                                        \"displayName\": \"Update Many\",\n+                                        \"value\": \"many\"\n                                     },\n                                     {\n-                                        \"description\": \"Query a Sales Channel resource\",\n-                                        \"displayName\": \"Sales Channels\",\n-                                        \"value\": \"SALES_CHANNELS\"\n-                                    },\n+                                        \"description\": \"Use the value of the 'mongodb.update.mode' attribute of the incoming flowfile. Acceptable values are 'one' and 'many'.\",\n+                                        \"displayName\": \"Use 'mongodb.update.mode' flowfile attribute.\",\n+                                        \"value\": \"flowfile-attribute\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"one\",\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"Query a Store Property resource\",\n-                                        \"displayName\": \"Store Properties\",\n-                                        \"value\": \"STORE_PROPERTIES\"\n+                                        \"propertyDisplayName\": \"Update Key Fields\",\n+                                        \"propertyName\": \"update-key-fields\"\n                                     }\n                                 ],\n-                                \"description\": \"Shopify object category\",\n-                                \"displayName\": \"Object Category\",\n+                                \"description\": \"Choose between updating a single document or multiple documents per incoming record.\",\n+                                \"displayName\": \"Update Mode\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"object-category\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"result-limit\": {\n-                                \"description\": \"The maximum number of results to request for each invocation of the Processor\",\n-                                \"displayName\": \"Result Limit\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"result-limit\",\n+                                \"name\": \"update-mode\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n-                            },\n-                            \"store-domain\": {\n-                                \"description\": \"The domain of the Shopify store, e.g. nifistore.myshopify.com\",\n-                                \"displayName\": \"Store Domain\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"store-domain\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"web-client-service-provider\": {\n-                                \"description\": \"Controller service for HTTP client operations\",\n-                                \"displayName\": \"Web Client Service Provider\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"web-client-service-provider\",\n-                                \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.web.client.provider.api.WebClientServiceProvider\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n                             }\n                         },\n+                        \"readsAttributes\": [\n+                            {\n+                                \"description\": \"Configurable parameter for controlling update mode on a per-flowfile basis. Acceptable values are 'one' and 'many' and controls whether a single incoming record should update a single or multiple Mongo documents.\",\n+                                \"name\": \"mongodb.update.mode\"\n+                            }\n+                        ],\n                         \"sideEffectFree\": false,\n-                        \"stateful\": {\n-                            \"description\": \"For a few resources the processor supports incremental loading. The list of the resources with the supported parameters can be found in the additional details.\",\n-                            \"scopes\": [\n-                                \"CLUSTER\"\n-                            ]\n-                        },\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"For FlowFiles created as a result of a successful query.\",\n+                                \"description\": \"All FlowFiles that are written to MongoDB are routed to this relationship\",\n                                 \"name\": \"success\"\n+                            },\n+                            {\n+                                \"description\": \"All FlowFiles that cannot be written to MongoDB are routed to this relationship\",\n+                                \"name\": \"failure\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n+                            \"CRON_DRIVEN\",\n+                            \"EVENT_DRIVEN\"\n                         ],\n                         \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": false,\n+                        \"supportsEventDriven\": true,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"shopify\"\n+                            \"insert\",\n+                            \"mongodb\",\n+                            \"put\",\n+                            \"record\",\n+                            \"update\",\n+                            \"upsert\"\n                         ],\n-                        \"triggerSerially\": true,\n+                        \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.shopify.GetShopify\",\n-                        \"typeDescription\": \"Retrieves objects from a custom Shopify store. The processor yield time must be set to the account's rate limit accordingly.\",\n-                        \"version\": \"1.27.0\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"Sets the MIME type to application/json\",\n-                                \"name\": \"mime.type\"\n-                            }\n-                        ]\n-                    }\n-                ],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"1.27.0\"\n-        },\n-        {\n-            \"artifact\": \"nifi-solr-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [],\n-                \"processors\": [\n+                        \"type\": \"org.apache.nifi.processors.mongodb.PutMongoRecord\",\n+                        \"typeDescription\": \"This processor is a record-aware processor for inserting/upserting data into MongoDB. It uses a configured record reader and schema to read an incoming record set from the body of a flowfile and then inserts/upserts batches of those records into a configured MongoDB collection. This processor does not support deletes. The number of documents to insert/upsert at a time is controlled by the \\\"Batch Size\\\" configuration property. This value should be set to a reasonable size to ensure that MongoDB is not overloaded with too many operations at once.\",\n+                        \"version\": \"1.27.0\"\n+                    },\n                     {\n                         \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-solr-nar\",\n+                        \"artifact\": \"nifi-mongodb-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n+                            \"EVENT_DRIVEN\": 0,\n                             \"TIMER_DRIVEN\": 1\n                         },\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"1 min\"\n+                            \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n-                        \"deprecated\": true,\n-                        \"deprecationReason\": \"The SOLR processors are deprecated and will be removed in NiFi 2.x.\",\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n+                        \"inputRequirement\": \"INPUT_ALLOWED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n                             \"Batch Size\": {\n                                 \"defaultValue\": \"100\",\n-                                \"description\": \"Number of rows per Solr query\",\n+                                \"description\": \"The number of elements returned from the server in one batch.\",\n                                 \"displayName\": \"Batch Size\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n                                 \"name\": \"Batch Size\",\n-                                \"required\": true,\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Collection\": {\n-                                \"description\": \"The Solr collection name, only used with a Solr Type of Cloud\",\n-                                \"displayName\": \"Collection\",\n+                            \"Mongo Collection Name\": {\n+                                \"description\": \"The name of the collection to use\",\n+                                \"displayName\": \"Mongo Collection Name\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Collection\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Date Field\": {\n-                                \"description\": \"The name of a date field in Solr used to filter results\",\n-                                \"displayName\": \"Date Field\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Date Field\",\n+                                \"name\": \"Mongo Collection Name\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Initial Date Filter\": {\n-                                \"description\": \"Date value to filter results. Documents with an earlier date will not be fetched. The format has to correspond to the date pattern of Solr 'YYYY-MM-DDThh:mm:ssZ'\",\n-                                \"displayName\": \"Initial Date Filter\",\n+                            \"Mongo Database Name\": {\n+                                \"description\": \"The name of the database to use\",\n+                                \"displayName\": \"Mongo Database Name\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Initial Date Filter\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Mongo Database Name\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Password\": {\n-                                \"description\": \"The password to use when Solr is configured with basic authentication.\",\n-                                \"displayName\": \"Basic Auth Password\",\n+                            \"Mongo URI\": {\n+                                \"description\": \"MongoURI, typically of the form: mongodb://host1[:port1][,host2[:port2],...]\",\n+                                \"displayName\": \"Mongo URI\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Password\",\n-                                \"required\": false,\n-                                \"sensitive\": true\n-                            },\n-                            \"Record Writer\": {\n-                                \"description\": \"The Record Writer to use in order to write Solr documents to FlowFiles. Must be set if \\\"Records\\\" is used as return type.\",\n-                                \"displayName\": \"Record Writer\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Record Writer\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            },\n-                            \"Return Fields\": {\n-                                \"description\": \"Comma-separated list of field names to return\",\n-                                \"displayName\": \"Return Fields\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Return Fields\",\n+                                \"name\": \"Mongo URI\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Return Type\": {\n+                            \"allow-disk-use\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"XML\",\n-                                        \"value\": \"XML\"\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"Records\",\n-                                        \"value\": \"Records\"\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"XML\",\n-                                \"description\": \"Write Solr documents to FlowFiles as XML or using a Record Writer\",\n-                                \"displayName\": \"Return Type\",\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"Set this to true to enable writing data to temporary files to prevent exceeding the maximum memory use limit during aggregation pipeline staged when handling large datasets.\",\n+                                \"displayName\": \"Allow Disk Use\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Return Type\",\n+                                \"name\": \"allow-disk-use\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"SSL Context Service\": {\n-                                \"description\": \"The Controller Service to use in order to obtain an SSL Context. This property must be set when communicating with a Solr over https.\",\n-                                \"displayName\": \"SSL Context Service\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"SSL Context Service\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            },\n-                            \"Solr Connection Timeout\": {\n-                                \"defaultValue\": \"10 seconds\",\n-                                \"description\": \"The amount of time to wait when establishing a connection to Solr. A value of 0 indicates an infinite timeout.\",\n-                                \"displayName\": \"Solr Connection Timeout\",\n+                            \"json-type\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"Use MongoDB's \\\"extended JSON\\\". This is the JSON generated with toJson() on a MongoDB Document from the Java driver\",\n+                                        \"displayName\": \"Extended JSON\",\n+                                        \"value\": \"Extended\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Generate a JSON document that conforms to typical JSON conventions instead of Mongo-specific conventions.\",\n+                                        \"displayName\": \"Standard JSON\",\n+                                        \"value\": \"Standard\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"Extended\",\n+                                \"description\": \"By default, MongoDB's Java driver returns \\\"extended JSON\\\". Some of the features of this variant of JSON may cause problems for other JSON parsers that expect only standard JSON types and conventions. This configuration setting  controls whether to use extended JSON or provide a clean view that conforms to standard JSON.\",\n+                                \"displayName\": \"JSON Type\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Solr Connection Timeout\",\n+                                \"name\": \"json-type\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Solr Location\": {\n-                                \"description\": \"The Solr url for a Solr Type of Standard (ex: http://localhost:8984/solr/gettingstarted), or the ZooKeeper hosts for a Solr Type of Cloud (ex: localhost:9983).\",\n-                                \"displayName\": \"Solr Location\",\n+                            \"mongo-agg-query\": {\n+                                \"description\": \"The aggregation query to be executed.\",\n+                                \"displayName\": \"Query\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Solr Location\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"mongo-agg-query\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Solr Maximum Connections\": {\n-                                \"defaultValue\": \"10\",\n-                                \"description\": \"The maximum number of total connections allowed from the Solr client to Solr.\",\n-                                \"displayName\": \"Solr Maximum Connections\",\n+                            \"mongo-charset\": {\n+                                \"defaultValue\": \"UTF-8\",\n+                                \"description\": \"Specifies the character set of the document data.\",\n+                                \"displayName\": \"Character Set\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Solr Maximum Connections\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"mongo-charset\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Solr Maximum Connections Per Host\": {\n-                                \"defaultValue\": \"5\",\n-                                \"description\": \"The maximum number of connections allowed from the Solr client to a single Solr host.\",\n-                                \"displayName\": \"Solr Maximum Connections Per Host\",\n+                            \"mongo-client-service\": {\n+                                \"description\": \"If configured, this property will use the assigned client service for connection pooling.\",\n+                                \"displayName\": \"Client Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Solr Maximum Connections Per Host\",\n-                                \"required\": true,\n+                                \"name\": \"mongo-client-service\",\n+                                \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-mongodb-client-service-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.mongodb.MongoDBClientService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"mongo-date-format\": {\n+                                \"defaultValue\": \"yyyy-MM-dd'T'HH:mm:ss'Z'\",\n+                                \"description\": \"The date format string to use for formatting Date fields that are returned from Mongo. It is only applied when the JSON output format is set to Standard JSON. Full documentation for format characters can be found here: https://docs.oracle.com/javase/8/docs/api/java/text/SimpleDateFormat.html\",\n+                                \"displayName\": \"Date Format\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"mongo-date-format\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Solr Query\": {\n-                                \"description\": \"A query to execute against Solr\",\n-                                \"displayName\": \"Solr Query\",\n+                            \"mongo-query-attribute\": {\n+                                \"description\": \"If set, the query will be written to a specified attribute on the output flowfiles.\",\n+                                \"displayName\": \"Query Output Attribute\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Solr Query\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"mongo-query-attribute\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Solr Socket Timeout\": {\n-                                \"defaultValue\": \"10 seconds\",\n-                                \"description\": \"The amount of time to wait for data on a socket connection to Solr. A value of 0 indicates an infinite timeout.\",\n-                                \"displayName\": \"Solr Socket Timeout\",\n+                            \"results-per-flowfile\": {\n+                                \"defaultValue\": \"1\",\n+                                \"description\": \"How many results to put into a flowfile at once. The whole body will be treated as a JSON array of results.\",\n+                                \"displayName\": \"Results Per FlowFile\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Solr Socket Timeout\",\n-                                \"required\": true,\n+                                \"name\": \"results-per-flowfile\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Solr Type\": {\n+                            \"ssl-client-auth\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"A SolrCloud instance.\",\n-                                        \"displayName\": \"Cloud\",\n-                                        \"value\": \"Cloud\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"WANT\",\n+                                        \"value\": \"WANT\"\n                                     },\n                                     {\n-                                        \"description\": \"A stand-alone Solr instance.\",\n-                                        \"displayName\": \"Standard\",\n-                                        \"value\": \"Standard\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"REQUIRED\",\n+                                        \"value\": \"REQUIRED\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"NONE\",\n+                                        \"value\": \"NONE\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"Standard\",\n-                                \"description\": \"The type of Solr instance, Cloud or Standard.\",\n-                                \"displayName\": \"Solr Type\",\n+                                \"defaultValue\": \"REQUIRED\",\n+                                \"description\": \"Client authentication policy when connecting to secure (TLS/SSL) cluster. Possible values are REQUIRED, WANT, NONE. This property is only used when an SSL Context has been defined and enabled.\",\n+                                \"displayName\": \"Client Auth\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Solr Type\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Username\": {\n-                                \"description\": \"The username to use when Solr is configured with basic authentication.\",\n-                                \"displayName\": \"Basic Auth Username\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Username\",\n+                                \"name\": \"ssl-client-auth\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"ZooKeeper Client Timeout\": {\n-                                \"defaultValue\": \"10 seconds\",\n-                                \"description\": \"The amount of time to wait for data on a connection to ZooKeeper, only used with a Solr Type of Cloud.\",\n-                                \"displayName\": \"ZooKeeper Client Timeout\",\n+                            \"ssl-context-service\": {\n+                                \"description\": \"The SSL Context Service used to provide client certificate information for TLS/SSL connections.\",\n+                                \"displayName\": \"SSL Context Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"ZooKeeper Client Timeout\",\n+                                \"name\": \"ssl-context-service\",\n+                                \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            }\n+                        },\n+                        \"sideEffectFree\": false,\n+                        \"supportedRelationships\": [\n+                            {\n+                                \"description\": \"The result set of the aggregation will be sent to this relationship.\",\n+                                \"name\": \"results\"\n+                            },\n+                            {\n+                                \"description\": \"The input flowfile gets sent to this relationship when the query fails.\",\n+                                \"name\": \"failure\"\n+                            },\n+                            {\n+                                \"description\": \"The input flowfile gets sent to this relationship when the query succeeds.\",\n+                                \"name\": \"original\"\n+                            }\n+                        ],\n+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\",\n+                            \"EVENT_DRIVEN\"\n+                        ],\n+                        \"supportsBatching\": false,\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicRelationships\": false,\n+                        \"supportsEventDriven\": true,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"aggregate\",\n+                            \"aggregation\",\n+                            \"mongo\"\n+                        ],\n+                        \"triggerSerially\": false,\n+                        \"triggerWhenAnyDestinationAvailable\": false,\n+                        \"triggerWhenEmpty\": false,\n+                        \"type\": \"org.apache.nifi.processors.mongodb.RunMongoAggregation\",\n+                        \"typeDescription\": \"A processor that runs an aggregation query whenever a flowfile is received.\",\n+                        \"version\": \"1.27.0\"\n+                    },\n+                    {\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-mongodb-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"e0c4461\"\n+                        },\n+                        \"defaultBulletinLevel\": \"WARN\",\n+                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": 1,\n+                            \"TIMER_DRIVEN\": 1\n+                        },\n+                        \"defaultPenaltyDuration\": \"30 sec\",\n+                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": \"* * * * * ?\",\n+                            \"TIMER_DRIVEN\": \"0 sec\"\n+                        },\n+                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n+                        \"defaultYieldDuration\": \"1 sec\",\n+                        \"group\": \"org.apache.nifi\",\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n+                        \"primaryNodeOnly\": false,\n+                        \"propertyDescriptors\": {\n+                            \"delete-gridfs-query\": {\n+                                \"description\": \"A valid MongoDB query to use to find and delete one or more files from GridFS.\",\n+                                \"displayName\": \"Query\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"delete-gridfs-query\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"ZooKeeper Connection Timeout\": {\n-                                \"defaultValue\": \"10 seconds\",\n-                                \"description\": \"The amount of time to wait when establishing a connection to ZooKeeper, only used with a Solr Type of Cloud.\",\n-                                \"displayName\": \"ZooKeeper Connection Timeout\",\n+                            \"gridfs-bucket-name\": {\n+                                \"description\": \"The GridFS bucket where the files will be stored. If left blank, it will use the default value 'fs' that the MongoDB client driver uses.\",\n+                                \"displayName\": \"Bucket Name\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"ZooKeeper Connection Timeout\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"gridfs-bucket-name\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"kerberos-credentials-service\": {\n-                                \"description\": \"Specifies the Kerberos Credentials Controller Service that should be used for authenticating with Kerberos\",\n-                                \"displayName\": \"Kerberos Credentials Service\",\n+                            \"gridfs-client-service\": {\n+                                \"description\": \"The MongoDB client service to use for database connections.\",\n+                                \"displayName\": \"Client Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"kerberos-credentials-service\",\n-                                \"required\": false,\n+                                \"name\": \"gridfs-client-service\",\n+                                \"required\": true,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"artifact\": \"nifi-mongodb-client-service-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.kerberos.KerberosCredentialsService\",\n+                                    \"type\": \"org.apache.nifi.mongodb.MongoDBClientService\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             },\n-                            \"kerberos-password\": {\n-                                \"description\": \"The password to use when specifying the principal and password directly in the processor for authenticating to Solr via Kerberos.\",\n-                                \"displayName\": \"Kerberos Password\",\n+                            \"gridfs-database-name\": {\n+                                \"description\": \"The name of the database to use\",\n+                                \"displayName\": \"Mongo Database Name\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"kerberos-password\",\n-                                \"required\": false,\n-                                \"sensitive\": true\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"gridfs-database-name\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n                             },\n-                            \"kerberos-principal\": {\n-                                \"description\": \"The principal to use when specifying the principal and password directly in the processor for authenticating to Solr via Kerberos.\",\n-                                \"displayName\": \"Kerberos Principal\",\n+                            \"gridfs-file-name\": {\n+                                \"description\": \"The name of the file in the bucket that is the target of this processor. GridFS file names do not include path information because GridFS does not sort files into folders within a bucket.\",\n+                                \"displayName\": \"File Name\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"kerberos-principal\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"gridfs-file-name\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"kerberos-user-service\": {\n-                                \"description\": \"Specifies the Kerberos User Controller Service that should be used for authenticating with Kerberos\",\n-                                \"displayName\": \"Kerberos User Service\",\n+                            \"mongo-query-attribute\": {\n+                                \"description\": \"If set, the query will be written to a specified attribute on the output flowfiles.\",\n+                                \"displayName\": \"Query Output Attribute\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"kerberos-user-service\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"mongo-query-attribute\",\n                                 \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.kerberos.KerberosUserService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n+                                \"sensitive\": false\n                             }\n                         },\n                         \"sideEffectFree\": false,\n-                        \"stateful\": {\n-                            \"description\": \"Stores latest date of Date Field so that the same data will not be fetched multiple times.\",\n-                            \"scopes\": [\n-                                \"CLUSTER\"\n-                            ]\n-                        },\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"The results of querying Solr\",\n+                                \"description\": \"When the operation succeeds, the flowfile is sent to this relationship.\",\n                                 \"name\": \"success\"\n+                            },\n+                            {\n+                                \"description\": \"When there is a failure processing the flowfile, it goes to this relationship.\",\n+                                \"name\": \"failure\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n                         \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"Apache\",\n-                            \"Get\",\n-                            \"Pull\",\n-                            \"Records\",\n-                            \"Solr\"\n+                            \"delete\",\n+                            \"gridfs\",\n+                            \"mongodb\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.solr.GetSolr\",\n-                        \"typeDescription\": \"Queries Solr and outputs the results as a FlowFile in the format of XML or using a Record Writer\",\n+                        \"type\": \"org.apache.nifi.processors.mongodb.gridfs.DeleteGridFS\",\n+                        \"typeDescription\": \"Deletes a file from GridFS using a file name or a query.\",\n                         \"version\": \"1.27.0\"\n                     },\n                     {\n                         \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-solr-nar\",\n+                        \"artifact\": \"nifi-mongodb-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -76595,1307 +74184,1364 @@\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n-                        \"deprecated\": true,\n-                        \"deprecationReason\": \"The SOLR processors are deprecated and will be removed in NiFi 2.x.\",\n-                        \"dynamicProperties\": [\n-                            {\n-                                \"description\": \"These parameters will be passed to Solr on the request\",\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"name\": \"A Solr request parameter name\",\n-                                \"value\": \"A Solr request parameter value\"\n-                            }\n-                        ],\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Collection\": {\n-                                \"description\": \"The Solr collection name, only used with a Solr Type of Cloud\",\n-                                \"displayName\": \"Collection\",\n+                            \"gridfs-bucket-name\": {\n+                                \"description\": \"The GridFS bucket where the files will be stored. If left blank, it will use the default value 'fs' that the MongoDB client driver uses.\",\n+                                \"displayName\": \"Bucket Name\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Collection\",\n+                                \"name\": \"gridfs-bucket-name\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Commit Within\": {\n-                                \"defaultValue\": \"5000\",\n-                                \"description\": \"The number of milliseconds before the given update is committed\",\n-                                \"displayName\": \"Commit Within\",\n+                            \"gridfs-client-service\": {\n+                                \"description\": \"The MongoDB client service to use for database connections.\",\n+                                \"displayName\": \"Client Service\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"gridfs-client-service\",\n+                                \"required\": true,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-mongodb-client-service-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.mongodb.MongoDBClientService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"gridfs-database-name\": {\n+                                \"description\": \"The name of the database to use\",\n+                                \"displayName\": \"Mongo Database Name\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Commit Within\",\n+                                \"name\": \"gridfs-database-name\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"gridfs-file-name\": {\n+                                \"description\": \"The name of the file in the bucket that is the target of this processor.\",\n+                                \"displayName\": \"File Name\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"gridfs-file-name\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Content Stream Path\": {\n-                                \"defaultValue\": \"/update/json/docs\",\n-                                \"description\": \"The path in Solr to post the ContentStream\",\n-                                \"displayName\": \"Content Stream Path\",\n+                            \"gridfs-query\": {\n+                                \"description\": \"A valid MongoDB query to use to fetch one or more files from GridFS.\",\n+                                \"displayName\": \"Query\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Content Stream Path\",\n+                                \"name\": \"gridfs-query\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"mongo-operation-mode\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"Fetch the entire query result and then make it available to downstream processors.\",\n+                                        \"displayName\": \"Full Query Fetch\",\n+                                        \"value\": \"all-at-once\"\n+                                    },\n+                                    {\n+                                        \"description\": \"As soon as the query start sending results to the downstream processors at regular intervals.\",\n+                                        \"displayName\": \"Stream Query Results\",\n+                                        \"value\": \"streaming\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"all-at-once\",\n+                                \"description\": \"This option controls when results are made available to downstream processors. If Stream Query Results is enabled, provenance will not be tracked relative to the input flowfile if an input flowfile is received and starts the query. In Stream Query Results mode errors will be handled by sending a new flowfile with the original content and attributes of the input flowfile to the failure relationship. Streaming should only be used if there is reliable connectivity between MongoDB and NiFi.\",\n+                                \"displayName\": \"Operation Mode\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"mongo-operation-mode\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Content-Type\": {\n-                                \"defaultValue\": \"application/json\",\n-                                \"description\": \"Content-Type being sent to Solr\",\n-                                \"displayName\": \"Content-Type\",\n+                            \"mongo-query-attribute\": {\n+                                \"description\": \"If set, the query will be written to a specified attribute on the output flowfiles.\",\n+                                \"displayName\": \"Query Output Attribute\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Content-Type\",\n-                                \"required\": true,\n+                                \"name\": \"mongo-query-attribute\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n+                            }\n+                        },\n+                        \"sideEffectFree\": false,\n+                        \"supportedRelationships\": [\n+                            {\n+                                \"description\": \"When the operation succeeds, the flowfile is sent to this relationship.\",\n+                                \"name\": \"success\"\n                             },\n-                            \"Password\": {\n-                                \"description\": \"The password to use when Solr is configured with basic authentication.\",\n-                                \"displayName\": \"Basic Auth Password\",\n+                            {\n+                                \"description\": \"When there is a failure processing the flowfile, it goes to this relationship.\",\n+                                \"name\": \"failure\"\n+                            },\n+                            {\n+                                \"description\": \"The original input flowfile goes to this relationship if the query does not cause an error\",\n+                                \"name\": \"original\"\n+                            }\n+                        ],\n+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\"\n+                        ],\n+                        \"supportsBatching\": false,\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicRelationships\": false,\n+                        \"supportsEventDriven\": false,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"fetch\",\n+                            \"gridfs\",\n+                            \"mongo\"\n+                        ],\n+                        \"triggerSerially\": false,\n+                        \"triggerWhenAnyDestinationAvailable\": false,\n+                        \"triggerWhenEmpty\": false,\n+                        \"type\": \"org.apache.nifi.processors.mongodb.gridfs.FetchGridFS\",\n+                        \"typeDescription\": \"Retrieves one or more files from a GridFS bucket by file name or by a user-defined query.\",\n+                        \"version\": \"1.27.0\",\n+                        \"writesAttributes\": [\n+                            {\n+                                \"description\": \"The custom metadata stored with a file is attached to this property if it exists.\",\n+                                \"name\": \"gridfs.file.metadata\"\n+                            }\n+                        ]\n+                    },\n+                    {\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-mongodb-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"e0c4461\"\n+                        },\n+                        \"defaultBulletinLevel\": \"WARN\",\n+                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": 1,\n+                            \"TIMER_DRIVEN\": 1\n+                        },\n+                        \"defaultPenaltyDuration\": \"30 sec\",\n+                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": \"* * * * * ?\",\n+                            \"TIMER_DRIVEN\": \"0 sec\"\n+                        },\n+                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n+                        \"defaultYieldDuration\": \"1 sec\",\n+                        \"group\": \"org.apache.nifi\",\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n+                        \"primaryNodeOnly\": false,\n+                        \"propertyDescriptors\": {\n+                            \"gridfs-bucket-name\": {\n+                                \"description\": \"The GridFS bucket where the files will be stored. If left blank, it will use the default value 'fs' that the MongoDB client driver uses.\",\n+                                \"displayName\": \"Bucket Name\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Password\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"gridfs-bucket-name\",\n                                 \"required\": false,\n-                                \"sensitive\": true\n+                                \"sensitive\": false\n                             },\n-                            \"SSL Context Service\": {\n-                                \"description\": \"The Controller Service to use in order to obtain an SSL Context. This property must be set when communicating with a Solr over https.\",\n-                                \"displayName\": \"SSL Context Service\",\n+                            \"gridfs-client-service\": {\n+                                \"description\": \"The MongoDB client service to use for database connections.\",\n+                                \"displayName\": \"Client Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"SSL Context Service\",\n-                                \"required\": false,\n+                                \"name\": \"gridfs-client-service\",\n+                                \"required\": true,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"artifact\": \"nifi-mongodb-client-service-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n+                                    \"type\": \"org.apache.nifi.mongodb.MongoDBClientService\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             },\n-                            \"Solr Connection Timeout\": {\n-                                \"defaultValue\": \"10 seconds\",\n-                                \"description\": \"The amount of time to wait when establishing a connection to Solr. A value of 0 indicates an infinite timeout.\",\n-                                \"displayName\": \"Solr Connection Timeout\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Solr Connection Timeout\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Solr Location\": {\n-                                \"description\": \"The Solr url for a Solr Type of Standard (ex: http://localhost:8984/solr/gettingstarted), or the ZooKeeper hosts for a Solr Type of Cloud (ex: localhost:9983).\",\n-                                \"displayName\": \"Solr Location\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Solr Location\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Solr Maximum Connections\": {\n-                                \"defaultValue\": \"10\",\n-                                \"description\": \"The maximum number of total connections allowed from the Solr client to Solr.\",\n-                                \"displayName\": \"Solr Maximum Connections\",\n+                            \"gridfs-database-name\": {\n+                                \"description\": \"The name of the database to use\",\n+                                \"displayName\": \"Mongo Database Name\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Solr Maximum Connections\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"gridfs-database-name\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Solr Maximum Connections Per Host\": {\n-                                \"defaultValue\": \"5\",\n-                                \"description\": \"The maximum number of connections allowed from the Solr client to a single Solr host.\",\n-                                \"displayName\": \"Solr Maximum Connections Per Host\",\n+                            \"gridfs-file-name\": {\n+                                \"description\": \"The name of the file in the bucket that is the target of this processor. GridFS file names do not include path information because GridFS does not sort files into folders within a bucket.\",\n+                                \"displayName\": \"File Name\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Solr Maximum Connections Per Host\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"gridfs-file-name\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Solr Socket Timeout\": {\n-                                \"defaultValue\": \"10 seconds\",\n-                                \"description\": \"The amount of time to wait for data on a socket connection to Solr. A value of 0 indicates an infinite timeout.\",\n-                                \"displayName\": \"Solr Socket Timeout\",\n+                            \"putgridfs-chunk-size\": {\n+                                \"defaultValue\": \"256 KB\",\n+                                \"description\": \"Controls the maximum size of each chunk of a file uploaded into GridFS.\",\n+                                \"displayName\": \"Chunk Size\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Solr Socket Timeout\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"putgridfs-chunk-size\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Solr Type\": {\n+                            \"putgridfs-enforce-uniqueness\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"A SolrCloud instance.\",\n-                                        \"displayName\": \"Cloud\",\n-                                        \"value\": \"Cloud\"\n+                                        \"description\": \"No uniqueness will be enforced.\",\n+                                        \"displayName\": \"None\",\n+                                        \"value\": \"none\"\n                                     },\n                                     {\n-                                        \"description\": \"A stand-alone Solr instance.\",\n-                                        \"displayName\": \"Standard\",\n-                                        \"value\": \"Standard\"\n+                                        \"description\": \"Both the filename and hash must be unique.\",\n+                                        \"displayName\": \"Both\",\n+                                        \"value\": \"both\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Only the filename must be unique.\",\n+                                        \"displayName\": \"Name\",\n+                                        \"value\": \"name\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Only the file hash must be unique.\",\n+                                        \"displayName\": \"Hash\",\n+                                        \"value\": \"hash\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"Standard\",\n-                                \"description\": \"The type of Solr instance, Cloud or Standard.\",\n-                                \"displayName\": \"Solr Type\",\n+                                \"defaultValue\": \"none\",\n+                                \"description\": \"When enabled, this option will ensure that uniqueness is enforced on the bucket. It will do so by creating a MongoDB index that matches your selection. It should ideally be configured once when the bucket is created for the first time because it could take a long time to build on an existing bucket wit a lot of data.\",\n+                                \"displayName\": \"Enforce Uniqueness\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Solr Type\",\n+                                \"name\": \"putgridfs-enforce-uniqueness\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Username\": {\n-                                \"description\": \"The username to use when Solr is configured with basic authentication.\",\n-                                \"displayName\": \"Basic Auth Username\",\n+                            \"putgridfs-hash-attribute\": {\n+                                \"defaultValue\": \"hash.value\",\n+                                \"description\": \"If uniquness enforcement is enabled and the file hash is part of the constraint, this must be set to an attribute that exists on all incoming flowfiles.\",\n+                                \"displayName\": \"Hash Attribute\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Username\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"ZooKeeper Client Timeout\": {\n-                                \"defaultValue\": \"10 seconds\",\n-                                \"description\": \"The amount of time to wait for data on a connection to ZooKeeper, only used with a Solr Type of Cloud.\",\n-                                \"displayName\": \"ZooKeeper Client Timeout\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"ZooKeeper Client Timeout\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"ZooKeeper Connection Timeout\": {\n-                                \"defaultValue\": \"10 seconds\",\n-                                \"description\": \"The amount of time to wait when establishing a connection to ZooKeeper, only used with a Solr Type of Cloud.\",\n-                                \"displayName\": \"ZooKeeper Connection Timeout\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"ZooKeeper Connection Timeout\",\n+                                \"name\": \"putgridfs-hash-attribute\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"kerberos-credentials-service\": {\n-                                \"description\": \"Specifies the Kerberos Credentials Controller Service that should be used for authenticating with Kerberos\",\n-                                \"displayName\": \"Kerberos Credentials Service\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"kerberos-credentials-service\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.kerberos.KerberosCredentialsService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            },\n-                            \"kerberos-password\": {\n-                                \"description\": \"The password to use when specifying the principal and password directly in the processor for authenticating to Solr via Kerberos.\",\n-                                \"displayName\": \"Kerberos Password\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"kerberos-password\",\n-                                \"required\": false,\n-                                \"sensitive\": true\n-                            },\n-                            \"kerberos-principal\": {\n-                                \"description\": \"The principal to use when specifying the principal and password directly in the processor for authenticating to Solr via Kerberos.\",\n-                                \"displayName\": \"Kerberos Principal\",\n+                            \"putgridfs-properties-prefix\": {\n+                                \"description\": \"Attributes that have this prefix will be added to the file stored in GridFS as metadata.\",\n+                                \"displayName\": \"File Properties Prefix\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"kerberos-principal\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"putgridfs-properties-prefix\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n-                            },\n-                            \"kerberos-user-service\": {\n-                                \"description\": \"Specifies the Kerberos User Controller Service that should be used for authenticating with Kerberos\",\n-                                \"displayName\": \"Kerberos User Service\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"kerberos-user-service\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.kerberos.KerberosUserService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n                             }\n                         },\n                         \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"The original FlowFile\",\n+                                \"description\": \"When the operation succeeds, the flowfile is sent to this relationship.\",\n                                 \"name\": \"success\"\n                             },\n                             {\n-                                \"description\": \"FlowFiles that failed for any reason other than Solr being unreachable\",\n-                                \"name\": \"failure\"\n+                                \"description\": \"Flowfiles that fail the duplicate check are sent to this relationship.\",\n+                                \"name\": \"duplicate\"\n                             },\n                             {\n-                                \"description\": \"FlowFiles that failed because Solr is unreachable\",\n-                                \"name\": \"connection_failure\"\n+                                \"description\": \"When there is a failure processing the flowfile, it goes to this relationship.\",\n+                                \"name\": \"failure\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n                         \"supportsBatching\": false,\n-                        \"supportsDynamicProperties\": true,\n+                        \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"Apache\",\n-                            \"Put\",\n-                            \"Send\",\n-                            \"Solr\"\n+                            \"file\",\n+                            \"gridfs\",\n+                            \"mongo\",\n+                            \"put\",\n+                            \"store\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.solr.PutSolrContentStream\",\n-                        \"typeDescription\": \"Sends the contents of a FlowFile as a ContentStream to Solr\",\n+                        \"type\": \"org.apache.nifi.processors.mongodb.gridfs.PutGridFS\",\n+                        \"typeDescription\": \"Writes a file to a GridFS bucket.\",\n                         \"version\": \"1.27.0\"\n-                    },\n+                    }\n+                ],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"1.27.0\"\n+        },\n+        {\n+            \"artifact\": \"nifi-pgp-service-api-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [],\n+                \"processors\": [],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"1.27.0\"\n+        },\n+        {\n+            \"artifact\": \"nifi-rethinkdb-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [],\n+                \"processors\": [\n                     {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-solr-nar\",\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-rethinkdb-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n+                            \"EVENT_DRIVEN\": 0,\n                             \"TIMER_DRIVEN\": 1\n                         },\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n                         \"deprecated\": true,\n-                        \"deprecationReason\": \"The SOLR processors are deprecated and will be removed in NiFi 2.x.\",\n-                        \"dynamicProperties\": [\n-                            {\n-                                \"description\": \"These parameters will be passed to Solr on the request\",\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"name\": \"A Solr request parameter name\",\n-                                \"value\": \"A Solr request parameter value\"\n-                            }\n-                        ],\n+                        \"deprecationReason\": \"RethinkDB 2.4 requires API changes that would alter the configuration and behavior of this Processor\",\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Batch Size\": {\n-                                \"defaultValue\": \"500\",\n-                                \"description\": \"The number of solr documents to index per batch\",\n-                                \"displayName\": \"Batch Size\",\n+                            \"rethinkdb-charset\": {\n+                                \"defaultValue\": \"UTF-8\",\n+                                \"description\": \"Specifies the character set of the document data.\",\n+                                \"displayName\": \"Character Set\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Batch Size\",\n-                                \"required\": false,\n+                                \"name\": \"rethinkdb-charset\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Collection\": {\n-                                \"description\": \"The Solr collection name, only used with a Solr Type of Cloud\",\n-                                \"displayName\": \"Collection\",\n+                            \"rethinkdb-dbname\": {\n+                                \"description\": \"RethinkDB database to connect to\",\n+                                \"displayName\": \"DB Name\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Collection\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"rethinkdb-dbname\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Commit Within\": {\n-                                \"defaultValue\": \"5000\",\n-                                \"description\": \"The number of milliseconds before the given update is committed\",\n-                                \"displayName\": \"Commit Within\",\n+                            \"rethinkdb-document-identifier\": {\n+                                \"description\": \"A FlowFile attribute, or attribute expression used for determining RethinkDB key for the Flow File content\",\n+                                \"displayName\": \"Document Identifier\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Commit Within\",\n-                                \"required\": false,\n+                                \"name\": \"rethinkdb-document-identifier\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Fields To Index\": {\n-                                \"description\": \"Comma-separated list of field names to write\",\n-                                \"displayName\": \"Fields To Index\",\n+                            \"rethinkdb-durability\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"Save change to disk before ack\",\n+                                        \"displayName\": \"Hard\",\n+                                        \"value\": \"hard\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Don't save changes to disk before ack\",\n+                                        \"displayName\": \"Soft\",\n+                                        \"value\": \"soft\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"hard\",\n+                                \"description\": \"Durability of documents being inserted\",\n+                                \"displayName\": \"Durablity of documents\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Fields To Index\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Password\": {\n-                                \"description\": \"The password to use when Solr is configured with basic authentication.\",\n-                                \"displayName\": \"Basic Auth Password\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Password\",\n-                                \"required\": false,\n-                                \"sensitive\": true\n-                            },\n-                            \"SSL Context Service\": {\n-                                \"description\": \"The Controller Service to use in order to obtain an SSL Context. This property must be set when communicating with a Solr over https.\",\n-                                \"displayName\": \"SSL Context Service\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"SSL Context Service\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            },\n-                            \"Solr Connection Timeout\": {\n-                                \"defaultValue\": \"10 seconds\",\n-                                \"description\": \"The amount of time to wait when establishing a connection to Solr. A value of 0 indicates an infinite timeout.\",\n-                                \"displayName\": \"Solr Connection Timeout\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Solr Connection Timeout\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Solr Location\": {\n-                                \"description\": \"The Solr url for a Solr Type of Standard (ex: http://localhost:8984/solr/gettingstarted), or the ZooKeeper hosts for a Solr Type of Cloud (ex: localhost:9983).\",\n-                                \"displayName\": \"Solr Location\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Solr Location\",\n+                                \"name\": \"rethinkdb-durability\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Solr Maximum Connections\": {\n-                                \"defaultValue\": \"10\",\n-                                \"description\": \"The maximum number of total connections allowed from the Solr client to Solr.\",\n-                                \"displayName\": \"Solr Maximum Connections\",\n+                            \"rethinkdb-host\": {\n+                                \"defaultValue\": \"localhost\",\n+                                \"description\": \"RethinkDB hostname\",\n+                                \"displayName\": \"Hostname\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Solr Maximum Connections\",\n+                                \"name\": \"rethinkdb-host\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Solr Maximum Connections Per Host\": {\n-                                \"defaultValue\": \"5\",\n-                                \"description\": \"The maximum number of connections allowed from the Solr client to a single Solr host.\",\n-                                \"displayName\": \"Solr Maximum Connections Per Host\",\n+                            \"rethinkdb-password\": {\n+                                \"description\": \"Password for user\",\n+                                \"displayName\": \"Password\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Solr Maximum Connections Per Host\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n+                                \"name\": \"rethinkdb-password\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n                             },\n-                            \"Solr Socket Timeout\": {\n-                                \"defaultValue\": \"10 seconds\",\n-                                \"description\": \"The amount of time to wait for data on a socket connection to Solr. A value of 0 indicates an infinite timeout.\",\n-                                \"displayName\": \"Solr Socket Timeout\",\n+                            \"rethinkdb-port\": {\n+                                \"defaultValue\": \"28015\",\n+                                \"description\": \"RethinkDB database port to connect to\",\n+                                \"displayName\": \"DB Port\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Solr Socket Timeout\",\n+                                \"name\": \"rethinkdb-port\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Solr Type\": {\n+                            \"rethinkdb-return-result\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"A SolrCloud instance.\",\n-                                        \"displayName\": \"Cloud\",\n-                                        \"value\": \"Cloud\"\n+                                        \"description\": \"Return changed document\",\n+                                        \"displayName\": \"True\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n-                                        \"description\": \"A stand-alone Solr instance.\",\n-                                        \"displayName\": \"Standard\",\n-                                        \"value\": \"Standard\"\n+                                        \"description\": \"Do not return changed document\",\n+                                        \"displayName\": \"False\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"Standard\",\n-                                \"description\": \"The type of Solr instance, Cloud or Standard.\",\n-                                \"displayName\": \"Solr Type\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Solr Type\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Solr Update Path\": {\n-                                \"defaultValue\": \"/update\",\n-                                \"description\": \"The path in Solr to post the Flowfile Records\",\n-                                \"displayName\": \"Solr Update Path\",\n+                                \"defaultValue\": \"true\",\n+                                \"description\": \"Return old value which were deleted\",\n+                                \"displayName\": \"Return deleted value\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Solr Update Path\",\n+                                \"name\": \"rethinkdb-return-result\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Username\": {\n-                                \"description\": \"The username to use when Solr is configured with basic authentication.\",\n-                                \"displayName\": \"Basic Auth Username\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Username\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"ZooKeeper Client Timeout\": {\n-                                \"defaultValue\": \"10 seconds\",\n-                                \"description\": \"The amount of time to wait for data on a connection to ZooKeeper, only used with a Solr Type of Cloud.\",\n-                                \"displayName\": \"ZooKeeper Client Timeout\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"ZooKeeper Client Timeout\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"ZooKeeper Connection Timeout\": {\n-                                \"defaultValue\": \"10 seconds\",\n-                                \"description\": \"The amount of time to wait when establishing a connection to ZooKeeper, only used with a Solr Type of Cloud.\",\n-                                \"displayName\": \"ZooKeeper Connection Timeout\",\n+                            \"rethinkdb-table\": {\n+                                \"description\": \"RethinkDB table to connect to\",\n+                                \"displayName\": \"Table name\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"ZooKeeper Connection Timeout\",\n-                                \"required\": false,\n+                                \"name\": \"rethinkdb-table\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"kerberos-credentials-service\": {\n-                                \"description\": \"Specifies the Kerberos Credentials Controller Service that should be used for authenticating with Kerberos\",\n-                                \"displayName\": \"Kerberos Credentials Service\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"kerberos-credentials-service\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.kerberos.KerberosCredentialsService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            },\n-                            \"kerberos-password\": {\n-                                \"description\": \"The password to use when specifying the principal and password directly in the processor for authenticating to Solr via Kerberos.\",\n-                                \"displayName\": \"Kerberos Password\",\n+                            \"rethinkdb-username\": {\n+                                \"description\": \"Username for accessing RethinkDB\",\n+                                \"displayName\": \"Username\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"kerberos-password\",\n-                                \"required\": false,\n-                                \"sensitive\": true\n-                            },\n-                            \"kerberos-principal\": {\n-                                \"description\": \"The principal to use when specifying the principal and password directly in the processor for authenticating to Solr via Kerberos.\",\n-                                \"displayName\": \"Kerberos Principal\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"kerberos-principal\",\n+                                \"name\": \"rethinkdb-username\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n-                            },\n-                            \"kerberos-user-service\": {\n-                                \"description\": \"Specifies the Kerberos User Controller Service that should be used for authenticating with Kerberos\",\n-                                \"displayName\": \"Kerberos User Service\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"kerberos-user-service\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.kerberos.KerberosUserService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            },\n-                            \"put-solr-record-record-reader\": {\n-                                \"description\": \"Specifies the Controller Service to use for parsing incoming data and determining the data's schema.\",\n-                                \"displayName\": \"Record Reader\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"put-solr-record-record-reader\",\n-                                \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n                             }\n                         },\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.processors.rethinkdb.GetRethinkDB\",\n+                            \"org.apache.nifi.processors.rethinkdb.PutRethinkDB\"\n+                        ],\n                         \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"The original FlowFile\",\n+                                \"description\": \"Sucessful FlowFiles are routed to this relationship\",\n                                 \"name\": \"success\"\n                             },\n                             {\n-                                \"description\": \"FlowFiles that failed for any reason other than Solr being unreachable\",\n-                                \"name\": \"failure\"\n+                                \"description\": \"Document not found are routed to this relationship\",\n+                                \"name\": \"not_found\"\n                             },\n                             {\n-                                \"description\": \"FlowFiles that failed because Solr is unreachable\",\n-                                \"name\": \"connection_failure\"\n+                                \"description\": \"Failed FlowFiles are routed to this relationship\",\n+                                \"name\": \"failure\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n+                            \"CRON_DRIVEN\",\n+                            \"EVENT_DRIVEN\"\n                         ],\n                         \"supportsBatching\": false,\n-                        \"supportsDynamicProperties\": true,\n+                        \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": false,\n+                        \"supportsEventDriven\": true,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"Apache\",\n-                            \"Put\",\n-                            \"Record\",\n-                            \"Send\",\n-                            \"Solr\"\n+                            \"delete\",\n+                            \"remove\",\n+                            \"rethinkdb\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.solr.PutSolrRecord\",\n-                        \"typeDescription\": \"Indexes the Records from a FlowFile into Solr\",\n-                        \"version\": \"1.27.0\"\n+                        \"type\": \"org.apache.nifi.processors.rethinkdb.DeleteRethinkDB\",\n+                        \"typeDescription\": \"Processor to remove a JSON document from RethinkDB (https://www.rethinkdb.com/) using the document id.\",\n+                        \"version\": \"1.27.0\",\n+                        \"writesAttributes\": [\n+                            {\n+                                \"description\": \"RethinkDB error message\",\n+                                \"name\": \"rethinkdb.error.message\"\n+                            },\n+                            {\n+                                \"description\": \"Error count while delete documents\",\n+                                \"name\": \"rethinkdb.delete.errors\"\n+                            },\n+                            {\n+                                \"description\": \"Number of documents deleted\",\n+                                \"name\": \"rethinkdb.delete.deleted\"\n+                            },\n+                            {\n+                                \"description\": \"Number of documents inserted\",\n+                                \"name\": \"rethinkdb.delete.inserted\"\n+                            },\n+                            {\n+                                \"description\": \"Number of documents replaced\",\n+                                \"name\": \"rethinkdb.delete.replaced\"\n+                            },\n+                            {\n+                                \"description\": \"Number of documents skipped\",\n+                                \"name\": \"rethinkdb.delete.skipped\"\n+                            },\n+                            {\n+                                \"description\": \"Number of documents unchanged since they already existed\",\n+                                \"name\": \"rethinkdb.delete.unchanged\"\n+                            }\n+                        ]\n                     },\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-solr-nar\",\n+                        \"artifact\": \"nifi-rethinkdb-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n+                            \"EVENT_DRIVEN\": 0,\n                             \"TIMER_DRIVEN\": 1\n                         },\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"1 min\"\n+                            \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n                         \"deprecated\": true,\n-                        \"deprecationReason\": \"The SOLR processors are deprecated and will be removed in NiFi 2.x.\",\n-                        \"dynamicProperties\": [\n-                            {\n-                                \"description\": \"These parameters will be passed to Solr on the request\",\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"name\": \"A Solr request parameter name\",\n-                                \"value\": \"A Solr request parameter value\"\n-                            }\n-                        ],\n+                        \"deprecationReason\": \"RethinkDB 2.4 requires API changes that would alter the configuration and behavior of this Processor\",\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_ALLOWED\",\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Collection\": {\n-                                \"description\": \"The Solr collection name, only used with a Solr Type of Cloud\",\n-                                \"displayName\": \"Collection\",\n+                            \"rethinkdb-charset\": {\n+                                \"defaultValue\": \"UTF-8\",\n+                                \"description\": \"Specifies the character set of the document data.\",\n+                                \"displayName\": \"Character Set\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Collection\",\n-                                \"required\": false,\n+                                \"name\": \"rethinkdb-charset\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Password\": {\n-                                \"description\": \"The password to use when Solr is configured with basic authentication.\",\n-                                \"displayName\": \"Basic Auth Password\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Password\",\n-                                \"required\": false,\n-                                \"sensitive\": true\n-                            },\n-                            \"Record Writer\": {\n-                                \"description\": \"The Record Writer to use in order to write Solr documents to FlowFiles. Must be set if \\\"Records\\\" is used as return type.\",\n-                                \"displayName\": \"Record Writer\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Record Writer\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            },\n-                            \"SSL Context Service\": {\n-                                \"description\": \"The Controller Service to use in order to obtain an SSL Context. This property must be set when communicating with a Solr over https.\",\n-                                \"displayName\": \"SSL Context Service\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"SSL Context Service\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            },\n-                            \"Solr Connection Timeout\": {\n-                                \"defaultValue\": \"10 seconds\",\n-                                \"description\": \"The amount of time to wait when establishing a connection to Solr. A value of 0 indicates an infinite timeout.\",\n-                                \"displayName\": \"Solr Connection Timeout\",\n+                            \"rethinkdb-dbname\": {\n+                                \"description\": \"RethinkDB database to connect to\",\n+                                \"displayName\": \"DB Name\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Solr Connection Timeout\",\n+                                \"name\": \"rethinkdb-dbname\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Solr Location\": {\n-                                \"description\": \"The Solr url for a Solr Type of Standard (ex: http://localhost:8984/solr/gettingstarted), or the ZooKeeper hosts for a Solr Type of Cloud (ex: localhost:9983).\",\n-                                \"displayName\": \"Solr Location\",\n+                            \"rethinkdb-document-identifier\": {\n+                                \"description\": \"A FlowFile attribute, or attribute expression used for determining RethinkDB key for the Flow File content\",\n+                                \"displayName\": \"Document Identifier\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Solr Location\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"rethinkdb-document-identifier\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Solr Maximum Connections\": {\n-                                \"defaultValue\": \"10\",\n-                                \"description\": \"The maximum number of total connections allowed from the Solr client to Solr.\",\n-                                \"displayName\": \"Solr Maximum Connections\",\n+                            \"rethinkdb-host\": {\n+                                \"defaultValue\": \"localhost\",\n+                                \"description\": \"RethinkDB hostname\",\n+                                \"displayName\": \"Hostname\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Solr Maximum Connections\",\n+                                \"name\": \"rethinkdb-host\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Solr Maximum Connections Per Host\": {\n-                                \"defaultValue\": \"5\",\n-                                \"description\": \"The maximum number of connections allowed from the Solr client to a single Solr host.\",\n-                                \"displayName\": \"Solr Maximum Connections Per Host\",\n+                            \"rethinkdb-max-document-size\": {\n+                                \"defaultValue\": \"1 MB\",\n+                                \"description\": \"Maximum size of documents allowed to be posted in one batch\",\n+                                \"displayName\": \"Max size of documents\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Solr Maximum Connections Per Host\",\n+                                \"name\": \"rethinkdb-max-document-size\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Solr Socket Timeout\": {\n-                                \"defaultValue\": \"10 seconds\",\n-                                \"description\": \"The amount of time to wait for data on a socket connection to Solr. A value of 0 indicates an infinite timeout.\",\n-                                \"displayName\": \"Solr Socket Timeout\",\n+                            \"rethinkdb-password\": {\n+                                \"description\": \"Password for user\",\n+                                \"displayName\": \"Password\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Solr Socket Timeout\",\n+                                \"name\": \"rethinkdb-password\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n+                            },\n+                            \"rethinkdb-port\": {\n+                                \"defaultValue\": \"28015\",\n+                                \"description\": \"RethinkDB database port to connect to\",\n+                                \"displayName\": \"DB Port\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"rethinkdb-port\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Solr Type\": {\n+                            \"rethinkdb-read-mode\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"A SolrCloud instance.\",\n-                                        \"displayName\": \"Cloud\",\n-                                        \"value\": \"Cloud\"\n+                                        \"description\": \"Read values from memory from primary replica (Default)\",\n+                                        \"displayName\": \"Single\",\n+                                        \"value\": \"single\"\n                                     },\n                                     {\n-                                        \"description\": \"A stand-alone Solr instance.\",\n-                                        \"displayName\": \"Standard\",\n-                                        \"value\": \"Standard\"\n+                                        \"description\": \"Read values committed to disk on majority of replicas\",\n+                                        \"displayName\": \"Majority\",\n+                                        \"value\": \"majority\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Read values from memory from an arbitrary replica \",\n+                                        \"displayName\": \"Outdated\",\n+                                        \"value\": \"outdated\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"Standard\",\n-                                \"description\": \"The type of Solr instance, Cloud or Standard.\",\n-                                \"displayName\": \"Solr Type\",\n+                                \"defaultValue\": \"single\",\n+                                \"description\": \"Read mode used for consistency\",\n+                                \"displayName\": \"Read Mode\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Solr Type\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"rethinkdb-read-mode\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Username\": {\n-                                \"description\": \"The username to use when Solr is configured with basic authentication.\",\n-                                \"displayName\": \"Basic Auth Username\",\n+                            \"rethinkdb-table\": {\n+                                \"description\": \"RethinkDB table to connect to\",\n+                                \"displayName\": \"Table name\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Username\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"rethinkdb-table\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"ZooKeeper Client Timeout\": {\n-                                \"defaultValue\": \"10 seconds\",\n-                                \"description\": \"The amount of time to wait for data on a connection to ZooKeeper, only used with a Solr Type of Cloud.\",\n-                                \"displayName\": \"ZooKeeper Client Timeout\",\n+                            \"rethinkdb-username\": {\n+                                \"description\": \"Username for accessing RethinkDB\",\n+                                \"displayName\": \"Username\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"ZooKeeper Client Timeout\",\n+                                \"name\": \"rethinkdb-username\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n+                            }\n+                        },\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.processors.rethinkdb.DeleteRethinkDB\",\n+                            \"org.apache.nifi.processors.rethinkdb.PutRethinkDB\"\n+                        ],\n+                        \"sideEffectFree\": false,\n+                        \"supportedRelationships\": [\n+                            {\n+                                \"description\": \"Sucessful FlowFiles are routed to this relationship\",\n+                                \"name\": \"success\"\n                             },\n-                            \"ZooKeeper Connection Timeout\": {\n-                                \"defaultValue\": \"10 seconds\",\n-                                \"description\": \"The amount of time to wait when establishing a connection to ZooKeeper, only used with a Solr Type of Cloud.\",\n-                                \"displayName\": \"ZooKeeper Connection Timeout\",\n+                            {\n+                                \"description\": \"Document not found are routed to this relationship\",\n+                                \"name\": \"not_found\"\n+                            },\n+                            {\n+                                \"description\": \"Failed FlowFiles are routed to this relationship\",\n+                                \"name\": \"failure\"\n+                            }\n+                        ],\n+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\",\n+                            \"EVENT_DRIVEN\"\n+                        ],\n+                        \"supportsBatching\": false,\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicRelationships\": false,\n+                        \"supportsEventDriven\": true,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"fetch\",\n+                            \"get\",\n+                            \"read\",\n+                            \"rethinkdb\"\n+                        ],\n+                        \"triggerSerially\": false,\n+                        \"triggerWhenAnyDestinationAvailable\": false,\n+                        \"triggerWhenEmpty\": false,\n+                        \"type\": \"org.apache.nifi.processors.rethinkdb.GetRethinkDB\",\n+                        \"typeDescription\": \"Processor to get a JSON document from RethinkDB (https://www.rethinkdb.com/) using the document id. The FlowFile will contain the retrieved document\",\n+                        \"version\": \"1.27.0\",\n+                        \"writesAttributes\": [\n+                            {\n+                                \"description\": \"RethinkDB error message\",\n+                                \"name\": \"rethinkdb.error.message\"\n+                            }\n+                        ]\n+                    },\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-rethinkdb-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"e0c4461\"\n+                        },\n+                        \"defaultBulletinLevel\": \"WARN\",\n+                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": 1,\n+                            \"EVENT_DRIVEN\": 0,\n+                            \"TIMER_DRIVEN\": 1\n+                        },\n+                        \"defaultPenaltyDuration\": \"30 sec\",\n+                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": \"* * * * * ?\",\n+                            \"TIMER_DRIVEN\": \"0 sec\"\n+                        },\n+                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n+                        \"defaultYieldDuration\": \"1 sec\",\n+                        \"deprecated\": true,\n+                        \"deprecationReason\": \"RethinkDB 2.4 requires API changes that would alter the configuration and behavior of this Processor\",\n+                        \"group\": \"org.apache.nifi\",\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n+                        \"primaryNodeOnly\": false,\n+                        \"propertyDescriptors\": {\n+                            \"rethinkdb-charset\": {\n+                                \"defaultValue\": \"UTF-8\",\n+                                \"description\": \"Specifies the character set of the document data.\",\n+                                \"displayName\": \"Character Set\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"ZooKeeper Connection Timeout\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"rethinkdb-charset\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"amount_documents_to_return\": {\n+                            \"rethinkdb-conflict-strategy\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Entire results\",\n-                                        \"value\": \"return_all_results\"\n+                                        \"description\": \"Update the document having same id with new values\",\n+                                        \"displayName\": \"Update\",\n+                                        \"value\": \"update\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Only top results\",\n-                                        \"value\": \"return_only_top_results\"\n+                                        \"description\": \"Replace the document with having same id new document\",\n+                                        \"displayName\": \"Replace\",\n+                                        \"value\": \"replace\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Return error if the document with same id exists\",\n+                                        \"displayName\": \"Error\",\n+                                        \"value\": \"error\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"return_only_top_results\",\n-                                \"description\": \"Total amount of Solr documents to be returned. If this property is set to \\\"Only top results\\\", only single requests will be sent to Solr and the results will be written into single FlowFiles. If it is set to \\\"Entire results\\\", all results matching to the query are retrieved via multiple Solr requests and returned in multiple FlowFiles. For both options, the number of Solr documents to be returned in a FlowFile depends on the configuration of the \\\"Rows\\\" property\",\n-                                \"displayName\": \"Total amount of returned results\",\n+                                \"defaultValue\": \"update\",\n+                                \"description\": \"Conflict strategy to be used in case of inserting existing document.\",\n+                                \"displayName\": \"Conflict strategy\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"amount_documents_to_return\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"rethinkdb-conflict-strategy\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"kerberos-credentials-service\": {\n-                                \"description\": \"Specifies the Kerberos Credentials Controller Service that should be used for authenticating with Kerberos\",\n-                                \"displayName\": \"Kerberos Credentials Service\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"kerberos-credentials-service\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.kerberos.KerberosCredentialsService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            },\n-                            \"kerberos-password\": {\n-                                \"description\": \"The password to use when specifying the principal and password directly in the processor for authenticating to Solr via Kerberos.\",\n-                                \"displayName\": \"Kerberos Password\",\n+                            \"rethinkdb-dbname\": {\n+                                \"description\": \"RethinkDB database to connect to\",\n+                                \"displayName\": \"DB Name\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"kerberos-password\",\n-                                \"required\": false,\n-                                \"sensitive\": true\n-                            },\n-                            \"kerberos-principal\": {\n-                                \"description\": \"The principal to use when specifying the principal and password directly in the processor for authenticating to Solr via Kerberos.\",\n-                                \"displayName\": \"Kerberos Principal\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"kerberos-principal\",\n-                                \"required\": false,\n+                                \"name\": \"rethinkdb-dbname\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"kerberos-user-service\": {\n-                                \"description\": \"Specifies the Kerberos User Controller Service that should be used for authenticating with Kerberos\",\n-                                \"displayName\": \"Kerberos User Service\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"kerberos-user-service\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.kerberos.KerberosUserService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            },\n-                            \"return_type\": {\n+                            \"rethinkdb-durability\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"XML\",\n-                                        \"value\": \"XML\"\n+                                        \"description\": \"Save change to disk before ack\",\n+                                        \"displayName\": \"Hard\",\n+                                        \"value\": \"hard\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Records\",\n-                                        \"value\": \"Records\"\n+                                        \"description\": \"Don't save changes to disk before ack\",\n+                                        \"displayName\": \"Soft\",\n+                                        \"value\": \"soft\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"XML\",\n-                                \"description\": \"Output format of Solr results. Write Solr documents to FlowFiles as XML or using a Record Writer\",\n-                                \"displayName\": \"Return Type\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"return_type\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"solr_param_field_list\": {\n-                                \"description\": \"Comma separated list of fields to be included into results, e. g. field1,field2\",\n-                                \"displayName\": \"Field List\",\n+                                \"defaultValue\": \"hard\",\n+                                \"description\": \"Durability of documents being inserted\",\n+                                \"displayName\": \"Durablity of documents\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"solr_param_field_list\",\n-                                \"required\": false,\n+                                \"name\": \"rethinkdb-durability\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"solr_param_query\": {\n-                                \"defaultValue\": \"*:*\",\n-                                \"description\": \"Solr Query, e. g. field:value\",\n-                                \"displayName\": \"Solr Query\",\n+                            \"rethinkdb-host\": {\n+                                \"defaultValue\": \"localhost\",\n+                                \"description\": \"RethinkDB hostname\",\n+                                \"displayName\": \"Hostname\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"solr_param_query\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"rethinkdb-host\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"solr_param_request_handler\": {\n-                                \"defaultValue\": \"/select\",\n-                                \"description\": \"Define a request handler here, e. g. /query\",\n-                                \"displayName\": \"Request Handler\",\n+                            \"rethinkdb-max-document-size\": {\n+                                \"defaultValue\": \"1 MB\",\n+                                \"description\": \"Maximum size of documents allowed to be posted in one batch\",\n+                                \"displayName\": \"Max size of documents\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"solr_param_request_handler\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"rethinkdb-max-document-size\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"solr_param_rows\": {\n-                                \"description\": \"Number of results to be returned for a single request\",\n-                                \"displayName\": \"Rows\",\n+                            \"rethinkdb-password\": {\n+                                \"description\": \"Password for user\",\n+                                \"displayName\": \"Password\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"solr_param_rows\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"rethinkdb-password\",\n                                 \"required\": false,\n+                                \"sensitive\": true\n+                            },\n+                            \"rethinkdb-port\": {\n+                                \"defaultValue\": \"28015\",\n+                                \"description\": \"RethinkDB database port to connect to\",\n+                                \"displayName\": \"DB Port\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"rethinkdb-port\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"solr_param_sort\": {\n-                                \"description\": \"Comma separated sort clauses to define the sorting of results, e. g. field1 asc, field2 desc\",\n-                                \"displayName\": \"Sorting of result list\",\n+                            \"rethinkdb-table\": {\n+                                \"description\": \"RethinkDB table to connect to\",\n+                                \"displayName\": \"Table name\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"solr_param_sort\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"rethinkdb-table\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"solr_param_start\": {\n-                                \"description\": \"Offset of result set\",\n-                                \"displayName\": \"Start of results\",\n+                            \"rethinkdb-username\": {\n+                                \"description\": \"Username for accessing RethinkDB\",\n+                                \"displayName\": \"Username\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"solr_param_start\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"rethinkdb-username\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             }\n                         },\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.processors.rethinkdb.DeleteRethinkDB\",\n+                            \"org.apache.nifi.processors.rethinkdb.GetRethinkDB\"\n+                        ],\n                         \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"Stats about Solr index\",\n-                                \"name\": \"stats\"\n-                            },\n-                            {\n-                                \"description\": \"Results of Solr queries\",\n-                                \"name\": \"results\"\n-                            },\n-                            {\n-                                \"description\": \"Results of faceted search\",\n-                                \"name\": \"facets\"\n+                                \"description\": \"Sucessful FlowFiles are routed to this relationship\",\n+                                \"name\": \"success\"\n                             },\n                             {\n-                                \"description\": \"Failure relationship\",\n+                                \"description\": \"Failed FlowFiles are routed to this relationship\",\n                                 \"name\": \"failure\"\n-                            },\n-                            {\n-                                \"description\": \"Original flowfile\",\n-                                \"name\": \"original\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n+                            \"CRON_DRIVEN\",\n+                            \"EVENT_DRIVEN\"\n                         ],\n-                        \"supportsBatching\": false,\n-                        \"supportsDynamicProperties\": true,\n+                        \"supportsBatching\": true,\n+                        \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": false,\n+                        \"supportsEventDriven\": true,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"Apache\",\n-                            \"Get\",\n-                            \"Query\",\n-                            \"Records\",\n-                            \"Solr\"\n+                            \"insert\",\n+                            \"put\",\n+                            \"rethinkdb\",\n+                            \"stream\",\n+                            \"update\",\n+                            \"write\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.solr.QuerySolr\",\n-                        \"typeDescription\": \"Queries Solr and outputs the results as a FlowFile in the format of XML or using a Record Writer\",\n+                        \"type\": \"org.apache.nifi.processors.rethinkdb.PutRethinkDB\",\n+                        \"typeDescription\": \"Processor to write the JSON content of a FlowFile to RethinkDB (https://www.rethinkdb.com/). The flow file should contain either JSON Object an array of JSON documents\",\n                         \"version\": \"1.27.0\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"Solr connect string\",\n-                                \"name\": \"solr.connect\"\n-                            },\n-                            {\n-                                \"description\": \"Solr collection\",\n-                                \"name\": \"solr.collection\"\n-                            },\n-                            {\n-                                \"description\": \"Query string sent to Solr\",\n-                                \"name\": \"solr.query\"\n+                                \"description\": \"RethinkDB error message\",\n+                                \"name\": \"rethinkdb.error.message\"\n                             },\n                             {\n-                                \"description\": \"Cursor mark can be used for scrolling Solr\",\n-                                \"name\": \"solr.cursor.mark\"\n+                                \"description\": \"Error count while inserting documents\",\n+                                \"name\": \"rethinkdb.insert.errors\"\n                             },\n                             {\n-                                \"description\": \"Status code of Solr request. A status code of 0 indicates that the request was successfully processed\",\n-                                \"name\": \"solr.status.code\"\n+                                \"description\": \"Number of documents deleted\",\n+                                \"name\": \"rethinkdb.insert.deleted\"\n                             },\n                             {\n-                                \"description\": \"The elapsed time to process the query (in ms)\",\n-                                \"name\": \"solr.query.time\"\n+                                \"description\": \"Keys generated on inserting documents\",\n+                                \"name\": \"rethinkdb.insert.generated_keys\"\n                             },\n                             {\n-                                \"description\": \"Solr start parameter (result offset) for the query\",\n-                                \"name\": \"solr.start\"\n+                                \"description\": \"Number of documents inserted\",\n+                                \"name\": \"rethinkdb.insert.inserted\"\n                             },\n                             {\n-                                \"description\": \"Number of Solr documents to be returned for the query\",\n-                                \"name\": \"solr.rows\"\n+                                \"description\": \"Number of documents replaced\",\n+                                \"name\": \"rethinkdb.insert.replaced\"\n                             },\n                             {\n-                                \"description\": \"Number of Solr documents that match the query\",\n-                                \"name\": \"solr.number.results\"\n+                                \"description\": \"Number of documents skipped because they already existed\",\n+                                \"name\": \"rethinkdb.insert.skipped\"\n                             },\n                             {\n-                                \"description\": \"The mime type of the data format\",\n-                                \"name\": \"mime.type\"\n+                                \"description\": \"Number of documents unchanged since they already existed\",\n+                                \"name\": \"rethinkdb.insert.unchanged\"\n                             },\n                             {\n-                                \"description\": \"The Java exception class raised when the processor fails\",\n-                                \"name\": \"querysolr.exeption.class\"\n+                                \"description\": \"First error while inserting documents\",\n+                                \"name\": \"rethinkdb.insert.first_error\"\n                             },\n                             {\n-                                \"description\": \"The Java exception message raised when the processor fails\",\n-                                \"name\": \"querysolr.exeption.message\"\n+                                \"description\": \"Warning message in case of large number of ids being returned on insertion\",\n+                                \"name\": \"rethinkdb.insert.warnings\"\n                             }\n                         ]\n                     }\n                 ],\n                 \"reportingTasks\": []\n             },\n             \"group\": \"org.apache.nifi\",\n             \"version\": \"1.27.0\"\n         },\n         {\n-            \"artifact\": \"nifi-jms-processors-nar\",\n+            \"artifact\": \"nifi-stateless-nar\",\n             \"componentManifest\": {\n-                \"controllerServices\": [\n+                \"controllerServices\": [],\n+                \"processors\": [],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"1.27.0\"\n+        },\n+        {\n+            \"artifact\": \"nifi-jolt-record-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [],\n+                \"processors\": [\n                     {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-jms-processors-nar\",\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-jolt-record-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n-                        \"dynamicProperties\": [\n-                            {\n-                                \"description\": \"The properties that are set following Java Beans convention where a property name is derived from the 'set*' method of the vendor specific ConnectionFactory's implementation. For example, 'com.ibm.mq.jms.MQConnectionFactory.setChannel(String)' would imply 'channel' property and 'com.ibm.mq.jms.MQConnectionFactory.setTransportType(int)' would imply 'transportType' property.\",\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"name\": \"The name of a Connection Factory configuration property.\",\n-                                \"value\": \"The value of a given Connection Factory configuration property.\"\n-                            }\n-                        ],\n-                        \"explicitRestrictions\": [\n-                            {\n-                                \"explanation\": \"Client Library Location can reference resources over HTTP\",\n-                                \"requiredPermission\": \"reference remote resources\"\n-                            }\n-                        ],\n+                        \"defaultBulletinLevel\": \"WARN\",\n+                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": 1,\n+                            \"EVENT_DRIVEN\": 0,\n+                            \"TIMER_DRIVEN\": 1\n+                        },\n+                        \"defaultPenaltyDuration\": \"30 sec\",\n+                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": \"* * * * * ?\",\n+                            \"TIMER_DRIVEN\": \"0 sec\"\n+                        },\n+                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n+                        \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n+                        \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"SSL Context Service\": {\n-                                \"description\": \"The SSL Context Service used to provide client certificate information for TLS/SSL connections.\",\n-                                \"displayName\": \"JMS SSL Context Service\",\n+                            \"jolt-record-custom-class\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"jolt-transform-custom\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Jolt Transformation DSL\",\n+                                        \"propertyName\": \"jolt-record-transform\"\n+                                    }\n+                                ],\n+                                \"description\": \"Fully Qualified Class Name for Custom Transformation\",\n+                                \"displayName\": \"Custom Transformation Class Name\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"jolt-record-custom-class\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"jolt-record-custom-modules\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"jolt-transform-custom\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Jolt Transformation DSL\",\n+                                        \"propertyName\": \"jolt-record-transform\"\n+                                    }\n+                                ],\n+                                \"description\": \"Comma-separated list of paths to files and/or directories which contain modules containing custom transformations (that are not included on NiFi's classpath).\",\n+                                \"displayName\": \"Custom Module Directory\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"jolt-record-custom-modules\",\n+                                \"required\": false,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"MULTIPLE\",\n+                                    \"resourceTypes\": [\n+                                        \"DIRECTORY\",\n+                                        \"FILE\"\n+                                    ]\n+                                },\n+                                \"sensitive\": false\n+                            },\n+                            \"jolt-record-record-reader\": {\n+                                \"description\": \"Specifies the Controller Service to use for parsing incoming data and determining the data's schema.\",\n+                                \"displayName\": \"Record Reader\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"SSL Context Service\",\n-                                \"required\": false,\n+                                \"name\": \"jolt-record-record-reader\",\n+                                \"required\": true,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n                                     \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n+                                    \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             },\n-                            \"broker\": {\n-                                \"description\": \"URI pointing to the network location of the JMS Message broker. Example for ActiveMQ: 'tcp://myhost:61616'. Examples for IBM MQ: 'myhost(1414)' and 'myhost01(1414),myhost02(1414)'.\",\n-                                \"displayName\": \"JMS Broker URI\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"broker\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"cf\": {\n-                                \"description\": \"The fully qualified name of the JMS ConnectionFactory implementation class (eg. org.apache.activemq.ActiveMQConnectionFactory).\",\n-                                \"displayName\": \"JMS Connection Factory Implementation Class\",\n+                            \"jolt-record-record-writer\": {\n+                                \"description\": \"Specifies the Controller Service to use for writing out the records\",\n+                                \"displayName\": \"Record Writer\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"cf\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"jolt-record-record-writer\",\n                                 \"required\": true,\n-                                \"sensitive\": false\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n                             },\n-                            \"cflib\": {\n-                                \"description\": \"Path to the directory with additional resources (eg. JARs, configuration files etc.) to be added to the classpath (defined as a comma separated list of values). Such resources typically represent target JMS client libraries for the ConnectionFactory implementation.\",\n-                                \"displayName\": \"JMS Client Libraries\",\n+                            \"jolt-record-spec\": {\n+                                \"description\": \"Jolt Specification for transform of record data. The value for this property may be the text of a JOLT specification or the path to a file containing a JOLT specification. This value is ignored if the Jolt Sort Transformation is selected.\",\n+                                \"displayName\": \"Jolt Specification\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"cflib\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"jolt-record-spec\",\n                                 \"required\": false,\n                                 \"resourceDefinition\": {\n-                                    \"cardinality\": \"MULTIPLE\",\n+                                    \"cardinality\": \"SINGLE\",\n                                     \"resourceTypes\": [\n                                         \"FILE\",\n-                                        \"DIRECTORY\",\n-                                        \"URL\"\n+                                        \"TEXT\"\n                                     ]\n                                 },\n                                 \"sensitive\": false\n+                            },\n+                            \"jolt-record-transform\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"Change the cardinality of input elements to create the output.\",\n+                                        \"displayName\": \"Cardinality\",\n+                                        \"value\": \"jolt-transform-card\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Execute list of Jolt transformations.\",\n+                                        \"displayName\": \"Chain\",\n+                                        \"value\": \"jolt-transform-chain\"\n+                                    },\n+                                    {\n+                                        \"description\": \" Apply default values to the output.\",\n+                                        \"displayName\": \"Default\",\n+                                        \"value\": \"jolt-transform-default\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Writes when field name is missing or value is null\",\n+                                        \"displayName\": \"Modify - Default\",\n+                                        \"value\": \"jolt-transform-modify-default\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Writes when key is missing\",\n+                                        \"displayName\": \"Modify - Define\",\n+                                        \"value\": \"jolt-transform-modify-define\"\n+                                    },\n+                                    {\n+                                        \"description\": \" Always overwrite value\",\n+                                        \"displayName\": \"Modify - Overwrite\",\n+                                        \"value\": \"jolt-transform-modify-overwrite\"\n+                                    },\n+                                    {\n+                                        \"description\": \" Remove values from input data to create the output.\",\n+                                        \"displayName\": \"Remove\",\n+                                        \"value\": \"jolt-transform-remove\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Shift input data to create the output.\",\n+                                        \"displayName\": \"Shift\",\n+                                        \"value\": \"jolt-transform-shift\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Sort input field name values alphabetically. Any specification set is ignored.\",\n+                                        \"displayName\": \"Sort\",\n+                                        \"value\": \"jolt-transform-sort\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Custom Transformation. Requires Custom Transformation Class Name\",\n+                                        \"displayName\": \"Custom\",\n+                                        \"value\": \"jolt-transform-custom\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"jolt-transform-chain\",\n+                                \"description\": \"Specifies the Jolt Transformation that should be used with the provided specification.\",\n+                                \"displayName\": \"Jolt Transformation DSL\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"jolt-record-transform\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"jolt-record-transform-cache-size\": {\n+                                \"defaultValue\": \"1\",\n+                                \"description\": \"Compiling a Jolt Transform can be fairly expensive. Ideally, this will be done only once. However, if the Expression Language is used in the transform, we may need a new Transform for each FlowFile. This value controls how many of those Transforms we cache in memory in order to avoid having to compile the Transform each time.\",\n+                                \"displayName\": \"Transform Cache Size\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"jolt-record-transform-cache-size\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n                             }\n                         },\n-                        \"providedApiImplementations\": [\n+                        \"sideEffectFree\": true,\n+                        \"supportedRelationships\": [\n                             {\n-                                \"artifact\": \"nifi-jms-cf-service-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.jms.cf.JMSConnectionFactoryProviderDefinition\",\n-                                \"version\": \"1.27.0\"\n+                                \"description\": \"The FlowFile with transformed content will be routed to this relationship\",\n+                                \"name\": \"success\"\n+                            },\n+                            {\n+                                \"description\": \"If a FlowFile fails processing for any reason (for example, the FlowFile records cannot be parsed), it will be routed to this relationship\",\n+                                \"name\": \"failure\"\n+                            },\n+                            {\n+                                \"description\": \"The original FlowFile that was transformed. If the FlowFile fails processing, nothing will be sent to this relationship\",\n+                                \"name\": \"original\"\n                             }\n                         ],\n-                        \"restricted\": true,\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.jms.processors.ConsumeJMS\",\n-                            \"org.apache.nifi.jms.processors.PublishJMS\"\n+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\",\n+                            \"EVENT_DRIVEN\"\n                         ],\n-                        \"supportsDynamicProperties\": true,\n+                        \"supportsBatching\": true,\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicRelationships\": false,\n+                        \"supportsEventDriven\": true,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"integration\",\n-                            \"jms\",\n-                            \"messaging\",\n-                            \"publish\",\n-                            \"queue\",\n-                            \"subscribe\",\n-                            \"topic\"\n+                            \"cardinality\",\n+                            \"chainr\",\n+                            \"defaultr\",\n+                            \"jolt\",\n+                            \"record\",\n+                            \"removr\",\n+                            \"shiftr\",\n+                            \"sort\",\n+                            \"transform\"\n                         ],\n-                        \"type\": \"org.apache.nifi.jms.cf.JMSConnectionFactoryProvider\",\n-                        \"typeDescription\": \"Provides a generic service to create vendor specific javax.jms.ConnectionFactory implementations. The Connection Factory can be served once this service is configured successfully.\",\n-                        \"version\": \"1.27.0\"\n-                    },\n+                        \"triggerSerially\": false,\n+                        \"triggerWhenAnyDestinationAvailable\": false,\n+                        \"triggerWhenEmpty\": false,\n+                        \"type\": \"org.apache.nifi.processors.jolt.record.JoltTransformRecord\",\n+                        \"typeDescription\": \"Applies a JOLT specification to each record in the FlowFile payload. A new FlowFile is created with transformed content and is routed to the 'success' relationship. If the transform fails, the original FlowFile is routed to the 'failure' relationship.\",\n+                        \"version\": \"1.27.0\",\n+                        \"writesAttributes\": [\n+                            {\n+                                \"description\": \"The number of records in an outgoing FlowFile\",\n+                                \"name\": \"record.count\"\n+                            },\n+                            {\n+                                \"description\": \"The MIME Type that the configured Record Writer indicates is appropriate\",\n+                                \"name\": \"mime.type\"\n+                            }\n+                        ]\n+                    }\n+                ],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"1.27.0\"\n+        },\n+        {\n+            \"artifact\": \"nifi-db-schema-registry-service-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [\n                     {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-jms-processors-nar\",\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-db-schema-registry-service-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n-                        \"dynamicProperties\": [\n-                            {\n-                                \"description\": \"In order to perform a JNDI Lookup, an Initial Context must be established. When this is done, an Environment can be established for the context. Any dynamic/user-defined property that is added to this Controller Service will be added as an Environment configuration/variable to this Context.\",\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"name\": \"The name of a JNDI Initial Context environment variable.\",\n-                                \"value\": \"The value of the JNDI Initial Context environment variable.\"\n-                            }\n-                        ],\n                         \"group\": \"org.apache.nifi\",\n                         \"propertyDescriptors\": {\n-                            \"connection.factory.name\": {\n-                                \"description\": \"The name of the JNDI Object to lookup for the Connection Factory.\",\n-                                \"displayName\": \"JNDI Name of the Connection Factory\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"connection.factory.name\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"java.naming.factory.initial\": {\n-                                \"description\": \"The fully qualified class name of the JNDI Initial Context Factory Class (java.naming.factory.initial).\",\n-                                \"displayName\": \"JNDI Initial Context Factory Class\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"java.naming.factory.initial\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"java.naming.provider.url\": {\n-                                \"description\": \"The URL of the JNDI Provider to use as the value for java.naming.provider.url. See additional details documentation for allowed URL schemes.\",\n-                                \"displayName\": \"JNDI Provider URL\",\n+                            \"Catalog Name\": {\n+                                \"description\": \"The name of the catalog used to locate the desired table. This may not apply for the database that you are querying. In this case, leave the field empty. Note that if the property is set and the database is case-sensitive, the catalog name must match the database's catalog name exactly.\",\n+                                \"displayName\": \"Catalog Name\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"java.naming.provider.url\",\n-                                \"required\": true,\n+                                \"name\": \"Catalog Name\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"java.naming.security.credentials\": {\n-                                \"description\": \"The Credentials to use when authenticating with JNDI (java.naming.security.credentials).\",\n-                                \"displayName\": \"JNDI Credentials\",\n+                            \"Database Connection Pooling Service\": {\n+                                \"description\": \"The Controller Service that is used to obtain a connection to the database for retrieving table information.\",\n+                                \"displayName\": \"Database Connection Pooling Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"java.naming.security.credentials\",\n-                                \"required\": false,\n-                                \"sensitive\": true\n-                            },\n-                            \"java.naming.security.principal\": {\n-                                \"description\": \"The Principal to use when authenticating with JNDI (java.naming.security.principal).\",\n-                                \"displayName\": \"JNDI Principal\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"java.naming.security.principal\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n+                                \"name\": \"Database Connection Pooling Service\",\n+                                \"required\": true,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.dbcp.DBCPService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n                             },\n-                            \"naming.factory.libraries\": {\n-                                \"description\": \"Specifies jar files and/or directories to add to the ClassPath in order to load the JNDI / JMS client libraries. This should be a comma-separated list of files, directories, and/or URLs. If a directory is given, any files in that directory will be included, but subdirectories will not be included (i.e., it is not recursive).\",\n-                                \"displayName\": \"JNDI / JMS Client Libraries\",\n+                            \"Schema Name\": {\n+                                \"description\": \"The name of the schema that the table belongs to. This may not apply for the database that you are updating. In this case, leave the field empty. Note that if the property is set and the database is case-sensitive, the schema name must match the database's schema name exactly. Also notice that if the same table name exists in multiple schemas and Schema Name is not specified, the service will find those tables and give an error if the different tables have the same column name(s).\",\n+                                \"displayName\": \"Schema Name\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"naming.factory.libraries\",\n+                                \"name\": \"Schema Name\",\n                                 \"required\": false,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"MULTIPLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\",\n-                                        \"DIRECTORY\",\n-                                        \"URL\"\n-                                    ]\n-                                },\n                                 \"sensitive\": false\n                             }\n                         },\n                         \"providedApiImplementations\": [\n                             {\n-                                \"artifact\": \"nifi-jms-cf-service-nar\",\n+                                \"artifact\": \"nifi-standard-services-api-nar\",\n                                 \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.jms.cf.JMSConnectionFactoryProviderDefinition\",\n+                                \"type\": \"org.apache.nifi.schemaregistry.services.SchemaRegistry\",\n                                 \"version\": \"1.27.0\"\n                             }\n                         ],\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.jms.cf.JMSConnectionFactoryProvider\",\n-                            \"org.apache.nifi.jms.processors.ConsumeJMS\",\n-                            \"org.apache.nifi.jms.processors.PublishJMS\"\n-                        ],\n-                        \"supportsDynamicProperties\": true,\n+                        \"supportsDynamicProperties\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"integration\",\n-                            \"jms\",\n-                            \"jndi\",\n-                            \"messaging\",\n-                            \"publish\",\n-                            \"queue\",\n-                            \"subscribe\",\n-                            \"topic\"\n+                            \"database\",\n+                            \"registry\",\n+                            \"schema\",\n+                            \"table\"\n                         ],\n-                        \"type\": \"org.apache.nifi.jms.cf.JndiJmsConnectionFactoryProvider\",\n-                        \"typeDescription\": \"Provides a service to lookup an existing JMS ConnectionFactory using the Java Naming and Directory Interface (JNDI).\",\n+                        \"type\": \"org.apache.nifi.db.schemaregistry.DatabaseTableSchemaRegistry\",\n+                        \"typeDescription\": \"Provides a service for generating a record schema from a database table definition. The service is configured to use a table name and a database connection fetches the table metadata (i.e. table definition) such as column names, data types, nullability, etc.\",\n                         \"version\": \"1.27.0\"\n                     }\n                 ],\n+                \"processors\": [],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"1.27.0\"\n+        },\n+        {\n+            \"artifact\": \"nifi-social-media-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [],\n                 \"processors\": [\n                     {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-jms-processors-nar\",\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-social-media-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -77903,535 +75549,254 @@\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n-                        \"dynamicProperties\": [\n-                            {\n-                                \"description\": \"Additional configuration property for the Connection Factory. It can be used when the Connection Factory is being configured via the 'JNDI *' or the 'JMS *'properties of the processor. For more information, see the Additional Details page.\",\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"name\": \"The name of a Connection Factory configuration property.\",\n-                                \"value\": \"The value of a given Connection Factory configuration property.\"\n-                            }\n-                        ],\n-                        \"explicitRestrictions\": [\n-                            {\n-                                \"explanation\": \"Client Library Location can reference resources over HTTP\",\n-                                \"requiredPermission\": \"reference remote resources\"\n-                            }\n-                        ],\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_FORBIDDEN\",\n-                        \"primaryNodeOnly\": false,\n+                        \"primaryNodeOnly\": true,\n                         \"propertyDescriptors\": {\n-                            \"Acknowledgement Mode\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"Automatically acknowledges a client's receipt of a message, regardless if NiFi session has been commited. Can result in data loss in the event where NiFi abruptly stopped before session was commited.\",\n-                                        \"displayName\": \"AUTO_ACKNOWLEDGE (1)\",\n-                                        \"value\": \"1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"(DEFAULT) Manually acknowledges a client's receipt of a message after NiFi Session was commited, thus ensuring no data loss\",\n-                                        \"displayName\": \"CLIENT_ACKNOWLEDGE (2)\",\n-                                        \"value\": \"2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"This acknowledgment mode instructs the session to lazily acknowledge the delivery of messages. May result in both data duplication and data loss while achieving the best throughput.\",\n-                                        \"displayName\": \"DUPS_OK_ACKNOWLEDGE (3)\",\n-                                        \"value\": \"3\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"2\",\n-                                \"description\": \"The JMS Acknowledgement Mode. Using Auto Acknowledge can cause messages to be lost on restart of NiFi but may provide better performance than Client Acknowledge.\",\n-                                \"displayName\": \"Acknowledgement Mode\",\n+                            \"backfill-minutes\": {\n+                                \"defaultValue\": \"0\",\n+                                \"description\": \"The number of minutes (up to 5 minutes) of streaming data to be requested after a disconnect. Only available for project with academic research access. See https://developer.twitter.com/en/docs/twitter-api/tweets/filtered-stream/integrate/recovery-and-redundancy-features\",\n+                                \"displayName\": \"Backfill Minutes\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Acknowledgement Mode\",\n+                                \"name\": \"backfill-minutes\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Connection Client ID\": {\n-                                \"description\": \"The client id to be set on the connection, if set. For durable non shared consumer this is mandatory, for all others it is optional, typically with shared consumers it is undesirable to be set. Please see JMS spec for further details\",\n-                                \"displayName\": \"Connection Client ID\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Connection Client ID\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Connection Factory Service\": {\n-                                \"description\": \"The Controller Service that is used to obtain Connection Factory. Alternatively, the 'JNDI *' or the 'JMS *' properties can also be be used to configure the Connection Factory.\",\n-                                \"displayName\": \"Connection Factory Service\",\n+                            \"backoff-attempts\": {\n+                                \"defaultValue\": \"5\",\n+                                \"description\": \"The number of reconnection tries the processor will attempt in the event of a disconnection of the stream for any reason, before throwing an exception. To start a stream after this exception occur and the connection is fixed, please stop and restart the processor. If the valueof this property is 0, then backoff will never occur and the processor will always need to be restartedif the stream fails.\",\n+                                \"displayName\": \"Backoff Attempts\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Connection Factory Service\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-jms-cf-service-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.jms.cf.JMSConnectionFactoryProviderDefinition\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            },\n-                            \"Destination Name\": {\n-                                \"description\": \"The name of the JMS Destination. Usually provided by the administrator (e.g., 'topic://myTopic' or 'myTopic').\",\n-                                \"displayName\": \"Destination Name\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Destination Name\",\n+                                \"name\": \"backoff-attempts\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Destination Type\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"QUEUE\",\n-                                        \"value\": \"QUEUE\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"TOPIC\",\n-                                        \"value\": \"TOPIC\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"QUEUE\",\n-                                \"description\": \"The type of the JMS Destination. Could be one of 'QUEUE' or 'TOPIC'. Usually provided by the administrator. Defaults to 'QUEUE'\",\n-                                \"displayName\": \"Destination Type\",\n+                            \"backoff-time\": {\n+                                \"defaultValue\": \"1 mins\",\n+                                \"description\": \"The duration to backoff before requesting a new stream ifthe current one fails for any reason. Will increase by factor of 2 every time a restart fails\",\n+                                \"displayName\": \"Backoff Time\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Destination Type\",\n+                                \"name\": \"backoff-time\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Durable subscription\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"If destination is Topic if present then make it the consumer durable. @see https://docs.oracle.com/javaee/7/api/javax/jms/Session.html#createDurableConsumer-javax.jms.Topic-java.lang.String-\",\n-                                \"displayName\": \"Durable Subscription\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Durable subscription\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Error Queue Name\": {\n-                                \"description\": \"The name of a JMS Queue where - if set - unprocessed messages will be routed. Usually provided by the administrator (e.g., 'queue://myErrorQueue' or 'myErrorQueue').Only applicable if 'Destination Type' is set to 'QUEUE'\",\n-                                \"displayName\": \"Error Queue Name\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Error Queue Name\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Message Selector\": {\n-                                \"description\": \"The JMS Message Selector to filter the messages that the processor will receive\",\n-                                \"displayName\": \"Message Selector\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Message Selector\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Password\": {\n-                                \"description\": \"Password used for authentication and authorization.\",\n-                                \"displayName\": \"Password\",\n+                            \"base-path\": {\n+                                \"defaultValue\": \"https://api.twitter.com\",\n+                                \"description\": \"The base path that the processor will use for making HTTP requests. The default value should be sufficient for most use cases.\",\n+                                \"displayName\": \"Base Path\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Password\",\n-                                \"required\": false,\n-                                \"sensitive\": true\n+                                \"name\": \"base-path\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n                             },\n-                            \"SSL Context Service\": {\n-                                \"description\": \"The SSL Context Service used to provide client certificate information for TLS/SSL connections.\",\n-                                \"displayName\": \"JMS SSL Context Service\",\n+                            \"batch-size\": {\n+                                \"defaultValue\": \"1000\",\n+                                \"description\": \"The maximum size of the number of Tweets to be written to a single FlowFile. Will write fewer Tweets based on the number available in the queue at the time of processor invocation.\",\n+                                \"displayName\": \"Batch Size\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"SSL Context Service\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n+                                \"name\": \"batch-size\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n                             },\n-                            \"Session Cache size\": {\n-                                \"defaultValue\": \"1\",\n-                                \"description\": \"This property is deprecated and no longer has any effect on the Processor. It will be removed in a later version.\",\n-                                \"displayName\": \"Session Cache Size\",\n+                            \"bearer-token\": {\n+                                \"description\": \"The Bearer Token provided by Twitter.\",\n+                                \"displayName\": \"Bearer Token\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Session Cache size\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Shared subscription\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"If destination is Topic if present then make it the consumer shared. @see https://docs.oracle.com/javaee/7/api/javax/jms/Session.html#createSharedConsumer-javax.jms.Topic-java.lang.String-\",\n-                                \"displayName\": \"Shared Subscription\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Shared subscription\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Subscription Name\": {\n-                                \"description\": \"The name of the subscription to use if destination is Topic and is shared or durable.\",\n-                                \"displayName\": \"Subscription Name\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Subscription Name\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Timeout\": {\n-                                \"defaultValue\": \"1 sec\",\n-                                \"description\": \"How long to wait to consume a message from the remote broker before giving up.\",\n-                                \"displayName\": \"Timeout\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Timeout\",\n+                                \"name\": \"bearer-token\",\n                                 \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"User Name\": {\n-                                \"description\": \"User Name used for authentication and authorization.\",\n-                                \"displayName\": \"User Name\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"User Name\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"broker\": {\n-                                \"description\": \"URI pointing to the network location of the JMS Message broker. Example for ActiveMQ: 'tcp://myhost:61616'. Examples for IBM MQ: 'myhost(1414)' and 'myhost01(1414),myhost02(1414)'.\",\n-                                \"displayName\": \"JMS Broker URI\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"broker\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"cf\": {\n-                                \"description\": \"The fully qualified name of the JMS ConnectionFactory implementation class (eg. org.apache.activemq.ActiveMQConnectionFactory).\",\n-                                \"displayName\": \"JMS Connection Factory Implementation Class\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"cf\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"cflib\": {\n-                                \"description\": \"Path to the directory with additional resources (eg. JARs, configuration files etc.) to be added to the classpath (defined as a comma separated list of values). Such resources typically represent target JMS client libraries for the ConnectionFactory implementation.\",\n-                                \"displayName\": \"JMS Client Libraries\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"cflib\",\n-                                \"required\": false,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"MULTIPLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\",\n-                                        \"DIRECTORY\",\n-                                        \"URL\"\n-                                    ]\n-                                },\n-                                \"sensitive\": false\n+                                \"sensitive\": true\n                             },\n-                            \"character-set\": {\n-                                \"defaultValue\": \"UTF-8\",\n-                                \"description\": \"The name of the character set to use to construct or interpret TextMessages\",\n-                                \"displayName\": \"Character Set\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"character-set\",\n+                            \"connect-timeout\": {\n+                                \"defaultValue\": \"10 secs\",\n+                                \"description\": \"The maximum time in which client should establish a connection with the Twitter API before a time out. Setting the value to 0 disables connection timeouts.\",\n+                                \"displayName\": \"Connect Timeout\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"connect-timeout\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"connection.factory.name\": {\n-                                \"description\": \"The name of the JNDI Object to lookup for the Connection Factory.\",\n-                                \"displayName\": \"JNDI Name of the Connection Factory\",\n+                            \"expansions\": {\n+                                \"description\": \"A comma-separated list of expansions for objects in the returned tweet. See https://developer.twitter.com/en/docs/twitter-api/expansions for proper usage. Possible field values include: author_id, referenced_tweets.id, referenced_tweets.id.author_id, entities.mentions.username, attachments.poll_ids, attachments.media_keys ,in_reply_to_user_id, geo.place_id\",\n+                                \"displayName\": \"Expansions\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"connection.factory.name\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"expansions\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"java.naming.factory.initial\": {\n-                                \"description\": \"The fully qualified class name of the JNDI Initial Context Factory Class (java.naming.factory.initial).\",\n-                                \"displayName\": \"JNDI Initial Context Factory Class\",\n+                            \"maximum-backoff-time\": {\n+                                \"defaultValue\": \"5 mins\",\n+                                \"description\": \"The maximum duration to backoff to start attempting a new stream.It is recommended that this number be much higher than the 'Backoff Time' property\",\n+                                \"displayName\": \"Maximum Backoff Time\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"java.naming.factory.initial\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"maximum-backoff-time\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"java.naming.provider.url\": {\n-                                \"description\": \"The URL of the JNDI Provider to use as the value for java.naming.provider.url. See additional details documentation for allowed URL schemes.\",\n-                                \"displayName\": \"JNDI Provider URL\",\n+                            \"media-fields\": {\n+                                \"description\": \"A comma-separated list of media fields to be returned as part of the tweet. Refer to https://developer.twitter.com/en/docs/twitter-api/data-dictionary/object-model/media for proper usage. Possible field values include: alt_text, duration_ms, height, media_key, non_public_metrics, organic_metrics, preview_image_url, promoted_metrics, public_metrics, type, url, width\",\n+                                \"displayName\": \"Media Fields\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"java.naming.provider.url\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"media-fields\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"java.naming.security.credentials\": {\n-                                \"description\": \"The Credentials to use when authenticating with JNDI (java.naming.security.credentials).\",\n-                                \"displayName\": \"JNDI Credentials\",\n+                            \"place-fields\": {\n+                                \"description\": \"A comma-separated list of place fields to be returned as part of the tweet. Refer to https://developer.twitter.com/en/docs/twitter-api/data-dictionary/object-model/place for proper usage. Possible field values include: contained_within, country, country_code, full_name, geo, id, name, place_type\",\n+                                \"displayName\": \"Place Fields\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"java.naming.security.credentials\",\n+                                \"name\": \"place-fields\",\n                                 \"required\": false,\n-                                \"sensitive\": true\n+                                \"sensitive\": false\n                             },\n-                            \"java.naming.security.principal\": {\n-                                \"description\": \"The Principal to use when authenticating with JNDI (java.naming.security.principal).\",\n-                                \"displayName\": \"JNDI Principal\",\n+                            \"poll-fields\": {\n+                                \"description\": \"A comma-separated list of poll fields to be returned as part of the tweet. Refer to https://developer.twitter.com/en/docs/twitter-api/data-dictionary/object-model/poll for proper usage. Possible field values include: duration_minutes, end_datetime, id, options, voting_status\",\n+                                \"displayName\": \"Poll Fields\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"java.naming.security.principal\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"poll-fields\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"naming.factory.libraries\": {\n-                                \"description\": \"Specifies jar files and/or directories to add to the ClassPath in order to load the JNDI / JMS client libraries. This should be a comma-separated list of files, directories, and/or URLs. If a directory is given, any files in that directory will be included, but subdirectories will not be included (i.e., it is not recursive).\",\n-                                \"displayName\": \"JNDI / JMS Client Libraries\",\n+                            \"queue-size\": {\n+                                \"defaultValue\": \"10000\",\n+                                \"description\": \"Maximum size of internal queue for streamed messages\",\n+                                \"displayName\": \"Queue Size\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"naming.factory.libraries\",\n-                                \"required\": false,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"MULTIPLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\",\n-                                        \"DIRECTORY\",\n-                                        \"URL\"\n-                                    ]\n-                                },\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"queue-size\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"output-strategy\": {\n+                            \"read-timeout\": {\n+                                \"defaultValue\": \"10 secs\",\n+                                \"description\": \"The maximum time of inactivity between receiving tweets from Twitter through the API before a timeout. Setting the value to 0 disables read timeouts.\",\n+                                \"displayName\": \"Read Timeout\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"read-timeout\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"stream-endpoint\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Write only the message to the FlowFile record.\",\n-                                        \"displayName\": \"Use Content as Value\",\n-                                        \"value\": \"USE_VALUE\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Write the additional attributes into the FlowFile record on a separate leaf. (See processor usage for more information.)\",\n-                                        \"displayName\": \"Use Wrapper\",\n-                                        \"value\": \"USE_WRAPPER\"\n+                                        \"description\": \"Streams about one percent of all Tweets. https://developer.twitter.com/en/docs/twitter-api/tweets/volume-streams/api-reference/get-tweets-sample-stream\",\n+                                        \"displayName\": \"Sample Stream\",\n+                                        \"value\": \"Sample Endpoint\"\n                                     },\n                                     {\n-                                        \"description\": \"Write the additional attributes into the FlowFile record prefixed with \\\"_\\\". (See processor usage for more information.)\",\n-                                        \"displayName\": \"Use Appender\",\n-                                        \"value\": \"USE_APPENDER\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"USE_VALUE\",\n-                                \"dependencies\": [\n-                                    {\n-                                        \"propertyDisplayName\": \"Record Reader\",\n-                                        \"propertyName\": \"record-reader\"\n+                                        \"description\": \"The search stream produces Tweets that match filtering rules configured on Twitter services. At least one well-formed filtering rule must be configured. https://developer.twitter.com/en/docs/twitter-api/tweets/filtered-stream/api-reference/get-tweets-search-stream\",\n+                                        \"displayName\": \"Search Stream\",\n+                                        \"value\": \"Search Endpoint\"\n                                     }\n                                 ],\n-                                \"description\": \"The format used to output the JMS message into a FlowFile record.\",\n-                                \"displayName\": \"Output Strategy\",\n+                                \"defaultValue\": \"Sample Endpoint\",\n+                                \"description\": \"The source from which the processor will consume Tweets.\",\n+                                \"displayName\": \"Stream Endpoint\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"output-strategy\",\n+                                \"name\": \"stream-endpoint\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"record-reader\": {\n-                                \"description\": \"The Record Reader to use for parsing received JMS Messages into Records.\",\n-                                \"displayName\": \"Record Reader\",\n+                            \"tweet-fields\": {\n+                                \"description\": \"A comma-separated list of tweet fields to be returned as part of the tweet. Refer to https://developer.twitter.com/en/docs/twitter-api/data-dictionary/object-model/tweet for proper usage. Possible field values include: attachments, author_id, context_annotations, conversation_id, created_at, entities, geo, id, in_reply_to_user_id, lang, non_public_metrics, organic_metrics, possibly_sensitive, promoted_metrics, public_metrics, referenced_tweets, reply_settings, source, text, withheld\",\n+                                \"displayName\": \"Tweet Fields\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"record-reader\",\n+                                \"name\": \"tweet-fields\",\n                                 \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n+                                \"sensitive\": false\n                             },\n-                            \"record-writer\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"propertyDisplayName\": \"Record Reader\",\n-                                        \"propertyName\": \"record-reader\"\n-                                    }\n-                                ],\n-                                \"description\": \"The Record Writer to use for serializing Records before writing them to a FlowFile.\",\n-                                \"displayName\": \"Record Writer\",\n+                            \"user-fields\": {\n+                                \"description\": \"A comma-separated list of user fields to be returned as part of the tweet. Refer to https://developer.twitter.com/en/docs/twitter-api/data-dictionary/object-model/user for proper usage. Possible field values include: created_at, description, entities, id, location, name, pinned_tweet_id, profile_image_url, protected, public_metrics, url, username, verified, withheld\",\n+                                \"displayName\": \"User Fields\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"record-writer\",\n-                                \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n+                                \"name\": \"user-fields\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n                             }\n                         },\n-                        \"restricted\": true,\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.jms.cf.JMSConnectionFactoryProvider\",\n-                            \"org.apache.nifi.jms.processors.PublishJMS\"\n-                        ],\n                         \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"All FlowFiles that are received from the JMS Destination are routed to this relationship\",\n+                                \"description\": \"FlowFiles containing an array of one or more Tweets\",\n                                 \"name\": \"success\"\n-                            },\n-                            {\n-                                \"description\": \"If a message cannot be parsed using the configured Record Reader, the contents of the message will be routed to this Relationship as its own individual FlowFile.\",\n-                                \"name\": \"parse.failure\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n-                        \"supportsBatching\": false,\n-                        \"supportsDynamicProperties\": true,\n+                        \"supportsBatching\": true,\n+                        \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"consume\",\n-                            \"get\",\n-                            \"jms\",\n-                            \"message\",\n-                            \"receive\"\n+                            \"json\",\n+                            \"social media\",\n+                            \"status\",\n+                            \"tweets\",\n+                            \"twitter\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.jms.processors.ConsumeJMS\",\n-                        \"typeDescription\": \"Consumes JMS Message of type BytesMessage, TextMessage, ObjectMessage, MapMessage or StreamMessage transforming its content to a FlowFile and transitioning it to 'success' relationship. JMS attributes such as headers and properties will be copied as FlowFile attributes. MapMessages will be transformed into JSONs and then into byte arrays. The other types will have their raw contents as byte array transferred into the flowfile.\",\n+                        \"type\": \"org.apache.nifi.processors.twitter.ConsumeTwitter\",\n+                        \"typeDescription\": \"Streams tweets from Twitter's streaming API v2. The stream provides a sample stream or a search stream based on previously uploaded rules. This processor also provides a pass through for certain fields of the tweet to be returned as part of the response. See https://developer.twitter.com/en/docs/twitter-api/data-dictionary/introduction for more information regarding the Tweet object model.\",\n                         \"version\": \"1.27.0\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"The JMSDeliveryMode from the message header.\",\n-                                \"name\": \"jms_deliveryMode\"\n-                            },\n-                            {\n-                                \"description\": \"The JMSExpiration from the message header.\",\n-                                \"name\": \"jms_expiration\"\n-                            },\n-                            {\n-                                \"description\": \"The JMSPriority from the message header.\",\n-                                \"name\": \"jms_priority\"\n-                            },\n-                            {\n-                                \"description\": \"The JMSRedelivered from the message header.\",\n-                                \"name\": \"jms_redelivered\"\n-                            },\n-                            {\n-                                \"description\": \"The JMSTimestamp from the message header.\",\n-                                \"name\": \"jms_timestamp\"\n-                            },\n-                            {\n-                                \"description\": \"The JMSCorrelationID from the message header.\",\n-                                \"name\": \"jms_correlationId\"\n-                            },\n-                            {\n-                                \"description\": \"The JMSMessageID from the message header.\",\n-                                \"name\": \"jms_messageId\"\n-                            },\n-                            {\n-                                \"description\": \"The JMSType from the message header.\",\n-                                \"name\": \"jms_type\"\n-                            },\n-                            {\n-                                \"description\": \"The JMSReplyTo from the message header.\",\n-                                \"name\": \"jms_replyTo\"\n-                            },\n-                            {\n-                                \"description\": \"The JMSDestination from the message header.\",\n-                                \"name\": \"jms_destination\"\n-                            },\n-                            {\n-                                \"description\": \"The JMS message type, can be TextMessage, BytesMessage, ObjectMessage, MapMessage or StreamMessage).\",\n-                                \"name\": \"jms.messagetype\"\n+                                \"description\": \"The MIME Type set to application/json\",\n+                                \"name\": \"mime.type\"\n                             },\n                             {\n-                                \"description\": \"Each message property is written to an attribute.\",\n-                                \"name\": \"other attributes\"\n+                                \"description\": \"The number of Tweets in the FlowFile\",\n+                                \"name\": \"tweets\"\n                             }\n                         ]\n                     },\n                     {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-jms-processors-nar\",\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-social-media-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -78439,941 +75804,751 @@\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n-                        \"dynamicProperties\": [\n-                            {\n-                                \"description\": \"Additional configuration property for the Connection Factory. It can be used when the Connection Factory is being configured via the 'JNDI *' or the 'JMS *'properties of the processor. For more information, see the Additional Details page.\",\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"name\": \"The name of a Connection Factory configuration property.\",\n-                                \"value\": \"The value of a given Connection Factory configuration property.\"\n-                            }\n+                        \"deprecated\": true,\n+                        \"deprecationAlternatives\": [\n+                            \"org.apache.nifi.processors.twitter.ConsumeTwitter\"\n                         ],\n-                        \"explicitRestrictions\": [\n+                        \"deprecationReason\": \"GetTwitter relies on the Twitter Hosebird client, which is not maintained. This processor will be removed in future releases.\",\n+                        \"dynamicProperties\": [\n                             {\n-                                \"explanation\": \"Client Library Location can reference resources over HTTP\",\n-                                \"requiredPermission\": \"reference remote resources\"\n+                                \"description\": \"Allows users to specify the name/value of a query parameter to add to the Twitter query\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"name\": \"The name of a query parameter to add to the Twitter query\",\n+                                \"value\": \"The value of a query parameter to add to the Twitter query\"\n                             }\n                         ],\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_REQUIRED\",\n+                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Connection Client ID\": {\n-                                \"description\": \"The client id to be set on the connection, if set. For durable non shared consumer this is mandatory, for all others it is optional, typically with shared consumers it is undesirable to be set. Please see JMS spec for further details\",\n-                                \"displayName\": \"Connection Client ID\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Connection Client ID\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Connection Factory Service\": {\n-                                \"description\": \"The Controller Service that is used to obtain Connection Factory. Alternatively, the 'JNDI *' or the 'JMS *' properties can also be be used to configure the Connection Factory.\",\n-                                \"displayName\": \"Connection Factory Service\",\n+                            \"Access Token\": {\n+                                \"description\": \"The Access Token provided by Twitter\",\n+                                \"displayName\": \"Access Token\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Connection Factory Service\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-jms-cf-service-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.jms.cf.JMSConnectionFactoryProviderDefinition\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            },\n-                            \"Destination Name\": {\n-                                \"description\": \"The name of the JMS Destination. Usually provided by the administrator (e.g., 'topic://myTopic' or 'myTopic').\",\n-                                \"displayName\": \"Destination Name\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Destination Name\",\n+                                \"name\": \"Access Token\",\n                                 \"required\": true,\n-                                \"sensitive\": false\n+                                \"sensitive\": true\n                             },\n-                            \"Destination Type\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"QUEUE\",\n-                                        \"value\": \"QUEUE\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"TOPIC\",\n-                                        \"value\": \"TOPIC\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"QUEUE\",\n-                                \"description\": \"The type of the JMS Destination. Could be one of 'QUEUE' or 'TOPIC'. Usually provided by the administrator. Defaults to 'QUEUE'\",\n-                                \"displayName\": \"Destination Type\",\n+                            \"Access Token Secret\": {\n+                                \"description\": \"The Access Token Secret provided by Twitter\",\n+                                \"displayName\": \"Access Token Secret\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Destination Type\",\n+                                \"name\": \"Access Token Secret\",\n                                 \"required\": true,\n-                                \"sensitive\": false\n+                                \"sensitive\": true\n                             },\n-                            \"Password\": {\n-                                \"description\": \"Password used for authentication and authorization.\",\n-                                \"displayName\": \"Password\",\n+                            \"Consumer Key\": {\n+                                \"description\": \"The Consumer Key provided by Twitter\",\n+                                \"displayName\": \"Consumer Key\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Password\",\n-                                \"required\": false,\n+                                \"name\": \"Consumer Key\",\n+                                \"required\": true,\n                                 \"sensitive\": true\n                             },\n-                            \"SSL Context Service\": {\n-                                \"description\": \"The SSL Context Service used to provide client certificate information for TLS/SSL connections.\",\n-                                \"displayName\": \"JMS SSL Context Service\",\n+                            \"Consumer Secret\": {\n+                                \"description\": \"The Consumer Secret provided by Twitter\",\n+                                \"displayName\": \"Consumer Secret\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"SSL Context Service\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n+                                \"name\": \"Consumer Secret\",\n+                                \"required\": true,\n+                                \"sensitive\": true\n                             },\n-                            \"Session Cache size\": {\n-                                \"defaultValue\": \"1\",\n-                                \"description\": \"This property is deprecated and no longer has any effect on the Processor. It will be removed in a later version.\",\n-                                \"displayName\": \"Session Cache Size\",\n+                            \"IDs to Follow\": {\n+                                \"description\": \"A comma-separated list of Twitter User ID's to follow. Ignored unless Endpoint is set to 'Filter Endpoint'.\",\n+                                \"displayName\": \"IDs to Follow\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Session Cache size\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"User Name\": {\n-                                \"description\": \"User Name used for authentication and authorization.\",\n-                                \"displayName\": \"User Name\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"User Name\",\n+                                \"name\": \"IDs to Follow\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"allow-illegal-chars-in-jms-header-names\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"Specifies whether illegal characters in header names should be sent to the JMS broker. Usually hyphens and full-stops.\",\n-                                \"displayName\": \"Allow Illegal Characters in Header Names\",\n+                            \"Languages\": {\n+                                \"description\": \"A comma-separated list of languages for which tweets should be fetched\",\n+                                \"displayName\": \"Languages\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"allow-illegal-chars-in-jms-header-names\",\n-                                \"required\": true,\n+                                \"name\": \"Languages\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"attributes-to-send-as-jms-headers-regex\": {\n-                                \"defaultValue\": \".*\",\n-                                \"description\": \"Specifies the Regular Expression that determines the names of FlowFile attributes that should be sent as JMS Headers\",\n-                                \"displayName\": \"Attributes to Send as JMS Headers (Regex)\",\n+                            \"Locations to Filter On\": {\n+                                \"description\": \"A comma-separated list of coordinates specifying one or more bounding boxes to filter on.Each bounding box is specified by a pair of coordinates in the format: swLon,swLat,neLon,neLat. Multiple bounding boxes can be specified as such: swLon1,swLat1,neLon1,neLat1,swLon2,swLat2,neLon2,neLat2.Ignored unless Endpoint is set to 'Filter Endpoint'.\",\n+                                \"displayName\": \"Locations to Filter On\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"attributes-to-send-as-jms-headers-regex\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"broker\": {\n-                                \"description\": \"URI pointing to the network location of the JMS Message broker. Example for ActiveMQ: 'tcp://myhost:61616'. Examples for IBM MQ: 'myhost(1414)' and 'myhost01(1414),myhost02(1414)'.\",\n-                                \"displayName\": \"JMS Broker URI\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"broker\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"cf\": {\n-                                \"description\": \"The fully qualified name of the JMS ConnectionFactory implementation class (eg. org.apache.activemq.ActiveMQConnectionFactory).\",\n-                                \"displayName\": \"JMS Connection Factory Implementation Class\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"cf\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"cflib\": {\n-                                \"description\": \"Path to the directory with additional resources (eg. JARs, configuration files etc.) to be added to the classpath (defined as a comma separated list of values). Such resources typically represent target JMS client libraries for the ConnectionFactory implementation.\",\n-                                \"displayName\": \"JMS Client Libraries\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"cflib\",\n-                                \"required\": false,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"MULTIPLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\",\n-                                        \"DIRECTORY\",\n-                                        \"URL\"\n-                                    ]\n-                                },\n-                                \"sensitive\": false\n-                            },\n-                            \"character-set\": {\n-                                \"defaultValue\": \"UTF-8\",\n-                                \"description\": \"The name of the character set to use to construct or interpret TextMessages\",\n-                                \"displayName\": \"Character Set\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"character-set\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"connection.factory.name\": {\n-                                \"description\": \"The name of the JNDI Object to lookup for the Connection Factory.\",\n-                                \"displayName\": \"JNDI Name of the Connection Factory\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"connection.factory.name\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"java.naming.factory.initial\": {\n-                                \"description\": \"The fully qualified class name of the JNDI Initial Context Factory Class (java.naming.factory.initial).\",\n-                                \"displayName\": \"JNDI Initial Context Factory Class\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"java.naming.factory.initial\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"java.naming.provider.url\": {\n-                                \"description\": \"The URL of the JNDI Provider to use as the value for java.naming.provider.url. See additional details documentation for allowed URL schemes.\",\n-                                \"displayName\": \"JNDI Provider URL\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"java.naming.provider.url\",\n+                                \"name\": \"Locations to Filter On\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"java.naming.security.credentials\": {\n-                                \"description\": \"The Credentials to use when authenticating with JNDI (java.naming.security.credentials).\",\n-                                \"displayName\": \"JNDI Credentials\",\n+                            \"Terms to Filter On\": {\n+                                \"description\": \"A comma-separated list of terms to filter on. Ignored unless Endpoint is set to 'Filter Endpoint'. The filter works such that if any term matches, the status update will be retrieved; multiple terms separated by a space function as an 'AND'. I.e., 'it was, hello' will retrieve status updates that have either 'hello' or both 'it' AND 'was'\",\n+                                \"displayName\": \"Terms to Filter On\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"java.naming.security.credentials\",\n-                                \"required\": false,\n-                                \"sensitive\": true\n-                            },\n-                            \"java.naming.security.principal\": {\n-                                \"description\": \"The Principal to use when authenticating with JNDI (java.naming.security.principal).\",\n-                                \"displayName\": \"JNDI Principal\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"java.naming.security.principal\",\n+                                \"name\": \"Terms to Filter On\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"message-body-type\": {\n+                            \"Twitter Endpoint\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"bytes\",\n-                                        \"value\": \"bytes\"\n+                                        \"description\": \"The endpoint that provides public data, aka a 'garden hose'\",\n+                                        \"displayName\": \"Sample Endpoint\",\n+                                        \"value\": \"Sample Endpoint\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"text\",\n-                                        \"value\": \"text\"\n+                                        \"description\": \"The endpoint that provides access to all tweets\",\n+                                        \"displayName\": \"Firehose Endpoint\",\n+                                        \"value\": \"Firehose Endpoint\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Endpoint that allows the stream to be filtered by specific terms or User IDs\",\n+                                        \"displayName\": \"Filter Endpoint\",\n+                                        \"value\": \"Filter Endpoint\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"bytes\",\n-                                \"description\": \"The type of JMS message body to construct.\",\n-                                \"displayName\": \"Message Body Type\",\n+                                \"defaultValue\": \"Sample Endpoint\",\n+                                \"description\": \"Specifies which endpoint data should be pulled from\",\n+                                \"displayName\": \"Twitter Endpoint\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"message-body-type\",\n+                                \"name\": \"Twitter Endpoint\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"naming.factory.libraries\": {\n-                                \"description\": \"Specifies jar files and/or directories to add to the ClassPath in order to load the JNDI / JMS client libraries. This should be a comma-separated list of files, directories, and/or URLs. If a directory is given, any files in that directory will be included, but subdirectories will not be included (i.e., it is not recursive).\",\n-                                \"displayName\": \"JNDI / JMS Client Libraries\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"naming.factory.libraries\",\n-                                \"required\": false,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"MULTIPLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\",\n-                                        \"DIRECTORY\",\n-                                        \"URL\"\n-                                    ]\n-                                },\n-                                \"sensitive\": false\n-                            },\n-                            \"record-reader\": {\n-                                \"description\": \"The Record Reader to use for parsing the incoming FlowFile into Records.\",\n-                                \"displayName\": \"Record Reader\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"record-reader\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            },\n-                            \"record-writer\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"propertyDisplayName\": \"Record Reader\",\n-                                        \"propertyName\": \"record-reader\"\n-                                    }\n-                                ],\n-                                \"description\": \"The Record Writer to use for serializing Records before publishing them as an JMS Message.\",\n-                                \"displayName\": \"Record Writer\",\n+                            \"max-client-error-retries\": {\n+                                \"defaultValue\": \"5\",\n+                                \"description\": \"The maximum number of retries to attempt when client experience retryable connection errors. Client continues attempting to reconnect using an exponential back-off pattern until it successfully reconnects or until it reaches the retry limit.  It is recommended to raise this value when client is getting rate limited by Twitter API. Default value is 5.\",\n+                                \"displayName\": \"Max Client Error Retries\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"record-writer\",\n+                                \"name\": \"max-client-error-retries\",\n                                 \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n+                                \"sensitive\": false\n                             }\n                         },\n-                        \"readsAttributes\": [\n-                            {\n-                                \"description\": \"This attribute becomes the JMSDeliveryMode message header. Must be an integer.\",\n-                                \"name\": \"jms_deliveryMode\"\n-                            },\n-                            {\n-                                \"description\": \"This attribute becomes the JMSExpiration message header. Must be an integer.\",\n-                                \"name\": \"jms_expiration\"\n-                            },\n-                            {\n-                                \"description\": \"This attribute becomes the JMSPriority message header. Must be an integer.\",\n-                                \"name\": \"jms_priority\"\n-                            },\n-                            {\n-                                \"description\": \"This attribute becomes the JMSRedelivered message header.\",\n-                                \"name\": \"jms_redelivered\"\n-                            },\n-                            {\n-                                \"description\": \"This attribute becomes the JMSTimestamp message header. Must be a long.\",\n-                                \"name\": \"jms_timestamp\"\n-                            },\n-                            {\n-                                \"description\": \"This attribute becomes the JMSCorrelationID message header.\",\n-                                \"name\": \"jms_correlationId\"\n-                            },\n-                            {\n-                                \"description\": \"This attribute becomes the JMSType message header. Must be an integer.\",\n-                                \"name\": \"jms_type\"\n-                            },\n-                            {\n-                                \"description\": \"This attribute becomes the JMSReplyTo message header. Must be an integer.\",\n-                                \"name\": \"jms_replyTo\"\n-                            },\n-                            {\n-                                \"description\": \"This attribute becomes the JMSDestination message header. Must be an integer.\",\n-                                \"name\": \"jms_destination\"\n-                            },\n-                            {\n-                                \"description\": \"All other attributes that do not start with jms_ are added as message properties.\",\n-                                \"name\": \"other attributes\"\n-                            },\n-                            {\n-                                \"description\": \"When an attribute will be added as a message property, a second attribute of the same name but with an extra `.type` at the end will cause the message property to be sent using that strong type. For example, attribute `delay` with value `12000` and another attribute `delay.type` with value `integer` will cause a JMS message property `delay` to be sent as an Integer rather than a String. Supported types are boolean, byte, short, integer, long, float, double, and string (which is the default).\",\n-                                \"name\": \"other attributes .type\"\n-                            }\n-                        ],\n-                        \"restricted\": true,\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.jms.cf.JMSConnectionFactoryProvider\",\n-                            \"org.apache.nifi.jms.processors.ConsumeJMS\"\n-                        ],\n                         \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"All FlowFiles that are sent to the JMS destination are routed to this relationship\",\n+                                \"description\": \"All status updates will be routed to this relationship\",\n                                 \"name\": \"success\"\n-                            },\n-                            {\n-                                \"description\": \"All FlowFiles that cannot be sent to JMS destination are routed to this relationship\",\n-                                \"name\": \"failure\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n-                        \"supportsBatching\": false,\n+                        \"supportsBatching\": true,\n                         \"supportsDynamicProperties\": true,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n-                        \"systemResourceConsiderations\": [\n-                            {\n-                                \"description\": \"An instance of this component can cause high usage of this system resource.  Multiple instances or high concurrency settings may result a degradation of performance.\",\n-                                \"resource\": \"MEMORY\"\n-                            }\n-                        ],\n                         \"tags\": [\n-                            \"jms\",\n-                            \"message\",\n-                            \"publish\",\n-                            \"put\",\n-                            \"send\"\n+                            \"json\",\n+                            \"social media\",\n+                            \"status\",\n+                            \"tweets\",\n+                            \"twitter\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.jms.processors.PublishJMS\",\n-                        \"typeDescription\": \"Creates a JMS Message from the contents of a FlowFile and sends it to a JMS Destination (queue or topic) as JMS BytesMessage or TextMessage. FlowFile attributes will be added as JMS headers and/or properties to the outgoing JMS message.\",\n-                        \"version\": \"1.27.0\"\n+                        \"type\": \"org.apache.nifi.processors.twitter.GetTwitter\",\n+                        \"typeDescription\": \"Pulls status changes from Twitter's streaming API. In versions starting with 1.9.0, the Consumer Key and Access Token are marked as sensitive according to https://developer.twitter.com/en/docs/basics/authentication/guides/securing-keys-and-tokens\",\n+                        \"version\": \"1.27.0\",\n+                        \"writesAttributes\": [\n+                            {\n+                                \"description\": \"Sets mime type to application/json\",\n+                                \"name\": \"mime.type\"\n+                            }\n+                        ]\n                     }\n                 ],\n                 \"reportingTasks\": []\n             },\n             \"group\": \"org.apache.nifi\",\n             \"version\": \"1.27.0\"\n         },\n         {\n-            \"artifact\": \"nifi-redis-nar\",\n+            \"artifact\": \"nifi-image-viewer-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [],\n+                \"processors\": [],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"1.27.0\"\n+        },\n+        {\n+            \"artifact\": \"nifi-asana-services-nar\",\n             \"componentManifest\": {\n                 \"controllerServices\": [\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-redis-nar\",\n+                        \"artifact\": \"nifi-asana-services-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"group\": \"org.apache.nifi\",\n                         \"propertyDescriptors\": {\n-                            \"Cluster Max Redirects\": {\n-                                \"defaultValue\": \"5\",\n-                                \"description\": \"The maximum number of redirects that can be performed when clustered.\",\n-                                \"displayName\": \"Cluster Max Redirects\",\n+                            \"asana-api-url\": {\n+                                \"defaultValue\": \"https://app.asana.com/api/1.0\",\n+                                \"description\": \"Base URL of Asana API. Leave it as default, unless you have your own Asana instance serving on a different URL. (typical for on-premise installations)\",\n+                                \"displayName\": \"API URL\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Cluster Max Redirects\",\n+                                \"name\": \"asana-api-url\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Communication Timeout\": {\n-                                \"defaultValue\": \"10 seconds\",\n-                                \"description\": \"The timeout to use when attempting to communicate with Redis.\",\n-                                \"displayName\": \"Communication Timeout\",\n+                            \"asana-personal-access-token\": {\n+                                \"description\": \"Similarly to entering your username/password into a website, when you access your Asana data via the API you need to authenticate. Personal Access Token (PAT) is an authentication mechanism for accessing the API. You can generate a PAT from the Asana developer console. Refer to Asana Authentication Quick Start for detailed instructions on getting started.\",\n+                                \"displayName\": \"Personal Access Token\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Communication Timeout\",\n+                                \"name\": \"asana-personal-access-token\",\n                                 \"required\": true,\n-                                \"sensitive\": false\n+                                \"sensitive\": true\n                             },\n-                            \"Connection String\": {\n-                                \"description\": \"The connection string for Redis. In a standalone instance this value will be of the form hostname:port. In a sentinel instance this value will be the comma-separated list of sentinels, such as host1:port1,host2:port2,host3:port3. In a clustered instance this value will be the comma-separated list of cluster masters, such as host1:port,host2:port,host3:port.\",\n-                                \"displayName\": \"Connection String\",\n+                            \"asana-workspace-name\": {\n+                                \"description\": \"Specify which Asana workspace to use. Case sensitive. A workspace is the highest-level organizational unit in Asana. All projects and tasks have an associated workspace. An organization is a special kind of workspace that represents a company. In an organization, you can group your projects into teams.\",\n+                                \"displayName\": \"Workspace\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Connection String\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"asana-workspace-name\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n-                            },\n-                            \"Database Index\": {\n-                                \"defaultValue\": \"0\",\n-                                \"description\": \"The database index to be used by connections created from this connection pool. See the databases property in redis.conf, by default databases 0-15 will be available.\",\n-                                \"displayName\": \"Database Index\",\n+                            }\n+                        },\n+                        \"providedApiImplementations\": [\n+                            {\n+                                \"artifact\": \"nifi-asana-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.controller.asana.AsanaClientProviderService\",\n+                                \"version\": \"1.27.0\"\n+                            }\n+                        ],\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"asana\",\n+                            \"authentication\",\n+                            \"service\"\n+                        ],\n+                        \"type\": \"org.apache.nifi.controller.asana.StandardAsanaClientProviderService\",\n+                        \"typeDescription\": \"Common service to authenticate with Asana, and to work on a specified workspace.\",\n+                        \"version\": \"1.27.0\"\n+                    }\n+                ],\n+                \"processors\": [],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"1.27.0\"\n+        },\n+        {\n+            \"artifact\": \"nifi-standard-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [],\n+                \"processors\": [\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-standard-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"e0c4461\"\n+                        },\n+                        \"defaultBulletinLevel\": \"WARN\",\n+                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": 1,\n+                            \"EVENT_DRIVEN\": 0,\n+                            \"TIMER_DRIVEN\": 1\n+                        },\n+                        \"defaultPenaltyDuration\": \"30 sec\",\n+                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": \"* * * * * ?\",\n+                            \"TIMER_DRIVEN\": \"0 sec\"\n+                        },\n+                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n+                        \"defaultYieldDuration\": \"1 sec\",\n+                        \"group\": \"org.apache.nifi\",\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n+                        \"primaryNodeOnly\": false,\n+                        \"propertyDescriptors\": {\n+                            \"attribute-list\": {\n+                                \"description\": \"Comma separated list of attributes to be included in the resulting CSV. If this value is left empty then all existing Attributes will be included. This list of attributes is case sensitive and supports attribute names that contain commas. If an attribute specified in the list is not found it will be emitted to the resulting CSV with an empty string or null depending on the 'Null Value' property. If a core attribute is specified in this list and the 'Include Core Attributes' property is false, the core attribute will be included. The attribute list ALWAYS wins.\",\n+                                \"displayName\": \"Attribute List\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Database Index\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"attribute-list\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Password\": {\n-                                \"description\": \"The password used to authenticate to the Redis server. See the 'requirepass' property in redis.conf.\",\n-                                \"displayName\": \"Password\",\n+                            \"attributes-regex\": {\n+                                \"description\": \"Regular expression that will be evaluated against the flow file attributes to select the matching attributes. This property can be used in combination with the attributes list property.  The final output will contain a combination of matches found in the ATTRIBUTE_LIST and ATTRIBUTE_REGEX.\",\n+                                \"displayName\": \"Attributes Regular Expression\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Password\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"attributes-regex\",\n                                 \"required\": false,\n-                                \"sensitive\": true\n+                                \"sensitive\": false\n                             },\n-                            \"Pool - Block When Exhausted\": {\n+                            \"destination\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"The resulting CSV string will be placed into a new flowfile attribute named 'CSVData'.  The content of the flowfile will not be changed.\",\n+                                        \"displayName\": \"flowfile-attribute\",\n+                                        \"value\": \"flowfile-attribute\"\n+                                    },\n+                                    {\n+                                        \"description\": \"The resulting CSV string will be placed into the content of the flowfile.Existing flowfile context will be overwritten. 'CSVData' will not be written to at all (neither null nor empty string).\",\n+                                        \"displayName\": \"flowfile-content\",\n+                                        \"value\": \"flowfile-content\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"flowfile-attribute\",\n+                                \"description\": \"Control if CSV value is written as a new flowfile attribute 'CSVData' or written in the flowfile content.\",\n+                                \"displayName\": \"Destination\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"destination\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"include-core-attributes\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"true\",\n                                         \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"false\",\n                                         \"value\": \"false\"\n                                     }\n                                 ],\n                                 \"defaultValue\": \"true\",\n-                                \"description\": \"Whether or not clients should block and wait when trying to obtain a connection from the pool when the pool has no available connections. Setting this to false means an error will occur immediately when a client requests a connection and none are available.\",\n-                                \"displayName\": \"Pool - Block When Exhausted\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Pool - Block When Exhausted\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Pool - Max Idle\": {\n-                                \"defaultValue\": \"8\",\n-                                \"description\": \"The maximum number of idle connections that can be held in the pool, or a negative value if there is no limit.\",\n-                                \"displayName\": \"Pool - Max Idle\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Pool - Max Idle\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Pool - Max Total\": {\n-                                \"defaultValue\": \"8\",\n-                                \"description\": \"The maximum number of connections that can be allocated by the pool (checked out to clients, or idle awaiting checkout). A negative value indicates that there is no limit.\",\n-                                \"displayName\": \"Pool - Max Total\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Pool - Max Total\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Pool - Max Wait Time\": {\n-                                \"defaultValue\": \"10 seconds\",\n-                                \"description\": \"The amount of time to wait for an available connection when Block When Exhausted is set to true.\",\n-                                \"displayName\": \"Pool - Max Wait Time\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Pool - Max Wait Time\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Pool - Min Evictable Idle Time\": {\n-                                \"defaultValue\": \"60 seconds\",\n-                                \"description\": \"The minimum amount of time an object may sit idle in the pool before it is eligible for eviction.\",\n-                                \"displayName\": \"Pool - Min Evictable Idle Time\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Pool - Min Evictable Idle Time\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Pool - Min Idle\": {\n-                                \"defaultValue\": \"0\",\n-                                \"description\": \"The target for the minimum number of idle connections to maintain in the pool. If the configured value of Min Idle is greater than the configured value for Max Idle, then the value of Max Idle will be used instead.\",\n-                                \"displayName\": \"Pool - Min Idle\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Pool - Min Idle\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Pool - Num Tests Per Eviction Run\": {\n-                                \"defaultValue\": \"-1\",\n-                                \"description\": \"The number of connections to tests per eviction attempt. A negative value indicates to test all connections.\",\n-                                \"displayName\": \"Pool - Num Tests Per Eviction Run\",\n+                                \"description\": \"Determines if the FlowFile org.apache.nifi.flowfile.attributes.CoreAttributes, which are contained in every FlowFile, should be included in the final CSV value generated.  Core attributes will be added to the end of the CSVData and CSVSchema strings.  The Attribute List property overrides this setting.\",\n+                                \"displayName\": \"Include Core Attributes\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Pool - Num Tests Per Eviction Run\",\n+                                \"name\": \"include-core-attributes\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Pool - Test On Borrow\": {\n+                            \"include-schema\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"true\",\n                                         \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"false\",\n                                         \"value\": \"false\"\n                                     }\n                                 ],\n                                 \"defaultValue\": \"false\",\n-                                \"description\": \"Whether or not connections should be tested upon borrowing from the pool.\",\n-                                \"displayName\": \"Pool - Test On Borrow\",\n+                                \"description\": \"If true the schema (attribute names) will also be converted to a CSV string which will either be applied to a new attribute named 'CSVSchema' or applied at the first row in the content depending on the DESTINATION property setting.\",\n+                                \"displayName\": \"Include Schema\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Pool - Test On Borrow\",\n+                                \"name\": \"include-schema\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Pool - Test On Create\": {\n+                            \"null-value\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"true\",\n                                         \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"false\",\n                                         \"value\": \"false\"\n                                     }\n                                 ],\n                                 \"defaultValue\": \"false\",\n-                                \"description\": \"Whether or not connections should be tested upon creation.\",\n-                                \"displayName\": \"Pool - Test On Create\",\n+                                \"description\": \"If true a non existing or empty attribute will be 'null' in the resulting CSV. If false an empty string will be placed in the CSV\",\n+                                \"displayName\": \"Null Value\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Pool - Test On Create\",\n+                                \"name\": \"null-value\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n+                            }\n+                        },\n+                        \"sideEffectFree\": true,\n+                        \"supportedRelationships\": [\n+                            {\n+                                \"description\": \"Successfully converted attributes to CSV\",\n+                                \"name\": \"success\"\n                             },\n-                            \"Pool - Test On Return\": {\n+                            {\n+                                \"description\": \"Failed to convert attributes to CSV\",\n+                                \"name\": \"failure\"\n+                            }\n+                        ],\n+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\",\n+                            \"EVENT_DRIVEN\"\n+                        ],\n+                        \"supportsBatching\": true,\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicRelationships\": false,\n+                        \"supportsEventDriven\": true,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"attributes\",\n+                            \"csv\",\n+                            \"flowfile\"\n+                        ],\n+                        \"triggerSerially\": false,\n+                        \"triggerWhenAnyDestinationAvailable\": false,\n+                        \"triggerWhenEmpty\": false,\n+                        \"type\": \"org.apache.nifi.processors.standard.AttributesToCSV\",\n+                        \"typeDescription\": \"Generates a CSV representation of the input FlowFile Attributes. The resulting CSV can be written to either a newly generated attribute named 'CSVAttributes' or written to the FlowFile as content.  If the attribute value contains a comma, newline or double quote, then the attribute value will be escaped with double quotes.  Any double quote characters in the attribute value are escaped with another double quote.\",\n+                        \"version\": \"1.27.0\",\n+                        \"writesAttributes\": [\n+                            {\n+                                \"description\": \"CSV representation of the Schema\",\n+                                \"name\": \"CSVSchema\"\n+                            },\n+                            {\n+                                \"description\": \"CSV representation of Attributes\",\n+                                \"name\": \"CSVData\"\n+                            }\n+                        ]\n+                    },\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-standard-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"e0c4461\"\n+                        },\n+                        \"defaultBulletinLevel\": \"WARN\",\n+                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": 1,\n+                            \"EVENT_DRIVEN\": 0,\n+                            \"TIMER_DRIVEN\": 1\n+                        },\n+                        \"defaultPenaltyDuration\": \"30 sec\",\n+                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": \"* * * * * ?\",\n+                            \"TIMER_DRIVEN\": \"0 sec\"\n+                        },\n+                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n+                        \"defaultYieldDuration\": \"1 sec\",\n+                        \"group\": \"org.apache.nifi\",\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n+                        \"primaryNodeOnly\": false,\n+                        \"propertyDescriptors\": {\n+                            \"Attributes List\": {\n+                                \"description\": \"Comma separated list of attributes to be included in the resulting JSON. If this value is left empty then all existing Attributes will be included. This list of attributes is case sensitive. If an attribute specified in the list is not found it will be be emitted to the resulting JSON with an empty string or NULL value.\",\n+                                \"displayName\": \"Attributes List\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Attributes List\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Destination\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"displayName\": \"flowfile-attribute\",\n+                                        \"value\": \"flowfile-attribute\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"displayName\": \"flowfile-content\",\n+                                        \"value\": \"flowfile-content\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"Whether or not connections should be tested upon returning to the pool.\",\n-                                \"displayName\": \"Pool - Test On Return\",\n+                                \"defaultValue\": \"flowfile-attribute\",\n+                                \"description\": \"Control if JSON value is written as a new flowfile attribute 'JSONAttributes' or written in the flowfile content. Writing to flowfile content will overwrite any existing flowfile content.\",\n+                                \"displayName\": \"Destination\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Pool - Test On Return\",\n+                                \"name\": \"Destination\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Pool - Test While Idle\": {\n+                            \"Include Core Attributes\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"true\",\n                                         \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"false\",\n                                         \"value\": \"false\"\n                                     }\n                                 ],\n                                 \"defaultValue\": \"true\",\n-                                \"description\": \"Whether or not connections should be tested while idle.\",\n-                                \"displayName\": \"Pool - Test While Idle\",\n+                                \"description\": \"Determines if the FlowFile org.apache.nifi.flowfile.attributes.CoreAttributes which are contained in every FlowFile should be included in the final JSON value generated.\",\n+                                \"displayName\": \"Include Core Attributes\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Pool - Test While Idle\",\n+                                \"name\": \"Include Core Attributes\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Pool - Time Between Eviction Runs\": {\n-                                \"defaultValue\": \"30 seconds\",\n-                                \"description\": \"The amount of time between attempting to evict idle connections from the pool.\",\n-                                \"displayName\": \"Pool - Time Between Eviction Runs\",\n+                            \"JSON Handling Strategy\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"Escapes JSON attribute values to strings\",\n+                                        \"displayName\": \"Escaped\",\n+                                        \"value\": \"ESCAPED\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Handles JSON attribute values as nested structured objects or arrays\",\n+                                        \"displayName\": \"Nested\",\n+                                        \"value\": \"NESTED\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"ESCAPED\",\n+                                \"description\": \"Strategy to use for handling attributes which contain nested JSON.\",\n+                                \"displayName\": \"JSON Handling Strategy\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Pool - Time Between Eviction Runs\",\n+                                \"name\": \"JSON Handling Strategy\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Redis Mode\": {\n+                            \"Null Value\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"A single standalone Redis instance.\",\n-                                        \"displayName\": \"Standalone\",\n-                                        \"value\": \"Standalone\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Redis Sentinel which provides high-availability. Described further at https://redis.io/topics/sentinel\",\n-                                        \"displayName\": \"Sentinel\",\n-                                        \"value\": \"Sentinel\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n-                                        \"description\": \"Clustered Redis which provides sharding and replication. Described further at https://redis.io/topics/cluster-spec\",\n-                                        \"displayName\": \"Cluster\",\n-                                        \"value\": \"Cluster\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"Standalone\",\n-                                \"description\": \"The type of Redis being communicated with - standalone, sentinel, or clustered.\",\n-                                \"displayName\": \"Redis Mode\",\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"If true a non existing selected attribute will be NULL in the resulting JSON. If false an empty string will be placed in the JSON\",\n+                                \"displayName\": \"Null Value\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Redis Mode\",\n+                                \"name\": \"Null Value\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"SSL Context Service\": {\n-                                \"description\": \"If specified, this service will be used to create an SSL Context that will be used to secure communications; if not specified, communications will not be secure\",\n-                                \"displayName\": \"SSL Context Service\",\n+                            \"Pretty Print\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"false\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"flowfile-content\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Destination\",\n+                                        \"propertyName\": \"Destination\"\n+                                    }\n+                                ],\n+                                \"description\": \"Apply pretty print formatting to the output.\",\n+                                \"displayName\": \"Pretty Print\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"SSL Context Service\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.ssl.RestrictedSSLContextService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            },\n-                            \"Sentinel Master\": {\n-                                \"description\": \"The name of the sentinel master, require when Mode is set to Sentinel\",\n-                                \"displayName\": \"Sentinel Master\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Sentinel Master\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Sentinel Password\": {\n-                                \"description\": \"The password used to authenticate to the Redis Sentinel server. See the 'requirepass' and 'sentinel sentinel-pass' properties in sentinel.conf.\",\n-                                \"displayName\": \"Sentinel Password\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Sentinel Password\",\n-                                \"required\": false,\n-                                \"sensitive\": true\n-                            },\n-                            \"Sentinel Username\": {\n-                                \"description\": \"The username used to authenticate to the Redis sentinel server.\",\n-                                \"displayName\": \"Sentinel Username\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Sentinel Username\",\n-                                \"required\": false,\n+                                \"name\": \"Pretty Print\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Username\": {\n-                                \"description\": \"The username used to authenticate to the Redis server.\",\n-                                \"displayName\": \"Username\",\n+                            \"attributes-to-json-regex\": {\n+                                \"description\": \"Regular expression that will be evaluated against the flow file attributes to select the matching attributes. This property can be used in combination with the attributes list property.\",\n+                                \"displayName\": \"Attributes Regular Expression\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Username\",\n+                                \"name\": \"attributes-to-json-regex\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             }\n                         },\n-                        \"providedApiImplementations\": [\n+                        \"sideEffectFree\": true,\n+                        \"supportedRelationships\": [\n                             {\n-                                \"artifact\": \"nifi-redis-service-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.redis.RedisConnectionPool\",\n-                                \"version\": \"1.27.0\"\n+                                \"description\": \"Successfully converted attributes to JSON\",\n+                                \"name\": \"success\"\n+                            },\n+                            {\n+                                \"description\": \"Failed to convert attributes to JSON\",\n+                                \"name\": \"failure\"\n                             }\n                         ],\n+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\",\n+                            \"EVENT_DRIVEN\"\n+                        ],\n+                        \"supportsBatching\": true,\n                         \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicRelationships\": false,\n+                        \"supportsEventDriven\": true,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"cache\",\n-                            \"redis\"\n+                            \"attributes\",\n+                            \"flowfile\",\n+                            \"json\"\n                         ],\n-                        \"type\": \"org.apache.nifi.redis.service.RedisConnectionPoolService\",\n-                        \"typeDescription\": \"A service that provides connections to Redis.\",\n-                        \"version\": \"1.27.0\"\n+                        \"triggerSerially\": false,\n+                        \"triggerWhenAnyDestinationAvailable\": false,\n+                        \"triggerWhenEmpty\": false,\n+                        \"type\": \"org.apache.nifi.processors.standard.AttributesToJSON\",\n+                        \"typeDescription\": \"Generates a JSON representation of the input FlowFile Attributes. The resulting JSON can be written to either a new Attribute 'JSONAttributes' or written to the FlowFile as content. Attributes  which contain nested JSON objects can either be handled as JSON or as escaped JSON depending on the strategy chosen.\",\n+                        \"version\": \"1.27.0\",\n+                        \"writesAttributes\": [\n+                            {\n+                                \"description\": \"JSON representation of Attributes\",\n+                                \"name\": \"JSONAttributes\"\n+                            }\n+                        ]\n                     },\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-redis-nar\",\n+                        \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n+                        \"defaultBulletinLevel\": \"WARN\",\n+                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": 1,\n+                            \"EVENT_DRIVEN\": 0,\n+                            \"TIMER_DRIVEN\": 1\n+                        },\n+                        \"defaultPenaltyDuration\": \"30 sec\",\n+                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": \"* * * * * ?\",\n+                            \"TIMER_DRIVEN\": \"0 sec\"\n+                        },\n+                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n+                        \"defaultYieldDuration\": \"1 sec\",\n+                        \"deprecated\": true,\n+                        \"deprecationAlternatives\": [\n+                            \"org.apache.nifi.processors.standard.EncodeContent\"\n+                        ],\n+                        \"deprecationReason\": \"EncodeContent supports Base64 and additional encoding schemes\",\n                         \"group\": \"org.apache.nifi\",\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n+                        \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"redis-cache-ttl\": {\n-                                \"defaultValue\": \"0 secs\",\n-                                \"description\": \"Indicates how long the data should exist in Redis. Setting '0 secs' would mean the data would exist forever\",\n-                                \"displayName\": \"TTL\",\n+                            \"Mode\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Encode\",\n+                                        \"value\": \"Encode\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Decode\",\n+                                        \"value\": \"Decode\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"Encode\",\n+                                \"description\": \"Specifies whether the content should be encoded or decoded\",\n+                                \"displayName\": \"Mode\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"redis-cache-ttl\",\n+                                \"name\": \"Mode\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n-                            },\n-                            \"redis-connection-pool\": {\n-                                \"description\": \"\",\n-                                \"displayName\": \"Redis Connection Pool\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"redis-connection-pool\",\n-                                \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-redis-service-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.redis.RedisConnectionPool\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n                             }\n                         },\n-                        \"providedApiImplementations\": [\n+                        \"sideEffectFree\": true,\n+                        \"supportedRelationships\": [\n                             {\n-                                \"artifact\": \"nifi-standard-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.distributed.cache.client.AtomicDistributedMapCacheClient\",\n-                                \"version\": \"1.27.0\"\n+                                \"description\": \"Any FlowFile that is successfully encoded or decoded will be routed to success\",\n+                                \"name\": \"success\"\n                             },\n                             {\n-                                \"artifact\": \"nifi-standard-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.distributed.cache.client.DistributedMapCacheClient\",\n-                                \"version\": \"1.27.0\"\n+                                \"description\": \"Any FlowFile that cannot be encoded or decoded will be routed to failure\",\n+                                \"name\": \"failure\"\n                             }\n                         ],\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"cache\",\n-                            \"distributed\",\n-                            \"map\",\n-                            \"redis\"\n-                        ],\n-                        \"type\": \"org.apache.nifi.redis.service.RedisDistributedMapCacheClientService\",\n-                        \"typeDescription\": \"An implementation of DistributedMapCacheClient that uses Redis as the backing cache. This service relies on the WATCH, MULTI, and EXEC commands in Redis, which are not fully supported when Redis is clustered. As a result, this service can only be used with a Redis Connection Pool that is configured for standalone or sentinel mode. Sentinel mode can be used to provide high-availability configurations.\",\n-                        \"version\": \"1.27.0\"\n-                    },\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-redis-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"e0c4461\"\n-                        },\n-                        \"group\": \"org.apache.nifi\",\n-                        \"propertyDescriptors\": {\n-                            \"redis-cache-ttl\": {\n-                                \"defaultValue\": \"0 secs\",\n-                                \"description\": \"Indicates how long the data should exist in Redis. Setting '0 secs' would mean the data would exist forever\",\n-                                \"displayName\": \"TTL\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"redis-cache-ttl\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"redis-connection-pool\": {\n-                                \"description\": \"\",\n-                                \"displayName\": \"Redis Connection Pool\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"redis-connection-pool\",\n-                                \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-redis-service-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.redis.RedisConnectionPool\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            }\n-                        },\n-                        \"providedApiImplementations\": [\n-                            {\n-                                \"artifact\": \"nifi-standard-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.distributed.cache.client.DistributedMapCacheClient\",\n-                                \"version\": \"1.27.0\"\n-                            }\n+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\",\n+                            \"EVENT_DRIVEN\"\n                         ],\n+                        \"supportsBatching\": true,\n                         \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicRelationships\": false,\n+                        \"supportsEventDriven\": true,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"cache\",\n-                            \"distributed\",\n-                            \"map\",\n-                            \"redis\"\n+                            \"base64\",\n+                            \"encode\"\n                         ],\n-                        \"type\": \"org.apache.nifi.redis.service.SimpleRedisDistributedMapCacheClientService\",\n-                        \"typeDescription\": \"An implementation of DistributedMapCacheClient that uses Redis as the backing cache. This service is intended to be used when a non-atomic DistributedMapCacheClient is required.\",\n+                        \"triggerSerially\": false,\n+                        \"triggerWhenAnyDestinationAvailable\": false,\n+                        \"triggerWhenEmpty\": false,\n+                        \"type\": \"org.apache.nifi.processors.standard.Base64EncodeContent\",\n+                        \"typeDescription\": \"Encodes or decodes content to and from base64\",\n                         \"version\": \"1.27.0\"\n-                    }\n-                ],\n-                \"processors\": [],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"1.27.0\"\n-        },\n-        {\n-            \"artifact\": \"nifi-tcp-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [],\n-                \"processors\": [\n+                    },\n                     {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-tcp-nar\",\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -79381,570 +76556,658 @@\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n-                        \"deprecated\": true,\n-                        \"deprecationReason\": \"Unmaintained and planned for removal in version 2.0\",\n                         \"dynamicProperties\": [\n                             {\n-                                \"description\": \"Sets a FlowFile attribute specified by the Dynamic Property's key with the value specified by the Dynamic Property's value\",\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"name\": \"A FlowFile attribute to set\",\n-                                \"value\": \"The value to set it to\"\n+                                \"description\": \"A Record Path value, pointing to a field to be counted\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"name\": \"Record Path property\",\n+                                \"value\": \"The Record Path value\"\n                             }\n                         ],\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"connection-attempt-timeout\": {\n-                                \"defaultValue\": \"3\",\n-                                \"description\": \"The number of times to try and establish a connection, before using a backup host if available. This same attempt count would be used for a backup host as well.\",\n-                                \"displayName\": \"Connection Attempt Count\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"connection-attempt-timeout\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"end-of-message-byte\": {\n-                                \"defaultValue\": \"13\",\n-                                \"description\": \"Byte value which denotes end of message. Must be specified as integer within the valid byte range (-128 thru 127). For example, '13' = Carriage return and '10' = New line. Default '13'.\",\n-                                \"displayName\": \"End of message delimiter byte\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"end-of-message-byte\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"endpoint-list\": {\n-                                \"description\": \"A comma delimited list of the endpoints to connect to. The format should be <server_address>:<port>. Only one server will be connected to at a time, the others will be used as fail overs.\",\n-                                \"displayName\": \"Endpoint List\",\n+                            \"record-stats-limit\": {\n+                                \"defaultValue\": \"10\",\n+                                \"description\": \"Limit the number of individual stats that are returned for each record path to the top N results.\",\n+                                \"displayName\": \"record-stats-limit\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"endpoint-list\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"record-stats-limit\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"receive-buffer-size\": {\n-                                \"defaultValue\": \"16MB\",\n-                                \"description\": \"The size of the buffer to receive data in. Default 16384 (16MB).\",\n-                                \"displayName\": \"Receive Buffer Size\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"receive-buffer-size\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"reconnect-interval\": {\n-                                \"defaultValue\": \"5 sec\",\n-                                \"description\": \"The number of seconds to wait before attempting to reconnect to the endpoint.\",\n-                                \"displayName\": \"Reconnect interval\",\n+                            \"record-stats-reader\": {\n+                                \"description\": \"A record reader to use for reading the records.\",\n+                                \"displayName\": \"Record Reader\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"reconnect-interval\",\n+                                \"name\": \"record-stats-reader\",\n                                 \"required\": true,\n-                                \"sensitive\": false\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n                             }\n                         },\n-                        \"sideEffectFree\": true,\n+                        \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"The relationship that all incomplete messages from the endpoint will be sent to. Incomplete message is the message that doesn't end with 'End of message delimiter byte'. This can happen when 'Receive Buffer Size' is smaller then the incoming message. If that happens that the subsequent message that completes the previous incomplete message will also end up in this relationship, after which subsequent 'complete' messages will go to 'success'.\",\n-                                \"name\": \"Partial\"\n+                                \"description\": \"If a flowfile is successfully processed, it goes here.\",\n+                                \"name\": \"success\"\n                             },\n                             {\n-                                \"description\": \"The relationship that all sucessful messages from the endpoint will be sent to.\",\n-                                \"name\": \"Success\"\n+                                \"description\": \"If a flowfile fails to be processed, it goes here.\",\n+                                \"name\": \"failure\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n                         \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": true,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"fetch\",\n-                            \"get\",\n-                            \"ingest\",\n-                            \"input\",\n-                            \"poll\",\n-                            \"source\",\n-                            \"tcp\"\n+                            \"metrics\",\n+                            \"record\",\n+                            \"stats\"\n                         ],\n-                        \"triggerSerially\": true,\n+                        \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.gettcp.GetTCP\",\n-                        \"typeDescription\": \"Connects over TCP to the provided endpoint(s). Received data will be written as content to the FlowFile\",\n+                        \"type\": \"org.apache.nifi.processors.standard.CalculateRecordStats\",\n+                        \"typeDescription\": \"A processor that can count the number of items in a record set, as well as provide counts based on user-defined criteria on subsets of the record set.\",\n                         \"version\": \"1.27.0\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"The address of the source endpoint the message came from\",\n-                                \"name\": \"source.endpoint\"\n+                                \"description\": \"A count of the records in the record set in the FlowFile.\",\n+                                \"name\": \"record.count\"\n+                            },\n+                            {\n+                                \"description\": \"A count of the records that contain a value for the user defined property.\",\n+                                \"name\": \"recordStats.<User Defined Property Name>.count\"\n+                            },\n+                            {\n+                                \"description\": \"Each value discovered for the user defined property will have its own count attribute. Total number of top N value counts to be added is defined by the limit configuration.\",\n+                                \"name\": \"recordStats.<User Defined Property Name>.<value>.count\"\n                             }\n                         ]\n-                    }\n-                ],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"1.27.0\"\n-        },\n-        {\n-            \"artifact\": \"nifi-language-translation-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [],\n-                \"processors\": [\n+                    },\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-language-translation-nar\",\n+                        \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n+                            \"EVENT_DRIVEN\": 0,\n                             \"TIMER_DRIVEN\": 1\n                         },\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n-                        \"dynamicProperties\": [\n-                            {\n-                                \"description\": \"User-defined properties are used to translate arbitrary text based on attributes.\",\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"name\": \"The name of an attribute to set that will contain the translated text of the value\",\n-                                \"value\": \"The value to translate\"\n-                            }\n-                        ],\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Character Set\": {\n-                                \"defaultValue\": \"UTF-8\",\n-                                \"description\": \"Specifies the character set of the data to be translated\",\n-                                \"displayName\": \"Character Set\",\n+                            \"Compression Format\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"use mime.type attribute\",\n+                                        \"value\": \"use mime.type attribute\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"gzip\",\n+                                        \"value\": \"gzip\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"deflate\",\n+                                        \"value\": \"deflate\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"bzip2\",\n+                                        \"value\": \"bzip2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"xz-lzma2\",\n+                                        \"value\": \"xz-lzma2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"lzma\",\n+                                        \"value\": \"lzma\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"snappy\",\n+                                        \"value\": \"snappy\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"snappy-hadoop\",\n+                                        \"value\": \"snappy-hadoop\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"snappy framed\",\n+                                        \"value\": \"snappy framed\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"lz4-framed\",\n+                                        \"value\": \"lz4-framed\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"zstd\",\n+                                        \"value\": \"zstd\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"brotli\",\n+                                        \"value\": \"brotli\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"use mime.type attribute\",\n+                                \"description\": \"The compression format to use. Valid values are: GZIP, Deflate, ZSTD, BZIP2, XZ-LZMA2, LZMA, Brotli, Snappy, Snappy Hadoop, Snappy Framed, and LZ4-Framed\",\n+                                \"displayName\": \"Compression Format\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Character Set\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Compression Format\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Input Language\": {\n-                                \"description\": \"The language of incoming data. If no language is set, Yandex will attempt to detect the incoming language automatically.\",\n-                                \"displayName\": \"Input Language\",\n+                            \"Compression Level\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"0\",\n+                                        \"value\": \"0\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"1\",\n+                                        \"value\": \"1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"2\",\n+                                        \"value\": \"2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"3\",\n+                                        \"value\": \"3\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"4\",\n+                                        \"value\": \"4\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"5\",\n+                                        \"value\": \"5\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"6\",\n+                                        \"value\": \"6\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"7\",\n+                                        \"value\": \"7\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"8\",\n+                                        \"value\": \"8\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"9\",\n+                                        \"value\": \"9\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"1\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"zstd\",\n+                                            \"use mime.type attribute\",\n+                                            \"deflate\",\n+                                            \"brotli\",\n+                                            \"gzip\",\n+                                            \"xz-lzma2\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Compression Format\",\n+                                        \"propertyName\": \"Compression Format\"\n+                                    },\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"compress\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Mode\",\n+                                        \"propertyName\": \"Mode\"\n+                                    }\n+                                ],\n+                                \"description\": \"The compression level to use; this is valid only when using gzip, deflate or xz-lzma2 compression. A lower value results in faster processing but less compression; a value of 0 indicates no (that is, simple archiving) for gzip or minimal for xz-lzma2 compression. Higher levels can mean much larger memory usage such as the case with levels 7-9 for xz-lzma/2 so be careful relative to heap size.\",\n+                                \"displayName\": \"Compression Level\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Input Language\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Compression Level\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Target Language\": {\n-                                \"defaultValue\": \"en\",\n-                                \"description\": \"The language to translate the text into\",\n-                                \"displayName\": \"Target Language\",\n+                            \"Mode\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"compress\",\n+                                        \"value\": \"compress\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"decompress\",\n+                                        \"value\": \"decompress\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"compress\",\n+                                \"description\": \"Indicates whether the processor should compress content or decompress content. Must be either 'compress' or 'decompress'\",\n+                                \"displayName\": \"Mode\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Target Language\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Mode\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Translate Content\": {\n+                            \"Update Filename\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"true\",\n                                         \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"false\",\n                                         \"value\": \"false\"\n                                     }\n                                 ],\n                                 \"defaultValue\": \"false\",\n-                                \"description\": \"Specifies whether or not the content should be translated. If false, only the text specified by user-defined properties will be translated.\",\n-                                \"displayName\": \"Translate Content\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Translate Content\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Yandex API Key\": {\n-                                \"description\": \"The API Key that is registered with Yandex\",\n-                                \"displayName\": \"Yandex API Key\",\n+                                \"description\": \"If true, will remove the filename extension when decompressing data (only if the extension indicates the appropriate compression format) and add the appropriate extension when compressing data\",\n+                                \"displayName\": \"Update Filename\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Yandex API Key\",\n+                                \"name\": \"Update Filename\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             }\n                         },\n-                        \"sideEffectFree\": false,\n-                        \"supportedRelationships\": [\n+                        \"readsAttributes\": [\n                             {\n-                                \"description\": \"This relationship is used if the translation cannot be performed for some reason other than communications failure\",\n-                                \"name\": \"translation.failure\"\n-                            },\n+                                \"description\": \"If the Compression Format is set to use mime.type attribute, this attribute is used to determine the compression type. Otherwise, this attribute is ignored.\",\n+                                \"name\": \"mime.type\"\n+                            }\n+                        ],\n+                        \"sideEffectFree\": true,\n+                        \"supportedRelationships\": [\n                             {\n-                                \"description\": \"This relationship is used when the translation is successful\",\n+                                \"description\": \"FlowFiles will be transferred to the success relationship after successfully being compressed or decompressed\",\n                                 \"name\": \"success\"\n                             },\n                             {\n-                                \"description\": \"This relationship is used when the translation fails due to a problem such as a network failure, and for which the translation should be attempted again\",\n-                                \"name\": \"comms.failure\"\n+                                \"description\": \"FlowFiles will be transferred to the failure relationship if they fail to compress/decompress\",\n+                                \"name\": \"failure\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n+                            \"CRON_DRIVEN\",\n+                            \"EVENT_DRIVEN\"\n                         ],\n                         \"supportsBatching\": true,\n-                        \"supportsDynamicProperties\": true,\n+                        \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": false,\n+                        \"supportsEventDriven\": true,\n                         \"supportsSensitiveDynamicProperties\": false,\n+                        \"systemResourceConsiderations\": [\n+                            {\n+                                \"description\": \"An instance of this component can cause high usage of this system resource.  Multiple instances or high concurrency settings may result a degradation of performance.\",\n+                                \"resource\": \"CPU\"\n+                            },\n+                            {\n+                                \"description\": \"An instance of this component can cause high usage of this system resource.  Multiple instances or high concurrency settings may result a degradation of performance.\",\n+                                \"resource\": \"MEMORY\"\n+                            }\n+                        ],\n                         \"tags\": [\n-                            \"language\",\n-                            \"translate\",\n-                            \"translation\",\n-                            \"yandex\"\n+                            \"brotli\",\n+                            \"bzip2\",\n+                            \"compress\",\n+                            \"content\",\n+                            \"decompress\",\n+                            \"deflate\",\n+                            \"gzip\",\n+                            \"lz4-framed\",\n+                            \"lzma\",\n+                            \"snappy\",\n+                            \"snappy framed\",\n+                            \"snappy-hadoop\",\n+                            \"xz-lzma2\",\n+                            \"zstd\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.yandex.YandexTranslate\",\n-                        \"typeDescription\": \"Translates content and attributes from one language to another\",\n+                        \"type\": \"org.apache.nifi.processors.standard.CompressContent\",\n+                        \"typeDescription\": \"Compresses or decompresses the contents of FlowFiles using a user-specified compression algorithm and updates the mime.type attribute as appropriate. A common idiom is to precede CompressContent with IdentifyMimeType and configure Mode='decompress' AND Compression Format='use mime.type attribute'. When used in this manner, the MIME type is automatically detected and the data is decompressed, if necessary. If decompression is unnecessary, the data is passed through to the 'success' relationship. This processor operates in a very memory efficient way so very large objects well beyond the heap size are generally fine to process.\",\n                         \"version\": \"1.27.0\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"If the text cannot be translated, this attribute will be set indicating the reason for the failure\",\n-                                \"name\": \"yandex.translate.failure.reason\"\n-                            },\n-                            {\n-                                \"description\": \"When the translation succeeds, if the content was translated, this attribute will be set indicating the new language of the content\",\n-                                \"name\": \"language\"\n+                                \"description\": \"If the Mode property is set to compress, the appropriate MIME Type is set. If the Mode property is set to decompress and the file is successfully decompressed, this attribute is removed, as the MIME Type is no longer known.\",\n+                                \"name\": \"mime.type\"\n                             }\n                         ]\n-                    }\n-                ],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"1.27.0\"\n-        },\n-        {\n-            \"artifact\": \"nifi-poi-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [\n+                    },\n                     {\n                         \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-poi-nar\",\n+                        \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n+                        \"defaultBulletinLevel\": \"WARN\",\n+                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": 1,\n+                            \"TIMER_DRIVEN\": 1\n+                        },\n+                        \"defaultPenaltyDuration\": \"30 sec\",\n+                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": \"* * * * * ?\",\n+                            \"TIMER_DRIVEN\": \"0 sec\"\n+                        },\n+                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n+                        \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n+                        \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Date Format\": {\n-                                \"description\": \"Specifies the format to use when reading/writing Date fields. If not specified, Date fields will be assumed to be number of milliseconds since epoch (Midnight, Jan 1, 1970 GMT). If specified, the value must match the Java Simple Date Format (for example, MM/dd/yyyy for a two-digit month, followed by a two-digit day, followed by a four-digit year, all separated by '/' characters, as in 01/01/2017).\",\n-                                \"displayName\": \"Date Format\",\n+                            \"Grouping Attribute\": {\n+                                \"description\": \"By default, a single \\\"throttle\\\" is used for all FlowFiles. If this value is specified, a separate throttle is used for each value specified by the attribute with this name. Changing this value resets the rate counters.\",\n+                                \"displayName\": \"Grouping Attribute\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Date Format\",\n+                                \"name\": \"Grouping Attribute\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Password\": {\n+                            \"Maximum Data Rate\": {\n                                 \"dependencies\": [\n                                     {\n                                         \"dependentValues\": [\n-                                            \"PASSWORD\"\n+                                            \"data rate or flowfile count\"\n                                         ],\n-                                        \"propertyDisplayName\": \"Protection Type\",\n-                                        \"propertyName\": \"Protection Type\"\n+                                        \"propertyDisplayName\": \"Rate Control Criteria\",\n+                                        \"propertyName\": \"Rate Control Criteria\"\n                                     }\n                                 ],\n-                                \"description\": \"The password for a password protected Excel spreadsheet\",\n-                                \"displayName\": \"Password\",\n+                                \"description\": \"The maximum rate at which data should pass through this processor. The format of this property is expected to be a Data Size (such as '1 MB') representing bytes per Time Duration.\",\n+                                \"displayName\": \"Maximum Data Rate\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Password\",\n-                                \"required\": true,\n-                                \"sensitive\": true\n+                                \"name\": \"Maximum Data Rate\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n                             },\n-                            \"Protection Type\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"An Excel spreadsheet not protected by a password\",\n-                                        \"displayName\": \"Unprotected\",\n-                                        \"value\": \"UNPROTECTED\"\n-                                    },\n+                            \"Maximum FlowFile Rate\": {\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"An Excel spreadsheet protected by a password\",\n-                                        \"displayName\": \"Password Protected\",\n-                                        \"value\": \"PASSWORD\"\n+                                        \"dependentValues\": [\n+                                            \"data rate or flowfile count\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Rate Control Criteria\",\n+                                        \"propertyName\": \"Rate Control Criteria\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"UNPROTECTED\",\n-                                \"description\": \"Specifies whether an Excel spreadsheet is protected by a password or not.\",\n-                                \"displayName\": \"Protection Type\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Protection Type\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Required Sheets\": {\n-                                \"description\": \"Comma-separated list of Excel document sheet names whose rows should be extracted from the excel document. If this property is left blank then all the rows from all the sheets will be extracted from the Excel document. The list of names is case sensitive. Any sheets not specified in this value will be ignored. An exception will be thrown if a specified sheet(s) are not found.\",\n-                                \"displayName\": \"Required Sheets\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Required Sheets\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Starting Row\": {\n-                                \"defaultValue\": \"1\",\n-                                \"description\": \"The row number of the first row to start processing (One based). Use this to skip over rows of data at the top of a worksheet that are not part of the dataset.\",\n-                                \"displayName\": \"Starting Row\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Starting Row\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Time Format\": {\n-                                \"description\": \"Specifies the format to use when reading/writing Time fields. If not specified, Time fields will be assumed to be number of milliseconds since epoch (Midnight, Jan 1, 1970 GMT). If specified, the value must match the Java Simple Date Format (for example, HH:mm:ss for a two-digit hour in 24-hour format, followed by a two-digit minute, followed by a two-digit second, all separated by ':' characters, as in 18:04:15).\",\n-                                \"displayName\": \"Time Format\",\n+                                \"description\": \"The maximum rate at which FlowFiles should pass through this processor. The format of this property is expected to be a positive integer representing FlowFiles count per Time Duration\",\n+                                \"displayName\": \"Maximum FlowFile Rate\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Time Format\",\n+                                \"name\": \"Maximum FlowFile Rate\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Timestamp Format\": {\n-                                \"description\": \"Specifies the format to use when reading/writing Timestamp fields. If not specified, Timestamp fields will be assumed to be number of milliseconds since epoch (Midnight, Jan 1, 1970 GMT). If specified, the value must match the Java Simple Date Format (for example, MM/dd/yyyy HH:mm:ss for a two-digit month, followed by a two-digit day, followed by a four-digit year, all separated by '/' characters; and then followed by a two-digit hour in 24-hour format, followed by a two-digit minute, followed by a two-digit second, all separated by ':' characters, as in 01/01/2017 18:04:15).\",\n-                                \"displayName\": \"Timestamp Format\",\n+                            \"Maximum Rate\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"data rate\",\n+                                            \"attribute value\",\n+                                            \"flowfile count\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Rate Control Criteria\",\n+                                        \"propertyName\": \"Rate Control Criteria\"\n+                                    }\n+                                ],\n+                                \"description\": \"The maximum rate at which data should pass through this processor. The format of this property is expected to be a positive integer, or a Data Size (such as '1 MB') if Rate Control Criteria is set to 'data rate'.\",\n+                                \"displayName\": \"Maximum Rate\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Timestamp Format\",\n+                                \"name\": \"Maximum Rate\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"schema-access-strategy\": {\n+                            \"Rate Control Criteria\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"The name of the Schema to use is specified by the 'Schema Name' Property. The value of this property is used to lookup the Schema in the configured Schema Registry service.\",\n-                                        \"displayName\": \"Use 'Schema Name' Property\",\n-                                        \"value\": \"schema-name\"\n-                                    },\n-                                    {\n-                                        \"description\": \"The text of the Schema itself is specified by the 'Schema Text' Property. The value of this property must be a valid Avro Schema. If Expression Language is used, the value of the 'Schema Text' property must be valid after substituting the expressions.\",\n-                                        \"displayName\": \"Use 'Schema Text' Property\",\n-                                        \"value\": \"schema-text-property\"\n-                                    },\n-                                    {\n-                                        \"description\": \"The FlowFile contains 3 Attributes that will be used to lookup a Schema from the configured Schema Registry: 'schema.identifier', 'schema.version', and 'schema.protocol.version'\",\n-                                        \"displayName\": \"HWX Schema Reference Attributes\",\n-                                        \"value\": \"hwx-schema-ref-attributes\"\n+                                        \"description\": \"Rate is controlled by counting bytes transferred per time duration.\",\n+                                        \"displayName\": \"data rate\",\n+                                        \"value\": \"data rate\"\n                                     },\n                                     {\n-                                        \"description\": \"The content of the FlowFile contains a reference to a schema in the Schema Registry service. The reference is encoded as a single byte indicating the 'protocol version', followed by 8 bytes indicating the schema identifier, and finally 4 bytes indicating the schema version, as per the Hortonworks Schema Registry serializers and deserializers, found at https://github.com/hortonworks/registry\",\n-                                        \"displayName\": \"HWX Content-Encoded Schema Reference\",\n-                                        \"value\": \"hwx-content-encoded-schema\"\n+                                        \"description\": \"Rate is controlled by counting FlowFiles transferred per time duration\",\n+                                        \"displayName\": \"flowfile count\",\n+                                        \"value\": \"flowfile count\"\n                                     },\n                                     {\n-                                        \"description\": \"The content of the FlowFile contains a reference to a schema in the Schema Registry service. The reference is encoded as a single 'Magic Byte' followed by 4 bytes representing the identifier of the schema, as outlined at http://docs.confluent.io/current/schema-registry/docs/serializer-formatter.html. This is based on version 3.2.x of the Confluent Schema Registry.\",\n-                                        \"displayName\": \"Confluent Content-Encoded Schema Reference\",\n-                                        \"value\": \"confluent-encoded\"\n+                                        \"description\": \"Rate is controlled by accumulating the value of a specified attribute that is transferred per time duration\",\n+                                        \"displayName\": \"attribute value\",\n+                                        \"value\": \"attribute value\"\n                                     },\n                                     {\n-                                        \"description\": \"The Schema of the data will be inferred automatically when the data is read. See component Usage and Additional Details for information about how the schema is inferred.\",\n-                                        \"displayName\": \"Infer Schema\",\n-                                        \"value\": \"infer-schema\"\n+                                        \"description\": \"Rate is controlled by counting bytes and FlowFiles transferred per time duration; if either threshold is met, throttling is enforced\",\n+                                        \"displayName\": \"data rate or flowfile count\",\n+                                        \"value\": \"data rate or flowfile count\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"infer-schema\",\n-                                \"description\": \"Specifies how to obtain the schema that is to be used for interpreting the data.\",\n-                                \"displayName\": \"Schema Access Strategy\",\n+                                \"defaultValue\": \"data rate\",\n+                                \"description\": \"Indicates the criteria that is used to control the throughput rate. Changing this value resets the rate counters.\",\n+                                \"displayName\": \"Rate Control Criteria\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"schema-access-strategy\",\n+                                \"name\": \"Rate Control Criteria\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"schema-branch\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"schema-name\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n-                                        \"propertyName\": \"schema-access-strategy\"\n-                                    }\n-                                ],\n-                                \"description\": \"Specifies the name of the branch to use when looking up the schema in the Schema Registry property. If the chosen Schema Registry does not support branching, this value will be ignored.\",\n-                                \"displayName\": \"Schema Branch\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"schema-branch\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"schema-name\": {\n-                                \"defaultValue\": \"${schema.name}\",\n+                            \"Rate Controlled Attribute\": {\n                                 \"dependencies\": [\n                                     {\n                                         \"dependentValues\": [\n-                                            \"schema-name\"\n+                                            \"attribute value\"\n                                         ],\n-                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n-                                        \"propertyName\": \"schema-access-strategy\"\n+                                        \"propertyDisplayName\": \"Rate Control Criteria\",\n+                                        \"propertyName\": \"Rate Control Criteria\"\n                                     }\n                                 ],\n-                                \"description\": \"Specifies the name of the schema to lookup in the Schema Registry property\",\n-                                \"displayName\": \"Schema Name\",\n+                                \"description\": \"The name of an attribute whose values build toward the rate limit if Rate Control Criteria is set to 'attribute value'. The value of the attribute referenced by this property must be a positive long, or the FlowFile will be routed to failure. This value is ignored if Rate Control Criteria is not set to 'attribute value'. Changing this value resets the rate counters.\",\n+                                \"displayName\": \"Rate Controlled Attribute\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"schema-name\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Rate Controlled Attribute\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"schema-registry\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"confluent-encoded\",\n-                                            \"schema-name\",\n-                                            \"hwx-schema-ref-attributes\",\n-                                            \"hwx-content-encoded-schema\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n-                                        \"propertyName\": \"schema-access-strategy\"\n-                                    }\n-                                ],\n-                                \"description\": \"Specifies the Controller Service to use for the Schema Registry\",\n-                                \"displayName\": \"Schema Registry\",\n+                            \"Time Duration\": {\n+                                \"defaultValue\": \"1 min\",\n+                                \"description\": \"The amount of time to which the Maximum Rate pertains. Changing this value resets the rate counters.\",\n+                                \"displayName\": \"Time Duration\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"schema-registry\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.schemaregistry.services.SchemaRegistry\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n+                                \"name\": \"Time Duration\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            }\n+                        },\n+                        \"sideEffectFree\": true,\n+                        \"supportedRelationships\": [\n+                            {\n+                                \"description\": \"FlowFiles are transferred to this relationship under normal conditions\",\n+                                \"name\": \"success\"\n                             },\n-                            \"schema-text\": {\n-                                \"defaultValue\": \"${avro.schema}\",\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"schema-text-property\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n-                                        \"propertyName\": \"schema-access-strategy\"\n-                                    }\n-                                ],\n-                                \"description\": \"The text of an Avro-formatted Schema\",\n-                                \"displayName\": \"Schema Text\",\n+                            {\n+                                \"description\": \"FlowFiles will be routed to this relationship if they are missing a necessary Rate Controlled Attribute or the attribute is not in the expected format\",\n+                                \"name\": \"failure\"\n+                            }\n+                        ],\n+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\"\n+                        ],\n+                        \"supportsBatching\": false,\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicRelationships\": false,\n+                        \"supportsEventDriven\": false,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"rate\",\n+                            \"rate control\",\n+                            \"throttle\",\n+                            \"throughput\"\n+                        ],\n+                        \"triggerSerially\": true,\n+                        \"triggerWhenAnyDestinationAvailable\": false,\n+                        \"triggerWhenEmpty\": false,\n+                        \"type\": \"org.apache.nifi.processors.standard.ControlRate\",\n+                        \"typeDescription\": \"Controls the rate at which data is transferred to follow-on processors. If you configure a very small Time Duration, then the accuracy of the throttle gets worse. You can improve this accuracy by decreasing the Yield Duration, at the expense of more Tasks given to the processor.\",\n+                        \"version\": \"1.27.0\"\n+                    },\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-standard-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"e0c4461\"\n+                        },\n+                        \"defaultBulletinLevel\": \"WARN\",\n+                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": 1,\n+                            \"EVENT_DRIVEN\": 0,\n+                            \"TIMER_DRIVEN\": 1\n+                        },\n+                        \"defaultPenaltyDuration\": \"30 sec\",\n+                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": \"* * * * * ?\",\n+                            \"TIMER_DRIVEN\": \"0 sec\"\n+                        },\n+                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n+                        \"defaultYieldDuration\": \"1 sec\",\n+                        \"group\": \"org.apache.nifi\",\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n+                        \"primaryNodeOnly\": false,\n+                        \"propertyDescriptors\": {\n+                            \"Input Character Set\": {\n+                                \"description\": \"The name of the CharacterSet to expect for Input\",\n+                                \"displayName\": \"Input Character Set\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"schema-text\",\n-                                \"required\": false,\n+                                \"name\": \"Input Character Set\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"schema-version\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"schema-name\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n-                                        \"propertyName\": \"schema-access-strategy\"\n-                                    }\n-                                ],\n-                                \"description\": \"Specifies the version of the schema to lookup in the Schema Registry. If not specified then the latest version of the schema will be retrieved.\",\n-                                \"displayName\": \"Schema Version\",\n+                            \"Output Character Set\": {\n+                                \"description\": \"The name of the CharacterSet to convert to\",\n+                                \"displayName\": \"Output Character Set\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"schema-version\",\n-                                \"required\": false,\n+                                \"name\": \"Output Character Set\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             }\n                         },\n-                        \"providedApiImplementations\": [\n+                        \"sideEffectFree\": true,\n+                        \"supportedRelationships\": [\n                             {\n-                                \"artifact\": \"nifi-standard-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n-                                \"version\": \"1.27.0\"\n+                                \"description\": \"\",\n+                                \"name\": \"success\"\n                             }\n                         ],\n+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\",\n+                            \"EVENT_DRIVEN\"\n+                        ],\n+                        \"supportsBatching\": true,\n                         \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicRelationships\": false,\n+                        \"supportsEventDriven\": true,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"cell\",\n-                            \"excel\",\n-                            \"parse\",\n-                            \"reader\",\n-                            \"record\",\n-                            \"row\",\n-                            \"spreadsheet\",\n-                            \"values\",\n-                            \"xlsx\"\n+                            \"character set\",\n+                            \"characterset\",\n+                            \"convert\",\n+                            \"text\"\n                         ],\n-                        \"type\": \"org.apache.nifi.excel.ExcelReader\",\n-                        \"typeDescription\": \"Parses a Microsoft Excel document returning each row in each sheet as a separate record. This reader allows for inferring a schema from all the required sheets or providing an explicit schema for interpreting the values.See Controller Service's Usage for further documentation. This reader is currently only capable of processing .xlsx (XSSF 2007 OOXML file format) Excel documents and not older .xls (HSSF '97(-2007) file format) documents.\",\n+                        \"triggerSerially\": false,\n+                        \"triggerWhenAnyDestinationAvailable\": false,\n+                        \"triggerWhenEmpty\": false,\n+                        \"type\": \"org.apache.nifi.processors.standard.ConvertCharacterSet\",\n+                        \"typeDescription\": \"Converts a FlowFile's content from one character set to another\",\n                         \"version\": \"1.27.0\"\n-                    }\n-                ],\n-                \"processors\": [\n+                    },\n                     {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-poi-nar\",\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -79952,3952 +77215,5411 @@\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n-                        \"deprecated\": true,\n-                        \"deprecationAlternatives\": [\n-                            \"org.apache.nifi.csv.CSVRecordSetWriter\",\n-                            \"org.apache.nifi.excel.ExcelReader\",\n-                            \"org.apache.nifi.processors.standard.ConvertRecord\"\n-                        ],\n-                        \"deprecationReason\": \"ConvertExcelToCSVProcessor is no longer needed since there is now the ExcelReader which along with CSVRecordSetWriter can be used in ConvertRecord to achieve the same thing.\",\n                         \"group\": \"org.apache.nifi\",\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"CSV Format\": {\n+                            \"Catalog Name\": {\n+                                \"description\": \"The name of the catalog that the statement should update. This may not apply for the database that you are updating. In this case, leave the field empty\",\n+                                \"displayName\": \"Catalog Name\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Catalog Name\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"JDBC Connection Pool\": {\n+                                \"description\": \"Specifies the JDBC Connection Pool to use in order to convert the JSON message to a SQL statement. The Connection Pool is necessary in order to determine the appropriate database column types.\",\n+                                \"displayName\": \"JDBC Connection Pool\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"JDBC Connection Pool\",\n+                                \"required\": true,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.dbcp.DBCPService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"Schema Name\": {\n+                                \"description\": \"The name of the schema that the table belongs to. This may not apply for the database that you are updating. In this case, leave the field empty\",\n+                                \"displayName\": \"Schema Name\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Schema Name\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Statement Type\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"The format of the CSV is configured by using the properties of this Controller Service, such as Value Separator\",\n-                                        \"displayName\": \"Custom Format\",\n-                                        \"value\": \"custom\"\n-                                    },\n-                                    {\n-                                        \"description\": \"CSV data follows the RFC 4180 Specification defined at https://tools.ietf.org/html/rfc4180\",\n-                                        \"displayName\": \"RFC 4180\",\n-                                        \"value\": \"rfc-4180\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"UPDATE\",\n+                                        \"value\": \"UPDATE\"\n                                     },\n                                     {\n-                                        \"description\": \"CSV data follows the format used by Microsoft Excel\",\n-                                        \"displayName\": \"Microsoft Excel\",\n-                                        \"value\": \"excel\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"INSERT\",\n+                                        \"value\": \"INSERT\"\n                                     },\n                                     {\n-                                        \"description\": \"CSV data is Tab-Delimited instead of Comma Delimited\",\n-                                        \"displayName\": \"Tab-Delimited\",\n-                                        \"value\": \"tdf\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"DELETE\",\n+                                        \"value\": \"DELETE\"\n                                     },\n                                     {\n-                                        \"description\": \"CSV data follows the format used by MySQL\",\n-                                        \"displayName\": \"MySQL Format\",\n-                                        \"value\": \"mysql\"\n-                                    },\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Use statement.type Attribute\",\n+                                        \"value\": \"Use statement.type Attribute\"\n+                                    }\n+                                ],\n+                                \"description\": \"Specifies the type of SQL Statement to generate\",\n+                                \"displayName\": \"Statement Type\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Statement Type\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Table Name\": {\n+                                \"description\": \"The name of the table that the statement should update\",\n+                                \"displayName\": \"Table Name\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Table Name\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Translate Field Names\": {\n+                                \"allowableValues\": [\n                                     {\n-                                        \"description\": \"The format used by Informix when issuing the UNLOAD TO file_name command\",\n-                                        \"displayName\": \"Informix Unload\",\n-                                        \"value\": \"informix-unload\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n-                                        \"description\": \"The format used by Informix when issuing the UNLOAD TO file_name command with escaping disabled\",\n-                                        \"displayName\": \"Informix Unload Escape Disabled\",\n-                                        \"value\": \"informix-unload-csv\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"custom\",\n-                                \"description\": \"Specifies which \\\"format\\\" the CSV data is in, or specifies if custom formatting should be used.\",\n-                                \"displayName\": \"CSV Format\",\n+                                \"defaultValue\": \"true\",\n+                                \"description\": \"If true, the Processor will attempt to translate JSON field names into the appropriate column names for the table specified. If false, the JSON field names must match the column names exactly, or the column will not be updated\",\n+                                \"displayName\": \"Translate Field Names\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"CSV Format\",\n-                                \"required\": true,\n+                                \"name\": \"Translate Field Names\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Comment Marker\": {\n-                                \"dependencies\": [\n+                            \"Unmatched Column Behavior\": {\n+                                \"allowableValues\": [\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"custom\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"CSV Format\",\n-                                        \"propertyName\": \"CSV Format\"\n+                                        \"description\": \"Any column in the database that does not have a field in the JSON document will be assumed to not be required.  No notification will be logged\",\n+                                        \"displayName\": \"Ignore Unmatched Columns\",\n+                                        \"value\": \"Ignore Unmatched Columns\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Any column in the database that does not have a field in the JSON document will be assumed to not be required.  A warning will be logged\",\n+                                        \"displayName\": \"Warn on Unmatched Columns\",\n+                                        \"value\": \"Warn on Unmatched Columns\"\n+                                    },\n+                                    {\n+                                        \"description\": \"A flow will fail if any column in the database that does not have a field in the JSON document.  An error will be logged\",\n+                                        \"displayName\": \"Fail on Unmatched Columns\",\n+                                        \"value\": \"Fail on Unmatched Columns\"\n                                     }\n                                 ],\n-                                \"description\": \"The character that is used to denote the start of a comment. Any line that begins with this comment will be ignored.\",\n-                                \"displayName\": \"Comment Marker\",\n+                                \"defaultValue\": \"Fail on Unmatched Columns\",\n+                                \"description\": \"If an incoming JSON element does not have a field mapping for all of the database table's columns, this property specifies how to handle the situation\",\n+                                \"displayName\": \"Unmatched Column Behavior\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Comment Marker\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Unmatched Column Behavior\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Escape Character\": {\n-                                \"defaultValue\": \"\\\\\",\n-                                \"dependencies\": [\n+                            \"Unmatched Field Behavior\": {\n+                                \"allowableValues\": [\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"custom\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"CSV Format\",\n-                                        \"propertyName\": \"CSV Format\"\n+                                        \"description\": \"Any field in the JSON document that cannot be mapped to a column in the database is ignored\",\n+                                        \"displayName\": \"Ignore Unmatched Fields\",\n+                                        \"value\": \"Ignore Unmatched Fields\"\n+                                    },\n+                                    {\n+                                        \"description\": \"If the JSON document has any field that cannot be mapped to a column in the database, the FlowFile will be routed to the failure relationship\",\n+                                        \"displayName\": \"Fail\",\n+                                        \"value\": \"Fail\"\n                                     }\n                                 ],\n-                                \"description\": \"The character that is used to escape characters that would otherwise have a specific meaning to the CSV Parser. If the property has been specified via Expression Language but the expression gets evaluated to an invalid Escape Character at runtime, then it will be skipped and the default Escape Character will be used. Setting it to an empty string means no escape character should be used.\",\n-                                \"displayName\": \"Escape Character\",\n+                                \"defaultValue\": \"Ignore Unmatched Fields\",\n+                                \"description\": \"If an incoming JSON element has a field that does not map to any of the database table's columns, this property specifies how to handle the situation\",\n+                                \"displayName\": \"Unmatched Field Behavior\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Unmatched Field Behavior\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Update Keys\": {\n+                                \"description\": \"A comma-separated list of column names that uniquely identifies a row in the database for UPDATE statements. If the Statement Type is UPDATE and this property is not set, the table's Primary Keys are used. In this case, if no Primary Key exists, the conversion to SQL will fail if Unmatched Column Behaviour is set to FAIL. This property is ignored if the Statement Type is INSERT\",\n+                                \"displayName\": \"Update Keys\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Escape Character\",\n-                                \"required\": true,\n+                                \"name\": \"Update Keys\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Include Header Line\": {\n+                            \"jts-quoted-identifiers\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"true\",\n                                         \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"false\",\n                                         \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"true\",\n-                                \"description\": \"Specifies whether or not the CSV column names should be written out as the first line.\",\n-                                \"displayName\": \"Include Header Line\",\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"Enabling this option will cause all column names to be quoted, allowing you to use reserved words as column names in your tables.\",\n+                                \"displayName\": \"Quote Column Identifiers\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Include Header Line\",\n-                                \"required\": true,\n+                                \"name\": \"jts-quoted-identifiers\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Include Trailing Delimiter\": {\n+                            \"jts-quoted-table-identifiers\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"true\",\n                                         \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"false\",\n                                         \"value\": \"false\"\n                                     }\n                                 ],\n                                 \"defaultValue\": \"false\",\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"custom\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"CSV Format\",\n-                                        \"propertyName\": \"CSV Format\"\n-                                    }\n-                                ],\n-                                \"description\": \"If true, a trailing delimiter will be added to each CSV Record that is written. If false, the trailing delimiter will be omitted.\",\n-                                \"displayName\": \"Include Trailing Delimiter\",\n+                                \"description\": \"Enabling this option will cause the table name to be quoted to support the use of special characters in the table name\",\n+                                \"displayName\": \"Quote Table Identifiers\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Include Trailing Delimiter\",\n+                                \"name\": \"jts-quoted-table-identifiers\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"jts-sql-param-attr-prefix\": {\n+                                \"defaultValue\": \"sql\",\n+                                \"description\": \"The string to be prepended to the outgoing flow file attributes, such as <sql>.args.1.value, where <sql> is replaced with the specified value\",\n+                                \"displayName\": \"SQL Parameter Attribute Prefix\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"jts-sql-param-attr-prefix\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Null String\": {\n-                                \"dependencies\": [\n+                            \"table-schema-cache-size\": {\n+                                \"defaultValue\": \"100\",\n+                                \"description\": \"Specifies how many Table Schemas should be cached\",\n+                                \"displayName\": \"Table Schema Cache Size\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"table-schema-cache-size\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            }\n+                        },\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.processors.standard.PutDatabaseRecord\",\n+                            \"org.apache.nifi.processors.standard.PutSQL\"\n+                        ],\n+                        \"sideEffectFree\": true,\n+                        \"supportedRelationships\": [\n+                            {\n+                                \"description\": \"A FlowFile is routed to this relationship when its contents have successfully been converted into a SQL statement\",\n+                                \"name\": \"sql\"\n+                            },\n+                            {\n+                                \"description\": \"A FlowFile is routed to this relationship if it cannot be converted into a SQL statement. Common causes include invalid JSON content or the JSON content missing a required field (if using an INSERT statement type).\",\n+                                \"name\": \"failure\"\n+                            },\n+                            {\n+                                \"description\": \"When a FlowFile is converted to SQL, the original JSON FlowFile is routed to this relationship\",\n+                                \"name\": \"original\"\n+                            }\n+                        ],\n+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\"\n+                        ],\n+                        \"supportsBatching\": true,\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicRelationships\": false,\n+                        \"supportsEventDriven\": false,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"database\",\n+                            \"delete\",\n+                            \"flat\",\n+                            \"insert\",\n+                            \"json\",\n+                            \"rdbms\",\n+                            \"relational\",\n+                            \"sql\",\n+                            \"update\"\n+                        ],\n+                        \"triggerSerially\": false,\n+                        \"triggerWhenAnyDestinationAvailable\": false,\n+                        \"triggerWhenEmpty\": false,\n+                        \"type\": \"org.apache.nifi.processors.standard.ConvertJSONToSQL\",\n+                        \"typeDescription\": \"Converts a JSON-formatted FlowFile into an UPDATE, INSERT, or DELETE SQL statement. The incoming FlowFile is expected to be \\\"flat\\\" JSON message, meaning that it consists of a single JSON element and each field maps to a simple type. If a field maps to a JSON object, that JSON object will be interpreted as Text. If the input is an array of JSON elements, each element in the array is output as a separate FlowFile to the 'sql' relationship. Upon successful conversion, the original FlowFile is routed to the 'original' relationship and the SQL is routed to the 'sql' relationship.\",\n+                        \"version\": \"1.27.0\",\n+                        \"writesAttributes\": [\n+                            {\n+                                \"description\": \"Sets mime.type of FlowFile that is routed to 'sql' to 'text/plain'.\",\n+                                \"name\": \"mime.type\"\n+                            },\n+                            {\n+                                \"description\": \"Sets the <sql>.table attribute of FlowFile that is routed to 'sql' to the name of the table that is updated by the SQL statement. The prefix for this attribute ('sql', e.g.) is determined by the SQL Parameter Attribute Prefix property.\",\n+                                \"name\": \"<sql>.table\"\n+                            },\n+                            {\n+                                \"description\": \"If the Catalog name is set for this database, specifies the name of the catalog that the SQL statement will update. If no catalog is used, this attribute will not be added. The prefix for this attribute ('sql', e.g.) is determined by the SQL Parameter Attribute Prefix property.\",\n+                                \"name\": \"<sql>.catalog\"\n+                            },\n+                            {\n+                                \"description\": \"All FlowFiles routed to the 'sql' relationship for the same incoming FlowFile (multiple will be output for the same incoming FlowFile if the incoming FlowFile is a JSON Array) will have the same value for the fragment.identifier attribute. This can then be used to correlate the results.\",\n+                                \"name\": \"fragment.identifier\"\n+                            },\n+                            {\n+                                \"description\": \"The number of SQL FlowFiles that were produced for same incoming FlowFile. This can be used in conjunction with the fragment.identifier attribute in order to know how many FlowFiles belonged to the same incoming FlowFile.\",\n+                                \"name\": \"fragment.count\"\n+                            },\n+                            {\n+                                \"description\": \"The position of this FlowFile in the list of outgoing FlowFiles that were all derived from the same incoming FlowFile. This can be used in conjunction with the fragment.identifier and fragment.count attributes to know which FlowFiles originated from the same incoming FlowFile and in what order the SQL FlowFiles were produced\",\n+                                \"name\": \"fragment.index\"\n+                            },\n+                            {\n+                                \"description\": \"The output SQL statements are parametrized in order to avoid SQL Injection Attacks. The types of the Parameters to use are stored in attributes named <sql>.args.1.type, <sql>.args.2.type, <sql>.args.3.type, and so on. The type is a number representing a JDBC Type constant. Generally, this is useful only for software to read and interpret but is added so that a processor such as PutSQL can understand how to interpret the values. The prefix for this attribute ('sql', e.g.) is determined by the SQL Parameter Attribute Prefix property.\",\n+                                \"name\": \"<sql>.args.N.type\"\n+                            },\n+                            {\n+                                \"description\": \"The output SQL statements are parametrized in order to avoid SQL Injection Attacks. The values of the Parameters to use are stored in the attributes named sql.args.1.value, sql.args.2.value, sql.args.3.value, and so on. Each of these attributes has a corresponding <sql>.args.N.type attribute that indicates how the value should be interpreted when inserting it into the database.The prefix for this attribute ('sql', e.g.) is determined by the SQL Parameter Attribute Prefix property.\",\n+                                \"name\": \"<sql>.args.N.value\"\n+                            }\n+                        ]\n+                    },\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-standard-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"e0c4461\"\n+                        },\n+                        \"defaultBulletinLevel\": \"WARN\",\n+                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": 1,\n+                            \"EVENT_DRIVEN\": 0,\n+                            \"TIMER_DRIVEN\": 1\n+                        },\n+                        \"defaultPenaltyDuration\": \"30 sec\",\n+                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": \"* * * * * ?\",\n+                            \"TIMER_DRIVEN\": \"0 sec\"\n+                        },\n+                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n+                        \"defaultYieldDuration\": \"1 sec\",\n+                        \"group\": \"org.apache.nifi\",\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n+                        \"primaryNodeOnly\": false,\n+                        \"propertyDescriptors\": {\n+                            \"include-zero-record-flowfiles\": {\n+                                \"allowableValues\": [\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"custom\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"CSV Format\",\n-                                        \"propertyName\": \"CSV Format\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"description\": \"Specifies a String that, if present as a value in the CSV, should be considered a null field instead of using the literal value.\",\n-                                \"displayName\": \"Null String\",\n+                                \"defaultValue\": \"true\",\n+                                \"description\": \"When converting an incoming FlowFile, if the conversion results in no data, this property specifies whether or not a FlowFile will be sent to the corresponding relationship\",\n+                                \"displayName\": \"Include Zero Record FlowFiles\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Null String\",\n-                                \"required\": false,\n+                                \"name\": \"include-zero-record-flowfiles\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Quote Character\": {\n-                                \"defaultValue\": \"\\\"\",\n-                                \"dependencies\": [\n+                            \"record-reader\": {\n+                                \"description\": \"Specifies the Controller Service to use for reading incoming data\",\n+                                \"displayName\": \"Record Reader\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"record-reader\",\n+                                \"required\": true,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"record-writer\": {\n+                                \"description\": \"Specifies the Controller Service to use for writing out the records\",\n+                                \"displayName\": \"Record Writer\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"record-writer\",\n+                                \"required\": true,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            }\n+                        },\n+                        \"sideEffectFree\": true,\n+                        \"supportedRelationships\": [\n+                            {\n+                                \"description\": \"FlowFiles that are successfully transformed will be routed to this relationship\",\n+                                \"name\": \"success\"\n+                            },\n+                            {\n+                                \"description\": \"If a FlowFile cannot be transformed from the configured input format to the configured output format, the unchanged FlowFile will be routed to this relationship\",\n+                                \"name\": \"failure\"\n+                            }\n+                        ],\n+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\",\n+                            \"EVENT_DRIVEN\"\n+                        ],\n+                        \"supportsBatching\": true,\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicRelationships\": false,\n+                        \"supportsEventDriven\": true,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"avro\",\n+                            \"convert\",\n+                            \"csv\",\n+                            \"freeform\",\n+                            \"generic\",\n+                            \"json\",\n+                            \"log\",\n+                            \"logs\",\n+                            \"record\",\n+                            \"schema\",\n+                            \"text\"\n+                        ],\n+                        \"triggerSerially\": false,\n+                        \"triggerWhenAnyDestinationAvailable\": false,\n+                        \"triggerWhenEmpty\": false,\n+                        \"type\": \"org.apache.nifi.processors.standard.ConvertRecord\",\n+                        \"typeDescription\": \"Converts records from one data format to another using configured Record Reader and Record Write Controller Services. The Reader and Writer must be configured with \\\"matching\\\" schemas. By this, we mean the schemas must have the same field names. The types of the fields do not have to be the same if a field value can be coerced from one type to another. For instance, if the input schema has a field named \\\"balance\\\" of type double, the output schema can have a field named \\\"balance\\\" with a type of string, double, or float. If any field is present in the input that is not present in the output, the field will be left out of the output. If any field is specified in the output schema but is not present in the input data/schema, then the field will not be present in the output or will have a null value, depending on the writer.\",\n+                        \"version\": \"1.27.0\",\n+                        \"writesAttributes\": [\n+                            {\n+                                \"description\": \"Sets the mime.type attribute to the MIME Type specified by the Record Writer\",\n+                                \"name\": \"mime.type\"\n+                            },\n+                            {\n+                                \"description\": \"The number of records in the FlowFile\",\n+                                \"name\": \"record.count\"\n+                            },\n+                            {\n+                                \"description\": \"This attribute provides on failure the error message encountered by the Reader or Writer.\",\n+                                \"name\": \"record.error.message\"\n+                            }\n+                        ]\n+                    },\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-standard-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"e0c4461\"\n+                        },\n+                        \"defaultBulletinLevel\": \"WARN\",\n+                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": 1,\n+                            \"EVENT_DRIVEN\": 0,\n+                            \"TIMER_DRIVEN\": 1\n+                        },\n+                        \"defaultPenaltyDuration\": \"30 sec\",\n+                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": \"* * * * * ?\",\n+                            \"TIMER_DRIVEN\": \"0 sec\"\n+                        },\n+                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n+                        \"defaultYieldDuration\": \"1 sec\",\n+                        \"group\": \"org.apache.nifi\",\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n+                        \"primaryNodeOnly\": false,\n+                        \"propertyDescriptors\": {\n+                            \"ajust-immediately\": {\n+                                \"allowableValues\": [\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"custom\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"CSV Format\",\n-                                        \"propertyName\": \"CSV Format\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"description\": \"The character that is used to quote values so that escape characters do not have to be used. If the property has been specified via Expression Language but the expression gets evaluated to an invalid Quote Character at runtime, then it will be skipped and the default Quote Character will be used.\",\n-                                \"displayName\": \"Quote Character\",\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"If true, the counter will be updated immediately, without regard to whether the ProcessSession is commit or rolled back;otherwise, the counter will be incremented only if and when the ProcessSession is committed.\",\n+                                \"displayName\": \"Call Immediate Adjustment\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Quote Character\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"ajust-immediately\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Quote Mode\": {\n+                            \"character-encoding\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"All values will be quoted using the configured quote character.\",\n-                                        \"displayName\": \"Quote All Values\",\n-                                        \"value\": \"ALL\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"ISO-8859-1\",\n+                                        \"value\": \"ISO-8859-1\"\n                                     },\n                                     {\n-                                        \"description\": \"Values will be quoted only if they are contain special characters such as newline characters or field separators.\",\n-                                        \"displayName\": \"Quote Minimal\",\n-                                        \"value\": \"MINIMAL\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"UTF-8\",\n+                                        \"value\": \"UTF-8\"\n                                     },\n                                     {\n-                                        \"description\": \"Values will be quoted unless the value is a number.\",\n-                                        \"displayName\": \"Quote Non-Numeric Values\",\n-                                        \"value\": \"NON_NUMERIC\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"UTF-16\",\n+                                        \"value\": \"UTF-16\"\n                                     },\n                                     {\n-                                        \"description\": \"Values will not be quoted. Instead, all special characters will be escaped using the configured escape character.\",\n-                                        \"displayName\": \"Do Not Quote Values\",\n-                                        \"value\": \"NONE\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"NONE\",\n-                                \"dependencies\": [\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"UTF-16LE\",\n+                                        \"value\": \"UTF-16LE\"\n+                                    },\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"custom\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"CSV Format\",\n-                                        \"propertyName\": \"CSV Format\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"UTF-16BE\",\n+                                        \"value\": \"UTF-16BE\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"US-ASCII\",\n+                                        \"value\": \"US-ASCII\"\n                                     }\n                                 ],\n-                                \"description\": \"Specifies how fields should be quoted when they are written\",\n-                                \"displayName\": \"Quote Mode\",\n+                                \"defaultValue\": \"UTF-8\",\n+                                \"description\": \"Specifies a character encoding to use.\",\n+                                \"displayName\": \"Character Encoding\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Quote Mode\",\n+                                \"name\": \"character-encoding\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Record Separator\": {\n-                                \"defaultValue\": \"\\\\n\",\n-                                \"dependencies\": [\n+                            \"split-words-on-symbols\": {\n+                                \"allowableValues\": [\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"custom\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"CSV Format\",\n-                                        \"propertyName\": \"CSV Format\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"description\": \"Specifies the characters to use in order to separate CSV Records\",\n-                                \"displayName\": \"Record Separator\",\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"If enabled, the word count will identify strings separated by common logical delimiters [ _ - . ] as independent words (ex. split-words-on-symbols = 4 words).\",\n+                                \"displayName\": \"Split Words on Symbols\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Record Separator\",\n+                                \"name\": \"split-words-on-symbols\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Trim Fields\": {\n+                            \"text-character-count\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"true\",\n                                         \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"false\",\n                                         \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"true\",\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"custom\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"CSV Format\",\n-                                        \"propertyName\": \"CSV Format\"\n-                                    }\n-                                ],\n-                                \"description\": \"Whether or not white space should be removed from the beginning and end of fields\",\n-                                \"displayName\": \"Trim Fields\",\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"If enabled, will count the number of characters (including whitespace and symbols, but not including newlines and carriage returns) present in the incoming text.\",\n+                                \"displayName\": \"Count Characters\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Trim Fields\",\n+                                \"name\": \"text-character-count\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Value Separator\": {\n-                                \"defaultValue\": \",\",\n-                                \"dependencies\": [\n+                            \"text-line-count\": {\n+                                \"allowableValues\": [\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"custom\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"CSV Format\",\n-                                        \"propertyName\": \"CSV Format\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"description\": \"The character that is used to separate values/fields in a CSV Record. If the property has been specified via Expression Language but the expression gets evaluated to an invalid Value Separator at runtime, then it will be skipped and the default Value Separator will be used.\",\n-                                \"displayName\": \"Value Separator\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Value Separator\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"excel-extract-column-to-skip\": {\n-                                \"description\": \"Comma delimited list of column numbers to skip. Use the columns number and not the letter designation. Use this to skip over columns anywhere in your worksheet that you don't want extracted as part of the record.\",\n-                                \"displayName\": \"Columns To Skip\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"excel-extract-column-to-skip\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"excel-extract-first-row\": {\n-                                \"defaultValue\": \"0\",\n-                                \"description\": \"The row number of the first row to start processing.Use this to skip over rows of data at the top of your worksheet that are not part of the dataset.Empty rows of data anywhere in the spreadsheet will always be skipped, no matter what this value is set to.\",\n-                                \"displayName\": \"Number of Rows to Skip\",\n+                                \"defaultValue\": \"true\",\n+                                \"description\": \"If enabled, will count the number of lines present in the incoming text.\",\n+                                \"displayName\": \"Count Lines\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"excel-extract-first-row\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"text-line-count\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"excel-format-booleans\": {\n+                            \"text-line-nonempty-count\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"true\",\n                                         \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"false\",\n                                         \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"true\",\n-                                \"description\": \"If true, true/false will be represented by TRUE/FALSE. If false, true/false will be represented by 0/1.\",\n-                                \"displayName\": \"Format Booleans\",\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"If enabled, will count the number of lines that contain a non-whitespace character present in the incoming text.\",\n+                                \"displayName\": \"Count Non-Empty Lines\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"excel-format-booleans\",\n+                                \"name\": \"text-line-nonempty-count\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"excel-format-values\": {\n+                            \"text-word-count\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"true\",\n                                         \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"false\",\n                                         \"value\": \"false\"\n                                     }\n                                 ],\n                                 \"defaultValue\": \"false\",\n-                                \"description\": \"Should the cell values be written to CSV using the formatting applied in Excel, or should they be printed as raw values.\",\n-                                \"displayName\": \"Format Cell Values\",\n+                                \"description\": \"If enabled, will count the number of words (alphanumeric character groups bounded by whitespace) present in the incoming text. Common logical delimiters [_-.] do not bound a word unless 'Split Words on Symbols' is true.\",\n+                                \"displayName\": \"Count Words\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"excel-format-values\",\n+                                \"name\": \"text-word-count\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n-                            },\n-                            \"extract-sheets\": {\n-                                \"description\": \"Comma separated list of Excel document sheet names that should be extracted from the excel document. If this property is left blank then all of the sheets will be extracted from the Excel document. The list of names is case in-sensitive. Any sheets not specified in this value will be ignored. A bulletin will be generated if a specified sheet(s) are not found.\",\n-                                \"displayName\": \"Sheets to Extract\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"extract-sheets\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n                             }\n                         },\n-                        \"sideEffectFree\": false,\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.processors.standard.SplitText\"\n+                        ],\n+                        \"sideEffectFree\": true,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"Original Excel document received by this processor\",\n-                                \"name\": \"original\"\n-                            },\n-                            {\n-                                \"description\": \"Excel data converted to csv\",\n+                                \"description\": \"The flowfile contains the original content with one or more attributes added containing the respective counts\",\n                                 \"name\": \"success\"\n                             },\n                             {\n-                                \"description\": \"Failed to parse the Excel document\",\n+                                \"description\": \"If the flowfile text cannot be counted for some reason, the original file will be routed to this destination and nothing will be routed elsewhere\",\n                                 \"name\": \"failure\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n+                            \"CRON_DRIVEN\",\n+                            \"EVENT_DRIVEN\"\n                         ],\n-                        \"supportsBatching\": false,\n+                        \"supportsBatching\": true,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": false,\n+                        \"supportsEventDriven\": true,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"csv\",\n-                            \"excel\",\n-                            \"poi\"\n+                            \"character\",\n+                            \"count\",\n+                            \"line\",\n+                            \"text\",\n+                            \"word\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.poi.ConvertExcelToCSVProcessor\",\n-                        \"typeDescription\": \"Consumes a Microsoft Excel document and converts each worksheet to csv. Each sheet from the incoming Excel document will generate a new Flowfile that will be output from this processor. Each output Flowfile's contents will be formatted as a csv file where the each row from the excel sheet is output as a newline in the csv file. This processor is currently only capable of processing .xlsx (XSSF 2007 OOXML file format) Excel documents and not older .xls (HSSF '97(-2007) file format) documents. This processor also expects well formatted CSV content and will not escape cell's containing invalid content such as newlines or additional commas.\",\n+                        \"type\": \"org.apache.nifi.processors.standard.CountText\",\n+                        \"typeDescription\": \"Counts various metrics on incoming text. The requested results will be recorded as attributes. The resulting flowfile will not have its content modified.\",\n                         \"version\": \"1.27.0\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"The name of the Excel sheet that this particular row of data came from in the Excel document\",\n-                                \"name\": \"sheetname\"\n+                                \"description\": \"The number of lines of text present in the FlowFile content\",\n+                                \"name\": \"text.line.count\"\n                             },\n                             {\n-                                \"description\": \"The number of rows in this Excel Sheet\",\n-                                \"name\": \"numrows\"\n+                                \"description\": \"The number of lines of text (with at least one non-whitespace character) present in the original FlowFile\",\n+                                \"name\": \"text.line.nonempty.count\"\n                             },\n                             {\n-                                \"description\": \"The name of the Excel document file that this data originated from\",\n-                                \"name\": \"sourcefilename\"\n+                                \"description\": \"The number of words present in the original FlowFile\",\n+                                \"name\": \"text.word.count\"\n                             },\n                             {\n-                                \"description\": \"Error message that was encountered on a per Excel sheet basis. This attribute is only populated if an error was occured while processing the particular sheet. Having the error present at the sheet level will allow for the end user to better understand what syntax errors in their excel doc on a larger scale caused the error.\",\n-                                \"name\": \"convertexceltocsvprocessor.error\"\n+                                \"description\": \"The number of characters (given the specified character encoding) present in the original FlowFile\",\n+                                \"name\": \"text.character.count\"\n                             }\n                         ]\n                     },\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-poi-nar\",\n+                        \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n+                            \"EVENT_DRIVEN\": 0,\n                             \"TIMER_DRIVEN\": 1\n                         },\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n+                        \"deprecated\": true,\n+                        \"deprecationAlternatives\": [\n+                            \"org.apache.nifi.processors.attributes.UpdateAttribute\"\n+                        ],\n+                        \"deprecationReason\": \"UpdateAttribute can be configured using the hash Expression Language function to digest one or more attributes\",\n+                        \"dynamicProperties\": [\n+                            {\n+                                \"description\": \"The property name defines the attribute to look for and hash in the incoming flowfile. The property value defines the name to give the generated attribute. Attribute names must be unique.\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"name\": \"A flowfile attribute key for attribute inspection\",\n+                                \"value\": \"Attribute Name\"\n+                            }\n+                        ],\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Password\": {\n-                                \"dependencies\": [\n+                            \"character_set\": {\n+                                \"allowableValues\": [\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"PASSWORD\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Protection Type\",\n-                                        \"propertyName\": \"Protection Type\"\n+                                        \"description\": \"US-ASCII\",\n+                                        \"displayName\": \"US-ASCII\",\n+                                        \"value\": \"US-ASCII\"\n+                                    },\n+                                    {\n+                                        \"description\": \"ISO-8859-1\",\n+                                        \"displayName\": \"ISO-8859-1\",\n+                                        \"value\": \"ISO-8859-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"UTF-8\",\n+                                        \"displayName\": \"UTF-8\",\n+                                        \"value\": \"UTF-8\"\n+                                    },\n+                                    {\n+                                        \"description\": \"UTF-16BE\",\n+                                        \"displayName\": \"UTF-16BE\",\n+                                        \"value\": \"UTF-16BE\"\n+                                    },\n+                                    {\n+                                        \"description\": \"UTF-16LE\",\n+                                        \"displayName\": \"UTF-16LE\",\n+                                        \"value\": \"UTF-16LE\"\n+                                    },\n+                                    {\n+                                        \"description\": \"This character set normally decodes using an optional BOM at the beginning of the data but encodes by inserting a BE BOM. For hashing, it will be replaced with UTF-16BE. \",\n+                                        \"displayName\": \"UTF-16\",\n+                                        \"value\": \"UTF-16\"\n                                     }\n                                 ],\n-                                \"description\": \"The password for a password protected Excel spreadsheet\",\n-                                \"displayName\": \"Password\",\n+                                \"defaultValue\": \"UTF-8\",\n+                                \"description\": \"The Character Set used to decode the attribute being hashed -- this applies to the incoming data encoding, not the resulting hash encoding. \",\n+                                \"displayName\": \"Character Set\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Password\",\n+                                \"name\": \"character_set\",\n                                 \"required\": true,\n-                                \"sensitive\": true\n+                                \"sensitive\": false\n                             },\n-                            \"Protection Type\": {\n+                            \"fail_when_empty\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"An Excel spreadsheet not protected by a password\",\n-                                        \"displayName\": \"Unprotected\",\n-                                        \"value\": \"UNPROTECTED\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n-                                        \"description\": \"An Excel spreadsheet protected by a password\",\n-                                        \"displayName\": \"Password Protected\",\n-                                        \"value\": \"PASSWORD\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"UNPROTECTED\",\n-                                \"description\": \"Specifies whether an Excel spreadsheet is protected by a password or not.\",\n-                                \"displayName\": \"Protection Type\",\n+                                \"defaultValue\": \"true\",\n+                                \"description\": \"Route to failure when none of the attributes that are configured for hashing are found. If set to false, then flow files that do not contain any of the attributes that are configured for hashing will just pass through to success.\",\n+                                \"displayName\": \"Fail when no attributes present\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Protection Type\",\n+                                \"name\": \"fail_when_empty\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"hash_algorithm\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"MD2 (16 byte output) [WARNING -- Cryptographically broken] Cryptographically broken due to collisions\",\n+                                        \"displayName\": \"MD2\",\n+                                        \"value\": \"MD2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"MD5 (16 byte output) [WARNING -- Cryptographically broken] Cryptographically broken due to collisions\",\n+                                        \"displayName\": \"MD5\",\n+                                        \"value\": \"MD5\"\n+                                    },\n+                                    {\n+                                        \"description\": \"SHA-1 (20 byte output) [WARNING -- Cryptographically broken] Cryptographically broken due to collisions\",\n+                                        \"displayName\": \"SHA-1\",\n+                                        \"value\": \"SHA-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"SHA-224 (28 byte output) SHA-2 family\",\n+                                        \"displayName\": \"SHA-224\",\n+                                        \"value\": \"SHA-224\"\n+                                    },\n+                                    {\n+                                        \"description\": \"SHA-256 (32 byte output) SHA-2 family\",\n+                                        \"displayName\": \"SHA-256\",\n+                                        \"value\": \"SHA-256\"\n+                                    },\n+                                    {\n+                                        \"description\": \"SHA-384 (48 byte output) SHA-2 family\",\n+                                        \"displayName\": \"SHA-384\",\n+                                        \"value\": \"SHA-384\"\n+                                    },\n+                                    {\n+                                        \"description\": \"SHA-512 (64 byte output) SHA-2 family\",\n+                                        \"displayName\": \"SHA-512\",\n+                                        \"value\": \"SHA-512\"\n+                                    },\n+                                    {\n+                                        \"description\": \"SHA-512/224 (28 byte output) SHA-2 using SHA-512 with truncated output\",\n+                                        \"displayName\": \"SHA-512/224\",\n+                                        \"value\": \"SHA-512/224\"\n+                                    },\n+                                    {\n+                                        \"description\": \"SHA-512/256 (32 byte output) SHA-2 using SHA-512 with truncated output\",\n+                                        \"displayName\": \"SHA-512/256\",\n+                                        \"value\": \"SHA-512/256\"\n+                                    },\n+                                    {\n+                                        \"description\": \"SHA3-224 (28 byte output) Keccak-based SHA3 family\",\n+                                        \"displayName\": \"SHA3-224\",\n+                                        \"value\": \"SHA3-224\"\n+                                    },\n+                                    {\n+                                        \"description\": \"SHA3-256 (32 byte output) Keccak-based SHA3 family\",\n+                                        \"displayName\": \"SHA3-256\",\n+                                        \"value\": \"SHA3-256\"\n+                                    },\n+                                    {\n+                                        \"description\": \"SHA3-384 (48 byte output) Keccak-based SHA3 family\",\n+                                        \"displayName\": \"SHA3-384\",\n+                                        \"value\": \"SHA3-384\"\n+                                    },\n+                                    {\n+                                        \"description\": \"SHA3-512 (64 byte output) Keccak-based SHA3 family\",\n+                                        \"displayName\": \"SHA3-512\",\n+                                        \"value\": \"SHA3-512\"\n+                                    },\n+                                    {\n+                                        \"description\": \"BLAKE2-160 (20 byte output) Also known as Blake2b\",\n+                                        \"displayName\": \"BLAKE2-160\",\n+                                        \"value\": \"BLAKE2-160\"\n+                                    },\n+                                    {\n+                                        \"description\": \"BLAKE2-256 (32 byte output) Also known as Blake2b\",\n+                                        \"displayName\": \"BLAKE2-256\",\n+                                        \"value\": \"BLAKE2-256\"\n+                                    },\n+                                    {\n+                                        \"description\": \"BLAKE2-384 (48 byte output) Also known as Blake2b\",\n+                                        \"displayName\": \"BLAKE2-384\",\n+                                        \"value\": \"BLAKE2-384\"\n+                                    },\n+                                    {\n+                                        \"description\": \"BLAKE2-512 (64 byte output) Also known as Blake2b\",\n+                                        \"displayName\": \"BLAKE2-512\",\n+                                        \"value\": \"BLAKE2-512\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"SHA-256\",\n+                                \"description\": \"The cryptographic hash algorithm to use. Note that not all of the algorithms available are recommended for use (some are provided for legacy use). There are many things to consider when picking an algorithm; it is recommended to use the most secure algorithm possible.\",\n+                                \"displayName\": \"Hash Algorithm\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"hash_algorithm\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"missing_attr_policy\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"Do not route to failure if there are attributes configured for hashing that are not present in the flowfile\",\n+                                        \"displayName\": \"Allow missing attributes\",\n+                                        \"value\": \"ALLOW\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Route to failure if there are attributes configured for hashing that are not present in the flowfile\",\n+                                        \"displayName\": \"Fail if missing attributes\",\n+                                        \"value\": \"PROHIBIT\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"ALLOW\",\n+                                \"description\": \"Policy for how the processor handles attributes that are configured for hashing but are not found in the flowfile.\",\n+                                \"displayName\": \"Missing attribute policy\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"missing_attr_policy\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             }\n                         },\n                         \"sideEffectFree\": true,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"If a FlowFile cannot be transformed from the configured input format to the configured output format, the unchanged FlowFile will be routed to this relationship.\",\n-                                \"name\": \"failure\"\n-                            },\n-                            {\n-                                \"description\": \"The original FlowFile that was split into segments. If the FlowFile fails processing, nothing will be sent to this relationship\",\n-                                \"name\": \"original\"\n+                                \"description\": \"Used for flowfiles that have a hash value added\",\n+                                \"name\": \"success\"\n                             },\n                             {\n-                                \"description\": \"The individual Excel 'segments' of the original Excel FlowFile will be routed to this relationship.\",\n-                                \"name\": \"split\"\n+                                \"description\": \"Used for flowfiles that are missing required attributes\",\n+                                \"name\": \"failure\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n+                            \"CRON_DRIVEN\",\n+                            \"EVENT_DRIVEN\"\n                         ],\n                         \"supportsBatching\": true,\n-                        \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicProperties\": true,\n                         \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": false,\n+                        \"supportsEventDriven\": true,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"split\",\n-                            \"text\"\n+                            \"attributes\",\n+                            \"blake2\",\n+                            \"cryptography\",\n+                            \"hash\",\n+                            \"keccak\",\n+                            \"md5\",\n+                            \"sha\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.poi.SplitExcel\",\n-                        \"typeDescription\": \"Splits a multi sheet Microsoft Excel spreadsheet into multiple Microsoft Excel spreadsheets where each sheet from the original file is converted to an individual spreadsheet in its own flow file.  This processor is currently only capable of processing .xlsx (XSSF 2007 OOXML file format) Excel documents and not older .xls (HSSF '97(-2007) file format) documents.\",\n+                        \"type\": \"org.apache.nifi.processors.standard.CryptographicHashAttribute\",\n+                        \"typeDescription\": \"Calculates a hash value for each of the specified attributes using the given algorithm and writes it to an output attribute. Please refer to https://csrc.nist.gov/Projects/Hash-Functions/NIST-Policy-on-Hash-Functions for help to decide which algorithm to use. \",\n                         \"version\": \"1.27.0\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"All split Excel FlowFiles produced from the same parent Excel FlowFile will have the same randomly generated UUID added for this attribute\",\n-                                \"name\": \"fragment.identifier\"\n-                            },\n-                            {\n-                                \"description\": \"A one-up number that indicates the ordering of the split Excel FlowFiles that were created from a single parent Excel FlowFile\",\n-                                \"name\": \"fragment.index\"\n-                            },\n-                            {\n-                                \"description\": \"The number of split Excel FlowFiles generated from the parent Excel FlowFile\",\n-                                \"name\": \"fragment.count\"\n-                            },\n-                            {\n-                                \"description\": \"The filename of the parent Excel FlowFile\",\n-                                \"name\": \"segment.original.filename\"\n-                            },\n-                            {\n-                                \"description\": \"The name of the Excel sheet from the original spreadsheet.\",\n-                                \"name\": \"sheetname\"\n-                            },\n-                            {\n-                                \"description\": \"The number of rows in the Excel sheet from the original spreadsheet.\",\n-                                \"name\": \"total.rows\"\n+                                \"description\": \"This Processor adds an attribute whose value is the result of hashing the specified attribute. The name of this attribute is specified by the value of the dynamic property.\",\n+                                \"name\": \"<Specified Attribute Name per Dynamic Property>\"\n                             }\n                         ]\n-                    }\n-                ],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"1.27.0\"\n-        },\n-        {\n-            \"artifact\": \"nifi-elasticsearch-client-service-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [\n+                    },\n                     {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-elasticsearch-client-service-nar\",\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n-                        \"dynamicProperties\": [\n-                            {\n-                                \"description\": \"Adds the specified property name/value as a Request Header in the Elasticsearch requests.\",\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"name\": \"The name of a Request Header to add\",\n-                                \"value\": \"The value of the Header\"\n-                            }\n-                        ],\n+                        \"defaultBulletinLevel\": \"WARN\",\n+                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": 1,\n+                            \"EVENT_DRIVEN\": 0,\n+                            \"TIMER_DRIVEN\": 1\n+                        },\n+                        \"defaultPenaltyDuration\": \"30 sec\",\n+                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": \"* * * * * ?\",\n+                            \"TIMER_DRIVEN\": \"0 sec\"\n+                        },\n+                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n+                        \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n+                        \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"api-key\": {\n-                                \"dependencies\": [\n+                            \"fail_when_empty\": {\n+                                \"allowableValues\": [\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"API_KEY\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Authorization Scheme\",\n-                                        \"propertyName\": \"authorization-scheme\"\n-                                    }\n-                                ],\n-                                \"description\": \"Encoded API key.\",\n-                                \"displayName\": \"API Key\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"api-key\",\n-                                \"required\": false,\n-                                \"sensitive\": true\n-                            },\n-                            \"api-key-id\": {\n-                                \"dependencies\": [\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"API_KEY\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Authorization Scheme\",\n-                                        \"propertyName\": \"authorization-scheme\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"description\": \"Unique identifier of the API key.\",\n-                                \"displayName\": \"API Key ID\",\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"Route to failure if the content is empty. While hashing an empty value is valid, some flows may want to detect empty input.\",\n+                                \"displayName\": \"Fail if the content is empty\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"api-key-id\",\n-                                \"required\": false,\n+                                \"name\": \"fail_when_empty\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"authorization-scheme\": {\n+                            \"hash_algorithm\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"No authorization scheme.\",\n-                                        \"displayName\": \"None\",\n-                                        \"value\": \"NONE\"\n+                                        \"description\": \"MD2 (16 byte output) [WARNING -- Cryptographically broken] Cryptographically broken due to collisions\",\n+                                        \"displayName\": \"MD2\",\n+                                        \"value\": \"MD2\"\n                                     },\n                                     {\n-                                        \"description\": \"Mutual TLS with PKI certificate authorization scheme.\",\n-                                        \"displayName\": \"PKI\",\n-                                        \"value\": \"PKI\"\n+                                        \"description\": \"MD5 (16 byte output) [WARNING -- Cryptographically broken] Cryptographically broken due to collisions\",\n+                                        \"displayName\": \"MD5\",\n+                                        \"value\": \"MD5\"\n                                     },\n                                     {\n-                                        \"description\": \"Basic authorization scheme.\",\n-                                        \"displayName\": \"Basic\",\n-                                        \"value\": \"BASIC\"\n+                                        \"description\": \"SHA-1 (20 byte output) [WARNING -- Cryptographically broken] Cryptographically broken due to collisions\",\n+                                        \"displayName\": \"SHA-1\",\n+                                        \"value\": \"SHA-1\"\n                                     },\n                                     {\n-                                        \"description\": \"API key authorization scheme.\",\n-                                        \"displayName\": \"API Key\",\n-                                        \"value\": \"API_KEY\"\n+                                        \"description\": \"SHA-224 (28 byte output) SHA-2 family\",\n+                                        \"displayName\": \"SHA-224\",\n+                                        \"value\": \"SHA-224\"\n+                                    },\n+                                    {\n+                                        \"description\": \"SHA-256 (32 byte output) SHA-2 family\",\n+                                        \"displayName\": \"SHA-256\",\n+                                        \"value\": \"SHA-256\"\n+                                    },\n+                                    {\n+                                        \"description\": \"SHA-384 (48 byte output) SHA-2 family\",\n+                                        \"displayName\": \"SHA-384\",\n+                                        \"value\": \"SHA-384\"\n+                                    },\n+                                    {\n+                                        \"description\": \"SHA-512 (64 byte output) SHA-2 family\",\n+                                        \"displayName\": \"SHA-512\",\n+                                        \"value\": \"SHA-512\"\n+                                    },\n+                                    {\n+                                        \"description\": \"SHA-512/224 (28 byte output) SHA-2 using SHA-512 with truncated output\",\n+                                        \"displayName\": \"SHA-512/224\",\n+                                        \"value\": \"SHA-512/224\"\n+                                    },\n+                                    {\n+                                        \"description\": \"SHA-512/256 (32 byte output) SHA-2 using SHA-512 with truncated output\",\n+                                        \"displayName\": \"SHA-512/256\",\n+                                        \"value\": \"SHA-512/256\"\n+                                    },\n+                                    {\n+                                        \"description\": \"SHA3-224 (28 byte output) Keccak-based SHA3 family\",\n+                                        \"displayName\": \"SHA3-224\",\n+                                        \"value\": \"SHA3-224\"\n+                                    },\n+                                    {\n+                                        \"description\": \"SHA3-256 (32 byte output) Keccak-based SHA3 family\",\n+                                        \"displayName\": \"SHA3-256\",\n+                                        \"value\": \"SHA3-256\"\n+                                    },\n+                                    {\n+                                        \"description\": \"SHA3-384 (48 byte output) Keccak-based SHA3 family\",\n+                                        \"displayName\": \"SHA3-384\",\n+                                        \"value\": \"SHA3-384\"\n+                                    },\n+                                    {\n+                                        \"description\": \"SHA3-512 (64 byte output) Keccak-based SHA3 family\",\n+                                        \"displayName\": \"SHA3-512\",\n+                                        \"value\": \"SHA3-512\"\n+                                    },\n+                                    {\n+                                        \"description\": \"BLAKE2-160 (20 byte output) Also known as Blake2b\",\n+                                        \"displayName\": \"BLAKE2-160\",\n+                                        \"value\": \"BLAKE2-160\"\n+                                    },\n+                                    {\n+                                        \"description\": \"BLAKE2-256 (32 byte output) Also known as Blake2b\",\n+                                        \"displayName\": \"BLAKE2-256\",\n+                                        \"value\": \"BLAKE2-256\"\n+                                    },\n+                                    {\n+                                        \"description\": \"BLAKE2-384 (48 byte output) Also known as Blake2b\",\n+                                        \"displayName\": \"BLAKE2-384\",\n+                                        \"value\": \"BLAKE2-384\"\n+                                    },\n+                                    {\n+                                        \"description\": \"BLAKE2-512 (64 byte output) Also known as Blake2b\",\n+                                        \"displayName\": \"BLAKE2-512\",\n+                                        \"value\": \"BLAKE2-512\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"BASIC\",\n-                                \"description\": \"Authorization Scheme used for optional authentication to Elasticsearch.\",\n-                                \"displayName\": \"Authorization Scheme\",\n+                                \"defaultValue\": \"SHA-256\",\n+                                \"description\": \"The hash algorithm to use. Note that not all of the algorithms available are recommended for use (some are provided for legacy compatibility). There are many things to consider when picking an algorithm; it is recommended to use the most secure algorithm possible.\",\n+                                \"displayName\": \"Hash Algorithm\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"authorization-scheme\",\n+                                \"name\": \"hash_algorithm\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n+                            }\n+                        },\n+                        \"sideEffectFree\": true,\n+                        \"supportedRelationships\": [\n+                            {\n+                                \"description\": \"Used for flowfiles that have a hash value added\",\n+                                \"name\": \"success\"\n                             },\n-                            \"el-cs-charset\": {\n-                                \"defaultValue\": \"UTF-8\",\n-                                \"description\": \"The charset to use for interpreting the response from Elasticsearch.\",\n-                                \"displayName\": \"Charset\",\n+                            {\n+                                \"description\": \"Used for flowfiles that have no content if the 'fail on empty' setting is enabled\",\n+                                \"name\": \"failure\"\n+                            }\n+                        ],\n+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\",\n+                            \"EVENT_DRIVEN\"\n+                        ],\n+                        \"supportsBatching\": true,\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicRelationships\": false,\n+                        \"supportsEventDriven\": true,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"blake2\",\n+                            \"content\",\n+                            \"cryptography\",\n+                            \"hash\",\n+                            \"md5\",\n+                            \"sha\"\n+                        ],\n+                        \"triggerSerially\": false,\n+                        \"triggerWhenAnyDestinationAvailable\": false,\n+                        \"triggerWhenEmpty\": false,\n+                        \"type\": \"org.apache.nifi.processors.standard.CryptographicHashContent\",\n+                        \"typeDescription\": \"Calculates a cryptographic hash value for the flowfile content using the given algorithm and writes it to an output attribute. Please refer to https://csrc.nist.gov/Projects/Hash-Functions/NIST-Policy-on-Hash-Functions for help to decide which algorithm to use.\",\n+                        \"version\": \"1.27.0\",\n+                        \"writesAttributes\": [\n+                            {\n+                                \"description\": \"This processor adds an attribute whose value is the result of hashing the flowfile content. The name of this attribute is specified by the value of the algorithm, e.g. 'content_SHA-256'.\",\n+                                \"name\": \"content_<algorithm>\"\n+                            }\n+                        ]\n+                    },\n+                    {\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-standard-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"e0c4461\"\n+                        },\n+                        \"defaultBulletinLevel\": \"WARN\",\n+                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": 1,\n+                            \"EVENT_DRIVEN\": 0,\n+                            \"TIMER_DRIVEN\": 1\n+                        },\n+                        \"defaultPenaltyDuration\": \"30 sec\",\n+                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": \"* * * * * ?\",\n+                            \"TIMER_DRIVEN\": \"0 sec\"\n+                        },\n+                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n+                        \"defaultYieldDuration\": \"1 sec\",\n+                        \"group\": \"org.apache.nifi\",\n+                        \"primaryNodeOnly\": false,\n+                        \"propertyDescriptors\": {\n+                            \"@OnScheduled Pause Time\": {\n+                                \"defaultValue\": \"0 sec\",\n+                                \"description\": \"Specifies how long the processor should sleep in the @OnScheduled method, so that the processor can be forced to take a long time to start up\",\n+                                \"displayName\": \"@OnScheduled Pause Time\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"el-cs-charset\",\n+                                \"name\": \"@OnScheduled Pause Time\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"el-cs-connect-timeout\": {\n-                                \"defaultValue\": \"5000\",\n-                                \"description\": \"Controls the amount of time, in milliseconds, before a timeout occurs when trying to connect.\",\n-                                \"displayName\": \"Connect timeout\",\n+                            \"@OnStopped Pause Time\": {\n+                                \"defaultValue\": \"0 sec\",\n+                                \"description\": \"Specifies how long the processor should sleep in the @OnStopped method, so that the processor can be forced to take a long time to shutdown\",\n+                                \"displayName\": \"@OnStopped Pause Time\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"@OnStopped Pause Time\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"@OnUnscheduled Pause Time\": {\n+                                \"defaultValue\": \"0 sec\",\n+                                \"description\": \"Specifies how long the processor should sleep in the @OnUnscheduled method, so that the processor can be forced to take a long time to respond when user clicks stop\",\n+                                \"displayName\": \"@OnUnscheduled Pause Time\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"el-cs-connect-timeout\",\n+                                \"name\": \"@OnUnscheduled Pause Time\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"el-cs-enable-compression\": {\n+                            \"Content Size\": {\n+                                \"defaultValue\": \"1 KB\",\n+                                \"description\": \"The number of bytes to write each time that the FlowFile is written to\",\n+                                \"displayName\": \"Content Size\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Content Size\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"CustomValidate Pause Time\": {\n+                                \"defaultValue\": \"0 sec\",\n+                                \"description\": \"Specifies how long the processor should sleep in the customValidate() method\",\n+                                \"displayName\": \"CustomValidate Pause Time\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"CustomValidate Pause Time\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Fail When @OnScheduled called\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"true\",\n                                         \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"false\",\n                                         \"value\": \"false\"\n                                     }\n                                 ],\n                                 \"defaultValue\": \"false\",\n-                                \"description\": \"Whether the REST client should compress requests using gzip content encoding and add the \\\"Accept-Encoding: gzip\\\" header to receive compressed responses\",\n-                                \"displayName\": \"Enable Compression\",\n+                                \"description\": \"Specifies whether or not the Processor should throw an Exception when the methods annotated with @OnScheduled are called\",\n+                                \"displayName\": \"Fail When @OnScheduled called\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"el-cs-enable-compression\",\n+                                \"name\": \"Fail When @OnScheduled called\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"el-cs-http-hosts\": {\n-                                \"description\": \"A comma-separated list of HTTP hosts that host Elasticsearch query nodes. Note that the Host is included in requests as a header (typically including domain and port, e.g. elasticsearch:9200).\",\n-                                \"displayName\": \"HTTP Hosts\",\n+                            \"Fail When @OnStopped called\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"Specifies whether or not the Processor should throw an Exception when the methods annotated with @OnStopped are called\",\n+                                \"displayName\": \"Fail When @OnStopped called\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"el-cs-http-hosts\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Fail When @OnStopped called\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"el-cs-node-selector\": {\n+                            \"Fail When @OnUnscheduled called\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Select any Elasticsearch node to handle requests\",\n-                                        \"displayName\": \"Any\",\n-                                        \"value\": \"ANY\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n-                                        \"description\": \"Skip dedicated Elasticsearch master nodes for handling request\",\n-                                        \"displayName\": \"Skip Dedicated Masters\",\n-                                        \"value\": \"SKIP_DEDICATED_MASTERS\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"ANY\",\n-                                \"description\": \"Selects Elasticsearch nodes that can receive requests. Used to keep requests away from dedicated Elasticsearch master nodes\",\n-                                \"displayName\": \"Node Selector\",\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"Specifies whether or not the Processor should throw an Exception when the methods annotated with @OnUnscheduled are called\",\n+                                \"displayName\": \"Fail When @OnUnscheduled called\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"el-cs-node-selector\",\n+                                \"name\": \"Fail When @OnUnscheduled called\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"el-cs-password\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"BASIC\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Authorization Scheme\",\n-                                        \"propertyName\": \"authorization-scheme\"\n-                                    }\n-                                ],\n-                                \"description\": \"The password to use with XPack security.\",\n-                                \"displayName\": \"Password\",\n+                            \"FlowFile Exception Class\": {\n+                                \"defaultValue\": \"java.lang.RuntimeException\",\n+                                \"description\": \"Exception class to be thrown (must extend java.lang.RuntimeException).\",\n+                                \"displayName\": \"FlowFile Exception Class\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"el-cs-password\",\n-                                \"required\": false,\n-                                \"sensitive\": true\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"FlowFile Exception Class\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n                             },\n-                            \"el-cs-path-prefix\": {\n-                                \"description\": \"Sets the path's prefix for every request used by the http client. For example, if this is set to \\\"/my/path\\\", then any client request will become \\\"/my/path/\\\" + endpoint. In essence, every request's endpoint is prefixed by this pathPrefix. The path prefix is useful for when Elasticsearch is behind a proxy that provides a base path or a proxy that requires all paths to start with '/'; it is not intended for other purposes and it should not be supplied in other scenarios\",\n-                                \"displayName\": \"Path Prefix\",\n+                            \"FlowFile Exception Iterations\": {\n+                                \"defaultValue\": \"0\",\n+                                \"description\": \"Number of FlowFiles to throw exception.\",\n+                                \"displayName\": \"FlowFile Exception Iterations\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"el-cs-path-prefix\",\n-                                \"required\": false,\n+                                \"name\": \"FlowFile Exception Iterations\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"el-cs-retry-timeout\": {\n-                                \"defaultValue\": \"60000\",\n-                                \"description\": \"Controls the amount of time, in milliseconds, before a timeout occurs when retrying the operation.\",\n-                                \"displayName\": \"Retry timeout\",\n+                            \"FlowFile Failure Iterations\": {\n+                                \"defaultValue\": \"0\",\n+                                \"description\": \"Number of FlowFiles to forward to failure relationship.\",\n+                                \"displayName\": \"FlowFile Failure Iterations\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"el-cs-retry-timeout\",\n+                                \"name\": \"FlowFile Failure Iterations\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"el-cs-send-meta-header\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"true\",\n-                                \"description\": \"Whether to send a \\\"X-Elastic-Client-Meta\\\" header that describes the runtime environment. It contains information that is similar to what could be found in User-Agent. Using a separate header allows applications to use User-Agent for their own needs, e.g. to identify application version or other environment information\",\n-                                \"displayName\": \"Send Meta Header\",\n+                            \"FlowFile Rollback Iterations\": {\n+                                \"defaultValue\": \"0\",\n+                                \"description\": \"Number of FlowFiles to roll back (without penalty).\",\n+                                \"displayName\": \"FlowFile Rollback Iterations\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"el-cs-send-meta-header\",\n+                                \"name\": \"FlowFile Rollback Iterations\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"el-cs-sniff-cluster-nodes\": {\n+                            \"FlowFile Rollback Penalty Iterations\": {\n+                                \"defaultValue\": \"0\",\n+                                \"description\": \"Number of FlowFiles to roll back with penalty.\",\n+                                \"displayName\": \"FlowFile Rollback Penalty Iterations\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"FlowFile Rollback Penalty Iterations\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"FlowFile Rollback Yield Iterations\": {\n+                                \"defaultValue\": \"0\",\n+                                \"description\": \"Number of FlowFiles to roll back and yield.\",\n+                                \"displayName\": \"FlowFile Rollback Yield Iterations\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"FlowFile Rollback Yield Iterations\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"FlowFile Success Iterations\": {\n+                                \"defaultValue\": \"1\",\n+                                \"description\": \"Number of FlowFiles to forward to success relationship.\",\n+                                \"displayName\": \"FlowFile Success Iterations\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"FlowFile Success Iterations\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Ignore Interrupts When Paused\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"true\",\n                                         \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"false\",\n                                         \"value\": \"false\"\n                                     }\n                                 ],\n                                 \"defaultValue\": \"false\",\n-                                \"description\": \"Periodically sniff for nodes within the Elasticsearch cluster via the Elasticsearch Node Info API. If Elasticsearch security features are enabled (default to \\\"true\\\" for 8.x+), the Elasticsearch user must have the \\\"monitor\\\" or \\\"manage\\\" cluster privilege to use this API.Note that all HTTP Hosts (and those that may be discovered within the cluster using the Sniffer) must use the same protocol, e.g. http or https, and be contactable using the same client settings. Finally the Elasticsearch \\\"network.publish_host\\\" must match one of the \\\"network.bind_host\\\" list entries see https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-network.html for more information\",\n-                                \"displayName\": \"Sniff Cluster Nodes\",\n+                                \"description\": \"If the Processor's thread(s) are sleeping (due to one of the \\\"Pause Time\\\" properties above), and the thread is interrupted, this indicates whether the Processor should ignore the interrupt and continue sleeping or if it should allow itself to be interrupted.\",\n+                                \"displayName\": \"Ignore Interrupts When Paused\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"el-cs-sniff-cluster-nodes\",\n+                                \"name\": \"Ignore Interrupts When Paused\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"el-cs-sniff-failure\": {\n+                            \"No FlowFile Exception Class\": {\n+                                \"defaultValue\": \"java.lang.RuntimeException\",\n+                                \"description\": \"Exception class to be thrown if no FlowFile (must extend java.lang.RuntimeException).\",\n+                                \"displayName\": \"No FlowFile Exception Class\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"No FlowFile Exception Class\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"No FlowFile Exception Iterations\": {\n+                                \"defaultValue\": \"0\",\n+                                \"description\": \"Number of times to throw NPE exception if no FlowFile.\",\n+                                \"displayName\": \"No FlowFile Exception Iterations\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"No FlowFile Exception Iterations\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"No FlowFile Skip Iterations\": {\n+                                \"defaultValue\": \"1\",\n+                                \"description\": \"Number of times to skip onTrigger if no FlowFile.\",\n+                                \"displayName\": \"No FlowFile Skip Iterations\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"No FlowFile Skip Iterations\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"No FlowFile Yield Iterations\": {\n+                                \"defaultValue\": \"0\",\n+                                \"description\": \"Number of times to yield if no FlowFile.\",\n+                                \"displayName\": \"No FlowFile Yield Iterations\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"No FlowFile Yield Iterations\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"OnTrigger Pause Time\": {\n+                                \"defaultValue\": \"0 sec\",\n+                                \"description\": \"Specifies how long the processor should sleep in the onTrigger() method, so that the processor can be forced to take a long time to perform its task\",\n+                                \"displayName\": \"OnTrigger Pause Time\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"OnTrigger Pause Time\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Write Iterations\": {\n+                                \"defaultValue\": \"0\",\n+                                \"description\": \"Number of times to write to the FlowFile\",\n+                                \"displayName\": \"Write Iterations\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Write Iterations\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            }\n+                        },\n+                        \"sideEffectFree\": false,\n+                        \"supportedRelationships\": [\n+                            {\n+                                \"description\": \"FlowFiles processed successfully.\",\n+                                \"name\": \"success\"\n+                            },\n+                            {\n+                                \"description\": \"FlowFiles that failed to process.\",\n+                                \"name\": \"failure\"\n+                            }\n+                        ],\n+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\",\n+                            \"EVENT_DRIVEN\"\n+                        ],\n+                        \"supportsBatching\": false,\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicRelationships\": false,\n+                        \"supportsEventDriven\": true,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"FlowFile\",\n+                            \"debug\",\n+                            \"flow\",\n+                            \"processor\",\n+                            \"test\",\n+                            \"utility\"\n+                        ],\n+                        \"triggerSerially\": false,\n+                        \"triggerWhenAnyDestinationAvailable\": false,\n+                        \"triggerWhenEmpty\": false,\n+                        \"type\": \"org.apache.nifi.processors.standard.DebugFlow\",\n+                        \"typeDescription\": \"The DebugFlow processor aids testing and debugging the FlowFile framework by allowing various responses to be explicitly triggered in response to the receipt of a FlowFile or a timer event without a FlowFile if using timer or cron based scheduling.  It can force responses needed to exercise or test various failure modes that can occur when a processor runs.\",\n+                        \"version\": \"1.27.0\"\n+                    },\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-standard-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"e0c4461\"\n+                        },\n+                        \"defaultBulletinLevel\": \"WARN\",\n+                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": 1,\n+                            \"EVENT_DRIVEN\": 0,\n+                            \"TIMER_DRIVEN\": 1\n+                        },\n+                        \"defaultPenaltyDuration\": \"30 sec\",\n+                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": \"* * * * * ?\",\n+                            \"TIMER_DRIVEN\": \"0 sec\"\n+                        },\n+                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n+                        \"defaultYieldDuration\": \"1 sec\",\n+                        \"dynamicProperties\": [\n+                            {\n+                                \"description\": \"A record's cache key is generated by combining the name of each dynamic property with its evaluated record value (as specified by the corresponding RecordPath).\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"name\": \"Name of the property.\",\n+                                \"value\": \"A valid RecordPath to the record field to be included in the cache key used for deduplication.\"\n+                            }\n+                        ],\n+                        \"group\": \"org.apache.nifi\",\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n+                        \"primaryNodeOnly\": false,\n+                        \"propertyDescriptors\": {\n+                            \"bloom-filter-certainty\": {\n+                                \"defaultValue\": \"0.10\",\n+                                \"description\": \"The desired false positive probability when using the BloomFilter type. Using a value of .05 for example, guarantees a five-percent probability that the result is a false positive. The closer to 1 this value is set, the more precise the result at the expense of more storage space utilization.\",\n+                                \"displayName\": \"Bloom Filter Certainty\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"bloom-filter-certainty\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"cache-identifier\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"multiple\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Deduplication Strategy\",\n+                                        \"propertyName\": \"deduplication-strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"An optional expression language field that overrides the record's computed cache key. This field has an additional attribute available: ${record.hash.value}, which contains the cache key derived from dynamic properties (if set) or record fields.\",\n+                                \"displayName\": \"Cache Identifier\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"cache-identifier\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"deduplication-strategy\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"displayName\": \"Single File\",\n+                                        \"value\": \"single\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"false\",\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"true\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Sniff Cluster Nodes\",\n-                                        \"propertyName\": \"el-cs-sniff-cluster-nodes\"\n+                                        \"displayName\": \"Multiple Files\",\n+                                        \"value\": \"multiple\"\n                                     }\n                                 ],\n-                                \"description\": \"Enable sniffing on failure, meaning that after each failure the Elasticsearch nodes list gets updated straightaway rather than at the following ordinary sniffing round\",\n-                                \"displayName\": \"Sniff on Failure\",\n+                                \"defaultValue\": \"single\",\n+                                \"description\": \"The strategy to use for detecting and routing duplicate records. The option for detecting duplicates across a single FlowFile operates in-memory, whereas detection spanning multiple FlowFiles utilises a distributed map cache.\",\n+                                \"displayName\": \"Deduplication Strategy\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"el-cs-sniff-failure\",\n+                                \"name\": \"deduplication-strategy\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"el-cs-sniffer-failure-delay\": {\n-                                \"defaultValue\": \"1 min\",\n+                            \"distributed-map-cache\": {\n                                 \"dependencies\": [\n                                     {\n                                         \"dependentValues\": [\n-                                            \"true\"\n+                                            \"multiple\"\n                                         ],\n-                                        \"propertyDisplayName\": \"Sniff on Failure\",\n-                                        \"propertyName\": \"el-cs-sniff-failure\"\n+                                        \"propertyDisplayName\": \"Deduplication Strategy\",\n+                                        \"propertyName\": \"deduplication-strategy\"\n                                     }\n                                 ],\n-                                \"description\": \"Delay between an Elasticsearch request failure and updating available Cluster nodes using the Sniffer\",\n-                                \"displayName\": \"Sniffer Failure Delay\",\n+                                \"description\": \"This property is required when the deduplication strategy is set to 'multiple files.' The map cache will for each record, atomically check whether the cache key exists and if not, set it.\",\n+                                \"displayName\": \"Distributed Map Cache client\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"el-cs-sniffer-failure-delay\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n+                                \"name\": \"distributed-map-cache\",\n+                                \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.distributed.cache.client.DistributedMapCacheClient\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n                             },\n-                            \"el-cs-sniffer-interval\": {\n-                                \"defaultValue\": \"5 mins\",\n+                            \"filter-capacity-hint\": {\n+                                \"defaultValue\": \"25000\",\n                                 \"dependencies\": [\n                                     {\n                                         \"dependentValues\": [\n-                                            \"true\"\n+                                            \"bloom-filter\"\n                                         ],\n-                                        \"propertyDisplayName\": \"Sniff Cluster Nodes\",\n-                                        \"propertyName\": \"el-cs-sniff-cluster-nodes\"\n+                                        \"propertyDisplayName\": \"Filter Type\",\n+                                        \"propertyName\": \"filter-type\"\n                                     }\n                                 ],\n-                                \"description\": \"Interval between Cluster sniffer operations\",\n-                                \"displayName\": \"Sniffer Interval\",\n+                                \"description\": \"An estimation of the total number of unique records to be processed. The more accurate this number is will lead to fewer false negatives on a BloomFilter.\",\n+                                \"displayName\": \"Filter Capacity Hint\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"el-cs-sniffer-interval\",\n+                                \"name\": \"filter-capacity-hint\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"el-cs-sniffer-request-timeout\": {\n-                                \"defaultValue\": \"1 sec\",\n+                            \"filter-type\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"Exactly matches records seen before with 100% accuracy at the expense of more storage usage. Stores the filter data in a single cache entry in the distributed cache, and is loaded entirely into memory during duplicate detection. This filter is preferred for small to medium data sets and offers high performance, being loaded into memory when this processor is running.\",\n+                                        \"displayName\": \"HashSet\",\n+                                        \"value\": \"hash-set\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Space-efficient data structure ideal for large data sets using probability to determine if a record was seen previously. False positive matches are possible, but false negatives are not \\u2013 in other words, a query returns either \\\"possibly in the set\\\" or \\\"definitely not in the set\\\". You should use this option if the FlowFile content is large and you can tolerate some duplication in the data. Uses constant storage space regardless of the record set size.\",\n+                                        \"displayName\": \"BloomFilter\",\n+                                        \"value\": \"bloom-filter\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"hash-set\",\n                                 \"dependencies\": [\n                                     {\n                                         \"dependentValues\": [\n-                                            \"true\"\n+                                            \"single\"\n                                         ],\n-                                        \"propertyDisplayName\": \"Sniff Cluster Nodes\",\n-                                        \"propertyName\": \"el-cs-sniff-cluster-nodes\"\n+                                        \"propertyDisplayName\": \"Deduplication Strategy\",\n+                                        \"propertyName\": \"deduplication-strategy\"\n                                     }\n                                 ],\n-                                \"description\": \"Cluster sniffer timeout for node info requests\",\n-                                \"displayName\": \"Sniffer Request Timeout\",\n+                                \"description\": \"The filter used to determine whether a record has been seen before based on the matching RecordPath criteria. If hash set is selected, a Java HashSet object will be used to deduplicate all encountered records. If the bloom filter option is selected, a bloom filter will be used. The bloom filter option is less memory intensive, but has a chance of having false positives.\",\n+                                \"displayName\": \"Filter Type\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"el-cs-sniffer-request-timeout\",\n+                                \"name\": \"filter-type\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"el-cs-socket-timeout\": {\n-                                \"defaultValue\": \"60000\",\n-                                \"description\": \"Controls the amount of time, in milliseconds, before a timeout occurs when waiting for a response.\",\n-                                \"displayName\": \"Read timeout\",\n+                            \"include-zero-record-flowfiles\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"true\",\n+                                \"description\": \"If a FlowFile sent to either the duplicate or non-duplicate relationships contains no records, a value of `false` in this property causes the FlowFile to be dropped. Otherwise, the empty FlowFile is emitted.\",\n+                                \"displayName\": \"Include Zero Record FlowFiles\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"el-cs-socket-timeout\",\n+                                \"name\": \"include-zero-record-flowfiles\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"el-cs-ssl-context-service\": {\n-                                \"description\": \"The SSL Context Service used to provide client certificate information for TLS/SSL connections. This service only applies if the Elasticsearch endpoint(s) have been secured with TLS/SSL.\",\n-                                \"displayName\": \"SSL Context Service\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"el-cs-ssl-context-service\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            },\n-                            \"el-cs-strict-deprecation\": {\n+                            \"put-cache-identifier\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"true\",\n                                         \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"false\",\n                                         \"value\": \"false\"\n                                     }\n                                 ],\n                                 \"defaultValue\": \"false\",\n-                                \"description\": \"Whether the REST client should return any response containing at least one warning header as a failure\",\n-                                \"displayName\": \"Strict Deprecation\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"propertyDisplayName\": \"Distributed Map Cache client\",\n+                                        \"propertyName\": \"distributed-map-cache\"\n+                                    }\n+                                ],\n+                                \"description\": \"For each record, check whether the cache identifier exists in the distributed map cache. If it doesn't exist and this property is true, put the identifier to the cache.\",\n+                                \"displayName\": \"Cache the Entry Identifier\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"el-cs-strict-deprecation\",\n+                                \"name\": \"put-cache-identifier\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"el-cs-suppress-nulls\": {\n+                            \"record-hashing-algorithm\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Fields that are missing (present in the schema but not in the record), or that have a value of null/empty, will be written out as a null/empty value\",\n-                                        \"displayName\": \"Never Suppress\",\n-                                        \"value\": \"never-suppress\"\n+                                        \"description\": \"Do not use a hashing algorithm. The value of resolved RecordPaths will be combined with a delimiter (~) to form the unique cache key. This may use significantly more storage depending on the size and shape or your data.\",\n+                                        \"displayName\": \"None\",\n+                                        \"value\": \"none\"\n                                     },\n                                     {\n-                                        \"description\": \"Fields that are missing (present in the schema but not in the record), or that have a value of null/empty, will not be written out\",\n-                                        \"displayName\": \"Always Suppress\",\n-                                        \"value\": \"always-suppress\"\n+                                        \"description\": \"SHA-256 cryptographic hashing algorithm.\",\n+                                        \"displayName\": \"SHA-256\",\n+                                        \"value\": \"SHA-256\"\n+                                    },\n+                                    {\n+                                        \"description\": \"SHA-512 cryptographic hashing algorithm.\",\n+                                        \"displayName\": \"SHA-512\",\n+                                        \"value\": \"SHA-512\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"always-suppress\",\n-                                \"description\": \"Specifies how the writer should handle null and empty fields (including objects and arrays)\",\n-                                \"displayName\": \"Suppress Null/Empty Values\",\n+                                \"defaultValue\": \"SHA-256\",\n+                                \"description\": \"The algorithm used to hash the cache key.\",\n+                                \"displayName\": \"Record Hashing Algorithm\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"record-hashing-algorithm\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"record-reader\": {\n+                                \"description\": \"Specifies the Controller Service to use for reading incoming data\",\n+                                \"displayName\": \"Record Reader\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"record-reader\",\n+                                \"required\": true,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"record-writer\": {\n+                                \"description\": \"Specifies the Controller Service to use for writing out the records\",\n+                                \"displayName\": \"Record Writer\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"record-writer\",\n+                                \"required\": true,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            }\n+                        },\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.distributed.cache.client.DistributedMapCacheClientService\",\n+                            \"org.apache.nifi.distributed.cache.server.map.DistributedMapCacheServer\",\n+                            \"org.apache.nifi.processors.standard.DetectDuplicate\"\n+                        ],\n+                        \"sideEffectFree\": false,\n+                        \"supportedRelationships\": [\n+                            {\n+                                \"description\": \"Records detected as duplicates are routed to this relationship.\",\n+                                \"name\": \"duplicate\"\n+                            },\n+                            {\n+                                \"description\": \"Records not found in the cache are routed to this relationship.\",\n+                                \"name\": \"non-duplicate\"\n+                            },\n+                            {\n+                                \"description\": \"If unable to communicate with the cache, the FlowFile will be penalized and routed to this relationship\",\n+                                \"name\": \"failure\"\n+                            },\n+                            {\n+                                \"description\": \"The original input FlowFile is sent to this relationship unless a fatal error occurs.\",\n+                                \"name\": \"original\"\n+                            }\n+                        ],\n+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\",\n+                            \"EVENT_DRIVEN\"\n+                        ],\n+                        \"supportsBatching\": true,\n+                        \"supportsDynamicProperties\": true,\n+                        \"supportsDynamicRelationships\": false,\n+                        \"supportsEventDriven\": true,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"systemResourceConsiderations\": [\n+                            {\n+                                \"description\": \"The HashSet filter type will grow memory space proportionate to the number of unique records processed. The BloomFilter type will use constant memory regardless of the number of records processed.\",\n+                                \"resource\": \"MEMORY\"\n+                            },\n+                            {\n+                                \"description\": \"If a more advanced hash algorithm is chosen, the amount of time required to hash any particular record could increase substantially.\",\n+                                \"resource\": \"CPU\"\n+                            }\n+                        ],\n+                        \"tags\": [\n+                            \"change\",\n+                            \"dedupe\",\n+                            \"distinct\",\n+                            \"dupe\",\n+                            \"duplicate\",\n+                            \"filter\",\n+                            \"hash\",\n+                            \"modify\",\n+                            \"record\",\n+                            \"replace\",\n+                            \"text\",\n+                            \"unique\",\n+                            \"update\"\n+                        ],\n+                        \"triggerSerially\": false,\n+                        \"triggerWhenAnyDestinationAvailable\": false,\n+                        \"triggerWhenEmpty\": false,\n+                        \"type\": \"org.apache.nifi.processors.standard.DeduplicateRecord\",\n+                        \"typeDescription\": \"This processor de-duplicates individual records within a record set. It can operate on a per-file basis using an in-memory hashset or bloom filter. When configured with a distributed map cache, it de-duplicates records across multiple files.\",\n+                        \"version\": \"1.27.0\",\n+                        \"writesAttributes\": [\n+                            {\n+                                \"description\": \"Number of records written to the destination FlowFile.\",\n+                                \"name\": \"record.count\"\n+                            }\n+                        ]\n+                    },\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-standard-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"e0c4461\"\n+                        },\n+                        \"defaultBulletinLevel\": \"WARN\",\n+                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": 1,\n+                            \"EVENT_DRIVEN\": 0,\n+                            \"TIMER_DRIVEN\": 1\n+                        },\n+                        \"defaultPenaltyDuration\": \"30 sec\",\n+                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": \"* * * * * ?\",\n+                            \"TIMER_DRIVEN\": \"0 sec\"\n+                        },\n+                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n+                        \"defaultYieldDuration\": \"1 sec\",\n+                        \"group\": \"org.apache.nifi\",\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n+                        \"primaryNodeOnly\": false,\n+                        \"propertyDescriptors\": {\n+                            \"Age Off Duration\": {\n+                                \"description\": \"Time interval to age off cached FlowFiles\",\n+                                \"displayName\": \"Age Off Duration\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Age Off Duration\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Cache Entry Identifier\": {\n+                                \"defaultValue\": \"${hash.value}\",\n+                                \"description\": \"A FlowFile attribute, or the results of an Attribute Expression Language statement, which will be evaluated against a FlowFile in order to determine the value used to identify duplicates; it is this value that is cached\",\n+                                \"displayName\": \"Cache Entry Identifier\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"el-cs-suppress-nulls\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Cache Entry Identifier\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"el-cs-username\": {\n-                                \"dependencies\": [\n+                            \"Cache The Entry Identifier\": {\n+                                \"allowableValues\": [\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"BASIC\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Authorization Scheme\",\n-                                        \"propertyName\": \"authorization-scheme\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"description\": \"The username to use with XPack security.\",\n-                                \"displayName\": \"Username\",\n+                                \"defaultValue\": \"true\",\n+                                \"description\": \"When true this cause the processor to check for duplicates and cache the Entry Identifier. When false, the processor would only check for duplicates and not cache the Entry Identifier, requiring another processor to add identifiers to the distributed cache.\",\n+                                \"displayName\": \"Cache The Entry Identifier\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"el-cs-username\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Cache The Entry Identifier\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"proxy-configuration-service\": {\n-                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests. Supported proxies: HTTP\",\n-                                \"displayName\": \"Proxy Configuration Service\",\n+                            \"Distributed Cache Service\": {\n+                                \"description\": \"The Controller Service that is used to cache unique identifiers, used to determine duplicates\",\n+                                \"displayName\": \"Distributed Cache Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"proxy-configuration-service\",\n-                                \"required\": false,\n+                                \"name\": \"Distributed Cache Service\",\n+                                \"required\": true,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n                                     \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.proxy.ProxyConfigurationService\",\n+                                    \"type\": \"org.apache.nifi.distributed.cache.client.DistributedMapCacheClient\",\n                                     \"version\": \"1.27.0\"\n                                 }\n+                            },\n+                            \"FlowFile Description\": {\n+                                \"defaultValue\": \"\",\n+                                \"description\": \"When a FlowFile is added to the cache, this value is stored along with it so that if a duplicate is found, this description of the original FlowFile will be added to the duplicate's \\\"original.flowfile.description\\\" attribute\",\n+                                \"displayName\": \"FlowFile Description\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"FlowFile Description\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n                             }\n                         },\n-                        \"providedApiImplementations\": [\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.distributed.cache.client.DistributedMapCacheClientService\",\n+                            \"org.apache.nifi.distributed.cache.server.map.DistributedMapCacheServer\"\n+                        ],\n+                        \"sideEffectFree\": false,\n+                        \"supportedRelationships\": [\n                             {\n-                                \"artifact\": \"nifi-elasticsearch-client-service-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.elasticsearch.ElasticSearchClientService\",\n-                                \"version\": \"1.27.0\"\n+                                \"description\": \"If a FlowFile has been detected to be a duplicate, it will be routed to this relationship\",\n+                                \"name\": \"duplicate\"\n+                            },\n+                            {\n+                                \"description\": \"If a FlowFile's Cache Entry Identifier was not found in the cache, it will be routed to this relationship\",\n+                                \"name\": \"non-duplicate\"\n+                            },\n+                            {\n+                                \"description\": \"If unable to communicate with the cache, the FlowFile will be penalized and routed to this relationship\",\n+                                \"name\": \"failure\"\n                             }\n                         ],\n-                        \"supportsDynamicProperties\": true,\n+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\",\n+                            \"EVENT_DRIVEN\"\n+                        ],\n+                        \"supportsBatching\": true,\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicRelationships\": false,\n+                        \"supportsEventDriven\": true,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"client\",\n-                            \"elasticsearch\",\n-                            \"elasticsearch6\",\n-                            \"elasticsearch7\",\n-                            \"elasticsearch8\"\n+                            \"dedupe\",\n+                            \"dupe\",\n+                            \"duplicate\",\n+                            \"hash\"\n                         ],\n-                        \"type\": \"org.apache.nifi.elasticsearch.ElasticSearchClientServiceImpl\",\n-                        \"typeDescription\": \"A controller service for accessing an Elasticsearch client. Uses the Elasticsearch REST Client (7.13.4, the last version before client connections verifythe server is Elastic provided, this should allow for connections to compatible alternatives, e.g. AWS OpenSearch)\",\n-                        \"version\": \"1.27.0\"\n+                        \"triggerSerially\": false,\n+                        \"triggerWhenAnyDestinationAvailable\": false,\n+                        \"triggerWhenEmpty\": false,\n+                        \"type\": \"org.apache.nifi.processors.standard.DetectDuplicate\",\n+                        \"typeDescription\": \"Caches a value, computed from FlowFile attributes, for each incoming FlowFile and determines if the cached value has already been seen. If so, routes the FlowFile to 'duplicate' with an attribute named 'original.identifier' that specifies the original FlowFile's \\\"description\\\", which is specified in the <FlowFile Description> property. If the FlowFile is not determined to be a duplicate, the Processor routes the FlowFile to 'non-duplicate'\",\n+                        \"version\": \"1.27.0\",\n+                        \"writesAttributes\": [\n+                            {\n+                                \"description\": \"All FlowFiles routed to the duplicate relationship will have an attribute added named original.flowfile.description. The value of this attribute is determined by the attributes of the original copy of the data and by the FlowFile Description property.\",\n+                                \"name\": \"original.flowfile.description\"\n+                            }\n+                        ]\n                     },\n                     {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-elasticsearch-client-service-nar\",\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n+                        \"defaultBulletinLevel\": \"WARN\",\n+                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": 1,\n+                            \"EVENT_DRIVEN\": 0,\n+                            \"TIMER_DRIVEN\": 1\n+                        },\n+                        \"defaultPenaltyDuration\": \"30 sec\",\n+                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": \"* * * * * ?\",\n+                            \"TIMER_DRIVEN\": \"0 sec\"\n+                        },\n+                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n+                        \"defaultYieldDuration\": \"1 sec\",\n                         \"dynamicProperties\": [\n                             {\n-                                \"description\": \"Retrieves an object using JSONPath from the result document and places it in the return Record at the specified Record Path.\",\n+                                \"description\": \"Adding a property with the name '5' and value '10' means that the relationship with name '5' will receive 10 FlowFiles in each iteration instead of 1.\",\n                                 \"expressionLanguageScope\": \"NONE\",\n-                                \"name\": \"A JSONPath expression\",\n-                                \"value\": \"A Record Path expression\"\n+                                \"name\": \"The relationship name (positive number)\",\n+                                \"value\": \"The relationship Weight (positive number)\"\n                             }\n                         ],\n+                        \"dynamicRelationship\": {\n+                            \"description\": \"FlowFiles are sent to this relationship per the <Distribution Strategy>\",\n+                            \"name\": \"A number 1..<Number Of Relationships>\"\n+                        },\n                         \"group\": \"org.apache.nifi\",\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n+                        \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"el-lookup-index\": {\n-                                \"description\": \"The name of the index to read from\",\n-                                \"displayName\": \"Index\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"el-lookup-index\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"el-lookup-type\": {\n-                                \"description\": \"The type of this document (used by Elasticsearch for indexing and searching)\",\n-                                \"displayName\": \"Type\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"el-lookup-type\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"el-rest-client-service\": {\n-                                \"description\": \"An ElasticSearch client service to use for running queries.\",\n-                                \"displayName\": \"Client Service\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"el-rest-client-service\",\n-                                \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-elasticsearch-client-service-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.elasticsearch.ElasticSearchClientService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            },\n-                            \"schema-access-strategy\": {\n+                            \"Distribution Strategy\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"The name of the Schema to use is specified by the 'Schema Name' Property. The value of this property is used to lookup the Schema in the configured Schema Registry service.\",\n-                                        \"displayName\": \"Use 'Schema Name' Property\",\n-                                        \"value\": \"schema-name\"\n+                                        \"description\": \"Relationship selection is evenly distributed in a round robin fashion; all relationships must be available.\",\n+                                        \"displayName\": \"round robin\",\n+                                        \"value\": \"round robin\"\n                                     },\n                                     {\n-                                        \"description\": \"The text of the Schema itself is specified by the 'Schema Text' Property. The value of this property must be a valid Avro Schema. If Expression Language is used, the value of the 'Schema Text' property must be valid after substituting the expressions.\",\n-                                        \"displayName\": \"Use 'Schema Text' Property\",\n-                                        \"value\": \"schema-text-property\"\n+                                        \"description\": \"Relationship selection is distributed across all available relationships in order of their weight; at least one relationship must be available.\",\n+                                        \"displayName\": \"next available\",\n+                                        \"value\": \"next available\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Infer from Result\",\n-                                        \"value\": \"infer\"\n+                                        \"description\": \"Relationship selection is distributed by supplied LoadDistributionService Controller Service; at least one relationship must be available.\",\n+                                        \"displayName\": \"load distribution service\",\n+                                        \"value\": \"load distribution service\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Relationship selection is the first available relationship without further distribution among all relationships; at least one relationship must be available.\",\n+                                        \"displayName\": \"overflow\",\n+                                        \"value\": \"overflow\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"infer\",\n-                                \"description\": \"Specifies how to obtain the schema that is to be used for interpreting the data.\",\n-                                \"displayName\": \"Schema Access Strategy\",\n+                                \"defaultValue\": \"round robin\",\n+                                \"description\": \"Determines how the load will be distributed. Relationship weight is in numeric order where '1' has the greatest weight.\",\n+                                \"displayName\": \"Distribution Strategy\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"schema-access-strategy\",\n+                                \"name\": \"Distribution Strategy\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"schema-branch\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"schema-name\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n-                                        \"propertyName\": \"schema-access-strategy\"\n-                                    }\n-                                ],\n-                                \"description\": \"Specifies the name of the branch to use when looking up the schema in the Schema Registry property. If the chosen Schema Registry does not support branching, this value will be ignored.\",\n-                                \"displayName\": \"Schema Branch\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"schema-branch\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"schema-name\": {\n-                                \"defaultValue\": \"${schema.name}\",\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"schema-name\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n-                                        \"propertyName\": \"schema-access-strategy\"\n-                                    }\n-                                ],\n-                                \"description\": \"Specifies the name of the schema to lookup in the Schema Registry property\",\n-                                \"displayName\": \"Schema Name\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"schema-name\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"schema-registry\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"confluent-encoded\",\n-                                            \"schema-name\",\n-                                            \"hwx-schema-ref-attributes\",\n-                                            \"hwx-content-encoded-schema\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n-                                        \"propertyName\": \"schema-access-strategy\"\n-                                    }\n-                                ],\n-                                \"description\": \"Specifies the Controller Service to use for the Schema Registry\",\n-                                \"displayName\": \"Schema Registry\",\n+                            \"Number of Relationships\": {\n+                                \"defaultValue\": \"1\",\n+                                \"description\": \"Determines the number of Relationships to which the load should be distributed\",\n+                                \"displayName\": \"Number of Relationships\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"schema-registry\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.schemaregistry.services.SchemaRegistry\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            },\n-                            \"schema-text\": {\n-                                \"defaultValue\": \"${avro.schema}\",\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"schema-text-property\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n-                                        \"propertyName\": \"schema-access-strategy\"\n-                                    }\n-                                ],\n-                                \"description\": \"The text of an Avro-formatted Schema\",\n-                                \"displayName\": \"Schema Text\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"schema-text\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"schema-version\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"schema-name\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n-                                        \"propertyName\": \"schema-access-strategy\"\n-                                    }\n-                                ],\n-                                \"description\": \"Specifies the version of the schema to lookup in the Schema Registry. If not specified then the latest version of the schema will be retrieved.\",\n-                                \"displayName\": \"Schema Version\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"schema-version\",\n-                                \"required\": false,\n+                                \"name\": \"Number of Relationships\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             }\n                         },\n-                        \"providedApiImplementations\": [\n+                        \"sideEffectFree\": true,\n+                        \"supportedRelationships\": [\n                             {\n-                                \"artifact\": \"nifi-standard-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.lookup.LookupService\",\n-                                \"version\": \"1.27.0\"\n+                                \"description\": \"Where to route flowfiles for this relationship index\",\n+                                \"name\": \"1\"\n                             }\n                         ],\n+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\",\n+                            \"EVENT_DRIVEN\"\n+                        ],\n+                        \"supportsBatching\": true,\n                         \"supportsDynamicProperties\": true,\n+                        \"supportsDynamicRelationships\": true,\n+                        \"supportsEventDriven\": true,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"elasticsearch\",\n-                            \"enrich\",\n-                            \"lookup\",\n-                            \"record\"\n+                            \"distribute\",\n+                            \"load balance\",\n+                            \"round robin\",\n+                            \"route\",\n+                            \"weighted\"\n                         ],\n-                        \"type\": \"org.apache.nifi.elasticsearch.ElasticSearchLookupService\",\n-                        \"typeDescription\": \"Lookup a record from Elasticsearch Server associated with the specified document ID. The coordinates that are passed to the lookup must contain the key 'id'.\",\n-                        \"version\": \"1.27.0\"\n+                        \"triggerSerially\": false,\n+                        \"triggerWhenAnyDestinationAvailable\": true,\n+                        \"triggerWhenEmpty\": false,\n+                        \"type\": \"org.apache.nifi.processors.standard.DistributeLoad\",\n+                        \"typeDescription\": \"Distributes FlowFiles to downstream processors based on a Distribution Strategy. If using the Round Robin strategy, the default is to assign each destination a weighting of 1 (evenly distributed). However, optional properties can be added to the change this; adding a property with the name '5' and value '10' means that the relationship with name '5' will be receive 10 FlowFiles in each iteration instead of 1.\",\n+                        \"version\": \"1.27.0\",\n+                        \"writesAttributes\": [\n+                            {\n+                                \"description\": \"The name of the specific relationship the FlowFile has been routed through\",\n+                                \"name\": \"distribute.load.relationship\"\n+                            }\n+                        ]\n                     },\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-elasticsearch-client-service-nar\",\n+                        \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n+                        \"defaultBulletinLevel\": \"WARN\",\n+                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": 1,\n+                            \"EVENT_DRIVEN\": 0,\n+                            \"TIMER_DRIVEN\": 1\n+                        },\n+                        \"defaultPenaltyDuration\": \"30 sec\",\n+                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": \"* * * * * ?\",\n+                            \"TIMER_DRIVEN\": \"0 sec\"\n+                        },\n+                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n+                        \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n+                        \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"el-lookup-index\": {\n-                                \"description\": \"The name of the index to read from\",\n-                                \"displayName\": \"Index\",\n+                            \"Number of Copies\": {\n+                                \"defaultValue\": \"100\",\n+                                \"description\": \"Specifies how many copies of each incoming FlowFile will be made\",\n+                                \"displayName\": \"Number of Copies\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"el-lookup-index\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Number of Copies\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n-                            },\n-                            \"el-lookup-type\": {\n-                                \"description\": \"The type of this document (used by Elasticsearch for indexing and searching)\",\n-                                \"displayName\": \"Type\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"el-lookup-type\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"el-rest-client-service\": {\n-                                \"description\": \"An ElasticSearch client service to use for running queries.\",\n-                                \"displayName\": \"Client Service\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"el-rest-client-service\",\n-                                \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-elasticsearch-client-service-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.elasticsearch.ElasticSearchClientService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n                             }\n                         },\n-                        \"providedApiImplementations\": [\n-                            {\n-                                \"artifact\": \"nifi-standard-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.lookup.StringLookupService\",\n-                                \"version\": \"1.27.0\"\n-                            },\n+                        \"sideEffectFree\": false,\n+                        \"supportedRelationships\": [\n                             {\n-                                \"artifact\": \"nifi-standard-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.lookup.LookupService\",\n-                                \"version\": \"1.27.0\"\n+                                \"description\": \"The original FlowFile and all copies will be sent to this relationship\",\n+                                \"name\": \"success\"\n                             }\n                         ],\n+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\",\n+                            \"EVENT_DRIVEN\"\n+                        ],\n+                        \"supportsBatching\": true,\n                         \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicRelationships\": false,\n+                        \"supportsEventDriven\": true,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"elasticsearch\",\n-                            \"enrich\",\n-                            \"key\",\n-                            \"lookup\",\n-                            \"value\"\n+                            \"duplicate\",\n+                            \"load\",\n+                            \"test\"\n                         ],\n-                        \"type\": \"org.apache.nifi.elasticsearch.ElasticSearchStringLookupService\",\n-                        \"typeDescription\": \"Lookup a string value from Elasticsearch Server associated with the specified document ID. The coordinates that are passed to the lookup must contain the key 'id'.\",\n-                        \"version\": \"1.27.0\"\n-                    }\n-                ],\n-                \"processors\": [],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"1.27.0\"\n-        },\n-        {\n-            \"artifact\": \"nifi-parquet-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [\n+                        \"triggerSerially\": false,\n+                        \"triggerWhenAnyDestinationAvailable\": false,\n+                        \"triggerWhenEmpty\": false,\n+                        \"type\": \"org.apache.nifi.processors.standard.DuplicateFlowFile\",\n+                        \"typeDescription\": \"Intended for load testing, this processor will create the configured number of copies of each incoming FlowFile. The original FlowFile as well as all generated copies are sent to the 'success' relationship. In addition, each FlowFile gets an attribute 'copy.index' set to the copy number, where the original FlowFile gets a value of zero, and all copies receive incremented integer values.\",\n+                        \"version\": \"1.27.0\",\n+                        \"writesAttributes\": [\n+                            {\n+                                \"description\": \"A zero-based incrementing integer value based on which copy the FlowFile is.\",\n+                                \"name\": \"copy.index\"\n+                            }\n+                        ]\n+                    },\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-parquet-nar\",\n+                        \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n+                        \"defaultBulletinLevel\": \"WARN\",\n+                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": 1,\n+                            \"TIMER_DRIVEN\": 1\n+                        },\n+                        \"defaultPenaltyDuration\": \"30 sec\",\n+                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": \"* * * * * ?\",\n+                            \"TIMER_DRIVEN\": \"0 sec\"\n+                        },\n+                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n+                        \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n+                        \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"avro-read-compatibility\": {\n+                            \"Encoding\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"displayName\": \"base64\",\n+                                        \"value\": \"base64\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"displayName\": \"base32\",\n+                                        \"value\": \"base32\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"hex\",\n+                                        \"value\": \"hex\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"true\",\n-                                \"description\": \"Specifies the value for 'parquet.avro.compatible' in the underlying Parquet library\",\n-                                \"displayName\": \"Avro Read Compatibility\",\n+                                \"defaultValue\": \"base64\",\n+                                \"description\": \"Specifies the type of encoding used\",\n+                                \"displayName\": \"Encoding\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"avro-read-compatibility\",\n+                                \"name\": \"Encoding\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Mode\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Encode\",\n+                                        \"value\": \"Encode\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Decode\",\n+                                        \"value\": \"Decode\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"Encode\",\n+                                \"description\": \"Specifies whether the content should be encoded or decoded\",\n+                                \"displayName\": \"Mode\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Mode\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             }\n                         },\n-                        \"providedApiImplementations\": [\n+                        \"sideEffectFree\": true,\n+                        \"supportedRelationships\": [\n                             {\n-                                \"artifact\": \"nifi-standard-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n-                                \"version\": \"1.27.0\"\n+                                \"description\": \"Any FlowFile that is successfully encoded or decoded will be routed to success\",\n+                                \"name\": \"success\"\n+                            },\n+                            {\n+                                \"description\": \"Any FlowFile that cannot be encoded or decoded will be routed to failure\",\n+                                \"name\": \"failure\"\n                             }\n                         ],\n+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\"\n+                        ],\n+                        \"supportsBatching\": true,\n                         \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicRelationships\": false,\n+                        \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"parquet\",\n-                            \"parse\",\n-                            \"reader\",\n-                            \"record\",\n-                            \"row\"\n+                            \"base32\",\n+                            \"base64\",\n+                            \"decode\",\n+                            \"encode\",\n+                            \"hex\"\n                         ],\n-                        \"type\": \"org.apache.nifi.parquet.ParquetReader\",\n-                        \"typeDescription\": \"Parses Parquet data and returns each Parquet record as a separate Record object. The schema will come from the Parquet data itself.\",\n+                        \"triggerSerially\": false,\n+                        \"triggerWhenAnyDestinationAvailable\": false,\n+                        \"triggerWhenEmpty\": false,\n+                        \"type\": \"org.apache.nifi.processors.standard.EncodeContent\",\n+                        \"typeDescription\": \"Encode or decode the contents of a FlowFile using Base64, Base32, or hex encoding schemes\",\n                         \"version\": \"1.27.0\"\n                     },\n                     {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-parquet-nar\",\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n+                        \"defaultBulletinLevel\": \"WARN\",\n+                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": 1,\n+                            \"EVENT_DRIVEN\": 0,\n+                            \"TIMER_DRIVEN\": 1\n+                        },\n+                        \"defaultPenaltyDuration\": \"30 sec\",\n+                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": \"* * * * * ?\",\n+                            \"TIMER_DRIVEN\": \"0 sec\"\n+                        },\n+                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n+                        \"defaultYieldDuration\": \"1 sec\",\n+                        \"deprecated\": true,\n+                        \"deprecationAlternatives\": [\n+                            \"org.apache.nifi.processors.cipher.DecryptContent\",\n+                            \"org.apache.nifi.processors.cipher.DecryptContentAge\",\n+                            \"org.apache.nifi.processors.cipher.DecryptContentCompatibility\",\n+                            \"org.apache.nifi.processors.cipher.EncryptContentAge\",\n+                            \"org.apache.nifi.processors.pgp.DecryptContentPGP\",\n+                            \"org.apache.nifi.processors.pgp.EncryptContentPGP\"\n+                        ],\n+                        \"deprecationReason\": \"EncryptContentAge or EncryptContentPGP should be used for encrypting new files using standard formatting. DecryptContent supports deciphering historical files.\",\n                         \"group\": \"org.apache.nifi\",\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n+                        \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Schema Write Strategy\": {\n+                            \"Encryption Algorithm\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Do not add any schema-related information to the FlowFile.\",\n-                                        \"displayName\": \"Do Not Write Schema\",\n-                                        \"value\": \"no-schema\"\n+                                        \"description\": \"org.apache.nifi.security.util.EncryptionMethod@57a7583[Algorithm name=PBEWITHMD5AND128BITAES-CBC-OPENSSL,Requires unlimited strength JCE policy=false,Algorithm Provider=BC,Compatible with strong KDFs=false,Keyed cipher=false]\",\n+                                        \"displayName\": \"MD5_128AES\",\n+                                        \"value\": \"MD5_128AES\"\n                                     },\n                                     {\n-                                        \"description\": \"The FlowFile will be given an attribute named 'schema.name' and this attribute will indicate the name of the schema in the Schema Registry. Note that ifthe schema for a record is not obtained from a Schema Registry, then no attribute will be added.\",\n-                                        \"displayName\": \"Set 'schema.name' Attribute\",\n-                                        \"value\": \"schema-name\"\n+                                        \"description\": \"EncryptionMethod[Algorithm name=PBEWITHMD5AND192BITAES-CBC-OPENSSL,Requires unlimited strength JCE policy=true,Algorithm Provider=BC,Compatible with strong KDFs=false,Keyed cipher=false]\",\n+                                        \"displayName\": \"MD5_192AES\",\n+                                        \"value\": \"MD5_192AES\"\n                                     },\n                                     {\n-                                        \"description\": \"The FlowFile will be given an attribute named 'avro.schema' and this attribute will contain the Avro Schema that describes the records in the FlowFile. The contents of the FlowFile need not be Avro, but the text of the schema will be used.\",\n-                                        \"displayName\": \"Set 'avro.schema' Attribute\",\n-                                        \"value\": \"full-schema-attribute\"\n+                                        \"description\": \"EncryptionMethod[Algorithm name=PBEWITHMD5AND256BITAES-CBC-OPENSSL,Requires unlimited strength JCE policy=true,Algorithm Provider=BC,Compatible with strong KDFs=false,Keyed cipher=false]\",\n+                                        \"displayName\": \"MD5_256AES\",\n+                                        \"value\": \"MD5_256AES\"\n                                     },\n                                     {\n-                                        \"description\": \"The FlowFile will be given a set of 3 attributes to describe the schema: 'schema.identifier', 'schema.version', and 'schema.protocol.version'. Note that if the schema for a record does not contain the necessary identifier and version, an Exception will be thrown when attempting to write the data.\",\n-                                        \"displayName\": \"HWX Schema Reference Attributes\",\n-                                        \"value\": \"hwx-schema-ref-attributes\"\n+                                        \"description\": \"EncryptionMethod[Algorithm name=PBEWITHMD5ANDDES,Requires unlimited strength JCE policy=false,Algorithm Provider=BC,Compatible with strong KDFs=false,Keyed cipher=false]\",\n+                                        \"displayName\": \"MD5_DES\",\n+                                        \"value\": \"MD5_DES\"\n                                     },\n                                     {\n-                                        \"description\": \"The content of the FlowFile will contain a reference to a schema in the Schema Registry service. The reference is encoded as a single byte indicating the 'protocol version', followed by 8 bytes indicating the schema identifier, and finally 4 bytes indicating the schema version, as per the Hortonworks Schema Registry serializers and deserializers, as found at https://github.com/hortonworks/registry. This will be prepended to each FlowFile. Note that if the schema for a record does not contain the necessary identifier and version, an Exception will be thrown when attempting to write the data.\",\n-                                        \"displayName\": \"HWX Content-Encoded Schema Reference\",\n-                                        \"value\": \"hwx-content-encoded-schema\"\n+                                        \"description\": \"EncryptionMethod[Algorithm name=PBEWITHMD5ANDRC2,Requires unlimited strength JCE policy=false,Algorithm Provider=BC,Compatible with strong KDFs=false,Keyed cipher=false]\",\n+                                        \"displayName\": \"MD5_RC2\",\n+                                        \"value\": \"MD5_RC2\"\n                                     },\n                                     {\n-                                        \"description\": \"The content of the FlowFile will contain a reference to a schema in the Schema Registry service. The reference is encoded as a single 'Magic Byte' followed by 4 bytes representing the identifier of the schema, as outlined at http://docs.confluent.io/current/schema-registry/docs/serializer-formatter.html. This will be prepended to each FlowFile. Note that if the schema for a record does not contain the necessary identifier and version, an Exception will be thrown when attempting to write the data. This is based on the encoding used by version 3.2.x of the Confluent Schema Registry.\",\n-                                        \"displayName\": \"Confluent Schema Registry Reference\",\n-                                        \"value\": \"confluent-encoded\"\n+                                        \"description\": \"EncryptionMethod[Algorithm name=PBEWITHSHA1ANDRC2,Requires unlimited strength JCE policy=false,Algorithm Provider=BC,Compatible with strong KDFs=false,Keyed cipher=false]\",\n+                                        \"displayName\": \"SHA1_RC2\",\n+                                        \"value\": \"SHA1_RC2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"EncryptionMethod[Algorithm name=PBEWITHSHA1ANDDES,Requires unlimited strength JCE policy=false,Algorithm Provider=BC,Compatible with strong KDFs=false,Keyed cipher=false]\",\n+                                        \"displayName\": \"SHA1_DES\",\n+                                        \"value\": \"SHA1_DES\"\n+                                    },\n+                                    {\n+                                        \"description\": \"EncryptionMethod[Algorithm name=PBEWITHSHAAND128BITAES-CBC-BC,Requires unlimited strength JCE policy=false,Algorithm Provider=BC,Compatible with strong KDFs=false,Keyed cipher=false]\",\n+                                        \"displayName\": \"SHA_128AES\",\n+                                        \"value\": \"SHA_128AES\"\n+                                    },\n+                                    {\n+                                        \"description\": \"EncryptionMethod[Algorithm name=PBEWITHSHAAND192BITAES-CBC-BC,Requires unlimited strength JCE policy=true,Algorithm Provider=BC,Compatible with strong KDFs=false,Keyed cipher=false]\",\n+                                        \"displayName\": \"SHA_192AES\",\n+                                        \"value\": \"SHA_192AES\"\n+                                    },\n+                                    {\n+                                        \"description\": \"EncryptionMethod[Algorithm name=PBEWITHSHAAND256BITAES-CBC-BC,Requires unlimited strength JCE policy=true,Algorithm Provider=BC,Compatible with strong KDFs=false,Keyed cipher=false]\",\n+                                        \"displayName\": \"SHA_256AES\",\n+                                        \"value\": \"SHA_256AES\"\n+                                    },\n+                                    {\n+                                        \"description\": \"EncryptionMethod[Algorithm name=PBEWITHSHAAND40BITRC2-CBC,Requires unlimited strength JCE policy=false,Algorithm Provider=BC,Compatible with strong KDFs=false,Keyed cipher=false]\",\n+                                        \"displayName\": \"SHA_40RC2\",\n+                                        \"value\": \"SHA_40RC2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"EncryptionMethod[Algorithm name=PBEWITHSHAAND128BITRC2-CBC,Requires unlimited strength JCE policy=false,Algorithm Provider=BC,Compatible with strong KDFs=false,Keyed cipher=false]\",\n+                                        \"displayName\": \"SHA_128RC2\",\n+                                        \"value\": \"SHA_128RC2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"EncryptionMethod[Algorithm name=PBEWITHSHAAND40BITRC4,Requires unlimited strength JCE policy=false,Algorithm Provider=BC,Compatible with strong KDFs=false,Keyed cipher=false]\",\n+                                        \"displayName\": \"SHA_40RC4\",\n+                                        \"value\": \"SHA_40RC4\"\n+                                    },\n+                                    {\n+                                        \"description\": \"EncryptionMethod[Algorithm name=PBEWITHSHAAND128BITRC4,Requires unlimited strength JCE policy=false,Algorithm Provider=BC,Compatible with strong KDFs=false,Keyed cipher=false]\",\n+                                        \"displayName\": \"SHA_128RC4\",\n+                                        \"value\": \"SHA_128RC4\"\n+                                    },\n+                                    {\n+                                        \"description\": \"EncryptionMethod[Algorithm name=PBEWITHSHA256AND128BITAES-CBC-BC,Requires unlimited strength JCE policy=false,Algorithm Provider=BC,Compatible with strong KDFs=false,Keyed cipher=false]\",\n+                                        \"displayName\": \"SHA256_128AES\",\n+                                        \"value\": \"SHA256_128AES\"\n+                                    },\n+                                    {\n+                                        \"description\": \"EncryptionMethod[Algorithm name=PBEWITHSHA256AND192BITAES-CBC-BC,Requires unlimited strength JCE policy=true,Algorithm Provider=BC,Compatible with strong KDFs=false,Keyed cipher=false]\",\n+                                        \"displayName\": \"SHA256_192AES\",\n+                                        \"value\": \"SHA256_192AES\"\n+                                    },\n+                                    {\n+                                        \"description\": \"EncryptionMethod[Algorithm name=PBEWITHSHA256AND256BITAES-CBC-BC,Requires unlimited strength JCE policy=true,Algorithm Provider=BC,Compatible with strong KDFs=false,Keyed cipher=false]\",\n+                                        \"displayName\": \"SHA256_256AES\",\n+                                        \"value\": \"SHA256_256AES\"\n+                                    },\n+                                    {\n+                                        \"description\": \"EncryptionMethod[Algorithm name=PBEWITHSHAAND2-KEYTRIPLEDES-CBC,Requires unlimited strength JCE policy=false,Algorithm Provider=BC,Compatible with strong KDFs=false,Keyed cipher=false]\",\n+                                        \"displayName\": \"SHA_2KEYTRIPLEDES\",\n+                                        \"value\": \"SHA_2KEYTRIPLEDES\"\n+                                    },\n+                                    {\n+                                        \"description\": \"EncryptionMethod[Algorithm name=PBEWITHSHAAND3-KEYTRIPLEDES-CBC,Requires unlimited strength JCE policy=false,Algorithm Provider=BC,Compatible with strong KDFs=false,Keyed cipher=false]\",\n+                                        \"displayName\": \"SHA_3KEYTRIPLEDES\",\n+                                        \"value\": \"SHA_3KEYTRIPLEDES\"\n+                                    },\n+                                    {\n+                                        \"description\": \"EncryptionMethod[Algorithm name=PBEWITHSHAANDTWOFISH-CBC,Requires unlimited strength JCE policy=false,Algorithm Provider=BC,Compatible with strong KDFs=false,Keyed cipher=false]\",\n+                                        \"displayName\": \"SHA_TWOFISH\",\n+                                        \"value\": \"SHA_TWOFISH\"\n+                                    },\n+                                    {\n+                                        \"description\": \"EncryptionMethod[Algorithm name=PGP,Requires unlimited strength JCE policy=false,Algorithm Provider=BC,Compatible with strong KDFs=false,Keyed cipher=false]\",\n+                                        \"displayName\": \"PGP\",\n+                                        \"value\": \"PGP\"\n+                                    },\n+                                    {\n+                                        \"description\": \"EncryptionMethod[Algorithm name=PGP-ASCII-ARMOR,Requires unlimited strength JCE policy=false,Algorithm Provider=BC,Compatible with strong KDFs=false,Keyed cipher=false]\",\n+                                        \"displayName\": \"PGP_ASCII_ARMOR\",\n+                                        \"value\": \"PGP_ASCII_ARMOR\"\n+                                    },\n+                                    {\n+                                        \"description\": \"EncryptionMethod[Algorithm name=AES/CBC/NoPadding,Requires unlimited strength JCE policy=false,Algorithm Provider=BC,Compatible with strong KDFs=true,Keyed cipher=true]\",\n+                                        \"displayName\": \"AES_CBC_NO_PADDING\",\n+                                        \"value\": \"AES_CBC_NO_PADDING\"\n+                                    },\n+                                    {\n+                                        \"description\": \"EncryptionMethod[Algorithm name=AES/CBC/PKCS7Padding,Requires unlimited strength JCE policy=false,Algorithm Provider=BC,Compatible with strong KDFs=true,Keyed cipher=true]\",\n+                                        \"displayName\": \"AES_CBC\",\n+                                        \"value\": \"AES_CBC\"\n+                                    },\n+                                    {\n+                                        \"description\": \"EncryptionMethod[Algorithm name=AES/CTR/NoPadding,Requires unlimited strength JCE policy=false,Algorithm Provider=BC,Compatible with strong KDFs=true,Keyed cipher=true]\",\n+                                        \"displayName\": \"AES_CTR\",\n+                                        \"value\": \"AES_CTR\"\n+                                    },\n+                                    {\n+                                        \"description\": \"EncryptionMethod[Algorithm name=AES/GCM/NoPadding,Requires unlimited strength JCE policy=false,Algorithm Provider=BC,Compatible with strong KDFs=true,Keyed cipher=true]\",\n+                                        \"displayName\": \"AES_GCM\",\n+                                        \"value\": \"AES_GCM\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"no-schema\",\n-                                \"description\": \"Specifies how the schema for a Record should be added to the data.\",\n-                                \"displayName\": \"Schema Write Strategy\",\n+                                \"defaultValue\": \"AES_GCM\",\n+                                \"description\": \"The Encryption Algorithm to use\",\n+                                \"displayName\": \"Encryption Algorithm\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Schema Write Strategy\",\n+                                \"name\": \"Encryption Algorithm\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"avro-add-list-element-records\": {\n+                            \"Mode\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"displayName\": \"Encrypt\",\n+                                        \"value\": \"Encrypt\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"displayName\": \"Decrypt\",\n+                                        \"value\": \"Decrypt\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"true\",\n-                                \"description\": \"Specifies the value for 'parquet.avro.add-list-element-records' in the underlying Parquet library\",\n-                                \"displayName\": \"Avro Add List Element Records\",\n+                                \"defaultValue\": \"Encrypt\",\n+                                \"description\": \"Specifies whether the content should be encrypted or decrypted\",\n+                                \"displayName\": \"Mode\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"avro-add-list-element-records\",\n+                                \"name\": \"Mode\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"avro-write-old-list-structure\": {\n+                            \"Password\": {\n+                                \"description\": \"The Password to use for encrypting or decrypting the data\",\n+                                \"displayName\": \"Password\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Password\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n+                            },\n+                            \"allow-weak-crypto\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"description\": \"Operation will not be blocked and no alerts will be presented when unsafe combinations of encryption algorithms and passwords are provided\",\n+                                        \"displayName\": \"Allowed\",\n+                                        \"value\": \"allowed\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"description\": \"When set, operation will be blocked and alerts will be presented to the user if unsafe combinations of encryption algorithms and passwords are provided on a JVM with limited strength crypto. To fix this, see the Admin Guide.\",\n+                                        \"displayName\": \"Not Allowed\",\n+                                        \"value\": \"not-allowed\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"true\",\n-                                \"description\": \"Specifies the value for 'parquet.avro.write-old-list-structure' in the underlying Parquet library\",\n-                                \"displayName\": \"Avro Write Old List Structure\",\n+                                \"defaultValue\": \"not-allowed\",\n+                                \"description\": \"Overrides the default behavior to prevent unsafe combinations of encryption algorithms and short passwords on JVMs with limited strength cryptographic jurisdiction policies\",\n+                                \"displayName\": \"Allow insecure cryptographic modes\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"avro-write-old-list-structure\",\n+                                \"name\": \"allow-weak-crypto\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"cache-size\": {\n-                                \"defaultValue\": \"1000\",\n-                                \"description\": \"Specifies how many Schemas should be cached\",\n-                                \"displayName\": \"Cache Size\",\n+                            \"key-derivation-function\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"The cipher is given a raw key conforming to the algorithm specifications\",\n+                                        \"displayName\": \"None\",\n+                                        \"value\": \"NONE\"\n+                                    },\n+                                    {\n+                                        \"description\": \"MD5 @ 1000 iterations\",\n+                                        \"displayName\": \"NiFi Legacy KDF\",\n+                                        \"value\": \"NIFI_LEGACY\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Single iteration MD5 compatible with PKCS#5 v1.5\",\n+                                        \"displayName\": \"OpenSSL EVP_BytesToKey\",\n+                                        \"value\": \"OPENSSL_EVP_BYTES_TO_KEY\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Bcrypt with configurable work factor. See Admin Guide\",\n+                                        \"displayName\": \"Bcrypt\",\n+                                        \"value\": \"BCRYPT\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Scrypt with configurable cost parameters. See Admin Guide\",\n+                                        \"displayName\": \"Scrypt\",\n+                                        \"value\": \"SCRYPT\"\n+                                    },\n+                                    {\n+                                        \"description\": \"PBKDF2 with configurable hash function and iteration count. See Admin Guide\",\n+                                        \"displayName\": \"PBKDF2\",\n+                                        \"value\": \"PBKDF2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Argon2 with configurable cost parameters. See Admin Guide.\",\n+                                        \"displayName\": \"Argon2\",\n+                                        \"value\": \"ARGON2\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"NONE\",\n+                                \"description\": \"Specifies the key derivation function to generate the key from the password (and salt)\",\n+                                \"displayName\": \"Key Derivation Function\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"cache-size\",\n+                                \"name\": \"key-derivation-function\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"compression-type\": {\n+                            \"pgp-symmetric-cipher\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"UNCOMPRESSED\",\n-                                        \"value\": \"UNCOMPRESSED\"\n+                                        \"displayName\": \"IDEA\",\n+                                        \"value\": \"1\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"SNAPPY\",\n-                                        \"value\": \"SNAPPY\"\n+                                        \"displayName\": \"TRIPLE_DES\",\n+                                        \"value\": \"2\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"GZIP\",\n-                                        \"value\": \"GZIP\"\n+                                        \"displayName\": \"CAST5\",\n+                                        \"value\": \"3\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"LZO\",\n-                                        \"value\": \"LZO\"\n+                                        \"displayName\": \"BLOWFISH\",\n+                                        \"value\": \"4\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"BROTLI\",\n-                                        \"value\": \"BROTLI\"\n+                                        \"displayName\": \"DES\",\n+                                        \"value\": \"6\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"LZ4\",\n-                                        \"value\": \"LZ4\"\n+                                        \"displayName\": \"AES_128\",\n+                                        \"value\": \"7\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"ZSTD\",\n-                                        \"value\": \"ZSTD\"\n+                                        \"displayName\": \"AES_192\",\n+                                        \"value\": \"8\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"LZ4_RAW\",\n-                                        \"value\": \"LZ4_RAW\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"UNCOMPRESSED\",\n-                                \"description\": \"The type of compression for the file being written.\",\n-                                \"displayName\": \"Compression Type\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"compression-type\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"dictionary-page-size\": {\n-                                \"description\": \"The dictionary page size used by the Parquet writer. The value is specified in the format of <Data Size> <Data Unit> where Data Unit is one of B, KB, MB, GB, TB.\",\n-                                \"displayName\": \"Dictionary Page Size\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"dictionary-page-size\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"enable-dictionary-encoding\": {\n-                                \"allowableValues\": [\n+                                        \"displayName\": \"AES_256\",\n+                                        \"value\": \"9\"\n+                                    },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"displayName\": \"TWOFISH\",\n+                                        \"value\": \"10\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"description\": \"Specifies whether dictionary encoding should be enabled for the Parquet writer\",\n-                                \"displayName\": \"Enable Dictionary Encoding\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"enable-dictionary-encoding\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"enable-validation\": {\n-                                \"allowableValues\": [\n+                                        \"displayName\": \"CAMELLIA_128\",\n+                                        \"value\": \"11\"\n+                                    },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"displayName\": \"CAMELLIA_192\",\n+                                        \"value\": \"12\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"displayName\": \"CAMELLIA_256\",\n+                                        \"value\": \"13\"\n                                     }\n                                 ],\n-                                \"description\": \"Specifies whether validation should be enabled for the Parquet writer\",\n-                                \"displayName\": \"Enable Validation\",\n+                                \"defaultValue\": \"7\",\n+                                \"description\": \"When using PGP encryption, this is the symmetric cipher to be used. This property is ignored if Encryption Algorithm is not PGP or PGP-ASCII-ARMOR\\nNote that the provided cipher is only used duringthe encryption phase, while it is inferred from the ciphertext in the decryption phase\",\n+                                \"displayName\": \"PGP Symmetric Cipher\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"enable-validation\",\n+                                \"name\": \"pgp-symmetric-cipher\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"int96-fields\": {\n-                                \"description\": \"List of fields with full path that should be treated as INT96 timestamps.\",\n-                                \"displayName\": \"INT96 Fields\",\n+                            \"private-keyring-file\": {\n+                                \"description\": \"In a PGP decrypt mode, this keyring contains the private key of the recipient\",\n+                                \"displayName\": \"Private Keyring File\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"int96-fields\",\n+                                \"name\": \"private-keyring-file\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"max-padding-size\": {\n-                                \"description\": \"The maximum amount of padding that will be used to align row groups with blocks in the underlying filesystem. If the underlying filesystem is not a block filesystem like HDFS, this has no effect. The value is specified in the format of <Data Size> <Data Unit> where Data Unit is one of B, KB, MB, GB, TB.\",\n-                                \"displayName\": \"Max Padding Size\",\n+                            \"private-keyring-passphrase\": {\n+                                \"description\": \"In a PGP decrypt mode, this is the private keyring passphrase\",\n+                                \"displayName\": \"Private Keyring Passphrase\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"max-padding-size\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"private-keyring-passphrase\",\n                                 \"required\": false,\n-                                \"sensitive\": false\n+                                \"sensitive\": true\n                             },\n-                            \"page-size\": {\n-                                \"description\": \"The page size used by the Parquet writer. The value is specified in the format of <Data Size> <Data Unit> where Data Unit is one of B, KB, MB, GB, TB.\",\n-                                \"displayName\": \"Page Size\",\n+                            \"public-key-user-id\": {\n+                                \"description\": \"In a PGP encrypt mode, this user id of the recipient\",\n+                                \"displayName\": \"Public Key User Id\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"page-size\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"public-key-user-id\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"row-group-size\": {\n-                                \"description\": \"The row group size used by the Parquet writer. The value is specified in the format of <Data Size> <Data Unit> where Data Unit is one of B, KB, MB, GB, TB.\",\n-                                \"displayName\": \"Row Group Size\",\n+                            \"public-keyring-file\": {\n+                                \"description\": \"In a PGP encrypt mode, this keyring contains the public key of the recipient\",\n+                                \"displayName\": \"Public Keyring File\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"row-group-size\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"public-keyring-file\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"schema-access-strategy\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"The schema used to write records will be the same schema that was given to the Record when the Record was created.\",\n-                                        \"displayName\": \"Inherit Record Schema\",\n-                                        \"value\": \"inherit-record-schema\"\n-                                    },\n-                                    {\n-                                        \"description\": \"The name of the Schema to use is specified by the 'Schema Name' Property. The value of this property is used to lookup the Schema in the configured Schema Registry service.\",\n-                                        \"displayName\": \"Use 'Schema Name' Property\",\n-                                        \"value\": \"schema-name\"\n-                                    },\n-                                    {\n-                                        \"description\": \"The text of the Schema itself is specified by the 'Schema Text' Property. The value of this property must be a valid Avro Schema. If Expression Language is used, the value of the 'Schema Text' property must be valid after substituting the expressions.\",\n-                                        \"displayName\": \"Use 'Schema Text' Property\",\n-                                        \"value\": \"schema-text-property\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"inherit-record-schema\",\n-                                \"description\": \"Specifies how to obtain the schema that is to be used for interpreting the data.\",\n-                                \"displayName\": \"Schema Access Strategy\",\n+                            \"raw-key-hex\": {\n+                                \"description\": \"In keyed encryption, this is the raw key, encoded in hexadecimal\",\n+                                \"displayName\": \"Raw Key (hexadecimal)\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"schema-access-strategy\",\n+                                \"name\": \"raw-key-hex\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n+                            }\n+                        },\n+                        \"sideEffectFree\": true,\n+                        \"supportedRelationships\": [\n+                            {\n+                                \"description\": \"Any FlowFile that is successfully encrypted or decrypted will be routed to success\",\n+                                \"name\": \"success\"\n+                            },\n+                            {\n+                                \"description\": \"Any FlowFile that cannot be encrypted or decrypted will be routed to failure\",\n+                                \"name\": \"failure\"\n+                            }\n+                        ],\n+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\",\n+                            \"EVENT_DRIVEN\"\n+                        ],\n+                        \"supportsBatching\": true,\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicRelationships\": false,\n+                        \"supportsEventDriven\": true,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"systemResourceConsiderations\": [\n+                            {\n+                                \"description\": \"An instance of this component can cause high usage of this system resource.  Multiple instances or high concurrency settings may result a degradation of performance.\",\n+                                \"resource\": \"CPU\"\n+                            }\n+                        ],\n+                        \"tags\": [\n+                            \"Argon2\",\n+                            \"Bcrypt\",\n+                            \"JCE\",\n+                            \"KDF\",\n+                            \"PBKDF2\",\n+                            \"Scrypt\",\n+                            \"decryption\",\n+                            \"encryption\",\n+                            \"iv\",\n+                            \"password\",\n+                            \"salt\"\n+                        ],\n+                        \"triggerSerially\": false,\n+                        \"triggerWhenAnyDestinationAvailable\": false,\n+                        \"triggerWhenEmpty\": false,\n+                        \"type\": \"org.apache.nifi.processors.standard.EncryptContent\",\n+                        \"typeDescription\": \"Encrypts or Decrypts a FlowFile using either symmetric encryption with a raw key or password and randomly generated salt, or asymmetric encryption using a public and secret key.\",\n+                        \"version\": \"1.27.0\",\n+                        \"writesAttributes\": [\n+                            {\n+                                \"description\": \"\\\"encrypted\\\" or \\\"decrypted\\\" depending on the processor action\",\n+                                \"name\": \"encryptcontent.action\"\n+                            },\n+                            {\n+                                \"description\": \"The algorithm used for the cryptographic operation\",\n+                                \"name\": \"encryptcontent.algorithm\"\n+                            },\n+                            {\n+                                \"description\": \"The cipher text length in bytes (including IV, salt, and delimiters if present). Determined from incoming content in decrypt mode; outgoing content in encrypt mode\",\n+                                \"name\": \"encryptcontent.cipher_text_length\"\n+                            },\n+                            {\n+                                \"description\": \"The Initialization Vector in hex encoding (if present)\",\n+                                \"name\": \"encryptcontent.iv\"\n+                            },\n+                            {\n+                                \"description\": \"The IV length in bytes\",\n+                                \"name\": \"encryptcontent.iv_length\"\n+                            },\n+                            {\n+                                \"description\": \"The Key Derivation Function used if Password-Based Encryption was enabled. See Admin Guide - Key Derivation Functions\",\n+                                \"name\": \"encryptcontent.kdf\"\n+                            },\n+                            {\n+                                \"description\": \"The KDF-specific salt including algorithm and cost parameters (if present). See Admin Guide - Key Derivation Functions\",\n+                                \"name\": \"encryptcontent.kdf_salt\"\n+                            },\n+                            {\n+                                \"description\": \"The KDF salt length in bytes\",\n+                                \"name\": \"encryptcontent.kdf_salt_length\"\n+                            },\n+                            {\n+                                \"description\": \"The number of iterations used in PBKDF2 KDF (if present). PBKDF2 does not encode the cost parameter in a custom salt\",\n+                                \"name\": \"encryptcontent.pbkdf2_iterations\"\n+                            },\n+                            {\n+                                \"description\": \"The plaintext length in bytes. Determined from incoming content in encrypt mode; outgoing content in decrypt mode\",\n+                                \"name\": \"encryptcontent.plaintext_length\"\n+                            },\n+                            {\n+                                \"description\": \"The raw salt in hex encoding (if present)\",\n+                                \"name\": \"encryptcontent.salt\"\n+                            },\n+                            {\n+                                \"description\": \"The raw salt length in bytes\",\n+                                \"name\": \"encryptcontent.salt_length\"\n+                            },\n+                            {\n+                                \"description\": \"The timestamp at which the cryptographic operation occurred in 'yyyy-MM-dd HH:mm:ss.SSS Z' format\",\n+                                \"name\": \"encryptcontent.timestamp\"\n+                            }\n+                        ]\n+                    },\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-standard-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"e0c4461\"\n+                        },\n+                        \"defaultBulletinLevel\": \"WARN\",\n+                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": 1,\n+                            \"EVENT_DRIVEN\": 0,\n+                            \"TIMER_DRIVEN\": 1\n+                        },\n+                        \"defaultPenaltyDuration\": \"30 sec\",\n+                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": \"* * * * * ?\",\n+                            \"TIMER_DRIVEN\": \"0 sec\"\n+                        },\n+                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n+                        \"defaultYieldDuration\": \"1 sec\",\n+                        \"group\": \"org.apache.nifi\",\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n+                        \"primaryNodeOnly\": false,\n+                        \"propertyDescriptors\": {\n+                            \"batch-count\": {\n+                                \"defaultValue\": \"1000\",\n+                                \"description\": \"The maximum number of FlowFiles that EnforceOrder can process at an execution.\",\n+                                \"displayName\": \"Batch Count\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"batch-count\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"schema-branch\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"schema-name\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n-                                        \"propertyName\": \"schema-access-strategy\"\n-                                    }\n-                                ],\n-                                \"description\": \"Specifies the name of the branch to use when looking up the schema in the Schema Registry property. If the chosen Schema Registry does not support branching, this value will be ignored.\",\n-                                \"displayName\": \"Schema Branch\",\n+                            \"group-id\": {\n+                                \"defaultValue\": \"${filename}\",\n+                                \"description\": \"EnforceOrder is capable of multiple ordering groups. 'Group Identifier' is used to determine which group a FlowFile belongs to. This property will be evaluated with each incoming FlowFile. If evaluated result is empty, the FlowFile will be routed to failure.\",\n+                                \"displayName\": \"Group Identifier\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"schema-branch\",\n-                                \"required\": false,\n+                                \"name\": \"group-id\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"schema-cache\": {\n-                                \"description\": \"Specifies a Schema Cache to add the Record Schema to so that Record Readers can quickly lookup the schema.\",\n-                                \"displayName\": \"Schema Cache\",\n+                            \"inactive-timeout\": {\n+                                \"defaultValue\": \"30 min\",\n+                                \"description\": \"Indicates the duration after which state for an inactive group will be cleared from managed state. Group is determined as inactive if any new incoming FlowFile has not seen for a group for specified duration. Inactive Timeout must be longer than Wait Timeout. If a FlowFile arrives late after its group is already cleared, it will be treated as a brand new group, but will never match the order since expected preceding FlowFiles are already gone. The FlowFile will eventually timeout for waiting and routed to 'overtook'. To avoid this, group states should be kept long enough, however, shorter duration would be helpful for reusing the same group identifier again.\",\n+                                \"displayName\": \"Inactive Timeout\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"schema-cache\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.serialization.RecordSchemaCacheService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n+                                \"name\": \"inactive-timeout\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n                             },\n-                            \"schema-name\": {\n-                                \"defaultValue\": \"${schema.name}\",\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"schema-name\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n-                                        \"propertyName\": \"schema-access-strategy\"\n-                                    }\n-                                ],\n-                                \"description\": \"Specifies the name of the schema to lookup in the Schema Registry property\",\n-                                \"displayName\": \"Schema Name\",\n+                            \"initial-order\": {\n+                                \"defaultValue\": \"0\",\n+                                \"description\": \"When the first FlowFile of a group arrives, initial target order will be computed and stored in the managed state. After that, target order will start being tracked by EnforceOrder and stored in the state management store. If Expression Language is used but evaluated result was not an integer, then the FlowFile will be routed to failure, and initial order will be left unknown until consecutive FlowFiles provide a valid initial order.\",\n+                                \"displayName\": \"Initial Order\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"schema-name\",\n-                                \"required\": false,\n+                                \"name\": \"initial-order\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"schema-protocol-version\": {\n-                                \"defaultValue\": \"1\",\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"hwx-schema-ref-attributes\",\n-                                            \"hwx-content-encoded-schema\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Schema Write Strategy\",\n-                                        \"propertyName\": \"Schema Write Strategy\"\n-                                    }\n-                                ],\n-                                \"description\": \"The protocol version to be used for Schema Write Strategies that require a protocol version, such as Hortonworks Schema Registry strategies. Valid protocol versions for Hortonworks Schema Registry are integer values 1, 2, or 3.\",\n-                                \"displayName\": \"Schema Protocol Version\",\n+                            \"maximum-order\": {\n+                                \"description\": \"If specified, any FlowFiles that have larger order will be routed to failure. This property is computed only once for a given group. After a maximum order is computed, it will be persisted in the state management store and used for other FlowFiles belonging to the same group. If Expression Language is used but evaluated result was not an integer, then the FlowFile will be routed to failure, and maximum order will be left unknown until consecutive FlowFiles provide a valid maximum order.\",\n+                                \"displayName\": \"Maximum Order\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"schema-protocol-version\",\n+                                \"name\": \"maximum-order\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"schema-registry\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"confluent-encoded\",\n-                                            \"schema-name\",\n-                                            \"hwx-schema-ref-attributes\",\n-                                            \"hwx-content-encoded-schema\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n-                                        \"propertyName\": \"schema-access-strategy\"\n-                                    }\n-                                ],\n-                                \"description\": \"Specifies the Controller Service to use for the Schema Registry\",\n-                                \"displayName\": \"Schema Registry\",\n+                            \"order-attribute\": {\n+                                \"description\": \"A name of FlowFile attribute whose value will be used to enforce order of FlowFiles within a group. If a FlowFile does not have this attribute, or its value is not an integer, the FlowFile will be routed to failure.\",\n+                                \"displayName\": \"Order Attribute\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"schema-registry\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.schemaregistry.services.SchemaRegistry\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            },\n-                            \"schema-text\": {\n-                                \"defaultValue\": \"${avro.schema}\",\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"schema-text-property\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n-                                        \"propertyName\": \"schema-access-strategy\"\n-                                    }\n-                                ],\n-                                \"description\": \"The text of an Avro-formatted Schema\",\n-                                \"displayName\": \"Schema Text\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"schema-text\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"schema-version\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"schema-name\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n-                                        \"propertyName\": \"schema-access-strategy\"\n-                                    }\n-                                ],\n-                                \"description\": \"Specifies the version of the schema to lookup in the Schema Registry. If not specified then the latest version of the schema will be retrieved.\",\n-                                \"displayName\": \"Schema Version\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"schema-version\",\n-                                \"required\": false,\n+                                \"name\": \"order-attribute\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"writer-version\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"PARQUET_1_0\",\n-                                        \"value\": \"PARQUET_1_0\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"PARQUET_2_0\",\n-                                        \"value\": \"PARQUET_2_0\"\n-                                    }\n-                                ],\n-                                \"description\": \"Specifies the version used by Parquet writer\",\n-                                \"displayName\": \"Writer Version\",\n+                            \"wait-timeout\": {\n+                                \"defaultValue\": \"10 min\",\n+                                \"description\": \"Indicates the duration after which waiting FlowFiles will be routed to the 'overtook' relationship.\",\n+                                \"displayName\": \"Wait Timeout\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"writer-version\",\n-                                \"required\": false,\n+                                \"name\": \"wait-timeout\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             }\n                         },\n-                        \"providedApiImplementations\": [\n+                        \"sideEffectFree\": false,\n+                        \"stateful\": {\n+                            \"description\": \"EnforceOrder uses following states per ordering group: '<groupId>.target' is a order number which is being waited to arrive next. When a FlowFile with a matching order arrives, or a FlowFile overtakes the FlowFile being waited for because of wait timeout, target order will be updated to (FlowFile.order + 1). '<groupId>.max is the maximum order number for a group. '<groupId>.updatedAt' is a timestamp when the order of a group was updated last time. These managed states will be removed automatically once a group is determined as inactive, see 'Inactive Timeout' for detail.\",\n+                            \"scopes\": [\n+                                \"LOCAL\"\n+                            ]\n+                        },\n+                        \"supportedRelationships\": [\n                             {\n-                                \"artifact\": \"nifi-standard-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n-                                \"version\": \"1.27.0\"\n+                                \"description\": \"A FlowFile that waited for preceding FlowFiles longer than Wait Timeout and overtook those FlowFiles, will be routed to this relationship.\",\n+                                \"name\": \"overtook\"\n+                            },\n+                            {\n+                                \"description\": \"A FlowFile that has an order younger than current, which means arrived too late and skipped, will be routed to this relationship.\",\n+                                \"name\": \"skipped\"\n+                            },\n+                            {\n+                                \"description\": \"A FlowFile with a matching order number will be routed to this relationship.\",\n+                                \"name\": \"success\"\n+                            },\n+                            {\n+                                \"description\": \"A FlowFile with non matching order will be routed to this relationship\",\n+                                \"name\": \"wait\"\n+                            },\n+                            {\n+                                \"description\": \"A FlowFiles which does not have required attributes, or fails to compute those will be routed to this relationship\",\n+                                \"name\": \"failure\"\n                             }\n                         ],\n+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\",\n+                            \"EVENT_DRIVEN\"\n+                        ],\n+                        \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicRelationships\": false,\n+                        \"supportsEventDriven\": true,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"parquet\",\n-                            \"record\",\n-                            \"recordset\",\n-                            \"result\",\n-                            \"row\",\n-                            \"serializer\",\n-                            \"set\",\n-                            \"writer\"\n+                            \"order\",\n+                            \"sort\"\n                         ],\n-                        \"type\": \"org.apache.nifi.parquet.ParquetRecordSetWriter\",\n-                        \"typeDescription\": \"Writes the contents of a RecordSet in Parquet format.\",\n-                        \"version\": \"1.27.0\"\n-                    }\n-                ],\n-                \"processors\": [\n+                        \"triggerSerially\": true,\n+                        \"triggerWhenAnyDestinationAvailable\": false,\n+                        \"triggerWhenEmpty\": false,\n+                        \"type\": \"org.apache.nifi.processors.standard.EnforceOrder\",\n+                        \"typeDescription\": \"Enforces expected ordering of FlowFiles that belong to the same data group within a single node.  Although PriorityAttributePrioritizer can be used on a connection to ensure that flow files going through that connection are in priority order, depending on error-handling, branching, and other flow designs, it is possible for FlowFiles to get out-of-order. EnforceOrder can be used to enforce original ordering for those FlowFiles. [IMPORTANT] In order to take effect of EnforceOrder, FirstInFirstOutPrioritizer should be used at EVERY downstream relationship UNTIL the order of FlowFiles physically get FIXED by operation such as MergeContent or being stored to the final destination.\",\n+                        \"version\": \"1.27.0\",\n+                        \"writesAttributes\": [\n+                            {\n+                                \"description\": \"All FlowFiles going through this processor will have this attribute. This value is used to determine wait timeout.\",\n+                                \"name\": \"EnforceOrder.startedAt\"\n+                            },\n+                            {\n+                                \"description\": \"All FlowFiles going through this processor will have this attribute denoting which relationship it was routed to.\",\n+                                \"name\": \"EnforceOrder.result\"\n+                            },\n+                            {\n+                                \"description\": \"FlowFiles routed to 'failure' or 'skipped' relationship will have this attribute describing details.\",\n+                                \"name\": \"EnforceOrder.detail\"\n+                            },\n+                            {\n+                                \"description\": \"FlowFiles routed to 'wait' or 'skipped' relationship will have this attribute denoting expected order when the FlowFile was processed.\",\n+                                \"name\": \"EnforceOrder.expectedOrder\"\n+                            }\n+                        ]\n+                    },\n                     {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-parquet-nar\",\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n+                            \"EVENT_DRIVEN\": 0,\n                             \"TIMER_DRIVEN\": 1\n                         },\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n+                        \"dynamicProperties\": [\n+                            {\n+                                \"description\": \"If <Destination>='flowfile-attribute' then that FlowFile attribute will be set to any JSON objects that match the JsonPath.  If <Destination>='flowfile-content' then the FlowFile content will be updated to any JSON objects that match the JsonPath.\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"name\": \"A FlowFile attribute(if <Destination> is set to 'flowfile-attribute')\",\n+                                \"value\": \"A JsonPath expression\"\n+                            }\n+                        ],\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Records Per Split\": {\n-                                \"description\": \"Specifies how many records should be covered in each FlowFile\",\n-                                \"displayName\": \"Records Per Split\",\n+                            \"Destination\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"flowfile-content\",\n+                                        \"value\": \"flowfile-content\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"flowfile-attribute\",\n+                                        \"value\": \"flowfile-attribute\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"flowfile-content\",\n+                                \"description\": \"Indicates whether the results of the JsonPath evaluation are written to the FlowFile content or a FlowFile attribute; if using attribute, must specify the Attribute Name property. If set to flowfile-content, only one JsonPath may be specified, and the property name is ignored.\",\n+                                \"displayName\": \"Destination\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Records Per Split\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Destination\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Zero Content Output\": {\n+                            \"Max String Length\": {\n+                                \"defaultValue\": \"20 MB\",\n+                                \"description\": \"The maximum allowed length of a string value when parsing the JSON document\",\n+                                \"displayName\": \"Max String Length\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Max String Length\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Null Value Representation\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"displayName\": \"empty string\",\n+                                        \"value\": \"empty string\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"displayName\": \"the string 'null'\",\n+                                        \"value\": \"the string 'null'\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"Whether to do, or do not copy the content of input FlowFile.\",\n-                                \"displayName\": \"Zero Content Output\",\n+                                \"defaultValue\": \"empty string\",\n+                                \"description\": \"Indicates the desired representation of JSON Path expressions resulting in a null value.\",\n+                                \"displayName\": \"Null Value Representation\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Zero Content Output\",\n+                                \"name\": \"Null Value Representation\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Path Not Found Behavior\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"warn\",\n+                                        \"value\": \"warn\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"ignore\",\n+                                        \"value\": \"ignore\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"skip\",\n+                                        \"value\": \"skip\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"ignore\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"flowfile-attribute\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Destination\",\n+                                        \"propertyName\": \"Destination\"\n+                                    }\n+                                ],\n+                                \"description\": \"Indicates how to handle missing JSON path expressions when destination is set to 'flowfile-attribute'. Selecting 'warn' will generate a warning when a JSON path expression is not found. Selecting 'skip' will omit attributes for any unmatched JSON path expressions.\",\n+                                \"displayName\": \"Path Not Found Behavior\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Path Not Found Behavior\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Return Type\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"auto-detect\",\n+                                        \"value\": \"auto-detect\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"json\",\n+                                        \"value\": \"json\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"scalar\",\n+                                        \"value\": \"scalar\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"auto-detect\",\n+                                \"description\": \"Indicates the desired return type of the JSON Path expressions.  Selecting 'auto-detect' will set the return type to 'json' for a Destination of 'flowfile-content', and 'scalar' for a Destination of 'flowfile-attribute'.\",\n+                                \"displayName\": \"Return Type\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Return Type\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             }\n                         },\n-                        \"readsAttributes\": [\n-                            {\n-                                \"description\": \"Gets the index of first record in the input.\",\n-                                \"name\": \"record.offset\"\n-                            },\n+                        \"sideEffectFree\": true,\n+                        \"supportedRelationships\": [\n                             {\n-                                \"description\": \"Gets the number of records in the input.\",\n-                                \"name\": \"record.count\"\n+                                \"description\": \"FlowFiles are routed to this relationship when the JsonPath cannot be evaluated against the content of the FlowFile; for instance, if the FlowFile is not valid JSON\",\n+                                \"name\": \"failure\"\n                             },\n                             {\n-                                \"description\": \"Gets the start offset of the selected row group in the parquet file.\",\n-                                \"name\": \"parquet.file.range.startOffset\"\n+                                \"description\": \"FlowFiles are routed to this relationship when the JsonPath does not match the content of the FlowFile and the Destination is set to flowfile-content\",\n+                                \"name\": \"unmatched\"\n                             },\n                             {\n-                                \"description\": \"Gets the end offset of the selected row group in the parquet file.\",\n-                                \"name\": \"parquet.file.range.endOffset\"\n-                            }\n-                        ],\n-                        \"sideEffectFree\": true,\n-                        \"supportedRelationships\": [\n-                            {\n-                                \"description\": \"FlowFiles, with special attributes that represent a chunk of the input file.\",\n-                                \"name\": \"success\"\n+                                \"description\": \"FlowFiles are routed to this relationship when the JsonPath is successfully evaluated and the FlowFile is modified as a result\",\n+                                \"name\": \"matched\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n+                            \"CRON_DRIVEN\",\n+                            \"EVENT_DRIVEN\"\n                         ],\n-                        \"supportsBatching\": false,\n-                        \"supportsDynamicProperties\": false,\n+                        \"supportsBatching\": true,\n+                        \"supportsDynamicProperties\": true,\n                         \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": false,\n+                        \"supportsEventDriven\": true,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"break apart\",\n-                            \"cluster\",\n-                            \"efficient processing\",\n-                            \"load balance\",\n-                            \"parquet\",\n-                            \"partition\",\n-                            \"split\"\n+                            \"JSON\",\n+                            \"JsonPath\",\n+                            \"evaluate\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.parquet.CalculateParquetOffsets\",\n-                        \"typeDescription\": \"The processor generates N flow files from the input, and adds attributes with the offsets required to read the group of rows in the FlowFile's content. Can be used to increase the overall efficiency of processing extremely large Parquet files.\",\n-                        \"version\": \"1.27.0\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"Sets the index of first record of the parquet file.\",\n-                                \"name\": \"record.offset\"\n-                            },\n-                            {\n-                                \"description\": \"Sets the number of records in the parquet file.\",\n-                                \"name\": \"record.count\"\n-                            }\n-                        ]\n+                        \"type\": \"org.apache.nifi.processors.standard.EvaluateJsonPath\",\n+                        \"typeDescription\": \"Evaluates one or more JsonPath expressions against the content of a FlowFile. The results of those expressions are assigned to FlowFile Attributes or are written to the content of the FlowFile itself, depending on configuration of the Processor. JsonPaths are entered by adding user-defined properties; the name of the property maps to the Attribute Name into which the result will be placed (if the Destination is flowfile-attribute; otherwise, the property name is ignored). The value of the property must be a valid JsonPath expression. A Return Type of 'auto-detect' will make a determination based off the configured destination. When 'Destination' is set to 'flowfile-attribute,' a return type of 'scalar' will be used. When 'Destination' is set to 'flowfile-content,' a return type of 'JSON' will be used.If the JsonPath evaluates to a JSON array or JSON object and the Return Type is set to 'scalar' the FlowFile will be unmodified and will be routed to failure. A Return Type of JSON can return scalar values if the provided JsonPath evaluates to the specified value and will be routed as a match.If Destination is 'flowfile-content' and the JsonPath does not evaluate to a defined path, the FlowFile will be routed to 'unmatched' without having its contents modified. If Destination is 'flowfile-attribute' and the expression matches nothing, attributes will be created with empty strings as the value unless 'Path Not Found Behaviour' is set to 'skip', and the FlowFile will always be routed to 'matched.'\",\n+                        \"version\": \"1.27.0\"\n                     },\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-parquet-nar\",\n+                        \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n+                            \"EVENT_DRIVEN\": 0,\n                             \"TIMER_DRIVEN\": 1\n                         },\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n+                        \"dynamicProperties\": [\n+                            {\n+                                \"description\": \"If <Destination>='flowfile-attribute' then the FlowFile attribute is set to the result of the XPath Expression.  If <Destination>='flowfile-content' then the FlowFile content is set to the result of the XPath Expression.\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"name\": \"A FlowFile attribute(if <Destination> is set to 'flowfile-attribute'\",\n+                                \"value\": \"An XPath expression\"\n+                            }\n+                        ],\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Zero Content Output\": {\n+                            \"Destination\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"flowfile-content\",\n+                                        \"value\": \"flowfile-content\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"flowfile-attribute\",\n+                                        \"value\": \"flowfile-attribute\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"flowfile-content\",\n+                                \"description\": \"Indicates whether the results of the XPath evaluation are written to the FlowFile content or a FlowFile attribute; if using attribute, must specify the Attribute Name property. If set to flowfile-content, only one XPath may be specified, and the property name is ignored.\",\n+                                \"displayName\": \"Destination\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Destination\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Return Type\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"auto-detect\",\n+                                        \"value\": \"auto-detect\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"nodeset\",\n+                                        \"value\": \"nodeset\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"string\",\n+                                        \"value\": \"string\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"auto-detect\",\n+                                \"description\": \"Indicates the desired return type of the Xpath expressions.  Selecting 'auto-detect' will set the return type to 'nodeset' for a Destination of 'flowfile-content', and 'string' for a Destination of 'flowfile-attribute'.\",\n+                                \"displayName\": \"Return Type\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Return Type\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Validate DTD\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"true\",\n                                         \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"false\",\n                                         \"value\": \"false\"\n                                     }\n                                 ],\n                                 \"defaultValue\": \"false\",\n-                                \"description\": \"Whether to do, or do not copy the content of input FlowFile.\",\n-                                \"displayName\": \"Zero Content Output\",\n+                                \"description\": \"Allow embedded Document Type Declaration in XML. This feature should be disabled to avoid XML entity expansion vulnerabilities.\",\n+                                \"displayName\": \"Allow DTD\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Zero Content Output\",\n+                                \"name\": \"Validate DTD\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             }\n                         },\n                         \"sideEffectFree\": true,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"FlowFiles, with special attributes that represent a chunk of the input file.\",\n-                                \"name\": \"success\"\n+                                \"description\": \"FlowFiles are routed to this relationship when the XPath cannot be evaluated against the content of the FlowFile; for instance, if the FlowFile is not valid XML, or if the Return Type is 'nodeset' and the XPath evaluates to multiple nodes\",\n+                                \"name\": \"failure\"\n+                            },\n+                            {\n+                                \"description\": \"FlowFiles are routed to this relationship when the XPath does not match the content of the FlowFile and the Destination is set to flowfile-content\",\n+                                \"name\": \"unmatched\"\n+                            },\n+                            {\n+                                \"description\": \"FlowFiles are routed to this relationship when the XPath is successfully evaluated and the FlowFile is modified as a result\",\n+                                \"name\": \"matched\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n+                            \"CRON_DRIVEN\",\n+                            \"EVENT_DRIVEN\"\n                         ],\n-                        \"supportsBatching\": false,\n-                        \"supportsDynamicProperties\": false,\n+                        \"supportsBatching\": true,\n+                        \"supportsDynamicProperties\": true,\n                         \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": false,\n+                        \"supportsEventDriven\": true,\n                         \"supportsSensitiveDynamicProperties\": false,\n+                        \"systemResourceConsiderations\": [\n+                            {\n+                                \"description\": \"Processing requires reading the entire FlowFile into memory\",\n+                                \"resource\": \"MEMORY\"\n+                            }\n+                        ],\n                         \"tags\": [\n-                            \"break apart\",\n-                            \"cluster\",\n-                            \"efficient processing\",\n-                            \"load balance\",\n-                            \"parquet\",\n-                            \"partition\",\n-                            \"split\"\n+                            \"XML\",\n+                            \"XPath\",\n+                            \"evaluate\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.parquet.CalculateParquetRowGroupOffsets\",\n-                        \"typeDescription\": \"The processor generates one FlowFile from each Row Group of the input, and adds attributes with the offsets required to read the group of rows in the FlowFile's content. Can be used to increase the overall efficiency of processing extremely large Parquet files.\",\n+                        \"type\": \"org.apache.nifi.processors.standard.EvaluateXPath\",\n+                        \"typeDescription\": \"Evaluates one or more XPaths against the content of a FlowFile. The results of those XPaths are assigned to FlowFile Attributes or are written to the content of the FlowFile itself, depending on configuration of the Processor. XPaths are entered by adding user-defined properties; the name of the property maps to the Attribute Name into which the result will be placed (if the Destination is flowfile-attribute; otherwise, the property name is ignored). The value of the property must be a valid XPath expression. If the XPath evaluates to more than one node and the Return Type is set to 'nodeset' (either directly, or via 'auto-detect' with a Destination of 'flowfile-content'), the FlowFile will be unmodified and will be routed to failure. If the XPath does not evaluate to a Node, the FlowFile will be routed to 'unmatched' without having its contents modified. If Destination is flowfile-attribute and the expression matches nothing, attributes will be created with empty strings as the value, and the FlowFile will always be routed to 'matched'\",\n                         \"version\": \"1.27.0\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"Sets the start offset of the selected row group in the parquet file.\",\n-                                \"name\": \"parquet.file.range.startOffset\"\n-                            },\n-                            {\n-                                \"description\": \"Sets the end offset of the selected row group in the parquet file.\",\n-                                \"name\": \"parquet.file.range.endOffset\"\n-                            },\n-                            {\n-                                \"description\": \"Sets the count of records in the selected row group.\",\n-                                \"name\": \"record.count\"\n+                                \"description\": \"This processor adds user-defined attributes if the <Destination> property is set to flowfile-attribute.\",\n+                                \"name\": \"user-defined\"\n                             }\n                         ]\n                     },\n                     {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-parquet-nar\",\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n+                            \"EVENT_DRIVEN\": 0,\n                             \"TIMER_DRIVEN\": 1\n                         },\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n+                        \"dynamicProperties\": [\n+                            {\n+                                \"description\": \"If <Destination>='flowfile-attribute' then the FlowFile attribute is set to the result of the XQuery.  If <Destination>='flowfile-content' then the FlowFile content is set to the result of the XQuery.\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"name\": \"A FlowFile attribute(if <Destination> is set to 'flowfile-attribute'\",\n+                                \"value\": \"An XQuery\"\n+                            }\n+                        ],\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"compression-type\": {\n+                            \"Destination\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"UNCOMPRESSED\",\n-                                        \"value\": \"UNCOMPRESSED\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"SNAPPY\",\n-                                        \"value\": \"SNAPPY\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"GZIP\",\n-                                        \"value\": \"GZIP\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"LZO\",\n-                                        \"value\": \"LZO\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"BROTLI\",\n-                                        \"value\": \"BROTLI\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"LZ4\",\n-                                        \"value\": \"LZ4\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"ZSTD\",\n-                                        \"value\": \"ZSTD\"\n+                                        \"displayName\": \"flowfile-content\",\n+                                        \"value\": \"flowfile-content\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"LZ4_RAW\",\n-                                        \"value\": \"LZ4_RAW\"\n+                                        \"displayName\": \"flowfile-attribute\",\n+                                        \"value\": \"flowfile-attribute\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"UNCOMPRESSED\",\n-                                \"description\": \"The type of compression for the file being written.\",\n-                                \"displayName\": \"Compression Type\",\n+                                \"defaultValue\": \"flowfile-content\",\n+                                \"description\": \"Indicates whether the results of the XQuery evaluation are written to the FlowFile content or a FlowFile attribute. If set to <flowfile-content>, only one XQuery may be specified and the property name is ignored.  If set to <flowfile-attribute> and the XQuery returns more than one result, multiple attributes will be added to theFlowFile, each named with a '.n' one-up number appended to the specified attribute name\",\n+                                \"displayName\": \"Destination\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"compression-type\",\n+                                \"name\": \"Destination\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"dictionary-page-size\": {\n-                                \"description\": \"The dictionary page size used by the Parquet writer. The value is specified in the format of <Data Size> <Data Unit> where Data Unit is one of B, KB, MB, GB, TB.\",\n-                                \"displayName\": \"Dictionary Page Size\",\n+                            \"Output: Indent\": {\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"Specifies whether the processor may add additional whitespace when outputting a result tree.\",\n+                                \"displayName\": \"Output: Indent\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"dictionary-page-size\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Output: Indent\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"enable-dictionary-encoding\": {\n+                            \"Output: Method\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"displayName\": \"xml\",\n+                                        \"value\": \"xml\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"description\": \"Specifies whether dictionary encoding should be enabled for the Parquet writer\",\n-                                \"displayName\": \"Enable Dictionary Encoding\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"enable-dictionary-encoding\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"enable-validation\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"displayName\": \"html\",\n+                                        \"value\": \"html\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"displayName\": \"text\",\n+                                        \"value\": \"text\"\n                                     }\n                                 ],\n-                                \"description\": \"Specifies whether validation should be enabled for the Parquet writer\",\n-                                \"displayName\": \"Enable Validation\",\n+                                \"defaultValue\": \"xml\",\n+                                \"description\": \"Identifies the overall method that should be used for outputting a result tree.\",\n+                                \"displayName\": \"Output: Method\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"enable-validation\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"max-padding-size\": {\n-                                \"description\": \"The maximum amount of padding that will be used to align row groups with blocks in the underlying filesystem. If the underlying filesystem is not a block filesystem like HDFS, this has no effect. The value is specified in the format of <Data Size> <Data Unit> where Data Unit is one of B, KB, MB, GB, TB.\",\n-                                \"displayName\": \"Max Padding Size\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"max-padding-size\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"page-size\": {\n-                                \"description\": \"The page size used by the Parquet writer. The value is specified in the format of <Data Size> <Data Unit> where Data Unit is one of B, KB, MB, GB, TB.\",\n-                                \"displayName\": \"Page Size\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"page-size\",\n-                                \"required\": false,\n+                                \"name\": \"Output: Method\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"row-group-size\": {\n-                                \"description\": \"The row group size used by the Parquet writer. The value is specified in the format of <Data Size> <Data Unit> where Data Unit is one of B, KB, MB, GB, TB.\",\n-                                \"displayName\": \"Row Group Size\",\n+                            \"Output: Omit XML Declaration\": {\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"Specifies whether the processor should output an XML declaration when transforming a result tree.\",\n+                                \"displayName\": \"Output: Omit XML Declaration\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"row-group-size\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Output: Omit XML Declaration\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"writer-version\": {\n+                            \"Validate DTD\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"PARQUET_1_0\",\n-                                        \"value\": \"PARQUET_1_0\"\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"PARQUET_2_0\",\n-                                        \"value\": \"PARQUET_2_0\"\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"description\": \"Specifies the version used by Parquet writer\",\n-                                \"displayName\": \"Writer Version\",\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"Allow embedded Document Type Declaration in XML. This feature should be disabled to avoid XML entity expansion vulnerabilities.\",\n+                                \"displayName\": \"Allow DTD\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"writer-version\",\n-                                \"required\": false,\n+                                \"name\": \"Validate DTD\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             }\n                         },\n-                        \"sideEffectFree\": false,\n+                        \"sideEffectFree\": true,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"Parquet file that was converted successfully from Avro\",\n-                                \"name\": \"success\"\n+                                \"description\": \"FlowFiles are routed to this relationship when the XQuery cannot be evaluated against the content of the FlowFile.\",\n+                                \"name\": \"failure\"\n                             },\n                             {\n-                                \"description\": \"Avro content that could not be processed\",\n-                                \"name\": \"failure\"\n+                                \"description\": \"FlowFiles are routed to this relationship when the XQuery does not match the content of the FlowFile and the Destination is set to flowfile-content\",\n+                                \"name\": \"unmatched\"\n+                            },\n+                            {\n+                                \"description\": \"FlowFiles are routed to this relationship when the XQuery is successfully evaluated and the FlowFile is modified as a result\",\n+                                \"name\": \"matched\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n+                            \"CRON_DRIVEN\",\n+                            \"EVENT_DRIVEN\"\n                         ],\n-                        \"supportsBatching\": false,\n-                        \"supportsDynamicProperties\": false,\n+                        \"supportsBatching\": true,\n+                        \"supportsDynamicProperties\": true,\n                         \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": false,\n+                        \"supportsEventDriven\": true,\n                         \"supportsSensitiveDynamicProperties\": false,\n+                        \"systemResourceConsiderations\": [\n+                            {\n+                                \"description\": \"Processing requires reading the entire FlowFile into memory\",\n+                                \"resource\": \"MEMORY\"\n+                            }\n+                        ],\n                         \"tags\": [\n-                            \"avro\",\n-                            \"convert\",\n-                            \"parquet\"\n+                            \"XML\",\n+                            \"XPath\",\n+                            \"XQuery\",\n+                            \"evaluate\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.parquet.ConvertAvroToParquet\",\n-                        \"typeDescription\": \"Converts Avro records into Parquet file format. The incoming FlowFile should be a valid avro file. If an incoming FlowFile does not contain any records, an empty parquet file is the output. NOTE: Many Avro datatypes (collections, primitives, and unions of primitives, e.g.) can be converted to parquet, but unions of collections and other complex datatypes may not be able to be converted to Parquet.\",\n+                        \"type\": \"org.apache.nifi.processors.standard.EvaluateXQuery\",\n+                        \"typeDescription\": \"Evaluates one or more XQueries against the content of a FlowFile.  The results of those XQueries are assigned to FlowFile Attributes or are written to the content of the FlowFile itself, depending on configuration of the Processor.  XQueries are entered by adding user-defined properties; the name of the property maps to the Attribute Name into which the result will be placed (if the Destination is 'flowfile-attribute'; otherwise, the property name is ignored).  The value of the property must be a valid XQuery.  If the XQuery returns more than one result, new attributes or FlowFiles (for Destinations of 'flowfile-attribute' or 'flowfile-content' respectively) will be created for each result (attributes will have a '.n' one-up number appended to the specified attribute name).  If any provided XQuery returns a result, the FlowFile(s) will be routed to 'matched'. If no provided XQuery returns a result, the FlowFile will be routed to 'unmatched'.  If the Destination is 'flowfile-attribute' and the XQueries matche nothing, no attributes will be applied to the FlowFile.\",\n                         \"version\": \"1.27.0\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"Sets the filename to the existing filename with the extension replaced by / added to by .parquet\",\n-                                \"name\": \"filename\"\n-                            },\n-                            {\n-                                \"description\": \"Sets the number of records in the parquet file.\",\n-                                \"name\": \"record.count\"\n+                                \"description\": \"This processor adds user-defined attributes if the <Destination> property is set to flowfile-attribute .\",\n+                                \"name\": \"user-defined\"\n                             }\n                         ]\n                     },\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-parquet-nar\",\n+                        \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n                         },\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n-                        \"defaultYieldDuration\": \"100 ms\",\n+                        \"defaultYieldDuration\": \"1 sec\",\n+                        \"dynamicProperties\": [\n+                            {\n+                                \"description\": \"These environment variables are passed to the process spawned by this Processor\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"name\": \"An environment variable name\",\n+                                \"value\": \"An environment variable value\"\n+                            }\n+                        ],\n                         \"explicitRestrictions\": [\n                             {\n-                                \"explanation\": \"Provides operator the ability to retrieve any file that NiFi has access to in HDFS or the local filesystem.\",\n-                                \"requiredPermission\": \"read distributed filesystem\"\n+                                \"explanation\": \"Provides operator the ability to execute arbitrary code assuming all permissions that NiFi has.\",\n+                                \"requiredPermission\": \"execute code\"\n                             }\n                         ],\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_REQUIRED\",\n+                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Additional Classpath Resources\": {\n-                                \"description\": \"A comma-separated list of paths to files and/or directories that will be added to the classpath and used for loading native libraries. When specifying a directory, all files with in the directory will be added to the classpath, but further sub-directories will not be included.\",\n-                                \"displayName\": \"Additional Classpath Resources\",\n+                            \"Argument Delimiter\": {\n+                                \"defaultValue\": \" \",\n+                                \"description\": \"Delimiter to use to separate arguments for a command [default: space]. Must be a single character.\",\n+                                \"displayName\": \"Argument Delimiter\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Additional Classpath Resources\",\n-                                \"required\": false,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"MULTIPLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\",\n-                                        \"DIRECTORY\"\n-                                    ]\n-                                },\n-                                \"sensitive\": false\n-                            },\n-                            \"Hadoop Configuration Resources\": {\n-                                \"description\": \"A file or comma separated list of files which contains the Hadoop file system configuration. Without this, Hadoop will search the classpath for a 'core-site.xml' and 'hdfs-site.xml' file or will revert to a default configuration. To use swebhdfs, see 'Additional Details' section of PutHDFS's documentation.\",\n-                                \"displayName\": \"Hadoop Configuration Resources\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Hadoop Configuration Resources\",\n-                                \"required\": false,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"MULTIPLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\"\n-                                    ]\n-                                },\n-                                \"sensitive\": false\n-                            },\n-                            \"Kerberos Keytab\": {\n-                                \"description\": \"Kerberos keytab associated with the principal. Requires nifi.kerberos.krb5.file to be set in your nifi.properties\",\n-                                \"displayName\": \"Kerberos Keytab\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Kerberos Keytab\",\n-                                \"required\": false,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"SINGLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\"\n-                                    ]\n-                                },\n+                                \"name\": \"Argument Delimiter\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Kerberos Password\": {\n-                                \"description\": \"Kerberos password associated with the principal.\",\n-                                \"displayName\": \"Kerberos Password\",\n+                            \"Batch Duration\": {\n+                                \"description\": \"If the process is expected to be long-running and produce textual output, a batch duration can be specified so that the output will be captured for this amount of time and a FlowFile will then be sent out with the results and a new FlowFile will be started, rather than waiting for the process to finish before sending out the results\",\n+                                \"displayName\": \"Batch Duration\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Kerberos Password\",\n+                                \"name\": \"Batch Duration\",\n                                 \"required\": false,\n-                                \"sensitive\": true\n+                                \"sensitive\": false\n                             },\n-                            \"Kerberos Principal\": {\n-                                \"description\": \"Kerberos principal to authenticate as. Requires nifi.kerberos.krb5.file to be set in your nifi.properties\",\n-                                \"displayName\": \"Kerberos Principal\",\n+                            \"Command\": {\n+                                \"description\": \"Specifies the command to be executed; if just the name of an executable is provided, it must be in the user's environment PATH.\",\n+                                \"displayName\": \"Command\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Kerberos Principal\",\n-                                \"required\": false,\n+                                \"name\": \"Command\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Kerberos Relogin Period\": {\n-                                \"defaultValue\": \"4 hours\",\n-                                \"description\": \"Period of time which should pass before attempting a kerberos relogin.\\n\\nThis property has been deprecated, and has no effect on processing. Relogins now occur automatically.\",\n-                                \"displayName\": \"Kerberos Relogin Period\",\n+                            \"Command Arguments\": {\n+                                \"description\": \"The arguments to supply to the executable delimited by white space. White space can be escaped by enclosing it in double-quotes.\",\n+                                \"displayName\": \"Command Arguments\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Kerberos Relogin Period\",\n+                                \"name\": \"Command Arguments\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"filename\": {\n-                                \"defaultValue\": \"${path}/${filename}\",\n-                                \"description\": \"The name of the file to retrieve\",\n-                                \"displayName\": \"Filename\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"filename\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"kerberos-credentials-service\": {\n-                                \"description\": \"Specifies the Kerberos Credentials Controller Service that should be used for authenticating with Kerberos\",\n-                                \"displayName\": \"Kerberos Credentials Service\",\n+                            \"Output MIME type\": {\n+                                \"description\": \"Specifies the value to set for the \\\"mime.type\\\" attribute. This property is ignored if 'Batch Duration' is set.\",\n+                                \"displayName\": \"Output MIME Type\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"kerberos-credentials-service\",\n+                                \"name\": \"Output MIME type\",\n                                 \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.kerberos.KerberosCredentialsService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n+                                \"sensitive\": false\n                             },\n-                            \"kerberos-user-service\": {\n-                                \"description\": \"Specifies the Kerberos User Controller Service that should be used for authenticating with Kerberos\",\n-                                \"displayName\": \"Kerberos User Service\",\n+                            \"Redirect Error Stream\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"If true will redirect any error stream output of the process to the output stream. This is particularly helpful for processes which write extensively to the error stream or for troubleshooting.\",\n+                                \"displayName\": \"Redirect Error Stream\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"kerberos-user-service\",\n+                                \"name\": \"Redirect Error Stream\",\n                                 \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.kerberos.KerberosUserService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n+                                \"sensitive\": false\n                             },\n-                            \"record-writer\": {\n-                                \"description\": \"The service for writing records to the FlowFile content\",\n-                                \"displayName\": \"Record Writer\",\n+                            \"Working Directory\": {\n+                                \"description\": \"The directory to use as the current working directory when executing the command\",\n+                                \"displayName\": \"Working Directory\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"record-writer\",\n-                                \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Working Directory\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n                             }\n                         },\n-                        \"readsAttributes\": [\n-                            {\n-                                \"description\": \"Gets the index of first record in the input.\",\n-                                \"name\": \"record.offset\"\n-                            },\n-                            {\n-                                \"description\": \"Gets the number of records in the input.\",\n-                                \"name\": \"record.count\"\n-                            }\n-                        ],\n                         \"restricted\": true,\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.processors.parquet.PutParquet\"\n-                        ],\n                         \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"FlowFiles will be routed to this relationship if the content of the file cannot be retrieved, but might be able to be in the future if tried again. This generally indicates that the Fetch should be tried again.\",\n-                                \"name\": \"retry\"\n-                            },\n-                            {\n-                                \"description\": \"FlowFiles will be routed to this relationship once they have been updated with the content of the file\",\n+                                \"description\": \"All created FlowFiles are routed to this relationship\",\n                                 \"name\": \"success\"\n-                            },\n-                            {\n-                                \"description\": \"FlowFiles will be routed to this relationship if the content of the file cannot be retrieved and trying again will likely not be helpful. This would occur, for instance, if the file is not found or if there is a permissions issue\",\n-                                \"name\": \"failure\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n-                        \"supportsBatching\": true,\n-                        \"supportsDynamicProperties\": false,\n+                        \"supportsBatching\": false,\n+                        \"supportsDynamicProperties\": true,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"HDFS\",\n-                            \"fetch\",\n-                            \"get\",\n-                            \"hadoop\",\n-                            \"ingest\",\n-                            \"parquet\",\n-                            \"record\",\n+                            \"command\",\n+                            \"external\",\n+                            \"invoke\",\n+                            \"process\",\n+                            \"script\",\n                             \"source\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": true,\n-                        \"type\": \"org.apache.nifi.processors.parquet.FetchParquet\",\n-                        \"typeDescription\": \"Reads from a given Parquet file and writes records to the content of the flow file using the selected record writer. The original Parquet file will remain unchanged, and the content of the flow file will be replaced with records of the selected type. This processor can be used with ListHDFS or ListFile to obtain a listing of files to fetch.\",\n+                        \"triggerWhenEmpty\": false,\n+                        \"type\": \"org.apache.nifi.processors.standard.ExecuteProcess\",\n+                        \"typeDescription\": \"Runs an operating system command specified by the user and writes the output of that command to a FlowFile. If the command is expected to be long-running, the Processor can output the partial data on a specified interval. When this option is used, the output is expected to be in textual format, as it typically does not make sense to split binary data on arbitrary time-based intervals.\",\n                         \"version\": \"1.27.0\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"When a FlowFile is routed to 'failure', this attribute is added indicating why the file could not be fetched from the given filesystem.\",\n-                                \"name\": \"fetch.failure.reason\"\n+                                \"description\": \"Executed command\",\n+                                \"name\": \"command\"\n                             },\n                             {\n-                                \"description\": \"The number of records in the resulting flow file\",\n-                                \"name\": \"record.count\"\n+                                \"description\": \"Arguments of the command\",\n+                                \"name\": \"command.arguments\"\n                             },\n                             {\n-                                \"description\": \"The hadoop url for the file is stored in this attribute.\",\n-                                \"name\": \"hadoop.file.url\"\n+                                \"description\": \"Sets the MIME type of the output if the 'Output MIME Type' property is set and 'Batch Duration' is not set\",\n+                                \"name\": \"mime.type\"\n                             }\n                         ]\n                     },\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-parquet-nar\",\n+                        \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n+                            \"EVENT_DRIVEN\": 0,\n                             \"TIMER_DRIVEN\": 1\n                         },\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n-                        \"defaultYieldDuration\": \"100 ms\",\n-                        \"explicitRestrictions\": [\n+                        \"defaultYieldDuration\": \"1 sec\",\n+                        \"dynamicProperties\": [\n                             {\n-                                \"explanation\": \"Provides operator the ability to write any file that NiFi has access to in HDFS or the local filesystem.\",\n-                                \"requiredPermission\": \"write distributed filesystem\"\n+                                \"description\": \"Incoming FlowFiles are expected to be parametrized SQL statements. The type of each Parameter is specified as an integer that represents the JDBC Type of the parameter. The following types are accepted: [LONGNVARCHAR: -16], [BIT: -7], [BOOLEAN: 16], [TINYINT: -6], [BIGINT: -5], [LONGVARBINARY: -4], [VARBINARY: -3], [BINARY: -2], [LONGVARCHAR: -1], [CHAR: 1], [NUMERIC: 2], [DECIMAL: 3], [INTEGER: 4], [SMALLINT: 5] [FLOAT: 6], [REAL: 7], [DOUBLE: 8], [VARCHAR: 12], [DATE: 91], [TIME: 92], [TIMESTAMP: 93], [VARCHAR: 12], [CLOB: 2005], [NCLOB: 2011]\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"name\": \"sql.args.N.type\",\n+                                \"value\": \"SQL type argument to be supplied\"\n+                            },\n+                            {\n+                                \"description\": \"Incoming FlowFiles are expected to be parametrized SQL statements. The value of the Parameters are specified as sql.args.1.value, sql.args.2.value, sql.args.3.value, and so on. The type of the sql.args.1.value Parameter is specified by the sql.args.1.type attribute.\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"name\": \"sql.args.N.value\",\n+                                \"value\": \"Argument to be supplied\"\n+                            },\n+                            {\n+                                \"description\": \"This attribute is always optional, but default options may not always work for your data. Incoming FlowFiles are expected to be parametrized SQL statements. In some cases a format option needs to be specified, currently this is only applicable for binary data types, dates, times and timestamps. Binary Data Types (defaults to 'ascii') - ascii: each string character in your attribute value represents a single byte. This is the format provided by Avro Processors. base64: the string is a Base64 encoded string that can be decoded to bytes. hex: the string is hex encoded with all letters in upper case and no '0x' at the beginning. Dates/Times/Timestamps - Date, Time and Timestamp formats all support both custom formats or named format ('yyyy-MM-dd','ISO_OFFSET_DATE_TIME') as specified according to java.time.format.DateTimeFormatter. If not specified, a long value input is expected to be an unix epoch (milli seconds from 1970/1/1), or a string value in 'yyyy-MM-dd' format for Date, 'HH:mm:ss.SSS' for Time (some database engines e.g. Derby or MySQL do not support milliseconds and will truncate milliseconds), 'yyyy-MM-dd HH:mm:ss.SSS' for Timestamp is used.\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"name\": \"sql.args.N.format\",\n+                                \"value\": \"SQL format argument to be supplied\"\n                             }\n                         ],\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_REQUIRED\",\n+                        \"inputRequirement\": \"INPUT_ALLOWED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Additional Classpath Resources\": {\n-                                \"description\": \"A comma-separated list of paths to files and/or directories that will be added to the classpath and used for loading native libraries. When specifying a directory, all files with in the directory will be added to the classpath, but further sub-directories will not be included.\",\n-                                \"displayName\": \"Additional Classpath Resources\",\n+                            \"Database Connection Pooling Service\": {\n+                                \"description\": \"The Controller Service that is used to obtain connection to database\",\n+                                \"displayName\": \"Database Connection Pooling Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Additional Classpath Resources\",\n-                                \"required\": false,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"MULTIPLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\",\n-                                        \"DIRECTORY\"\n-                                    ]\n-                                },\n-                                \"sensitive\": false\n+                                \"name\": \"Database Connection Pooling Service\",\n+                                \"required\": true,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.dbcp.DBCPService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n                             },\n-                            \"Directory\": {\n-                                \"description\": \"The parent directory to which files should be written. Will be created if it doesn't exist.\",\n-                                \"displayName\": \"Directory\",\n+                            \"Max Wait Time\": {\n+                                \"defaultValue\": \"0 seconds\",\n+                                \"description\": \"The maximum amount of time allowed for a running SQL select query  , zero means there is no limit. Max time less than 1 second will be equal to zero.\",\n+                                \"displayName\": \"Max Wait Time\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Directory\",\n+                                \"name\": \"Max Wait Time\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Hadoop Configuration Resources\": {\n-                                \"description\": \"A file or comma separated list of files which contains the Hadoop file system configuration. Without this, Hadoop will search the classpath for a 'core-site.xml' and 'hdfs-site.xml' file or will revert to a default configuration. To use swebhdfs, see 'Additional Details' section of PutHDFS's documentation.\",\n-                                \"displayName\": \"Hadoop Configuration Resources\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Hadoop Configuration Resources\",\n-                                \"required\": false,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"MULTIPLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\"\n-                                    ]\n-                                },\n-                                \"sensitive\": false\n-                            },\n-                            \"Kerberos Keytab\": {\n-                                \"description\": \"Kerberos keytab associated with the principal. Requires nifi.kerberos.krb5.file to be set in your nifi.properties\",\n-                                \"displayName\": \"Kerberos Keytab\",\n+                            \"SQL select query\": {\n+                                \"description\": \"The SQL select query to execute. The query can be empty, a constant value, or built from attributes using Expression Language. If this property is specified, it will be used regardless of the content of incoming flowfiles. If this property is empty, the content of the incoming flow file is expected to contain a valid SQL select query, to be issued by the processor to the database. Note that Expression Language is not evaluated for flow file contents.\",\n+                                \"displayName\": \"SQL select query\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Kerberos Keytab\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"SQL select query\",\n                                 \"required\": false,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"SINGLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\"\n-                                    ]\n-                                },\n                                 \"sensitive\": false\n                             },\n-                            \"Kerberos Password\": {\n-                                \"description\": \"Kerberos password associated with the principal.\",\n-                                \"displayName\": \"Kerberos Password\",\n+                            \"compression-format\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"BZIP2\",\n+                                        \"value\": \"BZIP2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"DEFLATE\",\n+                                        \"value\": \"DEFLATE\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"NONE\",\n+                                        \"value\": \"NONE\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"SNAPPY\",\n+                                        \"value\": \"SNAPPY\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"LZO\",\n+                                        \"value\": \"LZO\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"NONE\",\n+                                \"description\": \"Compression type to use when writing Avro files. Default is None.\",\n+                                \"displayName\": \"Compression Format\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Kerberos Password\",\n-                                \"required\": false,\n-                                \"sensitive\": true\n+                                \"name\": \"compression-format\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n                             },\n-                            \"Kerberos Principal\": {\n-                                \"description\": \"Kerberos principal to authenticate as. Requires nifi.kerberos.krb5.file to be set in your nifi.properties\",\n-                                \"displayName\": \"Kerberos Principal\",\n+                            \"dbf-default-precision\": {\n+                                \"defaultValue\": \"10\",\n+                                \"description\": \"When a DECIMAL/NUMBER value is written as a 'decimal' Avro logical type, a specific 'precision' denoting number of available digits is required. Generally, precision is defined by column data type definition or database engines default. However undefined precision (0) can be returned from some database engines. 'Default Decimal Precision' is used when writing those undefined precision numbers.\",\n+                                \"displayName\": \"Default Decimal Precision\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Kerberos Principal\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"dbf-default-precision\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Kerberos Relogin Period\": {\n-                                \"defaultValue\": \"4 hours\",\n-                                \"description\": \"Period of time which should pass before attempting a kerberos relogin.\\n\\nThis property has been deprecated, and has no effect on processing. Relogins now occur automatically.\",\n-                                \"displayName\": \"Kerberos Relogin Period\",\n+                            \"dbf-default-scale\": {\n+                                \"defaultValue\": \"0\",\n+                                \"description\": \"When a DECIMAL/NUMBER value is written as a 'decimal' Avro logical type, a specific 'scale' denoting number of available decimal digits is required. Generally, scale is defined by column data type definition or database engines default. However when undefined precision (0) is returned, scale can also be uncertain with some database engines. 'Default Decimal Scale' is used when writing those undefined numbers. If a value has more decimals than specified scale, then the value will be rounded-up, e.g. 1.53 becomes 2 with scale 0, and 1.5 with scale 1.\",\n+                                \"displayName\": \"Default Decimal Scale\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Kerberos Relogin Period\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"dbf-default-scale\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"avro-add-list-element-records\": {\n+                            \"dbf-normalize\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"true\",\n                                         \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"false\",\n                                         \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"true\",\n-                                \"description\": \"Specifies the value for 'parquet.avro.add-list-element-records' in the underlying Parquet library\",\n-                                \"displayName\": \"Avro Add List Element Records\",\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"Whether to change non-Avro-compatible characters in column names to Avro-compatible characters. For example, colons and periods will be changed to underscores in order to build a valid Avro record.\",\n+                                \"displayName\": \"Normalize Table/Column Names\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"avro-add-list-element-records\",\n+                                \"name\": \"dbf-normalize\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"avro-write-old-list-structure\": {\n+                            \"dbf-user-logical-types\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"true\",\n                                         \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"false\",\n                                         \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"true\",\n-                                \"description\": \"Specifies the value for 'parquet.avro.write-old-list-structure' in the underlying Parquet library\",\n-                                \"displayName\": \"Avro Write Old List Structure\",\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"Whether to use Avro Logical Types for DECIMAL/NUMBER, DATE, TIME and TIMESTAMP columns. If disabled, written as string. If enabled, Logical types are used and written as its underlying type, specifically, DECIMAL/NUMBER as logical 'decimal': written as bytes with additional precision and scale meta data, DATE as logical 'date-millis': written as int denoting days since Unix epoch (1970-01-01), TIME as logical 'time-millis': written as int denoting milliseconds since Unix epoch, and TIMESTAMP as logical 'timestamp-millis': written as long denoting milliseconds since Unix epoch. If a reader of written Avro records also knows these logical types, then these values can be deserialized with more context depending on reader implementation.\",\n+                                \"displayName\": \"Use Avro Logical Types\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"avro-write-old-list-structure\",\n+                                \"name\": \"dbf-user-logical-types\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"compression-type\": {\n+                            \"esql-auto-commit\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"UNCOMPRESSED\",\n-                                        \"value\": \"UNCOMPRESSED\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"SNAPPY\",\n-                                        \"value\": \"SNAPPY\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"GZIP\",\n-                                        \"value\": \"GZIP\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"LZO\",\n-                                        \"value\": \"LZO\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"BROTLI\",\n-                                        \"value\": \"BROTLI\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"LZ4\",\n-                                        \"value\": \"LZ4\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"ZSTD\",\n-                                        \"value\": \"ZSTD\"\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"LZ4_RAW\",\n-                                        \"value\": \"LZ4_RAW\"\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"UNCOMPRESSED\",\n-                                \"description\": \"The type of compression for the file being written.\",\n-                                \"displayName\": \"Compression Type\",\n+                                \"defaultValue\": \"true\",\n+                                \"description\": \"Enables or disables the auto commit functionality of the DB connection. Default value is 'true'. The default value can be used with most of the JDBC drivers and this functionality doesn't have any impact in most of the cases since this processor is used to read data. However, for some JDBC drivers such as PostgreSQL driver, it is required to disable the auto committing functionality to limit the number of result rows fetching at a time. When auto commit is enabled, postgreSQL driver loads whole result set to memory at once. This could lead for a large amount of memory usage when executing queries which fetch large data sets. More Details of this behaviour in PostgreSQL driver can be found in https://jdbc.postgresql.org//documentation/head/query.html. \",\n+                                \"displayName\": \"Set Auto Commit\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"compression-type\",\n+                                \"name\": \"esql-auto-commit\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"dictionary-page-size\": {\n-                                \"description\": \"The dictionary page size used by the Parquet writer. The value is specified in the format of <Data Size> <Data Unit> where Data Unit is one of B, KB, MB, GB, TB.\",\n-                                \"displayName\": \"Dictionary Page Size\",\n+                            \"esql-fetch-size\": {\n+                                \"defaultValue\": \"0\",\n+                                \"description\": \"The number of result rows to be fetched from the result set at a time. This is a hint to the database driver and may not be honored and/or exact. If the value specified is zero, then the hint is ignored.\",\n+                                \"displayName\": \"Fetch Size\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"dictionary-page-size\",\n-                                \"required\": false,\n+                                \"name\": \"esql-fetch-size\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"enable-dictionary-encoding\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"description\": \"Specifies whether dictionary encoding should be enabled for the Parquet writer\",\n-                                \"displayName\": \"Enable Dictionary Encoding\",\n+                            \"esql-max-rows\": {\n+                                \"defaultValue\": \"0\",\n+                                \"description\": \"The maximum number of result rows that will be included in a single FlowFile. This will allow you to break up very large result sets into multiple FlowFiles. If the value specified is zero, then all rows are returned in a single FlowFile.\",\n+                                \"displayName\": \"Max Rows Per Flow File\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"enable-dictionary-encoding\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"esql-max-rows\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"enable-validation\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"description\": \"Specifies whether validation should be enabled for the Parquet writer\",\n-                                \"displayName\": \"Enable Validation\",\n+                            \"esql-output-batch-size\": {\n+                                \"defaultValue\": \"0\",\n+                                \"description\": \"The number of output FlowFiles to queue before committing the process session. When set to zero, the session will be committed when all result set rows have been processed and the output FlowFiles are ready for transfer to the downstream relationship. For large result sets, this can cause a large burst of FlowFiles to be transferred at the end of processor execution. If this property is set, then when the specified number of FlowFiles are ready for transfer, then the session will be committed, thus releasing the FlowFiles to the downstream relationship. NOTE: The fragment.count attribute will not be set on FlowFiles when this property is set.\",\n+                                \"displayName\": \"Output Batch Size\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"enable-validation\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"esql-output-batch-size\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"sql-post-query\": {\n+                                \"description\": \"A semicolon-delimited list of queries executed after the main SQL query is executed. Example like setting session properties after main query. It's possible to include semicolons in the statements themselves by escaping them with a backslash ('\\\\;'). Results/outputs from these queries will be suppressed if there are no errors.\",\n+                                \"displayName\": \"SQL Post-Query\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"sql-post-query\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"kerberos-credentials-service\": {\n-                                \"description\": \"Specifies the Kerberos Credentials Controller Service that should be used for authenticating with Kerberos\",\n-                                \"displayName\": \"Kerberos Credentials Service\",\n+                            \"sql-pre-query\": {\n+                                \"description\": \"A semicolon-delimited list of queries executed before the main SQL query is executed. For example, set session properties before main query. It's possible to include semicolons in the statements themselves by escaping them with a backslash ('\\\\;'). Results/outputs from these queries will be suppressed if there are no errors.\",\n+                                \"displayName\": \"SQL Pre-Query\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"kerberos-credentials-service\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"sql-pre-query\",\n                                 \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.kerberos.KerberosCredentialsService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n+                                \"sensitive\": false\n+                            }\n+                        },\n+                        \"readsAttributes\": [\n+                            {\n+                                \"description\": \"Incoming FlowFiles are expected to be parametrized SQL statements. The type of each Parameter is specified as an integer that represents the JDBC Type of the parameter. The following types are accepted: [LONGNVARCHAR: -16], [BIT: -7], [BOOLEAN: 16], [TINYINT: -6], [BIGINT: -5], [LONGVARBINARY: -4], [VARBINARY: -3], [BINARY: -2], [LONGVARCHAR: -1], [CHAR: 1], [NUMERIC: 2], [DECIMAL: 3], [INTEGER: 4], [SMALLINT: 5] [FLOAT: 6], [REAL: 7], [DOUBLE: 8], [VARCHAR: 12], [DATE: 91], [TIME: 92], [TIMESTAMP: 93], [VARCHAR: 12], [CLOB: 2005], [NCLOB: 2011]\",\n+                                \"name\": \"sql.args.N.type\"\n                             },\n-                            \"kerberos-user-service\": {\n-                                \"description\": \"Specifies the Kerberos User Controller Service that should be used for authenticating with Kerberos\",\n-                                \"displayName\": \"Kerberos User Service\",\n+                            {\n+                                \"description\": \"Incoming FlowFiles are expected to be parametrized SQL statements. The value of the Parameters are specified as sql.args.1.value, sql.args.2.value, sql.args.3.value, and so on. The type of the sql.args.1.value Parameter is specified by the sql.args.1.type attribute.\",\n+                                \"name\": \"sql.args.N.value\"\n+                            },\n+                            {\n+                                \"description\": \"This attribute is always optional, but default options may not always work for your data. Incoming FlowFiles are expected to be parametrized SQL statements. In some cases a format option needs to be specified, currently this is only applicable for binary data types, dates, times and timestamps. Binary Data Types (defaults to 'ascii') - ascii: each string character in your attribute value represents a single byte. This is the format provided by Avro Processors. base64: the string is a Base64 encoded string that can be decoded to bytes. hex: the string is hex encoded with all letters in upper case and no '0x' at the beginning. Dates/Times/Timestamps - Date, Time and Timestamp formats all support both custom formats or named format ('yyyy-MM-dd','ISO_OFFSET_DATE_TIME') as specified according to java.time.format.DateTimeFormatter. If not specified, a long value input is expected to be an unix epoch (milli seconds from 1970/1/1), or a string value in 'yyyy-MM-dd' format for Date, 'HH:mm:ss.SSS' for Time (some database engines e.g. Derby or MySQL do not support milliseconds and will truncate milliseconds), 'yyyy-MM-dd HH:mm:ss.SSS' for Timestamp is used.\",\n+                                \"name\": \"sql.args.N.format\"\n+                            }\n+                        ],\n+                        \"sideEffectFree\": false,\n+                        \"supportedRelationships\": [\n+                            {\n+                                \"description\": \"Successfully created FlowFile from SQL query result set.\",\n+                                \"name\": \"success\"\n+                            },\n+                            {\n+                                \"description\": \"SQL query execution failed. Incoming FlowFile will be penalized and routed to this relationship\",\n+                                \"name\": \"failure\"\n+                            }\n+                        ],\n+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\",\n+                            \"EVENT_DRIVEN\"\n+                        ],\n+                        \"supportsBatching\": false,\n+                        \"supportsDynamicProperties\": true,\n+                        \"supportsDynamicRelationships\": false,\n+                        \"supportsEventDriven\": true,\n+                        \"supportsSensitiveDynamicProperties\": true,\n+                        \"tags\": [\n+                            \"database\",\n+                            \"jdbc\",\n+                            \"query\",\n+                            \"select\",\n+                            \"sql\"\n+                        ],\n+                        \"triggerSerially\": false,\n+                        \"triggerWhenAnyDestinationAvailable\": false,\n+                        \"triggerWhenEmpty\": false,\n+                        \"type\": \"org.apache.nifi.processors.standard.ExecuteSQL\",\n+                        \"typeDescription\": \"Executes provided SQL select query. Query result will be converted to Avro format. Streaming is used so arbitrarily large result sets are supported. This processor can be scheduled to run on a timer, or cron expression, using the standard scheduling methods, or it can be triggered by an incoming FlowFile. If it is triggered by an incoming FlowFile, then attributes of that FlowFile will be available when evaluating the select query, and the query may use the ? to escape parameters. In this case, the parameters to use must exist as FlowFile attributes with the naming convention sql.args.N.type and sql.args.N.value, where N is a positive integer. The sql.args.N.type is expected to be a number indicating the JDBC Type. The content of the FlowFile is expected to be in UTF-8 format. FlowFile attribute 'executesql.row.count' indicates how many rows were selected.\",\n+                        \"version\": \"1.27.0\",\n+                        \"writesAttributes\": [\n+                            {\n+                                \"description\": \"Contains the number of rows returned by the query. If 'Max Rows Per Flow File' is set, then this number will reflect the number of rows in the Flow File instead of the entire result set.\",\n+                                \"name\": \"executesql.row.count\"\n+                            },\n+                            {\n+                                \"description\": \"Combined duration of the query execution time and fetch time in milliseconds. If 'Max Rows Per Flow File' is set, then this number will reflect only the fetch time for the rows in the Flow File instead of the entire result set.\",\n+                                \"name\": \"executesql.query.duration\"\n+                            },\n+                            {\n+                                \"description\": \"Duration of the query execution time in milliseconds. This number will reflect the query execution time regardless of the 'Max Rows Per Flow File' setting.\",\n+                                \"name\": \"executesql.query.executiontime\"\n+                            },\n+                            {\n+                                \"description\": \"Duration of the result set fetch time in milliseconds. If 'Max Rows Per Flow File' is set, then this number will reflect only the fetch time for the rows in the Flow File instead of the entire result set.\",\n+                                \"name\": \"executesql.query.fetchtime\"\n+                            },\n+                            {\n+                                \"description\": \"Assuming multiple result sets are returned, the zero based index of this result set.\",\n+                                \"name\": \"executesql.resultset.index\"\n+                            },\n+                            {\n+                                \"description\": \"If processing an incoming flow file causes an Exception, the Flow File is routed to failure and this attribute is set to the exception message.\",\n+                                \"name\": \"executesql.error.message\"\n+                            },\n+                            {\n+                                \"description\": \"If 'Max Rows Per Flow File' is set then all FlowFiles from the same query result set will have the same value for the fragment.identifier attribute. This can then be used to correlate the results.\",\n+                                \"name\": \"fragment.identifier\"\n+                            },\n+                            {\n+                                \"description\": \"If 'Max Rows Per Flow File' is set then this is the total number of  FlowFiles produced by a single ResultSet. This can be used in conjunction with the fragment.identifier attribute in order to know how many FlowFiles belonged to the same incoming ResultSet. If Output Batch Size is set, then this attribute will not be populated.\",\n+                                \"name\": \"fragment.count\"\n+                            },\n+                            {\n+                                \"description\": \"If 'Max Rows Per Flow File' is set then the position of this FlowFile in the list of outgoing FlowFiles that were all derived from the same result set FlowFile. This can be used in conjunction with the fragment.identifier attribute to know which FlowFiles originated from the same query result set and in what order  FlowFiles were produced\",\n+                                \"name\": \"fragment.index\"\n+                            },\n+                            {\n+                                \"description\": \"If the processor has an incoming connection, outgoing FlowFiles will have this attribute set to the value of the input FlowFile's UUID. If there is no incoming connection, the attribute will not be added.\",\n+                                \"name\": \"input.flowfile.uuid\"\n+                            }\n+                        ]\n+                    },\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-standard-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"e0c4461\"\n+                        },\n+                        \"defaultBulletinLevel\": \"WARN\",\n+                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": 1,\n+                            \"EVENT_DRIVEN\": 0,\n+                            \"TIMER_DRIVEN\": 1\n+                        },\n+                        \"defaultPenaltyDuration\": \"30 sec\",\n+                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": \"* * * * * ?\",\n+                            \"TIMER_DRIVEN\": \"0 sec\"\n+                        },\n+                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n+                        \"defaultYieldDuration\": \"1 sec\",\n+                        \"dynamicProperties\": [\n+                            {\n+                                \"description\": \"Incoming FlowFiles are expected to be parametrized SQL statements. The type of each Parameter is specified as an integer that represents the JDBC Type of the parameter. The following types are accepted: [LONGNVARCHAR: -16], [BIT: -7], [BOOLEAN: 16], [TINYINT: -6], [BIGINT: -5], [LONGVARBINARY: -4], [VARBINARY: -3], [BINARY: -2], [LONGVARCHAR: -1], [CHAR: 1], [NUMERIC: 2], [DECIMAL: 3], [INTEGER: 4], [SMALLINT: 5] [FLOAT: 6], [REAL: 7], [DOUBLE: 8], [VARCHAR: 12], [DATE: 91], [TIME: 92], [TIMESTAMP: 93], [VARCHAR: 12], [CLOB: 2005], [NCLOB: 2011]\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"name\": \"sql.args.N.type\",\n+                                \"value\": \"SQL type argument to be supplied\"\n+                            },\n+                            {\n+                                \"description\": \"Incoming FlowFiles are expected to be parametrized SQL statements. The value of the Parameters are specified as sql.args.1.value, sql.args.2.value, sql.args.3.value, and so on. The type of the sql.args.1.value Parameter is specified by the sql.args.1.type attribute.\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"name\": \"sql.args.N.value\",\n+                                \"value\": \"Argument to be supplied\"\n+                            },\n+                            {\n+                                \"description\": \"This attribute is always optional, but default options may not always work for your data. Incoming FlowFiles are expected to be parametrized SQL statements. In some cases a format option needs to be specified, currently this is only applicable for binary data types, dates, times and timestamps. Binary Data Types (defaults to 'ascii') - ascii: each string character in your attribute value represents a single byte. This is the format provided by Avro Processors. base64: the string is a Base64 encoded string that can be decoded to bytes. hex: the string is hex encoded with all letters in upper case and no '0x' at the beginning. Dates/Times/Timestamps - Date, Time and Timestamp formats all support both custom formats or named format ('yyyy-MM-dd','ISO_OFFSET_DATE_TIME') as specified according to java.time.format.DateTimeFormatter. If not specified, a long value input is expected to be an unix epoch (milli seconds from 1970/1/1), or a string value in 'yyyy-MM-dd' format for Date, 'HH:mm:ss.SSS' for Time (some database engines e.g. Derby or MySQL do not support milliseconds and will truncate milliseconds), 'yyyy-MM-dd HH:mm:ss.SSS' for Timestamp is used.\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"name\": \"sql.args.N.format\",\n+                                \"value\": \"SQL format argument to be supplied\"\n+                            }\n+                        ],\n+                        \"group\": \"org.apache.nifi\",\n+                        \"inputRequirement\": \"INPUT_ALLOWED\",\n+                        \"primaryNodeOnly\": false,\n+                        \"propertyDescriptors\": {\n+                            \"Database Connection Pooling Service\": {\n+                                \"description\": \"The Controller Service that is used to obtain connection to database\",\n+                                \"displayName\": \"Database Connection Pooling Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"kerberos-user-service\",\n-                                \"required\": false,\n+                                \"name\": \"Database Connection Pooling Service\",\n+                                \"required\": true,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n                                     \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.kerberos.KerberosUserService\",\n+                                    \"type\": \"org.apache.nifi.dbcp.DBCPService\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             },\n-                            \"max-padding-size\": {\n-                                \"description\": \"The maximum amount of padding that will be used to align row groups with blocks in the underlying filesystem. If the underlying filesystem is not a block filesystem like HDFS, this has no effect. The value is specified in the format of <Data Size> <Data Unit> where Data Unit is one of B, KB, MB, GB, TB.\",\n-                                \"displayName\": \"Max Padding Size\",\n+                            \"Max Wait Time\": {\n+                                \"defaultValue\": \"0 seconds\",\n+                                \"description\": \"The maximum amount of time allowed for a running SQL select query  , zero means there is no limit. Max time less than 1 second will be equal to zero.\",\n+                                \"displayName\": \"Max Wait Time\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"max-padding-size\",\n+                                \"name\": \"Max Wait Time\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"SQL select query\": {\n+                                \"description\": \"The SQL select query to execute. The query can be empty, a constant value, or built from attributes using Expression Language. If this property is specified, it will be used regardless of the content of incoming flowfiles. If this property is empty, the content of the incoming flow file is expected to contain a valid SQL select query, to be issued by the processor to the database. Note that Expression Language is not evaluated for flow file contents.\",\n+                                \"displayName\": \"SQL select query\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"SQL select query\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"overwrite\": {\n+                            \"dbf-default-precision\": {\n+                                \"defaultValue\": \"10\",\n+                                \"description\": \"When a DECIMAL/NUMBER value is written as a 'decimal' Avro logical type, a specific 'precision' denoting number of available digits is required. Generally, precision is defined by column data type definition or database engines default. However undefined precision (0) can be returned from some database engines. 'Default Decimal Precision' is used when writing those undefined precision numbers.\",\n+                                \"displayName\": \"Default Decimal Precision\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"dbf-default-precision\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"dbf-default-scale\": {\n+                                \"defaultValue\": \"0\",\n+                                \"description\": \"When a DECIMAL/NUMBER value is written as a 'decimal' Avro logical type, a specific 'scale' denoting number of available decimal digits is required. Generally, scale is defined by column data type definition or database engines default. However when undefined precision (0) is returned, scale can also be uncertain with some database engines. 'Default Decimal Scale' is used when writing those undefined numbers. If a value has more decimals than specified scale, then the value will be rounded-up, e.g. 1.53 becomes 2 with scale 0, and 1.5 with scale 1.\",\n+                                \"displayName\": \"Default Decimal Scale\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"dbf-default-scale\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"dbf-user-logical-types\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"true\",\n                                         \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"false\",\n                                         \"value\": \"false\"\n                                     }\n                                 ],\n                                 \"defaultValue\": \"false\",\n-                                \"description\": \"Whether or not to overwrite existing files in the same directory with the same name. When set to false, flow files will be routed to failure when a file exists in the same directory with the same name.\",\n-                                \"displayName\": \"Overwrite Files\",\n+                                \"description\": \"Whether to use Avro Logical Types for DECIMAL/NUMBER, DATE, TIME and TIMESTAMP columns. If disabled, written as string. If enabled, Logical types are used and written as its underlying type, specifically, DECIMAL/NUMBER as logical 'decimal': written as bytes with additional precision and scale meta data, DATE as logical 'date-millis': written as int denoting days since Unix epoch (1970-01-01), TIME as logical 'time-millis': written as int denoting milliseconds since Unix epoch, and TIMESTAMP as logical 'timestamp-millis': written as long denoting milliseconds since Unix epoch. If a reader of written Avro records also knows these logical types, then these values can be deserialized with more context depending on reader implementation.\",\n+                                \"displayName\": \"Use Avro Logical Types\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"overwrite\",\n+                                \"name\": \"dbf-user-logical-types\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"page-size\": {\n-                                \"description\": \"The page size used by the Parquet writer. The value is specified in the format of <Data Size> <Data Unit> where Data Unit is one of B, KB, MB, GB, TB.\",\n-                                \"displayName\": \"Page Size\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"page-size\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"permissions-umask\": {\n-                                \"description\": \"A umask represented as an octal number which determines the permissions of files written to HDFS. This overrides the Hadoop Configuration dfs.umaskmode\",\n-                                \"displayName\": \"Permissions umask\",\n+                            \"esql-auto-commit\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"true\",\n+                                \"description\": \"Enables or disables the auto commit functionality of the DB connection. Default value is 'true'. The default value can be used with most of the JDBC drivers and this functionality doesn't have any impact in most of the cases since this processor is used to read data. However, for some JDBC drivers such as PostgreSQL driver, it is required to disable the auto committing functionality to limit the number of result rows fetching at a time. When auto commit is enabled, postgreSQL driver loads whole result set to memory at once. This could lead for a large amount of memory usage when executing queries which fetch large data sets. More Details of this behaviour in PostgreSQL driver can be found in https://jdbc.postgresql.org//documentation/head/query.html. \",\n+                                \"displayName\": \"Set Auto Commit\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"permissions-umask\",\n-                                \"required\": false,\n+                                \"name\": \"esql-auto-commit\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"record-reader\": {\n-                                \"description\": \"The service for reading records from incoming flow files.\",\n-                                \"displayName\": \"Record Reader\",\n+                            \"esql-fetch-size\": {\n+                                \"defaultValue\": \"0\",\n+                                \"description\": \"The number of result rows to be fetched from the result set at a time. This is a hint to the database driver and may not be honored and/or exact. If the value specified is zero, then the hint is ignored.\",\n+                                \"displayName\": \"Fetch Size\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"record-reader\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"esql-fetch-size\",\n                                 \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n+                                \"sensitive\": false\n                             },\n-                            \"remote-group\": {\n-                                \"description\": \"Changes the group of the HDFS file to this value after it is written. This only works if NiFi is running as a user that has HDFS super user privilege to change group\",\n-                                \"displayName\": \"Remote Group\",\n+                            \"esql-max-rows\": {\n+                                \"defaultValue\": \"0\",\n+                                \"description\": \"The maximum number of result rows that will be included in a single FlowFile. This will allow you to break up very large result sets into multiple FlowFiles. If the value specified is zero, then all rows are returned in a single FlowFile.\",\n+                                \"displayName\": \"Max Rows Per Flow File\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"remote-group\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"esql-max-rows\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"remote-owner\": {\n-                                \"description\": \"Changes the owner of the HDFS file to this value after it is written. This only works if NiFi is running as a user that has HDFS super user privilege to change owner\",\n-                                \"displayName\": \"Remote Owner\",\n+                            \"esql-output-batch-size\": {\n+                                \"defaultValue\": \"0\",\n+                                \"description\": \"The number of output FlowFiles to queue before committing the process session. When set to zero, the session will be committed when all result set rows have been processed and the output FlowFiles are ready for transfer to the downstream relationship. For large result sets, this can cause a large burst of FlowFiles to be transferred at the end of processor execution. If this property is set, then when the specified number of FlowFiles are ready for transfer, then the session will be committed, thus releasing the FlowFiles to the downstream relationship. NOTE: The fragment.count attribute will not be set on FlowFiles when this property is set.\",\n+                                \"displayName\": \"Output Batch Size\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"remote-owner\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"esql-output-batch-size\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"remove-crc-files\": {\n+                            \"esqlrecord-normalize\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"true\",\n                                         \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"false\",\n                                         \"value\": \"false\"\n                                     }\n                                 ],\n                                 \"defaultValue\": \"false\",\n-                                \"description\": \"Specifies whether the corresponding CRC file should be deleted upon successfully writing a Parquet file\",\n-                                \"displayName\": \"Remove CRC Files\",\n+                                \"description\": \"Whether to change characters in column names. For example, colons and periods will be changed to underscores.\",\n+                                \"displayName\": \"Normalize Table/Column Names\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"remove-crc-files\",\n-                                \"required\": false,\n+                                \"name\": \"esqlrecord-normalize\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"row-group-size\": {\n-                                \"description\": \"The row group size used by the Parquet writer. The value is specified in the format of <Data Size> <Data Unit> where Data Unit is one of B, KB, MB, GB, TB.\",\n-                                \"displayName\": \"Row Group Size\",\n+                            \"esqlrecord-record-writer\": {\n+                                \"description\": \"Specifies the Controller Service to use for writing results to a FlowFile. The Record Writer may use Inherit Schema to emulate the inferred schema behavior, i.e. an explicit schema need not be defined in the writer, and will be supplied by the same logic used to infer the schema from the column types.\",\n+                                \"displayName\": \"Record Writer\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"esqlrecord-record-writer\",\n+                                \"required\": true,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"sql-post-query\": {\n+                                \"description\": \"A semicolon-delimited list of queries executed after the main SQL query is executed. Example like setting session properties after main query. It's possible to include semicolons in the statements themselves by escaping them with a backslash ('\\\\;'). Results/outputs from these queries will be suppressed if there are no errors.\",\n+                                \"displayName\": \"SQL Post-Query\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"row-group-size\",\n+                                \"name\": \"sql-post-query\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"writer-version\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"PARQUET_1_0\",\n-                                        \"value\": \"PARQUET_1_0\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"PARQUET_2_0\",\n-                                        \"value\": \"PARQUET_2_0\"\n-                                    }\n-                                ],\n-                                \"description\": \"Specifies the version used by Parquet writer\",\n-                                \"displayName\": \"Writer Version\",\n+                            \"sql-pre-query\": {\n+                                \"description\": \"A semicolon-delimited list of queries executed before the main SQL query is executed. For example, set session properties before main query. It's possible to include semicolons in the statements themselves by escaping them with a backslash ('\\\\;'). Results/outputs from these queries will be suppressed if there are no errors.\",\n+                                \"displayName\": \"SQL Pre-Query\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"writer-version\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"sql-pre-query\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             }\n                         },\n                         \"readsAttributes\": [\n                             {\n-                                \"description\": \"The name of the file to write comes from the value of this attribute.\",\n-                                \"name\": \"filename\"\n+                                \"description\": \"Incoming FlowFiles are expected to be parametrized SQL statements. The type of each Parameter is specified as an integer that represents the JDBC Type of the parameter. The following types are accepted: [LONGNVARCHAR: -16], [BIT: -7], [BOOLEAN: 16], [TINYINT: -6], [BIGINT: -5], [LONGVARBINARY: -4], [VARBINARY: -3], [BINARY: -2], [LONGVARCHAR: -1], [CHAR: 1], [NUMERIC: 2], [DECIMAL: 3], [INTEGER: 4], [SMALLINT: 5] [FLOAT: 6], [REAL: 7], [DOUBLE: 8], [VARCHAR: 12], [DATE: 91], [TIME: 92], [TIMESTAMP: 93], [VARCHAR: 12], [CLOB: 2005], [NCLOB: 2011]\",\n+                                \"name\": \"sql.args.N.type\"\n+                            },\n+                            {\n+                                \"description\": \"Incoming FlowFiles are expected to be parametrized SQL statements. The value of the Parameters are specified as sql.args.1.value, sql.args.2.value, sql.args.3.value, and so on. The type of the sql.args.1.value Parameter is specified by the sql.args.1.type attribute.\",\n+                                \"name\": \"sql.args.N.value\"\n+                            },\n+                            {\n+                                \"description\": \"This attribute is always optional, but default options may not always work for your data. Incoming FlowFiles are expected to be parametrized SQL statements. In some cases a format option needs to be specified, currently this is only applicable for binary data types, dates, times and timestamps. Binary Data Types (defaults to 'ascii') - ascii: each string character in your attribute value represents a single byte. This is the format provided by Avro Processors. base64: the string is a Base64 encoded string that can be decoded to bytes. hex: the string is hex encoded with all letters in upper case and no '0x' at the beginning. Dates/Times/Timestamps - Date, Time and Timestamp formats all support both custom formats or named format ('yyyy-MM-dd','ISO_OFFSET_DATE_TIME') as specified according to java.time.format.DateTimeFormatter. If not specified, a long value input is expected to be an unix epoch (milli seconds from 1970/1/1), or a string value in 'yyyy-MM-dd' format for Date, 'HH:mm:ss.SSS' for Time (some database engines e.g. Derby or MySQL do not support milliseconds and will truncate milliseconds), 'yyyy-MM-dd HH:mm:ss.SSS' for Timestamp is used.\",\n+                                \"name\": \"sql.args.N.format\"\n                             }\n                         ],\n-                        \"restricted\": true,\n                         \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"Flow Files that could not be processed due to issues that can be retried are transferred to this relationship\",\n-                                \"name\": \"retry\"\n-                            },\n-                            {\n-                                \"description\": \"Flow Files that have been successfully processed are transferred to this relationship\",\n+                                \"description\": \"Successfully created FlowFile from SQL query result set.\",\n                                 \"name\": \"success\"\n                             },\n                             {\n-                                \"description\": \"Flow Files that could not be processed due to issue that cannot be retried are transferred to this relationship\",\n+                                \"description\": \"SQL query execution failed. Incoming FlowFile will be penalized and routed to this relationship\",\n                                 \"name\": \"failure\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n+                            \"CRON_DRIVEN\",\n+                            \"EVENT_DRIVEN\"\n                         ],\n                         \"supportsBatching\": false,\n-                        \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicProperties\": true,\n                         \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": false,\n-                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"supportsEventDriven\": true,\n+                        \"supportsSensitiveDynamicProperties\": true,\n                         \"tags\": [\n-                            \"HDFS\",\n-                            \"filesystem\",\n-                            \"hadoop\",\n-                            \"parquet\",\n-                            \"put\",\n-                            \"record\"\n+                            \"database\",\n+                            \"jdbc\",\n+                            \"query\",\n+                            \"record\",\n+                            \"select\",\n+                            \"sql\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": true,\n-                        \"type\": \"org.apache.nifi.processors.parquet.PutParquet\",\n-                        \"typeDescription\": \"Reads records from an incoming FlowFile using the provided Record Reader, and writes those records to a Parquet file. The schema for the Parquet file must be provided in the processor properties. This processor will first write a temporary dot file and upon successfully writing every record to the dot file, it will rename the dot file to it's final name. If the dot file cannot be renamed, the rename operation will be attempted up to 10 times, and if still not successful, the dot file will be deleted and the flow file will be routed to failure.  If any error occurs while reading records from the input, or writing records to the output, the entire dot file will be removed and the flow file will be routed to failure or retry, depending on the error.\",\n+                        \"triggerWhenEmpty\": false,\n+                        \"type\": \"org.apache.nifi.processors.standard.ExecuteSQLRecord\",\n+                        \"typeDescription\": \"Executes provided SQL select query. Query result will be converted to the format specified by a Record Writer. Streaming is used so arbitrarily large result sets are supported. This processor can be scheduled to run on a timer, or cron expression, using the standard scheduling methods, or it can be triggered by an incoming FlowFile. If it is triggered by an incoming FlowFile, then attributes of that FlowFile will be available when evaluating the select query, and the query may use the ? to escape parameters. In this case, the parameters to use must exist as FlowFile attributes with the naming convention sql.args.N.type and sql.args.N.value, where N is a positive integer. The sql.args.N.type is expected to be a number indicating the JDBC Type. The content of the FlowFile is expected to be in UTF-8 format. FlowFile attribute 'executesql.row.count' indicates how many rows were selected.\",\n                         \"version\": \"1.27.0\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"The name of the file is stored in this attribute.\",\n-                                \"name\": \"filename\"\n+                                \"description\": \"Contains the number of rows returned in the select query\",\n+                                \"name\": \"executesql.row.count\"\n                             },\n                             {\n-                                \"description\": \"The absolute path to the file is stored in this attribute.\",\n-                                \"name\": \"absolute.hdfs.path\"\n+                                \"description\": \"Combined duration of the query execution time and fetch time in milliseconds\",\n+                                \"name\": \"executesql.query.duration\"\n                             },\n                             {\n-                                \"description\": \"The hadoop url for the file is stored in this attribute.\",\n-                                \"name\": \"hadoop.file.url\"\n+                                \"description\": \"Duration of the query execution time in milliseconds\",\n+                                \"name\": \"executesql.query.executiontime\"\n                             },\n                             {\n-                                \"description\": \"The number of records written to the Parquet file\",\n+                                \"description\": \"Duration of the result set fetch time in milliseconds\",\n+                                \"name\": \"executesql.query.fetchtime\"\n+                            },\n+                            {\n+                                \"description\": \"Assuming multiple result sets are returned, the zero based index of this result set.\",\n+                                \"name\": \"executesql.resultset.index\"\n+                            },\n+                            {\n+                                \"description\": \"If processing an incoming flow file causes an Exception, the Flow File is routed to failure and this attribute is set to the exception message.\",\n+                                \"name\": \"executesql.error.message\"\n+                            },\n+                            {\n+                                \"description\": \"If 'Max Rows Per Flow File' is set then all FlowFiles from the same query result set will have the same value for the fragment.identifier attribute. This can then be used to correlate the results.\",\n+                                \"name\": \"fragment.identifier\"\n+                            },\n+                            {\n+                                \"description\": \"If 'Max Rows Per Flow File' is set then this is the total number of  FlowFiles produced by a single ResultSet. This can be used in conjunction with the fragment.identifier attribute in order to know how many FlowFiles belonged to the same incoming ResultSet. If Output Batch Size is set, then this attribute will not be populated.\",\n+                                \"name\": \"fragment.count\"\n+                            },\n+                            {\n+                                \"description\": \"If 'Max Rows Per Flow File' is set then the position of this FlowFile in the list of outgoing FlowFiles that were all derived from the same result set FlowFile. This can be used in conjunction with the fragment.identifier attribute to know which FlowFiles originated from the same query result set and in what order  FlowFiles were produced\",\n+                                \"name\": \"fragment.index\"\n+                            },\n+                            {\n+                                \"description\": \"If the processor has an incoming connection, outgoing FlowFiles will have this attribute set to the value of the input FlowFile's UUID. If there is no incoming connection, the attribute will not be added.\",\n+                                \"name\": \"input.flowfile.uuid\"\n+                            },\n+                            {\n+                                \"description\": \"Sets the mime.type attribute to the MIME Type specified by the Record Writer.\",\n+                                \"name\": \"mime.type\"\n+                            },\n+                            {\n+                                \"description\": \"The number of records output by the Record Writer.\",\n                                 \"name\": \"record.count\"\n                             }\n                         ]\n-                    }\n-                ],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"1.27.0\"\n-        },\n-        {\n-            \"artifact\": \"nifi-stateless-processor-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [],\n-                \"processors\": [\n+                    },\n                     {\n                         \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-stateless-processor-nar\",\n+                        \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n+                            \"EVENT_DRIVEN\": 0,\n                             \"TIMER_DRIVEN\": 1\n                         },\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n                         \"dynamicProperties\": [\n                             {\n-                                \"description\": \"Any dynamic property that is added will be provided to the stateless flow as a Parameter. The name of the property will be the name of the Parameter, and the value of the property will be the value of the Parameter. Because Parameter values may or may not be sensitive, all dynamic properties will be considered sensitive in order to protect their integrity.\",\n+                                \"description\": \"These environment variables are passed to the process spawned by this Processor\",\n                                 \"expressionLanguageScope\": \"NONE\",\n-                                \"name\": \"Any Parameter name\",\n-                                \"value\": \"Any value\"\n+                                \"name\": \"An environment variable name\",\n+                                \"value\": \"An environment variable value\"\n+                            },\n+                            {\n+                                \"description\": \"These arguments are supplied to the process spawned by this Processor when using the Command Arguments Strategy : Dynamic Property Arguments. <commandIndex> is a number and it will determine the order.\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"name\": \"command.argument.<commandIndex>\",\n+                                \"value\": \"Argument to be supplied to the command\"\n+                            }\n+                        ],\n+                        \"explicitRestrictions\": [\n+                            {\n+                                \"explanation\": \"Provides operator the ability to execute arbitrary code assuming all permissions that NiFi has.\",\n+                                \"requiredPermission\": \"execute code\"\n                             }\n                         ],\n-                        \"explicitRestrictions\": [],\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_ALLOWED\",\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Communications Timeout\": {\n-                                \"defaultValue\": \"15 secs\",\n+                            \"Argument Delimiter\": {\n+                                \"defaultValue\": \";\",\n                                 \"dependencies\": [\n                                     {\n                                         \"dependentValues\": [\n-                                            \"Use NiFi Registry\"\n+                                            \"Command Arguments Property\"\n                                         ],\n-                                        \"propertyDisplayName\": \"Dataflow Specification Strategy\",\n-                                        \"propertyName\": \"Dataflow Specification Strategy\"\n-                                    }\n-                                ],\n-                                \"description\": \"Specifies how long to wait before timing out when attempting to communicate with NiFi Registry\",\n-                                \"displayName\": \"Communications Timeout\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Communications Timeout\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Content Storage Strategy\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"The FlowFile content will be stored on the NiFi JVM's heap. This is the most efficient option for small FlowFiles but can quickly exhaust the heap with larger FlowFiles, resulting in Out Of Memory Errors and node instability.\",\n-                                        \"displayName\": \"Store Content on Heap\",\n-                                        \"value\": \"Store Content on Heap\"\n-                                    },\n-                                    {\n-                                        \"description\": \"The FlowFile content will be stored on disk, within the configured Work Directory. The content will still be cleared between invocations and will not be persisted across restarts.\",\n-                                        \"displayName\": \"Store Content on Disk\",\n-                                        \"value\": \"Store Content on Disk\"\n+                                        \"propertyDisplayName\": \"Command Arguments Strategy\",\n+                                        \"propertyName\": \"argumentsStrategy\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"Store Content on Disk\",\n-                                \"description\": \"Specifies where the content of FlowFiles that the Stateless dataflow is operating on should be stored. Note that the data is always considered temporary and may be deleted at any time. It is not intended to be persisted across restarted.\",\n-                                \"displayName\": \"Content Storage Strategy\",\n+                                \"description\": \"Delimiter to use to separate arguments for a command [default: ;]. Must be a single character\",\n+                                \"displayName\": \"Argument Delimiter\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Content Storage Strategy\",\n+                                \"name\": \"Argument Delimiter\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Dataflow File\": {\n+                            \"Command Arguments\": {\n                                 \"dependencies\": [\n                                     {\n                                         \"dependentValues\": [\n-                                            \"Use Local File\"\n+                                            \"Command Arguments Property\"\n                                         ],\n-                                        \"propertyDisplayName\": \"Dataflow Specification Strategy\",\n-                                        \"propertyName\": \"Dataflow Specification Strategy\"\n+                                        \"propertyDisplayName\": \"Command Arguments Strategy\",\n+                                        \"propertyName\": \"argumentsStrategy\"\n                                     }\n                                 ],\n-                                \"description\": \"The filename or URL that specifies the dataflow that is to be run\",\n-                                \"displayName\": \"Dataflow File/URL\",\n+                                \"description\": \"The arguments to supply to the executable delimited by the ';' character.\",\n+                                \"displayName\": \"Command Arguments\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Dataflow File\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Command Arguments\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Command Path\": {\n+                                \"description\": \"Specifies the command to be executed; if just the name of an executable is provided, it must be in the user's environment PATH.\",\n+                                \"displayName\": \"Command Path\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Command Path\",\n                                 \"required\": true,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"SINGLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\",\n-                                        \"URL\"\n-                                    ]\n-                                },\n                                 \"sensitive\": false\n                             },\n-                            \"Dataflow Specification Strategy\": {\n+                            \"Ignore STDIN\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Dataflow to run is stored as a file on the NiFi server or at a URL that is accessible to the NiFi server\",\n-                                        \"displayName\": \"Use Local File or URL\",\n-                                        \"value\": \"Use Local File\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n-                                        \"description\": \"Dataflow to run is stored in NiFi Registry\",\n-                                        \"displayName\": \"Use NiFi Registry\",\n-                                        \"value\": \"Use NiFi Registry\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"Use Local File\",\n-                                \"description\": \"Specifies how the Processor should obtain a copy of the dataflow that it is to run\",\n-                                \"displayName\": \"Dataflow Specification Strategy\",\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"If true, the contents of the incoming flowfile will not be passed to the executing command\",\n+                                \"displayName\": \"Ignore STDIN\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Dataflow Specification Strategy\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Dataflow Timeout\": {\n-                                \"defaultValue\": \"60 sec\",\n-                                \"description\": \"If the flow does not complete within this amount of time, the incoming FlowFile, if any, will be routed to the timeout relationship,the dataflow will be cancelled, and the invocation will end.\",\n-                                \"displayName\": \"Dataflow Timeout\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Dataflow Timeout\",\n-                                \"required\": true,\n+                                \"name\": \"Ignore STDIN\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Failure Ports\": {\n-                                \"description\": \"A comma-separated list of the names of Output Ports that exist at the root level of the dataflow. If any FlowFile is routed to one of the Ports whose name is listed here, the dataflow will be considered a failure, and the incoming FlowFile (if any) will be routed to 'failure'. If not specified, all Output Ports will be considered successful.\",\n-                                \"displayName\": \"Failure Ports\",\n+                            \"Max Attribute Length\": {\n+                                \"defaultValue\": \"256\",\n+                                \"description\": \"If routing the output of the stream command to an attribute, the number of characters put to the attribute value will be at most this amount. This is important because attributes are held in memory and large attributes will quickly cause out of memory issues. If the output goes longer than this value, it will truncated to fit. Consider making this smaller if able.\",\n+                                \"displayName\": \"Max Attribute Length\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Failure Ports\",\n+                                \"name\": \"Max Attribute Length\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Flow Name\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"Use NiFi Registry\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Dataflow Specification Strategy\",\n-                                        \"propertyName\": \"Dataflow Specification Strategy\"\n-                                    }\n-                                ],\n-                                \"description\": \"The name of the flow in the NiFi Registry\",\n-                                \"displayName\": \"Flow Name\",\n+                            \"Output Destination Attribute\": {\n+                                \"description\": \"If set, the output of the stream command will be put into an attribute of the original FlowFile instead of a separate FlowFile. There will no longer be a relationship for 'output stream' or 'nonzero status'. The value of this property will be the key for the output attribute.\",\n+                                \"displayName\": \"Output Destination Attribute\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Flow Name\",\n-                                \"required\": true,\n+                                \"name\": \"Output Destination Attribute\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Flow Version\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"Use NiFi Registry\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Dataflow Specification Strategy\",\n-                                        \"propertyName\": \"Dataflow Specification Strategy\"\n-                                    }\n-                                ],\n-                                \"description\": \"The version of the flow in the NiFi Registry that should be retrieved. If not specified, the latest version will always be used.\",\n-                                \"displayName\": \"Flow Version\",\n+                            \"Output MIME Type\": {\n+                                \"description\": \"Specifies the value to set for the \\\"mime.type\\\" attribute. This property is ignored if 'Output Destination Attribute' is set.\",\n+                                \"displayName\": \"Output MIME Type\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Flow Version\",\n+                                \"name\": \"Output MIME Type\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Input Port\": {\n-                                \"description\": \"Specifies the name of the Input Port to send incoming FlowFiles to. This property is required if this processor has any incoming connections.\",\n-                                \"displayName\": \"Input Port\",\n+                            \"Working Directory\": {\n+                                \"description\": \"The directory to use as the current working directory when executing the command\",\n+                                \"displayName\": \"Working Directory\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Input Port\",\n+                                \"name\": \"Working Directory\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Krb5 Conf File\": {\n-                                \"description\": \"The KRB5 Conf file to use for configuring components that rely on Kerberos\",\n-                                \"displayName\": \"Krb5 Conf File\",\n+                            \"argumentsStrategy\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"Arguments to be supplied to the executable are taken from the Command Arguments property\",\n+                                        \"displayName\": \"Command Arguments Property\",\n+                                        \"value\": \"Command Arguments Property\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Arguments to be supplied to the executable are taken from dynamic properties with pattern of 'command.argument.<commandIndex>'\",\n+                                        \"displayName\": \"Dynamic Property Arguments\",\n+                                        \"value\": \"Dynamic Property Arguments\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"Command Arguments Property\",\n+                                \"description\": \"Strategy for configuring arguments to be supplied to the command.\",\n+                                \"displayName\": \"Command Arguments Strategy\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Krb5 Conf File\",\n+                                \"name\": \"argumentsStrategy\",\n                                 \"required\": false,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"SINGLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\"\n-                                    ]\n-                                },\n                                 \"sensitive\": false\n+                            }\n+                        },\n+                        \"restricted\": true,\n+                        \"sideEffectFree\": false,\n+                        \"supportedRelationships\": [\n+                            {\n+                                \"description\": \"The destination path for the flow file created from the command's output, if the returned status code is zero.\",\n+                                \"name\": \"output stream\"\n                             },\n-                            \"Max Ingest Data Size\": {\n-                                \"description\": \"During the course of a stateless dataflow, some processors may require more data than they have available in order to proceed. For example, MergeContent may require a minimum number of FlowFiles before it can proceed. In this case, the dataflow may bring in additional data from its source Processor. However, this data may all be held in memory, so this property provides a mechanism for limiting the maximum amount of data that the source Processor can ingest before it will no longer be triggered to ingest additional data.\",\n-                                \"displayName\": \"Max Ingest Data Size\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Max Ingest Data Size\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n+                            {\n+                                \"description\": \"The destination path for the flow file created from the command's output, if the returned status code is non-zero. All flow files routed to this relationship will be penalized.\",\n+                                \"name\": \"nonzero status\"\n                             },\n-                            \"Max Ingest FlowFiles\": {\n-                                \"description\": \"During the course of a stateless dataflow, some processors may require more data than they have available in order to proceed. For example, MergeContent may require a minimum number of FlowFiles before it can proceed. In this case, the dataflow may bring in additional data from its source Processor. However, this data may all be held in memory, so this property provides a mechanism for limiting the maximum number of FlowFiles that the source Processor can ingest before it will no longer be triggered to ingest additional data.\",\n-                                \"displayName\": \"Max Ingest FlowFiles\",\n+                            {\n+                                \"description\": \"The original FlowFile will be routed. It will have new attributes detailing the result of the script execution.\",\n+                                \"name\": \"original\"\n+                            }\n+                        ],\n+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\",\n+                            \"EVENT_DRIVEN\"\n+                        ],\n+                        \"supportsBatching\": true,\n+                        \"supportsDynamicProperties\": true,\n+                        \"supportsDynamicRelationships\": false,\n+                        \"supportsEventDriven\": true,\n+                        \"supportsSensitiveDynamicProperties\": true,\n+                        \"tags\": [\n+                            \"command\",\n+                            \"command execution\",\n+                            \"execute\",\n+                            \"stream\"\n+                        ],\n+                        \"triggerSerially\": false,\n+                        \"triggerWhenAnyDestinationAvailable\": false,\n+                        \"triggerWhenEmpty\": false,\n+                        \"type\": \"org.apache.nifi.processors.standard.ExecuteStreamCommand\",\n+                        \"typeDescription\": \"The ExecuteStreamCommand processor provides a flexible way to integrate external commands and scripts into NiFi data flows. ExecuteStreamCommand can pass the incoming FlowFile's content to the command that it executes similarly how piping works.\",\n+                        \"version\": \"1.27.0\",\n+                        \"writesAttributes\": [\n+                            {\n+                                \"description\": \"The name of the command executed\",\n+                                \"name\": \"execution.command\"\n+                            },\n+                            {\n+                                \"description\": \"The semi-colon delimited list of arguments. Sensitive properties will be masked\",\n+                                \"name\": \"execution.command.args\"\n+                            },\n+                            {\n+                                \"description\": \"The exit status code returned from executing the command\",\n+                                \"name\": \"execution.status\"\n+                            },\n+                            {\n+                                \"description\": \"Any error messages returned from executing the command\",\n+                                \"name\": \"execution.error\"\n+                            },\n+                            {\n+                                \"description\": \"Sets the MIME type of the output if the 'Output MIME Type' property is set and 'Output Destination Attribute' is not set\",\n+                                \"name\": \"mime.type\"\n+                            }\n+                        ]\n+                    },\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-standard-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"e0c4461\"\n+                        },\n+                        \"defaultBulletinLevel\": \"WARN\",\n+                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": 1,\n+                            \"EVENT_DRIVEN\": 0,\n+                            \"TIMER_DRIVEN\": 1\n+                        },\n+                        \"defaultPenaltyDuration\": \"30 sec\",\n+                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": \"* * * * * ?\",\n+                            \"TIMER_DRIVEN\": \"0 sec\"\n+                        },\n+                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n+                        \"defaultYieldDuration\": \"1 sec\",\n+                        \"explicitRestrictions\": [\n+                            {\n+                                \"explanation\": \"Patterns can reference resources over HTTP\",\n+                                \"requiredPermission\": \"reference remote resources\"\n+                            }\n+                        ],\n+                        \"group\": \"org.apache.nifi\",\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n+                        \"primaryNodeOnly\": false,\n+                        \"propertyDescriptors\": {\n+                            \"Character Set\": {\n+                                \"defaultValue\": \"UTF-8\",\n+                                \"description\": \"The Character Set in which the file is encoded\",\n+                                \"displayName\": \"Character Set\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Max Ingest FlowFiles\",\n-                                \"required\": false,\n+                                \"name\": \"Character Set\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Max Input FlowFile Size\": {\n-                                \"defaultValue\": \"1 MB\",\n-                                \"dependencies\": [\n+                            \"Destination\": {\n+                                \"allowableValues\": [\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"Store Content on Heap\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Content Storage Strategy\",\n-                                        \"propertyName\": \"Content Storage Strategy\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"flowfile-attribute\",\n+                                        \"value\": \"flowfile-attribute\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"flowfile-content\",\n+                                        \"value\": \"flowfile-content\"\n                                     }\n                                 ],\n-                                \"description\": \"This Processor is configured to load all incoming FlowFiles into memory. Because of that, it is important to limit the maximum size of any incoming FlowFile that would get loaded into memory, in order to prevent Out Of Memory Errors and excessive Garbage Collection. Any FlowFile whose content size is greater than the configured size will be routed to failure and not sent to the Stateless Engine.\",\n-                                \"displayName\": \"Max Input FlowFile Size\",\n+                                \"defaultValue\": \"flowfile-attribute\",\n+                                \"description\": \"Control if Grok output value is written as a new flowfile attributes, in this case each of the Grok identifier that is matched in the flowfile will be added as an attribute, prefixed with \\\"grok.\\\" or written in the flowfile content. Writing to flowfile content will overwrite any existing flowfile content.\",\n+                                \"displayName\": \"Destination\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Max Input FlowFile Size\",\n+                                \"name\": \"Destination\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"NAR Directory\": {\n-                                \"defaultValue\": \"./lib\",\n-                                \"description\": \"This directory has three roles: 1) it contains the NiFi Stateless NAR and other necessary libraries required for the Stateless engine to be bootstrapped, 2) it can contain extensions that should be loaded by the Stateless engine, 3) it is used by the Stateless engine to download extensions into.\",\n-                                \"displayName\": \"NAR Directory\",\n+                            \"Grok Expression\": {\n+                                \"description\": \"Grok expression. If other Grok expressions are referenced in this expression, they must be provided in the Grok Pattern File if set or exist in the default Grok patterns\",\n+                                \"displayName\": \"Grok Expression\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"NAR Directory\",\n+                                \"name\": \"Grok Expression\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Registry Bucket\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"Use NiFi Registry\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Dataflow Specification Strategy\",\n-                                        \"propertyName\": \"Dataflow Specification Strategy\"\n-                                    }\n-                                ],\n-                                \"description\": \"The name of the Bucket in the NiFi Registry that the flow should retrieved from\",\n-                                \"displayName\": \"Registry Bucket\",\n+                            \"Grok Pattern file\": {\n+                                \"description\": \"Custom Grok pattern definitions. These definitions will be loaded after the default Grok patterns. The Grok Parser will use the default Grok patterns when this property is not configured.\",\n+                                \"displayName\": \"Grok Patterns\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Registry Bucket\",\n-                                \"required\": true,\n+                                \"name\": \"Grok Pattern file\",\n+                                \"required\": false,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"SINGLE\",\n+                                    \"resourceTypes\": [\n+                                        \"FILE\",\n+                                        \"URL\",\n+                                        \"TEXT\"\n+                                    ]\n+                                },\n                                 \"sensitive\": false\n                             },\n-                            \"Registry SSL Context Service\": {\n-                                \"dependencies\": [\n+                            \"Keep Empty Captures\": {\n+                                \"allowableValues\": [\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"Use NiFi Registry\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Dataflow Specification Strategy\",\n-                                        \"propertyName\": \"Dataflow Specification Strategy\"\n-                                    }\n-                                ],\n-                                \"description\": \"The SSL Context Service to use for interacting with the NiFi Registry\",\n-                                \"displayName\": \"Registry SSL Context Service\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Registry SSL Context Service\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            },\n-                            \"Registry URL\": {\n-                                \"dependencies\": [\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"Use NiFi Registry\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Dataflow Specification Strategy\",\n-                                        \"propertyName\": \"Dataflow Specification Strategy\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"description\": \"The URL of the NiFi Registry to retrieve the flow from\",\n-                                \"displayName\": \"Registry URL\",\n+                                \"defaultValue\": \"true\",\n+                                \"description\": \"If true, then empty capture values will be included in the returned capture map.\",\n+                                \"displayName\": \"Keep Empty Captures\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Registry URL\",\n+                                \"name\": \"Keep Empty Captures\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Stateless SSL Context Service\": {\n-                                \"description\": \"The SSL Context to use as the Stateless System SSL Context\",\n-                                \"displayName\": \"Stateless SSL Context Service\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Stateless SSL Context Service\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            },\n-                            \"Status Task Interval\": {\n-                                \"description\": \"The Stateless engine periodically logs the status of the dataflow's processors.  This property allows the interval to be changed, or the status logging to be skipped altogether if the property is not set.\",\n-                                \"displayName\": \"Status Task Interval\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Status Task Interval\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Work Directory\": {\n-                                \"defaultValue\": \"./work\",\n-                                \"description\": \"A directory that can be used to create temporary files, such as expanding NAR files, temporary FlowFile content, caching the dataflow, etc.\",\n-                                \"displayName\": \"Work Directory\",\n+                            \"Maximum Buffer Size\": {\n+                                \"defaultValue\": \"1 MB\",\n+                                \"description\": \"Specifies the maximum amount of data to buffer (per file) in order to apply the Grok expressions. Files larger than the specified maximum will not be fully evaluated.\",\n+                                \"displayName\": \"Maximum Buffer Size\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Work Directory\",\n+                                \"name\": \"Maximum Buffer Size\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"additional-nar-directories\": {\n-                                \"description\": \"A comma-separated list of paths for directories that contain extensions that should be loaded by the stateless engine. The engine will not download any extensions into these directories or write to them but will read any NAR files that are found within these directories. The engine will not recurse into subdirectories of these directories.\",\n-                                \"displayName\": \"Additional NAR Directories\",\n+                            \"Named captures only\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"Only store named captures from grok\",\n+                                \"displayName\": \"Named captures only\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"additional-nar-directories\",\n-                                \"required\": false,\n+                                \"name\": \"Named captures only\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             }\n                         },\n                         \"restricted\": true,\n-                        \"sideEffectFree\": false,\n+                        \"sideEffectFree\": true,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"If the dataflow fails to complete in the configured amount of time, any incoming FlowFile will be routed to this relationship\",\n-                                \"name\": \"timeout\"\n-                            },\n-                            {\n-                                \"description\": \"If the dataflow fails to process an incoming FlowFile, that FlowFile will be routed to this relationship\",\n-                                \"name\": \"failure\"\n-                            },\n-                            {\n-                                \"description\": \"For any incoming FlowFile that is successfully processed, the original incoming FlowFile will be transferred to this Relationship\",\n-                                \"name\": \"original\"\n+                                \"description\": \"FlowFiles are routed to this relationship when no provided Grok Expression matches the content of the FlowFile\",\n+                                \"name\": \"unmatched\"\n                             },\n                             {\n-                                \"description\": \"Any FlowFiles that are transferred to an Output Port in the configured dataflow will be routed to this Relationship\",\n-                                \"name\": \"output\"\n+                                \"description\": \"FlowFiles are routed to this relationship when the Grok Expression is successfully evaluated and the FlowFile is modified as a result\",\n+                                \"name\": \"matched\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n+                            \"CRON_DRIVEN\",\n+                            \"EVENT_DRIVEN\"\n                         ],\n                         \"supportsBatching\": true,\n-                        \"supportsDynamicProperties\": true,\n+                        \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": false,\n-                        \"supportsSensitiveDynamicProperties\": true,\n-                        \"systemResourceConsiderations\": [\n-                            {\n-                                \"description\": \"An instance of this component can cause high usage of this system resource.  Multiple instances or high concurrency settings may result a degradation of performance.\",\n-                                \"resource\": \"CPU\"\n-                            },\n-                            {\n-                                \"description\": \"An instance of this component can cause high usage of this system resource.  Multiple instances or high concurrency settings may result a degradation of performance.\",\n-                                \"resource\": \"DISK\"\n-                            },\n-                            {\n-                                \"description\": \"An instance of this component can cause high usage of this system resource.  Multiple instances or high concurrency settings may result a degradation of performance.\",\n-                                \"resource\": \"MEMORY\"\n-                            },\n-                            {\n-                                \"description\": \"An instance of this component can cause high usage of this system resource.  Multiple instances or high concurrency settings may result a degradation of performance.\",\n-                                \"resource\": \"NETWORK\"\n-                            }\n+                        \"supportsEventDriven\": true,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"delimit\",\n+                            \"extract\",\n+                            \"grok\",\n+                            \"log\",\n+                            \"parse\",\n+                            \"text\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.stateless.ExecuteStateless\",\n-                        \"typeDescription\": \"Runs the configured dataflow using the Stateless NiFi engine. Please see documentation in order to understand the differences between the traditional NiFi runtime engine and the Stateless NiFi engine. If the Processor is configured with an incoming connection, the incoming FlowFiles will be queued up into the specified Input Port in the dataflow. Data that is transferred out of the flow via an Output Port will be sent to the 'output' relationship, and an attribute will be added to indicate which Port that FlowFile was transferred to. See Additional Details for more information.\",\n+                        \"type\": \"org.apache.nifi.processors.standard.ExtractGrok\",\n+                        \"typeDescription\": \"Evaluates one or more Grok Expressions against the content of a FlowFile, adding the results as attributes or replacing the content of the FlowFile with a JSON notation of the matched content\",\n                         \"version\": \"1.27.0\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"The name of the Output Port that the FlowFile was transferred to\",\n-                                \"name\": \"output.port.name\"\n-                            },\n-                            {\n-                                \"description\": \"If one or more FlowFiles is routed to one of the Output Ports that is configured as a Failure Port, the input FlowFile (if any) will have this attribute added to it, indicating the name of the Port that caused the dataflow to be considered a failure.\",\n-                                \"name\": \"failure.port.name\"\n+                                \"description\": \"When operating in flowfile-attribute mode, each of the Grok identifier that is matched in the flowfile will be added as an attribute, prefixed with \\\"grok.\\\" For example,if the grok identifier \\\"timestamp\\\" is matched, then the value will be added to an attribute named \\\"grok.timestamp\\\"\",\n+                                \"name\": \"grok.XXX\"\n                             }\n                         ]\n-                    }\n-                ],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"1.27.0\"\n-        },\n-        {\n-            \"artifact\": \"nifi-distributed-cache-services-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [\n+                    },\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-distributed-cache-services-nar\",\n+                        \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n+                        \"defaultBulletinLevel\": \"WARN\",\n+                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": 1,\n+                            \"TIMER_DRIVEN\": 1\n+                        },\n+                        \"defaultPenaltyDuration\": \"30 sec\",\n+                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": \"* * * * * ?\",\n+                            \"TIMER_DRIVEN\": \"0 sec\"\n+                        },\n+                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n+                        \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n+                        \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Communications Timeout\": {\n-                                \"defaultValue\": \"30 secs\",\n-                                \"description\": \"Specifies how long to wait when communicating with the remote server before determining that there is a communications failure if data cannot be sent or received\",\n-                                \"displayName\": \"Communications Timeout\",\n+                            \"cache-size\": {\n+                                \"defaultValue\": \"10\",\n+                                \"description\": \"Specifies the number of schemas to cache. This value should reflect the expected number of different schemas that may be in the incoming FlowFiles. This ensures more efficient retrieval of the schemas and thus the processor performance.\",\n+                                \"displayName\": \"Schema Cache Size\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Communications Timeout\",\n+                                \"name\": \"cache-size\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"SSL Context Service\": {\n-                                \"description\": \"If specified, indicates the SSL Context Service that is used to communicate with the remote server. If not specified, communications will not be encrypted\",\n-                                \"displayName\": \"SSL Context Service\",\n+                            \"record-reader\": {\n+                                \"description\": \"Specifies the Controller Service to use for reading incoming data\",\n+                                \"displayName\": \"Record Reader\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"SSL Context Service\",\n-                                \"required\": false,\n+                                \"name\": \"record-reader\",\n+                                \"required\": true,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n                                     \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n+                                    \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n                                     \"version\": \"1.27.0\"\n                                 }\n-                            },\n-                            \"Server Hostname\": {\n-                                \"description\": \"The name of the server that is running the DistributedMapCacheServer service\",\n-                                \"displayName\": \"Server Hostname\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Server Hostname\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Server Port\": {\n-                                \"defaultValue\": \"4557\",\n-                                \"description\": \"The port on the remote server that is to be used when communicating with the DistributedMapCacheServer service\",\n-                                \"displayName\": \"Server Port\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Server Port\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n                             }\n                         },\n-                        \"providedApiImplementations\": [\n+                        \"sideEffectFree\": true,\n+                        \"supportedRelationships\": [\n                             {\n-                                \"artifact\": \"nifi-standard-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.distributed.cache.client.AtomicDistributedMapCacheClient\",\n-                                \"version\": \"1.27.0\"\n+                                \"description\": \"FlowFiles whose record schemas are successfully extracted will be routed to this relationship\",\n+                                \"name\": \"success\"\n                             },\n                             {\n-                                \"artifact\": \"nifi-standard-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.distributed.cache.client.DistributedMapCacheClient\",\n-                                \"version\": \"1.27.0\"\n+                                \"description\": \"If a FlowFile's record schema cannot be extracted from the configured input format, the FlowFile will be routed to this relationship\",\n+                                \"name\": \"failure\"\n                             }\n                         ],\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.distributed.cache.server.map.DistributedMapCacheServer\",\n-                            \"org.apache.nifi.ssl.StandardSSLContextService\"\n+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\"\n                         ],\n+                        \"supportsBatching\": true,\n                         \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicRelationships\": false,\n+                        \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"cache\",\n-                            \"cluster\",\n-                            \"distributed\",\n-                            \"map\",\n-                            \"state\"\n+                            \"avro\",\n+                            \"csv\",\n+                            \"freeform\",\n+                            \"generic\",\n+                            \"json\",\n+                            \"record\",\n+                            \"schema\",\n+                            \"text\",\n+                            \"xml\"\n                         ],\n-                        \"type\": \"org.apache.nifi.distributed.cache.client.DistributedMapCacheClientService\",\n-                        \"typeDescription\": \"Provides the ability to communicate with a DistributedMapCacheServer. This can be used in order to share a Map between nodes in a NiFi cluster\",\n-                        \"version\": \"1.27.0\"\n+                        \"triggerSerially\": false,\n+                        \"triggerWhenAnyDestinationAvailable\": false,\n+                        \"triggerWhenEmpty\": false,\n+                        \"type\": \"org.apache.nifi.processors.standard.ExtractRecordSchema\",\n+                        \"typeDescription\": \"Extracts the record schema from the FlowFile using the supplied Record Reader and writes it to the `avro.schema` attribute.\",\n+                        \"version\": \"1.27.0\",\n+                        \"writesAttributes\": [\n+                            {\n+                                \"description\": \"This attribute provides on failure the error message encountered by the Reader.\",\n+                                \"name\": \"record.error.message\"\n+                            },\n+                            {\n+                                \"description\": \"This attribute provides the schema extracted from the input FlowFile using the provided RecordReader.\",\n+                                \"name\": \"avro.schema\"\n+                            }\n+                        ]\n                     },\n                     {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-distributed-cache-services-nar\",\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n+                        \"defaultBulletinLevel\": \"WARN\",\n+                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": 1,\n+                            \"EVENT_DRIVEN\": 0,\n+                            \"TIMER_DRIVEN\": 1\n+                        },\n+                        \"defaultPenaltyDuration\": \"30 sec\",\n+                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": \"* * * * * ?\",\n+                            \"TIMER_DRIVEN\": \"0 sec\"\n+                        },\n+                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n+                        \"defaultYieldDuration\": \"1 sec\",\n+                        \"dynamicProperties\": [\n+                            {\n+                                \"description\": \"The first capture group, if any found, will be placed into that attribute name.But all capture groups, including the matching string sequence itself will also be provided at that attribute name with an index value provided.\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"name\": \"A FlowFile attribute\",\n+                                \"value\": \"A Regular Expression with one or more capturing group\"\n+                            }\n+                        ],\n                         \"group\": \"org.apache.nifi\",\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n+                        \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Communications Timeout\": {\n-                                \"defaultValue\": \"30 secs\",\n-                                \"description\": \"Specifies how long to wait when communicating with the remote server before determining that there is a communications failure if data cannot be sent or received\",\n-                                \"displayName\": \"Communications Timeout\",\n+                            \"Character Set\": {\n+                                \"defaultValue\": \"UTF-8\",\n+                                \"description\": \"The Character Set in which the file is encoded\",\n+                                \"displayName\": \"Character Set\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Communications Timeout\",\n+                                \"name\": \"Character Set\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"SSL Context Service\": {\n-                                \"description\": \"If specified, indicates the SSL Context Service that is used to communicate with the remote server. If not specified, communications will not be encrypted\",\n-                                \"displayName\": \"SSL Context Service\",\n+                            \"Enable Canonical Equivalence\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"Indicates that two characters match only when their full canonical decompositions match.\",\n+                                \"displayName\": \"Enable Canonical Equivalence\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"SSL Context Service\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n+                                \"name\": \"Enable Canonical Equivalence\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n                             },\n-                            \"Server Hostname\": {\n-                                \"description\": \"The name of the server that is running the DistributedSetCacheServer service\",\n-                                \"displayName\": \"Server Hostname\",\n+                            \"Enable Case-insensitive Matching\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"Indicates that two characters match even if they are in a different case.  Can also be specified via the embedded flag (?i).\",\n+                                \"displayName\": \"Enable Case-insensitive Matching\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Server Hostname\",\n+                                \"name\": \"Enable Case-insensitive Matching\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Server Port\": {\n-                                \"defaultValue\": \"4557\",\n-                                \"description\": \"The port on the remote server that is to be used when communicating with the DistributedSetCacheServer service\",\n-                                \"displayName\": \"Server Port\",\n+                            \"Enable DOTALL Mode\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"Indicates that the expression '.' should match any character, including a line terminator.  Can also be specified via the embedded flag (?s).\",\n+                                \"displayName\": \"Enable DOTALL Mode\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Server Port\",\n+                                \"name\": \"Enable DOTALL Mode\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n-                            }\n-                        },\n-                        \"providedApiImplementations\": [\n-                            {\n-                                \"artifact\": \"nifi-standard-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.distributed.cache.client.DistributedSetCacheClient\",\n-                                \"version\": \"1.27.0\"\n-                            }\n-                        ],\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.distributed.cache.server.DistributedSetCacheServer\",\n-                            \"org.apache.nifi.ssl.StandardSSLContextService\"\n-                        ],\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"cache\",\n-                            \"cluster\",\n-                            \"distributed\",\n-                            \"set\",\n-                            \"state\"\n-                        ],\n-                        \"type\": \"org.apache.nifi.distributed.cache.client.DistributedSetCacheClientService\",\n-                        \"typeDescription\": \"Provides the ability to communicate with a DistributedSetCacheServer. This can be used in order to share a Set between nodes in a NiFi cluster\",\n-                        \"version\": \"1.27.0\"\n-                    },\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-distributed-cache-services-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"e0c4461\"\n-                        },\n-                        \"group\": \"org.apache.nifi\",\n-                        \"propertyDescriptors\": {\n-                            \"Eviction Strategy\": {\n+                            },\n+                            \"Enable Literal Parsing of the Pattern\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"Least Frequently Used\",\n-                                        \"value\": \"Least Frequently Used\"\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"Least Recently Used\",\n-                                        \"value\": \"Least Recently Used\"\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"Indicates that Metacharacters and escape characters should be given no special meaning.\",\n+                                \"displayName\": \"Enable Literal Parsing of the Pattern\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Enable Literal Parsing of the Pattern\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Enable Multiline Mode\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"First In, First Out\",\n-                                        \"value\": \"First In, First Out\"\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"Least Frequently Used\",\n-                                \"description\": \"Determines which strategy should be used to evict values from the cache to make room for new entries\",\n-                                \"displayName\": \"Eviction Strategy\",\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"Indicates that '^' and '$' should match just after and just before a line terminator or end of sequence, instead of only the beginning or end of the entire input.  Can also be specified via the embeded flag (?m).\",\n+                                \"displayName\": \"Enable Multiline Mode\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Eviction Strategy\",\n+                                \"name\": \"Enable Multiline Mode\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Maximum Cache Entries\": {\n-                                \"defaultValue\": \"10000\",\n-                                \"description\": \"The maximum number of cache entries that the cache can hold\",\n-                                \"displayName\": \"Maximum Cache Entries\",\n+                            \"Enable Unicode Predefined Character Classes\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"Specifies conformance with the Unicode Technical Standard #18: Unicode Regular Expression Annex C: Compatibility Properties.  Can also be specified via the embedded flag (?U).\",\n+                                \"displayName\": \"Enable Unicode Predefined Character Classes\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Maximum Cache Entries\",\n+                                \"name\": \"Enable Unicode Predefined Character Classes\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Persistence Directory\": {\n-                                \"description\": \"If specified, the cache will be persisted in the given directory; if not specified, the cache will be in-memory only\",\n-                                \"displayName\": \"Persistence Directory\",\n+                            \"Enable Unicode-aware Case Folding\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"When used with 'Enable Case-insensitive Matching', matches in a manner consistent with the Unicode Standard.  Can also be specified via the embedded flag (?u).\",\n+                                \"displayName\": \"Enable Unicode-aware Case Folding\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Persistence Directory\",\n-                                \"required\": false,\n+                                \"name\": \"Enable Unicode-aware Case Folding\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Port\": {\n-                                \"defaultValue\": \"4557\",\n-                                \"description\": \"The port to listen on for incoming connections\",\n-                                \"displayName\": \"Port\",\n+                            \"Enable Unix Lines Mode\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"Indicates that only the '\\n' line terminator is recognized in the behavior of '.', '^', and '$'.  Can also be specified via the embedded flag (?d).\",\n+                                \"displayName\": \"Enable Unix Lines Mode\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Port\",\n+                                \"name\": \"Enable Unix Lines Mode\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"SSL Context Service\": {\n-                                \"description\": \"If specified, this service will be used to create an SSL Context that will be used to secure communications; if not specified, communications will not be secure\",\n-                                \"displayName\": \"SSL Context Service\",\n+                            \"Include Capture Group 0\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"true\",\n+                                \"description\": \"Indicates that Capture Group 0 should be included as an attribute. Capture Group 0 represents the entirety of the regular expression match, is typically not used, and could have considerable length.\",\n+                                \"displayName\": \"Include Capture Group 0\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"SSL Context Service\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.ssl.RestrictedSSLContextService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n+                                \"name\": \"Include Capture Group 0\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n                             },\n-                            \"maximum-read-size\": {\n+                            \"Maximum Buffer Size\": {\n                                 \"defaultValue\": \"1 MB\",\n-                                \"description\": \"The maximum number of network bytes to read for a single cache item\",\n-                                \"displayName\": \"Maximum Read Size\",\n+                                \"description\": \"Specifies the maximum amount of data to buffer (per FlowFile) in order to apply the regular expressions. FlowFiles larger than the specified maximum will not be fully evaluated.\",\n+                                \"displayName\": \"Maximum Buffer Size\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"maximum-read-size\",\n+                                \"name\": \"Maximum Buffer Size\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Maximum Capture Group Length\": {\n+                                \"defaultValue\": \"1024\",\n+                                \"description\": \"Specifies the maximum number of characters a given capture group value can have. Any characters beyond the max will be truncated.\",\n+                                \"displayName\": \"Maximum Capture Group Length\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Maximum Capture Group Length\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n-                            }\n-                        },\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"cache\",\n-                            \"distinct\",\n-                            \"distributed\",\n-                            \"server\",\n-                            \"set\"\n-                        ],\n-                        \"type\": \"org.apache.nifi.distributed.cache.server.DistributedSetCacheServer\",\n-                        \"typeDescription\": \"Provides a set (collection of unique values) cache that can be accessed over a socket. Interaction with this service is typically accomplished via a DistributedSetCacheClient service.\",\n-                        \"version\": \"1.27.0\"\n-                    },\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-distributed-cache-services-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"e0c4461\"\n-                        },\n-                        \"group\": \"org.apache.nifi\",\n-                        \"propertyDescriptors\": {\n-                            \"Eviction Strategy\": {\n+                            },\n+                            \"Permit Whitespace and Comments in Pattern\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"Least Frequently Used\",\n-                                        \"value\": \"Least Frequently Used\"\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"Least Recently Used\",\n-                                        \"value\": \"Least Recently Used\"\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"In this mode, whitespace is ignored, and embedded comments starting with # are ignored until the end of a line.  Can also be specified via the embedded flag (?x).\",\n+                                \"displayName\": \"Permit Whitespace and Comments in Pattern\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Permit Whitespace and Comments in Pattern\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"extract-text-enable-named-groups\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"First In, First Out\",\n-                                        \"value\": \"First In, First Out\"\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"Least Frequently Used\",\n-                                \"description\": \"Determines which strategy should be used to evict values from the cache to make room for new entries\",\n-                                \"displayName\": \"Eviction Strategy\",\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"If set to true, when named groups are present in the regular expression, the name of the group will be used in the attribute name as opposed to the group index.  All capturing groups must be named, if the number of groups (not including capture group 0) does not equal the number of named groups validation will fail.\",\n+                                \"displayName\": \"Enable named group support\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Eviction Strategy\",\n-                                \"required\": true,\n+                                \"name\": \"extract-text-enable-named-groups\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Maximum Cache Entries\": {\n-                                \"defaultValue\": \"10000\",\n-                                \"description\": \"The maximum number of cache entries that the cache can hold\",\n-                                \"displayName\": \"Maximum Cache Entries\",\n+                            \"extract-text-enable-repeating-capture-group\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"If set to true, every string matching the capture groups will be extracted. Otherwise, if the Regular Expression matches more than once, only the first match will be extracted.\",\n+                                \"displayName\": \"Enable repeating capture group\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Maximum Cache Entries\",\n+                                \"name\": \"extract-text-enable-repeating-capture-group\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n+                            }\n+                        },\n+                        \"sideEffectFree\": true,\n+                        \"supportedRelationships\": [\n+                            {\n+                                \"description\": \"FlowFiles are routed to this relationship when no provided Regular Expression matches the content of the FlowFile\",\n+                                \"name\": \"unmatched\"\n                             },\n-                            \"Persistence Directory\": {\n-                                \"description\": \"If specified, the cache will be persisted in the given directory; if not specified, the cache will be in-memory only\",\n-                                \"displayName\": \"Persistence Directory\",\n+                            {\n+                                \"description\": \"FlowFiles are routed to this relationship when the Regular Expression is successfully evaluated and the FlowFile is modified as a result\",\n+                                \"name\": \"matched\"\n+                            }\n+                        ],\n+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\",\n+                            \"EVENT_DRIVEN\"\n+                        ],\n+                        \"supportsBatching\": true,\n+                        \"supportsDynamicProperties\": true,\n+                        \"supportsDynamicRelationships\": false,\n+                        \"supportsEventDriven\": true,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"Regular Expression\",\n+                            \"Text\",\n+                            \"evaluate\",\n+                            \"extract\",\n+                            \"regex\"\n+                        ],\n+                        \"triggerSerially\": false,\n+                        \"triggerWhenAnyDestinationAvailable\": false,\n+                        \"triggerWhenEmpty\": false,\n+                        \"type\": \"org.apache.nifi.processors.standard.ExtractText\",\n+                        \"typeDescription\": \"Evaluates one or more Regular Expressions against the content of a FlowFile.  The results of those Regular Expressions are assigned to FlowFile Attributes.  Regular Expressions are entered by adding user-defined properties; the name of the property maps to the Attribute Name into which the result will be placed.  The attributes are generated differently based on the enabling of named capture groups.  If named capture groups are not enabled:  The first capture group, if any found, will be placed into that attribute name.But all capture groups, including the matching string sequence itself will also be provided at that attribute name with an index value provided, with the exception of a capturing group that is optional and does not match - for example, given the attribute name \\\"regex\\\" and expression \\\"abc(def)?(g)\\\" we would add an attribute \\\"regex.1\\\" with a value of \\\"def\\\" if the \\\"def\\\" matched. If the \\\"def\\\" did not match, no attribute named \\\"regex.1\\\" would be added but an attribute named \\\"regex.2\\\" with a value of \\\"g\\\" will be added regardless.If named capture groups are enabled:  Each named capture group, if found will be placed into the attributes name with the name provided.  If enabled the matching string sequence itself will be placed into the attribute name.  If multiple matches are enabled, and index will be applied after the first set of matches. The exception is a capturing group that is optional and does not match  For example, given the attribute name \\\"regex\\\" and expression \\\"abc(?<NAMED>def)?(?<NAMED-TWO>g)\\\"  we would add an attribute \\\"regex.NAMED\\\" with the value of \\\"def\\\" if the \\\"def\\\" matched.  We would   add an attribute \\\"regex.NAMED-TWO\\\" with the value of \\\"g\\\" if the \\\"g\\\" matched regardless.  The value of the property must be a valid Regular Expressions with one or more capturing groups. If named capture groups are enabled, all capture groups must be named.  If they are not, then the  processor configuration will fail validation.  If the Regular Expression matches more than once, only the first match will be used unless the property enabling repeating capture group is set to true. If any provided Regular Expression matches, the FlowFile(s) will be routed to 'matched'. If no provided Regular Expression matches, the FlowFile will be routed to 'unmatched' and no attributes will be applied to the FlowFile.\",\n+                        \"version\": \"1.27.0\"\n+                    },\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-standard-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"e0c4461\"\n+                        },\n+                        \"defaultBulletinLevel\": \"WARN\",\n+                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": 1,\n+                            \"EVENT_DRIVEN\": 0,\n+                            \"TIMER_DRIVEN\": 1\n+                        },\n+                        \"defaultPenaltyDuration\": \"30 sec\",\n+                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": \"* * * * * ?\",\n+                            \"TIMER_DRIVEN\": \"0 sec\"\n+                        },\n+                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n+                        \"defaultYieldDuration\": \"1 sec\",\n+                        \"group\": \"org.apache.nifi\",\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n+                        \"primaryNodeOnly\": false,\n+                        \"propertyDescriptors\": {\n+                            \"Cache Entry Identifier\": {\n+                                \"defaultValue\": \"${hash.value}\",\n+                                \"description\": \"A comma-delimited list of FlowFile attributes, or the results of Attribute Expression Language statements, which will be evaluated against a FlowFile in order to determine the value(s) used to identify duplicates; it is these values that are cached. NOTE: Only a single Cache Entry Identifier is allowed unless Put Cache Value In Attribute is specified. Multiple cache lookups are only supported when the destination is a set of attributes (see the documentation for 'Put Cache Value In Attribute' for more details including naming convention.\",\n+                                \"displayName\": \"Cache Entry Identifier\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Persistence Directory\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Cache Entry Identifier\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Port\": {\n-                                \"defaultValue\": \"4557\",\n-                                \"description\": \"The port to listen on for incoming connections\",\n-                                \"displayName\": \"Port\",\n+                            \"Character Set\": {\n+                                \"defaultValue\": \"UTF-8\",\n+                                \"description\": \"The Character Set in which the cached value is encoded. This will only be used when routing to an attribute.\",\n+                                \"displayName\": \"Character Set\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Port\",\n-                                \"required\": true,\n+                                \"name\": \"Character Set\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"SSL Context Service\": {\n-                                \"description\": \"If specified, this service will be used to create an SSL Context that will be used to secure communications; if not specified, communications will not be secure\",\n-                                \"displayName\": \"SSL Context Service\",\n+                            \"Distributed Cache Service\": {\n+                                \"description\": \"The Controller Service that is used to get the cached values.\",\n+                                \"displayName\": \"Distributed Cache Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"SSL Context Service\",\n-                                \"required\": false,\n+                                \"name\": \"Distributed Cache Service\",\n+                                \"required\": true,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n                                     \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.ssl.RestrictedSSLContextService\",\n+                                    \"type\": \"org.apache.nifi.distributed.cache.client.DistributedMapCacheClient\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             },\n-                            \"maximum-read-size\": {\n-                                \"defaultValue\": \"1 MB\",\n-                                \"description\": \"The maximum number of network bytes to read for a single cache item\",\n-                                \"displayName\": \"Maximum Read Size\",\n+                            \"Max Length To Put In Attribute\": {\n+                                \"defaultValue\": \"256\",\n+                                \"description\": \"If routing the cache value to an attribute of the FlowFile (by setting the \\\"Put Cache Value in attribute\\\" property), the number of characters put to the attribute value will be at most this amount. This is important because attributes are held in memory and large attributes will quickly cause out of memory issues. If the output goes longer than this value, it will be truncated to fit. Consider making this smaller if able.\",\n+                                \"displayName\": \"Max Length To Put In Attribute\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"maximum-read-size\",\n+                                \"name\": \"Max Length To Put In Attribute\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Put Cache Value In Attribute\": {\n+                                \"description\": \"If set, the cache value received will be put into an attribute of the FlowFile instead of a the content of theFlowFile. The attribute key to put to is determined by evaluating value of this property. If multiple Cache Entry Identifiers are selected, multiple attributes will be written, using the evaluated value of this property, appended by a period (.) and the name of the cache entry identifier.\",\n+                                \"displayName\": \"Put Cache Value In Attribute\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Put Cache Value In Attribute\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             }\n                         },\n                         \"seeAlso\": [\n                             \"org.apache.nifi.distributed.cache.client.DistributedMapCacheClientService\",\n-                            \"org.apache.nifi.ssl.StandardSSLContextService\"\n+                            \"org.apache.nifi.distributed.cache.server.map.DistributedMapCacheServer\",\n+                            \"org.apache.nifi.processors.standard.PutDistributedMapCache\"\n+                        ],\n+                        \"sideEffectFree\": false,\n+                        \"supportedRelationships\": [\n+                            {\n+                                \"description\": \"If the cache was successfully communicated with it will be routed to this relationship\",\n+                                \"name\": \"success\"\n+                            },\n+                            {\n+                                \"description\": \"If unable to communicate with the cache or if the cache entry is evaluated to be blank, the FlowFile will be penalized and routed to this relationship\",\n+                                \"name\": \"failure\"\n+                            },\n+                            {\n+                                \"description\": \"If a FlowFile's Cache Entry Identifier was not found in the cache, it will be routed to this relationship\",\n+                                \"name\": \"not-found\"\n+                            }\n+                        ],\n+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\",\n+                            \"EVENT_DRIVEN\"\n                         ],\n+                        \"supportsBatching\": true,\n                         \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicRelationships\": false,\n+                        \"supportsEventDriven\": true,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n                             \"cache\",\n-                            \"cluster\",\n                             \"distributed\",\n-                            \"key/value\",\n-                            \"map\",\n-                            \"server\"\n+                            \"fetch\",\n+                            \"map\"\n                         ],\n-                        \"type\": \"org.apache.nifi.distributed.cache.server.map.DistributedMapCacheServer\",\n-                        \"typeDescription\": \"Provides a map (key/value) cache that can be accessed over a socket. Interaction with this service is typically accomplished via a DistributedMapCacheClient service.\",\n-                        \"version\": \"1.27.0\"\n-                    }\n-                ],\n-                \"processors\": [],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"1.27.0\"\n-        },\n-        {\n-            \"artifact\": \"nifi-flow-registry-client-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [],\n-                \"processors\": [],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"1.27.0\"\n-        },\n-        {\n-            \"artifact\": \"nifi-pgp-service-api-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [],\n-                \"processors\": [],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"1.27.0\"\n-        },\n-        {\n-            \"artifact\": \"nifi-hazelcast-services-api-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [],\n-                \"processors\": [],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"1.27.0\"\n-        },\n-        {\n-            \"artifact\": \"nifi-cdc-mysql-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [],\n-                \"processors\": [\n+                        \"triggerSerially\": false,\n+                        \"triggerWhenAnyDestinationAvailable\": false,\n+                        \"triggerWhenEmpty\": false,\n+                        \"type\": \"org.apache.nifi.processors.standard.FetchDistributedMapCache\",\n+                        \"typeDescription\": \"Computes cache key(s) from FlowFile attributes, for each incoming FlowFile, and fetches the value(s) from the Distributed Map Cache associated with each key. If configured without a destination attribute, the incoming FlowFile's content is replaced with the binary data received by the Distributed Map Cache. If there is no value stored under that key then the flow file will be routed to 'not-found'. Note that the processor will always attempt to read the entire cached value into memory before placing it in it's destination. This could be potentially problematic if the cached value is very large.\",\n+                        \"version\": \"1.27.0\",\n+                        \"writesAttributes\": [\n+                            {\n+                                \"description\": \"If the 'Put Cache Value In Attribute' property is set then whatever it is set to will become the attribute key and the value would be whatever the response was from the Distributed Map Cache. If multiple cache entry identifiers are selected, multiple attributes will be written, using the evaluated value of this property, appended by a period (.) and the name of the cache entry identifier. For example, if the Cache Entry Identifier property is set to 'id,name', and the user-defined property is named 'fetched', then two attributes will be written, fetched.id and fetched.name, containing their respective values.\",\n+                                \"name\": \"user-defined\"\n+                            }\n+                        ]\n+                    },\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-cdc-mysql-nar\",\n+                        \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -83905,652 +82627,469 @@\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n-                        \"explicitRestrictions\": [\n-                            {\n-                                \"explanation\": \"Database Driver Location can reference resources over HTTP\",\n-                                \"requiredPermission\": \"reference remote resources\"\n-                            }\n-                        ],\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n-                        \"primaryNodeOnly\": true,\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n+                        \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"SSL Context Service\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"PREFERRED\",\n-                                            \"VERIFY_IDENTITY\",\n-                                            \"REQUIRED\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"SSL Mode\",\n-                                        \"propertyName\": \"SSL Mode\"\n-                                    }\n-                                ],\n-                                \"description\": \"SSL Context Service supporting encrypted socket communication\",\n-                                \"displayName\": \"SSL Context Service\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"SSL Context Service\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            },\n-                            \"SSL Mode\": {\n+                            \"Completion Strategy\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Connect without TLS\",\n-                                        \"displayName\": \"DISABLED\",\n-                                        \"value\": \"DISABLED\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Connect with TLS when server support enabled, otherwise connect without TLS\",\n-                                        \"displayName\": \"PREFERRED\",\n-                                        \"value\": \"PREFERRED\"\n+                                        \"description\": \"Leave the file as-is\",\n+                                        \"displayName\": \"None\",\n+                                        \"value\": \"None\"\n                                     },\n                                     {\n-                                        \"description\": \"Connect with TLS or fail when server support not enabled\",\n-                                        \"displayName\": \"REQUIRED\",\n-                                        \"value\": \"REQUIRED\"\n+                                        \"description\": \"Move the file to the directory specified by the <Move Destination Directory> property\",\n+                                        \"displayName\": \"Move File\",\n+                                        \"value\": \"Move File\"\n                                     },\n                                     {\n-                                        \"description\": \"Connect with TLS or fail when server support not enabled. Verify server hostname matches presented X.509 certificate names or fail when not matched\",\n-                                        \"displayName\": \"VERIFY_IDENTITY\",\n-                                        \"value\": \"VERIFY_IDENTITY\"\n+                                        \"description\": \"Deletes the original file from the remote system\",\n+                                        \"displayName\": \"Delete File\",\n+                                        \"value\": \"Delete File\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"DISABLED\",\n-                                \"description\": \"SSL Mode used when SSL Context Service configured supporting certificate verification options\",\n-                                \"displayName\": \"SSL Mode\",\n+                                \"defaultValue\": \"None\",\n+                                \"description\": \"Specifies what to do with the original file on the server once it has been pulled into NiFi. If the Completion Strategy fails, a warning will be logged but the data will still be transferred.\",\n+                                \"displayName\": \"Completion Strategy\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"SSL Mode\",\n+                                \"name\": \"Completion Strategy\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"capture-change-mysql-db-name-pattern\": {\n-                                \"description\": \"A regular expression (regex) for matching databases (or schemas, depending on your RDBMS' terminology) against the list of CDC events. The regex must match the database name as it is stored in the RDBMS. If the property is not set, the database name will not be used to filter the CDC events. NOTE: DDL events, even if they affect different databases, are associated with the database used by the session to execute the DDL. This means if a connection is made to one database, but the DDL is issued against another, then the connected database will be the one matched against the specified pattern.\",\n-                                \"displayName\": \"Database/Schema Name Pattern\",\n+                            \"Connection Mode\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Active\",\n+                                        \"value\": \"Active\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Passive\",\n+                                        \"value\": \"Passive\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"Passive\",\n+                                \"description\": \"The FTP Connection Mode\",\n+                                \"displayName\": \"Connection Mode\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"capture-change-mysql-db-name-pattern\",\n+                                \"name\": \"Connection Mode\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"capture-change-mysql-dist-map-cache-client\": {\n-                                \"description\": \"This is a legacy property that is no longer used to store table information, the processor will handle the table information (column names, types, etc.)\",\n-                                \"displayName\": \"Distributed Map Cache Client - unused\",\n+                            \"Connection Timeout\": {\n+                                \"defaultValue\": \"30 sec\",\n+                                \"description\": \"Amount of time to wait before timing out while creating a connection\",\n+                                \"displayName\": \"Connection Timeout\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"capture-change-mysql-dist-map-cache-client\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.distributed.cache.client.DistributedMapCacheClient\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            },\n-                            \"capture-change-mysql-driver-class\": {\n-                                \"defaultValue\": \"com.mysql.jdbc.Driver\",\n-                                \"description\": \"The class name of the MySQL database driver class\",\n-                                \"displayName\": \"MySQL Driver Class Name\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"capture-change-mysql-driver-class\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"capture-change-mysql-driver-locations\": {\n-                                \"description\": \"Comma-separated list of files/folders and/or URLs containing the MySQL driver JAR and its dependencies (if any). For example '/var/tmp/mysql-connector-java-5.1.38-bin.jar'\",\n-                                \"displayName\": \"MySQL Driver Location(s)\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"capture-change-mysql-driver-locations\",\n-                                \"required\": false,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"MULTIPLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\",\n-                                        \"DIRECTORY\",\n-                                        \"URL\"\n-                                    ]\n-                                },\n-                                \"sensitive\": false\n-                            },\n-                            \"capture-change-mysql-hosts\": {\n-                                \"description\": \"A list of hostname (and optional port) entries corresponding to nodes in a MySQL cluster. The entries should be comma separated using a colon (if the port is to be specified) such as host1:port,host2:port,....  For example mysql.myhost.com:3306. The port need not be specified, when omitted the default MySQL port value of 3306 will be used. This processor will attempt to connect to the hosts in the list in order. If one node goes down and failover is enabled for the cluster, then the processor will connect to the active node (assuming its node entry is specified in this property).\",\n-                                \"displayName\": \"MySQL Nodes\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"capture-change-mysql-hosts\",\n+                                \"name\": \"Connection Timeout\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"capture-change-mysql-include-begin-commit\": {\n+                            \"Create Directory\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"true\",\n                                         \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"false\",\n                                         \"value\": \"false\"\n                                     }\n                                 ],\n                                 \"defaultValue\": \"false\",\n-                                \"description\": \"Specifies whether to emit events corresponding to a BEGIN or COMMIT event in the binary log. Set to true if the BEGIN/COMMIT events are necessary in the downstream flow, otherwise set to false, which suppresses generation of these events and can increase flow performance.\",\n-                                \"displayName\": \"Include Begin/Commit Events\",\n+                                \"description\": \"Used when 'Completion Strategy' is 'Move File'. Specifies whether or not the remote directory should be created if it does not exist.\",\n+                                \"displayName\": \"Create Directory\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"capture-change-mysql-include-begin-commit\",\n-                                \"required\": true,\n+                                \"name\": \"Create Directory\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"capture-change-mysql-include-ddl-events\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"Specifies whether to emit events corresponding to Data Definition Language (DDL) events such as ALTER TABLE, TRUNCATE TABLE, e.g. in the binary log. Set to true if the DDL events are desired/necessary in the downstream flow, otherwise set to false, which suppresses generation of these events and can increase flow performance.\",\n-                                \"displayName\": \"Include DDL Events\",\n+                            \"Data Timeout\": {\n+                                \"defaultValue\": \"30 sec\",\n+                                \"description\": \"When transferring a file between the local and remote system, this value specifies how long is allowed to elapse without any data being transferred between systems\",\n+                                \"displayName\": \"Data Timeout\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"capture-change-mysql-include-ddl-events\",\n+                                \"name\": \"Data Timeout\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"capture-change-mysql-init-binlog-filename\": {\n-                                \"description\": \"Specifies an initial binlog filename to use if this processor's State does not have a current binlog filename. If a filename is present in the processor's State or \\\"Use GTID\\\" property is set to false, this property is ignored. This can be used along with Initial Binlog Position to \\\"skip ahead\\\" if previous events are not desired. Note that NiFi Expression Language is supported, but this property is evaluated when the processor is configured, so FlowFile attributes may not be used. Expression Language is supported to enable the use of the Variable Registry and/or environment properties.\",\n-                                \"displayName\": \"Initial Binlog Filename\",\n+                            \"Hostname\": {\n+                                \"description\": \"The fully-qualified hostname or IP address of the host to fetch the data from\",\n+                                \"displayName\": \"Hostname\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"capture-change-mysql-init-binlog-filename\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Hostname\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"capture-change-mysql-init-binlog-position\": {\n-                                \"description\": \"Specifies an initial offset into a binlog (specified by Initial Binlog Filename) to use if this processor's State does not have a current binlog filename. If a filename is present in the processor's State or \\\"Use GTID\\\" property is false, this property is ignored. This can be used along with Initial Binlog Filename to \\\"skip ahead\\\" if previous events are not desired. Note that NiFi Expression Language is supported, but this property is evaluated when the processor is configured, so FlowFile attributes may not be used. Expression Language is supported to enable the use of the Variable Registry and/or environment properties.\",\n-                                \"displayName\": \"Initial Binlog Position\",\n+                            \"Http Proxy Password\": {\n+                                \"description\": \"Http Proxy Password\",\n+                                \"displayName\": \"Http Proxy Password\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"capture-change-mysql-init-binlog-position\",\n+                                \"name\": \"Http Proxy Password\",\n                                 \"required\": false,\n-                                \"sensitive\": false\n+                                \"sensitive\": true\n                             },\n-                            \"capture-change-mysql-init-gtid\": {\n-                                \"description\": \"Specifies an initial GTID to use if this processor's State does not have a current GTID. If a GTID is present in the processor's State or \\\"Use GTID\\\" property is set to false, this property is ignored. This can be used to \\\"skip ahead\\\" if previous events are not desired. Note that NiFi Expression Language is supported, but this property is evaluated when the processor is configured, so FlowFile attributes may not be used. Expression Language is supported to enable the use of the Variable Registry and/or environment properties.\",\n-                                \"displayName\": \"Initial Binlog GTID\",\n+                            \"Http Proxy Username\": {\n+                                \"description\": \"Http Proxy Username\",\n+                                \"displayName\": \"Http Proxy Username\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"capture-change-mysql-init-gtid\",\n+                                \"name\": \"Http Proxy Username\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"capture-change-mysql-init-seq-id\": {\n-                                \"description\": \"Specifies an initial sequence identifier to use if this processor's State does not have a current sequence identifier. If a sequence identifier is present in the processor's State, this property is ignored. Sequence identifiers are monotonically increasing integers that record the order of flow files generated by the processor. They can be used with the EnforceOrder processor to guarantee ordered delivery of CDC events.\",\n-                                \"displayName\": \"Initial Sequence ID\",\n+                            \"Internal Buffer Size\": {\n+                                \"defaultValue\": \"16KB\",\n+                                \"description\": \"Set the internal buffer size for buffered data streams\",\n+                                \"displayName\": \"Internal Buffer Size\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"capture-change-mysql-init-seq-id\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Internal Buffer Size\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"capture-change-mysql-max-wait-time\": {\n-                                \"defaultValue\": \"30 seconds\",\n-                                \"description\": \"The maximum amount of time allowed for a connection to be established, zero means there is effectively no limit.\",\n-                                \"displayName\": \"Max Wait Time\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"capture-change-mysql-max-wait-time\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"capture-change-mysql-name-pattern\": {\n-                                \"description\": \"A regular expression (regex) for matching CDC events affecting matching tables. The regex must match the table name as it is stored in the database. If the property is not set, no events will be filtered based on table name.\",\n-                                \"displayName\": \"Table Name Pattern\",\n+                            \"Move Destination Directory\": {\n+                                \"description\": \"The directory on the remote server to move the original file to once it has been ingested into NiFi. This property is ignored unless the Completion Strategy is set to 'Move File'. The specified directory must already exist on the remote system if 'Create Directory' is disabled, or the rename will fail.\",\n+                                \"displayName\": \"Move Destination Directory\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"capture-change-mysql-name-pattern\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Move Destination Directory\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"capture-change-mysql-password\": {\n-                                \"description\": \"Password to access the MySQL cluster\",\n+                            \"Password\": {\n+                                \"description\": \"Password for the user account\",\n                                 \"displayName\": \"Password\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"capture-change-mysql-password\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Password\",\n                                 \"required\": false,\n                                 \"sensitive\": true\n                             },\n-                            \"capture-change-mysql-retrieve-all-records\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"true\",\n-                                \"description\": \"Specifies whether to get all available CDC events, regardless of the current binlog filename and/or position. If binlog filename and position values are present in the processor's State, this property's value is ignored. This allows for 4 different configurations: 1) If binlog data is available in processor State, that is used to determine the start location and the value of Retrieve All Records is ignored. 2) If no binlog data is in processor State, then Retrieve All Records set to true means start at the beginning of the binlog history. 3) If no binlog data is in processor State and Initial Binlog Filename/Position are not set, then Retrieve All Records set to false means start at the end of the binlog history. 4) If no binlog data is in processor State and Initial Binlog Filename/Position are set, then Retrieve All Records set to false means start at the specified initial binlog file/position. To reset the behavior, clear the processor state (refer to the State Management section of the processor's documentation).\",\n-                                \"displayName\": \"Retrieve All Records\",\n+                            \"Port\": {\n+                                \"defaultValue\": \"21\",\n+                                \"description\": \"The port to connect to on the remote host to fetch the data from\",\n+                                \"displayName\": \"Port\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"capture-change-mysql-retrieve-all-records\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Port\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"capture-change-mysql-server-id\": {\n-                                \"description\": \"The client connecting to the MySQL replication group is actually a simplified replica (server), and the Server ID value must be unique across the whole replication group (i.e. different from any other Server ID being used by any primary or replica). Thus, each instance of CaptureChangeMySQL must have a Server ID unique across the replication group. If the Server ID is not specified, it defaults to 65535.\",\n-                                \"displayName\": \"Server ID\",\n+                            \"Proxy Host\": {\n+                                \"description\": \"The fully qualified hostname or IP address of the proxy server\",\n+                                \"displayName\": \"Proxy Host\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"capture-change-mysql-server-id\",\n+                                \"name\": \"Proxy Host\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"capture-change-mysql-state-update-interval\": {\n-                                \"defaultValue\": \"0 seconds\",\n-                                \"description\": \"DEPRECATED. This property is no longer used and exists solely for backward compatibility purposes. Indicates how often to update the processor's state with binlog file/position values. A value of zero means that state will only be updated when the processor is stopped or shutdown. If at some point the processor state does not contain the desired binlog values, the last flow file emitted will contain the last observed values, and the processor can be returned to that state by using the Initial Binlog File, Initial Binlog Position, and Initial Sequence ID properties.\",\n-                                \"displayName\": \"State Update Interval\",\n+                            \"Proxy Port\": {\n+                                \"description\": \"The port of the proxy server\",\n+                                \"displayName\": \"Proxy Port\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"capture-change-mysql-state-update-interval\",\n-                                \"required\": true,\n+                                \"name\": \"Proxy Port\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"capture-change-mysql-use-gtid\": {\n+                            \"Proxy Type\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"displayName\": \"DIRECT\",\n+                                        \"value\": \"DIRECT\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"displayName\": \"HTTP\",\n+                                        \"value\": \"HTTP\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"SOCKS\",\n+                                        \"value\": \"SOCKS\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"Specifies whether to use Global Transaction ID (GTID) for binlog tracking. If set to true, processor's state of binlog file name and position is ignored. The main benefit of using GTID is to have much reliable failover than using binlog filename/position.\",\n-                                \"displayName\": \"Use Binlog GTID\",\n+                                \"defaultValue\": \"DIRECT\",\n+                                \"description\": \"Proxy type used for file transfers\",\n+                                \"displayName\": \"Proxy Type\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"capture-change-mysql-use-gtid\",\n-                                \"required\": true,\n+                                \"name\": \"Proxy Type\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"capture-change-mysql-username\": {\n-                                \"description\": \"Username to access the MySQL cluster\",\n-                                \"displayName\": \"Username\",\n+                            \"Remote File\": {\n+                                \"description\": \"The fully qualified filename on the remote system\",\n+                                \"displayName\": \"Remote File\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"capture-change-mysql-username\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Remote File\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"events-per-flowfile-strategy\": {\n+                            \"Transfer Mode\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"This strategy causes at most the number of events specified in the 'Number of Events Per FlowFile' property to be written per FlowFile. If the processor is stopped before the specified number of events has been written (or the event queue becomes empty), the fewer number of events will still be written as a FlowFile before stopping.\",\n-                                        \"displayName\": \"Max Events Per FlowFile\",\n-                                        \"value\": \"MAX_EVENTS_PER_FLOWFILE\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Binary\",\n+                                        \"value\": \"Binary\"\n                                     },\n                                     {\n-                                        \"description\": \"This strategy causes each event from a transaction (from BEGIN to COMMIT) to be written to a FlowFile\",\n-                                        \"displayName\": \"One Transaction Per FlowFile\",\n-                                        \"value\": \"ONE_TRANSACTION_PER_FLOWFILE\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"MAX_EVENTS_PER_FLOWFILE\",\n-                                \"description\": \"Specifies the strategy to use when writing events to FlowFile(s), such as 'Max Events Per FlowFile'\",\n-                                \"displayName\": \"Event Processing Strategy\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"events-per-flowfile-strategy\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"number-of-events-per-flowfile\": {\n-                                \"defaultValue\": \"1\",\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"MAX_EVENTS_PER_FLOWFILE\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Event Processing Strategy\",\n-                                        \"propertyName\": \"events-per-flowfile-strategy\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"ASCII\",\n+                                        \"value\": \"ASCII\"\n                                     }\n                                 ],\n-                                \"description\": \"Specifies how many events should be written to a single FlowFile. If the processor is stopped before the specified number of events has been written,the events will still be written as a FlowFile before stopping.\",\n-                                \"displayName\": \"Events Per FlowFile\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"number-of-events-per-flowfile\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            }\n-                        },\n-                        \"restricted\": true,\n-                        \"sideEffectFree\": false,\n-                        \"stateful\": {\n-                            \"description\": \"Information such as a 'pointer' to the current CDC event in the database is stored by this processor, such that it can continue from the same location if restarted.\",\n-                            \"scopes\": [\n-                                \"CLUSTER\"\n-                            ]\n-                        },\n-                        \"supportedRelationships\": [\n-                            {\n-                                \"description\": \"Successfully created FlowFile from SQL query result set.\",\n-                                \"name\": \"success\"\n-                            }\n-                        ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": false,\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": false,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"cdc\",\n-                            \"event\",\n-                            \"jdbc\",\n-                            \"mysql\",\n-                            \"sql\",\n-                            \"transaction\"\n-                        ],\n-                        \"triggerSerially\": true,\n-                        \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.cdc.mysql.processors.CaptureChangeMySQL\",\n-                        \"typeDescription\": \"Retrieves Change Data Capture (CDC) events from a MySQL database. CDC Events include INSERT, UPDATE, DELETE operations. Events are output as either a group of a specified number of events (the default is 1 so each event becomes its own flow file) or grouped as a full transaction (BEGIN to COMMIT). All events are ordered by the time at which the operation occurred. NOTE: If the processor is stopped before the specified number of events have been written to a flow file, the partial flow file will be output in order to maintain the consistency of the event stream.\",\n-                        \"version\": \"1.27.0\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"A sequence identifier (i.e. strictly increasing integer value) specifying the order of the CDC event flow file relative to the other event flow file(s).\",\n-                                \"name\": \"cdc.sequence.id\"\n-                            },\n-                            {\n-                                \"description\": \"A string indicating the type of CDC event that occurred, including (but not limited to) 'begin', 'insert', 'update', 'delete', 'ddl' and 'commit'.\",\n-                                \"name\": \"cdc.event.type\"\n-                            },\n-                            {\n-                                \"description\": \"The processor outputs flow file content in JSON format, and sets the mime.type attribute to application/json\",\n-                                \"name\": \"mime.type\"\n-                            }\n-                        ]\n-                    }\n-                ],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"1.27.0\"\n-        },\n-        {\n-            \"artifact\": \"nifi-smb-smbj-client-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-smb-smbj-client-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"e0c4461\"\n-                        },\n-                        \"group\": \"org.apache.nifi\",\n-                        \"propertyDescriptors\": {\n-                            \"domain\": {\n-                                \"description\": \"The domain used for authentication. Optional, in most cases username and password is sufficient.\",\n-                                \"displayName\": \"Domain\",\n+                                \"defaultValue\": \"Binary\",\n+                                \"description\": \"The FTP Transfer Mode\",\n+                                \"displayName\": \"Transfer Mode\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"domain\",\n+                                \"name\": \"Transfer Mode\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"enable-dfs\": {\n+                            \"Use Compression\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"true\",\n                                         \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"false\",\n                                         \"value\": \"false\"\n                                     }\n                                 ],\n                                 \"defaultValue\": \"false\",\n-                                \"description\": \"Enables accessing Distributed File System (DFS) and following DFS links during SMB operations.\",\n-                                \"displayName\": \"Enable DFS\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"enable-dfs\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"hostname\": {\n-                                \"description\": \"The network host of the SMB file server.\",\n-                                \"displayName\": \"Hostname\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"hostname\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"password\": {\n-                                \"description\": \"The password used for authentication.\",\n-                                \"displayName\": \"Password\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"password\",\n-                                \"required\": false,\n-                                \"sensitive\": true\n-                            },\n-                            \"port\": {\n-                                \"defaultValue\": \"445\",\n-                                \"description\": \"Port to use for connection.\",\n-                                \"displayName\": \"Port\",\n+                                \"description\": \"Indicates whether or not ZLIB compression should be used when transferring files\",\n+                                \"displayName\": \"Use Compression\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"port\",\n+                                \"name\": \"Use Compression\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"share\": {\n-                                \"description\": \"The network share to which files should be listed from. This is the \\\"first folder\\\"after the hostname: smb://hostname:port/[share]/dir1/dir2\",\n-                                \"displayName\": \"Share\",\n+                            \"Username\": {\n+                                \"description\": \"Username\",\n+                                \"displayName\": \"Username\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"share\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Username\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"smb-dialect\": {\n+                            \"fetchfiletransfer-notfound-loglevel\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"AUTO\",\n-                                        \"value\": \"AUTO\"\n+                                        \"displayName\": \"TRACE\",\n+                                        \"value\": \"TRACE\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"SMB 2.0.2\",\n-                                        \"value\": \"SMB_2_0_2\"\n+                                        \"displayName\": \"DEBUG\",\n+                                        \"value\": \"DEBUG\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"SMB 2.1\",\n-                                        \"value\": \"SMB_2_1\"\n+                                        \"displayName\": \"INFO\",\n+                                        \"value\": \"INFO\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"SMB 3.0\",\n-                                        \"value\": \"SMB_3_0\"\n+                                        \"displayName\": \"WARN\",\n+                                        \"value\": \"WARN\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"SMB 3.0.2\",\n-                                        \"value\": \"SMB_3_0_2\"\n+                                        \"displayName\": \"ERROR\",\n+                                        \"value\": \"ERROR\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"SMB 3.1.1\",\n-                                        \"value\": \"SMB_3_1_1\"\n+                                        \"displayName\": \"FATAL\",\n+                                        \"value\": \"FATAL\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"NONE\",\n+                                        \"value\": \"NONE\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"AUTO\",\n-                                \"description\": \"The SMB dialect is negotiated between the client and the server by default to the highest common version supported by both end. In some rare cases, the client-server communication may fail with the automatically negotiated dialect. This property can be used to set the dialect explicitly (e.g. to downgrade to a lower version), when those situations would occur.\",\n-                                \"displayName\": \"SMB Dialect\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"smb-dialect\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"timeout\": {\n-                                \"defaultValue\": \"5 sec\",\n-                                \"description\": \"Timeout for read and write operations.\",\n-                                \"displayName\": \"Timeout\",\n+                                \"defaultValue\": \"ERROR\",\n+                                \"description\": \"Log level to use in case the file does not exist when the processor is triggered\",\n+                                \"displayName\": \"Log level when file not found\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"timeout\",\n+                                \"name\": \"fetchfiletransfer-notfound-loglevel\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"use-encryption\": {\n+                            \"ftp-use-utf8\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"true\",\n                                         \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"false\",\n                                         \"value\": \"false\"\n                                     }\n                                 ],\n                                 \"defaultValue\": \"false\",\n-                                \"description\": \"Turns on/off encrypted communication between the client and the server. The property's behavior is SMB dialect dependent: SMB 2.x does not support encryption and the property has no effect. In case of SMB 3.x, it is a hint/request to the server to turn encryption on if the server also supports it.\",\n-                                \"displayName\": \"Use Encryption\",\n+                                \"description\": \"Tells the client to use UTF-8 encoding when processing files and filenames. If set to true, the server must also support UTF-8 encoding.\",\n+                                \"displayName\": \"Use UTF-8 Encoding\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"use-encryption\",\n+                                \"name\": \"ftp-use-utf8\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"username\": {\n-                                \"defaultValue\": \"Guest\",\n-                                \"description\": \"The username used for authentication.\",\n-                                \"displayName\": \"Username\",\n+                            \"proxy-configuration-service\": {\n+                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests. If set, it supersedes proxy settings configured per component. Supported proxies: HTTP + AuthN, SOCKS + AuthN\",\n+                                \"displayName\": \"Proxy Configuration Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"username\",\n+                                \"name\": \"proxy-configuration-service\",\n                                 \"required\": false,\n-                                \"sensitive\": false\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.proxy.ProxyConfigurationService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n                             }\n                         },\n-                        \"providedApiImplementations\": [\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.processors.standard.GetFTP\",\n+                            \"org.apache.nifi.processors.standard.GetSFTP\",\n+                            \"org.apache.nifi.processors.standard.PutFTP\",\n+                            \"org.apache.nifi.processors.standard.PutSFTP\"\n+                        ],\n+                        \"sideEffectFree\": false,\n+                        \"supportedRelationships\": [\n                             {\n-                                \"artifact\": \"nifi-smb-client-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.services.smb.SmbClientProviderService\",\n-                                \"version\": \"1.27.0\"\n+                                \"description\": \"All FlowFiles that are received are routed to success\",\n+                                \"name\": \"success\"\n+                            },\n+                            {\n+                                \"description\": \"Any FlowFile that could not be fetched from the remote server due to a communications failure will be transferred to this Relationship.\",\n+                                \"name\": \"comms.failure\"\n+                            },\n+                            {\n+                                \"description\": \"Any FlowFile for which we receive a 'Not Found' message from the remote server will be transferred to this Relationship.\",\n+                                \"name\": \"not.found\"\n+                            },\n+                            {\n+                                \"description\": \"Any FlowFile that could not be fetched from the remote server due to insufficient permissions will be transferred to this Relationship.\",\n+                                \"name\": \"permission.denied\"\n                             }\n                         ],\n+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\"\n+                        ],\n+                        \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicRelationships\": false,\n+                        \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"samba, smb, cifs, files\"\n+                            \"fetch\",\n+                            \"files\",\n+                            \"ftp\",\n+                            \"get\",\n+                            \"ingest\",\n+                            \"input\",\n+                            \"remote\",\n+                            \"retrieve\",\n+                            \"source\"\n                         ],\n-                        \"type\": \"org.apache.nifi.services.smb.SmbjClientProviderService\",\n-                        \"typeDescription\": \"Provides access to SMB Sessions with shared authentication credentials.\",\n-                        \"version\": \"1.27.0\"\n-                    }\n-                ],\n-                \"processors\": [],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"1.27.0\"\n-        },\n-        {\n-            \"artifact\": \"nifi-smb-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [],\n-                \"processors\": [\n+                        \"triggerSerially\": false,\n+                        \"triggerWhenAnyDestinationAvailable\": false,\n+                        \"triggerWhenEmpty\": false,\n+                        \"type\": \"org.apache.nifi.processors.standard.FetchFTP\",\n+                        \"typeDescription\": \"Fetches the content of a file from a remote FTP server and overwrites the contents of an incoming FlowFile with the content of the remote file.\",\n+                        \"version\": \"1.27.0\",\n+                        \"writesAttributes\": [\n+                            {\n+                                \"description\": \"The hostname or IP address from which the file was pulled\",\n+                                \"name\": \"ftp.remote.host\"\n+                            },\n+                            {\n+                                \"description\": \"The port that was used to communicate with the remote FTP server\",\n+                                \"name\": \"ftp.remote.port\"\n+                            },\n+                            {\n+                                \"description\": \"The name of the remote file that was pulled\",\n+                                \"name\": \"ftp.remote.filename\"\n+                            },\n+                            {\n+                                \"description\": \"The filename is updated to point to the filename fo the remote file\",\n+                                \"name\": \"filename\"\n+                            },\n+                            {\n+                                \"description\": \"If the Remote File contains a directory name, that directory name will be added to the FlowFile using the 'path' attribute\",\n+                                \"name\": \"path\"\n+                            },\n+                            {\n+                                \"description\": \"The name of the failure relationship applied when routing to any failure relationship\",\n+                                \"name\": \"fetch.failure.reason\"\n+                            }\n+                        ]\n+                    },\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-smb-nar\",\n+                        \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -84558,177 +83097,262 @@\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n+                        \"explicitRestrictions\": [\n+                            {\n+                                \"explanation\": \"Provides operator the ability to read from any file that NiFi has access to.\",\n+                                \"requiredPermission\": \"read filesystem\"\n+                            },\n+                            {\n+                                \"explanation\": \"Provides operator the ability to delete any file that NiFi has access to.\",\n+                                \"requiredPermission\": \"write filesystem\"\n+                            }\n+                        ],\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n                             \"Completion Strategy\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Leaves the file as-is.\",\n+                                        \"description\": \"Leave the file as-is\",\n                                         \"displayName\": \"None\",\n-                                        \"value\": \"NONE\"\n+                                        \"value\": \"None\"\n                                     },\n                                     {\n-                                        \"description\": \"Moves the file to the specified directory on the remote system. This option cannot be used when DFS is enabled on 'SMB Client Provider Service'.\",\n+                                        \"description\": \"Moves the file to the directory specified by the <Move Destination Directory> property\",\n                                         \"displayName\": \"Move File\",\n-                                        \"value\": \"MOVE\"\n+                                        \"value\": \"Move File\"\n                                     },\n                                     {\n-                                        \"description\": \"Deletes the file from the remote system.\",\n+                                        \"description\": \"Deletes the original file from the file system\",\n                                         \"displayName\": \"Delete File\",\n-                                        \"value\": \"DELETE\"\n+                                        \"value\": \"Delete File\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"NONE\",\n-                                \"description\": \"Specifies what to do with the original file on the server once it has been processed. If the Completion Strategy fails, a warning will be logged but the data will still be transferred.\",\n+                                \"defaultValue\": \"None\",\n+                                \"description\": \"Specifies what to do with the original file on the file system once it has been pulled into NiFi\",\n                                 \"displayName\": \"Completion Strategy\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n                                 \"name\": \"Completion Strategy\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Create Destination Directory\": {\n+                            \"File to Fetch\": {\n+                                \"defaultValue\": \"${absolute.path}/${filename}\",\n+                                \"description\": \"The fully-qualified filename of the file to fetch from the file system\",\n+                                \"displayName\": \"File to Fetch\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"File to Fetch\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Log level when file not found\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"displayName\": \"TRACE\",\n+                                        \"value\": \"TRACE\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"displayName\": \"DEBUG\",\n+                                        \"value\": \"DEBUG\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"INFO\",\n+                                        \"value\": \"INFO\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"WARN\",\n+                                        \"value\": \"WARN\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"ERROR\",\n+                                        \"value\": \"ERROR\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"FATAL\",\n+                                        \"value\": \"FATAL\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"NONE\",\n+                                        \"value\": \"NONE\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"false\",\n-                                \"dependencies\": [\n+                                \"defaultValue\": \"ERROR\",\n+                                \"description\": \"Log level to use in case the file does not exist when the processor is triggered\",\n+                                \"displayName\": \"Log level when file not found\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Log level when file not found\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Log level when permission denied\": {\n+                                \"allowableValues\": [\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"MOVE\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Completion Strategy\",\n-                                        \"propertyName\": \"Completion Strategy\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"TRACE\",\n+                                        \"value\": \"TRACE\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"DEBUG\",\n+                                        \"value\": \"DEBUG\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"INFO\",\n+                                        \"value\": \"INFO\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"WARN\",\n+                                        \"value\": \"WARN\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"ERROR\",\n+                                        \"value\": \"ERROR\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"FATAL\",\n+                                        \"value\": \"FATAL\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"NONE\",\n+                                        \"value\": \"NONE\"\n                                     }\n                                 ],\n-                                \"description\": \"Specifies whether or not the remote directory should be created if it does not exist.\",\n-                                \"displayName\": \"Create Destination Directory\",\n+                                \"defaultValue\": \"ERROR\",\n+                                \"description\": \"Log level to use in case user aman does not have sufficient permissions to read the file\",\n+                                \"displayName\": \"Log level when permission denied\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Create Destination Directory\",\n+                                \"name\": \"Log level when permission denied\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Destination Directory\": {\n-                                \"dependencies\": [\n+                            \"Move Conflict Strategy\": {\n+                                \"allowableValues\": [\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"MOVE\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Completion Strategy\",\n-                                        \"propertyName\": \"Completion Strategy\"\n+                                        \"description\": \"The existing destination file should remain intact. The newly ingested file should be moved to the destination directory but be renamed to a random filename\",\n+                                        \"displayName\": \"Rename\",\n+                                        \"value\": \"Rename\"\n+                                    },\n+                                    {\n+                                        \"description\": \"The newly ingested file should replace the existing file in the Destination Directory\",\n+                                        \"displayName\": \"Replace File\",\n+                                        \"value\": \"Replace File\"\n+                                    },\n+                                    {\n+                                        \"description\": \"The existing file should in the Destination Directory should stay intact and the newly ingested file should be deleted\",\n+                                        \"displayName\": \"Keep Existing\",\n+                                        \"value\": \"Keep Existing\"\n+                                    },\n+                                    {\n+                                        \"description\": \"The existing destination file should remain intact and the incoming FlowFile should be routed to failure\",\n+                                        \"displayName\": \"Fail\",\n+                                        \"value\": \"Fail\"\n                                     }\n                                 ],\n-                                \"description\": \"The directory on the remote server to move the original file to once it has been processed.\",\n-                                \"displayName\": \"Destination Directory\",\n+                                \"defaultValue\": \"Rename\",\n+                                \"description\": \"If Completion Strategy is set to Move File and a file already exists in the destination directory with the same name, this property specifies how that naming conflict should be resolved\",\n+                                \"displayName\": \"Move Conflict Strategy\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Destination Directory\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Move Conflict Strategy\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"remote-file\": {\n-                                \"defaultValue\": \"${path}/${filename}\",\n-                                \"description\": \"The full path of the file to be retrieved from the remote server. Expression language is supported.\",\n-                                \"displayName\": \"Remote File\",\n+                            \"Move Destination Directory\": {\n+                                \"description\": \"The directory to the move the original file to once it has been fetched from the file system. This property is ignored unless the Completion Strategy is set to \\\"Move File\\\". If the directory does not exist, it will be created.\",\n+                                \"displayName\": \"Move Destination Directory\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"remote-file\",\n-                                \"required\": true,\n+                                \"name\": \"Move Destination Directory\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n-                            },\n-                            \"smb-client-provider-service\": {\n-                                \"description\": \"Specifies the SMB client provider to use for creating SMB connections.\",\n-                                \"displayName\": \"SMB Client Provider Service\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"smb-client-provider-service\",\n-                                \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-smb-client-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.services.smb.SmbClientProviderService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n                             }\n                         },\n+                        \"restricted\": true,\n                         \"seeAlso\": [\n-                            \"org.apache.nifi.processors.smb.GetSmbFile\",\n-                            \"org.apache.nifi.processors.smb.ListSmb\",\n-                            \"org.apache.nifi.processors.smb.PutSmbFile\"\n+                            \"org.apache.nifi.processors.standard.GetFile\",\n+                            \"org.apache.nifi.processors.standard.ListFile\",\n+                            \"org.apache.nifi.processors.standard.PutFile\"\n                         ],\n                         \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"A FlowFile will be routed here for each successfully fetched file.\",\n+                                \"description\": \"Any FlowFile that is successfully fetched from the file system will be transferred to this Relationship.\",\n                                 \"name\": \"success\"\n                             },\n                             {\n-                                \"description\": \"A FlowFile will be routed here when failed to fetch its content.\",\n+                                \"description\": \"Any FlowFile that could not be fetched from the file system because the file could not be found will be transferred to this Relationship.\",\n+                                \"name\": \"not.found\"\n+                            },\n+                            {\n+                                \"description\": \"Any FlowFile that could not be fetched from the file system due to the user running NiFi not having sufficient permissions will be transferred to this Relationship.\",\n+                                \"name\": \"permission.denied\"\n+                            },\n+                            {\n+                                \"description\": \"Any FlowFile that could not be fetched from the file system for any reason other than insufficient permissions or the file not existing will be transferred to this Relationship.\",\n                                 \"name\": \"failure\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n                         \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"cifs\",\n                             \"fetch\",\n                             \"files\",\n-                            \"samba\",\n-                            \"smb\"\n+                            \"filesystem\",\n+                            \"get\",\n+                            \"ingest\",\n+                            \"ingress\",\n+                            \"input\",\n+                            \"local\",\n+                            \"source\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.smb.FetchSmb\",\n-                        \"typeDescription\": \"Fetches files from a SMB Share. Designed to be used in tandem with ListSmb.\",\n-                        \"version\": \"1.27.0\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"The error code returned by SMB when the fetch of a file fails.\",\n-                                \"name\": \"error.code\"\n-                            },\n-                            {\n-                                \"description\": \"The error message returned by SMB when the fetch of a file fails.\",\n-                                \"name\": \"error.message\"\n-                            }\n-                        ]\n+                        \"type\": \"org.apache.nifi.processors.standard.FetchFile\",\n+                        \"typeDescription\": \"Reads the contents of a file from disk and streams it into the contents of an incoming FlowFile. Once this is done, the file is optionally moved elsewhere or deleted to help keep the file system organized.\",\n+                        \"version\": \"1.27.0\"\n                     },\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-smb-nar\",\n+                        \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -84737,689 +83361,928 @@\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Batch Size\": {\n-                                \"defaultValue\": \"10\",\n-                                \"description\": \"The maximum number of files to pull in each iteration\",\n-                                \"displayName\": \"Batch Size\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Batch Size\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Directory\": {\n-                                \"description\": \"The network folder to which files should be written. This is the remaining relative path after the share: \\\\\\\\hostname\\\\share\\\\[dir1\\\\dir2].\",\n-                                \"displayName\": \"Directory\",\n+                            \"Ciphers Allowed\": {\n+                                \"description\": \"A comma-separated list of Ciphers allowed for SFTP connections. Leave unset to allow all. Available options are: 3des-cbc, 3des-ctr, aes128-cbc, aes128-ctr, aes128-gcm@openssh.com, aes192-cbc, aes192-ctr, aes256-cbc, aes256-ctr, aes256-gcm@openssh.com, arcfour, arcfour128, arcfour256, blowfish-cbc, blowfish-ctr, cast128-cbc, cast128-ctr, chacha20-poly1305@openssh.com, idea-cbc, idea-ctr, serpent128-cbc, serpent128-ctr, serpent192-cbc, serpent192-ctr, serpent256-cbc, serpent256-ctr, twofish-cbc, twofish128-cbc, twofish128-ctr, twofish192-cbc, twofish192-ctr, twofish256-cbc, twofish256-ctr\",\n+                                \"displayName\": \"Ciphers Allowed\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Directory\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Domain\": {\n-                                \"description\": \"The domain used for authentication. Optional, in most cases username and password is sufficient.\",\n-                                \"displayName\": \"Domain\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Domain\",\n+                                \"name\": \"Ciphers Allowed\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"File Filter\": {\n-                                \"description\": \"Only files whose names match the given regular expression will be picked up\",\n-                                \"displayName\": \"File Filter\",\n+                            \"Completion Strategy\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"Leave the file as-is\",\n+                                        \"displayName\": \"None\",\n+                                        \"value\": \"None\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Move the file to the directory specified by the <Move Destination Directory> property\",\n+                                        \"displayName\": \"Move File\",\n+                                        \"value\": \"Move File\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Deletes the original file from the remote system\",\n+                                        \"displayName\": \"Delete File\",\n+                                        \"value\": \"Delete File\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"None\",\n+                                \"description\": \"Specifies what to do with the original file on the server once it has been pulled into NiFi. If the Completion Strategy fails, a warning will be logged but the data will still be transferred.\",\n+                                \"displayName\": \"Completion Strategy\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"File Filter\",\n-                                \"required\": false,\n+                                \"name\": \"Completion Strategy\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Hostname\": {\n-                                \"description\": \"The network host to which files should be written.\",\n-                                \"displayName\": \"Hostname\",\n+                            \"Connection Timeout\": {\n+                                \"defaultValue\": \"30 sec\",\n+                                \"description\": \"Amount of time to wait before timing out while creating a connection\",\n+                                \"displayName\": \"Connection Timeout\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Hostname\",\n+                                \"name\": \"Connection Timeout\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Ignore Hidden Files\": {\n+                            \"Create Directory\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"true\",\n                                         \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"false\",\n                                         \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"true\",\n-                                \"description\": \"Indicates whether or not hidden files should be ignored\",\n-                                \"displayName\": \"Ignore Hidden Files\",\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"Used when 'Completion Strategy' is 'Move File'. Specifies whether or not the remote directory should be created if it does not exist.\",\n+                                \"displayName\": \"Create Directory\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Ignore Hidden Files\",\n+                                \"name\": \"Create Directory\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Data Timeout\": {\n+                                \"defaultValue\": \"30 sec\",\n+                                \"description\": \"When transferring a file between the local and remote system, this value specifies how long is allowed to elapse without any data being transferred between systems\",\n+                                \"displayName\": \"Data Timeout\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Data Timeout\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Keep Source File\": {\n+                            \"Disable Directory Listing\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"true\",\n                                         \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"false\",\n                                         \"value\": \"false\"\n                                     }\n                                 ],\n                                 \"defaultValue\": \"false\",\n-                                \"description\": \"If true, the file is not deleted after it has been copied to the Content Repository; this causes the file to be picked up continually and is useful for testing purposes.  If not keeping original NiFi will need write permissions on the directory it is pulling from otherwise it will ignore the file.\",\n-                                \"displayName\": \"Keep Source File\",\n+                                \"description\": \"Control how 'Move Destination Directory' is created when 'Completion Strategy' is 'Move File' and 'Create Directory' is enabled. If set to 'true', directory listing is not performed prior to create missing directories. By default, this processor executes a directory listing command to see target directory existence before creating missing directories. However, there are situations that you might need to disable the directory listing such as the following. Directory listing might fail with some permission setups (e.g. chmod 100) on a directory. Also, if any other SFTP client created the directory after this processor performed a listing and before a directory creation request by this processor is finished, then an error is returned because the directory already exists.\",\n+                                \"displayName\": \"Disable Directory Listing\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Keep Source File\",\n+                                \"name\": \"Disable Directory Listing\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Host Key File\": {\n+                                \"description\": \"If supplied, the given file will be used as the Host Key; otherwise, if 'Strict Host Key Checking' property is applied (set to true) then uses the 'known_hosts' and 'known_hosts2' files from ~/.ssh directory else no host key file will be used\",\n+                                \"displayName\": \"Host Key File\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Host Key File\",\n+                                \"required\": false,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"SINGLE\",\n+                                    \"resourceTypes\": [\n+                                        \"FILE\"\n+                                    ]\n+                                },\n+                                \"sensitive\": false\n+                            },\n+                            \"Hostname\": {\n+                                \"description\": \"The fully-qualified hostname or IP address of the host to fetch the data from\",\n+                                \"displayName\": \"Hostname\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Hostname\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n+                            \"Http Proxy Password\": {\n+                                \"description\": \"Http Proxy Password\",\n+                                \"displayName\": \"Http Proxy Password\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Http Proxy Password\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n+                            },\n+                            \"Http Proxy Username\": {\n+                                \"description\": \"Http Proxy Username\",\n+                                \"displayName\": \"Http Proxy Username\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Http Proxy Username\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Key Algorithms Allowed\": {\n+                                \"description\": \"A comma-separated list of Key Algorithms allowed for SFTP connections. Leave unset to allow all. Available options are: ecdsa-sha2-nistp256, ecdsa-sha2-nistp256-cert-v01@openssh.com, ecdsa-sha2-nistp384, ecdsa-sha2-nistp384-cert-v01@openssh.com, ecdsa-sha2-nistp521, ecdsa-sha2-nistp521-cert-v01@openssh.com, rsa-sha2-256, rsa-sha2-512, ssh-dss, ssh-dss-cert-v01@openssh.com, ssh-ed25519, ssh-ed25519-cert-v01@openssh.com, ssh-rsa, ssh-rsa-cert-v01@openssh.com\",\n+                                \"displayName\": \"Key Algorithms Allowed\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Key Algorithms Allowed\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Key Exchange Algorithms Allowed\": {\n+                                \"description\": \"A comma-separated list of Key Exchange Algorithms allowed for SFTP connections. Leave unset to allow all. Available options are: curve25519-sha256, curve25519-sha256@libssh.org, diffie-hellman-group-exchange-sha1, diffie-hellman-group-exchange-sha256, diffie-hellman-group1-sha1, diffie-hellman-group14-sha1, diffie-hellman-group14-sha256, diffie-hellman-group14-sha256@ssh.com, diffie-hellman-group15-sha256, diffie-hellman-group15-sha256@ssh.com, diffie-hellman-group15-sha384@ssh.com, diffie-hellman-group15-sha512, diffie-hellman-group16-sha256, diffie-hellman-group16-sha384@ssh.com, diffie-hellman-group16-sha512, diffie-hellman-group16-sha512@ssh.com, diffie-hellman-group17-sha512, diffie-hellman-group18-sha512, diffie-hellman-group18-sha512@ssh.com, ecdh-sha2-nistp256, ecdh-sha2-nistp384, ecdh-sha2-nistp521, ext-info-c\",\n+                                \"displayName\": \"Key Exchange Algorithms Allowed\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Key Exchange Algorithms Allowed\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Message Authentication Codes Allowed\": {\n+                                \"description\": \"A comma-separated list of Message Authentication Codes allowed for SFTP connections. Leave unset to allow all. Available options are: hmac-md5, hmac-md5-96, hmac-md5-96-etm@openssh.com, hmac-md5-etm@openssh.com, hmac-ripemd160, hmac-ripemd160-96, hmac-ripemd160-etm@openssh.com, hmac-ripemd160@openssh.com, hmac-sha1, hmac-sha1-96, hmac-sha1-96@openssh.com, hmac-sha1-etm@openssh.com, hmac-sha2-256, hmac-sha2-256-etm@openssh.com, hmac-sha2-512, hmac-sha2-512-etm@openssh.com\",\n+                                \"displayName\": \"Message Authentication Codes Allowed\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Message Authentication Codes Allowed\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Move Destination Directory\": {\n+                                \"description\": \"The directory on the remote server to move the original file to once it has been ingested into NiFi. This property is ignored unless the Completion Strategy is set to 'Move File'. The specified directory must already exist on the remote system if 'Create Directory' is disabled, or the rename will fail.\",\n+                                \"displayName\": \"Move Destination Directory\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Move Destination Directory\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n                             \"Password\": {\n-                                \"description\": \"The password used for authentication. Required if Username is set.\",\n+                                \"description\": \"Password for the user account\",\n                                 \"displayName\": \"Password\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n                                 \"name\": \"Password\",\n                                 \"required\": false,\n                                 \"sensitive\": true\n                             },\n-                            \"Path Filter\": {\n-                                \"description\": \"When Recurse Subdirectories is true, then only subdirectories whose path matches the given regular expression will be scanned\",\n-                                \"displayName\": \"Path Filter\",\n+                            \"Port\": {\n+                                \"defaultValue\": \"22\",\n+                                \"description\": \"The port to connect to on the remote host to fetch the data from\",\n+                                \"displayName\": \"Port\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Path Filter\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Port\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Private Key Passphrase\": {\n+                                \"description\": \"Password for the private key\",\n+                                \"displayName\": \"Private Key Passphrase\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Private Key Passphrase\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n+                            },\n+                            \"Private Key Path\": {\n+                                \"description\": \"The fully qualified path to the Private Key file\",\n+                                \"displayName\": \"Private Key Path\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Private Key Path\",\n                                 \"required\": false,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"SINGLE\",\n+                                    \"resourceTypes\": [\n+                                        \"FILE\"\n+                                    ]\n+                                },\n                                 \"sensitive\": false\n                             },\n-                            \"Polling Interval\": {\n-                                \"defaultValue\": \"0 sec\",\n-                                \"description\": \"Indicates how long to wait before performing a directory listing\",\n-                                \"displayName\": \"Polling Interval\",\n+                            \"Proxy Host\": {\n+                                \"description\": \"The fully qualified hostname or IP address of the proxy server\",\n+                                \"displayName\": \"Proxy Host\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Polling Interval\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Proxy Host\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Recurse Subdirectories\": {\n+                            \"Proxy Port\": {\n+                                \"description\": \"The port of the proxy server\",\n+                                \"displayName\": \"Proxy Port\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Proxy Port\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Proxy Type\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"displayName\": \"DIRECT\",\n+                                        \"value\": \"DIRECT\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"displayName\": \"HTTP\",\n+                                        \"value\": \"HTTP\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"SOCKS\",\n+                                        \"value\": \"SOCKS\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"true\",\n-                                \"description\": \"Indicates whether or not to pull files from subdirectories\",\n-                                \"displayName\": \"Recurse Subdirectories\",\n+                                \"defaultValue\": \"DIRECT\",\n+                                \"description\": \"Proxy type used for file transfers\",\n+                                \"displayName\": \"Proxy Type\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Recurse Subdirectories\",\n-                                \"required\": true,\n+                                \"name\": \"Proxy Type\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Share\": {\n-                                \"description\": \"The network share to which files should be written. This is the \\\"first folder\\\"after the hostname: \\\\\\\\hostname\\\\[share]\\\\dir1\\\\dir2\",\n-                                \"displayName\": \"Share\",\n+                            \"Remote File\": {\n+                                \"description\": \"The fully qualified filename on the remote system\",\n+                                \"displayName\": \"Remote File\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Share\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Remote File\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Share Access Strategy\": {\n+                            \"Send Keep Alive On Timeout\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"none\",\n-                                        \"value\": \"none\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"read\",\n-                                        \"value\": \"read\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"read, delete\",\n-                                        \"value\": \"read, delete\"\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"read, write, delete\",\n-                                        \"value\": \"read, write, delete\"\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"none\",\n-                                \"description\": \"Indicates which shared access are granted on the file during the read. None is the most restrictive, but the safest setting to prevent corruption.\",\n-                                \"displayName\": \"Share Access Strategy\",\n+                                \"defaultValue\": \"true\",\n+                                \"description\": \"Send a Keep Alive message every 5 seconds up to 5 times for an overall timeout of 25 seconds.\",\n+                                \"displayName\": \"Send Keep Alive On Timeout\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Share Access Strategy\",\n+                                \"name\": \"Send Keep Alive On Timeout\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Username\": {\n-                                \"description\": \"The username used for authentication. If no username is set then anonymous authentication is attempted.\",\n-                                \"displayName\": \"Username\",\n+                            \"Strict Host Key Checking\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"Indicates whether or not strict enforcement of hosts keys should be applied\",\n+                                \"displayName\": \"Strict Host Key Checking\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Username\",\n-                                \"required\": false,\n+                                \"name\": \"Strict Host Key Checking\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"enable-dfs\": {\n+                            \"Use Compression\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"true\",\n                                         \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"false\",\n                                         \"value\": \"false\"\n                                     }\n                                 ],\n                                 \"defaultValue\": \"false\",\n-                                \"description\": \"Enables accessing Distributed File System (DFS) and following DFS links during SMB operations.\",\n-                                \"displayName\": \"Enable DFS\",\n+                                \"description\": \"Indicates whether or not ZLIB compression should be used when transferring files\",\n+                                \"displayName\": \"Use Compression\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"enable-dfs\",\n+                                \"name\": \"Use Compression\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"smb-dialect\": {\n+                            \"Username\": {\n+                                \"description\": \"Username\",\n+                                \"displayName\": \"Username\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Username\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"fetchfiletransfer-notfound-loglevel\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"AUTO\",\n-                                        \"value\": \"AUTO\"\n+                                        \"displayName\": \"TRACE\",\n+                                        \"value\": \"TRACE\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"SMB 2.0.2\",\n-                                        \"value\": \"SMB_2_0_2\"\n+                                        \"displayName\": \"DEBUG\",\n+                                        \"value\": \"DEBUG\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"SMB 2.1\",\n-                                        \"value\": \"SMB_2_1\"\n+                                        \"displayName\": \"INFO\",\n+                                        \"value\": \"INFO\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"SMB 3.0\",\n-                                        \"value\": \"SMB_3_0\"\n+                                        \"displayName\": \"WARN\",\n+                                        \"value\": \"WARN\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"SMB 3.0.2\",\n-                                        \"value\": \"SMB_3_0_2\"\n+                                        \"displayName\": \"ERROR\",\n+                                        \"value\": \"ERROR\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"SMB 3.1.1\",\n-                                        \"value\": \"SMB_3_1_1\"\n+                                        \"displayName\": \"FATAL\",\n+                                        \"value\": \"FATAL\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"NONE\",\n+                                        \"value\": \"NONE\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"AUTO\",\n-                                \"description\": \"The SMB dialect is negotiated between the client and the server by default to the highest common version supported by both end. In some rare cases, the client-server communication may fail with the automatically negotiated dialect. This property can be used to set the dialect explicitly (e.g. to downgrade to a lower version), when those situations would occur.\",\n-                                \"displayName\": \"SMB Dialect\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"smb-dialect\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"timeout\": {\n-                                \"defaultValue\": \"5 sec\",\n-                                \"description\": \"Timeout for read and write operations.\",\n-                                \"displayName\": \"Timeout\",\n+                                \"defaultValue\": \"ERROR\",\n+                                \"description\": \"Log level to use in case the file does not exist when the processor is triggered\",\n+                                \"displayName\": \"Log level when file not found\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"timeout\",\n+                                \"name\": \"fetchfiletransfer-notfound-loglevel\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"use-encryption\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"Turns on/off encrypted communication between the client and the server. The property's behavior is SMB dialect dependent: SMB 2.x does not support encryption and the property has no effect. In case of SMB 3.x, it is a hint/request to the server to turn encryption on if the server also supports it.\",\n-                                \"displayName\": \"Use Encryption\",\n+                            \"proxy-configuration-service\": {\n+                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests. If set, it supersedes proxy settings configured per component. Supported proxies: HTTP + AuthN, SOCKS + AuthN\",\n+                                \"displayName\": \"Proxy Configuration Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"use-encryption\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n+                                \"name\": \"proxy-configuration-service\",\n+                                \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.proxy.ProxyConfigurationService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n                             }\n                         },\n                         \"seeAlso\": [\n-                            \"org.apache.nifi.processors.smb.FetchSmb\",\n-                            \"org.apache.nifi.processors.smb.ListSmb\",\n-                            \"org.apache.nifi.processors.smb.PutSmbFile\"\n+                            \"org.apache.nifi.processors.standard.GetFTP\",\n+                            \"org.apache.nifi.processors.standard.GetSFTP\",\n+                            \"org.apache.nifi.processors.standard.PutFTP\",\n+                            \"org.apache.nifi.processors.standard.PutSFTP\"\n                         ],\n                         \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"All files are routed to success\",\n+                                \"description\": \"All FlowFiles that are received are routed to success\",\n                                 \"name\": \"success\"\n+                            },\n+                            {\n+                                \"description\": \"Any FlowFile that could not be fetched from the remote server due to a communications failure will be transferred to this Relationship.\",\n+                                \"name\": \"comms.failure\"\n+                            },\n+                            {\n+                                \"description\": \"Any FlowFile for which we receive a 'Not Found' message from the remote server will be transferred to this Relationship.\",\n+                                \"name\": \"not.found\"\n+                            },\n+                            {\n+                                \"description\": \"Any FlowFile that could not be fetched from the remote server due to insufficient permissions will be transferred to this Relationship.\",\n+                                \"name\": \"permission.denied\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n                         \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"samba, smb, cifs, files, get\"\n+                            \"fetch\",\n+                            \"files\",\n+                            \"get\",\n+                            \"ingest\",\n+                            \"input\",\n+                            \"remote\",\n+                            \"retrieve\",\n+                            \"sftp\",\n+                            \"source\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": true,\n-                        \"type\": \"org.apache.nifi.processors.smb.GetSmbFile\",\n-                        \"typeDescription\": \"Reads file from a samba network location to FlowFiles. Use this processor instead of a cifs mounts if share access control is important. Configure the Hostname, Share and Directory accordingly: \\\\\\\\[Hostname]\\\\[Share]\\\\[path\\\\to\\\\Directory]\",\n+                        \"triggerWhenEmpty\": false,\n+                        \"type\": \"org.apache.nifi.processors.standard.FetchSFTP\",\n+                        \"typeDescription\": \"Fetches the content of a file from a remote SFTP server and overwrites the contents of an incoming FlowFile with the content of the remote file.\",\n                         \"version\": \"1.27.0\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"The filename is set to the name of the file on the network share\",\n-                                \"name\": \"filename\"\n+                                \"description\": \"The hostname or IP address from which the file was pulled\",\n+                                \"name\": \"sftp.remote.host\"\n                             },\n                             {\n-                                \"description\": \"The path is set to the relative path of the file's network share name. For example, if the input is set to \\\\\\\\hostname\\\\share\\\\tmp, files picked up from \\\\tmp will have the path attribute set to tmp\",\n-                                \"name\": \"path\"\n+                                \"description\": \"The port that was used to communicate with the remote SFTP server\",\n+                                \"name\": \"sftp.remote.port\"\n                             },\n                             {\n-                                \"description\": \"The date and time that the file was created. May not work on all file systems\",\n-                                \"name\": \"file.creationTime\"\n+                                \"description\": \"The name of the remote file that was pulled\",\n+                                \"name\": \"sftp.remote.filename\"\n                             },\n                             {\n-                                \"description\": \"The date and time that the file was last modified. May not work on all file systems\",\n-                                \"name\": \"file.lastModifiedTime\"\n+                                \"description\": \"The filename is updated to point to the filename fo the remote file\",\n+                                \"name\": \"filename\"\n                             },\n                             {\n-                                \"description\": \"The date and time that the file was last accessed. May not work on all file systems\",\n-                                \"name\": \"file.lastAccessTime\"\n+                                \"description\": \"If the Remote File contains a directory name, that directory name will be added to the FlowFile using the 'path' attribute\",\n+                                \"name\": \"path\"\n                             },\n                             {\n-                                \"description\": \"The full path from where a file was picked up. This includes the hostname and the share name\",\n-                                \"name\": \"absolute.path\"\n+                                \"description\": \"The name of the failure relationship applied when routing to any failure relationship\",\n+                                \"name\": \"fetch.failure.reason\"\n                             }\n                         ]\n                     },\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-smb-nar\",\n+                        \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n                         },\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"1 min\"\n+                            \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n-                        \"primaryNodeOnly\": true,\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n+                        \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"directory\": {\n-                                \"description\": \"The network folder from which to list files. This is the remaining relative path after the share: smb://HOSTNAME:PORT/SHARE/[DIRECTORY]/sub/directories. It is also possible to add subdirectories. The given path on the remote file share must exist. This can be checked using verification. You may mix Windows and Linux-style directory separators.\",\n-                                \"displayName\": \"Input Directory\",\n+                            \"Attribute Matching Strategy\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"Provides a set of attribute keys to filter for, separated by a comma delimiter ','.\",\n+                                        \"displayName\": \"Enumerate attributes\",\n+                                        \"value\": \"Enumerate attributes\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Provides a regular expression to match keys of attributes to filter for.\",\n+                                        \"displayName\": \"Use regular expression\",\n+                                        \"value\": \"Use regular expression\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"Enumerate attributes\",\n+                                \"description\": \"Specifies the strategy to filter attributes by.\",\n+                                \"displayName\": \"Attribute Matching Strategy\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"directory\",\n-                                \"required\": false,\n+                                \"name\": \"Attribute Matching Strategy\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"et-initial-listing-target\": {\n+                            \"Filter Mode\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Ignore entities having timestamp older than the specified 'Tracking Time Window' at the initial listing activity.\",\n-                                        \"displayName\": \"Tracking Time Window\",\n-                                        \"value\": \"window\"\n+                                        \"description\": \"Retains only the attributes matching the filter, all other attributes are removed.\",\n+                                        \"displayName\": \"Retain\",\n+                                        \"value\": \"Retain\"\n                                     },\n                                     {\n-                                        \"description\": \"Regardless of entities timestamp, all existing entities will be listed at the initial listing activity.\",\n-                                        \"displayName\": \"All Available\",\n-                                        \"value\": \"all\"\n+                                        \"description\": \"Removes the attributes matching the filter, all other attributes are retained.\",\n+                                        \"displayName\": \"Remove\",\n+                                        \"value\": \"Remove\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"all\",\n-                                \"description\": \"Specify how initial listing should be handled. Used by 'Tracking Entities' strategy.\",\n-                                \"displayName\": \"Entity Tracking Initial Listing Target\",\n+                                \"defaultValue\": \"Retain\",\n+                                \"description\": \"Specifies the strategy to apply on filtered attributes. Either 'Remove' or 'Retain' only the matching attributes.\",\n+                                \"displayName\": \"Filter Mode\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"et-initial-listing-target\",\n-                                \"required\": false,\n+                                \"name\": \"Filter Mode\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"et-state-cache\": {\n-                                \"description\": \"Listed entities are stored in the specified cache storage so that this processor can resume listing across NiFi restart or in case of primary node change. 'Tracking Entities' strategy require tracking information of all listed entities within the last 'Tracking Time Window'. To support large number of entities, the strategy uses DistributedMapCache instead of managed state. Cache key format is 'ListedEntities::{processorId}(::{nodeId})'. If it tracks per node listed entities, then the optional '::{nodeId}' part is added to manage state separately. E.g. cluster wide cache key = 'ListedEntities::8dda2321-0164-1000-50fa-3042fe7d6a7b', per node cache key = 'ListedEntities::8dda2321-0164-1000-50fa-3042fe7d6a7b::nifi-node3' The stored cache content is Gzipped JSON string. The cache key will be deleted when target listing configuration is changed. Used by 'Tracking Entities' strategy.\",\n-                                \"displayName\": \"Entity Tracking State Cache\",\n+                            \"Filtered Attributes\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"Enumerate attributes\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Attribute Matching Strategy\",\n+                                        \"propertyName\": \"Attribute Matching Strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"A set of attribute names to filter from FlowFiles. Each attribute name is separated by the comma delimiter ','.\",\n+                                \"displayName\": \"Filtered Attributes\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"et-state-cache\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.distributed.cache.client.DistributedMapCacheClient\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Filtered Attributes\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n                             },\n-                            \"et-time-window\": {\n-                                \"defaultValue\": \"3 hours\",\n-                                \"description\": \"Specify how long this processor should track already-listed entities. 'Tracking Entities' strategy can pick any entity whose timestamp is inside the specified time window. For example, if set to '30 minutes', any entity having timestamp in recent 30 minutes will be the listing target when this processor runs. A listed entity is considered 'new/updated' and a FlowFile is emitted if one of following condition meets: 1. does not exist in the already-listed entities, 2. has newer timestamp than the cached entity, 3. has different size than the cached entity. If a cached entity's timestamp becomes older than specified time window, that entity will be removed from the cached already-listed entities. Used by 'Tracking Entities' strategy.\",\n-                                \"displayName\": \"Entity Tracking Time Window\",\n+                            \"Filtered Attributes Pattern\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"Use regular expression\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Attribute Matching Strategy\",\n+                                        \"propertyName\": \"Attribute Matching Strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"A regular expression to match names of attributes to filter from FlowFiles.\",\n+                                \"displayName\": \"Filtered Attributes Pattern\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"et-time-window\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Filtered Attributes Pattern\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n-                            },\n-                            \"file-name-suffix-filter\": {\n-                                \"description\": \"Files ending with the given suffix will be omitted. Can be used to make sure that files that are still uploading are not listed multiple times, by having those files have a suffix and remove the suffix once the upload finishes. This is highly recommended when using 'Tracking Entities' or 'Tracking Timestamps' listing strategies.\",\n-                                \"displayName\": \"File Name Suffix Filter\",\n+                            }\n+                        },\n+                        \"sideEffectFree\": true,\n+                        \"supportedRelationships\": [\n+                            {\n+                                \"description\": \"All successful FlowFiles are routed to this relationship\",\n+                                \"name\": \"success\"\n+                            }\n+                        ],\n+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\"\n+                        ],\n+                        \"supportsBatching\": true,\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicRelationships\": false,\n+                        \"supportsEventDriven\": false,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"Attribute Expression Language\",\n+                            \"attributes\",\n+                            \"delete\",\n+                            \"filter\",\n+                            \"modification\",\n+                            \"regex\",\n+                            \"regular expression\",\n+                            \"remove\",\n+                            \"retain\"\n+                        ],\n+                        \"triggerSerially\": false,\n+                        \"triggerWhenAnyDestinationAvailable\": false,\n+                        \"triggerWhenEmpty\": false,\n+                        \"type\": \"org.apache.nifi.processors.standard.FilterAttribute\",\n+                        \"typeDescription\": \"Filters the attributes of a FlowFile by retaining specified attributes and removing the rest or by removing specified attributes and retaining the rest.\",\n+                        \"version\": \"1.27.0\"\n+                    },\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-standard-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"e0c4461\"\n+                        },\n+                        \"defaultBulletinLevel\": \"WARN\",\n+                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": 1,\n+                            \"EVENT_DRIVEN\": 0,\n+                            \"TIMER_DRIVEN\": 1\n+                        },\n+                        \"defaultPenaltyDuration\": \"30 sec\",\n+                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": \"* * * * * ?\",\n+                            \"TIMER_DRIVEN\": \"0 sec\"\n+                        },\n+                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n+                        \"defaultYieldDuration\": \"1 sec\",\n+                        \"group\": \"org.apache.nifi\",\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n+                        \"primaryNodeOnly\": false,\n+                        \"propertyDescriptors\": {\n+                            \"flatten-json-character-set\": {\n+                                \"defaultValue\": \"UTF-8\",\n+                                \"description\": \"The Character Set in which file is encoded\",\n+                                \"displayName\": \"Character Set\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"file-name-suffix-filter\",\n-                                \"required\": false,\n+                                \"name\": \"flatten-json-character-set\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"listing-strategy\": {\n+                            \"flatten-json-pretty-print-json\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"This strategy tracks information of all the listed entities within the latest 'Entity Tracking Time Window' to determine new/updated entities. This strategy can pick entities having old timestamp that can be missed with 'Tracking Timestamps'. Works even when multiple subdirectories are being written at the same time while listing is running. However additional DistributedMapCache controller service is required and more JVM heap memory is used. See the description of 'Entity Tracking Time Window' property for further details on how it works.\",\n-                                        \"displayName\": \"Tracking Entities\",\n-                                        \"value\": \"entities\"\n-                                    },\n-                                    {\n-                                        \"description\": \"This strategy lists an entity without any tracking. The same entity will be listed each time on executing this processor. It is recommended to change the default run schedule value. Any property that related to the persisting state will be disregarded.\",\n-                                        \"displayName\": \"No Tracking\",\n-                                        \"value\": \"none\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n-                                        \"description\": \"This strategy tracks the latest timestamp of listed entity to determine new/updated entities. Since it only tracks few timestamps, it can manage listing state efficiently. However, any newly added, or updated entity having timestamp older than the tracked latest timestamp can not be picked by this strategy. For example, such situation can happen in a file system if a file with old timestamp is copied or moved into the target directory without its last modified timestamp being updated. Also may miss files when multiple subdirectories are being written at the same time while listing is running.\",\n-                                        \"displayName\": \"Tracking Timestamps\",\n-                                        \"value\": \"timestamps\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"timestamps\",\n-                                \"description\": \"Specify how to determine new/updated entities. See each strategy descriptions for detail.\",\n-                                \"displayName\": \"Listing Strategy\",\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"Specifies whether or not resulted json should be pretty printed\",\n+                                \"displayName\": \"Pretty Print JSON\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"listing-strategy\",\n+                                \"name\": \"flatten-json-pretty-print-json\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"max-file-age\": {\n-                                \"description\": \"Any file older than the given value will be omitted.\",\n-                                \"displayName\": \"Maximum File Age\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"max-file-age\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"max-file-size\": {\n-                                \"description\": \"Any file larger than the given value will be omitted.\",\n-                                \"displayName\": \"Maximum File Size\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"max-file-size\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"min-file-age\": {\n-                                \"defaultValue\": \"5 secs\",\n-                                \"description\": \"The minimum age that a file must be in order to be listed; any file younger than this amount of time will be ignored.\",\n-                                \"displayName\": \"Minimum File Age\",\n+                            \"flatten-json-return-type\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"flatten\",\n+                                        \"value\": \"flatten\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"unflatten\",\n+                                        \"value\": \"unflatten\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"flatten\",\n+                                \"description\": \"Specifies the desired return type of json such as flatten/unflatten\",\n+                                \"displayName\": \"Return Type\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"min-file-age\",\n+                                \"name\": \"flatten-json-return-type\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"min-file-size\": {\n-                                \"description\": \"Any file smaller than the given value will be omitted.\",\n-                                \"displayName\": \"Minimum File Size\",\n+                            \"flatten-json-separator\": {\n+                                \"defaultValue\": \".\",\n+                                \"description\": \"The separator character used for joining keys. Must be a JSON-legal character.\",\n+                                \"displayName\": \"Separator\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"min-file-size\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"flatten-json-separator\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"record-writer\": {\n-                                \"description\": \"Specifies the Record Writer to use for creating the listing. If not specified, one FlowFile will be created for each entity that is listed. If the Record Writer is specified, all entities will be written to a single FlowFile instead of adding attributes to individual FlowFiles.\",\n-                                \"displayName\": \"Record Writer\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"record-writer\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            },\n-                            \"smb-client-provider-service\": {\n-                                \"description\": \"Specifies the SMB client provider to use for creating SMB connections.\",\n-                                \"displayName\": \"SMB Client Provider Service\",\n+                            \"flatten-mode\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"Flattens every objects into a single level json\",\n+                                        \"displayName\": \"normal\",\n+                                        \"value\": \"normal\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Flattens every objects and keep arrays format\",\n+                                        \"displayName\": \"keep arrays\",\n+                                        \"value\": \"keep arrays\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Conforms to MongoDB dot notation to update also nested documents\",\n+                                        \"displayName\": \"dot notation\",\n+                                        \"value\": \"dot notation\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Flattens every objects except arrays which contain only primitive types (strings, numbers, booleans and null)\",\n+                                        \"displayName\": \"keep primitive arrays\",\n+                                        \"value\": \"keep primitive arrays\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"keep arrays\",\n+                                \"description\": \"Specifies how json should be flattened/unflattened\",\n+                                \"displayName\": \"Flatten Mode\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"smb-client-provider-service\",\n+                                \"name\": \"flatten-mode\",\n                                 \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-smb-client-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.services.smb.SmbClientProviderService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n+                                \"sensitive\": false\n                             },\n-                            \"target-system-timestamp-precision\": {\n+                            \"ignore-reserved-characters\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Automatically detect time unit deterministically based on candidate entries timestamp. Please note that this option may take longer to list entities unnecessarily, if none of entries has a precise precision timestamp. E.g. even if a target system supports millis, if all entries only have timestamps without millis, such as '2017-06-16 09:06:34.000', then its precision is determined as 'seconds'.\",\n-                                        \"displayName\": \"Auto Detect\",\n-                                        \"value\": \"auto-detect\"\n-                                    },\n-                                    {\n-                                        \"description\": \"This option provides the minimum latency for an entry from being available to being listed if target system supports millis, if not, use other options.\",\n-                                        \"displayName\": \"Milliseconds\",\n-                                        \"value\": \"millis\"\n-                                    },\n-                                    {\n-                                        \"description\": \"For a target system that does not have millis precision, but has in seconds.\",\n-                                        \"displayName\": \"Seconds\",\n-                                        \"value\": \"seconds\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n-                                        \"description\": \"For a target system that only supports precision in minutes.\",\n-                                        \"displayName\": \"Minutes\",\n-                                        \"value\": \"minutes\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"auto-detect\",\n-                                \"description\": \"Specify timestamp precision at the target system. Since this processor uses timestamp of entities to decide which should be listed, it is crucial to use the right timestamp precision.\",\n-                                \"displayName\": \"Target System Timestamp Precision\",\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"If true, reserved characters in keys will be ignored\",\n+                                \"displayName\": \"Ignore Reserved Characters\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"target-system-timestamp-precision\",\n+                                \"name\": \"ignore-reserved-characters\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             }\n                         },\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.processors.smb.FetchSmb\",\n-                            \"org.apache.nifi.processors.smb.GetSmbFile\",\n-                            \"org.apache.nifi.processors.smb.PutSmbFile\"\n+                        \"sideEffectFree\": true,\n+                        \"supportedRelationships\": [\n+                            {\n+                                \"description\": \"Successfully flattened/unflattened files go to this relationship.\",\n+                                \"name\": \"success\"\n+                            },\n+                            {\n+                                \"description\": \"Files that cannot be flattened/unflattened go to this relationship.\",\n+                                \"name\": \"failure\"\n+                            }\n                         ],\n-                        \"sideEffectFree\": false,\n-                        \"stateful\": {\n-                            \"description\": \"After performing a listing of files, the state of the previous listing can be stored in order to list files continuously without duplication.\",\n-                            \"scopes\": [\n-                                \"CLUSTER\"\n-                            ]\n+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\",\n+                            \"EVENT_DRIVEN\"\n+                        ],\n+                        \"supportsBatching\": true,\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicRelationships\": false,\n+                        \"supportsEventDriven\": true,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"flatten\",\n+                            \"json\",\n+                            \"unflatten\"\n+                        ],\n+                        \"triggerSerially\": false,\n+                        \"triggerWhenAnyDestinationAvailable\": false,\n+                        \"triggerWhenEmpty\": false,\n+                        \"type\": \"org.apache.nifi.processors.standard.FlattenJson\",\n+                        \"typeDescription\": \"Provides the user with the ability to take a nested JSON document and flatten it into a simple key/value pair document. The keys are combined at each level with a user-defined separator that defaults to '.'. This Processor also allows to unflatten back the flattened json. It supports four kinds of flatten mode such as normal, keep-arrays, dot notation for MongoDB query and keep-primitive-arrays. Default flatten mode is 'keep-arrays'.\",\n+                        \"version\": \"1.27.0\"\n+                    },\n+                    {\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-standard-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"e0c4461\"\n+                        },\n+                        \"defaultBulletinLevel\": \"WARN\",\n+                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": 1,\n+                            \"TIMER_DRIVEN\": 1\n                         },\n+                        \"defaultPenaltyDuration\": \"30 sec\",\n+                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": \"* * * * * ?\",\n+                            \"TIMER_DRIVEN\": \"0 sec\"\n+                        },\n+                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n+                        \"defaultYieldDuration\": \"1 sec\",\n+                        \"group\": \"org.apache.nifi\",\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n+                        \"primaryNodeOnly\": false,\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.processors.standard.JoinEnrichment\"\n+                        ],\n+                        \"sideEffectFree\": true,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"All FlowFiles that are received are routed to success\",\n-                                \"name\": \"success\"\n+                                \"description\": \"A clone of the incoming FlowFile will be routed to this relationship, after adding appropriate attributes.\",\n+                                \"name\": \"enrichment\"\n+                            },\n+                            {\n+                                \"description\": \"The incoming FlowFile will be routed to this relationship, after adding appropriate attributes.\",\n+                                \"name\": \"original\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n-                        \"supportsBatching\": false,\n+                        \"supportsBatching\": true,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"list\",\n-                            \"samba, smb, cifs, files\"\n+                            \"enrich\",\n+                            \"fork\",\n+                            \"join\",\n+                            \"record\"\n                         ],\n-                        \"triggerSerially\": true,\n+                        \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.smb.ListSmb\",\n-                        \"typeDescription\": \"Lists concrete files shared via SMB protocol. Each listed file may result in one flowfile, the metadata being written as flowfile attributes. Or - in case the 'Record Writer' property is set - the entire result is written as records to a single flowfile. This Processor is designed to run on Primary Node only in a cluster. If the primary node changes, the new Primary Node will pick up where the previous node left off without duplicating all of the data.\",\n+                        \"type\": \"org.apache.nifi.processors.standard.ForkEnrichment\",\n+                        \"typeDescription\": \"Used in conjunction with the JoinEnrichment processor, this processor is responsible for adding the attributes that are necessary for the JoinEnrichment processor to perform its function. Each incoming FlowFile will be cloned. The original FlowFile will have appropriate attributes added and then be transferred to the 'original' relationship. The clone will have appropriate attributes added and then be routed to the 'enrichment' relationship. See the documentation for the JoinEnrichment processor (and especially its Additional Details) for more information on how these Processors work together and how to perform enrichment tasks in NiFi by using these Processors.\",\n                         \"version\": \"1.27.0\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"The name of the file that was read from filesystem.\",\n-                                \"name\": \"filename\"\n-                            },\n-                            {\n-                                \"description\": \"The short name of the file that was read from filesystem.\",\n-                                \"name\": \"shortName\"\n-                            },\n-                            {\n-                                \"description\": \"The path is set to the relative path of the file's directory on the remote filesystem compared to the Share root directory. For example, for a given remote locationsmb://HOSTNAME:PORT/SHARE/DIRECTORY, and a file is being listed from smb://HOSTNAME:PORT/SHARE/DIRECTORY/sub/folder/file then the path attribute will be set to \\\"DIRECTORY/sub/folder\\\".\",\n-                                \"name\": \"path\"\n-                            },\n-                            {\n-                                \"description\": \"The SMB URL of the share.\",\n-                                \"name\": \"serviceLocation\"\n-                            },\n-                            {\n-                                \"description\": \"The timestamp of when the file's content changed in the filesystem as 'yyyy-MM-dd'T'HH:mm:ss'.\",\n-                                \"name\": \"lastModifiedTime\"\n-                            },\n-                            {\n-                                \"description\": \"The timestamp of when the file was created in the filesystem as 'yyyy-MM-dd'T'HH:mm:ss'.\",\n-                                \"name\": \"creationTime\"\n-                            },\n-                            {\n-                                \"description\": \"The timestamp of when the file was accessed in the filesystem as 'yyyy-MM-dd'T'HH:mm:ss'.\",\n-                                \"name\": \"lastAccessTime\"\n-                            },\n-                            {\n-                                \"description\": \"The timestamp of when the file's attributes was changed in the filesystem as 'yyyy-MM-dd'T'HH:mm:ss'.\",\n-                                \"name\": \"changeTime\"\n-                            },\n-                            {\n-                                \"description\": \"The size of the file in bytes.\",\n-                                \"name\": \"size\"\n+                                \"description\": \"The Group ID to use in order to correlate the 'original' FlowFile with the 'enrichment' FlowFile.\",\n+                                \"name\": \"enrichment.group.id\"\n                             },\n                             {\n-                                \"description\": \"The number of bytes allocated for the file on the server.\",\n-                                \"name\": \"allocationSize\"\n+                                \"description\": \"The role to use for enrichment. This will either be ORIGINAL or ENRICHMENT.\",\n+                                \"name\": \"enrichment.role\"\n                             }\n                         ]\n                     },\n                     {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-smb-nar\",\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -85427,1119 +84290,1269 @@\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n+                        \"dynamicProperties\": [\n+                            {\n+                                \"description\": \"A Record Path value, pointing to a field of type ARRAY containing RECORD objects\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"name\": \"Record Path property\",\n+                                \"value\": \"The Record Path value\"\n+                            }\n+                        ],\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Batch Size\": {\n-                                \"defaultValue\": \"100\",\n-                                \"description\": \"The maximum number of files to put in each iteration\",\n-                                \"displayName\": \"Batch Size\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Batch Size\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Conflict Resolution Strategy\": {\n+                            \"fork-mode\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"replace\",\n-                                        \"value\": \"replace\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"ignore\",\n-                                        \"value\": \"ignore\"\n+                                        \"description\": \"Generated records will be the elements of the array\",\n+                                        \"displayName\": \"Extract\",\n+                                        \"value\": \"extract\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"fail\",\n-                                        \"value\": \"fail\"\n+                                        \"description\": \"Generated records will preserve the input schema and will contain a one-element array\",\n+                                        \"displayName\": \"Split\",\n+                                        \"value\": \"split\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"replace\",\n-                                \"description\": \"Indicates what should happen when a file with the same name already exists in the output directory\",\n-                                \"displayName\": \"Conflict Resolution Strategy\",\n+                                \"defaultValue\": \"split\",\n+                                \"description\": \"Specifies the forking mode of the processor\",\n+                                \"displayName\": \"Mode\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Conflict Resolution Strategy\",\n+                                \"name\": \"fork-mode\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Create Missing Directories\": {\n+                            \"include-parent-fields\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"true\",\n                                         \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"false\",\n                                         \"value\": \"false\"\n                                     }\n                                 ],\n                                 \"defaultValue\": \"false\",\n-                                \"description\": \"If true, then missing destination directories will be created. If false, flowfiles are penalized and sent to failure.\",\n-                                \"displayName\": \"Create Missing Directories\",\n+                                \"description\": \"This parameter is only valid with the 'extract' mode. If set to true, all the fields from the root level to the given array will be added as fields of each element of the array to fork.\",\n+                                \"displayName\": \"Include Parent Fields\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Create Missing Directories\",\n+                                \"name\": \"include-parent-fields\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Directory\": {\n-                                \"description\": \"The network folder to which files should be written. This is the remaining relative path after the share: \\\\\\\\hostname\\\\share\\\\[dir1\\\\dir2]. You may use expression language.\",\n-                                \"displayName\": \"Directory\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Directory\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Domain\": {\n-                                \"description\": \"The domain used for authentication. Optional, in most cases username and password is sufficient.\",\n-                                \"displayName\": \"Domain\",\n+                            \"record-reader\": {\n+                                \"description\": \"Specifies the Controller Service to use for reading incoming data\",\n+                                \"displayName\": \"Record Reader\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Domain\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n+                                \"name\": \"record-reader\",\n+                                \"required\": true,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n                             },\n-                            \"Hostname\": {\n-                                \"description\": \"The network host to which files should be written.\",\n-                                \"displayName\": \"Hostname\",\n+                            \"record-writer\": {\n+                                \"description\": \"Specifies the Controller Service to use for writing out the records\",\n+                                \"displayName\": \"Record Writer\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Hostname\",\n+                                \"name\": \"record-writer\",\n                                 \"required\": true,\n-                                \"sensitive\": false\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            }\n+                        },\n+                        \"sideEffectFree\": true,\n+                        \"supportedRelationships\": [\n+                            {\n+                                \"description\": \"In case a FlowFile generates an error during the fork operation, it will be routed to this relationship\",\n+                                \"name\": \"failure\"\n                             },\n-                            \"Password\": {\n-                                \"description\": \"The password used for authentication. Required if Username is set.\",\n-                                \"displayName\": \"Password\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Password\",\n-                                \"required\": false,\n-                                \"sensitive\": true\n+                            {\n+                                \"description\": \"The original FlowFiles will be routed to this relationship\",\n+                                \"name\": \"original\"\n                             },\n-                            \"Share\": {\n-                                \"description\": \"The network share to which files should be written. This is the \\\"first folder\\\"after the hostname: \\\\\\\\hostname\\\\[share]\\\\dir1\\\\dir2\",\n-                                \"displayName\": \"Share\",\n+                            {\n+                                \"description\": \"The FlowFiles containing the forked records will be routed to this relationship\",\n+                                \"name\": \"fork\"\n+                            }\n+                        ],\n+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\"\n+                        ],\n+                        \"supportsBatching\": true,\n+                        \"supportsDynamicProperties\": true,\n+                        \"supportsDynamicRelationships\": false,\n+                        \"supportsEventDriven\": false,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"array\",\n+                            \"content\",\n+                            \"event\",\n+                            \"fork\",\n+                            \"record\",\n+                            \"stream\"\n+                        ],\n+                        \"triggerSerially\": false,\n+                        \"triggerWhenAnyDestinationAvailable\": false,\n+                        \"triggerWhenEmpty\": false,\n+                        \"type\": \"org.apache.nifi.processors.standard.ForkRecord\",\n+                        \"typeDescription\": \"This processor allows the user to fork a record into multiple records. The user must specify at least one Record Path, as a dynamic property, pointing to a field of type ARRAY containing RECORD objects. The processor accepts two modes: 'split' and 'extract'. In both modes, there is one record generated per element contained in the designated array. In the 'split' mode, each generated record will preserve the same schema as given in the input but the array will contain only one element. In the 'extract' mode, the element of the array must be of record type and will be the generated record. Additionally, in the 'extract' mode, it is possible to specify if each generated record should contain all the fields of the parent records from the root level to the extracted record. This assumes that the fields to add in the record are defined in the schema of the Record Writer controller service. See examples in the additional details documentation of this processor.\",\n+                        \"version\": \"1.27.0\",\n+                        \"writesAttributes\": [\n+                            {\n+                                \"description\": \"The generated FlowFile will have a 'record.count' attribute indicating the number of records that were written to the FlowFile.\",\n+                                \"name\": \"record.count\"\n+                            },\n+                            {\n+                                \"description\": \"The MIME Type indicated by the Record Writer\",\n+                                \"name\": \"mime.type\"\n+                            },\n+                            {\n+                                \"description\": \"Any Attribute that the configured Record Writer returns will be added to the FlowFile.\",\n+                                \"name\": \"<Attributes from Record Writer>\"\n+                            }\n+                        ]\n+                    },\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-standard-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"e0c4461\"\n+                        },\n+                        \"defaultBulletinLevel\": \"WARN\",\n+                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": 1,\n+                            \"TIMER_DRIVEN\": 1\n+                        },\n+                        \"defaultPenaltyDuration\": \"30 sec\",\n+                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": \"* * * * * ?\",\n+                            \"TIMER_DRIVEN\": \"1 min\"\n+                        },\n+                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n+                        \"defaultYieldDuration\": \"1 sec\",\n+                        \"dynamicProperties\": [\n+                            {\n+                                \"description\": \"Specifies an attribute on generated FlowFiles defined by the Dynamic Property's key and value. If Expression Language is used, evaluation will be performed only once per batch of generated FlowFiles.\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"name\": \"Generated FlowFile attribute name\",\n+                                \"value\": \"Generated FlowFile attribute value\"\n+                            }\n+                        ],\n+                        \"group\": \"org.apache.nifi\",\n+                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n+                        \"primaryNodeOnly\": false,\n+                        \"propertyDescriptors\": {\n+                            \"Batch Size\": {\n+                                \"defaultValue\": \"1\",\n+                                \"description\": \"The number of FlowFiles to be transferred in each invocation\",\n+                                \"displayName\": \"Batch Size\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Share\",\n+                                \"name\": \"Batch Size\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Share Access Strategy\": {\n+                            \"Data Format\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"none\",\n-                                        \"value\": \"none\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"read\",\n-                                        \"value\": \"read\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"read, delete\",\n-                                        \"value\": \"read, delete\"\n+                                        \"displayName\": \"Binary\",\n+                                        \"value\": \"Binary\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"read, write, delete\",\n-                                        \"value\": \"read, write, delete\"\n+                                        \"displayName\": \"Text\",\n+                                        \"value\": \"Text\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"none\",\n-                                \"description\": \"Indicates which shared access are granted on the file during the write. None is the most restrictive, but the safest setting to prevent corruption.\",\n-                                \"displayName\": \"Share Access Strategy\",\n+                                \"defaultValue\": \"Text\",\n+                                \"description\": \"Specifies whether the data should be Text or Binary\",\n+                                \"displayName\": \"Data Format\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Share Access Strategy\",\n+                                \"name\": \"Data Format\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Temporary Suffix\": {\n-                                \"description\": \"A temporary suffix which will be apended to the filename while it's transfering. After the transfer is complete, the suffix will be removed.\",\n-                                \"displayName\": \"Temporary Suffix\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Temporary Suffix\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Username\": {\n-                                \"description\": \"The username used for authentication. If no username is set then anonymous authentication is attempted.\",\n-                                \"displayName\": \"Username\",\n+                            \"File Size\": {\n+                                \"defaultValue\": \"0B\",\n+                                \"description\": \"The size of the file that will be used\",\n+                                \"displayName\": \"File Size\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Username\",\n-                                \"required\": false,\n+                                \"name\": \"File Size\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"enable-dfs\": {\n+                            \"Unique FlowFiles\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"true\",\n                                         \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"false\",\n                                         \"value\": \"false\"\n                                     }\n                                 ],\n                                 \"defaultValue\": \"false\",\n-                                \"description\": \"Enables accessing Distributed File System (DFS) and following DFS links during SMB operations.\",\n-                                \"displayName\": \"Enable DFS\",\n+                                \"description\": \"If true, each FlowFile that is generated will be unique. If false, a random value will be generated and all FlowFiles will get the same content but this offers much higher throughput\",\n+                                \"displayName\": \"Unique FlowFiles\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"enable-dfs\",\n+                                \"name\": \"Unique FlowFiles\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"smb-dialect\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"AUTO\",\n-                                        \"value\": \"AUTO\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"SMB 2.0.2\",\n-                                        \"value\": \"SMB_2_0_2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"SMB 2.1\",\n-                                        \"value\": \"SMB_2_1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"SMB 3.0\",\n-                                        \"value\": \"SMB_3_0\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"SMB 3.0.2\",\n-                                        \"value\": \"SMB_3_0_2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"SMB 3.1.1\",\n-                                        \"value\": \"SMB_3_1_1\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"AUTO\",\n-                                \"description\": \"The SMB dialect is negotiated between the client and the server by default to the highest common version supported by both end. In some rare cases, the client-server communication may fail with the automatically negotiated dialect. This property can be used to set the dialect explicitly (e.g. to downgrade to a lower version), when those situations would occur.\",\n-                                \"displayName\": \"SMB Dialect\",\n+                            \"character-set\": {\n+                                \"defaultValue\": \"UTF-8\",\n+                                \"description\": \"Specifies the character set to use when writing the bytes of Custom Text to a flow file.\",\n+                                \"displayName\": \"Character Set\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"smb-dialect\",\n+                                \"name\": \"character-set\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"timeout\": {\n-                                \"defaultValue\": \"5 sec\",\n-                                \"description\": \"Timeout for read and write operations.\",\n-                                \"displayName\": \"Timeout\",\n+                            \"generate-ff-custom-text\": {\n+                                \"description\": \"If Data Format is text and if Unique FlowFiles is false, then this custom text will be used as content of the generated FlowFiles and the File Size will be ignored. Finally, if Expression Language is used, evaluation will be performed only once per batch of generated FlowFiles\",\n+                                \"displayName\": \"Custom Text\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"timeout\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"generate-ff-custom-text\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"use-encryption\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"Turns on/off encrypted communication between the client and the server. The property's behavior is SMB dialect dependent: SMB 2.x does not support encryption and the property has no effect. In case of SMB 3.x, it is a hint/request to the server to turn encryption on if the server also supports it.\",\n-                                \"displayName\": \"Use Encryption\",\n+                            \"mime-type\": {\n+                                \"description\": \"Specifies the value to set for the \\\"mime.type\\\" attribute.\",\n+                                \"displayName\": \"Mime Type\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"use-encryption\",\n-                                \"required\": true,\n+                                \"name\": \"mime-type\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             }\n                         },\n-                        \"readsAttributes\": [\n-                            {\n-                                \"description\": \"The filename to use when writing the FlowFile to the network folder.\",\n-                                \"name\": \"filename\"\n-                            }\n-                        ],\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.processors.smb.FetchSmb\",\n-                            \"org.apache.nifi.processors.smb.GetSmbFile\",\n-                            \"org.apache.nifi.processors.smb.ListSmb\"\n-                        ],\n                         \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"Files that have been successfully written to the output network path are transferred to this relationship\",\n+                                \"description\": \"\",\n                                 \"name\": \"success\"\n-                            },\n-                            {\n-                                \"description\": \"Files that could not be written to the output network path for some reason are transferred to this relationship\",\n-                                \"name\": \"failure\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n-                        \"supportsBatching\": false,\n-                        \"supportsDynamicProperties\": false,\n+                        \"supportsBatching\": true,\n+                        \"supportsDynamicProperties\": true,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"samba, smb, cifs, files, put\"\n+                            \"generate\",\n+                            \"load\",\n+                            \"random\",\n+                            \"test\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.smb.PutSmbFile\",\n-                        \"typeDescription\": \"Writes the contents of a FlowFile to a samba network location. Use this processor instead of a cifs mounts if share access control is important.Configure the Hostname, Share and Directory accordingly: \\\\\\\\[Hostname]\\\\[Share]\\\\[path\\\\to\\\\Directory]\",\n-                        \"version\": \"1.27.0\"\n-                    }\n-                ],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"1.27.0\"\n-        },\n-        {\n-            \"artifact\": \"nifi-dropbox-services-api-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [],\n-                \"processors\": [],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"1.27.0\"\n-        },\n-        {\n-            \"artifact\": \"nifi-azure-services-api-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [],\n-                \"processors\": [],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"1.27.0\"\n-        },\n-        {\n-            \"artifact\": \"nifi-record-sink-service-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [\n+                        \"type\": \"org.apache.nifi.processors.standard.GenerateFlowFile\",\n+                        \"typeDescription\": \"This processor creates FlowFiles with random data or custom content. GenerateFlowFile is useful for load testing, configuration, and simulation. Also see DuplicateFlowFile for additional load testing.\",\n+                        \"version\": \"1.27.0\",\n+                        \"writesAttributes\": [\n+                            {\n+                                \"description\": \"Sets the MIME type of the output if the 'Mime Type' property is set\",\n+                                \"name\": \"mime.type\"\n+                            }\n+                        ]\n+                    },\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-record-sink-service-nar\",\n+                        \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n+                        \"defaultBulletinLevel\": \"WARN\",\n+                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": 1,\n+                            \"TIMER_DRIVEN\": 1\n+                        },\n+                        \"defaultPenaltyDuration\": \"30 sec\",\n+                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": \"* * * * * ?\",\n+                            \"TIMER_DRIVEN\": \"0 sec\"\n+                        },\n+                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n+                        \"defaultYieldDuration\": \"1 sec\",\n+                        \"dynamicProperties\": [\n+                            {\n+                                \"description\": \"Custom properties define the generated record schema using configured field names and value data types in absence of the Schema Text property\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"name\": \"Field name in generated record\",\n+                                \"value\": \"Faker category for generated record values\"\n+                            }\n+                        ],\n                         \"group\": \"org.apache.nifi\",\n+                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n+                        \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"bcc\": {\n-                                \"description\": \"The recipients to include in the BCC-Line of the email. Comma separated sequence of addresses following RFC822 syntax.\",\n-                                \"displayName\": \"BCC\",\n+                            \"null-percentage\": {\n+                                \"defaultValue\": \"0\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"true\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Nullable Fields\",\n+                                        \"propertyName\": \"nullable-fields\"\n+                                    }\n+                                ],\n+                                \"description\": \"The percent probability (0-100%) that a generated value for any nullable field will be null. Set this property to zero to have no null values, or 100 to have all null values.\",\n+                                \"displayName\": \"Null Value Percentage\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"bcc\",\n-                                \"required\": false,\n+                                \"name\": \"null-percentage\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"cc\": {\n-                                \"description\": \"The recipients to include in the CC-Line of the email. Comma separated sequence of addresses following RFC822 syntax.\",\n-                                \"displayName\": \"CC\",\n+                            \"nullable-fields\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"true\",\n+                                \"description\": \"Whether the generated fields will be nullable. Note that this property is ignored if Schema Text is set. Also it only affects the schema of the generated data, not whether any values will be null. If this property is true, see 'Null Value Percentage' to set the probability that any generated field will be null.\",\n+                                \"displayName\": \"Nullable Fields\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"cc\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"nullable-fields\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"from\": {\n-                                \"description\": \"Specifies the Email address to use as the sender. Comma separated sequence of addresses following RFC822 syntax.\",\n-                                \"displayName\": \"From\",\n+                            \"number-of-records\": {\n+                                \"defaultValue\": \"100\",\n+                                \"description\": \"Specifies how many records will be generated for each outgoing FlowFile.\",\n+                                \"displayName\": \"Number of Records\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"from\",\n+                                \"name\": \"number-of-records\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"record-sink-record-writer\": {\n-                                \"description\": \"Specifies the Controller Service to use for writing out the records.\",\n+                            \"record-writer\": {\n+                                \"description\": \"Specifies the Controller Service to use for writing out the records\",\n                                 \"displayName\": \"Record Writer\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"record-sink-record-writer\",\n+                                \"name\": \"record-writer\",\n                                 \"required\": true,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n                                     \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n                                     \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             },\n-                            \"smtp-auth\": {\n-                                \"defaultValue\": \"true\",\n-                                \"description\": \"Flag indicating whether authentication should be used\",\n-                                \"displayName\": \"SMTP Auth\",\n+                            \"schema-text\": {\n+                                \"description\": \"The text of an Avro-formatted Schema used to generate record data. If this property is set, any user-defined properties are ignored.\",\n+                                \"displayName\": \"Schema Text\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"smtp-auth\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"smtp-hostname\": {\n-                                \"description\": \"The hostname of the SMTP Server that is used to send Email Notifications\",\n-                                \"displayName\": \"SMTP Hostname\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"smtp-hostname\",\n-                                \"required\": true,\n+                                \"name\": \"schema-text\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n+                            }\n+                        },\n+                        \"sideEffectFree\": false,\n+                        \"supportedRelationships\": [\n+                            {\n+                                \"description\": \"FlowFiles that are successfully created will be routed to this relationship\",\n+                                \"name\": \"success\"\n+                            }\n+                        ],\n+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\"\n+                        ],\n+                        \"supportsBatching\": true,\n+                        \"supportsDynamicProperties\": true,\n+                        \"supportsDynamicRelationships\": false,\n+                        \"supportsEventDriven\": false,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"fake\",\n+                            \"generate\",\n+                            \"random\",\n+                            \"test\"\n+                        ],\n+                        \"triggerSerially\": false,\n+                        \"triggerWhenAnyDestinationAvailable\": false,\n+                        \"triggerWhenEmpty\": false,\n+                        \"type\": \"org.apache.nifi.processors.standard.GenerateRecord\",\n+                        \"typeDescription\": \"This processor creates FlowFiles with records having random value for the specified fields. GenerateRecord is useful for testing, configuration, and simulation. It uses either user-defined properties to define a record schema or a provided schema and generates the specified number of records using random data for the fields in the schema.\",\n+                        \"version\": \"1.27.0\",\n+                        \"writesAttributes\": [\n+                            {\n+                                \"description\": \"Sets the mime.type attribute to the MIME Type specified by the Record Writer\",\n+                                \"name\": \"mime.type\"\n                             },\n-                            \"smtp-password\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"true\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"SMTP Auth\",\n-                                        \"propertyName\": \"smtp-auth\"\n-                                    }\n-                                ],\n-                                \"description\": \"Password for the SMTP account\",\n-                                \"displayName\": \"SMTP Password\",\n+                            {\n+                                \"description\": \"The number of records in the FlowFile\",\n+                                \"name\": \"record.count\"\n+                            }\n+                        ]\n+                    },\n+                    {\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-standard-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"e0c4461\"\n+                        },\n+                        \"defaultBulletinLevel\": \"WARN\",\n+                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": 1,\n+                            \"TIMER_DRIVEN\": 1\n+                        },\n+                        \"defaultPenaltyDuration\": \"30 sec\",\n+                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": \"* * * * * ?\",\n+                            \"TIMER_DRIVEN\": \"0 sec\"\n+                        },\n+                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n+                        \"defaultYieldDuration\": \"1 sec\",\n+                        \"dynamicProperties\": [\n+                            {\n+                                \"description\": \"Specifies an initial max value for max value columns. Properties should be added in the format `initial.maxvalue.<max_value_column>`. This value is only used the first time the table is accessed (when a Maximum Value Column is specified). In the case of incoming connections, the value is only used the first time for each table specified in the FlowFiles.\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"name\": \"initial.maxvalue.<max_value_column>\",\n+                                \"value\": \"Initial maximum value for the specified column\"\n+                            }\n+                        ],\n+                        \"group\": \"org.apache.nifi\",\n+                        \"inputRequirement\": \"INPUT_ALLOWED\",\n+                        \"primaryNodeOnly\": false,\n+                        \"propertyDescriptors\": {\n+                            \"Columns to Return\": {\n+                                \"description\": \"A comma-separated list of column names to be used in the query. If your database requires special treatment of the names (quoting, e.g.), each name should include such treatment. If no column names are supplied, all columns in the specified table will be returned. NOTE: It is important to use consistent column names for a given table for incremental fetch to work properly.\",\n+                                \"displayName\": \"Columns to Return\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"smtp-password\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Columns to Return\",\n                                 \"required\": false,\n-                                \"sensitive\": true\n-                            },\n-                            \"smtp-port\": {\n-                                \"defaultValue\": \"25\",\n-                                \"description\": \"The Port used for SMTP communications\",\n-                                \"displayName\": \"SMTP Port\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"smtp-port\",\n-                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"smtp-ssl\": {\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"Flag indicating whether SSL should be enabled\",\n-                                \"displayName\": \"SMTP SSL\",\n+                            \"Database Connection Pooling Service\": {\n+                                \"description\": \"The Controller Service that is used to obtain a connection to the database.\",\n+                                \"displayName\": \"Database Connection Pooling Service\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"smtp-ssl\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Database Connection Pooling Service\",\n                                 \"required\": true,\n-                                \"sensitive\": false\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.dbcp.DBCPService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n                             },\n-                            \"smtp-starttls\": {\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"Flag indicating whether STARTTLS should be enabled. If the server does not support STARTTLS, the connection continues without the use of TLS\",\n-                                \"displayName\": \"SMTP STARTTLS\",\n+                            \"Max Wait Time\": {\n+                                \"defaultValue\": \"0 seconds\",\n+                                \"description\": \"The maximum amount of time allowed for a running SQL select query , zero means there is no limit. Max time less than 1 second will be equal to zero.\",\n+                                \"displayName\": \"Max Wait Time\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"smtp-starttls\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Max Wait Time\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"smtp-username\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"true\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"SMTP Auth\",\n-                                        \"propertyName\": \"smtp-auth\"\n-                                    }\n-                                ],\n-                                \"description\": \"Username for the SMTP account\",\n-                                \"displayName\": \"SMTP Username\",\n+                            \"Maximum-value Columns\": {\n+                                \"description\": \"A comma-separated list of column names. The processor will keep track of the maximum value for each column that has been returned since the processor started running. Using multiple columns implies an order to the column list, and each column's values are expected to increase more slowly than the previous columns' values. Thus, using multiple columns implies a hierarchical structure of columns, which is usually used for partitioning tables. This processor can be used to retrieve only those rows that have been added/updated since the last retrieval. Note that some JDBC types such as bit/boolean are not conducive to maintaining maximum value, so columns of these types should not be listed in this property, and will result in error(s) during processing. If no columns are provided, all rows from the table will be considered, which could have a performance impact. NOTE: It is important to use consistent max-value column names for a given table for incremental fetch to work properly.\",\n+                                \"displayName\": \"Maximum-value Columns\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"smtp-username\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Maximum-value Columns\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"smtp-xmailer-header\": {\n-                                \"defaultValue\": \"NiFi\",\n-                                \"description\": \"X-Mailer used in the header of the outgoing email\",\n-                                \"displayName\": \"SMTP X-Mailer Header\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"smtp-xmailer-header\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"subject\": {\n-                                \"defaultValue\": \"Message from NiFi\",\n-                                \"description\": \"The email subject\",\n-                                \"displayName\": \"Subject\",\n+                            \"Table Name\": {\n+                                \"description\": \"The name of the database table to be queried.\",\n+                                \"displayName\": \"Table Name\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"subject\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Table Name\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"to\": {\n-                                \"description\": \"The recipients to include in the To-Line of the email. Comma separated sequence of addresses following RFC822 syntax.\",\n-                                \"displayName\": \"To\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"to\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            }\n-                        },\n-                        \"providedApiImplementations\": [\n-                            {\n-                                \"artifact\": \"nifi-standard-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.record.sink.RecordSinkService\",\n-                                \"version\": \"1.27.0\"\n-                            }\n-                        ],\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"email\",\n-                            \"record\",\n-                            \"send\",\n-                            \"sink\",\n-                            \"smtp\",\n-                            \"write\"\n-                        ],\n-                        \"type\": \"org.apache.nifi.record.sink.EmailRecordSink\",\n-                        \"typeDescription\": \"Provides a RecordSinkService that can be used to send records in email using the specified writer for formatting.\",\n-                        \"version\": \"1.27.0\"\n-                    },\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-record-sink-service-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"e0c4461\"\n-                        },\n-                        \"group\": \"org.apache.nifi\",\n-                        \"propertyDescriptors\": {\n-                            \"logsink-log-level\": {\n+                            \"db-fetch-db-type\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"TRACE\",\n-                                        \"value\": \"TRACE\"\n+                                        \"description\": \"Generates ANSI SQL\",\n+                                        \"displayName\": \"Generic\",\n+                                        \"value\": \"Generic\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"DEBUG\",\n-                                        \"value\": \"DEBUG\"\n+                                        \"description\": \"Generates Oracle compliant SQL\",\n+                                        \"displayName\": \"Oracle\",\n+                                        \"value\": \"Oracle\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"INFO\",\n-                                        \"value\": \"INFO\"\n+                                        \"description\": \"Generates Oracle compliant SQL for version 12 or greater\",\n+                                        \"displayName\": \"Oracle 12+\",\n+                                        \"value\": \"Oracle 12+\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"WARN\",\n-                                        \"value\": \"WARN\"\n+                                        \"description\": \"Generates MS SQL Compatible SQL, for version 2012 or greater\",\n+                                        \"displayName\": \"MS SQL 2012+\",\n+                                        \"value\": \"MS SQL 2012+\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"ERROR\",\n-                                        \"value\": \"ERROR\"\n+                                        \"description\": \"Generates MS SQL Compatible SQL for version 2008\",\n+                                        \"displayName\": \"MS SQL 2008\",\n+                                        \"value\": \"MS SQL 2008\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"FATAL\",\n-                                        \"value\": \"FATAL\"\n+                                        \"description\": \"Generates MySQL compatible SQL\",\n+                                        \"displayName\": \"MySQL\",\n+                                        \"value\": \"MySQL\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"NONE\",\n-                                        \"value\": \"NONE\"\n+                                        \"description\": \"Generates PostgreSQL compatible SQL\",\n+                                        \"displayName\": \"PostgreSQL\",\n+                                        \"value\": \"PostgreSQL\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Generates Phoenix compliant SQL\",\n+                                        \"displayName\": \"Phoenix\",\n+                                        \"value\": \"Phoenix\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"INFO\",\n-                                \"description\": \"The Log Level at which to log records (INFO, DEBUG, e.g.)\",\n-                                \"displayName\": \"Log Level\",\n+                                \"defaultValue\": \"Generic\",\n+                                \"description\": \"The type/flavor of database, used for generating database-specific code. In many cases the Generic type should suffice, but some databases (such as Oracle) require custom SQL clauses. \",\n+                                \"displayName\": \"Database Type\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"logsink-log-level\",\n+                                \"name\": \"db-fetch-db-type\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"record-sink-record-writer\": {\n-                                \"description\": \"Specifies the Controller Service to use for writing out the records.\",\n-                                \"displayName\": \"Record Writer\",\n+                            \"db-fetch-where-clause\": {\n+                                \"description\": \"A custom clause to be added in the WHERE condition when building SQL queries.\",\n+                                \"displayName\": \"Additional WHERE clause\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"record-sink-record-writer\",\n-                                \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            }\n-                        },\n-                        \"providedApiImplementations\": [\n-                            {\n-                                \"artifact\": \"nifi-standard-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.record.sink.RecordSinkService\",\n-                                \"version\": \"1.27.0\"\n-                            }\n-                        ],\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"log\",\n-                            \"record\",\n-                            \"sink\"\n-                        ],\n-                        \"type\": \"org.apache.nifi.record.sink.LoggingRecordSink\",\n-                        \"typeDescription\": \"Provides a RecordSinkService that can be used to log records to the application log (nifi-app.log, e.g.) using the specified writer for formatting.\",\n-                        \"version\": \"1.27.0\"\n-                    },\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-record-sink-service-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"e0c4461\"\n-                        },\n-                        \"group\": \"org.apache.nifi\",\n-                        \"propertyDescriptors\": {\n-                            \"hostname\": {\n-                                \"description\": \"Destination hostname or IP address\",\n-                                \"displayName\": \"Hostname\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"db-fetch-where-clause\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"gen-table-column-for-val-partitioning\": {\n+                                \"description\": \"The name of a column whose values will be used for partitioning. The default behavior is to use row numbers on the result set for partitioning into 'pages' to be fetched from the database, using an offset/limit strategy. However for certain databases, it can be more efficient under the right circumstances to use the column values themselves to define the 'pages'. This property should only be used when the default queries are not performing well, when there is no maximum-value column or a single maximum-value column whose type can be coerced to a long integer (i.e. not date or timestamp), and the column values are evenly distributed and not sparse, for best performance.\",\n+                                \"displayName\": \"Column for Value Partitioning\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"hostname\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"gen-table-column-for-val-partitioning\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"port\": {\n-                                \"description\": \"Destination port number\",\n-                                \"displayName\": \"Port\",\n+                            \"gen-table-custom-orderby-column\": {\n+                                \"description\": \"The name of a column to be used for ordering the results if Max-Value Columns are not provided and partitioning is enabled. This property is ignored if either Max-Value Columns is set or Partition Size = 0. NOTE: If neither Max-Value Columns nor Custom ORDER BY Column is set, then depending on the the database/driver, the processor may report an error and/or the generated SQL may result in missing and/or duplicate rows. This is because without an explicit ordering, fetching each partition is done using an arbitrary ordering.\",\n+                                \"displayName\": \"Custom ORDER BY Column\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"port\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"gen-table-custom-orderby-column\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"record-sink-record-writer\": {\n-                                \"description\": \"Specifies the Controller Service to use for writing out the records.\",\n-                                \"displayName\": \"Record Writer\",\n+                            \"gen-table-fetch-partition-size\": {\n+                                \"defaultValue\": \"10000\",\n+                                \"description\": \"The number of result rows to be fetched by each generated SQL statement. The total number of rows in the table divided by the partition size gives the number of SQL statements (i.e. FlowFiles) generated. A value of zero indicates that a single FlowFile is to be generated whose SQL statement will fetch all rows in the table.\",\n+                                \"displayName\": \"Partition Size\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"record-sink-record-writer\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"gen-table-fetch-partition-size\",\n                                 \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n+                                \"sensitive\": false\n                             },\n-                            \"sender-threads\": {\n-                                \"defaultValue\": \"2\",\n-                                \"description\": \"Number of worker threads allocated for handling socket communication\",\n-                                \"displayName\": \"Sender Threads\",\n+                            \"gen-table-output-flowfile-on-zero-results\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"Depending on the specified properties, an execution of this processor may not result in any SQL statements generated. When this property is true, an empty FlowFile will be generated (having the parent of the incoming FlowFile if present) and transferred to the 'success' relationship. When this property is false, no output FlowFiles will be generated.\",\n+                                \"displayName\": \"Output Empty FlowFile on Zero Results\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"sender-threads\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"gen-table-output-flowfile-on-zero-results\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             }\n                         },\n-                        \"providedApiImplementations\": [\n-                            {\n-                                \"artifact\": \"nifi-standard-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.record.sink.RecordSinkService\",\n-                                \"version\": \"1.27.0\"\n-                            }\n-                        ],\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"UDP\",\n-                            \"event\",\n-                            \"record\",\n-                            \"sink\"\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.processors.standard.ExecuteSQL\",\n+                            \"org.apache.nifi.processors.standard.ListDatabaseTables\",\n+                            \"org.apache.nifi.processors.standard.QueryDatabaseTable\"\n                         ],\n-                        \"type\": \"org.apache.nifi.record.sink.event.UDPEventRecordSink\",\n-                        \"typeDescription\": \"Format and send Records as UDP Datagram Packets to a configurable destination\",\n-                        \"version\": \"1.27.0\"\n-                    },\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-record-sink-service-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"e0c4461\"\n+                        \"sideEffectFree\": false,\n+                        \"stateful\": {\n+                            \"description\": \"After performing a query on the specified table, the maximum values for the specified column(s) will be retained for use in future executions of the query. This allows the Processor to fetch only those records that have max values greater than the retained values. This can be used for incremental fetching, fetching of newly added rows, etc. To clear the maximum values, clear the state of the processor per the State Management documentation\",\n+                            \"scopes\": [\n+                                \"CLUSTER\"\n+                            ]\n                         },\n-                        \"dynamicProperties\": [\n+                        \"supportedRelationships\": [\n                             {\n-                                \"description\": \"If 'record.sink.name' attribute contains the name of the dynamic property, then the RecordSinkService (registered in the value) will be selected.\",\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"name\": \"The name to register the specified RecordSinkService\",\n-                                \"value\": \"The RecordSinkService\"\n-                            }\n-                        ],\n-                        \"group\": \"org.apache.nifi\",\n-                        \"providedApiImplementations\": [\n+                                \"description\": \"Successfully created FlowFile from SQL query result set.\",\n+                                \"name\": \"success\"\n+                            },\n                             {\n-                                \"artifact\": \"nifi-standard-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.record.sink.RecordSinkService\",\n-                                \"version\": \"1.27.0\"\n+                                \"description\": \"This relationship is only used when SQL query execution (using an incoming FlowFile) failed. The incoming FlowFile will be penalized and routed to this relationship. If no incoming connection(s) are specified, this relationship is unused.\",\n+                                \"name\": \"failure\"\n                             }\n                         ],\n+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\"\n+                        ],\n+                        \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": true,\n+                        \"supportsDynamicRelationships\": false,\n+                        \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"lookup\",\n-                            \"record\",\n-                            \"sink\"\n+                            \"database\",\n+                            \"fetch\",\n+                            \"generate\",\n+                            \"jdbc\",\n+                            \"query\",\n+                            \"select\",\n+                            \"sql\"\n                         ],\n-                        \"type\": \"org.apache.nifi.record.sink.lookup.RecordSinkServiceLookup\",\n-                        \"typeDescription\": \"Provides a RecordSinkService that can be used to dynamically select another RecordSinkService. This service requires an attribute named 'record.sink.name' to be passed in when asking for a connection, and will throw an exception if the attribute is missing. The value of 'record.sink.name' will be used to select the RecordSinkService that has been registered with that name. This will allow multiple RecordSinkServices to be defined and registered, and then selected dynamically at runtime by tagging flow files with the appropriate 'record.sink.name' attribute. Note that this controller service is not intended for use in reporting tasks that employ RecordSinkService instances, such as QueryNiFiReportingTask.\",\n-                        \"version\": \"1.27.0\"\n-                    }\n-                ],\n-                \"processors\": [],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"1.27.0\"\n-        },\n-        {\n-            \"artifact\": \"nifi-web-client-provider-service-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [\n+                        \"triggerSerially\": true,\n+                        \"triggerWhenAnyDestinationAvailable\": false,\n+                        \"triggerWhenEmpty\": false,\n+                        \"type\": \"org.apache.nifi.processors.standard.GenerateTableFetch\",\n+                        \"typeDescription\": \"Generates SQL select queries that fetch \\\"pages\\\" of rows from a table. The partition size property, along with the table's row count, determine the size and number of pages and generated FlowFiles. In addition, incremental fetching can be achieved by setting Maximum-Value Columns, which causes the processor to track the columns' maximum values, thus only fetching rows whose columns' values exceed the observed maximums. This processor is intended to be run on the Primary Node only.\\n\\nThis processor can accept incoming connections; the behavior of the processor is different whether incoming connections are provided:\\n  - If no incoming connection(s) are specified, the processor will generate SQL queries on the specified processor schedule. Expression Language is supported for many fields, but no FlowFile attributes are available. However the properties will be evaluated using the Variable Registry.\\n  - If incoming connection(s) are specified and no FlowFile is available to a processor task, no work will be performed.\\n  - If incoming connection(s) are specified and a FlowFile is available to a processor task, the FlowFile's attributes may be used in Expression Language for such fields as Table Name and others. However, the Max-Value Columns and Columns to Return fields must be empty or refer to columns that are available in each specified table.\",\n+                        \"version\": \"1.27.0\",\n+                        \"writesAttributes\": [\n+                            {\n+                                \"description\": \"If the processor has incoming connections, and processing an incoming FlowFile causes a SQL Exception, the FlowFile is routed to failure and this attribute is set to the exception message.\",\n+                                \"name\": \"generatetablefetch.sql.error\"\n+                            },\n+                            {\n+                                \"description\": \"The name of the database table to be queried.\",\n+                                \"name\": \"generatetablefetch.tableName\"\n+                            },\n+                            {\n+                                \"description\": \"The comma-separated list of column names used in the query.\",\n+                                \"name\": \"generatetablefetch.columnNames\"\n+                            },\n+                            {\n+                                \"description\": \"Where clause used in the query to get the expected rows.\",\n+                                \"name\": \"generatetablefetch.whereClause\"\n+                            },\n+                            {\n+                                \"description\": \"The comma-separated list of column names used to keep track of data that has been returned since the processor started running.\",\n+                                \"name\": \"generatetablefetch.maxColumnNames\"\n+                            },\n+                            {\n+                                \"description\": \"The number of result rows to be fetched by the SQL statement.\",\n+                                \"name\": \"generatetablefetch.limit\"\n+                            },\n+                            {\n+                                \"description\": \"Offset to be used to retrieve the corresponding partition.\",\n+                                \"name\": \"generatetablefetch.offset\"\n+                            },\n+                            {\n+                                \"description\": \"All FlowFiles generated from the same query result set will have the same value for the fragment.identifier attribute. This can then be used to correlate the results.\",\n+                                \"name\": \"fragment.identifier\"\n+                            },\n+                            {\n+                                \"description\": \"This is the total number of  FlowFiles produced by a single ResultSet. This can be used in conjunction with the fragment.identifier attribute in order to know how many FlowFiles belonged to the same incoming ResultSet.\",\n+                                \"name\": \"fragment.count\"\n+                            },\n+                            {\n+                                \"description\": \"This is the position of this FlowFile in the list of outgoing FlowFiles that were all generated from the same execution. This can be used in conjunction with the fragment.identifier attribute to know which FlowFiles originated from the same execution and in what order  FlowFiles were produced\",\n+                                \"name\": \"fragment.index\"\n+                            }\n+                        ]\n+                    },\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-web-client-provider-service-nar\",\n+                        \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n+                        \"defaultBulletinLevel\": \"WARN\",\n+                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": 1,\n+                            \"TIMER_DRIVEN\": 1\n+                        },\n+                        \"defaultPenaltyDuration\": \"30 sec\",\n+                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": \"* * * * * ?\",\n+                            \"TIMER_DRIVEN\": \"0 sec\"\n+                        },\n+                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n+                        \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n+                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n+                        \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"connect-timeout\": {\n-                                \"defaultValue\": \"10 secs\",\n-                                \"description\": \"Maximum amount of time to wait before failing during initial socket connection\",\n-                                \"displayName\": \"Connect Timeout\",\n+                            \"Connection Mode\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Active\",\n+                                        \"value\": \"Active\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Passive\",\n+                                        \"value\": \"Passive\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"Passive\",\n+                                \"description\": \"The FTP Connection Mode\",\n+                                \"displayName\": \"Connection Mode\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"connect-timeout\",\n+                                \"name\": \"Connection Mode\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Connection Timeout\": {\n+                                \"defaultValue\": \"30 sec\",\n+                                \"description\": \"Amount of time to wait before timing out while creating a connection\",\n+                                \"displayName\": \"Connection Timeout\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Connection Timeout\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"proxy-configuration-service\": {\n-                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests. If set, it supersedes proxy settings configured per component.\",\n-                                \"displayName\": \"Proxy Configuration Service\",\n+                            \"Data Timeout\": {\n+                                \"defaultValue\": \"30 sec\",\n+                                \"description\": \"When transferring a file between the local and remote system, this value specifies how long is allowed to elapse without any data being transferred between systems\",\n+                                \"displayName\": \"Data Timeout\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"proxy-configuration-service\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.proxy.ProxyConfigurationService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n+                                \"name\": \"Data Timeout\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n                             },\n-                            \"read-timeout\": {\n-                                \"defaultValue\": \"10 secs\",\n-                                \"description\": \"Maximum amount of time to wait before failing while reading socket responses\",\n-                                \"displayName\": \"Read Timeout\",\n+                            \"Delete Original\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"true\",\n+                                \"description\": \"Determines whether or not the file is deleted from the remote system after it has been successfully transferred\",\n+                                \"displayName\": \"Delete Original\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"read-timeout\",\n+                                \"name\": \"Delete Original\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"redirect-handling-strategy\": {\n+                            \"File Filter Regex\": {\n+                                \"description\": \"Provides a Java Regular Expression for filtering Filenames; if a filter is supplied, only files whose names match that Regular Expression will be fetched\",\n+                                \"displayName\": \"File Filter Regex\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"File Filter Regex\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Hostname\": {\n+                                \"description\": \"The fully qualified hostname or IP address of the remote system\",\n+                                \"displayName\": \"Hostname\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Hostname\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Http Proxy Password\": {\n+                                \"description\": \"Http Proxy Password\",\n+                                \"displayName\": \"Http Proxy Password\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Http Proxy Password\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n+                            },\n+                            \"Http Proxy Username\": {\n+                                \"description\": \"Http Proxy Username\",\n+                                \"displayName\": \"Http Proxy Username\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Http Proxy Username\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Ignore Dotted Files\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"FOLLOWED\",\n-                                        \"value\": \"FOLLOWED\"\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"IGNORED\",\n-                                        \"value\": \"IGNORED\"\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"FOLLOWED\",\n-                                \"description\": \"Handling strategy for responding to HTTP 301 or 302 redirects received with a Location header\",\n-                                \"displayName\": \"Redirect Handling Strategy\",\n+                                \"defaultValue\": \"true\",\n+                                \"description\": \"If true, files whose names begin with a dot (\\\".\\\") will be ignored\",\n+                                \"displayName\": \"Ignore Dotted Files\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"redirect-handling-strategy\",\n+                                \"name\": \"Ignore Dotted Files\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"ssl-context-service\": {\n-                                \"description\": \"SSL Context Service overrides system default TLS settings for HTTPS communication\",\n-                                \"displayName\": \"SSL Context Service\",\n+                            \"Internal Buffer Size\": {\n+                                \"defaultValue\": \"16KB\",\n+                                \"description\": \"Set the internal buffer size for buffered data streams\",\n+                                \"displayName\": \"Internal Buffer Size\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"ssl-context-service\",\n+                                \"name\": \"Internal Buffer Size\",\n                                 \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n+                                \"sensitive\": false\n                             },\n-                            \"write-timeout\": {\n-                                \"defaultValue\": \"10 secs\",\n-                                \"description\": \"Maximum amount of time to wait before failing while writing socket requests\",\n-                                \"displayName\": \"Write Timeout\",\n+                            \"Max Selects\": {\n+                                \"defaultValue\": \"100\",\n+                                \"description\": \"The maximum number of files to pull in a single connection\",\n+                                \"displayName\": \"Max Selects\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"write-timeout\",\n+                                \"name\": \"Max Selects\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n-                            }\n-                        },\n-                        \"providedApiImplementations\": [\n-                            {\n-                                \"artifact\": \"nifi-standard-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.web.client.provider.api.WebClientServiceProvider\",\n-                                \"version\": \"1.27.0\"\n-                            }\n-                        ],\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"Client\",\n-                            \"HTTP\",\n-                            \"Web\"\n-                        ],\n-                        \"type\": \"org.apache.nifi.web.client.provider.service.StandardWebClientServiceProvider\",\n-                        \"typeDescription\": \"Web Client Service Provider with support for configuring standard HTTP connection properties\",\n-                        \"version\": \"1.27.0\"\n-                    }\n-                ],\n-                \"processors\": [],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"1.27.0\"\n-        },\n-        {\n-            \"artifact\": \"nifi-stateless-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [],\n-                \"processors\": [],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"1.27.0\"\n-        },\n-        {\n-            \"artifact\": \"nifi-protobuf-services-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [\n-                    {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-protobuf-services-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"e0c4461\"\n-                        },\n-                        \"group\": \"org.apache.nifi\",\n-                        \"propertyDescriptors\": {\n-                            \"Message Type\": {\n-                                \"description\": \"Fully qualified name of the Protocol Buffers message type including its package (eg. mypackage.MyMessage). The .proto files configured in 'Proto Directory' must contain the definition of this message type.\",\n-                                \"displayName\": \"Message Type\",\n+                            },\n+                            \"Password\": {\n+                                \"description\": \"Password for the user account\",\n+                                \"displayName\": \"Password\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Password\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n+                            },\n+                            \"Path Filter Regex\": {\n+                                \"description\": \"When Search Recursively is true, then only subdirectories whose path matches the given Regular Expression will be scanned\",\n+                                \"displayName\": \"Path Filter Regex\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Path Filter Regex\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Polling Interval\": {\n+                                \"defaultValue\": \"60 sec\",\n+                                \"description\": \"Determines how long to wait between fetching the listing for new files\",\n+                                \"displayName\": \"Polling Interval\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Polling Interval\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Port\": {\n+                                \"defaultValue\": \"21\",\n+                                \"description\": \"The port that the remote system is listening on for file transfers\",\n+                                \"displayName\": \"Port\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Port\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Proxy Host\": {\n+                                \"description\": \"The fully qualified hostname or IP address of the proxy server\",\n+                                \"displayName\": \"Proxy Host\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Message Type\",\n-                                \"required\": true,\n+                                \"name\": \"Proxy Host\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Proto Directory\": {\n-                                \"description\": \"Directory containing Protocol Buffers message definition (.proto) file(s).\",\n-                                \"displayName\": \"Proto Directory\",\n+                            \"Proxy Port\": {\n+                                \"description\": \"The port of the proxy server\",\n+                                \"displayName\": \"Proxy Port\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Proto Directory\",\n-                                \"required\": true,\n+                                \"name\": \"Proxy Port\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"schema-access-strategy\": {\n+                            \"Proxy Type\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"The name of the Schema to use is specified by the 'Schema Name' Property. The value of this property is used to lookup the Schema in the configured Schema Registry service.\",\n-                                        \"displayName\": \"Use 'Schema Name' Property\",\n-                                        \"value\": \"schema-name\"\n-                                    },\n-                                    {\n-                                        \"description\": \"The text of the Schema itself is specified by the 'Schema Text' Property. The value of this property must be a valid Avro Schema. If Expression Language is used, the value of the 'Schema Text' property must be valid after substituting the expressions.\",\n-                                        \"displayName\": \"Use 'Schema Text' Property\",\n-                                        \"value\": \"schema-text-property\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"DIRECT\",\n+                                        \"value\": \"DIRECT\"\n                                     },\n                                     {\n-                                        \"description\": \"The FlowFile contains 3 Attributes that will be used to lookup a Schema from the configured Schema Registry: 'schema.identifier', 'schema.version', and 'schema.protocol.version'\",\n-                                        \"displayName\": \"HWX Schema Reference Attributes\",\n-                                        \"value\": \"hwx-schema-ref-attributes\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"HTTP\",\n+                                        \"value\": \"HTTP\"\n                                     },\n                                     {\n-                                        \"description\": \"The content of the FlowFile contains a reference to a schema in the Schema Registry service. The reference is encoded as a single byte indicating the 'protocol version', followed by 8 bytes indicating the schema identifier, and finally 4 bytes indicating the schema version, as per the Hortonworks Schema Registry serializers and deserializers, found at https://github.com/hortonworks/registry\",\n-                                        \"displayName\": \"HWX Content-Encoded Schema Reference\",\n-                                        \"value\": \"hwx-content-encoded-schema\"\n-                                    },\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"SOCKS\",\n+                                        \"value\": \"SOCKS\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"DIRECT\",\n+                                \"description\": \"Proxy type used for file transfers\",\n+                                \"displayName\": \"Proxy Type\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Proxy Type\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Remote Path\": {\n+                                \"description\": \"The path on the remote system from which to pull or push files\",\n+                                \"displayName\": \"Remote Path\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Remote Path\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Remote Poll Batch Size\": {\n+                                \"defaultValue\": \"5000\",\n+                                \"description\": \"The value specifies how many file paths to find in a given directory on the remote system when doing a file listing. This value in general should not need to be modified but when polling against a remote system with a tremendous number of files this value can be critical.  Setting this value too high can result very poor performance and setting it too low can cause the flow to be slower than normal.\",\n+                                \"displayName\": \"Remote Poll Batch Size\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Remote Poll Batch Size\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Search Recursively\": {\n+                                \"allowableValues\": [\n                                     {\n-                                        \"description\": \"The content of the FlowFile contains a reference to a schema in the Schema Registry service. The reference is encoded as a single 'Magic Byte' followed by 4 bytes representing the identifier of the schema, as outlined at http://docs.confluent.io/current/schema-registry/docs/serializer-formatter.html. This is based on version 3.2.x of the Confluent Schema Registry.\",\n-                                        \"displayName\": \"Confluent Content-Encoded Schema Reference\",\n-                                        \"value\": \"confluent-encoded\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n-                                        \"description\": \"The record schema is generated from the provided proto file\",\n-                                        \"displayName\": \"Generate from Proto file\",\n-                                        \"value\": \"generate-from-proto-file\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"generate-from-proto-file\",\n-                                \"description\": \"Specifies how to obtain the schema that is to be used for interpreting the data.\",\n-                                \"displayName\": \"Schema Access Strategy\",\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"If true, will pull files from arbitrarily nested subdirectories; otherwise, will not traverse subdirectories\",\n+                                \"displayName\": \"Search Recursively\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"schema-access-strategy\",\n+                                \"name\": \"Search Recursively\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"schema-branch\": {\n-                                \"dependencies\": [\n+                            \"Transfer Mode\": {\n+                                \"allowableValues\": [\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"schema-name\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n-                                        \"propertyName\": \"schema-access-strategy\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Binary\",\n+                                        \"value\": \"Binary\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"ASCII\",\n+                                        \"value\": \"ASCII\"\n                                     }\n                                 ],\n-                                \"description\": \"Specifies the name of the branch to use when looking up the schema in the Schema Registry property. If the chosen Schema Registry does not support branching, this value will be ignored.\",\n-                                \"displayName\": \"Schema Branch\",\n+                                \"defaultValue\": \"Binary\",\n+                                \"description\": \"The FTP Transfer Mode\",\n+                                \"displayName\": \"Transfer Mode\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"schema-branch\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Transfer Mode\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"schema-name\": {\n-                                \"defaultValue\": \"${schema.name}\",\n-                                \"dependencies\": [\n+                            \"Use Natural Ordering\": {\n+                                \"allowableValues\": [\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"schema-name\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n-                                        \"propertyName\": \"schema-access-strategy\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"description\": \"Specifies the name of the schema to lookup in the Schema Registry property\",\n-                                \"displayName\": \"Schema Name\",\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"If true, will pull files in the order in which they are naturally listed; otherwise, the order in which the files will be pulled is not defined\",\n+                                \"displayName\": \"Use Natural Ordering\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Use Natural Ordering\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Username\": {\n+                                \"description\": \"Username\",\n+                                \"displayName\": \"Username\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"schema-name\",\n-                                \"required\": false,\n+                                \"name\": \"Username\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"schema-registry\": {\n-                                \"dependencies\": [\n+                            \"follow-symlink\": {\n+                                \"allowableValues\": [\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"confluent-encoded\",\n-                                            \"schema-name\",\n-                                            \"hwx-schema-ref-attributes\",\n-                                            \"hwx-content-encoded-schema\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n-                                        \"propertyName\": \"schema-access-strategy\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"description\": \"Specifies the Controller Service to use for the Schema Registry\",\n-                                \"displayName\": \"Schema Registry\",\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"If true, will pull even symbolic files and also nested symbolic subdirectories; otherwise, will not read symbolic files and will not traverse symbolic link subdirectories\",\n+                                \"displayName\": \"Follow symlink\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"schema-registry\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.schemaregistry.services.SchemaRegistry\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n+                                \"name\": \"follow-symlink\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n                             },\n-                            \"schema-text\": {\n-                                \"defaultValue\": \"${avro.schema}\",\n-                                \"dependencies\": [\n+                            \"ftp-use-utf8\": {\n+                                \"allowableValues\": [\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"schema-text-property\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n-                                        \"propertyName\": \"schema-access-strategy\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"description\": \"The text of an Avro-formatted Schema\",\n-                                \"displayName\": \"Schema Text\",\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"Tells the client to use UTF-8 encoding when processing files and filenames. If set to true, the server must also support UTF-8 encoding.\",\n+                                \"displayName\": \"Use UTF-8 Encoding\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"schema-text\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"ftp-use-utf8\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"schema-version\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"schema-name\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n-                                        \"propertyName\": \"schema-access-strategy\"\n-                                    }\n-                                ],\n-                                \"description\": \"Specifies the version of the schema to lookup in the Schema Registry. If not specified then the latest version of the schema will be retrieved.\",\n-                                \"displayName\": \"Schema Version\",\n+                            \"proxy-configuration-service\": {\n+                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests. If set, it supersedes proxy settings configured per component. Supported proxies: HTTP + AuthN, SOCKS + AuthN\",\n+                                \"displayName\": \"Proxy Configuration Service\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"schema-version\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"proxy-configuration-service\",\n                                 \"required\": false,\n-                                \"sensitive\": false\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.proxy.ProxyConfigurationService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n                             }\n                         },\n-                        \"providedApiImplementations\": [\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.processors.standard.PutFTP\"\n+                        ],\n+                        \"sideEffectFree\": false,\n+                        \"supportedRelationships\": [\n                             {\n-                                \"artifact\": \"nifi-standard-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n-                                \"version\": \"1.27.0\"\n+                                \"description\": \"All FlowFiles that are received are routed to success\",\n+                                \"name\": \"success\"\n                             }\n                         ],\n+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\"\n+                        ],\n+                        \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicRelationships\": false,\n+                        \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"parser\",\n-                            \"protobuf\",\n-                            \"reader\",\n-                            \"record\"\n+                            \"FTP\",\n+                            \"fetch\",\n+                            \"files\",\n+                            \"get\",\n+                            \"ingest\",\n+                            \"input\",\n+                            \"remote\",\n+                            \"retrieve\",\n+                            \"source\"\n                         ],\n-                        \"type\": \"org.apache.nifi.services.protobuf.ProtobufReader\",\n-                        \"typeDescription\": \"Parses a Protocol Buffers message from binary format.\",\n-                        \"version\": \"1.27.0\"\n-                    }\n-                ],\n-                \"processors\": [],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"1.27.0\"\n-        },\n-        {\n-            \"artifact\": \"nifi-snmp-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [],\n-                \"processors\": [\n+                        \"triggerSerially\": false,\n+                        \"triggerWhenAnyDestinationAvailable\": false,\n+                        \"triggerWhenEmpty\": false,\n+                        \"type\": \"org.apache.nifi.processors.standard.GetFTP\",\n+                        \"typeDescription\": \"Fetches files from an FTP Server and creates FlowFiles from them\",\n+                        \"version\": \"1.27.0\",\n+                        \"writesAttributes\": [\n+                            {\n+                                \"description\": \"The filename is set to the name of the file on the remote server\",\n+                                \"name\": \"filename\"\n+                            },\n+                            {\n+                                \"description\": \"The path is set to the path of the file's directory on the remote server. For example, if the <Remote Path> property is set to /tmp, files picked up from /tmp will have the path attribute set to /tmp. If the <Search Recursively> property is set to true and a file is picked up from /tmp/abc/1/2/3, then the path attribute will be set to /tmp/abc/1/2/3\",\n+                                \"name\": \"path\"\n+                            },\n+                            {\n+                                \"description\": \"The date and time that the source file was last modified\",\n+                                \"name\": \"file.lastModifiedTime\"\n+                            },\n+                            {\n+                                \"description\": \"The date and time that the file was last accessed. May not work on all file systems\",\n+                                \"name\": \"file.lastAccessTime\"\n+                            },\n+                            {\n+                                \"description\": \"The numeric owner id of the source file\",\n+                                \"name\": \"file.owner\"\n+                            },\n+                            {\n+                                \"description\": \"The numeric group id of the source file\",\n+                                \"name\": \"file.group\"\n+                            },\n+                            {\n+                                \"description\": \"The read/write/execute permissions of the source file\",\n+                                \"name\": \"file.permissions\"\n+                            },\n+                            {\n+                                \"description\": \"The full/absolute path from where a file was picked up. The current 'path' attribute is still populated, but may be a relative path\",\n+                                \"name\": \"absolute.path\"\n+                            }\n+                        ]\n+                    },\n                     {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-snmp-nar\",\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -86547,422 +85560,272 @@\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n+                        \"explicitRestrictions\": [\n+                            {\n+                                \"explanation\": \"Provides operator the ability to read from any file that NiFi has access to.\",\n+                                \"requiredPermission\": \"read filesystem\"\n+                            },\n+                            {\n+                                \"explanation\": \"Provides operator the ability to delete any file that NiFi has access to.\",\n+                                \"requiredPermission\": \"write filesystem\"\n+                            }\n+                        ],\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_ALLOWED\",\n+                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"snmp-authentication-passphrase\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"authPriv\",\n-                                            \"authNoPriv\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"SNMP Security Level\",\n-                                        \"propertyName\": \"snmp-security-level\"\n-                                    }\n-                                ],\n-                                \"description\": \"Passphrase used for SNMP authentication protocol.\",\n-                                \"displayName\": \"SNMP Authentication Passphrase\",\n+                            \"Batch Size\": {\n+                                \"defaultValue\": \"10\",\n+                                \"description\": \"The maximum number of files to pull in each iteration\",\n+                                \"displayName\": \"Batch Size\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"snmp-authentication-passphrase\",\n+                                \"name\": \"Batch Size\",\n                                 \"required\": true,\n-                                \"sensitive\": true\n+                                \"sensitive\": false\n                             },\n-                            \"snmp-authentication-protocol\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"Provides authentication based on the HMAC-MD5 algorithm.\",\n-                                        \"displayName\": \"MD5\",\n-                                        \"value\": \"MD5\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Provides authentication based on the HMAC-SHA algorithm.\",\n-                                        \"displayName\": \"SHA\",\n-                                        \"value\": \"SHA\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Provides authentication based on the HMAC-SHA-2 algorithm.\",\n-                                        \"displayName\": \"SHA224\",\n-                                        \"value\": \"HMAC128SHA224\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Provides authentication based on the HMAC-SHA-2 algorithm.\",\n-                                        \"displayName\": \"SHA256\",\n-                                        \"value\": \"HMAC192SHA256\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Provides authentication based on the HMAC-SHA-2 algorithm.\",\n-                                        \"displayName\": \"SHA384\",\n-                                        \"value\": \"HMAC256SHA384\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Provides authentication based on the HMAC-SHA-2 algorithm.\",\n-                                        \"displayName\": \"SHA512\",\n-                                        \"value\": \"HMAC384SHA512\"\n-                                    }\n-                                ],\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"authPriv\",\n-                                            \"authNoPriv\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"SNMP Security Level\",\n-                                        \"propertyName\": \"snmp-security-level\"\n-                                    }\n-                                ],\n-                                \"description\": \"Hash based authentication protocol for secure authentication.\",\n-                                \"displayName\": \"SNMP Authentication Protocol\",\n+                            \"File Filter\": {\n+                                \"defaultValue\": \"[^\\\\.].*\",\n+                                \"description\": \"Only files whose names match the given regular expression will be picked up\",\n+                                \"displayName\": \"File Filter\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"snmp-authentication-protocol\",\n+                                \"name\": \"File Filter\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"snmp-community\": {\n-                                \"defaultValue\": \"public\",\n-                                \"dependencies\": [\n+                            \"Ignore Hidden Files\": {\n+                                \"allowableValues\": [\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"SNMPv1\",\n-                                            \"SNMPv2c\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"SNMP Version\",\n-                                        \"propertyName\": \"snmp-version\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"description\": \"SNMPv1 and SNMPv2 use communities to establish trust between managers and agents. Most agents support three community names, one each for read-only, read-write and trap. These three community strings control different types of activities. The read-only community applies to get requests. The read-write community string applies to set requests. The trap community string applies to receipt of traps.\",\n-                                \"displayName\": \"SNMP Community\",\n+                                \"defaultValue\": \"true\",\n+                                \"description\": \"Indicates whether or not hidden files should be ignored\",\n+                                \"displayName\": \"Ignore Hidden Files\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"snmp-community\",\n-                                \"required\": true,\n-                                \"sensitive\": true\n-                            },\n-                            \"snmp-hostname\": {\n-                                \"defaultValue\": \"localhost\",\n-                                \"description\": \"Hostname or network address of the SNMP Agent.\",\n-                                \"displayName\": \"SNMP Agent Hostname\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"snmp-hostname\",\n+                                \"name\": \"Ignore Hidden Files\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"snmp-oid\": {\n-                                \"description\": \"Each OID (object identifier) identifies a variable that can be read or set via SNMP. This value is not taken into account for an input flowfile and will be omitted. Can be set to emptystring when the OIDs are provided through flowfile.\",\n-                                \"displayName\": \"OID\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"snmp-oid\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"snmp-port\": {\n-                                \"defaultValue\": \"161\",\n-                                \"description\": \"Port of the SNMP Agent.\",\n-                                \"displayName\": \"SNMP Agent Port\",\n+                            \"Input Directory\": {\n+                                \"description\": \"The input directory from which to pull files\",\n+                                \"displayName\": \"Input Directory\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"snmp-port\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Input Directory\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"snmp-private-protocol\": {\n+                            \"Keep Source File\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Symmetric-key algorithm for the encryption of digital data. DES has been considered insecurebecause of the feasilibity of brute-force attacks. We recommend using the AES encryption protocol.\",\n-                                        \"displayName\": \"DES\",\n-                                        \"value\": \"DES\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Symmetric-key block cipher, which applies the DES cipher algorithm three times to each data block. 3DES has been considered insecure has been deprecated by NIST in 2017. We recommend using the AES encryption protocol.\",\n-                                        \"displayName\": \"3DES\",\n-                                        \"value\": \"3DES\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AES is a symmetric algorithm which uses the same 128, 192, or 256 bit key for both encryption and decryption (the security of an AES system increases exponentially with key length).\",\n-                                        \"displayName\": \"AES128\",\n-                                        \"value\": \"AES128\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AES is a symmetric algorithm which uses the same 128, 192, or 256 bit key for both encryption and decryption (the security of an AES system increases exponentially with key length).\",\n-                                        \"displayName\": \"AES192\",\n-                                        \"value\": \"AES192\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n-                                        \"description\": \"AES is a symmetric algorithm which uses the same 128, 192, or 256 bit key for both encryption and decryption (the security of an AES system increases exponentially with key length).\",\n-                                        \"displayName\": \"AES256\",\n-                                        \"value\": \"AES256\"\n-                                    }\n-                                ],\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"authPriv\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"SNMP Security Level\",\n-                                        \"propertyName\": \"snmp-security-level\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"description\": \"Privacy allows for encryption of SNMP v3 messages to ensure confidentiality of data.\",\n-                                \"displayName\": \"SNMP Privacy Protocol\",\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"If true, the file is not deleted after it has been copied to the Content Repository; this causes the file to be picked up continually and is useful for testing purposes.  If not keeping original NiFi will need write permissions on the directory it is pulling from otherwise it will ignore the file.\",\n+                                \"displayName\": \"Keep Source File\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"snmp-private-protocol\",\n+                                \"name\": \"Keep Source File\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"snmp-private-protocol-passphrase\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"authPriv\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"SNMP Security Level\",\n-                                        \"propertyName\": \"snmp-security-level\"\n-                                    }\n-                                ],\n-                                \"description\": \"Passphrase used for SNMP privacy protocol.\",\n-                                \"displayName\": \"SNMP Privacy Passphrase\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"snmp-private-protocol-passphrase\",\n-                                \"required\": true,\n-                                \"sensitive\": true\n-                            },\n-                            \"snmp-retries\": {\n-                                \"defaultValue\": \"0\",\n-                                \"description\": \"Set the number of retries when requesting the SNMP Agent.\",\n-                                \"displayName\": \"Number of Retries\",\n+                            \"Maximum File Age\": {\n+                                \"description\": \"The maximum age that a file must be in order to be pulled; any file older than this amount of time (according to last modification date) will be ignored\",\n+                                \"displayName\": \"Maximum File Age\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"snmp-retries\",\n+                                \"name\": \"Maximum File Age\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"snmp-security-level\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"Communication without authentication and privacy.\",\n-                                        \"displayName\": \"noAuthNoPriv\",\n-                                        \"value\": \"noAuthNoPriv\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Communication with authentication and without privacy.\",\n-                                        \"displayName\": \"authNoPriv\",\n-                                        \"value\": \"authNoPriv\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Communication with authentication and privacy.\",\n-                                        \"displayName\": \"authPriv\",\n-                                        \"value\": \"authPriv\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"noAuthNoPriv\",\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"SNMPv3\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"SNMP Version\",\n-                                        \"propertyName\": \"snmp-version\"\n-                                    }\n-                                ],\n-                                \"description\": \"SNMP version 3 provides extra security with User Based Security Model (USM). The three levels of security is 1. Communication without authentication and encryption (NoAuthNoPriv). 2. Communication with authentication and without encryption (AuthNoPriv). 3. Communication with authentication and encryption (AuthPriv).\",\n-                                \"displayName\": \"SNMP Security Level\",\n+                            \"Maximum File Size\": {\n+                                \"description\": \"The maximum size that a file can be in order to be pulled\",\n+                                \"displayName\": \"Maximum File Size\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"snmp-security-level\",\n-                                \"required\": true,\n+                                \"name\": \"Maximum File Size\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"snmp-security-name\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"SNMPv3\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"SNMP Version\",\n-                                        \"propertyName\": \"snmp-version\"\n-                                    }\n-                                ],\n-                                \"description\": \"User name used for SNMP v3 Authentication.\",\n-                                \"displayName\": \"SNMP Security Name\",\n+                            \"Minimum File Age\": {\n+                                \"defaultValue\": \"0 sec\",\n+                                \"description\": \"The minimum age that a file must be in order to be pulled; any file younger than this amount of time (according to last modification date) will be ignored\",\n+                                \"displayName\": \"Minimum File Age\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"snmp-security-name\",\n+                                \"name\": \"Minimum File Age\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"snmp-strategy\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"A manager-to-agent request to retrieve the value of a variable. A response with the current value returned.\",\n-                                        \"displayName\": \"GET\",\n-                                        \"value\": \"GET\"\n-                                    },\n-                                    {\n-                                        \"description\": \"A manager-to-agent request to retrieve the value of multiple variables. Snmp WALK also traverses all subnodes under the specified OID.\",\n-                                        \"displayName\": \"WALK\",\n-                                        \"value\": \"WALK\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"GET\",\n-                                \"description\": \"SNMP strategy to use (SNMP Get or SNMP Walk)\",\n-                                \"displayName\": \"SNMP Strategy\",\n+                            \"Minimum File Size\": {\n+                                \"defaultValue\": \"0 B\",\n+                                \"description\": \"The minimum size that a file must be in order to be pulled\",\n+                                \"displayName\": \"Minimum File Size\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"snmp-strategy\",\n+                                \"name\": \"Minimum File Size\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"snmp-textual-oid\": {\n-                                \"description\": \"The textual form of the numeric OID to request. This property is user defined, not processed and appended to the outgoing flowfile.\",\n-                                \"displayName\": \"Textual OID\",\n+                            \"Path Filter\": {\n+                                \"description\": \"When Recurse Subdirectories is true, then only subdirectories whose path matches the given regular expression will be scanned\",\n+                                \"displayName\": \"Path Filter\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"snmp-textual-oid\",\n+                                \"name\": \"Path Filter\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"snmp-timeout\": {\n-                                \"defaultValue\": \"5000\",\n-                                \"description\": \"Set the timeout in ms when requesting the SNMP Agent.\",\n-                                \"displayName\": \"Timeout (ms)\",\n+                            \"Polling Interval\": {\n+                                \"defaultValue\": \"0 sec\",\n+                                \"description\": \"Indicates how long to wait before performing a directory listing\",\n+                                \"displayName\": \"Polling Interval\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"snmp-timeout\",\n-                                \"required\": false,\n+                                \"name\": \"Polling Interval\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"snmp-version\": {\n+                            \"Recurse Subdirectories\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"SNMP version 1\",\n-                                        \"displayName\": \"v1\",\n-                                        \"value\": \"SNMPv1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"SNMP version 2c\",\n-                                        \"displayName\": \"v2c\",\n-                                        \"value\": \"SNMPv2c\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n-                                        \"description\": \"SNMP version 3 with improved security\",\n-                                        \"displayName\": \"v3\",\n-                                        \"value\": \"SNMPv3\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"SNMPv1\",\n-                                \"description\": \"Three significant versions of SNMP have been developed and deployed. SNMPv1 is the original version of the protocol. More recent versions, SNMPv2c and SNMPv3, feature improvements in performance, flexibility and security.\",\n-                                \"displayName\": \"SNMP Version\",\n+                                \"defaultValue\": \"true\",\n+                                \"description\": \"Indicates whether or not to pull files from subdirectories\",\n+                                \"displayName\": \"Recurse Subdirectories\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"snmp-version\",\n+                                \"name\": \"Recurse Subdirectories\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             }\n                         },\n+                        \"restricted\": true,\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.processors.standard.FetchFile\",\n+                            \"org.apache.nifi.processors.standard.PutFile\"\n+                        ],\n                         \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"All FlowFiles that are received from the SNMP agent are routed to this relationship.\",\n+                                \"description\": \"All files are routed to success\",\n                                 \"name\": \"success\"\n-                            },\n-                            {\n-                                \"description\": \"All FlowFiles that cannot received from the SNMP agent are routed to this relationship.\",\n-                                \"name\": \"failure\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n                         \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n+                            \"files\",\n+                            \"filesystem\",\n                             \"get\",\n-                            \"oid\",\n-                            \"snmp\",\n-                            \"walk\"\n+                            \"ingest\",\n+                            \"ingress\",\n+                            \"input\",\n+                            \"local\",\n+                            \"source\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.snmp.processors.GetSNMP\",\n-                        \"typeDescription\": \"Retrieves information from SNMP Agent with SNMP Get request and outputs a FlowFile with information in attributes and without any content\",\n+                        \"triggerWhenEmpty\": true,\n+                        \"type\": \"org.apache.nifi.processors.standard.GetFile\",\n+                        \"typeDescription\": \"Creates FlowFiles from files in a directory.  NiFi will ignore files it doesn't have at least read permissions for.\",\n                         \"version\": \"1.27.0\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"Response variable binding: OID (e.g. 1.3.6.1.4.1.343) and its value.\",\n-                                \"name\": \"snmp$<OID>\"\n+                                \"description\": \"The filename is set to the name of the file on disk\",\n+                                \"name\": \"filename\"\n                             },\n                             {\n-                                \"description\": \"Denotes the variable binding in which the error occured.\",\n-                                \"name\": \"snmp$errorIndex\"\n+                                \"description\": \"The path is set to the relative path of the file's directory on disk. For example, if the <Input Directory> property is set to /tmp, files picked up from /tmp will have the path attribute set to ./. If the <Recurse Subdirectories> property is set to true and a file is picked up from /tmp/abc/1/2/3, then the path attribute will be set to abc/1/2/3\",\n+                                \"name\": \"path\"\n                             },\n                             {\n-                                \"description\": \"The snmp4j error status of the PDU.\",\n-                                \"name\": \"snmp$errorStatus\"\n+                                \"description\": \"The date and time that the file was created. May not work on all file systems\",\n+                                \"name\": \"file.creationTime\"\n                             },\n                             {\n-                                \"description\": \"The description of error status.\",\n-                                \"name\": \"snmp$errorStatusText\"\n+                                \"description\": \"The date and time that the file was last modified. May not work on all file systems\",\n+                                \"name\": \"file.lastModifiedTime\"\n                             },\n                             {\n-                                \"description\": \"The number of non repeater variable bindings in a GETBULK PDU (currently not supported).\",\n-                                \"name\": \"snmp$nonRepeaters\"\n+                                \"description\": \"The date and time that the file was last accessed. May not work on all file systems\",\n+                                \"name\": \"file.lastAccessTime\"\n                             },\n                             {\n-                                \"description\": \"The request ID associated with the PDU.\",\n-                                \"name\": \"snmp$requestID\"\n+                                \"description\": \"The owner of the file. May not work on all file systems\",\n+                                \"name\": \"file.owner\"\n                             },\n                             {\n-                                \"description\": \"The snmp4j numeric representation of the type of the PDU.\",\n-                                \"name\": \"snmp$type\"\n+                                \"description\": \"The group owner of the file. May not work on all file systems\",\n+                                \"name\": \"file.group\"\n                             },\n                             {\n-                                \"description\": \"The name of the PDU type.\",\n-                                \"name\": \"snmp$typeString\"\n+                                \"description\": \"The read/write/execute permissions of the file. May not work on all file systems\",\n+                                \"name\": \"file.permissions\"\n                             },\n                             {\n-                                \"description\": \"This attribute will exist if and only if the strategy is GET and will be equal to the value given in Textual Oid property.\",\n-                                \"name\": \"snmp$textualOid\"\n+                                \"description\": \"The full/absolute path from where a file was picked up. The current 'path' attribute is still populated, but may be a relative path\",\n+                                \"name\": \"absolute.path\"\n                             }\n                         ]\n                     },\n                     {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-snmp-nar\",\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -86970,283 +85833,279 @@\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n+                        \"deprecated\": true,\n+                        \"deprecationAlternatives\": [\n+                            \"org.apache.nifi.processors.standard.InvokeHTTP\"\n+                        ],\n+                        \"deprecationReason\": \"This processor is deprecated and may be removed in future releases.\",\n+                        \"dynamicProperties\": [\n+                            {\n+                                \"description\": \"The additional headers to be sent by the processor whenever making a new HTTP request. \\n Setting a dynamic property name to XYZ and value to ${attribute} will result in the header 'XYZ: attribute_value' being sent to the HTTP endpoint\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"name\": \"Header Name\",\n+                                \"value\": \"The Expression Language to be used to populate the header value\"\n+                            }\n+                        ],\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_FORBIDDEN\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"snmp-community\": {\n-                                \"defaultValue\": \"public\",\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"SNMPv1\",\n-                                            \"SNMPv2c\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"SNMP Version\",\n-                                        \"propertyName\": \"snmp-version\"\n-                                    }\n-                                ],\n-                                \"description\": \"SNMPv1 and SNMPv2 use communities to establish trust between managers and agents. Most agents support three community names, one each for read-only, read-write and trap. These three community strings control different types of activities. The read-only community applies to get requests. The read-write community string applies to set requests. The trap community string applies to receipt of traps.\",\n-                                \"displayName\": \"SNMP Community\",\n+                            \"Accept Content-Type\": {\n+                                \"description\": \"If specified, requests will only accept the provided Content-Type\",\n+                                \"displayName\": \"Accept Content-Type\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"snmp-community\",\n-                                \"required\": true,\n-                                \"sensitive\": true\n+                                \"name\": \"Accept Content-Type\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n                             },\n-                            \"snmp-manager-port\": {\n-                                \"description\": \"The port where the SNMP Manager listens to the incoming traps.\",\n-                                \"displayName\": \"SNMP Manager Port\",\n+                            \"Connection Timeout\": {\n+                                \"defaultValue\": \"30 sec\",\n+                                \"description\": \"How long to wait when attempting to connect to the remote server before giving up\",\n+                                \"displayName\": \"Connection Timeout\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"snmp-manager-port\",\n+                                \"name\": \"Connection Timeout\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"snmp-security-level\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"Communication without authentication and privacy.\",\n-                                        \"displayName\": \"noAuthNoPriv\",\n-                                        \"value\": \"noAuthNoPriv\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Communication with authentication and without privacy.\",\n-                                        \"displayName\": \"authNoPriv\",\n-                                        \"value\": \"authNoPriv\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Communication with authentication and privacy.\",\n-                                        \"displayName\": \"authPriv\",\n-                                        \"value\": \"authPriv\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"noAuthNoPriv\",\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"SNMPv3\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"SNMP Version\",\n-                                        \"propertyName\": \"snmp-version\"\n-                                    }\n-                                ],\n-                                \"description\": \"SNMP version 3 provides extra security with User Based Security Model (USM). The three levels of security is 1. Communication without authentication and encryption (NoAuthNoPriv). 2. Communication with authentication and without encryption (AuthNoPriv). 3. Communication with authentication and encryption (AuthPriv).\",\n-                                \"displayName\": \"SNMP Security Level\",\n+                            \"Data Timeout\": {\n+                                \"defaultValue\": \"30 sec\",\n+                                \"description\": \"How long to wait between receiving segments of data from the remote server before giving up and discarding the partial file\",\n+                                \"displayName\": \"Data Timeout\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"snmp-security-level\",\n+                                \"name\": \"Data Timeout\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"snmp-usm-security-names\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"usm-security-names\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"USM Users Source\",\n-                                        \"propertyName\": \"snmp-usm-users-source\"\n-                                    },\n+                            \"Filename\": {\n+                                \"description\": \"The filename to assign to the file when pulled\",\n+                                \"displayName\": \"Filename\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Filename\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Follow Redirects\": {\n+                                \"allowableValues\": [\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"noAuthNoPriv\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"SNMP Security Level\",\n-                                        \"propertyName\": \"snmp-security-level\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"SNMPv3\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"SNMP Version\",\n-                                        \"propertyName\": \"snmp-version\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"description\": \"Security names listed separated by commas in SNMPv3. Check Usage for more details.\",\n-                                \"displayName\": \"SNMP Users Security Names\",\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"If we receive a 3xx HTTP Status Code from the server, indicates whether or not we should follow the redirect that the server specifies\",\n+                                \"displayName\": \"Follow Redirects\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"snmp-usm-security-names\",\n+                                \"name\": \"Follow Redirects\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"snmp-usm-users-file-path\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"SNMPv3\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"SNMP Version\",\n-                                        \"propertyName\": \"snmp-version\"\n-                                    },\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"usm-json-file-path\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"USM Users Source\",\n-                                        \"propertyName\": \"snmp-usm-users-source\"\n-                                    }\n-                                ],\n-                                \"description\": \"The path of the json file containing the user credentials for SNMPv3. Check Usage for more details.\",\n-                                \"displayName\": \"USM Users JSON File Path\",\n+                            \"Password\": {\n+                                \"description\": \"Password required to access the URL\",\n+                                \"displayName\": \"Password\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"snmp-usm-users-file-path\",\n+                                \"name\": \"Password\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n+                            },\n+                            \"Proxy Host\": {\n+                                \"description\": \"The fully qualified hostname or IP address of the proxy server\",\n+                                \"displayName\": \"Proxy Host\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Proxy Host\",\n                                 \"required\": false,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"SINGLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\"\n-                                    ]\n-                                },\n                                 \"sensitive\": false\n                             },\n-                            \"snmp-usm-users-json-content\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"SNMPv3\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"SNMP Version\",\n-                                        \"propertyName\": \"snmp-version\"\n-                                    },\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"usm-json-content\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"USM Users Source\",\n-                                        \"propertyName\": \"snmp-usm-users-source\"\n-                                    }\n-                                ],\n-                                \"description\": \"The JSON containing the user credentials for SNMPv3. Check Usage for more details.\",\n-                                \"displayName\": \"USM Users JSON content\",\n+                            \"Proxy Port\": {\n+                                \"description\": \"The port of the proxy server\",\n+                                \"displayName\": \"Proxy Port\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"snmp-usm-users-json-content\",\n+                                \"name\": \"Proxy Port\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"snmp-usm-users-source\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"The JSON containing the USM users\",\n-                                        \"displayName\": \"Json Content\",\n-                                        \"value\": \"usm-json-content\"\n-                                    },\n-                                    {\n-                                        \"description\": \"The path of the JSON file containing the USM users\",\n-                                        \"displayName\": \"Json File Path\",\n-                                        \"value\": \"usm-json-file-path\"\n-                                    },\n-                                    {\n-                                        \"description\": \"In case of noAuthNoPriv security level - the list of security names separated by commas\",\n-                                        \"displayName\": \"Security Names\",\n-                                        \"value\": \"usm-security-names\"\n-                                    }\n-                                ],\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"SNMPv3\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"SNMP Version\",\n-                                        \"propertyName\": \"snmp-version\"\n-                                    }\n-                                ],\n-                                \"description\": \"The ways to provide USM User data\",\n-                                \"displayName\": \"USM Users Source\",\n+                            \"SSL Context Service\": {\n+                                \"description\": \"The Controller Service to use in order to obtain an SSL Context\",\n+                                \"displayName\": \"SSL Context Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"snmp-usm-users-source\",\n+                                \"name\": \"SSL Context Service\",\n+                                \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"URL\": {\n+                                \"description\": \"The URL to pull from\",\n+                                \"displayName\": \"URL\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"URL\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"snmp-version\": {\n+                            \"User Agent\": {\n+                                \"description\": \"What to report as the User Agent when we connect to the remote server\",\n+                                \"displayName\": \"User Agent\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"User Agent\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Username\": {\n+                                \"description\": \"Username required to access the URL\",\n+                                \"displayName\": \"Username\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Username\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"proxy-configuration-service\": {\n+                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests. If set, it supersedes proxy settings configured per component. Supported proxies: HTTP + AuthN\",\n+                                \"displayName\": \"Proxy Configuration Service\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"proxy-configuration-service\",\n+                                \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.proxy.ProxyConfigurationService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"redirect-cookie-policy\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"SNMP version 1\",\n-                                        \"displayName\": \"v1\",\n-                                        \"value\": \"SNMPv1\"\n+                                        \"description\": \"Default cookie policy that provides a higher degree of compatibility with common cookie management of popular HTTP agents for non-standard (Netscape style) cookies.\",\n+                                        \"displayName\": \"default\",\n+                                        \"value\": \"default\"\n                                     },\n                                     {\n-                                        \"description\": \"SNMP version 2c\",\n-                                        \"displayName\": \"v2c\",\n-                                        \"value\": \"SNMPv2c\"\n+                                        \"description\": \"RFC 6265 compliant cookie policy (interoperability profile).\",\n+                                        \"displayName\": \"standard\",\n+                                        \"value\": \"standard\"\n                                     },\n                                     {\n-                                        \"description\": \"SNMP version 3 with improved security\",\n-                                        \"displayName\": \"v3\",\n-                                        \"value\": \"SNMPv3\"\n+                                        \"description\": \"RFC 6265 compliant cookie policy (strict profile).\",\n+                                        \"displayName\": \"strict\",\n+                                        \"value\": \"strict\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Netscape draft compliant cookie policy.\",\n+                                        \"displayName\": \"netscape\",\n+                                        \"value\": \"netscape\"\n+                                    },\n+                                    {\n+                                        \"description\": \"A cookie policy that ignores cookies.\",\n+                                        \"displayName\": \"ignore\",\n+                                        \"value\": \"ignore\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"SNMPv1\",\n-                                \"description\": \"Three significant versions of SNMP have been developed and deployed. SNMPv1 is the original version of the protocol. More recent versions, SNMPv2c and SNMPv3, feature improvements in performance, flexibility and security.\",\n-                                \"displayName\": \"SNMP Version\",\n+                                \"defaultValue\": \"default\",\n+                                \"description\": \"When a HTTP server responds to a request with a redirect, this is the cookie policy used to copy cookies to the following request.\",\n+                                \"displayName\": \"Redirect Cookie Policy\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"snmp-version\",\n-                                \"required\": true,\n+                                \"name\": \"redirect-cookie-policy\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             }\n                         },\n                         \"sideEffectFree\": false,\n+                        \"stateful\": {\n+                            \"description\": \"Stores Last Modified Time and ETag headers returned by server so that the same data will not be fetched multiple times.\",\n+                            \"scopes\": [\n+                                \"LOCAL\"\n+                            ]\n+                        },\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"All FlowFiles that are received from the SNMP agent are routed to this relationship\",\n+                                \"description\": \"All files are transferred to the success relationship\",\n                                 \"name\": \"success\"\n-                            },\n-                            {\n-                                \"description\": \"All FlowFiles that cannot received from the SNMP agent are routed to this relationship\",\n-                                \"name\": \"failure\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n                         \"supportsBatching\": false,\n-                        \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicProperties\": true,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"listen\",\n-                            \"snmp\",\n-                            \"trap\"\n+                            \"fetch\",\n+                            \"get\",\n+                            \"http\",\n+                            \"https\",\n+                            \"ingest\",\n+                            \"input\",\n+                            \"poll\",\n+                            \"source\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.snmp.processors.ListenTrapSNMP\",\n-                        \"typeDescription\": \"Receives information from SNMP Agent and outputs a FlowFile with information in attributes and without any content\",\n+                        \"type\": \"org.apache.nifi.processors.standard.GetHTTP\",\n+                        \"typeDescription\": \"Please be aware this processor is deprecated and may be removed in the near future. Use InvokeHTTP instead. Fetches data from an HTTP or HTTPS URL and writes the data to the content of a FlowFile. Once the content has been fetched, the ETag and Last Modified dates are remembered (if the web server supports these concepts). This allows the Processor to fetch new data only if the remote data has changed or until the state is cleared. That is, once the content has been fetched from the given URL, it will not be fetched again until the content on the remote server changes. Note that due to limitations on state management, stored \\\"last modified\\\" and etag fields never expire. If the URL in GetHttp uses Expression Language that is unbounded, there is the potential for Out of Memory Errors to occur.\",\n                         \"version\": \"1.27.0\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"Attributes retrieved from the SNMP response. It may include: snmp$errorIndex, snmp$errorStatus, snmp$errorStatusText, snmp$nonRepeaters, snmp$requestID, snmp$type, snmp$variableBindings\",\n-                                \"name\": \"snmp$*\"\n+                                \"description\": \"The filename is set to the name of the file on the remote server\",\n+                                \"name\": \"filename\"\n+                            },\n+                            {\n+                                \"description\": \"The MIME Type of the FlowFile, as reported by the HTTP Content-Type header\",\n+                                \"name\": \"mime.type\"\n                             }\n                         ]\n                     },\n                     {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-snmp-nar\",\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -87254,484 +86113,225 @@\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n+                        \"deprecated\": true,\n+                        \"deprecationAlternatives\": [\n+                            \"org.apache.nifi.jms.processors.ConsumeJMS\"\n+                        ],\n+                        \"deprecationReason\": \"This processor is deprecated and may be removed in future releases. \",\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_ALLOWED\",\n+                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"snmp-authentication-passphrase\": {\n-                                \"dependencies\": [\n+                            \"Acknowledgement Mode\": {\n+                                \"allowableValues\": [\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"authPriv\",\n-                                            \"authNoPriv\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"SNMP Security Level\",\n-                                        \"propertyName\": \"snmp-security-level\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Client Acknowledge\",\n+                                        \"value\": \"Client Acknowledge\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Auto Acknowledge\",\n+                                        \"value\": \"Auto Acknowledge\"\n                                     }\n                                 ],\n-                                \"description\": \"Passphrase used for SNMP authentication protocol.\",\n-                                \"displayName\": \"SNMP Authentication Passphrase\",\n+                                \"defaultValue\": \"Client Acknowledge\",\n+                                \"description\": \"The JMS Acknowledgement Mode. Using Auto Acknowledge can cause messages to be lost on restart of NiFi but may provide better performance than Client Acknowledge.\",\n+                                \"displayName\": \"Acknowledgement Mode\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"snmp-authentication-passphrase\",\n+                                \"name\": \"Acknowledgement Mode\",\n                                 \"required\": true,\n-                                \"sensitive\": true\n+                                \"sensitive\": false\n                             },\n-                            \"snmp-authentication-protocol\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"Provides authentication based on the HMAC-MD5 algorithm.\",\n-                                        \"displayName\": \"MD5\",\n-                                        \"value\": \"MD5\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Provides authentication based on the HMAC-SHA algorithm.\",\n-                                        \"displayName\": \"SHA\",\n-                                        \"value\": \"SHA\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Provides authentication based on the HMAC-SHA-2 algorithm.\",\n-                                        \"displayName\": \"SHA224\",\n-                                        \"value\": \"HMAC128SHA224\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Provides authentication based on the HMAC-SHA-2 algorithm.\",\n-                                        \"displayName\": \"SHA256\",\n-                                        \"value\": \"HMAC192SHA256\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Provides authentication based on the HMAC-SHA-2 algorithm.\",\n-                                        \"displayName\": \"SHA384\",\n-                                        \"value\": \"HMAC256SHA384\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Provides authentication based on the HMAC-SHA-2 algorithm.\",\n-                                        \"displayName\": \"SHA512\",\n-                                        \"value\": \"HMAC384SHA512\"\n-                                    }\n-                                ],\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"authPriv\",\n-                                            \"authNoPriv\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"SNMP Security Level\",\n-                                        \"propertyName\": \"snmp-security-level\"\n-                                    }\n-                                ],\n-                                \"description\": \"Hash based authentication protocol for secure authentication.\",\n-                                \"displayName\": \"SNMP Authentication Protocol\",\n+                            \"Client ID Prefix\": {\n+                                \"description\": \"A human-readable ID that can be used to associate connections with yourself so that the maintainers of the JMS Server know who to contact if problems arise\",\n+                                \"displayName\": \"Client ID Prefix\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"snmp-authentication-protocol\",\n-                                \"required\": true,\n+                                \"name\": \"Client ID Prefix\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"snmp-community\": {\n-                                \"defaultValue\": \"public\",\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"SNMPv1\",\n-                                            \"SNMPv2c\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"SNMP Version\",\n-                                        \"propertyName\": \"snmp-version\"\n-                                    }\n-                                ],\n-                                \"description\": \"SNMPv1 and SNMPv2 use communities to establish trust between managers and agents. Most agents support three community names, one each for read-only, read-write and trap. These three community strings control different types of activities. The read-only community applies to get requests. The read-write community string applies to set requests. The trap community string applies to receipt of traps.\",\n-                                \"displayName\": \"SNMP Community\",\n+                            \"Communications Timeout\": {\n+                                \"defaultValue\": \"30 sec\",\n+                                \"description\": \"The amount of time to wait when attempting to receive a message before giving up and assuming failure\",\n+                                \"displayName\": \"Communications Timeout\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"snmp-community\",\n+                                \"name\": \"Communications Timeout\",\n                                 \"required\": true,\n-                                \"sensitive\": true\n+                                \"sensitive\": false\n                             },\n-                            \"snmp-private-protocol\": {\n+                            \"Copy JMS Properties to Attributes\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Symmetric-key algorithm for the encryption of digital data. DES has been considered insecurebecause of the feasilibity of brute-force attacks. We recommend using the AES encryption protocol.\",\n-                                        \"displayName\": \"DES\",\n-                                        \"value\": \"DES\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Symmetric-key block cipher, which applies the DES cipher algorithm three times to each data block. 3DES has been considered insecure has been deprecated by NIST in 2017. We recommend using the AES encryption protocol.\",\n-                                        \"displayName\": \"3DES\",\n-                                        \"value\": \"3DES\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AES is a symmetric algorithm which uses the same 128, 192, or 256 bit key for both encryption and decryption (the security of an AES system increases exponentially with key length).\",\n-                                        \"displayName\": \"AES128\",\n-                                        \"value\": \"AES128\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AES is a symmetric algorithm which uses the same 128, 192, or 256 bit key for both encryption and decryption (the security of an AES system increases exponentially with key length).\",\n-                                        \"displayName\": \"AES192\",\n-                                        \"value\": \"AES192\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n-                                        \"description\": \"AES is a symmetric algorithm which uses the same 128, 192, or 256 bit key for both encryption and decryption (the security of an AES system increases exponentially with key length).\",\n-                                        \"displayName\": \"AES256\",\n-                                        \"value\": \"AES256\"\n-                                    }\n-                                ],\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"authPriv\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"SNMP Security Level\",\n-                                        \"propertyName\": \"snmp-security-level\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"description\": \"Privacy allows for encryption of SNMP v3 messages to ensure confidentiality of data.\",\n-                                \"displayName\": \"SNMP Privacy Protocol\",\n+                                \"defaultValue\": \"true\",\n+                                \"description\": \"Whether or not the JMS Message Properties should be copied to the FlowFile Attributes; if so, the attribute name will be jms.XXX, where XXX is the JMS Property name\",\n+                                \"displayName\": \"Copy JMS Properties to Attributes\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"snmp-private-protocol\",\n+                                \"name\": \"Copy JMS Properties to Attributes\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"snmp-private-protocol-passphrase\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"authPriv\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"SNMP Security Level\",\n-                                        \"propertyName\": \"snmp-security-level\"\n-                                    }\n-                                ],\n-                                \"description\": \"Passphrase used for SNMP privacy protocol.\",\n-                                \"displayName\": \"SNMP Privacy Passphrase\",\n+                            \"Destination Name\": {\n+                                \"description\": \"The name of the JMS Topic or queue to use\",\n+                                \"displayName\": \"Destination Name\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"snmp-private-protocol-passphrase\",\n+                                \"name\": \"Destination Name\",\n                                 \"required\": true,\n-                                \"sensitive\": true\n-                            },\n-                            \"snmp-retries\": {\n-                                \"defaultValue\": \"0\",\n-                                \"description\": \"Set the number of retries when requesting the SNMP Agent.\",\n-                                \"displayName\": \"Number of Retries\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"snmp-retries\",\n-                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"snmp-security-level\": {\n+                            \"JMS Provider\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Communication without authentication and privacy.\",\n-                                        \"displayName\": \"noAuthNoPriv\",\n-                                        \"value\": \"noAuthNoPriv\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Communication with authentication and without privacy.\",\n-                                        \"displayName\": \"authNoPriv\",\n-                                        \"value\": \"authNoPriv\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Communication with authentication and privacy.\",\n-                                        \"displayName\": \"authPriv\",\n-                                        \"value\": \"authPriv\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"noAuthNoPriv\",\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"SNMPv3\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"SNMP Version\",\n-                                        \"propertyName\": \"snmp-version\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"ActiveMQ\",\n+                                        \"value\": \"ActiveMQ\"\n                                     }\n                                 ],\n-                                \"description\": \"SNMP version 3 provides extra security with User Based Security Model (USM). The three levels of security is 1. Communication without authentication and encryption (NoAuthNoPriv). 2. Communication with authentication and without encryption (AuthNoPriv). 3. Communication with authentication and encryption (AuthPriv).\",\n-                                \"displayName\": \"SNMP Security Level\",\n+                                \"defaultValue\": \"ActiveMQ\",\n+                                \"description\": \"The Provider used for the JMS Server\",\n+                                \"displayName\": \"JMS Provider\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"snmp-security-level\",\n+                                \"name\": \"JMS Provider\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"snmp-security-name\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"SNMPv3\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"SNMP Version\",\n-                                        \"propertyName\": \"snmp-version\"\n-                                    }\n-                                ],\n-                                \"description\": \"User name used for SNMP v3 Authentication.\",\n-                                \"displayName\": \"SNMP Security Name\",\n+                            \"Message Batch Size\": {\n+                                \"defaultValue\": \"10\",\n+                                \"description\": \"The number of messages to pull/push in a single iteration of the processor\",\n+                                \"displayName\": \"Message Batch Size\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"snmp-security-name\",\n+                                \"name\": \"Message Batch Size\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"snmp-timeout\": {\n-                                \"defaultValue\": \"5000\",\n-                                \"description\": \"Set the timeout in ms when requesting the SNMP Agent.\",\n-                                \"displayName\": \"Timeout (ms)\",\n+                            \"Message Selector\": {\n+                                \"description\": \"The JMS Message Selector to use in order to narrow the messages that are pulled\",\n+                                \"displayName\": \"Message Selector\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"snmp-timeout\",\n+                                \"name\": \"Message Selector\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"snmp-trap-agent-address\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"SNMPv1\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"SNMP Version\",\n-                                        \"propertyName\": \"snmp-version\"\n-                                    }\n-                                ],\n-                                \"description\": \"The address where the SNMP Manager sends the trap.\",\n-                                \"displayName\": \"SNMP Trap Agent Address\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"snmp-trap-agent-address\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"snmp-trap-enterprise-oid\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"SNMPv1\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"SNMP Version\",\n-                                        \"propertyName\": \"snmp-version\"\n-                                    }\n-                                ],\n-                                \"description\": \"Enterprise is the vendor identification (OID) for the network management sub-system that generated the trap.\",\n-                                \"displayName\": \"Enterprise OID\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"snmp-trap-enterprise-oid\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"snmp-trap-generic-type\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"A coldStart trap signifies that the sending protocol entity is reinitializing itself such that the agent's configuration or the protocol entity implementation may be altered\",\n-                                        \"displayName\": \"Cold Start\",\n-                                        \"value\": \"0\"\n-                                    },\n-                                    {\n-                                        \"description\": \"A warmStart trap signifies that the sending protocol entity is reinitializing itself such that neither the agent configuration nor the protocol entity implementation is altered.\",\n-                                        \"displayName\": \"Warm Start\",\n-                                        \"value\": \"1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"A linkDown trap signifies that the sending protocol entity recognizes a failure in one of the communication links represented in the agent's configuration.\",\n-                                        \"displayName\": \"Link Down\",\n-                                        \"value\": \"2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"A linkUp trap signifies that the sending protocol entity recognizes that one of the communication links represented in the agent's configuration has come up.\",\n-                                        \"displayName\": \"Link Up\",\n-                                        \"value\": \"3\"\n-                                    },\n-                                    {\n-                                        \"description\": \"An authenticationFailure trap signifies that the sending protocol entity is the addressee of a protocol message that is not properly authenticated. While implementations of the SNMP must be capable of generating this trap, they must also be capable of suppressing the emission of such traps via an implementation- specific mechanism.\",\n-                                        \"displayName\": \"Authentication Failure\",\n-                                        \"value\": \"4\"\n-                                    },\n-                                    {\n-                                        \"description\": \"An egpNeighborLoss trap signifies that an EGP neighbor for whom the sending protocol entity was an EGP peer has been marked down and the peer relationship no longer obtains\",\n-                                        \"displayName\": \"EGP Neighborloss\",\n-                                        \"value\": \"5\"\n-                                    },\n-                                    {\n-                                        \"description\": \"An enterpriseSpecific trap signifies that a particular enterprise-specific trap has occurred which can be defined in the Specific Trap Type field.\",\n-                                        \"displayName\": \"Enterprise Specific\",\n-                                        \"value\": \"6\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Provide the Generic Trap Type with the \\\"generic-trap-type\\\" flowfile attribute.\",\n-                                        \"displayName\": \"With \\\"generic-trap-type\\\" FlowFile Attribute\",\n-                                        \"value\": \"generic-trap-type\"\n-                                    }\n-                                ],\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"SNMPv1\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"SNMP Version\",\n-                                        \"propertyName\": \"snmp-version\"\n-                                    }\n-                                ],\n-                                \"description\": \"Generic trap type is an integer in the range of 0 to 6. See processor usage for details.\",\n-                                \"displayName\": \"Generic Trap Type\",\n+                            \"Password\": {\n+                                \"description\": \"Password used for authentication and authorization\",\n+                                \"displayName\": \"Password\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"snmp-trap-generic-type\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"snmp-trap-manager-host\": {\n-                                \"defaultValue\": \"localhost\",\n-                                \"description\": \"The host of the SNMP Manager where the trap is sent.\",\n-                                \"displayName\": \"SNMP Manager Host\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"snmp-trap-manager-host\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n+                                \"name\": \"Password\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n                             },\n-                            \"snmp-trap-manager-port\": {\n-                                \"description\": \"The port of the SNMP Manager where the trap is sent.\",\n-                                \"displayName\": \"SNMP Manager Port\",\n+                            \"SSL Context Service\": {\n+                                \"description\": \"The Controller Service to use in order to obtain an SSL Context.\",\n+                                \"displayName\": \"SSL Context Service\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"snmp-trap-manager-port\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"SSL Context Service\",\n+                                \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n                             },\n-                            \"snmp-trap-oid-value\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"SNMPv3\",\n-                                            \"SNMPv2c\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"SNMP Version\",\n-                                        \"propertyName\": \"snmp-version\"\n-                                    }\n-                                ],\n-                                \"description\": \"The value of the trap OID.\",\n-                                \"displayName\": \"Trap OID Value\",\n+                            \"URL\": {\n+                                \"description\": \"The URL of the JMS Server\",\n+                                \"displayName\": \"URL\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"snmp-trap-oid-value\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"URL\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"snmp-trap-specific-type\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"6\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Generic Trap Type\",\n-                                        \"propertyName\": \"snmp-trap-generic-type\"\n-                                    },\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"SNMPv1\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"SNMP Version\",\n-                                        \"propertyName\": \"snmp-version\"\n-                                    }\n-                                ],\n-                                \"description\": \"Specific trap type is a number that further specifies the nature of the event that generated the trap in the case of traps of generic type 6 (enterpriseSpecific). The interpretation of this code is vendor-specific.\",\n-                                \"displayName\": \"Specific Trap Type\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"snmp-trap-specific-type\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"snmp-version\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"SNMP version 1\",\n-                                        \"displayName\": \"v1\",\n-                                        \"value\": \"SNMPv1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"SNMP version 2c\",\n-                                        \"displayName\": \"v2c\",\n-                                        \"value\": \"SNMPv2c\"\n-                                    },\n-                                    {\n-                                        \"description\": \"SNMP version 3 with improved security\",\n-                                        \"displayName\": \"v3\",\n-                                        \"value\": \"SNMPv3\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"SNMPv1\",\n-                                \"description\": \"Three significant versions of SNMP have been developed and deployed. SNMPv1 is the original version of the protocol. More recent versions, SNMPv2c and SNMPv3, feature improvements in performance, flexibility and security.\",\n-                                \"displayName\": \"SNMP Version\",\n+                            \"Username\": {\n+                                \"description\": \"Username used for authentication and authorization\",\n+                                \"displayName\": \"Username\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"snmp-version\",\n-                                \"required\": true,\n+                                \"name\": \"Username\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             }\n                         },\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.processors.standard.PutJMS\"\n+                        ],\n                         \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"All FlowFiles that have been successfully used to perform SNMP Set are routed to this relationship\",\n+                                \"description\": \"All FlowFiles are routed to success\",\n                                 \"name\": \"success\"\n-                            },\n-                            {\n-                                \"description\": \"All FlowFiles that cannot received from the SNMP agent are routed to this relationship\",\n-                                \"name\": \"failure\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n                         \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"send\",\n-                            \"snmp\",\n-                            \"trap\"\n+                            \"consume\",\n+                            \"consumer\",\n+                            \"get\",\n+                            \"jms\",\n+                            \"listen\",\n+                            \"pull\",\n+                            \"queue\",\n+                            \"source\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.snmp.processors.SendTrapSNMP\",\n-                        \"typeDescription\": \"Sends information to SNMP Manager.\",\n+                        \"triggerWhenEmpty\": true,\n+                        \"type\": \"org.apache.nifi.processors.standard.GetJMSQueue\",\n+                        \"typeDescription\": \"Pulls messages from a ActiveMQ JMS Queue, creating a FlowFile for each JMS Message or bundle of messages, as configured\",\n                         \"version\": \"1.27.0\"\n                     },\n                     {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-snmp-nar\",\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -87739,1020 +86339,817 @@\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n+                        \"deprecated\": true,\n+                        \"deprecationAlternatives\": [\n+                            \"org.apache.nifi.jms.processors.ConsumeJMS\"\n+                        ],\n+                        \"deprecationReason\": \"This processor is deprecated and may be removed in future releases.\",\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_REQUIRED\",\n-                        \"primaryNodeOnly\": false,\n+                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n+                        \"primaryNodeOnly\": true,\n                         \"propertyDescriptors\": {\n-                            \"snmp-authentication-passphrase\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"authPriv\",\n-                                            \"authNoPriv\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"SNMP Security Level\",\n-                                        \"propertyName\": \"snmp-security-level\"\n-                                    }\n-                                ],\n-                                \"description\": \"Passphrase used for SNMP authentication protocol.\",\n-                                \"displayName\": \"SNMP Authentication Passphrase\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"snmp-authentication-passphrase\",\n-                                \"required\": true,\n-                                \"sensitive\": true\n-                            },\n-                            \"snmp-authentication-protocol\": {\n+                            \"Acknowledgement Mode\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Provides authentication based on the HMAC-MD5 algorithm.\",\n-                                        \"displayName\": \"MD5\",\n-                                        \"value\": \"MD5\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Provides authentication based on the HMAC-SHA algorithm.\",\n-                                        \"displayName\": \"SHA\",\n-                                        \"value\": \"SHA\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Provides authentication based on the HMAC-SHA-2 algorithm.\",\n-                                        \"displayName\": \"SHA224\",\n-                                        \"value\": \"HMAC128SHA224\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Provides authentication based on the HMAC-SHA-2 algorithm.\",\n-                                        \"displayName\": \"SHA256\",\n-                                        \"value\": \"HMAC192SHA256\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Provides authentication based on the HMAC-SHA-2 algorithm.\",\n-                                        \"displayName\": \"SHA384\",\n-                                        \"value\": \"HMAC256SHA384\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Client Acknowledge\",\n+                                        \"value\": \"Client Acknowledge\"\n                                     },\n                                     {\n-                                        \"description\": \"Provides authentication based on the HMAC-SHA-2 algorithm.\",\n-                                        \"displayName\": \"SHA512\",\n-                                        \"value\": \"HMAC384SHA512\"\n-                                    }\n-                                ],\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"authPriv\",\n-                                            \"authNoPriv\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"SNMP Security Level\",\n-                                        \"propertyName\": \"snmp-security-level\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Auto Acknowledge\",\n+                                        \"value\": \"Auto Acknowledge\"\n                                     }\n                                 ],\n-                                \"description\": \"Hash based authentication protocol for secure authentication.\",\n-                                \"displayName\": \"SNMP Authentication Protocol\",\n+                                \"defaultValue\": \"Client Acknowledge\",\n+                                \"description\": \"The JMS Acknowledgement Mode. Using Auto Acknowledge can cause messages to be lost on restart of NiFi but may provide better performance than Client Acknowledge.\",\n+                                \"displayName\": \"Acknowledgement Mode\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"snmp-authentication-protocol\",\n+                                \"name\": \"Acknowledgement Mode\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"snmp-community\": {\n-                                \"defaultValue\": \"public\",\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"SNMPv1\",\n-                                            \"SNMPv2c\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"SNMP Version\",\n-                                        \"propertyName\": \"snmp-version\"\n-                                    }\n-                                ],\n-                                \"description\": \"SNMPv1 and SNMPv2 use communities to establish trust between managers and agents. Most agents support three community names, one each for read-only, read-write and trap. These three community strings control different types of activities. The read-only community applies to get requests. The read-write community string applies to set requests. The trap community string applies to receipt of traps.\",\n-                                \"displayName\": \"SNMP Community\",\n+                            \"Client ID Prefix\": {\n+                                \"description\": \"A human-readable ID that can be used to associate connections with yourself so that the maintainers of the JMS Server know who to contact if problems arise\",\n+                                \"displayName\": \"Client ID Prefix\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"snmp-community\",\n-                                \"required\": true,\n-                                \"sensitive\": true\n-                            },\n-                            \"snmp-hostname\": {\n-                                \"defaultValue\": \"localhost\",\n-                                \"description\": \"Hostname or network address of the SNMP Agent.\",\n-                                \"displayName\": \"SNMP Agent Hostname\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"snmp-hostname\",\n-                                \"required\": true,\n+                                \"name\": \"Client ID Prefix\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"snmp-port\": {\n-                                \"defaultValue\": \"161\",\n-                                \"description\": \"Port of the SNMP Agent.\",\n-                                \"displayName\": \"SNMP Agent Port\",\n+                            \"Communications Timeout\": {\n+                                \"defaultValue\": \"30 sec\",\n+                                \"description\": \"The amount of time to wait when attempting to receive a message before giving up and assuming failure\",\n+                                \"displayName\": \"Communications Timeout\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"snmp-port\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Communications Timeout\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"snmp-private-protocol\": {\n+                            \"Copy JMS Properties to Attributes\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Symmetric-key algorithm for the encryption of digital data. DES has been considered insecurebecause of the feasilibity of brute-force attacks. We recommend using the AES encryption protocol.\",\n-                                        \"displayName\": \"DES\",\n-                                        \"value\": \"DES\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Symmetric-key block cipher, which applies the DES cipher algorithm three times to each data block. 3DES has been considered insecure has been deprecated by NIST in 2017. We recommend using the AES encryption protocol.\",\n-                                        \"displayName\": \"3DES\",\n-                                        \"value\": \"3DES\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AES is a symmetric algorithm which uses the same 128, 192, or 256 bit key for both encryption and decryption (the security of an AES system increases exponentially with key length).\",\n-                                        \"displayName\": \"AES128\",\n-                                        \"value\": \"AES128\"\n-                                    },\n-                                    {\n-                                        \"description\": \"AES is a symmetric algorithm which uses the same 128, 192, or 256 bit key for both encryption and decryption (the security of an AES system increases exponentially with key length).\",\n-                                        \"displayName\": \"AES192\",\n-                                        \"value\": \"AES192\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n-                                        \"description\": \"AES is a symmetric algorithm which uses the same 128, 192, or 256 bit key for both encryption and decryption (the security of an AES system increases exponentially with key length).\",\n-                                        \"displayName\": \"AES256\",\n-                                        \"value\": \"AES256\"\n-                                    }\n-                                ],\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"authPriv\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"SNMP Security Level\",\n-                                        \"propertyName\": \"snmp-security-level\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"description\": \"Privacy allows for encryption of SNMP v3 messages to ensure confidentiality of data.\",\n-                                \"displayName\": \"SNMP Privacy Protocol\",\n+                                \"defaultValue\": \"true\",\n+                                \"description\": \"Whether or not the JMS Message Properties should be copied to the FlowFile Attributes; if so, the attribute name will be jms.XXX, where XXX is the JMS Property name\",\n+                                \"displayName\": \"Copy JMS Properties to Attributes\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"snmp-private-protocol\",\n+                                \"name\": \"Copy JMS Properties to Attributes\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"snmp-private-protocol-passphrase\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"authPriv\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"SNMP Security Level\",\n-                                        \"propertyName\": \"snmp-security-level\"\n-                                    }\n-                                ],\n-                                \"description\": \"Passphrase used for SNMP privacy protocol.\",\n-                                \"displayName\": \"SNMP Privacy Passphrase\",\n+                            \"Destination Name\": {\n+                                \"description\": \"The name of the JMS Topic or queue to use\",\n+                                \"displayName\": \"Destination Name\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"snmp-private-protocol-passphrase\",\n+                                \"name\": \"Destination Name\",\n                                 \"required\": true,\n-                                \"sensitive\": true\n-                            },\n-                            \"snmp-retries\": {\n-                                \"defaultValue\": \"0\",\n-                                \"description\": \"Set the number of retries when requesting the SNMP Agent.\",\n-                                \"displayName\": \"Number of Retries\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"snmp-retries\",\n-                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"snmp-security-level\": {\n+                            \"JMS Provider\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Communication without authentication and privacy.\",\n-                                        \"displayName\": \"noAuthNoPriv\",\n-                                        \"value\": \"noAuthNoPriv\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Communication with authentication and without privacy.\",\n-                                        \"displayName\": \"authNoPriv\",\n-                                        \"value\": \"authNoPriv\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Communication with authentication and privacy.\",\n-                                        \"displayName\": \"authPriv\",\n-                                        \"value\": \"authPriv\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"noAuthNoPriv\",\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"SNMPv3\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"SNMP Version\",\n-                                        \"propertyName\": \"snmp-version\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"ActiveMQ\",\n+                                        \"value\": \"ActiveMQ\"\n                                     }\n                                 ],\n-                                \"description\": \"SNMP version 3 provides extra security with User Based Security Model (USM). The three levels of security is 1. Communication without authentication and encryption (NoAuthNoPriv). 2. Communication with authentication and without encryption (AuthNoPriv). 3. Communication with authentication and encryption (AuthPriv).\",\n-                                \"displayName\": \"SNMP Security Level\",\n+                                \"defaultValue\": \"ActiveMQ\",\n+                                \"description\": \"The Provider used for the JMS Server\",\n+                                \"displayName\": \"JMS Provider\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"snmp-security-level\",\n+                                \"name\": \"JMS Provider\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"snmp-security-name\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"SNMPv3\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"SNMP Version\",\n-                                        \"propertyName\": \"snmp-version\"\n-                                    }\n-                                ],\n-                                \"description\": \"User name used for SNMP v3 Authentication.\",\n-                                \"displayName\": \"SNMP Security Name\",\n+                            \"Message Batch Size\": {\n+                                \"defaultValue\": \"10\",\n+                                \"description\": \"The number of messages to pull/push in a single iteration of the processor\",\n+                                \"displayName\": \"Message Batch Size\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"snmp-security-name\",\n+                                \"name\": \"Message Batch Size\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"snmp-timeout\": {\n-                                \"defaultValue\": \"5000\",\n-                                \"description\": \"Set the timeout in ms when requesting the SNMP Agent.\",\n-                                \"displayName\": \"Timeout (ms)\",\n+                            \"Message Selector\": {\n+                                \"description\": \"The JMS Message Selector to use in order to narrow the messages that are pulled\",\n+                                \"displayName\": \"Message Selector\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"snmp-timeout\",\n+                                \"name\": \"Message Selector\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"snmp-version\": {\n+                            \"Password\": {\n+                                \"description\": \"Password used for authentication and authorization\",\n+                                \"displayName\": \"Password\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Password\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n+                            },\n+                            \"SSL Context Service\": {\n+                                \"description\": \"The Controller Service to use in order to obtain an SSL Context.\",\n+                                \"displayName\": \"SSL Context Service\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"SSL Context Service\",\n+                                \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"URL\": {\n+                                \"description\": \"The URL of the JMS Server\",\n+                                \"displayName\": \"URL\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"URL\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Use Durable Subscription\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"SNMP version 1\",\n-                                        \"displayName\": \"v1\",\n-                                        \"value\": \"SNMPv1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"SNMP version 2c\",\n-                                        \"displayName\": \"v2c\",\n-                                        \"value\": \"SNMPv2c\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n-                                        \"description\": \"SNMP version 3 with improved security\",\n-                                        \"displayName\": \"v3\",\n-                                        \"value\": \"SNMPv3\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"SNMPv1\",\n-                                \"description\": \"Three significant versions of SNMP have been developed and deployed. SNMPv1 is the original version of the protocol. More recent versions, SNMPv2c and SNMPv3, feature improvements in performance, flexibility and security.\",\n-                                \"displayName\": \"SNMP Version\",\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"If true, connections to the specified topic will use Durable Subscription so that messages are queued when we are not pulling them\",\n+                                \"displayName\": \"Use Durable Subscription\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"snmp-version\",\n+                                \"name\": \"Use Durable Subscription\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n+                            },\n+                            \"Username\": {\n+                                \"description\": \"Username used for authentication and authorization\",\n+                                \"displayName\": \"Username\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Username\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n                             }\n                         },\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.processors.standard.PutJMS\"\n+                        ],\n                         \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"All FlowFiles that have been successfully used to perform SNMP Set are routed to this relationship\",\n+                                \"description\": \"All FlowFiles are routed to success\",\n                                 \"name\": \"success\"\n-                            },\n-                            {\n-                                \"description\": \"All FlowFiles that failed during the SNMP Set care routed to this relationship\",\n-                                \"name\": \"failure\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n                         \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"oid\",\n-                            \"set\",\n-                            \"snmp\"\n+                            \"consume\",\n+                            \"consumer\",\n+                            \"durable\",\n+                            \"get\",\n+                            \"jms\",\n+                            \"listen\",\n+                            \"non-durable\",\n+                            \"pull\",\n+                            \"source\",\n+                            \"subscription\",\n+                            \"topic\"\n                         ],\n-                        \"triggerSerially\": false,\n+                        \"triggerSerially\": true,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.snmp.processors.SetSNMP\",\n-                        \"typeDescription\": \"Based on incoming FlowFile attributes, the processor will execute SNMP Set requests. When finding attributes with the name snmp$<OID>, the processor will attempt to set the value of the attribute to the corresponding OID given in the attribute name.\",\n-                        \"version\": \"1.27.0\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"Response variable binding: OID (e.g. 1.3.6.1.4.1.343) and its value.\",\n-                                \"name\": \"snmp$<OID>\"\n-                            },\n-                            {\n-                                \"description\": \"Denotes the variable binding in which the error occured.\",\n-                                \"name\": \"snmp$errorIndex\"\n-                            },\n-                            {\n-                                \"description\": \"The snmp4j error status of the PDU.\",\n-                                \"name\": \"snmp$errorStatus\"\n-                            },\n-                            {\n-                                \"description\": \"The description of error status.\",\n-                                \"name\": \"snmp$errorStatusText\"\n-                            },\n-                            {\n-                                \"description\": \"The number of non repeater variable bindings in a GETBULK PDU (currently not supported).\",\n-                                \"name\": \"snmp$nonRepeaters\"\n-                            },\n-                            {\n-                                \"description\": \"The request ID associated with the PDU.\",\n-                                \"name\": \"snmp$requestID\"\n-                            },\n-                            {\n-                                \"description\": \"The snmp4j numeric representation of the type of the PDU.\",\n-                                \"name\": \"snmp$type\"\n-                            },\n-                            {\n-                                \"description\": \"The name of the PDU type.\",\n-                                \"name\": \"snmp$typeString\"\n-                            }\n-                        ]\n-                    }\n-                ],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"1.27.0\"\n-        },\n-        {\n-            \"artifact\": \"nifi-ssl-context-service-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [\n+                        \"triggerWhenEmpty\": true,\n+                        \"type\": \"org.apache.nifi.processors.standard.GetJMSTopic\",\n+                        \"typeDescription\": \"Pulls messages from a ActiveMQ JMS Topic, creating a FlowFile for each JMS Message or bundle of messages, as configured.\",\n+                        \"version\": \"1.27.0\"\n+                    },\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-ssl-context-service-nar\",\n+                        \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n+                        \"defaultBulletinLevel\": \"WARN\",\n+                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": 1,\n+                            \"TIMER_DRIVEN\": 1\n+                        },\n+                        \"defaultPenaltyDuration\": \"30 sec\",\n+                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": \"* * * * * ?\",\n+                            \"TIMER_DRIVEN\": \"0 sec\"\n+                        },\n+                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n+                        \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n+                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n+                        \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Keystore Filename\": {\n-                                \"description\": \"The fully-qualified filename of the Keystore\",\n-                                \"displayName\": \"Keystore Filename\",\n+                            \"Ciphers Allowed\": {\n+                                \"description\": \"A comma-separated list of Ciphers allowed for SFTP connections. Leave unset to allow all. Available options are: 3des-cbc, 3des-ctr, aes128-cbc, aes128-ctr, aes128-gcm@openssh.com, aes192-cbc, aes192-ctr, aes256-cbc, aes256-ctr, aes256-gcm@openssh.com, arcfour, arcfour128, arcfour256, blowfish-cbc, blowfish-ctr, cast128-cbc, cast128-ctr, chacha20-poly1305@openssh.com, idea-cbc, idea-ctr, serpent128-cbc, serpent128-ctr, serpent192-cbc, serpent192-ctr, serpent256-cbc, serpent256-ctr, twofish-cbc, twofish128-cbc, twofish128-ctr, twofish192-cbc, twofish192-ctr, twofish256-cbc, twofish256-ctr\",\n+                                \"displayName\": \"Ciphers Allowed\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Keystore Filename\",\n+                                \"name\": \"Ciphers Allowed\",\n                                 \"required\": false,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"SINGLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\"\n-                                    ]\n-                                },\n                                 \"sensitive\": false\n                             },\n-                            \"Keystore Password\": {\n-                                \"description\": \"The password for the Keystore\",\n-                                \"displayName\": \"Keystore Password\",\n+                            \"Connection Timeout\": {\n+                                \"defaultValue\": \"30 sec\",\n+                                \"description\": \"Amount of time to wait before timing out while creating a connection\",\n+                                \"displayName\": \"Connection Timeout\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Keystore Password\",\n-                                \"required\": false,\n-                                \"sensitive\": true\n+                                \"name\": \"Connection Timeout\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n                             },\n-                            \"Keystore Type\": {\n+                            \"Data Timeout\": {\n+                                \"defaultValue\": \"30 sec\",\n+                                \"description\": \"When transferring a file between the local and remote system, this value specifies how long is allowed to elapse without any data being transferred between systems\",\n+                                \"displayName\": \"Data Timeout\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Data Timeout\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Delete Original\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"BCFKS\",\n-                                        \"value\": \"BCFKS\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"PKCS12\",\n-                                        \"value\": \"PKCS12\"\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"JKS\",\n-                                        \"value\": \"JKS\"\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"description\": \"The Type of the Keystore\",\n-                                \"displayName\": \"Keystore Type\",\n+                                \"defaultValue\": \"true\",\n+                                \"description\": \"Determines whether or not the file is deleted from the remote system after it has been successfully transferred\",\n+                                \"displayName\": \"Delete Original\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Keystore Type\",\n-                                \"required\": false,\n+                                \"name\": \"Delete Original\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"SSL Protocol\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"Negotiate latest protocol version based on platform supported versions\",\n-                                        \"displayName\": \"TLS\",\n-                                        \"value\": \"TLS\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Require TLSv1.3 protocol version\",\n-                                        \"displayName\": \"TLSv1.3\",\n-                                        \"value\": \"TLSv1.3\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Require TLSv1.2 protocol version\",\n-                                        \"displayName\": \"TLSv1.2\",\n-                                        \"value\": \"TLSv1.2\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"TLS\",\n-                                \"description\": \"TLS Protocol Version for encrypted connections. Supported versions depend on the specific version of Java used.\",\n-                                \"displayName\": \"TLS Protocol\",\n+                            \"File Filter Regex\": {\n+                                \"description\": \"Provides a Java Regular Expression for filtering Filenames; if a filter is supplied, only files whose names match that Regular Expression will be fetched\",\n+                                \"displayName\": \"File Filter Regex\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"SSL Protocol\",\n+                                \"name\": \"File Filter Regex\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Truststore Filename\": {\n-                                \"description\": \"The fully-qualified filename of the Truststore\",\n-                                \"displayName\": \"Truststore Filename\",\n+                            \"Host Key File\": {\n+                                \"description\": \"If supplied, the given file will be used as the Host Key; otherwise, if 'Strict Host Key Checking' property is applied (set to true) then uses the 'known_hosts' and 'known_hosts2' files from ~/.ssh directory else no host key file will be used\",\n+                                \"displayName\": \"Host Key File\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Truststore Filename\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Host Key File\",\n                                 \"required\": false,\n                                 \"resourceDefinition\": {\n                                     \"cardinality\": \"SINGLE\",\n                                     \"resourceTypes\": [\n                                         \"FILE\"\n                                     ]\n                                 },\n                                 \"sensitive\": false\n                             },\n-                            \"Truststore Password\": {\n-                                \"description\": \"The password for the Truststore\",\n-                                \"displayName\": \"Truststore Password\",\n+                            \"Hostname\": {\n+                                \"description\": \"The fully qualified hostname or IP address of the remote system\",\n+                                \"displayName\": \"Hostname\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Truststore Password\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Hostname\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Http Proxy Password\": {\n+                                \"description\": \"Http Proxy Password\",\n+                                \"displayName\": \"Http Proxy Password\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Http Proxy Password\",\n                                 \"required\": false,\n                                 \"sensitive\": true\n                             },\n-                            \"Truststore Type\": {\n+                            \"Http Proxy Username\": {\n+                                \"description\": \"Http Proxy Username\",\n+                                \"displayName\": \"Http Proxy Username\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Http Proxy Username\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Ignore Dotted Files\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"BCFKS\",\n-                                        \"value\": \"BCFKS\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"PKCS12\",\n-                                        \"value\": \"PKCS12\"\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"JKS\",\n-                                        \"value\": \"JKS\"\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"description\": \"The Type of the Truststore\",\n-                                \"displayName\": \"Truststore Type\",\n+                                \"defaultValue\": \"true\",\n+                                \"description\": \"If true, files whose names begin with a dot (\\\".\\\") will be ignored\",\n+                                \"displayName\": \"Ignore Dotted Files\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Truststore Type\",\n-                                \"required\": false,\n+                                \"name\": \"Ignore Dotted Files\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"key-password\": {\n-                                \"description\": \"The password for the key. If this is not specified, but the Keystore Filename, Password, and Type are specified, then the Keystore Password will be assumed to be the same as the Key Password.\",\n-                                \"displayName\": \"Key Password\",\n+                            \"Key Algorithms Allowed\": {\n+                                \"description\": \"A comma-separated list of Key Algorithms allowed for SFTP connections. Leave unset to allow all. Available options are: ecdsa-sha2-nistp256, ecdsa-sha2-nistp256-cert-v01@openssh.com, ecdsa-sha2-nistp384, ecdsa-sha2-nistp384-cert-v01@openssh.com, ecdsa-sha2-nistp521, ecdsa-sha2-nistp521-cert-v01@openssh.com, rsa-sha2-256, rsa-sha2-512, ssh-dss, ssh-dss-cert-v01@openssh.com, ssh-ed25519, ssh-ed25519-cert-v01@openssh.com, ssh-rsa, ssh-rsa-cert-v01@openssh.com\",\n+                                \"displayName\": \"Key Algorithms Allowed\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"key-password\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Key Algorithms Allowed\",\n                                 \"required\": false,\n-                                \"sensitive\": true\n-                            }\n-                        },\n-                        \"providedApiImplementations\": [\n-                            {\n-                                \"artifact\": \"nifi-standard-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n-                                \"version\": \"1.27.0\"\n+                                \"sensitive\": false\n                             },\n-                            {\n-                                \"artifact\": \"nifi-standard-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.ssl.RestrictedSSLContextService\",\n-                                \"version\": \"1.27.0\"\n-                            }\n-                        ],\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"certificate\",\n-                            \"jks\",\n-                            \"keystore\",\n-                            \"p12\",\n-                            \"pkcs\",\n-                            \"pkcs12\",\n-                            \"secure\",\n-                            \"ssl\",\n-                            \"tls\",\n-                            \"truststore\"\n-                        ],\n-                        \"type\": \"org.apache.nifi.ssl.StandardRestrictedSSLContextService\",\n-                        \"typeDescription\": \"Restricted implementation of the SSLContextService. Provides the ability to configure keystore and/or truststore properties once and reuse that configuration throughout the application, but only allows a restricted set of TLS/SSL protocols to be chosen (no SSL protocols are supported). The set of protocols selectable will evolve over time as new protocols emerge and older protocols are deprecated. This service is recommended over StandardSSLContextService if a component doesn't expect to communicate with legacy systems since it is unlikely that legacy systems will support these protocols.\",\n-                        \"version\": \"1.27.0\"\n-                    },\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-ssl-context-service-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"e0c4461\"\n-                        },\n-                        \"group\": \"org.apache.nifi\",\n-                        \"propertyDescriptors\": {\n-                            \"Keystore Filename\": {\n-                                \"description\": \"The fully-qualified filename of the Keystore\",\n-                                \"displayName\": \"Keystore Filename\",\n+                            \"Key Exchange Algorithms Allowed\": {\n+                                \"description\": \"A comma-separated list of Key Exchange Algorithms allowed for SFTP connections. Leave unset to allow all. Available options are: curve25519-sha256, curve25519-sha256@libssh.org, diffie-hellman-group-exchange-sha1, diffie-hellman-group-exchange-sha256, diffie-hellman-group1-sha1, diffie-hellman-group14-sha1, diffie-hellman-group14-sha256, diffie-hellman-group14-sha256@ssh.com, diffie-hellman-group15-sha256, diffie-hellman-group15-sha256@ssh.com, diffie-hellman-group15-sha384@ssh.com, diffie-hellman-group15-sha512, diffie-hellman-group16-sha256, diffie-hellman-group16-sha384@ssh.com, diffie-hellman-group16-sha512, diffie-hellman-group16-sha512@ssh.com, diffie-hellman-group17-sha512, diffie-hellman-group18-sha512, diffie-hellman-group18-sha512@ssh.com, ecdh-sha2-nistp256, ecdh-sha2-nistp384, ecdh-sha2-nistp521, ext-info-c\",\n+                                \"displayName\": \"Key Exchange Algorithms Allowed\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Keystore Filename\",\n+                                \"name\": \"Key Exchange Algorithms Allowed\",\n                                 \"required\": false,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"SINGLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\"\n-                                    ]\n-                                },\n                                 \"sensitive\": false\n                             },\n-                            \"Keystore Password\": {\n-                                \"description\": \"The password for the Keystore\",\n-                                \"displayName\": \"Keystore Password\",\n+                            \"Max Selects\": {\n+                                \"defaultValue\": \"100\",\n+                                \"description\": \"The maximum number of files to pull in a single connection\",\n+                                \"displayName\": \"Max Selects\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Keystore Password\",\n+                                \"name\": \"Max Selects\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Message Authentication Codes Allowed\": {\n+                                \"description\": \"A comma-separated list of Message Authentication Codes allowed for SFTP connections. Leave unset to allow all. Available options are: hmac-md5, hmac-md5-96, hmac-md5-96-etm@openssh.com, hmac-md5-etm@openssh.com, hmac-ripemd160, hmac-ripemd160-96, hmac-ripemd160-etm@openssh.com, hmac-ripemd160@openssh.com, hmac-sha1, hmac-sha1-96, hmac-sha1-96@openssh.com, hmac-sha1-etm@openssh.com, hmac-sha2-256, hmac-sha2-256-etm@openssh.com, hmac-sha2-512, hmac-sha2-512-etm@openssh.com\",\n+                                \"displayName\": \"Message Authentication Codes Allowed\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Message Authentication Codes Allowed\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Password\": {\n+                                \"description\": \"Password for the user account\",\n+                                \"displayName\": \"Password\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Password\",\n                                 \"required\": false,\n                                 \"sensitive\": true\n                             },\n-                            \"Keystore Type\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"BCFKS\",\n-                                        \"value\": \"BCFKS\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"PKCS12\",\n-                                        \"value\": \"PKCS12\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"JKS\",\n-                                        \"value\": \"JKS\"\n-                                    }\n-                                ],\n-                                \"description\": \"The Type of the Keystore\",\n-                                \"displayName\": \"Keystore Type\",\n+                            \"Path Filter Regex\": {\n+                                \"description\": \"When Search Recursively is true, then only subdirectories whose path matches the given Regular Expression will be scanned\",\n+                                \"displayName\": \"Path Filter Regex\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Keystore Type\",\n+                                \"name\": \"Path Filter Regex\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"SSL Protocol\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"Negotiate latest SSL or TLS protocol version based on platform supported versions\",\n-                                        \"displayName\": \"SSL\",\n-                                        \"value\": \"SSL\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Negotiate latest TLS protocol version based on platform supported versions\",\n-                                        \"displayName\": \"TLS\",\n-                                        \"value\": \"TLS\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Require TLSv1.3 protocol version\",\n-                                        \"displayName\": \"TLSv1.3\",\n-                                        \"value\": \"TLSv1.3\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Require TLSv1.2 protocol version\",\n-                                        \"displayName\": \"TLSv1.2\",\n-                                        \"value\": \"TLSv1.2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Require TLSv1.1 protocol version\",\n-                                        \"displayName\": \"TLSv1.1\",\n-                                        \"value\": \"TLSv1.1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Require TLSv1 protocol version\",\n-                                        \"displayName\": \"TLSv1\",\n-                                        \"value\": \"TLSv1\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"TLS\",\n-                                \"description\": \"SSL or TLS Protocol Version for encrypted connections. Supported versions include insecure legacy options and depend on the specific version of Java used.\",\n-                                \"displayName\": \"TLS Protocol\",\n+                            \"Polling Interval\": {\n+                                \"defaultValue\": \"60 sec\",\n+                                \"description\": \"Determines how long to wait between fetching the listing for new files\",\n+                                \"displayName\": \"Polling Interval\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"SSL Protocol\",\n-                                \"required\": false,\n+                                \"name\": \"Polling Interval\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Truststore Filename\": {\n-                                \"description\": \"The fully-qualified filename of the Truststore\",\n-                                \"displayName\": \"Truststore Filename\",\n+                            \"Port\": {\n+                                \"defaultValue\": \"22\",\n+                                \"description\": \"The port that the remote system is listening on for file transfers\",\n+                                \"displayName\": \"Port\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Truststore Filename\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Port\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Private Key Passphrase\": {\n+                                \"description\": \"Password for the private key\",\n+                                \"displayName\": \"Private Key Passphrase\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Private Key Passphrase\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n+                            },\n+                            \"Private Key Path\": {\n+                                \"description\": \"The fully qualified path to the Private Key file\",\n+                                \"displayName\": \"Private Key Path\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Private Key Path\",\n                                 \"required\": false,\n                                 \"resourceDefinition\": {\n                                     \"cardinality\": \"SINGLE\",\n                                     \"resourceTypes\": [\n                                         \"FILE\"\n                                     ]\n                                 },\n                                 \"sensitive\": false\n                             },\n-                            \"Truststore Password\": {\n-                                \"description\": \"The password for the Truststore\",\n-                                \"displayName\": \"Truststore Password\",\n+                            \"Proxy Host\": {\n+                                \"description\": \"The fully qualified hostname or IP address of the proxy server\",\n+                                \"displayName\": \"Proxy Host\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Truststore Password\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Proxy Host\",\n                                 \"required\": false,\n-                                \"sensitive\": true\n+                                \"sensitive\": false\n                             },\n-                            \"Truststore Type\": {\n+                            \"Proxy Port\": {\n+                                \"description\": \"The port of the proxy server\",\n+                                \"displayName\": \"Proxy Port\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Proxy Port\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Proxy Type\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"BCFKS\",\n-                                        \"value\": \"BCFKS\"\n+                                        \"displayName\": \"DIRECT\",\n+                                        \"value\": \"DIRECT\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"PKCS12\",\n-                                        \"value\": \"PKCS12\"\n+                                        \"displayName\": \"HTTP\",\n+                                        \"value\": \"HTTP\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"JKS\",\n-                                        \"value\": \"JKS\"\n+                                        \"displayName\": \"SOCKS\",\n+                                        \"value\": \"SOCKS\"\n                                     }\n                                 ],\n-                                \"description\": \"The Type of the Truststore\",\n-                                \"displayName\": \"Truststore Type\",\n+                                \"defaultValue\": \"DIRECT\",\n+                                \"description\": \"Proxy type used for file transfers\",\n+                                \"displayName\": \"Proxy Type\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Truststore Type\",\n+                                \"name\": \"Proxy Type\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"key-password\": {\n-                                \"description\": \"The password for the key. If this is not specified, but the Keystore Filename, Password, and Type are specified, then the Keystore Password will be assumed to be the same as the Key Password.\",\n-                                \"displayName\": \"Key Password\",\n+                            \"Remote Path\": {\n+                                \"description\": \"The path on the remote system from which to pull or push files\",\n+                                \"displayName\": \"Remote Path\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"key-password\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Remote Path\",\n                                 \"required\": false,\n-                                \"sensitive\": true\n-                            }\n-                        },\n-                        \"providedApiImplementations\": [\n-                            {\n-                                \"artifact\": \"nifi-standard-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n-                                \"version\": \"1.27.0\"\n-                            }\n-                        ],\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"certificate\",\n-                            \"jks\",\n-                            \"keystore\",\n-                            \"p12\",\n-                            \"pkcs\",\n-                            \"pkcs12\",\n-                            \"secure\",\n-                            \"ssl\",\n-                            \"tls\",\n-                            \"truststore\"\n-                        ],\n-                        \"type\": \"org.apache.nifi.ssl.StandardSSLContextService\",\n-                        \"typeDescription\": \"Standard implementation of the SSLContextService. Provides the ability to configure keystore and/or truststore properties once and reuse that configuration throughout the application. This service can be used to communicate with both legacy and modern systems. If you only need to communicate with non-legacy systems, then the StandardRestrictedSSLContextService is recommended as it only allows a specific set of SSL protocols to be chosen.\",\n-                        \"version\": \"1.27.0\"\n-                    }\n-                ],\n-                \"processors\": [],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"1.27.0\"\n-        },\n-        {\n-            \"artifact\": \"nifi-email-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [],\n-                \"processors\": [\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-email-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"e0c4461\"\n-                        },\n-                        \"defaultBulletinLevel\": \"WARN\",\n-                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": 1,\n-                            \"TIMER_DRIVEN\": 1\n-                        },\n-                        \"defaultPenaltyDuration\": \"30 sec\",\n-                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"0 sec\"\n-                        },\n-                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n-                        \"defaultYieldDuration\": \"1 sec\",\n-                        \"deprecated\": true,\n-                        \"deprecationReason\": \"The supporting ews-java-api library is no longer maintained\",\n-                        \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n-                        \"primaryNodeOnly\": false,\n-                        \"propertyDescriptors\": {\n-                            \"connection.timeout\": {\n-                                \"defaultValue\": \"30 sec\",\n-                                \"description\": \"The amount of time to wait to connect to Email server\",\n-                                \"displayName\": \"Connection timeout\",\n+                                \"sensitive\": false\n+                            },\n+                            \"Remote Poll Batch Size\": {\n+                                \"defaultValue\": \"5000\",\n+                                \"description\": \"The value specifies how many file paths to find in a given directory on the remote system when doing a file listing. This value in general should not need to be modified but when polling against a remote system with a tremendous number of files this value can be critical.  Setting this value too high can result very poor performance and setting it too low can cause the flow to be slower than normal.\",\n+                                \"displayName\": \"Remote Poll Batch Size\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"connection.timeout\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Remote Poll Batch Size\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"delete.messages\": {\n+                            \"Search Recursively\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"true\",\n                                         \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"false\",\n                                         \"value\": \"false\"\n                                     }\n                                 ],\n                                 \"defaultValue\": \"false\",\n-                                \"description\": \"Specify whether mail messages should be deleted after retrieval.\",\n-                                \"displayName\": \"Delete Messages\",\n+                                \"description\": \"If true, will pull files from arbitrarily nested subdirectories; otherwise, will not traverse subdirectories\",\n+                                \"displayName\": \"Search Recursively\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"delete.messages\",\n+                                \"name\": \"Search Recursively\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"ews-autodiscover\": {\n+                            \"Send Keep Alive On Timeout\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"true\",\n                                         \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"false\",\n                                         \"value\": \"false\"\n                                     }\n                                 ],\n                                 \"defaultValue\": \"true\",\n-                                \"description\": \"Whether or not to use the Exchange email address to Autodiscover the EWS endpoint URL.\",\n-                                \"displayName\": \"Auto Discover URL\",\n+                                \"description\": \"Send a Keep Alive message every 5 seconds up to 5 times for an overall timeout of 25 seconds.\",\n+                                \"displayName\": \"Send Keep Alive On Timeout\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"ews-autodiscover\",\n+                                \"name\": \"Send Keep Alive On Timeout\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"ews-exclude-headers\": {\n-                                \"defaultValue\": \"\",\n-                                \"description\": \"Comma delimited list specifying which headers from the original message to exclude in the exported email message. Blank means don't exclude any headers.\",\n-                                \"displayName\": \"Original Headers to Exclude\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"ews-exclude-headers\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"ews-include-headers\": {\n-                                \"defaultValue\": \"\",\n-                                \"description\": \"Comma delimited list specifying which headers from the original message to include in the exported email message. Blank means copy all headers. Some headers can cause problems with message parsing, specifically the 'Content-Type' header.\",\n-                                \"displayName\": \"Original Headers to Include\",\n+                            \"Strict Host Key Checking\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"Indicates whether or not strict enforcement of hosts keys should be applied\",\n+                                \"displayName\": \"Strict Host Key Checking\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"ews-include-headers\",\n-                                \"required\": false,\n+                                \"name\": \"Strict Host Key Checking\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"ews-mark-as-read\": {\n+                            \"Use Compression\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"true\",\n                                         \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"false\",\n                                         \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"true\",\n-                                \"description\": \"Specify if messages should be marked as read after retrieval.\",\n-                                \"displayName\": \"Mark Messages as Read\",\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"Indicates whether or not ZLIB compression should be used when transferring files\",\n+                                \"displayName\": \"Use Compression\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"ews-mark-as-read\",\n+                                \"name\": \"Use Compression\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"ews-url\": {\n-                                \"description\": \"URL of the EWS Endpoint. Required if Autodiscover is false.\",\n-                                \"displayName\": \"EWS URL\",\n+                            \"Use Natural Ordering\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"If true, will pull files in the order in which they are naturally listed; otherwise, the order in which the files will be pulled is not defined\",\n+                                \"displayName\": \"Use Natural Ordering\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"ews-url\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"fetch.size\": {\n-                                \"defaultValue\": \"10\",\n-                                \"description\": \"Specify the maximum number of Messages to fetch per call to Email Server.\",\n-                                \"displayName\": \"Fetch Size\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"fetch.size\",\n+                                \"name\": \"Use Natural Ordering\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"folder\": {\n-                                \"defaultValue\": \"INBOX\",\n-                                \"description\": \"Email folder to retrieve messages from (e.g., INBOX)\",\n-                                \"displayName\": \"Folder\",\n+                            \"Username\": {\n+                                \"description\": \"Username\",\n+                                \"displayName\": \"Username\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"folder\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Username\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"mail-ews-version\": {\n+                            \"follow-symlink\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"Exchange2007_SP1\",\n-                                        \"value\": \"Exchange2007_SP1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Exchange2010\",\n-                                        \"value\": \"Exchange2010\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Exchange2010_SP1\",\n-                                        \"value\": \"Exchange2010_SP1\"\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"Exchange2010_SP2\",\n-                                        \"value\": \"Exchange2010_SP2\"\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"Exchange2010_SP2\",\n-                                \"description\": \"What version of Exchange Server the server is running.\",\n-                                \"displayName\": \"Exchange Version\",\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"If true, will pull even symbolic files and also nested symbolic subdirectories; otherwise, will not read symbolic files and will not traverse symbolic link subdirectories\",\n+                                \"displayName\": \"Follow symlink\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"mail-ews-version\",\n+                                \"name\": \"follow-symlink\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"password\": {\n-                                \"description\": \"Password used for authentication and authorization with Email server.\",\n-                                \"displayName\": \"Password\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"password\",\n-                                \"required\": true,\n-                                \"sensitive\": true\n-                            },\n-                            \"user\": {\n-                                \"description\": \"User Name used for authentication and authorization with Email server.\",\n-                                \"displayName\": \"User Name\",\n+                            \"proxy-configuration-service\": {\n+                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests. If set, it supersedes proxy settings configured per component. Supported proxies: HTTP + AuthN, SOCKS + AuthN\",\n+                                \"displayName\": \"Proxy Configuration Service\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"user\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"proxy-configuration-service\",\n+                                \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.proxy.ProxyConfigurationService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n                             }\n                         },\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.processors.standard.PutSFTP\"\n+                        ],\n                         \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"All messages that are the are successfully received from Email server and converted to FlowFiles are routed to this relationship\",\n+                                \"description\": \"All FlowFiles that are received are routed to success\",\n                                 \"name\": \"success\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n                         \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"Consume\",\n-                            \"EWS\",\n-                            \"Email\",\n-                            \"Exchange\",\n-                            \"Get\",\n-                            \"Ingest\",\n-                            \"Ingress\",\n-                            \"Message\"\n+                            \"fetch\",\n+                            \"files\",\n+                            \"get\",\n+                            \"ingest\",\n+                            \"input\",\n+                            \"remote\",\n+                            \"retrieve\",\n+                            \"sftp\",\n+                            \"source\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.email.ConsumeEWS\",\n-                        \"typeDescription\": \"Consumes messages from Microsoft Exchange using Exchange Web Services. The raw-bytes of each received email message are written as contents of the FlowFile\",\n-                        \"version\": \"1.27.0\"\n+                        \"type\": \"org.apache.nifi.processors.standard.GetSFTP\",\n+                        \"typeDescription\": \"Fetches files from an SFTP Server and creates FlowFiles from them\",\n+                        \"version\": \"1.27.0\",\n+                        \"writesAttributes\": [\n+                            {\n+                                \"description\": \"The filename is set to the name of the file on the remote server\",\n+                                \"name\": \"filename\"\n+                            },\n+                            {\n+                                \"description\": \"The path is set to the path of the file's directory on the remote server. For example, if the <Remote Path> property is set to /tmp, files picked up from /tmp will have the path attribute set to /tmp. If the <Search Recursively> property is set to true and a file is picked up from /tmp/abc/1/2/3, then the path attribute will be set to /tmp/abc/1/2/3\",\n+                                \"name\": \"path\"\n+                            },\n+                            {\n+                                \"description\": \"The date and time that the source file was last modified\",\n+                                \"name\": \"file.lastModifiedTime\"\n+                            },\n+                            {\n+                                \"description\": \"The numeric owner id of the source file\",\n+                                \"name\": \"file.owner\"\n+                            },\n+                            {\n+                                \"description\": \"The numeric group id of the source file\",\n+                                \"name\": \"file.group\"\n+                            },\n+                            {\n+                                \"description\": \"The read/write/execute permissions of the source file\",\n+                                \"name\": \"file.permissions\"\n+                            },\n+                            {\n+                                \"description\": \"The full/absolute path from where a file was picked up. The current 'path' attribute is still populated, but may be a relative path\",\n+                                \"name\": \"absolute.path\"\n+                            }\n+                        ]\n                     },\n                     {\n                         \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-email-nar\",\n+                        \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -88764,249 +87161,508 @@\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_FORBIDDEN\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Mark Messages as Read\": {\n+                            \"Additional HTTP Methods\": {\n+                                \"description\": \"A comma-separated list of non-standard HTTP Methods that should be allowed\",\n+                                \"displayName\": \"Additional HTTP Methods\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Additional HTTP Methods\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Allow DELETE\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"true\",\n                                         \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"false\",\n                                         \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"Specify if messages should be marked as read after retrieval.\",\n-                                \"displayName\": \"Mark Messages as Read\",\n+                                \"defaultValue\": \"true\",\n+                                \"description\": \"Allow HTTP DELETE Method\",\n+                                \"displayName\": \"Allow DELETE\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Mark Messages as Read\",\n+                                \"name\": \"Allow DELETE\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Use SSL\": {\n+                            \"Allow GET\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"true\",\n                                         \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"false\",\n                                         \"value\": \"false\"\n                                     }\n                                 ],\n                                 \"defaultValue\": \"true\",\n-                                \"description\": \"Specifies if IMAP connection must be obtained via SSL encrypted connection (i.e., IMAPS)\",\n-                                \"displayName\": \"Use SSL\",\n+                                \"description\": \"Allow HTTP GET Method\",\n+                                \"displayName\": \"Allow GET\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Use SSL\",\n+                                \"name\": \"Allow GET\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"authorization-mode\": {\n+                            \"Allow HEAD\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Use password\",\n-                                        \"displayName\": \"Use Password\",\n-                                        \"value\": \"password-based-authorization-mode\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n-                                        \"description\": \"Use OAuth2 to acquire access token\",\n-                                        \"displayName\": \"Use OAuth2\",\n-                                        \"value\": \"oauth-based-authorization-mode\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"password-based-authorization-mode\",\n-                                \"description\": \"How to authorize sending email on the user's behalf.\",\n-                                \"displayName\": \"Authorization Mode\",\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"Allow HTTP HEAD Method\",\n+                                \"displayName\": \"Allow HEAD\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"authorization-mode\",\n+                                \"name\": \"Allow HEAD\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"connection.timeout\": {\n-                                \"defaultValue\": \"30 sec\",\n-                                \"description\": \"The amount of time to wait to connect to Email server\",\n-                                \"displayName\": \"Connection timeout\",\n+                            \"Allow OPTIONS\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"Allow HTTP OPTIONS Method\",\n+                                \"displayName\": \"Allow OPTIONS\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"connection.timeout\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Allow OPTIONS\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"delete.messages\": {\n+                            \"Allow POST\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"true\",\n                                         \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"false\",\n                                         \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"Specify whether mail messages should be deleted after retrieval.\",\n-                                \"displayName\": \"Delete Messages\",\n+                                \"defaultValue\": \"true\",\n+                                \"description\": \"Allow HTTP POST Method\",\n+                                \"displayName\": \"Allow POST\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"delete.messages\",\n+                                \"name\": \"Allow POST\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"fetch.size\": {\n-                                \"defaultValue\": \"10\",\n-                                \"description\": \"Specify the maximum number of Messages to fetch per call to Email Server.\",\n-                                \"displayName\": \"Fetch Size\",\n+                            \"Allow PUT\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"true\",\n+                                \"description\": \"Allow HTTP PUT Method\",\n+                                \"displayName\": \"Allow PUT\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"fetch.size\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Allow PUT\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"folder\": {\n-                                \"defaultValue\": \"INBOX\",\n-                                \"description\": \"Email folder to retrieve messages from (e.g., INBOX)\",\n-                                \"displayName\": \"Folder\",\n+                            \"Allowed Paths\": {\n+                                \"description\": \"A Regular Expression that specifies the valid HTTP Paths that are allowed in the incoming URL Requests. If this value is specified and the path of the HTTP Requests does not match this Regular Expression, the Processor will respond with a 404: NotFound\",\n+                                \"displayName\": \"Allowed Paths\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"folder\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Allowed Paths\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Client Authentication\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"Processor will not authenticate clients. Anyone can communicate with this Processor anonymously\",\n+                                        \"displayName\": \"No Authentication\",\n+                                        \"value\": \"No Authentication\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Processor will try to verify the client but if unable to verify will allow the client to communicate anonymously\",\n+                                        \"displayName\": \"Want Authentication\",\n+                                        \"value\": \"Want Authentication\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Processor will reject communications from any client unless the client provides a certificate that is trusted by the TrustStorespecified in the SSL Context Service\",\n+                                        \"displayName\": \"Need Authentication\",\n+                                        \"value\": \"Need Authentication\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"No Authentication\",\n+                                \"description\": \"Specifies whether or not the Processor should authenticate clients. This value is ignored if the <SSL Context Service> Property is not specified or the SSL Context provided uses only a KeyStore and not a TrustStore.\",\n+                                \"displayName\": \"Client Authentication\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Client Authentication\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"host\": {\n-                                \"description\": \"Network address of Email server (e.g., pop.gmail.com, imap.gmail.com . . .)\",\n-                                \"displayName\": \"Host Name\",\n+                            \"Default URL Character Set\": {\n+                                \"defaultValue\": \"UTF-8\",\n+                                \"description\": \"The character set to use for decoding URL parameters if the HTTP Request does not supply one\",\n+                                \"displayName\": \"Default URL Character Set\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"host\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Default URL Character Set\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"oauth2-access-token-provider\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"oauth-based-authorization-mode\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Authorization Mode\",\n-                                        \"propertyName\": \"authorization-mode\"\n-                                    }\n-                                ],\n-                                \"description\": \"OAuth2 service that can provide access tokens.\",\n-                                \"displayName\": \"OAuth2 Access Token Provider\",\n+                            \"HTTP Context Map\": {\n+                                \"description\": \"The HTTP Context Map Controller Service to use for caching the HTTP Request Information\",\n+                                \"displayName\": \"HTTP Context Map\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"oauth2-access-token-provider\",\n+                                \"name\": \"HTTP Context Map\",\n                                 \"required\": true,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n                                     \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.oauth2.OAuth2AccessTokenProvider\",\n+                                    \"type\": \"org.apache.nifi.http.HttpContextMap\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             },\n-                            \"password\": {\n+                            \"HTTP Protocols\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"HTTP/1.1\",\n+                                        \"displayName\": \"http/1.1\",\n+                                        \"value\": \"HTTP_1_1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"HTTP/2 and HTTP/1.1 negotiated based on requested protocols\",\n+                                        \"displayName\": \"h2 http/1.1\",\n+                                        \"value\": \"H2_HTTP_1_1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"HTTP/2\",\n+                                        \"displayName\": \"h2\",\n+                                        \"value\": \"H2\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"HTTP_1_1\",\n                                 \"dependencies\": [\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"password-based-authorization-mode\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Authorization Mode\",\n-                                        \"propertyName\": \"authorization-mode\"\n+                                        \"propertyDisplayName\": \"SSL Context Service\",\n+                                        \"propertyName\": \"SSL Context Service\"\n                                     }\n                                 ],\n-                                \"description\": \"Password used for authentication and authorization with Email server.\",\n-                                \"displayName\": \"Password\",\n+                                \"description\": \"HTTP Protocols supported for Application Layer Protocol Negotiation with TLS\",\n+                                \"displayName\": \"HTTP Protocols\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"password\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"HTTP Protocols\",\n                                 \"required\": true,\n-                                \"sensitive\": true\n+                                \"sensitive\": false\n                             },\n-                            \"port\": {\n-                                \"description\": \"Numeric value identifying Port of Email server (e.g., 993)\",\n-                                \"displayName\": \"Port\",\n+                            \"Hostname\": {\n+                                \"description\": \"The Hostname to bind to. If not specified, will bind to all hosts\",\n+                                \"displayName\": \"Hostname\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Hostname\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Listening Port\": {\n+                                \"defaultValue\": \"80\",\n+                                \"description\": \"The Port to listen on for incoming HTTP requests\",\n+                                \"displayName\": \"Listening Port\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"port\",\n+                                \"name\": \"Listening Port\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"user\": {\n-                                \"description\": \"User Name used for authentication and authorization with Email server.\",\n-                                \"displayName\": \"User Name\",\n+                            \"Maximum Threads\": {\n+                                \"defaultValue\": \"200\",\n+                                \"description\": \"The maximum number of threads that the embedded HTTP server will use for handling requests.\",\n+                                \"displayName\": \"Maximum Threads\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"user\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Maximum Threads\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"SSL Context Service\": {\n+                                \"description\": \"The SSL Context Service to use in order to secure the server. If specified, the server will accept only HTTPS requests; otherwise, the server will accept only HTTP requests\",\n+                                \"displayName\": \"SSL Context Service\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"SSL Context Service\",\n+                                \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.ssl.RestrictedSSLContextService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"container-queue-size\": {\n+                                \"defaultValue\": \"50\",\n+                                \"description\": \"The size of the queue for Http Request Containers\",\n+                                \"displayName\": \"Container Queue Size\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"container-queue-size\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"multipart-read-buffer-size\": {\n+                                \"defaultValue\": \"512 KB\",\n+                                \"description\": \"The threshold size, at which the contents of an incoming file would be written to disk. Only applies for requests with Content-Type: multipart/form-data. It is used to prevent denial of service type of attacks, to prevent filling up the heap or disk space.\",\n+                                \"displayName\": \"Multipart Read Buffer Size\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"multipart-read-buffer-size\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"multipart-request-max-size\": {\n+                                \"defaultValue\": \"1 MB\",\n+                                \"description\": \"The max size of the request. Only applies for requests with Content-Type: multipart/form-data, and is used to prevent denial of service type of attacks, to prevent filling up the heap or disk space\",\n+                                \"displayName\": \"Multipart Request Max Size\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"multipart-request-max-size\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n+                            },\n+                            \"parameters-to-attributes\": {\n+                                \"description\": \"A comma-separated list of HTTP parameters or form data to output as attributes\",\n+                                \"displayName\": \"Parameters to Attributes List\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"parameters-to-attributes\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n                             }\n                         },\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.processors.standard.HandleHttpResponse\"\n+                        ],\n                         \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"All messages that are the are successfully received from Email server and converted to FlowFiles are routed to this relationship\",\n+                                \"description\": \"All content that is received is routed to the 'success' relationship\",\n                                 \"name\": \"success\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n                         \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"Consume\",\n-                            \"Email\",\n-                            \"Get\",\n-                            \"Imap\",\n-                            \"Ingest\",\n-                            \"Ingress\",\n-                            \"Message\"\n+                            \"http\",\n+                            \"https\",\n+                            \"ingress\",\n+                            \"listen\",\n+                            \"request\",\n+                            \"web service\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.email.ConsumeIMAP\",\n-                        \"typeDescription\": \"Consumes messages from Email Server using IMAP protocol. The raw-bytes of each received email message are written as contents of the FlowFile\",\n-                        \"version\": \"1.27.0\"\n+                        \"type\": \"org.apache.nifi.processors.standard.HandleHttpRequest\",\n+                        \"typeDescription\": \"Starts an HTTP Server and listens for HTTP Requests. For each request, creates a FlowFile and transfers to 'success'. This Processor is designed to be used in conjunction with the HandleHttpResponse Processor in order to create a Web Service. In case  of a multipart request, one FlowFile is generated for each part.\",\n+                        \"version\": \"1.27.0\",\n+                        \"writesAttributes\": [\n+                            {\n+                                \"description\": \"An identifier that allows the HandleHttpRequest and HandleHttpResponse to coordinate which FlowFile belongs to which HTTP Request/Response.\",\n+                                \"name\": \"http.context.identifier\"\n+                            },\n+                            {\n+                                \"description\": \"The MIME Type of the data, according to the HTTP Header \\\"Content-Type\\\"\",\n+                                \"name\": \"mime.type\"\n+                            },\n+                            {\n+                                \"description\": \"The part of the request URL that is considered the Servlet Path\",\n+                                \"name\": \"http.servlet.path\"\n+                            },\n+                            {\n+                                \"description\": \"The part of the request URL that is considered to be the Context Path\",\n+                                \"name\": \"http.context.path\"\n+                            },\n+                            {\n+                                \"description\": \"The HTTP Method that was used for the request, such as GET or POST\",\n+                                \"name\": \"http.method\"\n+                            },\n+                            {\n+                                \"description\": \"IP address/hostname of the server\",\n+                                \"name\": \"http.local.name\"\n+                            },\n+                            {\n+                                \"description\": \"Listening port of the server\",\n+                                \"name\": \"http.server.port\"\n+                            },\n+                            {\n+                                \"description\": \"The query string portion of the Request URL\",\n+                                \"name\": \"http.query.string\"\n+                            },\n+                            {\n+                                \"description\": \"The hostname of the requestor\",\n+                                \"name\": \"http.remote.host\"\n+                            },\n+                            {\n+                                \"description\": \"The hostname:port combination of the requestor\",\n+                                \"name\": \"http.remote.addr\"\n+                            },\n+                            {\n+                                \"description\": \"The username of the requestor\",\n+                                \"name\": \"http.remote.user\"\n+                            },\n+                            {\n+                                \"description\": \"The protocol used to communicate\",\n+                                \"name\": \"http.protocol\"\n+                            },\n+                            {\n+                                \"description\": \"The full Request URL\",\n+                                \"name\": \"http.request.uri\"\n+                            },\n+                            {\n+                                \"description\": \"The type of HTTP Authorization used\",\n+                                \"name\": \"http.auth.type\"\n+                            },\n+                            {\n+                                \"description\": \"The name of the authenticated user making the request\",\n+                                \"name\": \"http.principal.name\"\n+                            },\n+                            {\n+                                \"description\": \"Each of query parameters in the request will be added as an attribute, prefixed with \\\"http.query.param.\\\"\",\n+                                \"name\": \"http.query.param.XXX\"\n+                            },\n+                            {\n+                                \"description\": \"Form parameters in the request that are configured by \\\"Parameters to Attributes List\\\" will be added as an attribute, prefixed with \\\"http.param.\\\". Putting form parameters of large size is not recommended.\",\n+                                \"name\": \"http.param.XXX\"\n+                            },\n+                            {\n+                                \"description\": \"The Distinguished Name of the requestor. This value will not be populated unless the Processor is configured to use an SSLContext Service\",\n+                                \"name\": \"http.subject.dn\"\n+                            },\n+                            {\n+                                \"description\": \"The Distinguished Name of the entity that issued the Subject's certificate. This value will not be populated unless the Processor is configured to use an SSLContext Service\",\n+                                \"name\": \"http.issuer.dn\"\n+                            },\n+                            {\n+                                \"description\": \"X.509 Client Certificate Subject Alternative Name value from mutual TLS authentication. The attribute name has a zero-based index ordered according to the content of Client Certificate\",\n+                                \"name\": \"http.certificate.sans.N.name\"\n+                            },\n+                            {\n+                                \"description\": \"X.509 Client Certificate Subject Alternative Name type from mutual TLS authentication. The attribute name has a zero-based index ordered according to the content of Client Certificate. The attribute value is one of the General Names from RFC 3280 Section 4.1.2.7\",\n+                                \"name\": \"http.certificate.sans.N.nameType\"\n+                            },\n+                            {\n+                                \"description\": \"Each of the HTTP Headers that is received in the request will be added as an attribute, prefixed with \\\"http.headers.\\\" For example, if the request contains an HTTP Header named \\\"x-my-header\\\", then the value will be added to an attribute named \\\"http.headers.x-my-header\\\"\",\n+                                \"name\": \"http.headers.XXX\"\n+                            },\n+                            {\n+                                \"description\": \"Each of the HTTP Headers that is received in the multipart request will be added as an attribute, prefixed with \\\"http.headers.multipart.\\\" For example, if the multipart request contains an HTTP Header named \\\"content-disposition\\\", then the value will be added to an attribute named \\\"http.headers.multipart.content-disposition\\\"\",\n+                                \"name\": \"http.headers.multipart.XXX\"\n+                            },\n+                            {\n+                                \"description\": \"For requests with Content-Type \\\"multipart/form-data\\\", the part's content size is recorded into this attribute\",\n+                                \"name\": \"http.multipart.size\"\n+                            },\n+                            {\n+                                \"description\": \"For requests with Content-Type \\\"multipart/form-data\\\", the part's content type is recorded into this attribute\",\n+                                \"name\": \"http.multipart.content.type\"\n+                            },\n+                            {\n+                                \"description\": \"For requests with Content-Type \\\"multipart/form-data\\\", the part's name is recorded into this attribute\",\n+                                \"name\": \"http.multipart.name\"\n+                            },\n+                            {\n+                                \"description\": \"For requests with Content-Type \\\"multipart/form-data\\\", when the part contains an uploaded file, the name of the file is recorded into this attribute. Files are stored temporarily at the default temporary-file directory specified in \\\"java.io.File\\\" Java Docs)\",\n+                                \"name\": \"http.multipart.filename\"\n+                            },\n+                            {\n+                                \"description\": \"For requests with Content-Type \\\"multipart/form-data\\\", the part's index is recorded into this attribute. The index starts with 1.\",\n+                                \"name\": \"http.multipart.fragments.sequence.number\"\n+                            },\n+                            {\n+                                \"description\": \"For requests with Content-Type \\\"multipart/form-data\\\", the count of all parts is recorded into this attribute.\",\n+                                \"name\": \"http.multipart.fragments.total.number\"\n+                            }\n+                        ]\n                     },\n                     {\n                         \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-email-nar\",\n+                        \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -89014,207 +87670,130 @@\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n+                        \"dynamicProperties\": [\n+                            {\n+                                \"description\": \"These HTTPHeaders are set in the HTTP Response\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"name\": \"An HTTP header name\",\n+                                \"value\": \"An HTTP header value\"\n+                            }\n+                        ],\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"authorization-mode\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"Use password\",\n-                                        \"displayName\": \"Use Password\",\n-                                        \"value\": \"password-based-authorization-mode\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Use OAuth2 to acquire access token\",\n-                                        \"displayName\": \"Use OAuth2\",\n-                                        \"value\": \"oauth-based-authorization-mode\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"password-based-authorization-mode\",\n-                                \"description\": \"How to authorize sending email on the user's behalf.\",\n-                                \"displayName\": \"Authorization Mode\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"authorization-mode\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"connection.timeout\": {\n-                                \"defaultValue\": \"30 sec\",\n-                                \"description\": \"The amount of time to wait to connect to Email server\",\n-                                \"displayName\": \"Connection timeout\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"connection.timeout\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"delete.messages\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"Specify whether mail messages should be deleted after retrieval.\",\n-                                \"displayName\": \"Delete Messages\",\n+                            \"Attributes to add to the HTTP Response (Regex)\": {\n+                                \"description\": \"Specifies the Regular Expression that determines the names of FlowFile attributes that should be added to the HTTP response\",\n+                                \"displayName\": \"Attributes to add to the HTTP Response (Regex)\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"delete.messages\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"fetch.size\": {\n-                                \"defaultValue\": \"10\",\n-                                \"description\": \"Specify the maximum number of Messages to fetch per call to Email Server.\",\n-                                \"displayName\": \"Fetch Size\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"fetch.size\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"folder\": {\n-                                \"defaultValue\": \"INBOX\",\n-                                \"description\": \"Email folder to retrieve messages from (e.g., INBOX)\",\n-                                \"displayName\": \"Folder\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"folder\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"host\": {\n-                                \"description\": \"Network address of Email server (e.g., pop.gmail.com, imap.gmail.com . . .)\",\n-                                \"displayName\": \"Host Name\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"host\",\n-                                \"required\": true,\n+                                \"name\": \"Attributes to add to the HTTP Response (Regex)\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"oauth2-access-token-provider\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"oauth-based-authorization-mode\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Authorization Mode\",\n-                                        \"propertyName\": \"authorization-mode\"\n-                                    }\n-                                ],\n-                                \"description\": \"OAuth2 service that can provide access tokens.\",\n-                                \"displayName\": \"OAuth2 Access Token Provider\",\n+                            \"HTTP Context Map\": {\n+                                \"description\": \"The HTTP Context Map Controller Service to use for caching the HTTP Request Information\",\n+                                \"displayName\": \"HTTP Context Map\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"oauth2-access-token-provider\",\n+                                \"name\": \"HTTP Context Map\",\n                                 \"required\": true,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n                                     \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.oauth2.OAuth2AccessTokenProvider\",\n+                                    \"type\": \"org.apache.nifi.http.HttpContextMap\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             },\n-                            \"password\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"password-based-authorization-mode\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Authorization Mode\",\n-                                        \"propertyName\": \"authorization-mode\"\n-                                    }\n-                                ],\n-                                \"description\": \"Password used for authentication and authorization with Email server.\",\n-                                \"displayName\": \"Password\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"password\",\n-                                \"required\": true,\n-                                \"sensitive\": true\n-                            },\n-                            \"port\": {\n-                                \"description\": \"Numeric value identifying Port of Email server (e.g., 993)\",\n-                                \"displayName\": \"Port\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"port\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"user\": {\n-                                \"description\": \"User Name used for authentication and authorization with Email server.\",\n-                                \"displayName\": \"User Name\",\n+                            \"HTTP Status Code\": {\n+                                \"description\": \"The HTTP Status Code to use when responding to the HTTP Request. See Section 10 of RFC 2616 for more information.\",\n+                                \"displayName\": \"HTTP Status Code\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"user\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"HTTP Status Code\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             }\n                         },\n+                        \"readsAttributes\": [\n+                            {\n+                                \"description\": \"The value of this attribute is used to lookup the HTTP Response so that the proper message can be sent back to the requestor. If this attribute is missing, the FlowFile will be routed to 'failure.'\",\n+                                \"name\": \"http.context.identifier\"\n+                            },\n+                            {\n+                                \"description\": \"Value of the URI requested by the client. Used for provenance event.\",\n+                                \"name\": \"http.request.uri\"\n+                            },\n+                            {\n+                                \"description\": \"IP address of the client. Used for provenance event.\",\n+                                \"name\": \"http.remote.host\"\n+                            },\n+                            {\n+                                \"description\": \"IP address/hostname of the server. Used for provenance event.\",\n+                                \"name\": \"http.local.name\"\n+                            },\n+                            {\n+                                \"description\": \"Listening port of the server. Used for provenance event.\",\n+                                \"name\": \"http.server.port\"\n+                            },\n+                            {\n+                                \"description\": \"SSL distinguished name (if any). Used for provenance event.\",\n+                                \"name\": \"http.subject.dn\"\n+                            }\n+                        ],\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.http.StandardHttpContextMap\",\n+                            \"org.apache.nifi.processors.standard.HandleHttpRequest\"\n+                        ],\n                         \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"All messages that are the are successfully received from Email server and converted to FlowFiles are routed to this relationship\",\n+                                \"description\": \"FlowFiles will be routed to this Relationship after the response has been successfully sent to the requestor\",\n                                 \"name\": \"success\"\n+                            },\n+                            {\n+                                \"description\": \"FlowFiles will be routed to this Relationship if the Processor is unable to respond to the requestor. This may happen, for instance, if the connection times out or if NiFi is restarted before responding to the HTTP Request.\",\n+                                \"name\": \"failure\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n                         \"supportsBatching\": false,\n-                        \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicProperties\": true,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"Consume\",\n-                            \"Email\",\n-                            \"Get\",\n-                            \"Ingest\",\n-                            \"Ingress\",\n-                            \"Message\",\n-                            \"POP3\"\n+                            \"egress\",\n+                            \"http\",\n+                            \"https\",\n+                            \"response\",\n+                            \"web service\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.email.ConsumePOP3\",\n-                        \"typeDescription\": \"Consumes messages from Email Server using POP3 protocol. The raw-bytes of each received email message are written as contents of the FlowFile\",\n+                        \"type\": \"org.apache.nifi.processors.standard.HandleHttpResponse\",\n+                        \"typeDescription\": \"Sends an HTTP Response to the Requestor that generated a FlowFile. This Processor is designed to be used in conjunction with the HandleHttpRequest in order to create a web service.\",\n                         \"version\": \"1.27.0\"\n                     },\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-email-nar\",\n+                        \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"EVENT_DRIVEN\": 0,\n@@ -89223,74 +87802,592 @@\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n+                        \"deprecated\": true,\n+                        \"deprecationAlternatives\": [\n+                            \"org.apache.nifi.processors.attributes.UpdateAttribute\"\n+                        ],\n+                        \"deprecationReason\": \"UpdateAttribute can be configured using the hash Expression Language function to digest one or more attributes\",\n+                        \"dynamicProperties\": [\n+                            {\n+                                \"description\": \"This regular expression is evaluated against the flowfile attribute values. If the regular expression contains a capturing group, the value of that group will be used when comparing flow file attributes. Otherwise, the original flow file attribute's value will be used if and only if the value matches the given regular expression.\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"name\": \"A flowfile attribute key for attribute inspection\",\n+                                \"value\": \"A Regular Expression\"\n+                            }\n+                        ],\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"primaryNodeOnly\": false,\n+                        \"propertyDescriptors\": {\n+                            \"Hash Value Attribute Key\": {\n+                                \"description\": \"The name of the flowfile attribute where the hash value should be stored\",\n+                                \"displayName\": \"Hash Value Attribute Key\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Hash Value Attribute Key\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            }\n+                        },\n                         \"sideEffectFree\": true,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"Flowfiles that could not be parsed\",\n-                                \"name\": \"failure\"\n-                            },\n-                            {\n-                                \"description\": \"The original file\",\n-                                \"name\": \"original\"\n+                                \"description\": \"Used for flowfiles that have a hash value added\",\n+                                \"name\": \"success\"\n                             },\n                             {\n-                                \"description\": \"Each individual attachment will be routed to the attachments relationship\",\n-                                \"name\": \"attachments\"\n+                                \"description\": \"Used for flowfiles that are missing required attributes\",\n+                                \"name\": \"failure\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\",\n                             \"EVENT_DRIVEN\"\n                         ],\n                         \"supportsBatching\": true,\n-                        \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicProperties\": true,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsEventDriven\": true,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"email\",\n-                            \"split\"\n+                            \"attributes\",\n+                            \"hash\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.email.ExtractEmailAttachments\",\n-                        \"typeDescription\": \"Extract attachments from a mime formatted email file, splitting them into individual flowfiles.\",\n+                        \"type\": \"org.apache.nifi.processors.standard.HashAttribute\",\n+                        \"typeDescription\": \"Hashes together the key/value pairs of several flowfile attributes and adds the hash as a new attribute. Optional properties are to be added such that the name of the property is the name of a flowfile attribute to consider and the value of the property is a regular expression that, if matched by the attribute value, will cause that attribute to be used as part of the hash. If the regular expression contains a capturing group, only the value of the capturing group will be used. For a processor which accepts various attributes and generates a cryptographic hash of each, see \\\"CryptographicHashAttribute\\\". \",\n                         \"version\": \"1.27.0\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"The filename of the attachment\",\n-                                \"name\": \"filename \"\n+                                \"description\": \"This Processor adds an attribute whose value is the result of Hashing the existing flowfile attributes. The name of this attribute is specified by the <Hash Value Attribute Key> property.\",\n+                                \"name\": \"<Hash Value Attribute Key>\"\n+                            }\n+                        ]\n+                    },\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-standard-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"e0c4461\"\n+                        },\n+                        \"defaultBulletinLevel\": \"WARN\",\n+                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": 1,\n+                            \"EVENT_DRIVEN\": 0,\n+                            \"TIMER_DRIVEN\": 1\n+                        },\n+                        \"defaultPenaltyDuration\": \"30 sec\",\n+                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": \"* * * * * ?\",\n+                            \"TIMER_DRIVEN\": \"0 sec\"\n+                        },\n+                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n+                        \"defaultYieldDuration\": \"1 sec\",\n+                        \"deprecated\": true,\n+                        \"deprecationAlternatives\": [\n+                            \"org.apache.nifi.processors.standard.CryptographicHashContent\"\n+                        ],\n+                        \"deprecationReason\": \"This processor is deprecated and may be removed in future releases.\",\n+                        \"group\": \"org.apache.nifi\",\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n+                        \"primaryNodeOnly\": false,\n+                        \"propertyDescriptors\": {\n+                            \"Hash Algorithm\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"1.0.10118.3.0.55\",\n+                                        \"value\": \"1.0.10118.3.0.55\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"SHA-1\",\n+                                        \"value\": \"SHA-1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"SHA-384\",\n+                                        \"value\": \"SHA-384\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"HARAKA-256\",\n+                                        \"value\": \"HARAKA-256\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"SKEIN-512-256\",\n+                                        \"value\": \"SKEIN-512-256\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"SKEIN-1024-384\",\n+                                        \"value\": \"SKEIN-1024-384\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"BLAKE3-256\",\n+                                        \"value\": \"BLAKE3-256\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"BLAKE2B-160\",\n+                                        \"value\": \"BLAKE2B-160\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"SHA\",\n+                                        \"value\": \"SHA\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"KECCAK-288\",\n+                                        \"value\": \"KECCAK-288\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"WHIRLPOOL\",\n+                                        \"value\": \"WHIRLPOOL\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"SKEIN-512-384\",\n+                                        \"value\": \"SKEIN-512-384\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"SHA-224\",\n+                                        \"value\": \"SHA-224\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"SM3\",\n+                                        \"value\": \"SM3\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"BLAKE2B-512\",\n+                                        \"value\": \"BLAKE2B-512\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"OID.1.0.10118.3.0.55\",\n+                                        \"value\": \"OID.1.0.10118.3.0.55\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"TUPLEHASH128-256\",\n+                                        \"value\": \"TUPLEHASH128-256\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"GOST3411-2012-512\",\n+                                        \"value\": \"GOST3411-2012-512\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"KECCAK-256\",\n+                                        \"value\": \"KECCAK-256\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"SKEIN-512-128\",\n+                                        \"value\": \"SKEIN-512-128\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"BLAKE2B-384\",\n+                                        \"value\": \"BLAKE2B-384\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"SHAKE256-512\",\n+                                        \"value\": \"SHAKE256-512\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"OID.2.16.840.1.101.3.4.2.12\",\n+                                        \"value\": \"OID.2.16.840.1.101.3.4.2.12\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"OID.2.16.840.1.101.3.4.2.11\",\n+                                        \"value\": \"OID.2.16.840.1.101.3.4.2.11\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"SKEIN-256-160\",\n+                                        \"value\": \"SKEIN-256-160\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"OID.2.16.840.1.101.3.4.2.10\",\n+                                        \"value\": \"OID.2.16.840.1.101.3.4.2.10\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"DSTU7564-256\",\n+                                        \"value\": \"DSTU7564-256\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"SHA-256\",\n+                                        \"value\": \"SHA-256\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"BLAKE2S-224\",\n+                                        \"value\": \"BLAKE2S-224\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"SHA3-256\",\n+                                        \"value\": \"SHA3-256\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"KECCAK-384\",\n+                                        \"value\": \"KECCAK-384\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"SKEIN-256-128\",\n+                                        \"value\": \"SKEIN-256-128\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"DSTU7564-384\",\n+                                        \"value\": \"DSTU7564-384\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"HARAKA-512\",\n+                                        \"value\": \"HARAKA-512\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"PARALLELHASH128-256\",\n+                                        \"value\": \"PARALLELHASH128-256\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"SHAKE128-256\",\n+                                        \"value\": \"SHAKE128-256\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"KECCAK-224\",\n+                                        \"value\": \"KECCAK-224\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"SKEIN-512-512\",\n+                                        \"value\": \"SKEIN-512-512\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"PARALLELHASH256-512\",\n+                                        \"value\": \"PARALLELHASH256-512\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"SKEIN-1024-512\",\n+                                        \"value\": \"SKEIN-1024-512\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"SKEIN-512-160\",\n+                                        \"value\": \"SKEIN-512-160\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"OID.1.2.804.2.1.1.1.1.2.2.3\",\n+                                        \"value\": \"OID.1.2.804.2.1.1.1.1.2.2.3\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"GOST3411\",\n+                                        \"value\": \"GOST3411\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"1.2.804.2.1.1.1.1.2.2.3\",\n+                                        \"value\": \"1.2.804.2.1.1.1.1.2.2.3\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"BLAKE2B-256\",\n+                                        \"value\": \"BLAKE2B-256\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"OID.1.2.804.2.1.1.1.1.2.2.2\",\n+                                        \"value\": \"OID.1.2.804.2.1.1.1.1.2.2.2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"SKEIN-1024-1024\",\n+                                        \"value\": \"SKEIN-1024-1024\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"OID.1.2.804.2.1.1.1.1.2.2.1\",\n+                                        \"value\": \"OID.1.2.804.2.1.1.1.1.2.2.1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"SHA3-384\",\n+                                        \"value\": \"SHA3-384\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"SHA-512/224\",\n+                                        \"value\": \"SHA-512/224\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"OID.2.16.840.1.101.3.4.2.9\",\n+                                        \"value\": \"OID.2.16.840.1.101.3.4.2.9\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"BLAKE2S-256\",\n+                                        \"value\": \"BLAKE2S-256\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"OID.2.16.840.1.101.3.4.2.8\",\n+                                        \"value\": \"OID.2.16.840.1.101.3.4.2.8\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"OID.2.16.840.1.101.3.4.2.7\",\n+                                        \"value\": \"OID.2.16.840.1.101.3.4.2.7\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"TIGER\",\n+                                        \"value\": \"TIGER\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"RIPEMD256\",\n+                                        \"value\": \"RIPEMD256\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"SKEIN-256-256\",\n+                                        \"value\": \"SKEIN-256-256\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"SHA3-224\",\n+                                        \"value\": \"SHA3-224\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"SHA3-512\",\n+                                        \"value\": \"SHA3-512\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"RIPEMD320\",\n+                                        \"value\": \"RIPEMD320\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"2.16.840.1.101.3.4.2.9\",\n+                                        \"value\": \"2.16.840.1.101.3.4.2.9\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"RIPEMD160\",\n+                                        \"value\": \"RIPEMD160\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"TUPLEHASH256-512\",\n+                                        \"value\": \"TUPLEHASH256-512\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"GOST3411-2012-256\",\n+                                        \"value\": \"GOST3411-2012-256\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"2.16.840.1.101.3.4.2.8\",\n+                                        \"value\": \"2.16.840.1.101.3.4.2.8\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"1.2.804.2.1.1.1.1.2.2.1\",\n+                                        \"value\": \"1.2.804.2.1.1.1.1.2.2.1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"KECCAK-512\",\n+                                        \"value\": \"KECCAK-512\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"SKEIN-512-224\",\n+                                        \"value\": \"SKEIN-512-224\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"2.16.840.1.101.3.4.2.7\",\n+                                        \"value\": \"2.16.840.1.101.3.4.2.7\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"1.2.804.2.1.1.1.1.2.2.2\",\n+                                        \"value\": \"1.2.804.2.1.1.1.1.2.2.2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"2.16.840.1.101.3.4.2.12\",\n+                                        \"value\": \"2.16.840.1.101.3.4.2.12\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"2.16.840.1.101.3.4.2.10\",\n+                                        \"value\": \"2.16.840.1.101.3.4.2.10\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"2.16.840.1.101.3.4.2.11\",\n+                                        \"value\": \"2.16.840.1.101.3.4.2.11\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"BLAKE2S-160\",\n+                                        \"value\": \"BLAKE2S-160\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"SHA-512/256\",\n+                                        \"value\": \"SHA-512/256\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"MD2\",\n+                                        \"value\": \"MD2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"RIPEMD128\",\n+                                        \"value\": \"RIPEMD128\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"MD4\",\n+                                        \"value\": \"MD4\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"SHA-512\",\n+                                        \"value\": \"SHA-512\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"SKEIN-256-224\",\n+                                        \"value\": \"SKEIN-256-224\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"MD5\",\n+                                        \"value\": \"MD5\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"BLAKE2S-128\",\n+                                        \"value\": \"BLAKE2S-128\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"DSTU7564-512\",\n+                                        \"value\": \"DSTU7564-512\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"MD5\",\n+                                \"description\": \"Determines what hashing algorithm should be used to perform the hashing function\",\n+                                \"displayName\": \"Hash Algorithm\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Hash Algorithm\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n                             },\n+                            \"Hash Attribute Name\": {\n+                                \"defaultValue\": \"hash.value\",\n+                                \"description\": \"The name of the FlowFile Attribute into which the Hash Value should be written. If the value already exists, it will be overwritten\",\n+                                \"displayName\": \"Hash Attribute Name\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Hash Attribute Name\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            }\n+                        },\n+                        \"sideEffectFree\": false,\n+                        \"supportedRelationships\": [\n                             {\n-                                \"description\": \"The filename of the parent FlowFile\",\n-                                \"name\": \"email.attachment.parent.filename \"\n+                                \"description\": \"FlowFiles that are process successfully will be sent to this relationship\",\n+                                \"name\": \"success\"\n                             },\n                             {\n-                                \"description\": \"The UUID of the original FlowFile.\",\n-                                \"name\": \"email.attachment.parent.uuid\"\n-                            },\n+                                \"description\": \"Any FlowFile that cannot be processed successfully will be sent to this relationship without any attribute being added\",\n+                                \"name\": \"failure\"\n+                            }\n+                        ],\n+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\",\n+                            \"EVENT_DRIVEN\"\n+                        ],\n+                        \"supportsBatching\": true,\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicRelationships\": false,\n+                        \"supportsEventDriven\": true,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"MD5\",\n+                            \"SHA-1\",\n+                            \"SHA-256\",\n+                            \"content\",\n+                            \"hash\"\n+                        ],\n+                        \"triggerSerially\": false,\n+                        \"triggerWhenAnyDestinationAvailable\": false,\n+                        \"triggerWhenEmpty\": false,\n+                        \"type\": \"org.apache.nifi.processors.standard.HashContent\",\n+                        \"typeDescription\": \"Calculates a hash value for the Content of a FlowFile and puts that hash value on the FlowFile as an attribute whose name is determined by the <Hash Attribute Name> property. This processor did not provide a consistent offering of hash algorithms, and is now deprecated. For modern cryptographic hashing capabilities, see \\\"CryptographicHashContent\\\". \",\n+                        \"version\": \"1.27.0\",\n+                        \"writesAttributes\": [\n                             {\n-                                \"description\": \"The mime type of the attachment.\",\n-                                \"name\": \"mime.type\"\n+                                \"description\": \"This Processor adds an attribute whose value is the result of Hashing the existing FlowFile content. The name of this attribute is specified by the <Hash Attribute Name> property\",\n+                                \"name\": \"<Hash Attribute Name>\"\n                             }\n                         ]\n                     },\n                     {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-email-nar\",\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"EVENT_DRIVEN\": 0,\n@@ -89303,194 +88400,954 @@\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"CAPTURED_HEADERS\": {\n-                                \"defaultValue\": \"x-mailer\",\n-                                \"description\": \"COLON separated list of additional headers to be extracted from the flowfile content.NOTE the header key is case insensitive and will be matched as lower-case. Values will respect email contents.\",\n-                                \"displayName\": \"Additional Header List\",\n+                            \"config-body\": {\n+                                \"description\": \"Body of MIME type config file. Only one of Config File or Config Body may be used.\",\n+                                \"displayName\": \"Config Body\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"CAPTURED_HEADERS\",\n+                                \"name\": \"config-body\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"STRICT_ADDRESS_PARSING\": {\n+                            \"config-file\": {\n+                                \"description\": \"Path to MIME type config file. Only one of Config File or Config Body may be used.\",\n+                                \"displayName\": \"Config File\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"config-file\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"use-filename-in-detection\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Strict email address format will be enforced. FlowFiles will be transfered to the failure relationship if the email address is invalid.\",\n-                                        \"displayName\": \"Strict Address Parsing\",\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n                                         \"value\": \"true\"\n                                     },\n                                     {\n-                                        \"description\": \"Accept emails, even if the address is poorly formed and doesn't strictly comply with RFC Validation.\",\n-                                        \"displayName\": \"Non-Strict Address Parsing\",\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n                                         \"value\": \"false\"\n                                     }\n                                 ],\n                                 \"defaultValue\": \"true\",\n-                                \"description\": \"If \\\"strict\\\", strict address format parsing rules are applied to mailbox and mailbox list fields, such as \\\"to\\\" and \\\"from\\\" headers, and FlowFiles with poorly formed addresses will be routed to the failure relationship, similar to messages that fail RFC compliant format validation. If \\\"non-strict\\\", the processor will extract the contents of mailbox list headers as comma-separated values without attempting to parse each value as well-formed Internet mailbox addresses. This is optional and defaults to Strict Address Parsing\",\n-                                \"displayName\": \"Email Address Parsing\",\n+                                \"description\": \"If true will pass the filename to Tika to aid in detection.\",\n+                                \"displayName\": \"Use Filename In Detection\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"STRICT_ADDRESS_PARSING\",\n-                                \"required\": false,\n+                                \"name\": \"use-filename-in-detection\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             }\n                         },\n                         \"sideEffectFree\": true,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"Extraction was successful\",\n+                                \"description\": \"All FlowFiles are routed to success\",\n                                 \"name\": \"success\"\n-                            },\n-                            {\n-                                \"description\": \"Flowfiles that could not be parsed as a RFC-2822 compliant message\",\n-                                \"name\": \"failure\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\",\n                             \"EVENT_DRIVEN\"\n                         ],\n                         \"supportsBatching\": true,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsEventDriven\": true,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"email\",\n-                            \"split\"\n+                            \"MIME\",\n+                            \"bzip2\",\n+                            \"compression\",\n+                            \"file\",\n+                            \"gzip\",\n+                            \"identify\",\n+                            \"mime.type\",\n+                            \"zip\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.email.ExtractEmailHeaders\",\n-                        \"typeDescription\": \"Using the flowfile content as source of data, extract header from an RFC compliant  email file adding the relevant attributes to the flowfile. This processor does not perform extensive RFC validation but still requires a bare minimum compliance with RFC 2822\",\n+                        \"type\": \"org.apache.nifi.processors.standard.IdentifyMimeType\",\n+                        \"typeDescription\": \"Attempts to identify the MIME Type used for a FlowFile. If the MIME Type can be identified, an attribute with the name 'mime.type' is added with the value being the MIME Type. If the MIME Type cannot be determined, the value will be set to 'application/octet-stream'. In addition, the attribute 'mime.extension' will be set if a common file extension for the MIME Type is known. If the MIME Type detected is of type text/*, attempts to identify the charset used and an attribute with the name 'mime.charset' is added with the value being the charset.If both Config File and Config Body are not set, the default NiFi MIME Types will be used.\",\n                         \"version\": \"1.27.0\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"Each individual BCC recipient (if available)\",\n-                                \"name\": \"email.headers.bcc.*\"\n-                            },\n-                            {\n-                                \"description\": \"Each individual CC recipient (if available)\",\n-                                \"name\": \"email.headers.cc.*\"\n-                            },\n-                            {\n-                                \"description\": \"Each individual mailbox contained in the From  of the Email (array as per RFC-2822)\",\n-                                \"name\": \"email.headers.from.*\"\n-                            },\n-                            {\n-                                \"description\": \"The value of the Message-ID header (if available)\",\n-                                \"name\": \"email.headers.message-id\"\n-                            },\n-                            {\n-                                \"description\": \"The Received-Date of the message (if available)\",\n-                                \"name\": \"email.headers.received_date\"\n-                            },\n-                            {\n-                                \"description\": \"Date the message was sent\",\n-                                \"name\": \"email.headers.sent_date\"\n-                            },\n-                            {\n-                                \"description\": \"Subject of the message (if available)\",\n-                                \"name\": \"email.headers.subject\"\n+                                \"description\": \"This Processor sets the FlowFile's mime.type attribute to the detected MIME Type. If unable to detect the MIME Type, the attribute's value will be set to application/octet-stream\",\n+                                \"name\": \"mime.type\"\n                             },\n                             {\n-                                \"description\": \"Each individual TO recipient (if available)\",\n-                                \"name\": \"email.headers.to.*\"\n+                                \"description\": \"This Processor sets the FlowFile's mime.extension attribute to the file extension associated with the detected MIME Type. If there is no correlated extension, the attribute's value will be empty\",\n+                                \"name\": \"mime.extension\"\n                             },\n                             {\n-                                \"description\": \"Number of attachments of the message\",\n-                                \"name\": \"email.attachment_count\"\n+                                \"description\": \"This Processor sets the FlowFile's mime.charset attribute to the detected charset. If unable to detect the charset or the detected MIME type is not of type text/*, the attribute will not be set\",\n+                                \"name\": \"mime.charset\"\n                             }\n                         ]\n                     },\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-email-nar\",\n+                        \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n-                            \"EVENT_DRIVEN\": 0,\n                             \"TIMER_DRIVEN\": 1\n                         },\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n+                        \"dynamicProperties\": [\n+                            {\n+                                \"description\": \"Send request header with a key matching the Dynamic Property Key and a value created by evaluating the Attribute Expression Language set in the value of the Dynamic Property.\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"name\": \"Header Name\",\n+                                \"value\": \"Attribute Expression Language\"\n+                            },\n+                            {\n+                                \"description\": \"When the HTTP Method is POST, dynamic properties with the property name in the form of post:form:<NAME>, where the <NAME> will be the form data name, will be used to fill out the multipart form parts.  If send message body is false, the flowfile will not be sent, but any other form data will be.\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"name\": \"post:form:<NAME>\",\n+                                \"value\": \"Attribute Expression Language\"\n+                            }\n+                        ],\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_REQUIRED\",\n+                        \"inputRequirement\": \"INPUT_ALLOWED\",\n                         \"primaryNodeOnly\": false,\n-                        \"sideEffectFree\": true,\n+                        \"propertyDescriptors\": {\n+                            \"Add Response Headers to Request\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"Enable adding HTTP response headers as attributes to FlowFiles transferred to the Original relationship.\",\n+                                \"displayName\": \"Response Header Request Attributes Enabled\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Add Response Headers to Request\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Always Output Response\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"Enable generation and transfer of a FlowFile to the Response relationship regardless of HTTP response received.\",\n+                                \"displayName\": \"Response Generation Required\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Always Output Response\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Attributes to Send\": {\n+                                \"description\": \"Regular expression that defines which FlowFile attributes to send as HTTP headers in the request. If not defined, no attributes are sent as headers. Dynamic properties will be always be sent as headers. The dynamic property name will be the header key and the dynamic property value, interpreted as Expression Language, will be the header value. Attributes and their values are limited to ASCII characters due to the requirement of the HTTP protocol.\",\n+                                \"displayName\": \"Request Header Attributes Pattern\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Attributes to Send\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Basic Authentication Password\": {\n+                                \"description\": \"The password provided for authentication of HTTP requests. Encoded using Base64 for HTTP Basic Authentication as described in RFC 7617.\",\n+                                \"displayName\": \"Request Password\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Basic Authentication Password\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n+                            },\n+                            \"Basic Authentication Username\": {\n+                                \"description\": \"The username provided for authentication of HTTP requests. Encoded using Base64 for HTTP Basic Authentication as described in RFC 7617.\",\n+                                \"displayName\": \"Request Username\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Basic Authentication Username\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Connection Timeout\": {\n+                                \"defaultValue\": \"5 secs\",\n+                                \"description\": \"Maximum time to wait for initial socket connection to the HTTP URL.\",\n+                                \"displayName\": \"Socket Connect Timeout\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Connection Timeout\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Content-Encoding\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"Content encoding not applied during transmission\",\n+                                        \"displayName\": \"DISABLED\",\n+                                        \"value\": \"DISABLED\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Gzip content encoding and HTTP Content-Encoding header applied during transmission\",\n+                                        \"displayName\": \"GZIP\",\n+                                        \"value\": \"GZIP\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"DISABLED\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"POST\",\n+                                            \"PATCH\",\n+                                            \"PUT\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"HTTP Method\",\n+                                        \"propertyName\": \"HTTP Method\"\n+                                    }\n+                                ],\n+                                \"description\": \"HTTP Content-Encoding applied to request body during transmission. The receiving server must support the selected encoding to avoid request failures.\",\n+                                \"displayName\": \"Request Content-Encoding\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Content-Encoding\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Content-Type\": {\n+                                \"defaultValue\": \"${mime.type}\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"POST\",\n+                                            \"PATCH\",\n+                                            \"PUT\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"HTTP Method\",\n+                                        \"propertyName\": \"HTTP Method\"\n+                                    }\n+                                ],\n+                                \"description\": \"HTTP Content-Type Header applied to when sending an HTTP request body for PATCH, POST, or PUT methods. The Content-Type defaults to application/octet-stream when not configured.\",\n+                                \"displayName\": \"Request Content-Type\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Content-Type\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Digest Authentication\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"false\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"propertyDisplayName\": \"Request Username\",\n+                                        \"propertyName\": \"Basic Authentication Username\"\n+                                    }\n+                                ],\n+                                \"description\": \"Enable Digest Authentication on HTTP requests with Username and Password credentials as described in RFC 7616.\",\n+                                \"displayName\": \"Request Digest Authentication Enabled\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Digest Authentication\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Follow Redirects\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"True\",\n+                                        \"value\": \"True\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"False\",\n+                                        \"value\": \"False\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"True\",\n+                                \"description\": \"Enable following HTTP redirects sent with HTTP 300 series responses as described in RFC 7231 Section 6.4.\",\n+                                \"displayName\": \"Response Redirects Enabled\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Follow Redirects\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"HTTP Method\": {\n+                                \"defaultValue\": \"GET\",\n+                                \"description\": \"HTTP request method (GET, POST, PUT, PATCH, DELETE, HEAD, OPTIONS). Arbitrary methods are also supported. Methods other than POST, PUT and PATCH will be sent without a message body.\",\n+                                \"displayName\": \"HTTP Method\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"HTTP Method\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Include Date Header\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"True\",\n+                                        \"value\": \"True\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"False\",\n+                                        \"value\": \"False\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"True\",\n+                                \"description\": \"Enable sending HTTP Date Header on HTTP requests as described in RFC 7231 Section 7.1.1.2.\",\n+                                \"displayName\": \"Request Date Header Enabled\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Include Date Header\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Max Length To Put In Attribute\": {\n+                                \"defaultValue\": \"256\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"propertyDisplayName\": \"Response Body Attribute Name\",\n+                                        \"propertyName\": \"Put Response Body In Attribute\"\n+                                    }\n+                                ],\n+                                \"description\": \"Maximum size in bytes applied when writing an HTTP response body to a FlowFile attribute. Attributes exceeding the maximum will be truncated.\",\n+                                \"displayName\": \"Response Body Attribute Size\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Max Length To Put In Attribute\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Penalize on \\\"No Retry\\\"\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"Enable penalization of request FlowFiles when receiving HTTP response with a status code between 400 and 499.\",\n+                                \"displayName\": \"Request Failure Penalization Enabled\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Penalize on \\\"No Retry\\\"\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Proxy Host\": {\n+                                \"description\": \"Proxy Host and dependent properties are deprecated in favor of Proxy Configuration Service. Proxy Host can be configured using an IP address or DNS address.\",\n+                                \"displayName\": \"Proxy Host\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Proxy Host\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Proxy Port\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"propertyDisplayName\": \"Proxy Host\",\n+                                        \"propertyName\": \"Proxy Host\"\n+                                    }\n+                                ],\n+                                \"description\": \"Proxy Port and dependent properties are deprecated in favor of Proxy Configuration Service. Port number for the configured Proxy Host address.\",\n+                                \"displayName\": \"Proxy Port\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Proxy Port\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Proxy Type\": {\n+                                \"defaultValue\": \"http\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"propertyDisplayName\": \"Proxy Host\",\n+                                        \"propertyName\": \"Proxy Host\"\n+                                    }\n+                                ],\n+                                \"description\": \"Proxy Type and dependent properties are deprecated in favor of Proxy Configuration Service. Proxy protocol type is not used\",\n+                                \"displayName\": \"Proxy Type\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Proxy Type\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Put Response Body In Attribute\": {\n+                                \"description\": \"FlowFile attribute name used to write an HTTP response body for FlowFiles transferred to the Original relationship.\",\n+                                \"displayName\": \"Response Body Attribute Name\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Put Response Body In Attribute\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Read Timeout\": {\n+                                \"defaultValue\": \"15 secs\",\n+                                \"description\": \"Maximum time to wait for receiving responses from a socket connection to the HTTP URL.\",\n+                                \"displayName\": \"Socket Read Timeout\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Read Timeout\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Remote URL\": {\n+                                \"description\": \"HTTP remote URL including a scheme of http or https, as well as a hostname or IP address with optional port and path elements. Any encoding of the URL must be done by the user.\",\n+                                \"displayName\": \"HTTP URL\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Remote URL\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"SSL Context Service\": {\n+                                \"description\": \"SSL Context Service provides trusted certificates and client certificates for TLS communication.\",\n+                                \"displayName\": \"SSL Context Service\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"SSL Context Service\",\n+                                \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"Socket Write Timeout\": {\n+                                \"defaultValue\": \"15 secs\",\n+                                \"description\": \"Maximum time to wait for write operations while sending requests from a socket connection to the HTTP URL.\",\n+                                \"displayName\": \"Socket Write Timeout\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Socket Write Timeout\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Use Chunked Encoding\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"false\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"POST\",\n+                                            \"PATCH\",\n+                                            \"PUT\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"HTTP Method\",\n+                                        \"propertyName\": \"HTTP Method\"\n+                                    }\n+                                ],\n+                                \"description\": \"Enable sending HTTP requests with the Transfer-Encoding Header set to chunked, and disable sending the Content-Length Header. Transfer-Encoding applies to the body in HTTP/1.1 requests as described in RFC 7230 Section 3.3.1\",\n+                                \"displayName\": \"Request Chunked Transfer-Encoding Enabled\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Use Chunked Encoding\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Useragent\": {\n+                                \"description\": \"HTTP User-Agent Header applied to requests. RFC 7231 Section 5.5.3 describes recommend formatting.\",\n+                                \"displayName\": \"Request User-Agent\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Useragent\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"cookie-strategy\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"DISABLED\",\n+                                        \"value\": \"DISABLED\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"ACCEPT_ALL\",\n+                                        \"value\": \"ACCEPT_ALL\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"DISABLED\",\n+                                \"description\": \"Strategy for accepting and persisting HTTP cookies. Accepting cookies enables persistence across multiple requests.\",\n+                                \"displayName\": \"Response Cookie Strategy\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"cookie-strategy\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"disable-http2\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"True\",\n+                                        \"value\": \"True\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"False\",\n+                                        \"value\": \"False\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"False\",\n+                                \"description\": \"Disable negotiation of HTTP/2 protocol. HTTP/2 requires TLS. HTTP/1.1 protocol supported is required when HTTP/2 is disabled.\",\n+                                \"displayName\": \"HTTP/2 Disabled\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"disable-http2\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"etag-max-cache-size\": {\n+                                \"defaultValue\": \"10MB\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"true\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Response Cache Enabled\",\n+                                        \"propertyName\": \"use-etag\"\n+                                    }\n+                                ],\n+                                \"description\": \"Maximum size of HTTP response cache in bytes. Caching responses considers ETag and other headers.\",\n+                                \"displayName\": \"Response Cache Size\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"etag-max-cache-size\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"flow-file-naming-strategy\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"FlowFile filename attribute will be a random value.\",\n+                                        \"displayName\": \"RANDOM\",\n+                                        \"value\": \"RANDOM\"\n+                                    },\n+                                    {\n+                                        \"description\": \"FlowFile filename attribute will be extracted from the remote URL path. The attribute may contain URL encoded characters. If the path doesn't exist, the attribute will be a random value.\",\n+                                        \"displayName\": \"URL_PATH\",\n+                                        \"value\": \"URL_PATH\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"RANDOM\",\n+                                \"description\": \"Determines the strategy used for setting the filename attribute of FlowFiles transferred to the Response relationship.\",\n+                                \"displayName\": \"Response FlowFile Naming Strategy\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"flow-file-naming-strategy\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"form-body-form-name\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"true\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Request Body Enabled\",\n+                                        \"propertyName\": \"send-message-body\"\n+                                    }\n+                                ],\n+                                \"description\": \"Enable sending HTTP request body formatted using multipart/form-data and using the form name configured.\",\n+                                \"displayName\": \"Request Multipart Form-Data Name\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"form-body-form-name\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"idle-timeout\": {\n+                                \"defaultValue\": \"5 mins\",\n+                                \"description\": \"Maximum time to wait before closing idle connections to the HTTP URL.\",\n+                                \"displayName\": \"Socket Idle Timeout\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"idle-timeout\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"ignore-response-content\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"Disable writing HTTP response FlowFiles to Response relationship\",\n+                                \"displayName\": \"Response Body Ignored\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"ignore-response-content\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"invokehttp-proxy-password\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"propertyDisplayName\": \"Proxy Host\",\n+                                        \"propertyName\": \"Proxy Host\"\n+                                    }\n+                                ],\n+                                \"description\": \"Proxy Password and dependent properties are deprecated in favor of Proxy Configuration Service. Password to set when authenticating with a Proxy server.\",\n+                                \"displayName\": \"Proxy Password\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"invokehttp-proxy-password\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n+                            },\n+                            \"invokehttp-proxy-user\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"propertyDisplayName\": \"Proxy Host\",\n+                                        \"propertyName\": \"Proxy Host\"\n+                                    }\n+                                ],\n+                                \"description\": \"Proxy Username and dependent properties are deprecated in favor of Proxy Configuration Service. Username to set when authenticating with a Proxy server.\",\n+                                \"displayName\": \"Proxy Username\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"invokehttp-proxy-user\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"max-idle-connections\": {\n+                                \"defaultValue\": \"5\",\n+                                \"description\": \"Maximum number of idle connections to the HTTP URL.\",\n+                                \"displayName\": \"Socket Idle Connections\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"max-idle-connections\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"oauth2-access-token-provider\": {\n+                                \"description\": \"Enables managed retrieval of OAuth2 Bearer Token applied to HTTP requests using the Authorization Header.\",\n+                                \"displayName\": \"Request OAuth2 Access Token Provider\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"oauth2-access-token-provider\",\n+                                \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.oauth2.OAuth2AccessTokenProvider\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"proxy-configuration-service\": {\n+                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests. If set, it supersedes proxy settings configured per component. Supported proxies: SOCKS, HTTP + AuthN In case of SOCKS, it is not guaranteed that the selected SOCKS Version will be used by the processor.\",\n+                                \"displayName\": \"Proxy Configuration Service\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"proxy-configuration-service\",\n+                                \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.proxy.ProxyConfigurationService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"send-message-body\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"true\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"POST\",\n+                                            \"PATCH\",\n+                                            \"PUT\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"HTTP Method\",\n+                                        \"propertyName\": \"HTTP Method\"\n+                                    }\n+                                ],\n+                                \"description\": \"Enable sending HTTP request body for PATCH, POST, or PUT methods.\",\n+                                \"displayName\": \"Request Body Enabled\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"send-message-body\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"set-form-filename\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"true\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"propertyDisplayName\": \"Request Multipart Form-Data Name\",\n+                                        \"propertyName\": \"form-body-form-name\"\n+                                    }\n+                                ],\n+                                \"description\": \"Enable sending the FlowFile filename attribute as the filename parameter in the Content-Disposition Header for multipart/form-data HTTP requests.\",\n+                                \"displayName\": \"Request Multipart Form-Data Filename Enabled\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"set-form-filename\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"use-etag\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"Enable HTTP response caching described in RFC 7234. Caching responses considers ETag and other headers.\",\n+                                \"displayName\": \"Response Cache Enabled\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"use-etag\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            }\n+                        },\n+                        \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"Each individual flowfile that could not be parsed will be routed to the failure relationship\",\n-                                \"name\": \"failure\"\n+                                \"description\": \"Request FlowFiles transferred when receiving HTTP responses with a status code between 200 and 299.\",\n+                                \"name\": \"Original\"\n                             },\n                             {\n-                                \"description\": \"Each original flowfile (i.e. before extraction) will be routed to the original relationship\",\n-                                \"name\": \"original\"\n+                                \"description\": \"Request FlowFiles transferred when receiving socket communication errors.\",\n+                                \"name\": \"Failure\"\n+                            },\n+                            {\n+                                \"description\": \"Request FlowFiles transferred when receiving HTTP responses with a status code between 500 and 599.\",\n+                                \"name\": \"Retry\"\n+                            },\n+                            {\n+                                \"description\": \"Request FlowFiles transferred when receiving HTTP responses with a status code between 400 an 499.\",\n+                                \"name\": \"No Retry\"\n                             },\n                             {\n-                                \"description\": \"Each individual attachment will be routed to the attachments relationship\",\n-                                \"name\": \"attachments\"\n+                                \"description\": \"Response FlowFiles transferred when receiving HTTP responses with a status code between 200 and 299.\",\n+                                \"name\": \"Response\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\",\n-                            \"EVENT_DRIVEN\"\n+                            \"CRON_DRIVEN\"\n                         ],\n                         \"supportsBatching\": true,\n-                        \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicProperties\": true,\n                         \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": true,\n-                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"supportsEventDriven\": false,\n+                        \"supportsSensitiveDynamicProperties\": true,\n                         \"tags\": [\n-                            \"email\",\n-                            \"split\"\n+                            \"client\",\n+                            \"http\",\n+                            \"https\",\n+                            \"rest\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.email.ExtractTNEFAttachments\",\n-                        \"typeDescription\": \"Extract attachments from a mime formatted email file, splitting them into individual flowfiles.\",\n+                        \"type\": \"org.apache.nifi.processors.standard.InvokeHTTP\",\n+                        \"typeDescription\": \"An HTTP client processor which can interact with a configurable HTTP Endpoint. The destination URL and HTTP Method are configurable. When the HTTP Method is PUT, POST or PATCH, the FlowFile contents are included as the body of the request and FlowFile attributes are converted to HTTP headers, optionally, based on configuration properties.\",\n                         \"version\": \"1.27.0\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"The filename of the attachment\",\n-                                \"name\": \"filename \"\n+                                \"description\": \"The status code that is returned\",\n+                                \"name\": \"invokehttp.status.code\"\n                             },\n                             {\n-                                \"description\": \"The filename of the parent FlowFile\",\n-                                \"name\": \"email.tnef.attachment.parent.filename \"\n+                                \"description\": \"The status message that is returned\",\n+                                \"name\": \"invokehttp.status.message\"\n                             },\n                             {\n-                                \"description\": \"The UUID of the original FlowFile.\",\n-                                \"name\": \"email.tnef.attachment.parent.uuid\"\n+                                \"description\": \"In the instance where the status code received is not a success (2xx) then the response body will be put to the 'invokehttp.response.body' attribute of the request FlowFile.\",\n+                                \"name\": \"invokehttp.response.body\"\n+                            },\n+                            {\n+                                \"description\": \"The original request URL\",\n+                                \"name\": \"invokehttp.request.url\"\n+                            },\n+                            {\n+                                \"description\": \"Duration (in milliseconds) of the HTTP call to the external endpoint\",\n+                                \"name\": \"invokehttp.request.duration\"\n+                            },\n+                            {\n+                                \"description\": \"The URL that was ultimately requested after any redirects were followed\",\n+                                \"name\": \"invokehttp.response.url\"\n+                            },\n+                            {\n+                                \"description\": \"The transaction ID that is returned after reading the response\",\n+                                \"name\": \"invokehttp.tx.id\"\n+                            },\n+                            {\n+                                \"description\": \"The DN of the remote server\",\n+                                \"name\": \"invokehttp.remote.dn\"\n+                            },\n+                            {\n+                                \"description\": \"The Java exception class raised when the processor fails\",\n+                                \"name\": \"invokehttp.java.exception.class\"\n+                            },\n+                            {\n+                                \"description\": \"The Java exception message raised when the processor fails\",\n+                                \"name\": \"invokehttp.java.exception.message\"\n+                            },\n+                            {\n+                                \"description\": \"If the 'Put Response Body In Attribute' property is set then whatever it is set to will become the attribute key and the value would be the body of the HTTP response.\",\n+                                \"name\": \"user-defined\"\n                             }\n                         ]\n                     },\n                     {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-email-nar\",\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -89499,181 +89356,265 @@\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"CLIENT_AUTH\": {\n+                            \"Enrichment Record Reader\": {\n+                                \"description\": \"The Record Reader for reading the 'enrichment' FlowFile\",\n+                                \"displayName\": \"Enrichment Record Reader\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Enrichment Record Reader\",\n+                                \"required\": true,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"Insertion Record Path\": {\n+                                \"defaultValue\": \"/\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"Insert Enrichment Fields\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Join Strategy\",\n+                                        \"propertyName\": \"Join Strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"Specifies where in the 'original' Record the 'enrichment' Record's fields should be inserted. Note that if the RecordPath does not point to any existing field in the original Record, the enrichment will not be inserted.\",\n+                                \"displayName\": \"Insertion Record Path\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Insertion Record Path\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Join Strategy\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"NONE\",\n-                                        \"value\": \"NONE\"\n+                                        \"description\": \"The output is a Record that contains two fields: (1) 'original', containing the Record from the original FlowFile and (2) 'enrichment' containing the corresponding Record from the enrichment FlowFile. Records will be correlated based on their index in the FlowFile. If one FlowFile has more Records than the other, a null value will be used.\",\n+                                        \"displayName\": \"Wrapper\",\n+                                        \"value\": \"Wrapper\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"REQUIRED\",\n-                                        \"value\": \"REQUIRED\"\n+                                        \"description\": \"The output is derived by evaluating a SQL SELECT statement that allows for two tables: 'original' and 'enrichment'. This allows for SQL JOIN statements to be used in order to correlate the Records of the two FlowFiles, so the index in which the Record is encountered in the FlowFile does not matter.\",\n+                                        \"displayName\": \"SQL\",\n+                                        \"value\": \"SQL\"\n+                                    },\n+                                    {\n+                                        \"description\": \"The enrichment is joined together with the original FlowFile by placing all fields of the enrichment Record into the corresponding Record from the original FlowFile. Records will be correlated based on their index in the FlowFile.\",\n+                                        \"displayName\": \"Insert Enrichment Fields\",\n+                                        \"value\": \"Insert Enrichment Fields\"\n                                     }\n                                 ],\n-                                \"description\": \"The client authentication policy to use for the SSL Context. Only used if an SSL Context Service is provided.\",\n-                                \"displayName\": \"Client Auth\",\n+                                \"defaultValue\": \"Wrapper\",\n+                                \"description\": \"Specifies how to join the two FlowFiles into a single FlowFile\",\n+                                \"displayName\": \"Join Strategy\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"CLIENT_AUTH\",\n-                                \"required\": false,\n+                                \"name\": \"Join Strategy\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"SMTP_HOSTNAME\": {\n-                                \"description\": \"The hostname to be embedded into the banner displayed when an SMTP client connects to the processor TCP port .\",\n-                                \"displayName\": \"SMTP hostname\",\n+                            \"Maximum number of Bins\": {\n+                                \"defaultValue\": \"10000\",\n+                                \"description\": \"Specifies the maximum number of bins that can be held in memory at any one time\",\n+                                \"displayName\": \"Maximum number of Bins\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"SMTP_HOSTNAME\",\n-                                \"required\": false,\n+                                \"name\": \"Maximum number of Bins\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"SMTP_MAXIMUM_CONNECTIONS\": {\n-                                \"defaultValue\": \"1\",\n-                                \"description\": \"The maximum number of simultaneous SMTP connections.\",\n-                                \"displayName\": \"Maximum number of SMTP connection\",\n+                            \"Original Record Reader\": {\n+                                \"description\": \"The Record Reader for reading the 'original' FlowFile\",\n+                                \"displayName\": \"Original Record Reader\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"SMTP_MAXIMUM_CONNECTIONS\",\n+                                \"name\": \"Original Record Reader\",\n                                 \"required\": true,\n-                                \"sensitive\": false\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n                             },\n-                            \"SMTP_MAXIMUM_MSG_SIZE\": {\n-                                \"defaultValue\": \"20 MB\",\n-                                \"description\": \"The maximum number of bytes the server will accept.\",\n-                                \"displayName\": \"SMTP Maximum Message Size\",\n+                            \"Record Writer\": {\n+                                \"description\": \"The Record Writer to use for writing the results. If the Record Writer is configured to inherit the schema from the Record, the schema that it will inherit will be the result of merging both the 'original' record schema and the 'enrichment' record schema.\",\n+                                \"displayName\": \"Record Writer\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"SMTP_MAXIMUM_MSG_SIZE\",\n+                                \"name\": \"Record Writer\",\n                                 \"required\": true,\n-                                \"sensitive\": false\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n                             },\n-                            \"SMTP_PORT\": {\n-                                \"description\": \"The TCP port the ListenSMTP processor will bind to.NOTE that on Unix derivative operating  systems this port must be higher than 1024 unless NiFi is running as with root user permissions.\",\n-                                \"displayName\": \"Listening Port\",\n+                            \"SQL\": {\n+                                \"defaultValue\": \"SELECT original.*, enrichment.* \\nFROM original \\nLEFT OUTER JOIN enrichment \\nON original.id = enrichment.id\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"SQL\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Join Strategy\",\n+                                        \"propertyName\": \"Join Strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"The SQL SELECT statement to evaluate. Expression Language may be provided, but doing so may result in poorer performance. Because this Processor is dealing with two FlowFiles at a time, it's also important to understand how attributes will be referenced. If both FlowFiles have an attribute with the same name but different values, the Expression Language will resolve to the value provided by the 'enrichment' FlowFile.\",\n+                                \"displayName\": \"SQL\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"SMTP_PORT\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"SQL\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"SMTP_TIMEOUT\": {\n-                                \"defaultValue\": \"60 seconds\",\n-                                \"description\": \"The maximum time to wait for an action of SMTP client.\",\n-                                \"displayName\": \"SMTP connection timeout\",\n+                            \"Timeout\": {\n+                                \"defaultValue\": \"10 min\",\n+                                \"description\": \"Specifies the maximum amount of time to wait for the second FlowFile once the first arrives at the processor, after which point the first FlowFile will be routed to the 'timeout' relationship.\",\n+                                \"displayName\": \"Timeout\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"SMTP_TIMEOUT\",\n+                                \"name\": \"Timeout\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"SSL_CONTEXT_SERVICE\": {\n-                                \"description\": \"The Controller Service to use in order to obtain an SSL Context. If this property is set, messages will be received over a secure connection.\",\n-                                \"displayName\": \"SSL Context Service\",\n+                            \"dbf-default-precision\": {\n+                                \"defaultValue\": \"10\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"SQL\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Join Strategy\",\n+                                        \"propertyName\": \"Join Strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"When a DECIMAL/NUMBER value is written as a 'decimal' Avro logical type, a specific 'precision' denoting number of available digits is required. Generally, precision is defined by column data type definition or database engines default. However undefined precision (0) can be returned from some database engines. 'Default Decimal Precision' is used when writing those undefined precision numbers.\",\n+                                \"displayName\": \"Default Decimal Precision\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"SSL_CONTEXT_SERVICE\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"dbf-default-precision\",\n                                 \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.ssl.RestrictedSSLContextService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n+                                \"sensitive\": false\n+                            },\n+                            \"dbf-default-scale\": {\n+                                \"defaultValue\": \"0\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"SQL\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Join Strategy\",\n+                                        \"propertyName\": \"Join Strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"When a DECIMAL/NUMBER value is written as a 'decimal' Avro logical type, a specific 'scale' denoting number of available decimal digits is required. Generally, scale is defined by column data type definition or database engines default. However when undefined precision (0) is returned, scale can also be uncertain with some database engines. 'Default Decimal Scale' is used when writing those undefined numbers. If a value has more decimals than specified scale, then the value will be rounded-up, e.g. 1.53 becomes 2 with scale 0, and 1.5 with scale 1.\",\n+                                \"displayName\": \"Default Decimal Scale\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"dbf-default-scale\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n                             }\n                         },\n-                        \"sideEffectFree\": false,\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.processors.standard.ForkEnrichment\"\n+                        ],\n+                        \"sideEffectFree\": true,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"All new messages will be routed as FlowFiles to this relationship\",\n-                                \"name\": \"success\"\n+                                \"description\": \"If one of the incoming FlowFiles (i.e., the 'original' FlowFile or the 'enrichment' FlowFile) arrives to this Processor but the other does not arrive within the configured Timeout period, the FlowFile that did arrive is routed to this relationship.\",\n+                                \"name\": \"timeout\"\n+                            },\n+                            {\n+                                \"description\": \"The resultant FlowFile with Records joined together from both the original and enrichment FlowFiles will be routed to this relationship\",\n+                                \"name\": \"joined\"\n+                            },\n+                            {\n+                                \"description\": \"If both the 'original' and 'enrichment' FlowFiles arrive at the processor but there was a failure in joining the records, both of those FlowFiles will be routed to this relationship.\",\n+                                \"name\": \"failure\"\n+                            },\n+                            {\n+                                \"description\": \"Both of the incoming FlowFiles ('original' and 'enrichment') will be routed to this Relationship. I.e., this is the 'original' version of both of these FlowFiles.\",\n+                                \"name\": \"original\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n                         \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n+                        \"systemResourceConsiderations\": [\n+                            {\n+                                \"description\": \"This Processor will load into heap all FlowFiles that are on its incoming queues. While it loads the FlowFiles themselves, and not their content, the FlowFile attributes can be very memory intensive. Additionally, if the Join Strategy is set to SQL, the SQL engine may require buffering the entire contents of the enrichment FlowFile for each concurrent task. See Processor's Additional Details for more details and for steps on how to mitigate these concerns.\",\n+                                \"resource\": \"MEMORY\"\n+                            }\n+                        ],\n                         \"tags\": [\n-                            \"email\",\n-                            \"listen\",\n-                            \"smtp\"\n+                            \"combine\",\n+                            \"enrichment\",\n+                            \"fork\",\n+                            \"join\",\n+                            \"merge\",\n+                            \"record\",\n+                            \"recordpath\",\n+                            \"sql\",\n+                            \"streams\",\n+                            \"wrap\"\n                         ],\n-                        \"triggerSerially\": true,\n+                        \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.email.ListenSMTP\",\n-                        \"typeDescription\": \"This processor implements a lightweight SMTP server to an arbitrary port, allowing nifi to listen for incoming email. Note this server does not perform any email validation. If direct exposure to the internet is sought, it may be a better idea to use the combination of NiFi and an industrial scale MTA (e.g. Postfix). Threading for this processor is managed by the underlying smtp server used so the processor need not support more than one thread.\",\n+                        \"triggerWhenEmpty\": true,\n+                        \"type\": \"org.apache.nifi.processors.standard.JoinEnrichment\",\n+                        \"typeDescription\": \"Joins together Records from two different FlowFiles where one FlowFile, the 'original' contains arbitrary records and the second FlowFile, the 'enrichment' contains additional data that should be used to enrich the first. See Additional Details for more information on how to configure this processor and the different use cases that it aims to accomplish.\",\n                         \"version\": \"1.27.0\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"The value used during HELO\",\n-                                \"name\": \"smtp.helo\"\n-                            },\n-                            {\n-                                \"description\": \"The serial numbers for each of the certificates used by an TLS peer\",\n-                                \"name\": \"smtp.certificates.*.serial\"\n-                            },\n-                            {\n-                                \"description\": \"The principal for each of the certificates used by an TLS peer\",\n-                                \"name\": \"smtp.certificates.*.principal\"\n-                            },\n-                            {\n-                                \"description\": \"The source IP and port of the SMTP connection\",\n-                                \"name\": \"smtp.src\"\n-                            },\n-                            {\n-                                \"description\": \"The value used during MAIL FROM (i.e. envelope)\",\n-                                \"name\": \"smtp.from\"\n-                            },\n-                            {\n-                                \"description\": \"The values used during RCPT TO (i.e. envelope)\",\n-                                \"name\": \"smtp.recipient.*\"\n+                                \"description\": \"Sets the mime.type attribute to the MIME Type specified by the Record Writer\",\n+                                \"name\": \"mime.type\"\n                             },\n                             {\n-                                \"description\": \"Mime type of the message\",\n-                                \"name\": \"mime.type\"\n+                                \"description\": \"The number of records in the FlowFile\",\n+                                \"name\": \"record.count\"\n                             }\n                         ]\n-                    }\n-                ],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"1.27.0\"\n-        },\n-        {\n-            \"artifact\": \"nifi-cassandra-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [],\n-                \"processors\": [\n+                    },\n                     {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-cassandra-nar\",\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"EVENT_DRIVEN\": 0,\n@@ -89682,2408 +89623,1965 @@\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n-                        \"deprecated\": true,\n-                        \"deprecationReason\": \"DataStax 3 driver for Cassandra is no longer the current version and requires new components.\",\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Cassandra Contact Points\": {\n-                                \"description\": \"Contact points are addresses of Cassandra nodes. The list of contact points should be comma-separated and in hostname:port format. Example node1:port,node2:port,.... The default client port for Cassandra is 9042, but the port(s) must be explicitly specified.\",\n-                                \"displayName\": \"Cassandra Contact Points\",\n+                            \"Max String Length\": {\n+                                \"defaultValue\": \"20 MB\",\n+                                \"description\": \"The maximum allowed length of a string value when parsing the JSON document\",\n+                                \"displayName\": \"Max String Length\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Cassandra Contact Points\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Max String Length\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Character Set\": {\n-                                \"defaultValue\": \"UTF-8\",\n-                                \"description\": \"Specifies the character set of the record data.\",\n-                                \"displayName\": \"Character Set\",\n+                            \"Transform Cache Size\": {\n+                                \"defaultValue\": \"1\",\n+                                \"description\": \"Compiling a Jolt Transform can be fairly expensive. Ideally, this will be done only once. However, if the Expression Language is used in the transform, we may need a new Transform for each FlowFile. This value controls how many of those Transforms we cache in memory in order to avoid having to compile the Transform each time.\",\n+                                \"displayName\": \"Transform Cache Size\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Character Set\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Transform Cache Size\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Client Auth\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"WANT\",\n-                                        \"value\": \"WANT\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"REQUIRED\",\n-                                        \"value\": \"REQUIRED\"\n-                                    },\n+                            \"jolt-custom-class\": {\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"NONE\",\n-                                        \"value\": \"NONE\"\n+                                        \"dependentValues\": [\n+                                            \"jolt-transform-custom\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Jolt Transformation DSL\",\n+                                        \"propertyName\": \"jolt-transform\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"REQUIRED\",\n-                                \"description\": \"Client authentication policy when connecting to secure (TLS/SSL) cluster. Possible values are REQUIRED, WANT, NONE. This property is only used when an SSL Context has been defined and enabled.\",\n-                                \"displayName\": \"Client Auth\",\n+                                \"description\": \"Fully Qualified Class Name for Custom Transformation\",\n+                                \"displayName\": \"Custom Transformation Class Name\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Client Auth\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"jolt-custom-class\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Compression Type\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"NONE\",\n-                                        \"value\": \"NONE\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"SNAPPY\",\n-                                        \"value\": \"SNAPPY\"\n-                                    },\n+                            \"jolt-custom-modules\": {\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"LZ4\",\n-                                        \"value\": \"LZ4\"\n+                                        \"dependentValues\": [\n+                                            \"jolt-transform-custom\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Jolt Transformation DSL\",\n+                                        \"propertyName\": \"jolt-transform\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"NONE\",\n-                                \"description\": \"Enable compression at transport-level requests and responses\",\n-                                \"displayName\": \"Compression Type\",\n+                                \"description\": \"Comma-separated list of paths to files and/or directories which contain modules containing custom transformations (that are not included on NiFi's classpath).\",\n+                                \"displayName\": \"Custom Module Directory\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Compression Type\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"jolt-custom-modules\",\n                                 \"required\": false,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"MULTIPLE\",\n+                                    \"resourceTypes\": [\n+                                        \"DIRECTORY\",\n+                                        \"FILE\"\n+                                    ]\n+                                },\n                                 \"sensitive\": false\n                             },\n-                            \"Consistency Level\": {\n+                            \"jolt-spec\": {\n+                                \"description\": \"Jolt Specification for transformation of JSON data. The value for this property may be the text of a Jolt specification or the path to a file containing a Jolt specification. 'Jolt Specification' must be set, or the value is ignored if the Jolt Sort Transformation is selected.\",\n+                                \"displayName\": \"Jolt Specification\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"jolt-spec\",\n+                                \"required\": false,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"SINGLE\",\n+                                    \"resourceTypes\": [\n+                                        \"FILE\",\n+                                        \"TEXT\"\n+                                    ]\n+                                },\n+                                \"sensitive\": false\n+                            },\n+                            \"jolt-transform\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"ANY\",\n-                                        \"value\": \"ANY\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"ONE\",\n-                                        \"value\": \"ONE\"\n+                                        \"description\": \"Change the cardinality of input elements to create the output JSON.\",\n+                                        \"displayName\": \"Cardinality\",\n+                                        \"value\": \"jolt-transform-card\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"TWO\",\n-                                        \"value\": \"TWO\"\n+                                        \"description\": \"Execute list of Jolt transformations.\",\n+                                        \"displayName\": \"Chain\",\n+                                        \"value\": \"jolt-transform-chain\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"THREE\",\n-                                        \"value\": \"THREE\"\n+                                        \"description\": \" Apply default values to the output JSON.\",\n+                                        \"displayName\": \"Default\",\n+                                        \"value\": \"jolt-transform-default\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"QUORUM\",\n-                                        \"value\": \"QUORUM\"\n+                                        \"description\": \"Writes when key is missing or value is null\",\n+                                        \"displayName\": \"Modify - Default\",\n+                                        \"value\": \"jolt-transform-modify-default\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"ALL\",\n-                                        \"value\": \"ALL\"\n+                                        \"description\": \"Writes when key is missing\",\n+                                        \"displayName\": \"Modify - Define\",\n+                                        \"value\": \"jolt-transform-modify-define\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"LOCAL_QUORUM\",\n-                                        \"value\": \"LOCAL_QUORUM\"\n+                                        \"description\": \" Always overwrite value\",\n+                                        \"displayName\": \"Modify - Overwrite\",\n+                                        \"value\": \"jolt-transform-modify-overwrite\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"EACH_QUORUM\",\n-                                        \"value\": \"EACH_QUORUM\"\n+                                        \"description\": \" Remove values from input data to create the output JSON.\",\n+                                        \"displayName\": \"Remove\",\n+                                        \"value\": \"jolt-transform-remove\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"SERIAL\",\n-                                        \"value\": \"SERIAL\"\n+                                        \"description\": \"Shift input JSON/data to create the output JSON.\",\n+                                        \"displayName\": \"Shift\",\n+                                        \"value\": \"jolt-transform-shift\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"LOCAL_SERIAL\",\n-                                        \"value\": \"LOCAL_SERIAL\"\n+                                        \"description\": \"Sort input json key values alphabetically. Any specification set is ignored.\",\n+                                        \"displayName\": \"Sort\",\n+                                        \"value\": \"jolt-transform-sort\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"LOCAL_ONE\",\n-                                        \"value\": \"LOCAL_ONE\"\n+                                        \"description\": \"Custom Transformation. Requires Custom Transformation Class Name\",\n+                                        \"displayName\": \"Custom\",\n+                                        \"value\": \"jolt-transform-custom\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"ONE\",\n-                                \"description\": \"The strategy for how many replicas must respond before results are returned.\",\n-                                \"displayName\": \"Consistency Level\",\n+                                \"defaultValue\": \"jolt-transform-chain\",\n+                                \"description\": \"Specifies the Jolt Transformation that should be used with the provided specification.\",\n+                                \"displayName\": \"Jolt Transformation DSL\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Consistency Level\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Keyspace\": {\n-                                \"description\": \"The Cassandra Keyspace to connect to. If no keyspace is specified, the query will need to include the keyspace name before any table reference, in case of 'query' native processors or if the processor exposes the 'Table' property, the keyspace name has to be provided with the table name in the form of <KEYSPACE>.<TABLE>\",\n-                                \"displayName\": \"Keyspace\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Keyspace\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Max Wait Time\": {\n-                                \"defaultValue\": \"0 seconds\",\n-                                \"description\": \"The maximum amount of time allowed for a running CQL select query. Must be of format <duration> <TimeUnit> where <duration> is a non-negative integer and TimeUnit is a supported Time Unit, such as: nanos, millis, secs, mins, hrs, days. A value of zero means there is no limit. \",\n-                                \"displayName\": \"Max Wait Time\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Max Wait Time\",\n+                                \"name\": \"jolt-transform\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Password\": {\n-                                \"description\": \"Password to access the Cassandra cluster\",\n-                                \"displayName\": \"Password\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Password\",\n-                                \"required\": false,\n-                                \"sensitive\": true\n-                            },\n-                            \"SSL Context Service\": {\n-                                \"description\": \"The SSL Context Service used to provide client certificate information for TLS/SSL connections.\",\n-                                \"displayName\": \"SSL Context Service\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"SSL Context Service\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            },\n-                            \"Username\": {\n-                                \"description\": \"Username to access the Cassandra cluster\",\n-                                \"displayName\": \"Username\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Username\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"cassandra-connection-provider\": {\n-                                \"description\": \"Specifies the Cassandra connection providing controller service to be used to connect to Cassandra cluster.\",\n-                                \"displayName\": \"Cassandra Connection Provider\",\n+                            \"pretty_print\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"Apply pretty print formatting to the output of the Jolt transform\",\n+                                \"displayName\": \"Pretty Print\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"cassandra-connection-provider\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-cassandra-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.cassandra.CassandraSessionProviderService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            },\n-                            \"putcql-stmt-cache-size\": {\n-                                \"defaultValue\": \"0\",\n-                                \"description\": \"The maximum number of CQL Prepared Statements to cache. This can improve performance if many incoming flow files have the same CQL statement with different values for the parameters. If this property is set to zero, the cache is effectively disabled.\",\n-                                \"displayName\": \"Statement Cache Size\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"putcql-stmt-cache-size\",\n+                                \"name\": \"pretty_print\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             }\n                         },\n-                        \"readsAttributes\": [\n-                            {\n-                                \"description\": \"Incoming FlowFiles are expected to be parameterized CQL statements. The type of each parameter is specified as a lowercase string corresponding to the Cassandra data type (text, int, boolean, e.g.). In the case of collections, the primitive type(s) of the elements in the collection should be comma-delimited, follow the collection type, and be enclosed in angle brackets (< and >), for example set<text> or map<timestamp, int>.\",\n-                                \"name\": \"cql.args.N.type\"\n-                            },\n-                            {\n-                                \"description\": \"Incoming FlowFiles are expected to be parameterized CQL statements. The value of the parameters are specified as cql.args.1.value, cql.args.2.value, cql.args.3.value, and so on. The  type of the cql.args.1.value parameter is specified by the cql.args.1.type attribute.\",\n-                                \"name\": \"cql.args.N.value\"\n-                            }\n-                        ],\n-                        \"sideEffectFree\": false,\n+                        \"sideEffectFree\": true,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"A FlowFile is transferred to this relationship if the operation cannot be completed but attempting it again may succeed.\",\n-                                \"name\": \"retry\"\n-                            },\n-                            {\n-                                \"description\": \"A FlowFile is transferred to this relationship if the operation completed successfully.\",\n+                                \"description\": \"The FlowFile with transformed content will be routed to this relationship\",\n                                 \"name\": \"success\"\n                             },\n                             {\n-                                \"description\": \"A FlowFile is transferred to this relationship if the operation failed.\",\n+                                \"description\": \"If a FlowFile fails processing for any reason (for example, the FlowFile is not valid JSON), it will be routed to this relationship\",\n                                 \"name\": \"failure\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\",\n                             \"EVENT_DRIVEN\"\n                         ],\n                         \"supportsBatching\": true,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsEventDriven\": true,\n                         \"supportsSensitiveDynamicProperties\": false,\n-                        \"systemResourceConsiderations\": [\n-                            {\n-                                \"description\": \"An instance of this component can cause high usage of this system resource.  Multiple instances or high concurrency settings may result a degradation of performance.\",\n-                                \"resource\": \"MEMORY\"\n-                            }\n-                        ],\n                         \"tags\": [\n-                            \"cassandra\",\n-                            \"cql\",\n-                            \"insert\",\n-                            \"put\",\n-                            \"set\",\n-                            \"update\"\n+                            \"cardinality\",\n+                            \"chainr\",\n+                            \"defaultr\",\n+                            \"jolt\",\n+                            \"json\",\n+                            \"removr\",\n+                            \"shiftr\",\n+                            \"sort\",\n+                            \"transform\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.cassandra.PutCassandraQL\",\n-                        \"typeDescription\": \"Execute provided Cassandra Query Language (CQL) statement on a Cassandra 1.x, 2.x, or 3.0.x cluster. The content of an incoming FlowFile is expected to be the CQL command to execute. The CQL command may use the ? to escape parameters. In this case, the parameters to use must exist as FlowFile attributes with the naming convention cql.args.N.type and cql.args.N.value, where N is a positive integer. The cql.args.N.type is expected to be a lowercase string indicating the Cassandra type.\",\n-                        \"version\": \"1.27.0\"\n+                        \"type\": \"org.apache.nifi.processors.standard.JoltTransformJSON\",\n+                        \"typeDescription\": \"Applies a list of Jolt specifications to the flowfile JSON payload. A new FlowFile is created with transformed content and is routed to the 'success' relationship. If the JSON transform fails, the original FlowFile is routed to the 'failure' relationship.\",\n+                        \"version\": \"1.27.0\",\n+                        \"writesAttributes\": [\n+                            {\n+                                \"description\": \"Always set to application/json\",\n+                                \"name\": \"mime.type\"\n+                            }\n+                        ]\n                     },\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-cassandra-nar\",\n+                        \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n                         },\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"0 sec\"\n+                            \"TIMER_DRIVEN\": \"1 min\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n-                        \"deprecated\": true,\n-                        \"deprecationReason\": \"DataStax 3 driver for Cassandra is no longer the current version and requires new components.\",\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_REQUIRED\",\n-                        \"primaryNodeOnly\": false,\n+                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n+                        \"primaryNodeOnly\": true,\n                         \"propertyDescriptors\": {\n-                            \"Cassandra Contact Points\": {\n-                                \"description\": \"Contact points are addresses of Cassandra nodes. The list of contact points should be comma-separated and in hostname:port format. Example node1:port,node2:port,.... The default client port for Cassandra is 9042, but the port(s) must be explicitly specified.\",\n-                                \"displayName\": \"Cassandra Contact Points\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Cassandra Contact Points\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Client Auth\": {\n+                            \"list-db-include-count\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"WANT\",\n-                                        \"value\": \"WANT\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"REQUIRED\",\n-                                        \"value\": \"REQUIRED\"\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"NONE\",\n-                                        \"value\": \"NONE\"\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"REQUIRED\",\n-                                \"description\": \"Client authentication policy when connecting to secure (TLS/SSL) cluster. Possible values are REQUIRED, WANT, NONE. This property is only used when an SSL Context has been defined and enabled.\",\n-                                \"displayName\": \"Client Auth\",\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"Whether to include the table's row count as a flow file attribute. This affects performance as a database query will be generated for each table in the retrieved list.\",\n+                                \"displayName\": \"Include Count\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Client Auth\",\n-                                \"required\": false,\n+                                \"name\": \"list-db-include-count\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Consistency Level\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"SERIAL\",\n-                                        \"value\": \"SERIAL\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"LOCAL_SERIAL\",\n-                                        \"value\": \"LOCAL_SERIAL\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"SERIAL\",\n-                                \"description\": \"The strategy for how many replicas must respond before results are returned.\",\n-                                \"displayName\": \"Consistency Level\",\n+                            \"list-db-refresh-interval\": {\n+                                \"defaultValue\": \"0 sec\",\n+                                \"description\": \"The amount of time to elapse before resetting the processor state, thereby causing all current tables to be listed. During this interval, the processor may continue to run, but tables that have already been listed will not be re-listed. However new/added tables will be listed as the processor runs. A value of zero means the state will never be automatically reset, the user must Clear State manually.\",\n+                                \"displayName\": \"Refresh Interval\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Consistency Level\",\n-                                \"required\": false,\n+                                \"name\": \"list-db-refresh-interval\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Keyspace\": {\n-                                \"description\": \"The Cassandra Keyspace to connect to. If no keyspace is specified, the query will need to include the keyspace name before any table reference, in case of 'query' native processors or if the processor exposes the 'Table' property, the keyspace name has to be provided with the table name in the form of <KEYSPACE>.<TABLE>\",\n-                                \"displayName\": \"Keyspace\",\n+                            \"list-db-tables-catalog\": {\n+                                \"description\": \"The name of a catalog from which to list database tables. The name must match the catalog name as it is stored in the database. If the property is not set, the catalog name will not be used to narrow the search for tables. If the property is set to an empty string, tables without a catalog will be listed.\",\n+                                \"displayName\": \"Catalog\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Keyspace\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"list-db-tables-catalog\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Password\": {\n-                                \"description\": \"Password to access the Cassandra cluster\",\n-                                \"displayName\": \"Password\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Password\",\n-                                \"required\": false,\n-                                \"sensitive\": true\n-                            },\n-                            \"SSL Context Service\": {\n-                                \"description\": \"The SSL Context Service used to provide client certificate information for TLS/SSL connections.\",\n-                                \"displayName\": \"SSL Context Service\",\n+                            \"list-db-tables-db-connection\": {\n+                                \"description\": \"The Controller Service that is used to obtain connection to database\",\n+                                \"displayName\": \"Database Connection Pooling Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"SSL Context Service\",\n-                                \"required\": false,\n+                                \"name\": \"list-db-tables-db-connection\",\n+                                \"required\": true,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n                                     \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n+                                    \"type\": \"org.apache.nifi.dbcp.DBCPService\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             },\n-                            \"Username\": {\n-                                \"description\": \"Username to access the Cassandra cluster\",\n-                                \"displayName\": \"Username\",\n+                            \"list-db-tables-name-pattern\": {\n+                                \"description\": \"A pattern for matching tables in the database. Within a pattern, \\\"%\\\" means match any substring of 0 or more characters, and \\\"_\\\" means match any one character. The pattern must match the table name as it is stored in the database. If the property is not set, all tables will be retrieved.\",\n+                                \"displayName\": \"Table Name Pattern\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Username\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"list-db-tables-name-pattern\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"cassandra-connection-provider\": {\n-                                \"description\": \"Specifies the Cassandra connection providing controller service to be used to connect to Cassandra cluster.\",\n-                                \"displayName\": \"Cassandra Connection Provider\",\n+                            \"list-db-tables-schema-pattern\": {\n+                                \"description\": \"A pattern for matching schemas in the database. Within a pattern, \\\"%\\\" means match any substring of 0 or more characters, and \\\"_\\\" means match any one character. The pattern must match the schema name as it is stored in the database. If the property is not set, the schema name will not be used to narrow the search for tables. If the property is set to an empty string, tables without a schema will be listed.\",\n+                                \"displayName\": \"Schema Pattern\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"cassandra-connection-provider\",\n+                                \"name\": \"list-db-tables-schema-pattern\",\n                                 \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-cassandra-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.cassandra.CassandraSessionProviderService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            },\n-                            \"put-cassandra-record-batch-size\": {\n-                                \"defaultValue\": \"100\",\n-                                \"description\": \"Specifies the number of 'Insert statements' to be grouped together to execute as a batch (BatchStatement)\",\n-                                \"displayName\": \"Batch size\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"put-cassandra-record-batch-size\",\n-                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"put-cassandra-record-batch-statement-type\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"Use a LOGGED batch statement\",\n-                                        \"displayName\": \"LOGGED\",\n-                                        \"value\": \"LOGGED\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Use an UNLOGGED batch statement\",\n-                                        \"displayName\": \"UNLOGGED\",\n-                                        \"value\": \"UNLOGGED\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Use a COUNTER batch statement\",\n-                                        \"displayName\": \"COUNTER\",\n-                                        \"value\": \"COUNTER\"\n-                                    },\n-                                    {\n-                                        \"description\": \"The value of the cql.batch.statement.type Attribute will be used to determine which type of batch statement (LOGGED, UNLOGGED or COUNTER) will be used to generate and execute the Update statement.\",\n-                                        \"displayName\": \"Use cql.batch.statement.type Attribute\",\n-                                        \"value\": \"USE_ATTR\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"LOGGED\",\n-                                \"description\": \"Specifies the type of 'Batch Statement' to be used.\",\n-                                \"displayName\": \"Batch Statement Type\",\n+                            \"list-db-tables-types\": {\n+                                \"defaultValue\": \"TABLE\",\n+                                \"description\": \"A comma-separated list of table types to include. For example, some databases support TABLE and VIEW types. If the property is not set, tables of all types will be returned.\",\n+                                \"displayName\": \"Table Types\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"put-cassandra-record-batch-statement-type\",\n+                                \"name\": \"list-db-tables-types\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"put-cassandra-record-reader\": {\n-                                \"description\": \"Specifies the type of Record Reader controller service to use for parsing the incoming data and determining the schema\",\n-                                \"displayName\": \"Record Reader\",\n+                            \"record-writer\": {\n+                                \"description\": \"Specifies the Record Writer to use for creating the listing. If not specified, one FlowFile will be created for each entity that is listed. If the Record Writer is specified, all entities will be written to a single FlowFile instead of adding attributes to individual FlowFiles.\",\n+                                \"displayName\": \"Record Writer\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"put-cassandra-record-reader\",\n-                                \"required\": true,\n+                                \"name\": \"record-writer\",\n+                                \"required\": false,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n                                     \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n+                                    \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n                                     \"version\": \"1.27.0\"\n                                 }\n-                            },\n-                            \"put-cassandra-record-statement-type\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"Use an UPDATE statement.\",\n-                                        \"displayName\": \"UPDATE\",\n-                                        \"value\": \"UPDATE\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Use an INSERT statement.\",\n-                                        \"displayName\": \"INSERT\",\n-                                        \"value\": \"INSERT\"\n-                                    },\n-                                    {\n-                                        \"description\": \"The value of the cql.statement.type Attribute will be used to determine which type of statement (UPDATE, INSERT) will be generated and executed\",\n-                                        \"displayName\": \"Use cql.statement.type Attribute\",\n-                                        \"value\": \"USE_ATTR\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"INSERT\",\n-                                \"description\": \"Specifies the type of CQL Statement to generate.\",\n-                                \"displayName\": \"Statement Type\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"put-cassandra-record-statement-type\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"put-cassandra-record-table\": {\n-                                \"description\": \"The name of the Cassandra table to which the records have to be written.\",\n-                                \"displayName\": \"Table name\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"put-cassandra-record-table\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"put-cassandra-record-update-keys\": {\n-                                \"description\": \"A comma-separated list of column names that uniquely identifies a row in the database for UPDATE statements. If the Statement Type is UPDATE and this property is not set, the conversion to CQL will fail. This property is ignored if the Statement Type is not UPDATE.\",\n-                                \"displayName\": \"Update Keys\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"put-cassandra-record-update-keys\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"put-cassandra-record-update-method\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"Use an increment operation (+=) for the Update statement.\",\n-                                        \"displayName\": \"Increment\",\n-                                        \"value\": \"INCREMENT\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Use a decrement operation (-=) for the Update statement.\",\n-                                        \"displayName\": \"Decrement\",\n-                                        \"value\": \"DECREMENT\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Use a set operation (=) for the Update statement.\",\n-                                        \"displayName\": \"Set\",\n-                                        \"value\": \"SET\"\n-                                    },\n-                                    {\n-                                        \"description\": \"The value of the cql.update.method Attribute will be used to determine which operation (Set, Increment, Decrement) will be used to generate and execute the Update statement.\",\n-                                        \"displayName\": \"Use cql.update.method Attribute\",\n-                                        \"value\": \"USE_ATTR\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"SET\",\n-                                \"description\": \"Specifies the method to use to SET the values. This property is used if the Statement Type is UPDATE and ignored otherwise.\",\n-                                \"displayName\": \"Update Method\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"put-cassandra-record-update-method\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n                             }\n                         },\n-                        \"readsAttributes\": [\n-                            {\n-                                \"description\": \"If 'Use cql.statement.type Attribute' is selected for the Statement Type property, the value of the cql.statement.type Attribute will be used to determine which type of statement (UPDATE, INSERT) will be generated and executed\",\n-                                \"name\": \"cql.statement.type\"\n-                            },\n-                            {\n-                                \"description\": \"If 'Use cql.update.method Attribute' is selected for the Update Method property, the value of the cql.update.method Attribute will be used to determine which operation (Set, Increment, Decrement) will be used to generate and execute the Update statement. Ignored if the Statement Type property is not set to UPDATE\",\n-                                \"name\": \"cql.update.method\"\n-                            },\n-                            {\n-                                \"description\": \"If 'Use cql.batch.statement.type Attribute' is selected for the Batch Statement Type property, the value of the cql.batch.statement.type Attribute will be used to determine which type of batch statement (LOGGED, UNLOGGED, COUNTER) will be generated and executed\",\n-                                \"name\": \"cql.batch.statement.type\"\n-                            }\n-                        ],\n                         \"sideEffectFree\": false,\n+                        \"stateful\": {\n+                            \"description\": \"After performing a listing of tables, the timestamp of the query is stored. This allows the Processor to not re-list tables the next time that the Processor is run. Specifying the refresh interval in the processor properties will indicate that when the processor detects the interval has elapsed, the state will be reset and tables will be re-listed as a result. This processor is meant to be run on the primary node only.\",\n+                            \"scopes\": [\n+                                \"CLUSTER\"\n+                            ]\n+                        },\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"A FlowFile is transferred to this relationship if the operation completed successfully.\",\n+                                \"description\": \"All FlowFiles that are received are routed to success\",\n                                 \"name\": \"success\"\n-                            },\n-                            {\n-                                \"description\": \"A FlowFile is transferred to this relationship if the operation failed.\",\n-                                \"name\": \"failure\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n                         \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"cassandra\",\n-                            \"cql\",\n-                            \"insert\",\n-                            \"put\",\n-                            \"record\",\n-                            \"set\",\n-                            \"update\"\n+                            \"database\",\n+                            \"jdbc\",\n+                            \"list\",\n+                            \"sql\",\n+                            \"table\"\n                         ],\n-                        \"triggerSerially\": false,\n+                        \"triggerSerially\": true,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.cassandra.PutCassandraRecord\",\n-                        \"typeDescription\": \"This is a record aware processor that reads the content of the incoming FlowFile as individual records using the configured 'Record Reader' and writes them to Apache Cassandra using native protocol version 3 or higher.\",\n-                        \"version\": \"1.27.0\"\n+                        \"type\": \"org.apache.nifi.processors.standard.ListDatabaseTables\",\n+                        \"typeDescription\": \"Generates a set of flow files, each containing attributes corresponding to metadata about a table from a database connection. Once metadata about a table has been fetched, it will not be fetched again until the Refresh Interval (if set) has elapsed, or until state has been manually cleared.\",\n+                        \"version\": \"1.27.0\",\n+                        \"writesAttributes\": [\n+                            {\n+                                \"description\": \"Contains the name of a database table from the connection\",\n+                                \"name\": \"db.table.name\"\n+                            },\n+                            {\n+                                \"description\": \"Contains the name of the catalog to which the table belongs (may be null)\",\n+                                \"name\": \"db.table.catalog\"\n+                            },\n+                            {\n+                                \"description\": \"Contains the name of the schema to which the table belongs (may be null)\",\n+                                \"name\": \"db.table.schema\"\n+                            },\n+                            {\n+                                \"description\": \"Contains the fully-qualifed table name (possibly including catalog, schema, etc.)\",\n+                                \"name\": \"db.table.fullname\"\n+                            },\n+                            {\n+                                \"description\": \"Contains the type of the database table from the connection. Typical types are \\\"TABLE\\\", \\\"VIEW\\\", \\\"SYSTEM TABLE\\\", \\\"GLOBAL TEMPORARY\\\", \\\"LOCAL TEMPORARY\\\", \\\"ALIAS\\\", \\\"SYNONYM\\\"\",\n+                                \"name\": \"db.table.type\"\n+                            },\n+                            {\n+                                \"description\": \"Contains the name of a database table from the connection\",\n+                                \"name\": \"db.table.remarks\"\n+                            },\n+                            {\n+                                \"description\": \"Contains the number of rows in the table\",\n+                                \"name\": \"db.table.count\"\n+                            }\n+                        ]\n                     },\n                     {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-cassandra-nar\",\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n-                            \"EVENT_DRIVEN\": 0,\n                             \"TIMER_DRIVEN\": 1\n                         },\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"0 sec\"\n+                            \"TIMER_DRIVEN\": \"1 min\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n-                        \"deprecated\": true,\n-                        \"deprecationReason\": \"DataStax 3 driver for Cassandra is no longer the current version and requires new components.\",\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_ALLOWED\",\n-                        \"primaryNodeOnly\": false,\n+                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n+                        \"primaryNodeOnly\": true,\n                         \"propertyDescriptors\": {\n-                            \"CQL select query\": {\n-                                \"description\": \"CQL select query\",\n-                                \"displayName\": \"CQL select query\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"CQL select query\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Cassandra Contact Points\": {\n-                                \"description\": \"Contact points are addresses of Cassandra nodes. The list of contact points should be comma-separated and in hostname:port format. Example node1:port,node2:port,.... The default client port for Cassandra is 9042, but the port(s) must be explicitly specified.\",\n-                                \"displayName\": \"Cassandra Contact Points\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Cassandra Contact Points\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Character Set\": {\n-                                \"defaultValue\": \"UTF-8\",\n-                                \"description\": \"Specifies the character set of the record data.\",\n-                                \"displayName\": \"Character Set\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Character Set\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Client Auth\": {\n+                            \"Connection Mode\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"WANT\",\n-                                        \"value\": \"WANT\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"REQUIRED\",\n-                                        \"value\": \"REQUIRED\"\n+                                        \"displayName\": \"Active\",\n+                                        \"value\": \"Active\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"NONE\",\n-                                        \"value\": \"NONE\"\n+                                        \"displayName\": \"Passive\",\n+                                        \"value\": \"Passive\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"REQUIRED\",\n-                                \"description\": \"Client authentication policy when connecting to secure (TLS/SSL) cluster. Possible values are REQUIRED, WANT, NONE. This property is only used when an SSL Context has been defined and enabled.\",\n-                                \"displayName\": \"Client Auth\",\n+                                \"defaultValue\": \"Passive\",\n+                                \"description\": \"The FTP Connection Mode\",\n+                                \"displayName\": \"Connection Mode\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Client Auth\",\n+                                \"name\": \"Connection Mode\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Compression Type\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"NONE\",\n-                                        \"value\": \"NONE\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"SNAPPY\",\n-                                        \"value\": \"SNAPPY\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"LZ4\",\n-                                        \"value\": \"LZ4\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"NONE\",\n-                                \"description\": \"Enable compression at transport-level requests and responses\",\n-                                \"displayName\": \"Compression Type\",\n+                            \"Connection Timeout\": {\n+                                \"defaultValue\": \"30 sec\",\n+                                \"description\": \"Amount of time to wait before timing out while creating a connection\",\n+                                \"displayName\": \"Connection Timeout\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Compression Type\",\n-                                \"required\": false,\n+                                \"name\": \"Connection Timeout\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Consistency Level\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"ANY\",\n-                                        \"value\": \"ANY\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"ONE\",\n-                                        \"value\": \"ONE\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"TWO\",\n-                                        \"value\": \"TWO\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"THREE\",\n-                                        \"value\": \"THREE\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"QUORUM\",\n-                                        \"value\": \"QUORUM\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"ALL\",\n-                                        \"value\": \"ALL\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"LOCAL_QUORUM\",\n-                                        \"value\": \"LOCAL_QUORUM\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"EACH_QUORUM\",\n-                                        \"value\": \"EACH_QUORUM\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"SERIAL\",\n-                                        \"value\": \"SERIAL\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"LOCAL_SERIAL\",\n-                                        \"value\": \"LOCAL_SERIAL\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"LOCAL_ONE\",\n-                                        \"value\": \"LOCAL_ONE\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"ONE\",\n-                                \"description\": \"The strategy for how many replicas must respond before results are returned.\",\n-                                \"displayName\": \"Consistency Level\",\n+                            \"Data Timeout\": {\n+                                \"defaultValue\": \"30 sec\",\n+                                \"description\": \"When transferring a file between the local and remote system, this value specifies how long is allowed to elapse without any data being transferred between systems\",\n+                                \"displayName\": \"Data Timeout\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Consistency Level\",\n+                                \"name\": \"Data Timeout\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Distributed Cache Service\": {\n+                                \"description\": \"NOTE: This property is used merely for migration from old NiFi version before state management was introduced at version 0.5.0. The stored value in the cache service will be migrated into the state when this processor is started at the first time. The specified Controller Service was used to maintain state about what had been pulled from the remote server so that if a new node begins pulling data, it won't duplicate all of the work that has been done. If not specified, the information was not shared across the cluster. This property did not need to be set for standalone instances of NiFi but was supposed to be configured if NiFi had been running within a cluster.\",\n+                                \"displayName\": \"Distributed Cache Service\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Distributed Cache Service\",\n+                                \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.distributed.cache.client.DistributedMapCacheClient\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"File Filter Regex\": {\n+                                \"description\": \"Provides a Java Regular Expression for filtering Filenames; if a filter is supplied, only files whose names match that Regular Expression will be fetched\",\n+                                \"displayName\": \"File Filter Regex\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"File Filter Regex\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Fetch size\": {\n-                                \"defaultValue\": \"0\",\n-                                \"description\": \"The number of result rows to be fetched from the result set at a time. Zero is the default and means there is no limit.\",\n-                                \"displayName\": \"Fetch size\",\n+                            \"Hostname\": {\n+                                \"description\": \"The fully qualified hostname or IP address of the remote system\",\n+                                \"displayName\": \"Hostname\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Fetch size\",\n+                                \"name\": \"Hostname\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Keyspace\": {\n-                                \"description\": \"The Cassandra Keyspace to connect to. If no keyspace is specified, the query will need to include the keyspace name before any table reference, in case of 'query' native processors or if the processor exposes the 'Table' property, the keyspace name has to be provided with the table name in the form of <KEYSPACE>.<TABLE>\",\n-                                \"displayName\": \"Keyspace\",\n+                            \"Http Proxy Password\": {\n+                                \"description\": \"Http Proxy Password\",\n+                                \"displayName\": \"Http Proxy Password\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Keyspace\",\n+                                \"name\": \"Http Proxy Password\",\n                                 \"required\": false,\n-                                \"sensitive\": false\n+                                \"sensitive\": true\n                             },\n-                            \"Max Rows Per Flow File\": {\n-                                \"defaultValue\": \"0\",\n-                                \"description\": \"The maximum number of result rows that will be included in a single FlowFile. This will allow you to break up very large result sets into multiple FlowFiles. If the value specified is zero, then all rows are returned in a single FlowFile.\",\n-                                \"displayName\": \"Max Rows Per Flow File\",\n+                            \"Http Proxy Username\": {\n+                                \"description\": \"Http Proxy Username\",\n+                                \"displayName\": \"Http Proxy Username\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Max Rows Per Flow File\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Max Wait Time\": {\n-                                \"defaultValue\": \"0 seconds\",\n-                                \"description\": \"The maximum amount of time allowed for a running CQL select query. Must be of format <duration> <TimeUnit> where <duration> is a non-negative integer and TimeUnit is a supported Time Unit, such as: nanos, millis, secs, mins, hrs, days. A value of zero means there is no limit. \",\n-                                \"displayName\": \"Max Wait Time\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Max Wait Time\",\n-                                \"required\": true,\n+                                \"name\": \"Http Proxy Username\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Output Format\": {\n+                            \"Ignore Dotted Files\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"Avro\",\n-                                        \"value\": \"Avro\"\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"JSON\",\n-                                        \"value\": \"JSON\"\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"Avro\",\n-                                \"description\": \"The format to which the result rows will be converted. If JSON is selected, the output will contain an object with field 'results' containing an array of result rows. Each row in the array is a map of the named column to its value. For example: { \\\"results\\\": [{\\\"userid\\\":1, \\\"name\\\":\\\"Joe Smith\\\"}]}\",\n-                                \"displayName\": \"Output Format\",\n+                                \"defaultValue\": \"true\",\n+                                \"description\": \"If true, files whose names begin with a dot (\\\".\\\") will be ignored\",\n+                                \"displayName\": \"Ignore Dotted Files\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Output Format\",\n+                                \"name\": \"Ignore Dotted Files\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n+                            \"Internal Buffer Size\": {\n+                                \"defaultValue\": \"16KB\",\n+                                \"description\": \"Set the internal buffer size for buffered data streams\",\n+                                \"displayName\": \"Internal Buffer Size\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Internal Buffer Size\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n                             \"Password\": {\n-                                \"description\": \"Password to access the Cassandra cluster\",\n+                                \"description\": \"Password for the user account\",\n                                 \"displayName\": \"Password\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n                                 \"name\": \"Password\",\n                                 \"required\": false,\n                                 \"sensitive\": true\n                             },\n-                            \"SSL Context Service\": {\n-                                \"description\": \"The SSL Context Service used to provide client certificate information for TLS/SSL connections.\",\n-                                \"displayName\": \"SSL Context Service\",\n+                            \"Path Filter Regex\": {\n+                                \"description\": \"When Search Recursively is true, then only subdirectories whose path matches the given Regular Expression will be scanned\",\n+                                \"displayName\": \"Path Filter Regex\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"SSL Context Service\",\n+                                \"name\": \"Path Filter Regex\",\n                                 \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n+                                \"sensitive\": false\n                             },\n-                            \"Username\": {\n-                                \"description\": \"Username to access the Cassandra cluster\",\n-                                \"displayName\": \"Username\",\n+                            \"Port\": {\n+                                \"defaultValue\": \"21\",\n+                                \"description\": \"The port to connect to on the remote host to fetch the data from\",\n+                                \"displayName\": \"Port\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Username\",\n+                                \"name\": \"Port\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Proxy Host\": {\n+                                \"description\": \"The fully qualified hostname or IP address of the proxy server\",\n+                                \"displayName\": \"Proxy Host\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Proxy Host\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"cassandra-connection-provider\": {\n-                                \"description\": \"Specifies the Cassandra connection providing controller service to be used to connect to Cassandra cluster.\",\n-                                \"displayName\": \"Cassandra Connection Provider\",\n+                            \"Proxy Port\": {\n+                                \"description\": \"The port of the proxy server\",\n+                                \"displayName\": \"Proxy Port\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Proxy Port\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Proxy Type\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"DIRECT\",\n+                                        \"value\": \"DIRECT\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"HTTP\",\n+                                        \"value\": \"HTTP\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"SOCKS\",\n+                                        \"value\": \"SOCKS\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"DIRECT\",\n+                                \"description\": \"Proxy type used for file transfers\",\n+                                \"displayName\": \"Proxy Type\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"cassandra-connection-provider\",\n+                                \"name\": \"Proxy Type\",\n                                 \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-cassandra-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.cassandra.CassandraSessionProviderService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n+                                \"sensitive\": false\n                             },\n-                            \"qdbt-output-batch-size\": {\n-                                \"defaultValue\": \"0\",\n-                                \"description\": \"The number of output FlowFiles to queue before committing the process session. When set to zero, the session will be committed when all result set rows have been processed and the output FlowFiles are ready for transfer to the downstream relationship. For large result sets, this can cause a large burst of FlowFiles to be transferred at the end of processor execution. If this property is set, then when the specified number of FlowFiles are ready for transfer, then the session will be committed, thus releasing the FlowFiles to the downstream relationship. NOTE: The maxvalue.* and fragment.count attributes will not be set on FlowFiles when this property is set.\",\n-                                \"displayName\": \"Output Batch Size\",\n+                            \"Remote Path\": {\n+                                \"defaultValue\": \".\",\n+                                \"description\": \"The path on the remote system from which to pull or push files\",\n+                                \"displayName\": \"Remote Path\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"qdbt-output-batch-size\",\n-                                \"required\": true,\n+                                \"name\": \"Remote Path\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"timestamp-format-pattern\": {\n-                                \"defaultValue\": \"yyyy-MM-dd HH:mm:ssZ\",\n-                                \"description\": \"Pattern to use when converting timestamp fields to JSON. Note: the formatted timestamp will be in UTC timezone.\",\n-                                \"displayName\": \"Timestamp Format Pattern for JSON output\",\n+                            \"Remote Poll Batch Size\": {\n+                                \"defaultValue\": \"5000\",\n+                                \"description\": \"The value specifies how many file paths to find in a given directory on the remote system when doing a file listing. This value in general should not need to be modified but when polling against a remote system with a tremendous number of files this value can be critical.  Setting this value too high can result very poor performance and setting it too low can cause the flow to be slower than normal.\",\n+                                \"displayName\": \"Remote Poll Batch Size\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"timestamp-format-pattern\",\n+                                \"name\": \"Remote Poll Batch Size\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n-                            }\n-                        },\n-                        \"sideEffectFree\": false,\n-                        \"supportedRelationships\": [\n-                            {\n-                                \"description\": \"A FlowFile is transferred to this relationship if the operation cannot be completed but attempting it again may succeed.\",\n-                                \"name\": \"retry\"\n-                            },\n-                            {\n-                                \"description\": \"A FlowFile is transferred to this relationship if the operation completed successfully.\",\n-                                \"name\": \"success\"\n-                            },\n-                            {\n-                                \"description\": \"A FlowFile is transferred to this relationship if the operation failed.\",\n-                                \"name\": \"failure\"\n-                            }\n-                        ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\",\n-                            \"EVENT_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": false,\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": true,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"cassandra\",\n-                            \"cql\",\n-                            \"select\"\n-                        ],\n-                        \"triggerSerially\": false,\n-                        \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.cassandra.QueryCassandra\",\n-                        \"typeDescription\": \"Execute provided Cassandra Query Language (CQL) select query on a Cassandra 1.x, 2.x, or 3.0.x cluster. Query result may be converted to Avro or JSON format. Streaming is used so arbitrarily large result sets are supported. This processor can be scheduled to run on a timer, or cron expression, using the standard scheduling methods, or it can be triggered by an incoming FlowFile. If it is triggered by an incoming FlowFile, then attributes of that FlowFile will be available when evaluating the select query. FlowFile attribute 'executecql.row.count' indicates how many rows were selected.\",\n-                        \"version\": \"1.27.0\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"The number of rows returned by the CQL query\",\n-                                \"name\": \"executecql.row.count\"\n-                            },\n-                            {\n-                                \"description\": \"If 'Max Rows Per Flow File' is set then all FlowFiles from the same query result set will have the same value for the fragment.identifier attribute. This can then be used to correlate the results.\",\n-                                \"name\": \"fragment.identifier\"\n-                            },\n-                            {\n-                                \"description\": \"If 'Max Rows Per Flow File' is set then this is the total number of  FlowFiles produced by a single ResultSet. This can be used in conjunction with the fragment.identifier attribute in order to know how many FlowFiles belonged to the same incoming ResultSet. If Output Batch Size is set, then this attribute will not be populated.\",\n-                                \"name\": \"fragment.count\"\n                             },\n-                            {\n-                                \"description\": \"If 'Max Rows Per Flow File' is set then the position of this FlowFile in the list of outgoing FlowFiles that were all derived from the same result set FlowFile. This can be used in conjunction with the fragment.identifier attribute to know which FlowFiles originated from the same query result set and in what order  FlowFiles were produced\",\n-                                \"name\": \"fragment.index\"\n-                            }\n-                        ]\n-                    }\n-                ],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"1.27.0\"\n-        },\n-        {\n-            \"artifact\": \"nifi-gcp-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-gcp-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"e0c4461\"\n-                        },\n-                        \"explicitRestrictions\": [\n-                            {\n-                                \"explanation\": \"The default configuration can read environment variables and system properties for credentials\",\n-                                \"requiredPermission\": \"access environment credentials\"\n-                            }\n-                        ],\n-                        \"group\": \"org.apache.nifi\",\n-                        \"propertyDescriptors\": {\n-                            \"application-default-credentials\": {\n+                            \"Search Recursively\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"true\",\n                                         \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"false\",\n                                         \"value\": \"false\"\n                                     }\n                                 ],\n                                 \"defaultValue\": \"false\",\n-                                \"description\": \"If true, uses Google Application Default Credentials, which checks the GOOGLE_APPLICATION_CREDENTIALS environment variable for a filepath to a service account JSON key, the config generated by the gcloud sdk, the App Engine service account, and the Compute Engine service account.\",\n-                                \"displayName\": \"Use Application Default Credentials\",\n+                                \"description\": \"If true, will pull files from arbitrarily nested subdirectories; otherwise, will not traverse subdirectories\",\n+                                \"displayName\": \"Search Recursively\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"application-default-credentials\",\n-                                \"required\": false,\n+                                \"name\": \"Search Recursively\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"compute-engine-credentials\": {\n+                            \"Transfer Mode\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"displayName\": \"Binary\",\n+                                        \"value\": \"Binary\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"displayName\": \"ASCII\",\n+                                        \"value\": \"ASCII\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"If true, uses Google Compute Engine Credentials of the Compute Engine VM Instance which NiFi is running on.\",\n-                                \"displayName\": \"Use Compute Engine Credentials\",\n+                                \"defaultValue\": \"Binary\",\n+                                \"description\": \"The FTP Transfer Mode\",\n+                                \"displayName\": \"Transfer Mode\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"compute-engine-credentials\",\n+                                \"name\": \"Transfer Mode\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"proxy-configuration-service\": {\n-                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests. Supported proxies: HTTP + AuthN\",\n-                                \"displayName\": \"Proxy Configuration Service\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"proxy-configuration-service\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.proxy.ProxyConfigurationService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            },\n-                            \"service-account-json\": {\n-                                \"description\": \"The raw JSON containing a Service Account keyfile.\",\n-                                \"displayName\": \"Service Account JSON\",\n+                            \"Username\": {\n+                                \"description\": \"Username\",\n+                                \"displayName\": \"Username\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"service-account-json\",\n-                                \"required\": false,\n-                                \"sensitive\": true\n+                                \"name\": \"Username\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n                             },\n-                            \"service-account-json-file\": {\n-                                \"description\": \"Path to a file containing a Service Account key file in JSON format.\",\n-                                \"displayName\": \"Service Account JSON File\",\n+                            \"et-initial-listing-target\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"Ignore entities having timestamp older than the specified 'Tracking Time Window' at the initial listing activity.\",\n+                                        \"displayName\": \"Tracking Time Window\",\n+                                        \"value\": \"window\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Regardless of entities timestamp, all existing entities will be listed at the initial listing activity.\",\n+                                        \"displayName\": \"All Available\",\n+                                        \"value\": \"all\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"all\",\n+                                \"description\": \"Specify how initial listing should be handled. Used by 'Tracking Entities' strategy.\",\n+                                \"displayName\": \"Entity Tracking Initial Listing Target\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"service-account-json-file\",\n+                                \"name\": \"et-initial-listing-target\",\n                                 \"required\": false,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"SINGLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\"\n-                                    ]\n-                                },\n                                 \"sensitive\": false\n-                            }\n-                        },\n-                        \"providedApiImplementations\": [\n-                            {\n-                                \"artifact\": \"nifi-gcp-services-api-nar\",\n-                                \"group\": \"org.apache.nifi\",\n-                                \"type\": \"org.apache.nifi.gcp.credentials.service.GCPCredentialsService\",\n-                                \"version\": \"1.27.0\"\n-                            }\n-                        ],\n-                        \"restricted\": true,\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"credentials\",\n-                            \"gcp\",\n-                            \"provider\"\n-                        ],\n-                        \"type\": \"org.apache.nifi.processors.gcp.credentials.service.GCPCredentialsControllerService\",\n-                        \"typeDescription\": \"Defines credentials for Google Cloud Platform processors. Uses Application Default credentials without configuration. Application Default credentials support environmental variable (GOOGLE_APPLICATION_CREDENTIALS) pointing to a credential file, the config generated by `gcloud auth application-default login`, AppEngine/Compute Engine service accounts, etc.\",\n-                        \"version\": \"1.27.0\"\n-                    }\n-                ],\n-                \"processors\": [\n-                    {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-gcp-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"e0c4461\"\n-                        },\n-                        \"defaultBulletinLevel\": \"WARN\",\n-                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": 1,\n-                            \"EVENT_DRIVEN\": 0,\n-                            \"TIMER_DRIVEN\": 1\n-                        },\n-                        \"defaultPenaltyDuration\": \"30 sec\",\n-                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"0 sec\"\n-                        },\n-                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n-                        \"defaultYieldDuration\": \"1 sec\",\n-                        \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_REQUIRED\",\n-                        \"primaryNodeOnly\": false,\n-                        \"propertyDescriptors\": {\n-                            \"GCP Credentials Provider Service\": {\n-                                \"description\": \"The Controller Service used to obtain Google Cloud Platform credentials.\",\n-                                \"displayName\": \"GCP Credentials Provider Service\",\n+                            },\n+                            \"et-state-cache\": {\n+                                \"description\": \"Listed entities are stored in the specified cache storage so that this processor can resume listing across NiFi restart or in case of primary node change. 'Tracking Entities' strategy require tracking information of all listed entities within the last 'Tracking Time Window'. To support large number of entities, the strategy uses DistributedMapCache instead of managed state. Cache key format is 'ListedEntities::{processorId}(::{nodeId})'. If it tracks per node listed entities, then the optional '::{nodeId}' part is added to manage state separately. E.g. cluster wide cache key = 'ListedEntities::8dda2321-0164-1000-50fa-3042fe7d6a7b', per node cache key = 'ListedEntities::8dda2321-0164-1000-50fa-3042fe7d6a7b::nifi-node3' The stored cache content is Gzipped JSON string. The cache key will be deleted when target listing configuration is changed. Used by 'Tracking Entities' strategy.\",\n+                                \"displayName\": \"Entity Tracking State Cache\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"GCP Credentials Provider Service\",\n-                                \"required\": true,\n+                                \"name\": \"et-state-cache\",\n+                                \"required\": false,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-gcp-services-api-nar\",\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.gcp.credentials.service.GCPCredentialsService\",\n+                                    \"type\": \"org.apache.nifi.distributed.cache.client.DistributedMapCacheClient\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             },\n-                            \"bigquery-api-endpoint\": {\n-                                \"defaultValue\": \"bigquerystorage.googleapis.com:443\",\n-                                \"description\": \"Can be used to override the default BigQuery endpoint. Default is bigquerystorage.googleapis.com:443. Format must be hostname:port.\",\n-                                \"displayName\": \"BigQuery API Endpoint\",\n+                            \"et-time-window\": {\n+                                \"defaultValue\": \"3 hours\",\n+                                \"description\": \"Specify how long this processor should track already-listed entities. 'Tracking Entities' strategy can pick any entity whose timestamp is inside the specified time window. For example, if set to '30 minutes', any entity having timestamp in recent 30 minutes will be the listing target when this processor runs. A listed entity is considered 'new/updated' and a FlowFile is emitted if one of following condition meets: 1. does not exist in the already-listed entities, 2. has newer timestamp than the cached entity, 3. has different size than the cached entity. If a cached entity's timestamp becomes older than specified time window, that entity will be removed from the cached already-listed entities. Used by 'Tracking Entities' strategy.\",\n+                                \"displayName\": \"Entity Tracking Time Window\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"bigquery-api-endpoint\",\n-                                \"required\": true,\n+                                \"name\": \"et-time-window\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"bq.append.record.count\": {\n-                                \"defaultValue\": \"20\",\n-                                \"description\": \"The number of records to be appended to the write stream at once. Applicable for both batch and stream types\",\n-                                \"displayName\": \"Append Record Count\",\n+                            \"follow-symlink\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"If true, will pull even symbolic files and also nested symbolic subdirectories; otherwise, will not read symbolic files and will not traverse symbolic link subdirectories\",\n+                                \"displayName\": \"Follow symlink\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"bq.append.record.count\",\n+                                \"name\": \"follow-symlink\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"bq.dataset\": {\n-                                \"defaultValue\": \"${bq.dataset}\",\n-                                \"description\": \"BigQuery dataset name (Note - The dataset must exist in GCP)\",\n-                                \"displayName\": \"Dataset\",\n+                            \"ftp-use-utf8\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"Tells the client to use UTF-8 encoding when processing files and filenames. If set to true, the server must also support UTF-8 encoding.\",\n+                                \"displayName\": \"Use UTF-8 Encoding\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"bq.dataset\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"ftp-use-utf8\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"bq.record.reader\": {\n-                                \"description\": \"Specifies the Controller Service to use for parsing incoming data.\",\n-                                \"displayName\": \"Record Reader\",\n+                            \"listing-strategy\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"This strategy tracks the latest timestamp of listed entity to determine new/updated entities. Since it only tracks few timestamps, it can manage listing state efficiently. However, any newly added, or updated entity having timestamp older than the tracked latest timestamp can not be picked by this strategy. For example, such situation can happen in a file system if a file with old timestamp is copied or moved into the target directory without its last modified timestamp being updated. Also may miss files when multiple subdirectories are being written at the same time while listing is running.\",\n+                                        \"displayName\": \"Tracking Timestamps\",\n+                                        \"value\": \"timestamps\"\n+                                    },\n+                                    {\n+                                        \"description\": \"This strategy tracks information of all the listed entities within the latest 'Entity Tracking Time Window' to determine new/updated entities. This strategy can pick entities having old timestamp that can be missed with 'Tracking Timestamps'. Works even when multiple subdirectories are being written at the same time while listing is running. However additional DistributedMapCache controller service is required and more JVM heap memory is used. See the description of 'Entity Tracking Time Window' property for further details on how it works.\",\n+                                        \"displayName\": \"Tracking Entities\",\n+                                        \"value\": \"entities\"\n+                                    },\n+                                    {\n+                                        \"description\": \"This strategy lists an entity without any tracking. The same entity will be listed each time on executing this processor. It is recommended to change the default run schedule value. Any property that related to the persisting state will be disregarded.\",\n+                                        \"displayName\": \"No Tracking\",\n+                                        \"value\": \"none\"\n+                                    },\n+                                    {\n+                                        \"description\": \"This strategy uses a sliding time window. The window starts where the previous window ended and ends with the 'current time'. One cycle will list files with modification time falling within the time window. Works even when multiple subdirectories are being written at the same time while listing is running. IMPORTANT: This strategy works properly only if the time on both the system hosting NiFi and the one hosting the files are accurate.\",\n+                                        \"displayName\": \"Time Window\",\n+                                        \"value\": \"time-window\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"timestamps\",\n+                                \"description\": \"Specify how to determine new/updated entities. See each strategy descriptions for detail.\",\n+                                \"displayName\": \"Listing Strategy\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"bq.record.reader\",\n+                                \"name\": \"listing-strategy\",\n                                 \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"proxy-configuration-service\": {\n+                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests. If set, it supersedes proxy settings configured per component. Supported proxies: HTTP + AuthN, SOCKS + AuthN\",\n+                                \"displayName\": \"Proxy Configuration Service\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"proxy-configuration-service\",\n+                                \"required\": false,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n                                     \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n+                                    \"type\": \"org.apache.nifi.proxy.ProxyConfigurationService\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             },\n-                            \"bq.skip.invalid.rows\": {\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"Sets whether to insert all valid rows of a request, even if invalid rows exist. If not set the entire insert request will fail if it contains an invalid row.\",\n-                                \"displayName\": \"Skip Invalid Rows\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"bq.skip.invalid.rows\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"bq.table.name\": {\n-                                \"defaultValue\": \"${bq.table.name}\",\n-                                \"description\": \"BigQuery table name\",\n-                                \"displayName\": \"Table Name\",\n+                            \"record-writer\": {\n+                                \"description\": \"Specifies the Record Writer to use for creating the listing. If not specified, one FlowFile will be created for each entity that is listed. If the Record Writer is specified, all entities will be written to a single FlowFile instead of adding attributes to individual FlowFiles.\",\n+                                \"displayName\": \"Record Writer\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"bq.table.name\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"record-writer\",\n+                                \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n                             },\n-                            \"bq.transfer.type\": {\n+                            \"target-system-timestamp-precision\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Use streaming record handling strategy\",\n-                                        \"displayName\": \"STREAM\",\n-                                        \"value\": \"STREAM\"\n+                                        \"description\": \"Automatically detect time unit deterministically based on candidate entries timestamp. Please note that this option may take longer to list entities unnecessarily, if none of entries has a precise precision timestamp. E.g. even if a target system supports millis, if all entries only have timestamps without millis, such as '2017-06-16 09:06:34.000', then its precision is determined as 'seconds'.\",\n+                                        \"displayName\": \"Auto Detect\",\n+                                        \"value\": \"auto-detect\"\n                                     },\n                                     {\n-                                        \"description\": \"Use batching record handling strategy\",\n-                                        \"displayName\": \"BATCH\",\n-                                        \"value\": \"BATCH\"\n+                                        \"description\": \"This option provides the minimum latency for an entry from being available to being listed if target system supports millis, if not, use other options.\",\n+                                        \"displayName\": \"Milliseconds\",\n+                                        \"value\": \"millis\"\n+                                    },\n+                                    {\n+                                        \"description\": \"For a target system that does not have millis precision, but has in seconds.\",\n+                                        \"displayName\": \"Seconds\",\n+                                        \"value\": \"seconds\"\n+                                    },\n+                                    {\n+                                        \"description\": \"For a target system that only supports precision in minutes.\",\n+                                        \"displayName\": \"Minutes\",\n+                                        \"value\": \"minutes\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"STREAM\",\n-                                \"description\": \"Defines the preferred transfer type streaming or batching\",\n-                                \"displayName\": \"Transfer Type\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"bq.transfer.type\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"gcp-project-id\": {\n-                                \"description\": \"Google Cloud Project ID\",\n-                                \"displayName\": \"Project ID\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"gcp-project-id\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"gcp-retry-count\": {\n-                                \"defaultValue\": \"6\",\n-                                \"description\": \"How many retry attempts should be made before routing to the failure relationship.\",\n-                                \"displayName\": \"Number of retries\",\n+                                \"defaultValue\": \"auto-detect\",\n+                                \"description\": \"Specify timestamp precision at the target system. Since this processor uses timestamp of entities to decide which should be listed, it is crucial to use the right timestamp precision.\",\n+                                \"displayName\": \"Target System Timestamp Precision\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"gcp-retry-count\",\n+                                \"name\": \"target-system-timestamp-precision\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             }\n                         },\n                         \"seeAlso\": [\n-                            \"org.apache.nifi.processors.gcp.bigquery.PutBigQueryBatch\",\n-                            \"org.apache.nifi.processors.gcp.bigquery.PutBigQueryStreaming\"\n+                            \"org.apache.nifi.processors.standard.FetchFTP\",\n+                            \"org.apache.nifi.processors.standard.GetFTP\",\n+                            \"org.apache.nifi.processors.standard.PutFTP\"\n                         ],\n                         \"sideEffectFree\": false,\n+                        \"stateful\": {\n+                            \"description\": \"After performing a listing of files, the timestamp of the newest file is stored. This allows the Processor to list only files that have been added or modified after this date the next time that the Processor is run. State is stored across the cluster so that this Processor can be run on Primary Node only and if a new Primary Node is selected, the new node will not duplicate the data that was listed by the previous Primary Node.\",\n+                            \"scopes\": [\n+                                \"CLUSTER\"\n+                            ]\n+                        },\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"FlowFiles are routed to this relationship after a successful Google BigQuery operation.\",\n+                                \"description\": \"All FlowFiles that are received are routed to success\",\n                                 \"name\": \"success\"\n-                            },\n-                            {\n-                                \"description\": \"FlowFiles are routed to this relationship if the Google BigQuery operation fails.\",\n-                                \"name\": \"failure\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\",\n-                            \"EVENT_DRIVEN\"\n+                            \"CRON_DRIVEN\"\n                         ],\n                         \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": true,\n+                        \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"bigquery\",\n-                            \"bq\",\n-                            \"google\",\n-                            \"google cloud\"\n+                            \"files\",\n+                            \"ftp\",\n+                            \"ingest\",\n+                            \"input\",\n+                            \"list\",\n+                            \"remote\",\n+                            \"source\"\n                         ],\n                         \"triggerSerially\": true,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.gcp.bigquery.PutBigQuery\",\n-                        \"typeDescription\": \"Writes the contents of a FlowFile to a Google BigQuery table. The processor is record based so the schema that is used is driven by the RecordReader. Attributes that are not matched to the target schema are skipped. Exactly once delivery semantics are achieved via stream offsets.\",\n+                        \"type\": \"org.apache.nifi.processors.standard.ListFTP\",\n+                        \"typeDescription\": \"Performs a listing of the files residing on an FTP server. For each file that is found on the remote server, a new FlowFile will be created with the filename attribute set to the name of the file on the remote server. This can then be used in conjunction with FetchFTP in order to fetch those files.\",\n                         \"version\": \"1.27.0\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"Number of records successfully inserted\",\n-                                \"name\": \"bq.records.count\"\n+                                \"description\": \"The hostname of the FTP Server\",\n+                                \"name\": \"ftp.remote.host\"\n+                            },\n+                            {\n+                                \"description\": \"The port that was connected to on the FTP Server\",\n+                                \"name\": \"ftp.remote.port\"\n+                            },\n+                            {\n+                                \"description\": \"The username of the user that performed the FTP Listing\",\n+                                \"name\": \"ftp.listing.user\"\n+                            },\n+                            {\n+                                \"description\": \"The numeric owner id of the source file\",\n+                                \"name\": \"file.owner\"\n+                            },\n+                            {\n+                                \"description\": \"The numeric group id of the source file\",\n+                                \"name\": \"file.group\"\n+                            },\n+                            {\n+                                \"description\": \"The read/write/execute permissions of the source file\",\n+                                \"name\": \"file.permissions\"\n+                            },\n+                            {\n+                                \"description\": \"The number of bytes in the source file\",\n+                                \"name\": \"file.size\"\n+                            },\n+                            {\n+                                \"description\": \"The timestamp of when the file in the filesystem waslast modified as 'yyyy-MM-dd'T'HH:mm:ssZ'\",\n+                                \"name\": \"file.lastModifiedTime\"\n+                            },\n+                            {\n+                                \"description\": \"The name of the file on the FTP Server\",\n+                                \"name\": \"filename\"\n+                            },\n+                            {\n+                                \"description\": \"The fully qualified name of the directory on the FTP Server from which the file was pulled\",\n+                                \"name\": \"path\"\n                             }\n                         ]\n                     },\n                     {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-gcp-nar\",\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n                         },\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"0 sec\"\n+                            \"TIMER_DRIVEN\": \"1 min\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n-                        \"deprecated\": true,\n-                        \"deprecationAlternatives\": [\n-                            \"org.apache.nifi.processors.gcp.bigquery.PutBigQuery\"\n-                        ],\n-                        \"deprecationReason\": \"This processor is deprecated and may be removed in future releases.\",\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_REQUIRED\",\n+                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"GCP Credentials Provider Service\": {\n-                                \"description\": \"The Controller Service used to obtain Google Cloud Platform credentials.\",\n-                                \"displayName\": \"GCP Credentials Provider Service\",\n+                            \"File Filter\": {\n+                                \"defaultValue\": \"[^\\\\.].*\",\n+                                \"description\": \"Only files whose names match the given regular expression will be picked up\",\n+                                \"displayName\": \"File Filter\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"GCP Credentials Provider Service\",\n+                                \"name\": \"File Filter\",\n                                 \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-gcp-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.gcp.credentials.service.GCPCredentialsService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n+                                \"sensitive\": false\n                             },\n-                            \"bq.avro.use.logical.types\": {\n+                            \"Ignore Hidden Files\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"true\",\n                                         \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"false\",\n                                         \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"If format is set to Avro and if this option is set to true, you can interpret logical types into their corresponding types (such as TIMESTAMP) instead of only using their raw types (such as INTEGER).\",\n-                                \"displayName\": \"Avro Input - Use Logical Types\",\n+                                \"defaultValue\": \"true\",\n+                                \"description\": \"Indicates whether or not hidden files should be ignored\",\n+                                \"displayName\": \"Ignore Hidden Files\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"bq.avro.use.logical.types\",\n+                                \"name\": \"Ignore Hidden Files\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"bq.csv.allow.jagged.rows\": {\n+                            \"Include File Attributes\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"true\",\n                                         \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"false\",\n                                         \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"Set whether BigQuery should accept rows that are missing trailing optional columns. If true, BigQuery treats missing trailing columns as null values. If false, records with missing trailing columns are treated as bad records, and if there are too many bad records, an invalid error is returned in the job result. By default, rows with missing trailing columns are considered bad records.\",\n-                                \"displayName\": \"CSV Input - Allow Jagged Rows\",\n+                                \"defaultValue\": \"true\",\n+                                \"description\": \"Whether or not to include information such as the file's Last Modified Time and Owner as FlowFile Attributes. Depending on the File System being used, gathering this information can be expensive and as a result should be disabled. This is especially true of remote file shares.\",\n+                                \"displayName\": \"Include File Attributes\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"bq.csv.allow.jagged.rows\",\n+                                \"name\": \"Include File Attributes\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"bq.csv.allow.quoted.new.lines\": {\n+                            \"Input Directory\": {\n+                                \"description\": \"The input directory from which files to pull files\",\n+                                \"displayName\": \"Input Directory\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Input Directory\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Input Directory Location\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"description\": \"Input Directory is located on a local disk. State will be stored locally on each node in the cluster.\",\n+                                        \"displayName\": \"Local\",\n+                                        \"value\": \"Local\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"description\": \"Input Directory is located on a remote system. State will be stored across the cluster so that the listing can be performed on Primary Node Only and another node can pick up where the last node left off, if the Primary Node changes\",\n+                                        \"displayName\": \"Remote\",\n+                                        \"value\": \"Remote\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"Sets whether BigQuery should allow quoted data sections that contain newline characters in a CSV file. By default quoted newline are not allowed.\",\n-                                \"displayName\": \"CSV Input - Allow Quoted New Lines\",\n+                                \"defaultValue\": \"Local\",\n+                                \"description\": \"Specifies where the Input Directory is located. This is used to determine whether state should be stored locally or across the cluster.\",\n+                                \"displayName\": \"Input Directory Location\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"bq.csv.allow.quoted.new.lines\",\n+                                \"name\": \"Input Directory Location\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"bq.csv.charset\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"UTF-8\",\n-                                        \"value\": \"UTF-8\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"ISO-8859-1\",\n-                                        \"value\": \"ISO-8859-1\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"UTF-8\",\n-                                \"description\": \"Sets the character encoding of the data.\",\n-                                \"displayName\": \"CSV Input - Character Set\",\n+                            \"Maximum File Age\": {\n+                                \"description\": \"The maximum age that a file must be in order to be pulled; any file older than this amount of time (according to last modification date) will be ignored\",\n+                                \"displayName\": \"Maximum File Age\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"bq.csv.charset\",\n-                                \"required\": true,\n+                                \"name\": \"Maximum File Age\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"bq.csv.delimiter\": {\n-                                \"defaultValue\": \",\",\n-                                \"description\": \"Sets the separator for fields in a CSV file. BigQuery converts the string to ISO-8859-1 encoding, and then uses the first byte of the encoded string to split the data in its raw, binary state. BigQuery also supports the escape sequence \\\"\\t\\\" to specify a tab separator. The default value is a comma (',').\",\n-                                \"displayName\": \"CSV Input - Field Delimiter\",\n+                            \"Maximum File Size\": {\n+                                \"description\": \"The maximum size that a file can be in order to be pulled\",\n+                                \"displayName\": \"Maximum File Size\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"bq.csv.delimiter\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Maximum File Size\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"bq.csv.quote\": {\n-                                \"defaultValue\": \"\\\"\",\n-                                \"description\": \"Sets the value that is used to quote data sections in a CSV file. BigQuery converts the string to ISO-8859-1 encoding, and then uses the first byte of the encoded string to split the data in its raw, binary state. The default value is a double-quote ('\\\"'). If your data does not contain quoted sections, set the property value to an empty string. If your data contains quoted newline characters, you must also set the Allow Quoted New Lines property to true.\",\n-                                \"displayName\": \"CSV Input - Quote\",\n+                            \"Minimum File Age\": {\n+                                \"defaultValue\": \"0 sec\",\n+                                \"description\": \"The minimum age that a file must be in order to be pulled; any file younger than this amount of time (according to last modification date) will be ignored\",\n+                                \"displayName\": \"Minimum File Age\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"bq.csv.quote\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Minimum File Age\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"bq.csv.skip.leading.rows\": {\n-                                \"defaultValue\": \"0\",\n-                                \"description\": \"Sets the number of rows at the top of a CSV file that BigQuery will skip when reading the data. The default value is 0. This property is useful if you have header rows in the file that should be skipped.\",\n-                                \"displayName\": \"CSV Input - Skip Leading Rows\",\n+                            \"Minimum File Size\": {\n+                                \"defaultValue\": \"0 B\",\n+                                \"description\": \"The minimum size that a file must be in order to be pulled\",\n+                                \"displayName\": \"Minimum File Size\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"bq.csv.skip.leading.rows\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Minimum File Size\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"bq.dataset\": {\n-                                \"defaultValue\": \"${bq.dataset}\",\n-                                \"description\": \"BigQuery dataset name (Note - The dataset must exist in GCP)\",\n-                                \"displayName\": \"Dataset\",\n+                            \"Path Filter\": {\n+                                \"description\": \"When Recurse Subdirectories is true, then only subdirectories whose path matches the given regular expression will be scanned\",\n+                                \"displayName\": \"Path Filter\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"bq.dataset\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Path Filter\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"bq.load.create_disposition\": {\n+                            \"Recurse Subdirectories\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Configures the job to create the table if it does not exist.\",\n-                                        \"displayName\": \"CREATE_IF_NEEDED\",\n-                                        \"value\": \"CREATE_IF_NEEDED\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n-                                        \"description\": \"Configures the job to fail with a not-found error if the table does not exist.\",\n-                                        \"displayName\": \"CREATE_NEVER\",\n-                                        \"value\": \"CREATE_NEVER\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"CREATE_IF_NEEDED\",\n-                                \"description\": \"Sets whether the job is allowed to create new tables\",\n-                                \"displayName\": \"Create Disposition\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"bq.load.create_disposition\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"bq.load.ignore_unknown\": {\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"Sets whether BigQuery should allow extra values that are not represented in the table schema. If true, the extra values are ignored. If false, records with extra columns are treated as bad records, and if there are too many bad records, an invalid error is returned in the job result. By default unknown values are not allowed.\",\n-                                \"displayName\": \"Ignore Unknown Values\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"bq.load.ignore_unknown\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"bq.load.max_badrecords\": {\n-                                \"defaultValue\": \"0\",\n-                                \"description\": \"Sets the maximum number of bad records that BigQuery can ignore when running the job. If the number of bad records exceeds this value, an invalid error is returned in the job result. By default no bad record is ignored.\",\n-                                \"displayName\": \"Max Bad Records\",\n+                                \"defaultValue\": \"true\",\n+                                \"description\": \"Indicates whether to list files from subdirectories of the directory\",\n+                                \"displayName\": \"Recurse Subdirectories\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"bq.load.max_badrecords\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"bq.load.type\": {\n-                                \"description\": \"Data type of the file to be loaded. Possible values: AVRO, NEWLINE_DELIMITED_JSON, CSV.\",\n-                                \"displayName\": \"Load file type\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"bq.load.type\",\n+                                \"name\": \"Recurse Subdirectories\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"bq.load.write_disposition\": {\n+                            \"et-initial-listing-target\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Configures the job to fail with a duplicate error if the table already exists.\",\n-                                        \"displayName\": \"WRITE_EMPTY\",\n-                                        \"value\": \"WRITE_EMPTY\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Configures the job to append data to the table if it already exists.\",\n-                                        \"displayName\": \"WRITE_APPEND\",\n-                                        \"value\": \"WRITE_APPEND\"\n+                                        \"description\": \"Ignore entities having timestamp older than the specified 'Tracking Time Window' at the initial listing activity.\",\n+                                        \"displayName\": \"Tracking Time Window\",\n+                                        \"value\": \"window\"\n                                     },\n                                     {\n-                                        \"description\": \"Configures the job to overwrite the table data if table already exists.\",\n-                                        \"displayName\": \"WRITE_TRUNCATE\",\n-                                        \"value\": \"WRITE_TRUNCATE\"\n+                                        \"description\": \"Regardless of entities timestamp, all existing entities will be listed at the initial listing activity.\",\n+                                        \"displayName\": \"All Available\",\n+                                        \"value\": \"all\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"WRITE_EMPTY\",\n-                                \"description\": \"Sets the action that should occur if the destination table already exists.\",\n-                                \"displayName\": \"Write Disposition\",\n+                                \"defaultValue\": \"all\",\n+                                \"description\": \"Specify how initial listing should be handled. Used by 'Tracking Entities' strategy.\",\n+                                \"displayName\": \"Entity Tracking Initial Listing Target\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"bq.load.write_disposition\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"bq.readtimeout\": {\n-                                \"defaultValue\": \"5 minutes\",\n-                                \"description\": \"Load Job Time Out\",\n-                                \"displayName\": \"Read Timeout\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"bq.readtimeout\",\n-                                \"required\": true,\n+                                \"name\": \"et-initial-listing-target\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"bq.table.name\": {\n-                                \"defaultValue\": \"${bq.table.name}\",\n-                                \"description\": \"BigQuery table name\",\n-                                \"displayName\": \"Table Name\",\n+                            \"et-node-identifier\": {\n+                                \"defaultValue\": \"${hostname()}\",\n+                                \"description\": \"The configured value will be appended to the cache key so that listing state can be tracked per NiFi node rather than cluster wide when tracking state is scoped to LOCAL. Used by 'Tracking Entities' strategy.\",\n+                                \"displayName\": \"Entity Tracking Node Identifier\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"bq.table.name\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"et-node-identifier\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"bq.table.schema\": {\n-                                \"description\": \"BigQuery schema in JSON format\",\n-                                \"displayName\": \"Table Schema\",\n+                            \"et-state-cache\": {\n+                                \"description\": \"Listed entities are stored in the specified cache storage so that this processor can resume listing across NiFi restart or in case of primary node change. 'Tracking Entities' strategy require tracking information of all listed entities within the last 'Tracking Time Window'. To support large number of entities, the strategy uses DistributedMapCache instead of managed state. Cache key format is 'ListedEntities::{processorId}(::{nodeId})'. If it tracks per node listed entities, then the optional '::{nodeId}' part is added to manage state separately. E.g. cluster wide cache key = 'ListedEntities::8dda2321-0164-1000-50fa-3042fe7d6a7b', per node cache key = 'ListedEntities::8dda2321-0164-1000-50fa-3042fe7d6a7b::nifi-node3' The stored cache content is Gzipped JSON string. The cache key will be deleted when target listing configuration is changed. Used by 'Tracking Entities' strategy.\",\n+                                \"displayName\": \"Entity Tracking State Cache\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"bq.table.schema\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"et-state-cache\",\n                                 \"required\": false,\n-                                \"sensitive\": false\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.distributed.cache.client.DistributedMapCacheClient\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n                             },\n-                            \"gcp-project-id\": {\n-                                \"description\": \"Google Cloud Project ID\",\n-                                \"displayName\": \"Project ID\",\n+                            \"et-time-window\": {\n+                                \"defaultValue\": \"3 hours\",\n+                                \"description\": \"Specify how long this processor should track already-listed entities. 'Tracking Entities' strategy can pick any entity whose timestamp is inside the specified time window. For example, if set to '30 minutes', any entity having timestamp in recent 30 minutes will be the listing target when this processor runs. A listed entity is considered 'new/updated' and a FlowFile is emitted if one of following condition meets: 1. does not exist in the already-listed entities, 2. has newer timestamp than the cached entity, 3. has different size than the cached entity. If a cached entity's timestamp becomes older than specified time window, that entity will be removed from the cached already-listed entities. Used by 'Tracking Entities' strategy.\",\n+                                \"displayName\": \"Entity Tracking Time Window\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"gcp-project-id\",\n+                                \"name\": \"et-time-window\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"gcp-proxy-host\": {\n-                                \"description\": \"IP or hostname of the proxy to be used.\\n You might need to set the following properties in bootstrap for https proxy usage:\\n-Djdk.http.auth.tunneling.disabledSchemes=\\n-Djdk.http.auth.proxying.disabledSchemes=\",\n-                                \"displayName\": \"Proxy host\",\n+                            \"listing-strategy\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"This strategy tracks the latest timestamp of listed entity to determine new/updated entities. Since it only tracks few timestamps, it can manage listing state efficiently. However, any newly added, or updated entity having timestamp older than the tracked latest timestamp can not be picked by this strategy. For example, such situation can happen in a file system if a file with old timestamp is copied or moved into the target directory without its last modified timestamp being updated. Also may miss files when multiple subdirectories are being written at the same time while listing is running.\",\n+                                        \"displayName\": \"Tracking Timestamps\",\n+                                        \"value\": \"timestamps\"\n+                                    },\n+                                    {\n+                                        \"description\": \"This strategy tracks information of all the listed entities within the latest 'Entity Tracking Time Window' to determine new/updated entities. This strategy can pick entities having old timestamp that can be missed with 'Tracking Timestamps'. Works even when multiple subdirectories are being written at the same time while listing is running. However additional DistributedMapCache controller service is required and more JVM heap memory is used. See the description of 'Entity Tracking Time Window' property for further details on how it works.\",\n+                                        \"displayName\": \"Tracking Entities\",\n+                                        \"value\": \"entities\"\n+                                    },\n+                                    {\n+                                        \"description\": \"This strategy lists an entity without any tracking. The same entity will be listed each time on executing this processor. It is recommended to change the default run schedule value. Any property that related to the persisting state will be disregarded.\",\n+                                        \"displayName\": \"No Tracking\",\n+                                        \"value\": \"none\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"timestamps\",\n+                                \"description\": \"Specify how to determine new/updated entities. See each strategy descriptions for detail.\",\n+                                \"displayName\": \"Listing Strategy\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"gcp-proxy-host\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"listing-strategy\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"gcp-proxy-port\": {\n-                                \"description\": \"Proxy port number\",\n-                                \"displayName\": \"Proxy port\",\n+                            \"max-listing-time\": {\n+                                \"defaultValue\": \"3 mins\",\n+                                \"description\": \"The maximum amount of time that listing any single directory is expected to take. If the listing for the directory specified by the 'Input Directory' property, or the listing of any subdirectory (if 'Recurse' is set to true) takes longer than this amount of time, a warning bulletin will be generated for each directory listing that exceeds this amount of time.\",\n+                                \"displayName\": \"Max Directory Listing Time\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"gcp-proxy-port\",\n+                                \"name\": \"max-listing-time\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"gcp-proxy-user-name\": {\n-                                \"description\": \"HTTP Proxy Username\",\n-                                \"displayName\": \"HTTP Proxy Username\",\n+                            \"max-operation-time\": {\n+                                \"defaultValue\": \"10 secs\",\n+                                \"description\": \"The maximum amount of time that any single disk operation is expected to take. If any disk operation takes longer than this amount of time, a warning bulletin will be generated for each operation that exceeds this amount of time.\",\n+                                \"displayName\": \"Max Disk Operation Time\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"gcp-proxy-user-name\",\n+                                \"name\": \"max-operation-time\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"gcp-proxy-user-password\": {\n-                                \"description\": \"HTTP Proxy Password\",\n-                                \"displayName\": \"HTTP Proxy Password\",\n+                            \"max-performance-metrics\": {\n+                                \"defaultValue\": \"100000\",\n+                                \"description\": \"If the 'Track Performance' property is set to 'true', this property indicates the maximum number of files whose performance metrics should be held onto. A smaller value for this property will result in less heap utilization, while a larger value may provide more accurate insights into how the disk access operations are performing\",\n+                                \"displayName\": \"Maximum Number of Files to Track\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"gcp-proxy-user-password\",\n-                                \"required\": false,\n-                                \"sensitive\": true\n-                            },\n-                            \"gcp-retry-count\": {\n-                                \"defaultValue\": \"6\",\n-                                \"description\": \"How many retry attempts should be made before routing to the failure relationship.\",\n-                                \"displayName\": \"Number of retries\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"gcp-retry-count\",\n+                                \"name\": \"max-performance-metrics\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"proxy-configuration-service\": {\n-                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests. If set, it supersedes proxy settings configured per component. Supported proxies: HTTP + AuthN\",\n-                                \"displayName\": \"Proxy Configuration Service\",\n+                            \"record-writer\": {\n+                                \"description\": \"Specifies the Record Writer to use for creating the listing. If not specified, one FlowFile will be created for each entity that is listed. If the Record Writer is specified, all entities will be written to a single FlowFile instead of adding attributes to individual FlowFiles.\",\n+                                \"displayName\": \"Record Writer\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"proxy-configuration-service\",\n+                                \"name\": \"record-writer\",\n                                 \"required\": false,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n                                     \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.proxy.ProxyConfigurationService\",\n+                                    \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n                                     \"version\": \"1.27.0\"\n                                 }\n+                            },\n+                            \"target-system-timestamp-precision\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"Automatically detect time unit deterministically based on candidate entries timestamp. Please note that this option may take longer to list entities unnecessarily, if none of entries has a precise precision timestamp. E.g. even if a target system supports millis, if all entries only have timestamps without millis, such as '2017-06-16 09:06:34.000', then its precision is determined as 'seconds'.\",\n+                                        \"displayName\": \"Auto Detect\",\n+                                        \"value\": \"auto-detect\"\n+                                    },\n+                                    {\n+                                        \"description\": \"This option provides the minimum latency for an entry from being available to being listed if target system supports millis, if not, use other options.\",\n+                                        \"displayName\": \"Milliseconds\",\n+                                        \"value\": \"millis\"\n+                                    },\n+                                    {\n+                                        \"description\": \"For a target system that does not have millis precision, but has in seconds.\",\n+                                        \"displayName\": \"Seconds\",\n+                                        \"value\": \"seconds\"\n+                                    },\n+                                    {\n+                                        \"description\": \"For a target system that only supports precision in minutes.\",\n+                                        \"displayName\": \"Minutes\",\n+                                        \"value\": \"minutes\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"auto-detect\",\n+                                \"description\": \"Specify timestamp precision at the target system. Since this processor uses timestamp of entities to decide which should be listed, it is crucial to use the right timestamp precision.\",\n+                                \"displayName\": \"Target System Timestamp Precision\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"target-system-timestamp-precision\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"track-performance\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"Whether or not the Processor should track the performance of disk access operations. If true, all accesses to disk will be recorded, including the file being accessed, the information being obtained, and how long it takes. This is then logged periodically at a DEBUG level. While the amount of data will be capped, this option may still consume a significant amount of heap (controlled by the 'Maximum Number of Files to Track' property), but it can be very useful for troubleshooting purposes if performance is poor is degraded.\",\n+                                \"displayName\": \"Track Performance\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"track-performance\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n                             }\n                         },\n                         \"seeAlso\": [\n-                            \"org.apache.nifi.processors.gcp.storage.DeleteGCSObject\",\n-                            \"org.apache.nifi.processors.gcp.storage.PutGCSObject\"\n+                            \"org.apache.nifi.processors.standard.FetchFile\",\n+                            \"org.apache.nifi.processors.standard.GetFile\",\n+                            \"org.apache.nifi.processors.standard.PutFile\"\n                         ],\n                         \"sideEffectFree\": false,\n+                        \"stateful\": {\n+                            \"description\": \"After performing a listing of files, the timestamp of the newest file is stored. This allows the Processor to list only files that have been added or modified after this date the next time that the Processor is run. Whether the state is stored with a Local or Cluster scope depends on the value of the <Input Directory Location> property.\",\n+                            \"scopes\": [\n+                                \"CLUSTER\",\n+                                \"LOCAL\"\n+                            ]\n+                        },\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"FlowFiles are routed to this relationship after a successful Google BigQuery operation.\",\n+                                \"description\": \"All FlowFiles that are received are routed to success\",\n                                 \"name\": \"success\"\n-                            },\n-                            {\n-                                \"description\": \"FlowFiles are routed to this relationship if the Google BigQuery operation fails.\",\n-                                \"name\": \"failure\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n                         \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"bigquery\",\n-                            \"bq\",\n-                            \"google\",\n-                            \"google cloud\"\n+                            \"file\",\n+                            \"filesystem\",\n+                            \"get\",\n+                            \"ingest\",\n+                            \"list\",\n+                            \"source\"\n                         ],\n-                        \"triggerSerially\": false,\n+                        \"triggerSerially\": true,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.gcp.bigquery.PutBigQueryBatch\",\n-                        \"typeDescription\": \"Please be aware this processor is deprecated and may be removed in the near future. Use PutBigQuery instead. Batch loads flow files content to a Google BigQuery table.\",\n+                        \"type\": \"org.apache.nifi.processors.standard.ListFile\",\n+                        \"typeDescription\": \"Retrieves a listing of files from the input directory. For each file listed, creates a FlowFile that represents the file so that it can be fetched in conjunction with FetchFile. This Processor is designed to run on Primary Node only in a cluster when 'Input Directory Location' is set to 'Remote'. If the primary node changes, the new Primary Node will pick up where the previous node left off without duplicating all the data. When 'Input Directory Location' is 'Local', the 'Execution' mode can be anything, and synchronization won't happen. Unlike GetFile, this Processor does not delete any data from the local filesystem.\",\n                         \"version\": \"1.27.0\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"Time load job creation\",\n-                                \"name\": \"bq.job.stat.creation_time\"\n+                                \"description\": \"The name of the file that was read from filesystem.\",\n+                                \"name\": \"filename\"\n                             },\n                             {\n-                                \"description\": \"Time load job ended\",\n-                                \"name\": \"bq.job.stat.end_time\"\n+                                \"description\": \"The path is set to the relative path of the file's directory on filesystem compared to the Input Directory property. For example, if Input Directory is set to /tmp, then files picked up from /tmp will have the path attribute set to \\\"/\\\". If the Recurse Subdirectories property is set to true and a file is picked up from /tmp/abc/1/2/3, then the path attribute will be set to \\\"abc/1/2/3/\\\".\",\n+                                \"name\": \"path\"\n                             },\n                             {\n-                                \"description\": \"Time load job started\",\n-                                \"name\": \"bq.job.stat.start_time\"\n+                                \"description\": \"The absolute.path is set to the absolute path of the file's directory on filesystem. For example, if the Input Directory property is set to /tmp, then files picked up from /tmp will have the path attribute set to \\\"/tmp/\\\". If the Recurse Subdirectories property is set to true and a file is picked up from /tmp/abc/1/2/3, then the path attribute will be set to \\\"/tmp/abc/1/2/3/\\\".\",\n+                                \"name\": \"absolute.path\"\n                             },\n                             {\n-                                \"description\": \"API Link to load job\",\n-                                \"name\": \"bq.job.link\"\n+                                \"description\": \"The user that owns the file in filesystem\",\n+                                \"name\": \"file.owner\"\n                             },\n                             {\n-                                \"description\": \"ID of the BigQuery job\",\n-                                \"name\": \"bq.job.id\"\n+                                \"description\": \"The group that owns the file in filesystem\",\n+                                \"name\": \"file.group\"\n                             },\n                             {\n-                                \"description\": \"Load job error message\",\n-                                \"name\": \"bq.error.message\"\n+                                \"description\": \"The number of bytes in the file in filesystem\",\n+                                \"name\": \"file.size\"\n                             },\n                             {\n-                                \"description\": \"Load job error reason\",\n-                                \"name\": \"bq.error.reason\"\n+                                \"description\": \"The permissions for the file in filesystem. This is formatted as 3 characters for the owner, 3 for the group, and 3 for other users. For example rw-rw-r--\",\n+                                \"name\": \"file.permissions\"\n                             },\n                             {\n-                                \"description\": \"Load job error location\",\n-                                \"name\": \"bq.error.location\"\n+                                \"description\": \"The timestamp of when the file in filesystem was last modified as 'yyyy-MM-dd'T'HH:mm:ssZ'\",\n+                                \"name\": \"file.lastModifiedTime\"\n                             },\n                             {\n-                                \"description\": \"Number of records successfully inserted\",\n-                                \"name\": \"bq.records.count\"\n+                                \"description\": \"The timestamp of when the file in filesystem was last accessed as 'yyyy-MM-dd'T'HH:mm:ssZ'\",\n+                                \"name\": \"file.lastAccessTime\"\n+                            },\n+                            {\n+                                \"description\": \"The timestamp of when the file in filesystem was created as 'yyyy-MM-dd'T'HH:mm:ssZ'\",\n+                                \"name\": \"file.creationTime\"\n                             }\n                         ]\n                     },\n                     {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-gcp-nar\",\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n                         },\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"0 sec\"\n+                            \"TIMER_DRIVEN\": \"1 min\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n-                        \"deprecated\": true,\n-                        \"deprecationAlternatives\": [\n-                            \"org.apache.nifi.processors.gcp.bigquery.PutBigQuery\"\n-                        ],\n-                        \"deprecationReason\": \"This processor is deprecated and may be removed in future releases.\",\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_REQUIRED\",\n-                        \"primaryNodeOnly\": false,\n+                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n+                        \"primaryNodeOnly\": true,\n                         \"propertyDescriptors\": {\n-                            \"GCP Credentials Provider Service\": {\n-                                \"description\": \"The Controller Service used to obtain Google Cloud Platform credentials.\",\n-                                \"displayName\": \"GCP Credentials Provider Service\",\n+                            \"Ciphers Allowed\": {\n+                                \"description\": \"A comma-separated list of Ciphers allowed for SFTP connections. Leave unset to allow all. Available options are: 3des-cbc, 3des-ctr, aes128-cbc, aes128-ctr, aes128-gcm@openssh.com, aes192-cbc, aes192-ctr, aes256-cbc, aes256-ctr, aes256-gcm@openssh.com, arcfour, arcfour128, arcfour256, blowfish-cbc, blowfish-ctr, cast128-cbc, cast128-ctr, chacha20-poly1305@openssh.com, idea-cbc, idea-ctr, serpent128-cbc, serpent128-ctr, serpent192-cbc, serpent192-ctr, serpent256-cbc, serpent256-ctr, twofish-cbc, twofish128-cbc, twofish128-ctr, twofish192-cbc, twofish192-ctr, twofish256-cbc, twofish256-ctr\",\n+                                \"displayName\": \"Ciphers Allowed\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"GCP Credentials Provider Service\",\n-                                \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-gcp-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.gcp.credentials.service.GCPCredentialsService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Ciphers Allowed\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n                             },\n-                            \"bq.dataset\": {\n-                                \"defaultValue\": \"${bq.dataset}\",\n-                                \"description\": \"BigQuery dataset name (Note - The dataset must exist in GCP)\",\n-                                \"displayName\": \"Dataset\",\n+                            \"Connection Timeout\": {\n+                                \"defaultValue\": \"30 sec\",\n+                                \"description\": \"Amount of time to wait before timing out while creating a connection\",\n+                                \"displayName\": \"Connection Timeout\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"bq.dataset\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Connection Timeout\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"bq.load.ignore_unknown\": {\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"Sets whether BigQuery should allow extra values that are not represented in the table schema. If true, the extra values are ignored. If false, records with extra columns are treated as bad records, and if there are too many bad records, an invalid error is returned in the job result. By default unknown values are not allowed.\",\n-                                \"displayName\": \"Ignore Unknown Values\",\n+                            \"Data Timeout\": {\n+                                \"defaultValue\": \"30 sec\",\n+                                \"description\": \"When transferring a file between the local and remote system, this value specifies how long is allowed to elapse without any data being transferred between systems\",\n+                                \"displayName\": \"Data Timeout\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"bq.load.ignore_unknown\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Data Timeout\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"bq.record.reader\": {\n-                                \"description\": \"Specifies the Controller Service to use for parsing incoming data.\",\n-                                \"displayName\": \"Record Reader\",\n+                            \"Distributed Cache Service\": {\n+                                \"description\": \"NOTE: This property is used merely for migration from old NiFi version before state management was introduced at version 0.5.0. The stored value in the cache service will be migrated into the state when this processor is started at the first time. The specified Controller Service was used to maintain state about what had been pulled from the remote server so that if a new node begins pulling data, it won't duplicate all of the work that has been done. If not specified, the information was not shared across the cluster. This property did not need to be set for standalone instances of NiFi but was supposed to be configured if NiFi had been running within a cluster.\",\n+                                \"displayName\": \"Distributed Cache Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"bq.record.reader\",\n-                                \"required\": true,\n+                                \"name\": \"Distributed Cache Service\",\n+                                \"required\": false,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n                                     \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n+                                    \"type\": \"org.apache.nifi.distributed.cache.client.DistributedMapCacheClient\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             },\n-                            \"bq.skip.invalid.rows\": {\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"Sets whether to insert all valid rows of a request, even if invalid rows exist. If not set the entire insert request will fail if it contains an invalid row.\",\n-                                \"displayName\": \"Skip Invalid Rows\",\n+                            \"File Filter Regex\": {\n+                                \"description\": \"Provides a Java Regular Expression for filtering Filenames; if a filter is supplied, only files whose names match that Regular Expression will be fetched\",\n+                                \"displayName\": \"File Filter Regex\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"bq.skip.invalid.rows\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"File Filter Regex\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"bq.table.name\": {\n-                                \"defaultValue\": \"${bq.table.name}\",\n-                                \"description\": \"BigQuery table name\",\n-                                \"displayName\": \"Table Name\",\n+                            \"Host Key File\": {\n+                                \"description\": \"If supplied, the given file will be used as the Host Key; otherwise, if 'Strict Host Key Checking' property is applied (set to true) then uses the 'known_hosts' and 'known_hosts2' files from ~/.ssh directory else no host key file will be used\",\n+                                \"displayName\": \"Host Key File\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Host Key File\",\n+                                \"required\": false,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"SINGLE\",\n+                                    \"resourceTypes\": [\n+                                        \"FILE\"\n+                                    ]\n+                                },\n+                                \"sensitive\": false\n+                            },\n+                            \"Hostname\": {\n+                                \"description\": \"The fully qualified hostname or IP address of the remote system\",\n+                                \"displayName\": \"Hostname\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"bq.table.name\",\n+                                \"name\": \"Hostname\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"gcp-project-id\": {\n-                                \"description\": \"Google Cloud Project ID\",\n-                                \"displayName\": \"Project ID\",\n+                            \"Http Proxy Password\": {\n+                                \"description\": \"Http Proxy Password\",\n+                                \"displayName\": \"Http Proxy Password\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"gcp-project-id\",\n+                                \"name\": \"Http Proxy Password\",\n                                 \"required\": false,\n-                                \"sensitive\": false\n+                                \"sensitive\": true\n                             },\n-                            \"gcp-proxy-host\": {\n-                                \"description\": \"IP or hostname of the proxy to be used.\\n You might need to set the following properties in bootstrap for https proxy usage:\\n-Djdk.http.auth.tunneling.disabledSchemes=\\n-Djdk.http.auth.proxying.disabledSchemes=\",\n-                                \"displayName\": \"Proxy host\",\n+                            \"Http Proxy Username\": {\n+                                \"description\": \"Http Proxy Username\",\n+                                \"displayName\": \"Http Proxy Username\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"gcp-proxy-host\",\n+                                \"name\": \"Http Proxy Username\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"gcp-proxy-port\": {\n-                                \"description\": \"Proxy port number\",\n-                                \"displayName\": \"Proxy port\",\n+                            \"Ignore Dotted Files\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"true\",\n+                                \"description\": \"If true, files whose names begin with a dot (\\\".\\\") will be ignored\",\n+                                \"displayName\": \"Ignore Dotted Files\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Ignore Dotted Files\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Key Algorithms Allowed\": {\n+                                \"description\": \"A comma-separated list of Key Algorithms allowed for SFTP connections. Leave unset to allow all. Available options are: ecdsa-sha2-nistp256, ecdsa-sha2-nistp256-cert-v01@openssh.com, ecdsa-sha2-nistp384, ecdsa-sha2-nistp384-cert-v01@openssh.com, ecdsa-sha2-nistp521, ecdsa-sha2-nistp521-cert-v01@openssh.com, rsa-sha2-256, rsa-sha2-512, ssh-dss, ssh-dss-cert-v01@openssh.com, ssh-ed25519, ssh-ed25519-cert-v01@openssh.com, ssh-rsa, ssh-rsa-cert-v01@openssh.com\",\n+                                \"displayName\": \"Key Algorithms Allowed\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"gcp-proxy-port\",\n+                                \"name\": \"Key Algorithms Allowed\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"gcp-proxy-user-name\": {\n-                                \"description\": \"HTTP Proxy Username\",\n-                                \"displayName\": \"HTTP Proxy Username\",\n+                            \"Key Exchange Algorithms Allowed\": {\n+                                \"description\": \"A comma-separated list of Key Exchange Algorithms allowed for SFTP connections. Leave unset to allow all. Available options are: curve25519-sha256, curve25519-sha256@libssh.org, diffie-hellman-group-exchange-sha1, diffie-hellman-group-exchange-sha256, diffie-hellman-group1-sha1, diffie-hellman-group14-sha1, diffie-hellman-group14-sha256, diffie-hellman-group14-sha256@ssh.com, diffie-hellman-group15-sha256, diffie-hellman-group15-sha256@ssh.com, diffie-hellman-group15-sha384@ssh.com, diffie-hellman-group15-sha512, diffie-hellman-group16-sha256, diffie-hellman-group16-sha384@ssh.com, diffie-hellman-group16-sha512, diffie-hellman-group16-sha512@ssh.com, diffie-hellman-group17-sha512, diffie-hellman-group18-sha512, diffie-hellman-group18-sha512@ssh.com, ecdh-sha2-nistp256, ecdh-sha2-nistp384, ecdh-sha2-nistp521, ext-info-c\",\n+                                \"displayName\": \"Key Exchange Algorithms Allowed\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"gcp-proxy-user-name\",\n+                                \"name\": \"Key Exchange Algorithms Allowed\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"gcp-proxy-user-password\": {\n-                                \"description\": \"HTTP Proxy Password\",\n-                                \"displayName\": \"HTTP Proxy Password\",\n+                            \"Maximum File Age\": {\n+                                \"description\": \"The maximum age that a file must be in order to be pulled; any file older than this amount of time (according to last modification date) will be ignored\",\n+                                \"displayName\": \"Maximum File Age\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Maximum File Age\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Maximum File Size\": {\n+                                \"description\": \"The maximum size that a file can be in order to be pulled\",\n+                                \"displayName\": \"Maximum File Size\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Maximum File Size\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Message Authentication Codes Allowed\": {\n+                                \"description\": \"A comma-separated list of Message Authentication Codes allowed for SFTP connections. Leave unset to allow all. Available options are: hmac-md5, hmac-md5-96, hmac-md5-96-etm@openssh.com, hmac-md5-etm@openssh.com, hmac-ripemd160, hmac-ripemd160-96, hmac-ripemd160-etm@openssh.com, hmac-ripemd160@openssh.com, hmac-sha1, hmac-sha1-96, hmac-sha1-96@openssh.com, hmac-sha1-etm@openssh.com, hmac-sha2-256, hmac-sha2-256-etm@openssh.com, hmac-sha2-512, hmac-sha2-512-etm@openssh.com\",\n+                                \"displayName\": \"Message Authentication Codes Allowed\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"gcp-proxy-user-password\",\n+                                \"name\": \"Message Authentication Codes Allowed\",\n                                 \"required\": false,\n-                                \"sensitive\": true\n+                                \"sensitive\": false\n                             },\n-                            \"gcp-retry-count\": {\n-                                \"defaultValue\": \"6\",\n-                                \"description\": \"How many retry attempts should be made before routing to the failure relationship.\",\n-                                \"displayName\": \"Number of retries\",\n+                            \"Minimum File Age\": {\n+                                \"defaultValue\": \"0 sec\",\n+                                \"description\": \"The minimum age that a file must be in order to be pulled; any file younger than this amount of time (according to last modification date) will be ignored\",\n+                                \"displayName\": \"Minimum File Age\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"gcp-retry-count\",\n+                                \"name\": \"Minimum File Age\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"proxy-configuration-service\": {\n-                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests. If set, it supersedes proxy settings configured per component. Supported proxies: HTTP + AuthN\",\n-                                \"displayName\": \"Proxy Configuration Service\",\n+                            \"Minimum File Size\": {\n+                                \"defaultValue\": \"0 B\",\n+                                \"description\": \"The minimum size that a file must be in order to be pulled\",\n+                                \"displayName\": \"Minimum File Size\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"proxy-configuration-service\",\n+                                \"name\": \"Minimum File Size\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Password\": {\n+                                \"description\": \"Password for the user account\",\n+                                \"displayName\": \"Password\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Password\",\n                                 \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.proxy.ProxyConfigurationService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            }\n-                        },\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.processors.gcp.bigquery.PutBigQueryBatch\"\n-                        ],\n-                        \"sideEffectFree\": false,\n-                        \"supportedRelationships\": [\n-                            {\n-                                \"description\": \"FlowFiles are routed to this relationship after a successful Google BigQuery operation.\",\n-                                \"name\": \"success\"\n+                                \"sensitive\": true\n                             },\n-                            {\n-                                \"description\": \"FlowFiles are routed to this relationship if the Google BigQuery operation fails.\",\n-                                \"name\": \"failure\"\n-                            }\n-                        ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": false,\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": false,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"systemResourceConsiderations\": [\n-                            {\n-                                \"description\": \"An instance of this component can cause high usage of this system resource.  Multiple instances or high concurrency settings may result a degradation of performance.\",\n-                                \"resource\": \"MEMORY\"\n-                            }\n-                        ],\n-                        \"tags\": [\n-                            \"bigquery\",\n-                            \"bq\",\n-                            \"gcp\",\n-                            \"google\",\n-                            \"google cloud\",\n-                            \"record\"\n-                        ],\n-                        \"triggerSerially\": false,\n-                        \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.gcp.bigquery.PutBigQueryStreaming\",\n-                        \"typeDescription\": \"Please be aware this processor is deprecated and may be removed in the near future. Use PutBigQuery instead. Load data into Google BigQuery table using the streaming API. This processor is not intended to load large flow files as it will load the full content into memory. If you need to insert large flow files, consider using PutBigQueryBatch instead.\",\n-                        \"version\": \"1.27.0\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"Number of records successfully inserted\",\n-                                \"name\": \"bq.records.count\"\n-                            }\n-                        ]\n-                    },\n-                    {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-gcp-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"e0c4461\"\n-                        },\n-                        \"defaultBulletinLevel\": \"WARN\",\n-                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": 1,\n-                            \"TIMER_DRIVEN\": 1\n-                        },\n-                        \"defaultPenaltyDuration\": \"30 sec\",\n-                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"0 sec\"\n-                        },\n-                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n-                        \"defaultYieldDuration\": \"1 sec\",\n-                        \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_REQUIRED\",\n-                        \"primaryNodeOnly\": false,\n-                        \"propertyDescriptors\": {\n-                            \"Google Doc Export Type\": {\n+                            \"Path Filter Regex\": {\n+                                \"description\": \"When Search Recursively is true, then only subdirectories whose path matches the given Regular Expression will be scanned\",\n+                                \"displayName\": \"Path Filter Regex\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Path Filter Regex\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Port\": {\n+                                \"defaultValue\": \"22\",\n+                                \"description\": \"The port that the remote system is listening on for file transfers\",\n+                                \"displayName\": \"Port\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Port\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Private Key Passphrase\": {\n+                                \"description\": \"Password for the private key\",\n+                                \"displayName\": \"Private Key Passphrase\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Private Key Passphrase\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n+                            },\n+                            \"Private Key Path\": {\n+                                \"description\": \"The fully qualified path to the Private Key file\",\n+                                \"displayName\": \"Private Key Path\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Private Key Path\",\n+                                \"required\": false,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"SINGLE\",\n+                                    \"resourceTypes\": [\n+                                        \"FILE\"\n+                                    ]\n+                                },\n+                                \"sensitive\": false\n+                            },\n+                            \"Proxy Host\": {\n+                                \"description\": \"The fully qualified hostname or IP address of the proxy server\",\n+                                \"displayName\": \"Proxy Host\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Proxy Host\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Proxy Port\": {\n+                                \"description\": \"The port of the proxy server\",\n+                                \"displayName\": \"Proxy Port\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Proxy Port\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Proxy Type\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"PDF\",\n-                                        \"value\": \"application/pdf\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Plain Text\",\n-                                        \"value\": \"text/plain\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Microsoft Word\",\n-                                        \"value\": \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"OpenDocument\",\n-                                        \"value\": \"application/vnd.oasis.opendocument.text\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Rich Text\",\n-                                        \"value\": \"application/rtf\"\n+                                        \"displayName\": \"DIRECT\",\n+                                        \"value\": \"DIRECT\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"Web Page (HTML)\",\n-                                        \"value\": \"application/zip\"\n+                                        \"displayName\": \"HTTP\",\n+                                        \"value\": \"HTTP\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"EPUB\",\n-                                        \"value\": \"application/epub+zip\"\n+                                        \"displayName\": \"SOCKS\",\n+                                        \"value\": \"SOCKS\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"application/pdf\",\n-                                \"description\": \"Google Documents cannot be downloaded directly from Google Drive but instead must be exported to a specified MIME Type. In the event that the incoming FlowFile's MIME Type indicates that the file is a Google Document, this property specifies the MIME Type to export the document to.\",\n-                                \"displayName\": \"Google Doc Export Type\",\n+                                \"defaultValue\": \"DIRECT\",\n+                                \"description\": \"Proxy type used for file transfers\",\n+                                \"displayName\": \"Proxy Type\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Google Doc Export Type\",\n+                                \"name\": \"Proxy Type\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Remote Path\": {\n+                                \"defaultValue\": \".\",\n+                                \"description\": \"The path on the remote system from which to pull or push files\",\n+                                \"displayName\": \"Remote Path\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Remote Path\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Remote Poll Batch Size\": {\n+                                \"defaultValue\": \"5000\",\n+                                \"description\": \"The value specifies how many file paths to find in a given directory on the remote system when doing a file listing. This value in general should not need to be modified but when polling against a remote system with a tremendous number of files this value can be critical.  Setting this value too high can result very poor performance and setting it too low can cause the flow to be slower than normal.\",\n+                                \"displayName\": \"Remote Poll Batch Size\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Remote Poll Batch Size\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Google Drawing Export Type\": {\n+                            \"Search Recursively\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"PDF\",\n-                                        \"value\": \"application/pdf\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"PNG\",\n-                                        \"value\": \"image/png\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"JPEG\",\n-                                        \"value\": \"image/jpeg\"\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"SVG\",\n-                                        \"value\": \"image/svg+xml\"\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"application/pdf\",\n-                                \"description\": \"Google Drawings cannot be downloaded directly from Google Drive but instead must be exported to a specified MIME Type. In the event that the incoming FlowFile's MIME Type indicates that the file is a Google Drawing, this property specifies the MIME Type to export the drawing to.\",\n-                                \"displayName\": \"Google Drawing Export Type\",\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"If true, will pull files from arbitrarily nested subdirectories; otherwise, will not traverse subdirectories\",\n+                                \"displayName\": \"Search Recursively\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Google Drawing Export Type\",\n+                                \"name\": \"Search Recursively\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Google Presentation Export Type\": {\n+                            \"Send Keep Alive On Timeout\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"PDF\",\n-                                        \"value\": \"application/pdf\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Microsoft PowerPoint\",\n-                                        \"value\": \"application/vnd.openxmlformats-officedocument.presentationml.presentation\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Plain Text\",\n-                                        \"value\": \"text/plain\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"OpenDocument Presentation\",\n-                                        \"value\": \"application/vnd.oasis.opendocument.presentation\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"PNG (first slide only)\",\n-                                        \"value\": \"image/png\"\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"JPEG (first slide only)\",\n-                                        \"value\": \"image/jpeg\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Scalable Vector Graphics. Only the first slide will be exported.\",\n-                                        \"displayName\": \"SVG (first slide only)\",\n-                                        \"value\": \"image/svg+xml\"\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"application/pdf\",\n-                                \"description\": \"Google Presentations cannot be downloaded directly from Google Drive but instead must be exported to a specified MIME Type. In the event that the incoming FlowFile's MIME Type indicates that the file is a Google Presentation, this property specifies the MIME Type to export the presentation to.\",\n-                                \"displayName\": \"Google Presentation Export Type\",\n+                                \"defaultValue\": \"true\",\n+                                \"description\": \"Send a Keep Alive message every 5 seconds up to 5 times for an overall timeout of 25 seconds.\",\n+                                \"displayName\": \"Send Keep Alive On Timeout\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Google Presentation Export Type\",\n+                                \"name\": \"Send Keep Alive On Timeout\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Google Spreadsheet Export Type\": {\n+                            \"Strict Host Key Checking\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Comma-separated values. Only the first sheet will be exported.\",\n-                                        \"displayName\": \"CSV (first sheet only)\",\n-                                        \"value\": \"text/csv\"\n-                                    },\n-                                    {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"Microsoft Excel\",\n-                                        \"value\": \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\"\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"PDF\",\n-                                        \"value\": \"application/pdf\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Tab-separate values. Only the first sheet will be exported.\",\n-                                        \"displayName\": \"TSV (first sheet only)\",\n-                                        \"value\": \"text/tab-separated-values\"\n-                                    },\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"Indicates whether or not strict enforcement of hosts keys should be applied\",\n+                                \"displayName\": \"Strict Host Key Checking\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Strict Host Key Checking\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Use Compression\": {\n+                                \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"Web Page (HTML)\",\n-                                        \"value\": \"text/html\"\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"OpenDocument Spreadsheet\",\n-                                        \"value\": \"application/x-vnd.oasis.opendocument.spreadsheet\"\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"text/csv\",\n-                                \"description\": \"Google Spreadsheets cannot be downloaded directly from Google Drive but instead must be exported to a specified MIME Type. In the event that the incoming FlowFile's MIME Type indicates that the file is a Google Spreadsheet, this property specifies the MIME Type to export the spreadsheet to.\",\n-                                \"displayName\": \"Google Spreadsheet Export Type\",\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"Indicates whether or not ZLIB compression should be used when transferring files\",\n+                                \"displayName\": \"Use Compression\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Google Spreadsheet Export Type\",\n+                                \"name\": \"Use Compression\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"drive-file-id\": {\n-                                \"defaultValue\": \"${drive.id}\",\n-                                \"description\": \"The Drive ID of the File to fetch. Please see Additional Details for information on how to obtain the Drive ID.\",\n-                                \"displayName\": \"File ID\",\n+                            \"Username\": {\n+                                \"description\": \"Username\",\n+                                \"displayName\": \"Username\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"drive-file-id\",\n+                                \"name\": \"Username\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"gcp-credentials-provider-service\": {\n-                                \"description\": \"The Controller Service used to obtain Google Cloud Platform credentials.\",\n-                                \"displayName\": \"GCP Credentials Provider Service\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"gcp-credentials-provider-service\",\n-                                \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-gcp-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.gcp.credentials.service.GCPCredentialsService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            },\n-                            \"proxy-configuration-service\": {\n-                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests. Supported proxies: HTTP + AuthN\",\n-                                \"displayName\": \"Proxy Configuration Service\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"proxy-configuration-service\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.proxy.ProxyConfigurationService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            }\n-                        },\n-                        \"readsAttributes\": [\n-                            {\n-                                \"description\": \"The id of the file\",\n-                                \"name\": \"drive.id\"\n-                            }\n-                        ],\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.processors.gcp.drive.ListGoogleDrive\",\n-                            \"org.apache.nifi.processors.gcp.drive.PutGoogleDrive\"\n-                        ],\n-                        \"sideEffectFree\": false,\n-                        \"supportedRelationships\": [\n-                            {\n-                                \"description\": \"A FlowFile will be routed here for each successfully fetched File.\",\n-                                \"name\": \"success\"\n-                            },\n-                            {\n-                                \"description\": \"A FlowFile will be routed here for each File for which fetch was attempted but failed.\",\n-                                \"name\": \"failure\"\n-                            }\n-                        ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": false,\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": false,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"drive\",\n-                            \"fetch\",\n-                            \"google\",\n-                            \"storage\"\n-                        ],\n-                        \"triggerSerially\": false,\n-                        \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.gcp.drive.FetchGoogleDrive\",\n-                        \"typeDescription\": \"Fetches files from a Google Drive Folder. Designed to be used in tandem with ListGoogleDrive. Please see Additional Details to set up access to Google Drive.\",\n-                        \"version\": \"1.27.0\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"The id of the file\",\n-                                \"name\": \"drive.id\"\n-                            },\n-                            {\n-                                \"description\": \"The name of the file\",\n-                                \"name\": \"filename\"\n-                            },\n-                            {\n-                                \"description\": \"The MIME type of the file\",\n-                                \"name\": \"mime.type\"\n-                            },\n-                            {\n-                                \"description\": \"The size of the file\",\n-                                \"name\": \"drive.size\"\n-                            },\n-                            {\n-                                \"description\": \"The last modified time or created time (whichever is greater) of the file. The reason for this is that the original modified date of a file is preserved when uploaded to Google Drive. 'Created time' takes the time when the upload occurs. However uploaded files can still be modified later.\",\n-                                \"name\": \"drive.timestamp\"\n-                            },\n-                            {\n-                                \"description\": \"The error code returned by Google Drive\",\n-                                \"name\": \"error.code\"\n-                            },\n-                            {\n-                                \"description\": \"The error message returned by Google Drive\",\n-                                \"name\": \"error.message\"\n-                            }\n-                        ]\n-                    },\n-                    {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-gcp-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"e0c4461\"\n-                        },\n-                        \"defaultBulletinLevel\": \"WARN\",\n-                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": 1,\n-                            \"TIMER_DRIVEN\": 1\n-                        },\n-                        \"defaultPenaltyDuration\": \"30 sec\",\n-                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"1 min\"\n-                        },\n-                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n-                        \"defaultYieldDuration\": \"1 sec\",\n-                        \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n-                        \"primaryNodeOnly\": true,\n-                        \"propertyDescriptors\": {\n                             \"et-initial-listing-target\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"Ignore entities having timestamp older than the specified 'Tracking Time Window' at the initial listing activity.\",\n                                         \"displayName\": \"Tracking Time Window\",\n                                         \"value\": \"window\"\n                                     },\n                                     {\n                                         \"description\": \"Regardless of entities timestamp, all existing entities will be listed at the initial listing activity.\",\n                                         \"displayName\": \"All Available\",\n                                         \"value\": \"all\"\n                                     }\n                                 ],\n                                 \"defaultValue\": \"all\",\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"entities\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Listing Strategy\",\n-                                        \"propertyName\": \"listing-strategy\"\n-                                    }\n-                                ],\n                                 \"description\": \"Specify how initial listing should be handled. Used by 'Tracking Entities' strategy.\",\n                                 \"displayName\": \"Entity Tracking Initial Listing Target\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n                                 \"name\": \"et-initial-listing-target\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n                             \"et-state-cache\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"entities\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Listing Strategy\",\n-                                        \"propertyName\": \"listing-strategy\"\n-                                    }\n-                                ],\n                                 \"description\": \"Listed entities are stored in the specified cache storage so that this processor can resume listing across NiFi restart or in case of primary node change. 'Tracking Entities' strategy require tracking information of all listed entities within the last 'Tracking Time Window'. To support large number of entities, the strategy uses DistributedMapCache instead of managed state. Cache key format is 'ListedEntities::{processorId}(::{nodeId})'. If it tracks per node listed entities, then the optional '::{nodeId}' part is added to manage state separately. E.g. cluster wide cache key = 'ListedEntities::8dda2321-0164-1000-50fa-3042fe7d6a7b', per node cache key = 'ListedEntities::8dda2321-0164-1000-50fa-3042fe7d6a7b::nifi-node3' The stored cache content is Gzipped JSON string. The cache key will be deleted when target listing configuration is changed. Used by 'Tracking Entities' strategy.\",\n                                 \"displayName\": \"Entity Tracking State Cache\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n                                 \"name\": \"et-state-cache\",\n                                 \"required\": false,\n@@ -92093,104 +91591,81 @@\n                                     \"group\": \"org.apache.nifi\",\n                                     \"type\": \"org.apache.nifi.distributed.cache.client.DistributedMapCacheClient\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             },\n                             \"et-time-window\": {\n                                 \"defaultValue\": \"3 hours\",\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"entities\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Listing Strategy\",\n-                                        \"propertyName\": \"listing-strategy\"\n-                                    }\n-                                ],\n                                 \"description\": \"Specify how long this processor should track already-listed entities. 'Tracking Entities' strategy can pick any entity whose timestamp is inside the specified time window. For example, if set to '30 minutes', any entity having timestamp in recent 30 minutes will be the listing target when this processor runs. A listed entity is considered 'new/updated' and a FlowFile is emitted if one of following condition meets: 1. does not exist in the already-listed entities, 2. has newer timestamp than the cached entity, 3. has different size than the cached entity. If a cached entity's timestamp becomes older than specified time window, that entity will be removed from the cached already-listed entities. Used by 'Tracking Entities' strategy.\",\n                                 \"displayName\": \"Entity Tracking Time Window\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n                                 \"name\": \"et-time-window\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"folder-id\": {\n-                                \"description\": \"The ID of the folder from which to pull list of files. Please see Additional Details to set up access to Google Drive and obtain Folder ID. WARNING: Unauthorized access to the folder is treated as if the folder was empty. This results in the processor not creating outgoing FlowFiles. No additional error message is provided.\",\n-                                \"displayName\": \"Folder ID\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"folder-id\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"gcp-credentials-provider-service\": {\n-                                \"description\": \"The Controller Service used to obtain Google Cloud Platform credentials.\",\n-                                \"displayName\": \"GCP Credentials Provider Service\",\n+                            \"follow-symlink\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"If true, will pull even symbolic files and also nested symbolic subdirectories; otherwise, will not read symbolic files and will not traverse symbolic link subdirectories\",\n+                                \"displayName\": \"Follow symlink\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"gcp-credentials-provider-service\",\n+                                \"name\": \"follow-symlink\",\n                                 \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-gcp-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.gcp.credentials.service.GCPCredentialsService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n+                                \"sensitive\": false\n                             },\n                             \"listing-strategy\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"This strategy tracks the latest timestamp of listed entity to determine new/updated entities. Since it only tracks few timestamps, it can manage listing state efficiently. However, any newly added, or updated entity having timestamp older than the tracked latest timestamp can not be picked by this strategy. For example, such situation can happen in a file system if a file with old timestamp is copied or moved into the target directory without its last modified timestamp being updated. Also may miss files when multiple subdirectories are being written at the same time while listing is running.\",\n                                         \"displayName\": \"Tracking Timestamps\",\n                                         \"value\": \"timestamps\"\n                                     },\n                                     {\n                                         \"description\": \"This strategy tracks information of all the listed entities within the latest 'Entity Tracking Time Window' to determine new/updated entities. This strategy can pick entities having old timestamp that can be missed with 'Tracking Timestamps'. Works even when multiple subdirectories are being written at the same time while listing is running. However additional DistributedMapCache controller service is required and more JVM heap memory is used. See the description of 'Entity Tracking Time Window' property for further details on how it works.\",\n                                         \"displayName\": \"Tracking Entities\",\n                                         \"value\": \"entities\"\n                                     },\n                                     {\n-                                        \"description\": \"This strategy uses a sliding time window. The window starts where the previous window ended and ends with the 'current time'. One cycle will list files with modification time falling within the time window. Works even when multiple subdirectories are being written at the same time while listing is running. IMPORTANT: This strategy works properly only if the time on both the system hosting NiFi and the one hosting the files are accurate.\",\n-                                        \"displayName\": \"Time Window\",\n-                                        \"value\": \"time-window\"\n-                                    },\n-                                    {\n                                         \"description\": \"This strategy lists an entity without any tracking. The same entity will be listed each time on executing this processor. It is recommended to change the default run schedule value. Any property that related to the persisting state will be disregarded.\",\n                                         \"displayName\": \"No Tracking\",\n                                         \"value\": \"none\"\n+                                    },\n+                                    {\n+                                        \"description\": \"This strategy uses a sliding time window. The window starts where the previous window ended and ends with the 'current time'. One cycle will list files with modification time falling within the time window. Works even when multiple subdirectories are being written at the same time while listing is running. IMPORTANT: This strategy works properly only if the time on both the system hosting NiFi and the one hosting the files are accurate.\",\n+                                        \"displayName\": \"Time Window\",\n+                                        \"value\": \"time-window\"\n                                     }\n                                 ],\n                                 \"defaultValue\": \"timestamps\",\n                                 \"description\": \"Specify how to determine new/updated entities. See each strategy descriptions for detail.\",\n                                 \"displayName\": \"Listing Strategy\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n                                 \"name\": \"listing-strategy\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"min-age\": {\n-                                \"defaultValue\": \"0 sec\",\n-                                \"description\": \"The minimum age a file must be in order to be considered; any files younger than this will be ignored.\",\n-                                \"displayName\": \"Minimum File Age\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"min-age\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n                             \"proxy-configuration-service\": {\n-                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests. Supported proxies: HTTP + AuthN\",\n+                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests. If set, it supersedes proxy settings configured per component. Supported proxies: HTTP + AuthN, SOCKS + AuthN\",\n                                 \"displayName\": \"Proxy Configuration Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n                                 \"name\": \"proxy-configuration-service\",\n                                 \"required\": false,\n                                 \"sensitive\": false,\n@@ -92213,45 +91688,56 @@\n                                 \"typeProvidedByValue\": {\n                                     \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n                                     \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             },\n-                            \"recursive-search\": {\n+                            \"target-system-timestamp-precision\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"description\": \"Automatically detect time unit deterministically based on candidate entries timestamp. Please note that this option may take longer to list entities unnecessarily, if none of entries has a precise precision timestamp. E.g. even if a target system supports millis, if all entries only have timestamps without millis, such as '2017-06-16 09:06:34.000', then its precision is determined as 'seconds'.\",\n+                                        \"displayName\": \"Auto Detect\",\n+                                        \"value\": \"auto-detect\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"description\": \"This option provides the minimum latency for an entry from being available to being listed if target system supports millis, if not, use other options.\",\n+                                        \"displayName\": \"Milliseconds\",\n+                                        \"value\": \"millis\"\n+                                    },\n+                                    {\n+                                        \"description\": \"For a target system that does not have millis precision, but has in seconds.\",\n+                                        \"displayName\": \"Seconds\",\n+                                        \"value\": \"seconds\"\n+                                    },\n+                                    {\n+                                        \"description\": \"For a target system that only supports precision in minutes.\",\n+                                        \"displayName\": \"Minutes\",\n+                                        \"value\": \"minutes\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"true\",\n-                                \"description\": \"When 'true', will include list of files from concrete sub-folders (ignores shortcuts). Otherwise, will return only files that have the defined 'Folder ID' as their parent directly. WARNING: The listing may fail if there are too many sub-folders (500+).\",\n-                                \"displayName\": \"Search Recursively\",\n+                                \"defaultValue\": \"auto-detect\",\n+                                \"description\": \"Specify timestamp precision at the target system. Since this processor uses timestamp of entities to decide which should be listed, it is crucial to use the right timestamp precision.\",\n+                                \"displayName\": \"Target System Timestamp Precision\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"recursive-search\",\n+                                \"name\": \"target-system-timestamp-precision\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             }\n                         },\n                         \"seeAlso\": [\n-                            \"org.apache.nifi.processors.gcp.drive.FetchGoogleDrive\",\n-                            \"org.apache.nifi.processors.gcp.drive.PutGoogleDrive\"\n+                            \"org.apache.nifi.processors.standard.FetchSFTP\",\n+                            \"org.apache.nifi.processors.standard.GetSFTP\",\n+                            \"org.apache.nifi.processors.standard.PutSFTP\"\n                         ],\n                         \"sideEffectFree\": false,\n                         \"stateful\": {\n-                            \"description\": \"The processor stores necessary data to be able to keep track what files have been listed already. What exactly needs to be stored depends on the 'Listing Strategy'. State is stored across the cluster so that this Processor can be run on Primary Node only and if a new Primary Node is selected, the new node can pick up where the previous node left off, without duplicating the data.\",\n+                            \"description\": \"After performing a listing of files, the timestamp of the newest file is stored. This allows the Processor to list only files that have been added or modified after this date the next time that the Processor is run. State is stored across the cluster so that this Processor can be run on Primary Node only and if a new Primary Node is selected, the new node will not duplicate the data that was listed by the previous Primary Node.\",\n                             \"scopes\": [\n                                 \"CLUSTER\"\n                             ]\n                         },\n                         \"supportedRelationships\": [\n                             {\n                                 \"description\": \"All FlowFiles that are received are routed to success\",\n@@ -92264,50 +91750,78 @@\n                         ],\n                         \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"drive\",\n-                            \"google\",\n-                            \"storage\"\n+                            \"files\",\n+                            \"ingest\",\n+                            \"input\",\n+                            \"list\",\n+                            \"remote\",\n+                            \"sftp\",\n+                            \"source\"\n                         ],\n                         \"triggerSerially\": true,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.gcp.drive.ListGoogleDrive\",\n-                        \"typeDescription\": \"Performs a listing of concrete files (shortcuts are ignored) in a Google Drive folder. If the 'Record Writer' property is set, a single Output FlowFile is created, and each file in the listing is written as a single record to the output file. Otherwise, for each file in the listing, an individual FlowFile is created, the metadata being written as FlowFile attributes. This Processor is designed to run on Primary Node only in a cluster. If the primary node changes, the new Primary Node will pick up where the previous node left off without duplicating all of the data. Please see Additional Details to set up access to Google Drive.\",\n+                        \"type\": \"org.apache.nifi.processors.standard.ListSFTP\",\n+                        \"typeDescription\": \"Performs a listing of the files residing on an SFTP server. For each file that is found on the remote server, a new FlowFile will be created with the filename attribute set to the name of the file on the remote server. This can then be used in conjunction with FetchSFTP in order to fetch those files.\",\n                         \"version\": \"1.27.0\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"The id of the file\",\n-                                \"name\": \"drive.id\"\n+                                \"description\": \"The hostname of the SFTP Server\",\n+                                \"name\": \"sftp.remote.host\"\n                             },\n                             {\n-                                \"description\": \"The name of the file\",\n-                                \"name\": \"filename\"\n+                                \"description\": \"The port that was connected to on the SFTP Server\",\n+                                \"name\": \"sftp.remote.port\"\n                             },\n                             {\n-                                \"description\": \"The MIME type of the file\",\n-                                \"name\": \"mime.type\"\n+                                \"description\": \"The username of the user that performed the SFTP Listing\",\n+                                \"name\": \"sftp.listing.user\"\n                             },\n                             {\n-                                \"description\": \"The size of the file\",\n-                                \"name\": \"drive.size\"\n+                                \"description\": \"The numeric owner id of the source file\",\n+                                \"name\": \"file.owner\"\n                             },\n                             {\n-                                \"description\": \"The last modified time or created time (whichever is greater) of the file. The reason for this is that the original modified date of a file is preserved when uploaded to Google Drive. 'Created time' takes the time when the upload occurs. However uploaded files can still be modified later.\",\n-                                \"name\": \"drive.timestamp\"\n+                                \"description\": \"The numeric group id of the source file\",\n+                                \"name\": \"file.group\"\n+                            },\n+                            {\n+                                \"description\": \"The read/write/execute permissions of the source file\",\n+                                \"name\": \"file.permissions\"\n+                            },\n+                            {\n+                                \"description\": \"The number of bytes in the source file\",\n+                                \"name\": \"file.size\"\n+                            },\n+                            {\n+                                \"description\": \"The timestamp of when the file in the filesystem waslast modified as 'yyyy-MM-dd'T'HH:mm:ssZ'\",\n+                                \"name\": \"file.lastModifiedTime\"\n+                            },\n+                            {\n+                                \"description\": \"The name of the file on the SFTP Server\",\n+                                \"name\": \"filename\"\n+                            },\n+                            {\n+                                \"description\": \"The fully qualified name of the directory on the SFTP Server from which the file was pulled\",\n+                                \"name\": \"path\"\n+                            },\n+                            {\n+                                \"description\": \"The MIME Type that is provided by the configured Record Writer\",\n+                                \"name\": \"mime.type\"\n                             }\n                         ]\n                     },\n                     {\n                         \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-gcp-nar\",\n+                        \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -92316,197 +91830,117 @@\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_REQUIRED\",\n+                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"chunked-upload-size\": {\n-                                \"defaultValue\": \"10 MB\",\n-                                \"description\": \"Defines the size of a chunk. Used when a FlowFile's size exceeds 'Chunked Upload Threshold' and content is uploaded in smaller chunks. Minimum allowed chunk size is 256 KB, maximum allowed chunk size is 1 GB.\",\n-                                \"displayName\": \"Chunked Upload Size\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"chunked-upload-size\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"chunked-upload-threshold\": {\n-                                \"defaultValue\": \"100 MB\",\n-                                \"description\": \"The maximum size of the content which is uploaded at once. FlowFiles larger than this threshold are uploaded in chunks.\",\n-                                \"displayName\": \"Chunked Upload Threshold\",\n+                            \"bind-address\": {\n+                                \"description\": \"The address the FTP server should be bound to. If not set (or set to 0.0.0.0), the server binds to all available addresses (i.e. all network interfaces of the host machine).\",\n+                                \"displayName\": \"Bind Address\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"chunked-upload-threshold\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"bind-address\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"conflict-resolution-strategy\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"Handle file conflict as failure.\",\n-                                        \"displayName\": \"fail\",\n-                                        \"value\": \"fail\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Ignore conflict, do not change the original file.\",\n-                                        \"displayName\": \"ignore\",\n-                                        \"value\": \"ignore\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Replace existing file in case of conflict.\",\n-                                        \"displayName\": \"replace\",\n-                                        \"value\": \"replace\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"fail\",\n-                                \"description\": \"Indicates what should happen when a file with the same name already exists in the specified Google Drive folder.\",\n-                                \"displayName\": \"Conflict Resolution Strategy\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"conflict-resolution-strategy\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"file-name\": {\n-                                \"defaultValue\": \"${filename}\",\n-                                \"description\": \"The name of the file to upload to the specified Google Drive folder.\",\n-                                \"displayName\": \"Filename\",\n+                            \"listening-port\": {\n+                                \"defaultValue\": \"2221\",\n+                                \"description\": \"The Port to listen on for incoming connections. On Linux, root privileges are required to use port numbers below 1024.\",\n+                                \"displayName\": \"Listening Port\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"file-name\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"listening-port\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"folder-id\": {\n-                                \"description\": \"The ID of the shared folder. Please see Additional Details to set up access to Google Drive and obtain Folder ID.\",\n-                                \"displayName\": \"Folder ID\",\n+                            \"password\": {\n+                                \"description\": \"If the Username is set, then a password must also be specified. The password provided by the client trying to log in to the FTP server will be checked against this password.\",\n+                                \"displayName\": \"Password\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"folder-id\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"password\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n                             },\n-                            \"gcp-credentials-provider-service\": {\n-                                \"description\": \"The Controller Service used to obtain Google Cloud Platform credentials.\",\n-                                \"displayName\": \"GCP Credentials Provider Service\",\n+                            \"ssl-context-service\": {\n+                                \"description\": \"Specifies the SSL Context Service that can be used to create secure connections. If an SSL Context Service is selected, then a keystore file must also be specified in the SSL Context Service. Without a keystore file, the processor cannot be started successfully.Specifying a truststore file is optional. If a truststore file is specified, client authentication is required (the client needs to send a certificate to the server).Regardless of the selected TLS protocol, the highest available protocol is used for the connection. For example if NiFi is running on Java 11 and TLSv1.2 is selected in the controller service as the preferred TLS Protocol, TLSv1.3 will be used (regardless of TLSv1.2 being selected) because Java 11 supports TLSv1.3.\",\n+                                \"displayName\": \"SSL Context Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"gcp-credentials-provider-service\",\n-                                \"required\": true,\n+                                \"name\": \"ssl-context-service\",\n+                                \"required\": false,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-gcp-services-api-nar\",\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.gcp.credentials.service.GCPCredentialsService\",\n+                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             },\n-                            \"proxy-configuration-service\": {\n-                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests. Supported proxies: HTTP + AuthN\",\n-                                \"displayName\": \"Proxy Configuration Service\",\n+                            \"username\": {\n+                                \"description\": \"The name of the user that is allowed to log in to the FTP server. If a username is provided, a password must also be provided. If no username is specified, anonymous connections will be permitted.\",\n+                                \"displayName\": \"Username\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"proxy-configuration-service\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"username\",\n                                 \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.proxy.ProxyConfigurationService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n+                                \"sensitive\": false\n                             }\n                         },\n-                        \"readsAttributes\": [\n-                            {\n-                                \"description\": \"Uses the FlowFile's filename as the filename for the Google Drive object.\",\n-                                \"name\": \"filename\"\n-                            }\n-                        ],\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.processors.gcp.drive.FetchGoogleDrive\",\n-                            \"org.apache.nifi.processors.gcp.drive.ListGoogleDrive\"\n-                        ],\n                         \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"Files that have been successfully written to Google Drive are transferred to this relationship.\",\n+                                \"description\": \"Relationship for successfully received files.\",\n                                 \"name\": \"success\"\n-                            },\n-                            {\n-                                \"description\": \"Files that could not be written to Google Drive for some reason are transferred to this relationship.\",\n-                                \"name\": \"failure\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n                         \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"drive\",\n-                            \"google\",\n-                            \"put\",\n-                            \"storage\"\n+                            \"FTP\",\n+                            \"FTPS\",\n+                            \"ingest\",\n+                            \"listen\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.gcp.drive.PutGoogleDrive\",\n-                        \"typeDescription\": \"Writes the contents of a FlowFile as a file in Google Drive.\",\n+                        \"type\": \"org.apache.nifi.processors.standard.ListenFTP\",\n+                        \"typeDescription\": \"Starts an FTP server that listens on the specified port and transforms incoming files into FlowFiles. The URI of the service will be ftp://{hostname}:{port}. The default port is 2221.\",\n                         \"version\": \"1.27.0\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"The id of the file\",\n-                                \"name\": \"drive.id\"\n-                            },\n-                            {\n-                                \"description\": \"The name of the file\",\n+                                \"description\": \"The name of the file received via the FTP/FTPS connection.\",\n                                 \"name\": \"filename\"\n                             },\n                             {\n-                                \"description\": \"The MIME type of the file\",\n-                                \"name\": \"mime.type\"\n-                            },\n-                            {\n-                                \"description\": \"The size of the file\",\n-                                \"name\": \"drive.size\"\n-                            },\n-                            {\n-                                \"description\": \"The last modified time or created time (whichever is greater) of the file. The reason for this is that the original modified date of a file is preserved when uploaded to Google Drive. 'Created time' takes the time when the upload occurs. However uploaded files can still be modified later.\",\n-                                \"name\": \"drive.timestamp\"\n-                            },\n-                            {\n-                                \"description\": \"The error code returned by Google Drive\",\n-                                \"name\": \"error.code\"\n-                            },\n-                            {\n-                                \"description\": \"The error message returned by Google Drive\",\n-                                \"name\": \"error.message\"\n+                                \"description\": \"The path pointing to the file's target directory. E.g.: file.txt is uploaded to /Folder1/SubFolder, then the value of the path attribute will be \\\"/Folder1/SubFolder/\\\" (note that it ends with a separator character).\",\n+                                \"name\": \"path\"\n                             }\n                         ]\n                     },\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-gcp-nar\",\n+                        \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -92518,441 +91952,303 @@\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_FORBIDDEN\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"GCP Credentials Provider Service\": {\n-                                \"description\": \"The Controller Service used to obtain Google Cloud Platform credentials.\",\n-                                \"displayName\": \"GCP Credentials Provider Service\",\n+                            \"Authorized DN Pattern\": {\n+                                \"defaultValue\": \".*\",\n+                                \"description\": \"A Regular Expression to apply against the Subject's Distinguished Name of incoming connections. If the Pattern does not match the Subject DN, the the processor will respond with a status of HTTP 403 Forbidden.\",\n+                                \"displayName\": \"Authorized Subject DN Pattern\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"GCP Credentials Provider Service\",\n+                                \"name\": \"Authorized DN Pattern\",\n                                 \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-gcp-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.gcp.credentials.service.GCPCredentialsService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n+                                \"sensitive\": false\n                             },\n-                            \"api-endpoint\": {\n-                                \"defaultValue\": \"pubsub.googleapis.com:443\",\n-                                \"description\": \"Override the gRPC endpoint in the form of [host:port]\",\n-                                \"displayName\": \"API Endpoint\",\n+                            \"Base Path\": {\n+                                \"defaultValue\": \"contentListener\",\n+                                \"description\": \"Base path for incoming connections\",\n+                                \"displayName\": \"Base Path\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"api-endpoint\",\n+                                \"name\": \"Base Path\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"gcp-project-id\": {\n-                                \"description\": \"Google Cloud Project ID\",\n-                                \"displayName\": \"Project ID\",\n+                            \"HTTP Headers to receive as Attributes (Regex)\": {\n+                                \"description\": \"Specifies the Regular Expression that determines the names of HTTP Headers that should be passed along as FlowFile attributes\",\n+                                \"displayName\": \"HTTP Headers to receive as Attributes (Regex)\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"gcp-project-id\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"HTTP Headers to receive as Attributes (Regex)\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"gcp-pubsub-publish-batch-size\": {\n-                                \"defaultValue\": \"15\",\n-                                \"description\": \"Indicates the number of messages the cloud service should bundle together in a batch. If not set and left empty, only one message will be used in a batch\",\n-                                \"displayName\": \"Batch Size Threshold\",\n+                            \"HTTP Protocols\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"HTTP/1.1\",\n+                                        \"displayName\": \"http/1.1\",\n+                                        \"value\": \"HTTP_1_1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"HTTP/2 and HTTP/1.1 negotiated based on requested protocols\",\n+                                        \"displayName\": \"h2 http/1.1\",\n+                                        \"value\": \"H2_HTTP_1_1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"HTTP/2\",\n+                                        \"displayName\": \"h2\",\n+                                        \"value\": \"H2\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"HTTP_1_1\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"propertyDisplayName\": \"SSL Context Service\",\n+                                        \"propertyName\": \"SSL Context Service\"\n+                                    }\n+                                ],\n+                                \"description\": \"HTTP Protocols supported for Application Layer Protocol Negotiation with TLS\",\n+                                \"displayName\": \"HTTP Protocols\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"gcp-pubsub-publish-batch-size\",\n+                                \"name\": \"HTTP Protocols\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"gcp-pubsub-subscription\": {\n-                                \"description\": \"Name of the Google Cloud Pub/Sub Subscription\",\n-                                \"displayName\": \"Subscription\",\n+                            \"Listening Port\": {\n+                                \"description\": \"The Port to listen on for incoming connections\",\n+                                \"displayName\": \"Listening Port\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"gcp-pubsub-subscription\",\n+                                \"name\": \"Listening Port\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"proxy-configuration-service\": {\n-                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests. If set, it supersedes proxy settings configured per component. Supported proxies: HTTP + AuthN\",\n-                                \"displayName\": \"Proxy Configuration Service\",\n+                            \"Max Data to Receive per Second\": {\n+                                \"description\": \"The maximum amount of data to receive per second; this allows the bandwidth to be throttled to a specified data rate; if not specified, the data rate is not throttled\",\n+                                \"displayName\": \"Max Data to Receive per Second\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"proxy-configuration-service\",\n+                                \"name\": \"Max Data to Receive per Second\",\n                                 \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.proxy.ProxyConfigurationService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            }\n-                        },\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.processors.gcp.pubsub.PublishGCPubSub\"\n-                        ],\n-                        \"sideEffectFree\": false,\n-                        \"supportedRelationships\": [\n-                            {\n-                                \"description\": \"FlowFiles are routed to this relationship after a successful Google Cloud Pub/Sub operation.\",\n-                                \"name\": \"success\"\n-                            }\n-                        ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": false,\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": false,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"consume\",\n-                            \"gcp\",\n-                            \"google\",\n-                            \"google-cloud\",\n-                            \"message\",\n-                            \"pubsub\"\n-                        ],\n-                        \"triggerSerially\": false,\n-                        \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.gcp.pubsub.ConsumeGCPubSub\",\n-                        \"typeDescription\": \"Consumes message from the configured Google Cloud PubSub subscription. If the 'Batch Size' is set, the configured number of messages will be pulled in a single request, else only one message will be pulled.\",\n-                        \"version\": \"1.27.0\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"Acknowledgement Id of the consumed Google Cloud PubSub message\",\n-                                \"name\": \"gcp.pubsub.ackId\"\n-                            },\n-                            {\n-                                \"description\": \"Serialized size of the consumed Google Cloud PubSub message\",\n-                                \"name\": \"gcp.pubsub.messageSize\"\n+                                \"sensitive\": false\n                             },\n-                            {\n-                                \"description\": \"Number of attributes the consumed PubSub message has, if any\",\n-                                \"name\": \"gcp.pubsub.attributesCount\"\n+                            \"Max Unconfirmed Flowfile Time\": {\n+                                \"defaultValue\": \"60 secs\",\n+                                \"description\": \"The maximum amount of time to wait for a FlowFile to be confirmed before it is removed from the cache\",\n+                                \"displayName\": \"Max Unconfirmed Flowfile Time\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Max Unconfirmed Flowfile Time\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n                             },\n-                            {\n-                                \"description\": \"Timestamp value when the message was published\",\n-                                \"name\": \"gcp.pubsub.publishTime\"\n+                            \"Return Code\": {\n+                                \"defaultValue\": \"200\",\n+                                \"description\": \"The HTTP return code returned after every HTTP call\",\n+                                \"displayName\": \"Return Code\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Return Code\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n                             },\n-                            {\n-                                \"description\": \"Other than the listed attributes, this processor may write zero or more attributes, if the original Google Cloud Publisher client added any attributes to the message while sending\",\n-                                \"name\": \"Dynamic Attributes\"\n-                            }\n-                        ]\n-                    },\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-gcp-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"e0c4461\"\n-                        },\n-                        \"defaultBulletinLevel\": \"WARN\",\n-                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": 1,\n-                            \"TIMER_DRIVEN\": 1\n-                        },\n-                        \"defaultPenaltyDuration\": \"30 sec\",\n-                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"0 sec\"\n-                        },\n-                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n-                        \"defaultYieldDuration\": \"1 sec\",\n-                        \"dynamicProperties\": [\n-                            {\n-                                \"description\": \"Attributes to be set for the outgoing Google Cloud PubSub message\",\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"name\": \"Attribute name\",\n-                                \"value\": \"Value to be set to the attribute\"\n-                            }\n-                        ],\n-                        \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_REQUIRED\",\n-                        \"primaryNodeOnly\": false,\n-                        \"propertyDescriptors\": {\n-                            \"GCP Credentials Provider Service\": {\n-                                \"description\": \"The Controller Service used to obtain Google Cloud Platform credentials.\",\n-                                \"displayName\": \"GCP Credentials Provider Service\",\n+                            \"SSL Context Service\": {\n+                                \"description\": \"SSL Context Service enables support for HTTPS\",\n+                                \"displayName\": \"SSL Context Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"GCP Credentials Provider Service\",\n-                                \"required\": true,\n+                                \"name\": \"SSL Context Service\",\n+                                \"required\": false,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-gcp-services-api-nar\",\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.gcp.credentials.service.GCPCredentialsService\",\n+                                    \"type\": \"org.apache.nifi.ssl.RestrictedSSLContextService\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             },\n-                            \"Input Batch Size\": {\n-                                \"defaultValue\": \"100\",\n-                                \"description\": \"Maximum number of FlowFiles processed for each Processor invocation\",\n-                                \"displayName\": \"Input Batch Size\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Input Batch Size\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Maximum Message Size\": {\n-                                \"defaultValue\": \"1 MB\",\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"FLOWFILE_ORIENTED\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Message Derivation Strategy\",\n-                                        \"propertyName\": \"Message Derivation Strategy\"\n-                                    }\n-                                ],\n-                                \"description\": \"The maximum size of a Google PubSub message in bytes. Defaults to 1 MB (1048576 bytes)\",\n-                                \"displayName\": \"Maximum Message Size\",\n+                            \"authorized-issuer-dn-pattern\": {\n+                                \"defaultValue\": \".*\",\n+                                \"description\": \"A Regular Expression to apply against the Issuer's Distinguished Name of incoming connections. If the Pattern does not match the Issuer DN, the processor will respond with a status of HTTP 403 Forbidden.\",\n+                                \"displayName\": \"Authorized Issuer DN Pattern\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Maximum Message Size\",\n-                                \"required\": true,\n+                                \"name\": \"authorized-issuer-dn-pattern\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Message Derivation Strategy\": {\n+                            \"client-authentication\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Each incoming FlowFile is sent as a Google Cloud PubSub message\",\n-                                        \"displayName\": \"FlowFile Oriented\",\n-                                        \"value\": \"FLOWFILE_ORIENTED\"\n+                                        \"description\": \"Inferred based on SSL Context Service properties. The presence of Trust Store properties implies REQUIRED, otherwise NONE is configured.\",\n+                                        \"displayName\": \"AUTO\",\n+                                        \"value\": \"AUTO\"\n                                     },\n                                     {\n-                                        \"description\": \"Each incoming FlowFile is parsed into NiFi records, which are each sent as a Google Cloud PubSub message\",\n-                                        \"displayName\": \"Record Oriented\",\n-                                        \"value\": \"RECORD_ORIENTED\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"FLOWFILE_ORIENTED\",\n-                                \"description\": \"The strategy used to publish the incoming FlowFile to the Google Cloud PubSub endpoint.\",\n-                                \"displayName\": \"Message Derivation Strategy\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Message Derivation Strategy\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Record Reader\": {\n-                                \"dependencies\": [\n+                                        \"description\": \"Requests the client certificate on handshake and validates if present but does not require it\",\n+                                        \"displayName\": \"WANT\",\n+                                        \"value\": \"WANT\"\n+                                    },\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"RECORD_ORIENTED\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Message Derivation Strategy\",\n-                                        \"propertyName\": \"Message Derivation Strategy\"\n+                                        \"description\": \"Requests the client certificate on handshake and rejects the connection if it is not present and valid\",\n+                                        \"displayName\": \"REQUIRED\",\n+                                        \"value\": \"REQUIRED\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Does not request the client certificate on handshake\",\n+                                        \"displayName\": \"NONE\",\n+                                        \"value\": \"NONE\"\n                                     }\n                                 ],\n-                                \"description\": \"The Record Reader to use for incoming FlowFiles\",\n-                                \"displayName\": \"Record Reader\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Record Reader\",\n-                                \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            },\n-                            \"Record Writer\": {\n+                                \"defaultValue\": \"AUTO\",\n                                 \"dependencies\": [\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"RECORD_ORIENTED\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Message Derivation Strategy\",\n-                                        \"propertyName\": \"Message Derivation Strategy\"\n+                                        \"propertyDisplayName\": \"SSL Context Service\",\n+                                        \"propertyName\": \"SSL Context Service\"\n                                     }\n                                 ],\n-                                \"description\": \"The Record Writer to use in order to serialize the data before sending to GCPubSub endpoint\",\n-                                \"displayName\": \"Record Writer\",\n+                                \"description\": \"Client Authentication policy for TLS connections. Required when SSL Context Service configured.\",\n+                                \"displayName\": \"Client Authentication\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Record Writer\",\n-                                \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            },\n-                            \"api-endpoint\": {\n-                                \"defaultValue\": \"pubsub.googleapis.com:443\",\n-                                \"description\": \"Override the gRPC endpoint in the form of [host:port]\",\n-                                \"displayName\": \"API Endpoint\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"api-endpoint\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"gcp-batch-bytes\": {\n-                                \"defaultValue\": \"3 MB\",\n-                                \"description\": \"Publish request gets triggered based on this Batch Bytes Threshold property and the Batch Size Threshold property, whichever condition is met first.\",\n-                                \"displayName\": \"Batch Bytes Threshold\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"gcp-batch-bytes\",\n-                                \"required\": true,\n+                                \"name\": \"client-authentication\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"gcp-project-id\": {\n-                                \"description\": \"Google Cloud Project ID\",\n-                                \"displayName\": \"Project ID\",\n+                            \"health-check-port\": {\n+                                \"description\": \"The port to listen on for incoming health check requests. If set, it must be different from the Listening Port. Configure this port if the processor is set to use two-way SSL and a load balancer that does not support client authentication for health check requests is used. Only /<base_path>/healthcheck service is available via this port and only GET and HEAD requests are supported. If the processor is set not to use SSL, SSL will not be used on this port, either. If the processor is set to use one-way SSL, one-way SSL will be used on this port. If the processor is set to use two-way SSL, one-way SSL will be used on this port (client authentication not required).\",\n+                                \"displayName\": \"Listening Port for Health Check Requests\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"gcp-project-id\",\n+                                \"name\": \"health-check-port\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"gcp-pubsub-publish-batch-delay\": {\n-                                \"defaultValue\": \"100 millis\",\n-                                \"description\": \"Indicates the delay threshold to use for batching. After this amount of time has elapsed (counting from the first element added), the elements will be wrapped up in a batch and sent. This value should not be set too high, usually on the order of milliseconds. Otherwise, calls might appear to never complete.\",\n-                                \"displayName\": \"Batch Delay Threshold\",\n+                            \"max-thread-pool-size\": {\n+                                \"defaultValue\": \"200\",\n+                                \"description\": \"The maximum number of threads to be used by the embedded Jetty server. The value can be set between 8 and 1000. The value of this property affects the performance of the flows and the operating system, therefore the default value should only be changed in justified cases. A value that is less than the default value may be suitable if only a small number of HTTP clients connect to the server. A greater value may be suitable if a large number of HTTP clients are expected to make requests to the server simultaneously.\",\n+                                \"displayName\": \"Maximum Thread Pool Size\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"gcp-pubsub-publish-batch-delay\",\n+                                \"name\": \"max-thread-pool-size\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"gcp-pubsub-publish-batch-size\": {\n-                                \"defaultValue\": \"15\",\n-                                \"description\": \"Indicates the number of messages the cloud service should bundle together in a batch. If not set and left empty, only one message will be used in a batch\",\n-                                \"displayName\": \"Batch Size Threshold\",\n+                            \"multipart-read-buffer-size\": {\n+                                \"defaultValue\": \"512 KB\",\n+                                \"description\": \"The threshold size, at which the contents of an incoming file would be written to disk. Only applies for requests with Content-Type: multipart/form-data. It is used to prevent denial of service type of attacks, to prevent filling up the heap or disk space.\",\n+                                \"displayName\": \"Multipart Read Buffer Size\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"gcp-pubsub-publish-batch-size\",\n+                                \"name\": \"multipart-read-buffer-size\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"gcp-pubsub-topic\": {\n-                                \"description\": \"Name of the Google Cloud PubSub Topic\",\n-                                \"displayName\": \"Topic Name\",\n+                            \"multipart-request-max-size\": {\n+                                \"defaultValue\": \"1 MB\",\n+                                \"description\": \"The max size of the request. Only applies for requests with Content-Type: multipart/form-data, and is used to prevent denial of service type of attacks, to prevent filling up the heap or disk space\",\n+                                \"displayName\": \"Multipart Request Max Size\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"gcp-pubsub-topic\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"multipart-request-max-size\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"proxy-configuration-service\": {\n-                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests. If set, it supersedes proxy settings configured per component. Supported proxies: HTTP + AuthN\",\n-                                \"displayName\": \"Proxy Configuration Service\",\n+                            \"record-reader\": {\n+                                \"description\": \"The Record Reader to use parsing the incoming FlowFile into Records\",\n+                                \"displayName\": \"Record Reader\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"proxy-configuration-service\",\n+                                \"name\": \"record-reader\",\n                                 \"required\": false,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n                                     \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.proxy.ProxyConfigurationService\",\n+                                    \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"record-writer\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"propertyDisplayName\": \"Record Reader\",\n+                                        \"propertyName\": \"record-reader\"\n+                                    }\n+                                ],\n+                                \"description\": \"The Record Writer to use for serializing Records after they have been transformed\",\n+                                \"displayName\": \"Record Writer\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"record-writer\",\n+                                \"required\": true,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             }\n                         },\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.processors.gcp.pubsub.ConsumeGCPubSub\"\n-                        ],\n                         \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"FlowFiles are routed to this relationship if the Google Cloud Pub/Sub operation fails but attempting the operation again may succeed.\",\n-                                \"name\": \"retry\"\n-                            },\n-                            {\n-                                \"description\": \"FlowFiles are routed to this relationship after a successful Google Cloud Pub/Sub operation.\",\n+                                \"description\": \"Relationship for successfully received FlowFiles\",\n                                 \"name\": \"success\"\n-                            },\n-                            {\n-                                \"description\": \"FlowFiles are routed to this relationship if the Google Cloud Pub/Sub operation fails.\",\n-                                \"name\": \"failure\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n                         \"supportsBatching\": false,\n-                        \"supportsDynamicProperties\": true,\n+                        \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n-                        \"systemResourceConsiderations\": [\n-                            {\n-                                \"description\": \"The entirety of the FlowFile's content will be read into memory to be sent as a PubSub message.\",\n-                                \"resource\": \"MEMORY\"\n-                            }\n-                        ],\n                         \"tags\": [\n-                            \"gcp\",\n-                            \"google\",\n-                            \"google-cloud\",\n-                            \"message\",\n-                            \"publish\",\n-                            \"pubsub\"\n+                            \"http\",\n+                            \"https\",\n+                            \"ingest\",\n+                            \"listen\",\n+                            \"rest\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.gcp.pubsub.PublishGCPubSub\",\n-                        \"typeDescription\": \"Publishes the content of the incoming flowfile to the configured Google Cloud PubSub topic. The processor supports dynamic properties. If any dynamic properties are present, they will be sent along with the message in the form of 'attributes'.\",\n-                        \"version\": \"1.27.0\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"ID of the pubsub message published to the configured Google Cloud PubSub topic\",\n-                                \"name\": \"gcp.pubsub.messageId\"\n-                            },\n-                            {\n-                                \"description\": \"Count of pubsub messages published to the configured Google Cloud PubSub topic\",\n-                                \"name\": \"gcp.pubsub.count.records\"\n-                            },\n-                            {\n-                                \"description\": \"Name of the Google Cloud PubSub topic the message was published to\",\n-                                \"name\": \"gcp.pubsub.topic\"\n-                            }\n-                        ]\n+                        \"type\": \"org.apache.nifi.processors.standard.ListenHTTP\",\n+                        \"typeDescription\": \"Starts an HTTP Server and listens on a given base path to transform incoming requests into FlowFiles. The default URI of the Service will be http://{hostname}:{port}/contentListener. Only HEAD and POST requests are supported. GET, PUT, DELETE, OPTIONS and TRACE will result in an error and the HTTP response status code 405; CONNECT will also result in an error and the HTTP response status code 400. GET is supported on <service_URI>/healthcheck. If the service is available, it returns \\\"200 OK\\\" with the content \\\"OK\\\". The health check functionality can be configured to be accessible via a different port. For details see the documentation of the \\\"Listening Port for health check requests\\\" property.A Record Reader and Record Writer property can be enabled on the processor to process incoming requests as records. Record processing is not allowed for multipart requests and request in FlowFileV3 format (minifi).\",\n+                        \"version\": \"1.27.0\"\n                     },\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-gcp-nar\",\n+                        \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -92964,123 +92260,213 @@\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_FORBIDDEN\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"GCP Credentials Provider Service\": {\n-                                \"description\": \"The Controller Service used to obtain Google Cloud Platform credentials.\",\n-                                \"displayName\": \"GCP Credentials Provider Service\",\n+                            \"Character Set\": {\n+                                \"defaultValue\": \"UTF-8\",\n+                                \"description\": \"Specifies the character set of the received data.\",\n+                                \"displayName\": \"Character Set\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"GCP Credentials Provider Service\",\n+                                \"name\": \"Character Set\",\n                                 \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-gcp-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.gcp.credentials.service.GCPCredentialsService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n+                                \"sensitive\": false\n                             },\n-                            \"gcp-bytes-outstanding\": {\n-                                \"defaultValue\": \"10 MB\",\n-                                \"description\": \"The number of quota bytes that may be outstanding to the client.\",\n-                                \"displayName\": \"Bytes Outstanding\",\n+                            \"Client Auth\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"WANT\",\n+                                        \"value\": \"WANT\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"REQUIRED\",\n+                                        \"value\": \"REQUIRED\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"NONE\",\n+                                        \"value\": \"NONE\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"REQUIRED\",\n+                                \"description\": \"The client authentication policy to use for the SSL Context. Only used if an SSL Context Service is provided.\",\n+                                \"displayName\": \"Client Auth\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Client Auth\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Local Network Interface\": {\n+                                \"description\": \"The name of a local network interface to be used to restrict listening to a specific LAN.\",\n+                                \"displayName\": \"Local Network Interface\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"gcp-bytes-outstanding\",\n+                                \"name\": \"Local Network Interface\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Max Batch Size\": {\n+                                \"defaultValue\": \"1\",\n+                                \"description\": \"The maximum number of messages to add to a single FlowFile. If multiple messages are available, they will be concatenated along with the <Message Delimiter> up to this configured maximum number of messages\",\n+                                \"displayName\": \"Max Batch Size\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Max Batch Size\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"gcp-messages-outstanding\": {\n-                                \"defaultValue\": \"1000\",\n-                                \"description\": \"The number of messages that may be outstanding to the client.\",\n-                                \"displayName\": \"Messages Outstanding\",\n+                            \"Max Number of TCP Connections\": {\n+                                \"defaultValue\": \"2\",\n+                                \"description\": \"The maximum number of worker threads available for servicing TCP connections.\",\n+                                \"displayName\": \"Max Number of Worker Threads\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"gcp-messages-outstanding\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Max Number of TCP Connections\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"gcp-pubsub-subscription\": {\n-                                \"description\": \"Name of the Google Cloud Pub/Sub Subscription. Example: projects/8476107443/locations/europe-west1-d/subscriptions/my-lite-subscription\",\n-                                \"displayName\": \"Subscription\",\n+                            \"Max Size of Message Queue\": {\n+                                \"defaultValue\": \"10000\",\n+                                \"description\": \"The maximum size of the internal queue used to buffer messages being transferred from the underlying channel to the processor. Setting this value higher allows more messages to be buffered in memory during surges of incoming messages, but increases the total memory used by the processor during these surges.\",\n+                                \"displayName\": \"Max Size of Message Queue\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Max Size of Message Queue\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Max Size of Socket Buffer\": {\n+                                \"defaultValue\": \"1 MB\",\n+                                \"description\": \"The maximum size of the socket buffer that should be used. This is a suggestion to the Operating System to indicate how big the socket buffer should be. If this value is set too low, the buffer may fill up before the data can be read, and incoming data will be dropped.\",\n+                                \"displayName\": \"Max Size of Socket Buffer\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Max Size of Socket Buffer\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Message Delimiter\": {\n+                                \"defaultValue\": \"\\\\n\",\n+                                \"description\": \"Specifies the delimiter to place between messages when multiple messages are bundled together (see <Max Batch Size> property).\",\n+                                \"displayName\": \"Batching Message Delimiter\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Message Delimiter\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Port\": {\n+                                \"description\": \"The port to listen on for communication.\",\n+                                \"displayName\": \"Port\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"gcp-pubsub-subscription\",\n+                                \"name\": \"Port\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Receive Buffer Size\": {\n+                                \"defaultValue\": \"65507 B\",\n+                                \"description\": \"The size of each buffer used to receive messages. Adjust this value appropriately based on the expected size of the incoming messages.\",\n+                                \"displayName\": \"Receive Buffer Size\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Receive Buffer Size\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n+                            },\n+                            \"SSL Context Service\": {\n+                                \"description\": \"The Controller Service to use in order to obtain an SSL Context. If this property is set, messages will be received over a secure connection.\",\n+                                \"displayName\": \"SSL Context Service\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"SSL Context Service\",\n+                                \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.ssl.RestrictedSSLContextService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n                             }\n                         },\n                         \"seeAlso\": [\n-                            \"org.apache.nifi.processors.gcp.pubsub.lite.PublishGCPubSubLite\"\n+                            \"org.apache.nifi.processors.standard.ParseSyslog\"\n                         ],\n                         \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"FlowFiles are routed to this relationship after a successful Google Cloud Pub/Sub operation.\",\n+                                \"description\": \"Messages received successfully will be sent out this relationship.\",\n                                 \"name\": \"success\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n                         \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"consume\",\n-                            \"gcp\",\n-                            \"google\",\n-                            \"google-cloud\",\n-                            \"lite\",\n-                            \"message\",\n-                            \"pubsub\"\n+                            \"listen\",\n+                            \"logs\",\n+                            \"relp\",\n+                            \"tcp\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.gcp.pubsub.lite.ConsumeGCPubSubLite\",\n-                        \"typeDescription\": \"Consumes message from the configured Google Cloud PubSub Lite subscription.\",\n+                        \"type\": \"org.apache.nifi.processors.standard.ListenRELP\",\n+                        \"typeDescription\": \"Listens for RELP messages being sent to a given port over TCP. Each message will be acknowledged after successfully writing the message to a FlowFile. Each FlowFile will contain data portion of one or more RELP frames. In the case where the RELP frames contain syslog messages, the output of this processor can be sent to a ParseSyslog processor for further processing.\",\n                         \"version\": \"1.27.0\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"ID of the pubsub message published to the configured Google Cloud PubSub topic\",\n-                                \"name\": \"gcp.pubsub.messageId\"\n+                                \"description\": \"The command of the RELP frames.\",\n+                                \"name\": \"relp.command\"\n                             },\n                             {\n-                                \"description\": \"If non-empty, identifies related messages for which publish order should be respected. If a 'Subscription' has 'enable_message_ordering' set to 'true', messages published with the same non-empty 'ordering_key' value will be delivered to subscribers in the order in which they are received by the Pub/Sub system. All 'PubsubMessage's published in a given 'PublishRequest' must specify the same 'ordering_key' value.\",\n-                                \"name\": \"gcp.pubsub.ordering.key\"\n+                                \"description\": \"The sending host of the messages.\",\n+                                \"name\": \"relp.sender\"\n                             },\n                             {\n-                                \"description\": \"Number of attributes the consumed PubSub message has, if any\",\n-                                \"name\": \"gcp.pubsub.attributesCount\"\n+                                \"description\": \"The sending port the messages were received over.\",\n+                                \"name\": \"relp.port\"\n                             },\n                             {\n-                                \"description\": \"Timestamp value when the message was published\",\n-                                \"name\": \"gcp.pubsub.publishTime\"\n+                                \"description\": \"The transaction number of the message. Only included if <Batch Size> is 1.\",\n+                                \"name\": \"relp.txnr\"\n                             },\n                             {\n-                                \"description\": \"Other than the listed attributes, this processor may write zero or more attributes, if the original Google Cloud Publisher client added any attributes to the message while sending\",\n-                                \"name\": \"Dynamic Attributes\"\n+                                \"description\": \"The mime.type of the content which is text/plain\",\n+                                \"name\": \"mime.type\"\n                             }\n                         ]\n                     },\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-gcp-nar\",\n+                        \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -93088,154 +92474,362 @@\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n-                        \"dynamicProperties\": [\n-                            {\n-                                \"description\": \"Attributes to be set for the outgoing Google Cloud PubSub Lite message\",\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"name\": \"Attribute name\",\n-                                \"value\": \"Value to be set to the attribute\"\n-                            }\n-                        ],\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_REQUIRED\",\n+                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"GCP Credentials Provider Service\": {\n-                                \"description\": \"The Controller Service used to obtain Google Cloud Platform credentials.\",\n-                                \"displayName\": \"GCP Credentials Provider Service\",\n+                            \"Character Set\": {\n+                                \"defaultValue\": \"UTF-8\",\n+                                \"description\": \"Specifies the character set of the Syslog messages. Note that Expression language is not evaluated per FlowFile.\",\n+                                \"displayName\": \"Character Set\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Character Set\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Client Auth\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"WANT\",\n+                                        \"value\": \"WANT\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"REQUIRED\",\n+                                        \"value\": \"REQUIRED\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"NONE\",\n+                                        \"value\": \"NONE\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"REQUIRED\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"propertyDisplayName\": \"SSL Context Service\",\n+                                        \"propertyName\": \"SSL Context Service\"\n+                                    }\n+                                ],\n+                                \"description\": \"The client authentication policy to use for the SSL Context. Only used if an SSL Context Service is provided.\",\n+                                \"displayName\": \"Client Auth\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"GCP Credentials Provider Service\",\n-                                \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-gcp-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.gcp.credentials.service.GCPCredentialsService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n+                                \"name\": \"Client Auth\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n                             },\n-                            \"gcp-batch-bytes\": {\n-                                \"defaultValue\": \"3 MB\",\n-                                \"description\": \"Publish request gets triggered based on this Batch Bytes Threshold property and the Batch Size Threshold property, whichever condition is met first.\",\n-                                \"displayName\": \"Batch Bytes Threshold\",\n+                            \"Local Network Interface\": {\n+                                \"description\": \"The name of a local network interface to be used to restrict listening to a specific LAN.\",\n+                                \"displayName\": \"Local Network Interface\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"gcp-batch-bytes\",\n+                                \"name\": \"Local Network Interface\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Max Batch Size\": {\n+                                \"defaultValue\": \"1\",\n+                                \"description\": \"The maximum number of Syslog events to add to a single FlowFile. If multiple events are available, they will be concatenated along with the <Message Delimiter> up to this configured maximum number of messages\",\n+                                \"displayName\": \"Max Batch Size\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Max Batch Size\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"gcp-ordering-key\": {\n-                                \"description\": \"Messages with the same ordering key will always get published to the same partition. When this property is not set, messages can get published to different partitions if more than one partition exists for the topic.\",\n-                                \"displayName\": \"Ordering Key\",\n+                            \"Max Number of TCP Connections\": {\n+                                \"defaultValue\": \"2\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"TCP\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Protocol\",\n+                                        \"propertyName\": \"Protocol\"\n+                                    }\n+                                ],\n+                                \"description\": \"The maximum number of concurrent connections to accept Syslog messages in TCP mode.\",\n+                                \"displayName\": \"Max Number of TCP Connections\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"gcp-ordering-key\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Max Number of TCP Connections\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"gcp-pubsub-publish-batch-delay\": {\n-                                \"defaultValue\": \"100 millis\",\n-                                \"description\": \"Indicates the delay threshold to use for batching. After this amount of time has elapsed (counting from the first element added), the elements will be wrapped up in a batch and sent. This value should not be set too high, usually on the order of milliseconds. Otherwise, calls might appear to never complete.\",\n-                                \"displayName\": \"Batch Delay Threshold\",\n+                            \"Max Size of Message Queue\": {\n+                                \"defaultValue\": \"10000\",\n+                                \"description\": \"The maximum size of the internal queue used to buffer messages being transferred from the underlying channel to the processor. Setting this value higher allows more messages to be buffered in memory during surges of incoming messages, but increases the total memory used by the processor.\",\n+                                \"displayName\": \"Max Size of Message Queue\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"gcp-pubsub-publish-batch-delay\",\n+                                \"name\": \"Max Size of Message Queue\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"gcp-pubsub-publish-batch-size\": {\n-                                \"defaultValue\": \"15\",\n-                                \"description\": \"Indicates the number of messages the cloud service should bundle together in a batch. If not set and left empty, only one message will be used in a batch\",\n-                                \"displayName\": \"Batch Size Threshold\",\n+                            \"Max Size of Socket Buffer\": {\n+                                \"defaultValue\": \"1 MB\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"TCP\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Protocol\",\n+                                        \"propertyName\": \"Protocol\"\n+                                    }\n+                                ],\n+                                \"description\": \"The maximum size of the socket buffer that should be used. This is a suggestion to the Operating System to indicate how big the socket buffer should be. If this value is set too low, the buffer may fill up before the data can be read, and incoming data will be dropped.\",\n+                                \"displayName\": \"Max Size of Socket Buffer\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"gcp-pubsub-publish-batch-size\",\n+                                \"name\": \"Max Size of Socket Buffer\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"gcp-pubsub-topic\": {\n-                                \"description\": \"Name of the Google Cloud PubSub Topic. Example: projects/8476107443/locations/europe-west1-d/topics/my-lite-topic\",\n-                                \"displayName\": \"Topic Name\",\n+                            \"Message Delimiter\": {\n+                                \"defaultValue\": \"\\\\n\",\n+                                \"description\": \"Specifies the delimiter to place between Syslog messages when multiple messages are bundled together (see <Max Batch Size> property).\",\n+                                \"displayName\": \"Message Delimiter\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Message Delimiter\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Parse Messages\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"true\",\n+                                \"description\": \"Indicates if the processor should parse the Syslog messages. If set to false, each outgoing FlowFile will only contain the sender, protocol, and port, and no additional attributes.\",\n+                                \"displayName\": \"Parse Messages\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Parse Messages\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Port\": {\n+                                \"description\": \"The port for Syslog communication. Note that Expression language is not evaluated per FlowFile.\",\n+                                \"displayName\": \"Port\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"gcp-pubsub-topic\",\n+                                \"name\": \"Port\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Protocol\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"TCP\",\n+                                        \"value\": \"TCP\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"UDP\",\n+                                        \"value\": \"UDP\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"UDP\",\n+                                \"description\": \"The protocol for Syslog communication.\",\n+                                \"displayName\": \"Protocol\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Protocol\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Receive Buffer Size\": {\n+                                \"defaultValue\": \"65507 B\",\n+                                \"description\": \"The size of each buffer used to receive Syslog messages. Adjust this value appropriately based on the expected size of the incoming Syslog messages. When UDP is selected each buffer will hold one Syslog message. When TCP is selected messages are read from an incoming connection until the buffer is full, or the connection is closed. \",\n+                                \"displayName\": \"Receive Buffer Size\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Receive Buffer Size\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"SSL Context Service\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"TCP\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Protocol\",\n+                                        \"propertyName\": \"Protocol\"\n+                                    }\n+                                ],\n+                                \"description\": \"The Controller Service to use in order to obtain an SSL Context. If this property is set, syslog messages will be received over a secure connection.\",\n+                                \"displayName\": \"SSL Context Service\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"SSL Context Service\",\n+                                \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.ssl.RestrictedSSLContextService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"socket-keep-alive\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"false\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"TCP\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Protocol\",\n+                                        \"propertyName\": \"Protocol\"\n+                                    }\n+                                ],\n+                                \"description\": \"Whether or not to have TCP socket keep alive turned on. Timing details depend on operating system properties.\",\n+                                \"displayName\": \"Socket Keep Alive\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"socket-keep-alive\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             }\n                         },\n                         \"seeAlso\": [\n-                            \"org.apache.nifi.processors.gcp.pubsub.lite.ConsumeGCPubSubLite\"\n+                            \"org.apache.nifi.processors.standard.ParseSyslog\",\n+                            \"org.apache.nifi.processors.standard.PutSyslog\"\n                         ],\n                         \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"FlowFiles are routed to this relationship after a successful Google Cloud Pub/Sub operation.\",\n+                                \"description\": \"Syslog messages that match one of the expected formats will be sent out this relationship as a FlowFile per message.\",\n                                 \"name\": \"success\"\n                             },\n                             {\n-                                \"description\": \"FlowFiles are routed to this relationship if the Google Cloud Pub/Sub operation fails.\",\n-                                \"name\": \"failure\"\n+                                \"description\": \"Syslog messages that do not match one of the expected formats will be sent out this relationship as a FlowFile per message.\",\n+                                \"name\": \"invalid\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n-                        \"supportsBatching\": false,\n-                        \"supportsDynamicProperties\": true,\n+                        \"supportsBatching\": true,\n+                        \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n-                        \"systemResourceConsiderations\": [\n-                            {\n-                                \"description\": \"The entirety of the FlowFile's content will be read into memory to be sent as a PubSub message.\",\n-                                \"resource\": \"MEMORY\"\n-                            }\n-                        ],\n                         \"tags\": [\n-                            \"gcp\",\n-                            \"google\",\n-                            \"google-cloud\",\n-                            \"lite\",\n-                            \"message\",\n-                            \"publish\",\n-                            \"pubsub\"\n+                            \"listen\",\n+                            \"logs\",\n+                            \"syslog\",\n+                            \"tcp\",\n+                            \"udp\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.gcp.pubsub.lite.PublishGCPubSubLite\",\n-                        \"typeDescription\": \"Publishes the content of the incoming FlowFile to the configured Google Cloud PubSub Lite topic. The processor supports dynamic properties. If any dynamic properties are present, they will be sent along with the message in the form of 'attributes'.\",\n+                        \"type\": \"org.apache.nifi.processors.standard.ListenSyslog\",\n+                        \"typeDescription\": \"Listens for Syslog messages being sent to a given port over TCP or UDP. Incoming messages are checked against regular expressions for RFC5424 and RFC3164 formatted messages. The format of each message is: (<PRIORITY>)(VERSION )(TIMESTAMP) (HOSTNAME) (BODY) where version is optional. The timestamp can be an RFC5424 timestamp with a format of \\\"yyyy-MM-dd'T'HH:mm:ss.SZ\\\" or \\\"yyyy-MM-dd'T'HH:mm:ss.S+hh:mm\\\", or it can be an RFC3164 timestamp with a format of \\\"MMM d HH:mm:ss\\\". If an incoming messages matches one of these patterns, the message will be parsed and the individual pieces will be placed in FlowFile attributes, with the original message in the content of the FlowFile. If an incoming message does not match one of these patterns it will not be parsed and the syslog.valid attribute will be set to false with the original message in the content of the FlowFile. Valid messages will be transferred on the success relationship, and invalid messages will be transferred on the invalid relationship.\",\n                         \"version\": \"1.27.0\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"ID of the pubsub message published to the configured Google Cloud PubSub topic\",\n-                                \"name\": \"gcp.pubsub.messageId\"\n+                                \"description\": \"The priority of the Syslog message.\",\n+                                \"name\": \"syslog.priority\"\n                             },\n                             {\n-                                \"description\": \"Name of the Google Cloud PubSub topic the message was published to\",\n-                                \"name\": \"gcp.pubsub.topic\"\n+                                \"description\": \"The severity of the Syslog message derived from the priority.\",\n+                                \"name\": \"syslog.severity\"\n+                            },\n+                            {\n+                                \"description\": \"The facility of the Syslog message derived from the priority.\",\n+                                \"name\": \"syslog.facility\"\n+                            },\n+                            {\n+                                \"description\": \"The optional version from the Syslog message.\",\n+                                \"name\": \"syslog.version\"\n+                            },\n+                            {\n+                                \"description\": \"The timestamp of the Syslog message.\",\n+                                \"name\": \"syslog.timestamp\"\n+                            },\n+                            {\n+                                \"description\": \"The hostname or IP address of the Syslog message.\",\n+                                \"name\": \"syslog.hostname\"\n+                            },\n+                            {\n+                                \"description\": \"The hostname of the Syslog server that sent the message.\",\n+                                \"name\": \"syslog.sender\"\n+                            },\n+                            {\n+                                \"description\": \"The body of the Syslog message, everything after the hostname.\",\n+                                \"name\": \"syslog.body\"\n+                            },\n+                            {\n+                                \"description\": \"An indicator of whether this message matched the expected formats. If this value is false, the other attributes will be empty and only the original message will be available in the content.\",\n+                                \"name\": \"syslog.valid\"\n+                            },\n+                            {\n+                                \"description\": \"The protocol over which the Syslog message was received.\",\n+                                \"name\": \"syslog.protocol\"\n+                            },\n+                            {\n+                                \"description\": \"The port over which the Syslog message was received.\",\n+                                \"name\": \"syslog.port\"\n+                            },\n+                            {\n+                                \"description\": \"The mime.type of the FlowFile which will be text/plain for Syslog messages.\",\n+                                \"name\": \"mime.type\"\n                             }\n                         ]\n                     },\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-gcp-nar\",\n+                        \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -93244,195 +92838,253 @@\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_REQUIRED\",\n+                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"GCP Credentials Provider Service\": {\n-                                \"description\": \"The Controller Service used to obtain Google Cloud Platform credentials.\",\n-                                \"displayName\": \"GCP Credentials Provider Service\",\n+                            \"Character Set\": {\n+                                \"defaultValue\": \"UTF-8\",\n+                                \"description\": \"Specifies the character set of the received data.\",\n+                                \"displayName\": \"Character Set\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"GCP Credentials Provider Service\",\n+                                \"name\": \"Character Set\",\n                                 \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-gcp-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.gcp.credentials.service.GCPCredentialsService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n+                                \"sensitive\": false\n                             },\n-                            \"gcp-project-id\": {\n-                                \"description\": \"Google Cloud Project ID\",\n-                                \"displayName\": \"Project ID\",\n+                            \"Client Auth\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"WANT\",\n+                                        \"value\": \"WANT\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"REQUIRED\",\n+                                        \"value\": \"REQUIRED\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"NONE\",\n+                                        \"value\": \"NONE\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"REQUIRED\",\n+                                \"description\": \"The client authentication policy to use for the SSL Context. Only used if an SSL Context Service is provided.\",\n+                                \"displayName\": \"Client Auth\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"gcp-project-id\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Client Auth\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"gcp-proxy-host\": {\n-                                \"description\": \"IP or hostname of the proxy to be used.\\n You might need to set the following properties in bootstrap for https proxy usage:\\n-Djdk.http.auth.tunneling.disabledSchemes=\\n-Djdk.http.auth.proxying.disabledSchemes=\",\n-                                \"displayName\": \"Proxy host\",\n+                            \"Local Network Interface\": {\n+                                \"description\": \"The name of a local network interface to be used to restrict listening to a specific LAN.\",\n+                                \"displayName\": \"Local Network Interface\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"gcp-proxy-host\",\n+                                \"name\": \"Local Network Interface\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"gcp-proxy-port\": {\n-                                \"description\": \"Proxy port number\",\n-                                \"displayName\": \"Proxy port\",\n+                            \"Max Batch Size\": {\n+                                \"defaultValue\": \"1\",\n+                                \"description\": \"The maximum number of messages to add to a single FlowFile. If multiple messages are available, they will be concatenated along with the <Message Delimiter> up to this configured maximum number of messages\",\n+                                \"displayName\": \"Max Batch Size\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"gcp-proxy-port\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Max Batch Size\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"gcp-proxy-user-name\": {\n-                                \"description\": \"HTTP Proxy Username\",\n-                                \"displayName\": \"HTTP Proxy Username\",\n+                            \"Max Number of TCP Connections\": {\n+                                \"defaultValue\": \"2\",\n+                                \"description\": \"The maximum number of worker threads available for servicing TCP connections.\",\n+                                \"displayName\": \"Max Number of Worker Threads\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"gcp-proxy-user-name\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Max Number of TCP Connections\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"gcp-proxy-user-password\": {\n-                                \"description\": \"HTTP Proxy Password\",\n-                                \"displayName\": \"HTTP Proxy Password\",\n+                            \"Max Size of Message Queue\": {\n+                                \"defaultValue\": \"10000\",\n+                                \"description\": \"The maximum size of the internal queue used to buffer messages being transferred from the underlying channel to the processor. Setting this value higher allows more messages to be buffered in memory during surges of incoming messages, but increases the total memory used by the processor during these surges.\",\n+                                \"displayName\": \"Max Size of Message Queue\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"gcp-proxy-user-password\",\n-                                \"required\": false,\n-                                \"sensitive\": true\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Max Size of Message Queue\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n                             },\n-                            \"gcp-retry-count\": {\n-                                \"defaultValue\": \"6\",\n-                                \"description\": \"How many retry attempts should be made before routing to the failure relationship.\",\n-                                \"displayName\": \"Number of retries\",\n+                            \"Max Size of Socket Buffer\": {\n+                                \"defaultValue\": \"1 MB\",\n+                                \"description\": \"The maximum size of the socket buffer that should be used. This is a suggestion to the Operating System to indicate how big the socket buffer should be. If this value is set too low, the buffer may fill up before the data can be read, and incoming data will be dropped.\",\n+                                \"displayName\": \"Max Size of Socket Buffer\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"gcp-retry-count\",\n+                                \"name\": \"Max Size of Socket Buffer\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"gcs-bucket\": {\n-                                \"defaultValue\": \"${gcs.bucket}\",\n-                                \"description\": \"Bucket of the object.\",\n-                                \"displayName\": \"Bucket\",\n+                            \"Message Delimiter\": {\n+                                \"defaultValue\": \"\\\\n\",\n+                                \"description\": \"Specifies the delimiter to place between messages when multiple messages are bundled together (see <Max Batch Size> property).\",\n+                                \"displayName\": \"Batching Message Delimiter\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"gcs-bucket\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Message Delimiter\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"gcs-generation\": {\n-                                \"description\": \"The generation of the object to be deleted. If null, will use latest version of the object.\",\n-                                \"displayName\": \"Generation\",\n+                            \"Port\": {\n+                                \"description\": \"The port to listen on for communication.\",\n+                                \"displayName\": \"Port\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"gcs-generation\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Port\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"gcs-key\": {\n-                                \"defaultValue\": \"${filename}\",\n-                                \"description\": \"Name of the object.\",\n-                                \"displayName\": \"Key\",\n+                            \"Receive Buffer Size\": {\n+                                \"defaultValue\": \"65507 B\",\n+                                \"description\": \"The size of each buffer used to receive messages. Adjust this value appropriately based on the expected size of the incoming messages.\",\n+                                \"displayName\": \"Receive Buffer Size\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"gcs-key\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Receive Buffer Size\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"proxy-configuration-service\": {\n-                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests. If set, it supersedes proxy settings configured per component. Supported proxies: HTTP + AuthN\",\n-                                \"displayName\": \"Proxy Configuration Service\",\n+                            \"SSL Context Service\": {\n+                                \"description\": \"The Controller Service to use in order to obtain an SSL Context. If this property is set, messages will be received over a secure connection.\",\n+                                \"displayName\": \"SSL Context Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"proxy-configuration-service\",\n+                                \"name\": \"SSL Context Service\",\n                                 \"required\": false,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n                                     \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.proxy.ProxyConfigurationService\",\n+                                    \"type\": \"org.apache.nifi.ssl.RestrictedSSLContextService\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             },\n-                            \"storage-api-url\": {\n-                                \"description\": \"Overrides the default storage URL. Configuring an alternative Storage API URL also overrides the HTTP Host header on requests as described in the Google documentation for Private Service Connections.\",\n-                                \"displayName\": \"Storage API URL\",\n+                            \"idle-timeout\": {\n+                                \"defaultValue\": \"0 seconds\",\n+                                \"description\": \"The amount of time a client's connection will remain open if no data is received. The default of 0 seconds will leave connections open until they are closed by the client.\",\n+                                \"displayName\": \"Idle Connection Timeout\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"storage-api-url\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"idle-timeout\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"max-receiving-threads\": {\n+                                \"description\": \"This property is deprecated and no longer used.\",\n+                                \"displayName\": \"Max Number of Receiving Message Handler Threads\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"max-receiving-threads\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n+                            },\n+                            \"pool-receive-buffers\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"True\",\n+                                        \"value\": \"True\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"False\",\n+                                        \"value\": \"False\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"True\",\n+                                \"description\": \"Enable or disable pooling of buffers that the processor uses for handling bytes received on socket connections. The framework allocates buffers as needed during processing.\",\n+                                \"displayName\": \"Pool Receive Buffers\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"pool-receive-buffers\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n                             }\n                         },\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.processors.gcp.storage.FetchGCSObject\",\n-                            \"org.apache.nifi.processors.gcp.storage.ListGCSBucket\",\n-                            \"org.apache.nifi.processors.gcp.storage.PutGCSObject\"\n-                        ],\n                         \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"FlowFiles are routed to this relationship after a successful Google Cloud Storage operation.\",\n+                                \"description\": \"Messages received successfully will be sent out this relationship.\",\n                                 \"name\": \"success\"\n-                            },\n-                            {\n-                                \"description\": \"FlowFiles are routed to this relationship if the Google Cloud Storage operation fails.\",\n-                                \"name\": \"failure\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n                         \"supportsBatching\": true,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"delete\",\n-                            \"gcs\",\n-                            \"google\",\n-                            \"google cloud\",\n-                            \"storage\"\n+                            \"listen\",\n+                            \"ssl\",\n+                            \"tcp\",\n+                            \"tls\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.gcp.storage.DeleteGCSObject\",\n-                        \"typeDescription\": \"Deletes objects from a Google Cloud Bucket. If attempting to delete a file that does not exist, FlowFile is routed to success.\",\n-                        \"version\": \"1.27.0\"\n+                        \"type\": \"org.apache.nifi.processors.standard.ListenTCP\",\n+                        \"typeDescription\": \"Listens for incoming TCP connections and reads data from each connection using a line separator as the message demarcator. The default behavior is for each message to produce a single FlowFile, however this can be controlled by increasing the Batch Size to a larger value for higher throughput. The Receive Buffer Size must be set as large as the largest messages expected to be received, meaning if every 100kb there is a line separator, then the Receive Buffer Size must be greater than 100kb. The processor can be configured to use an SSL Context Service to only allow secure connections. When connected clients present certificates for mutual TLS authentication, the Distinguished Names of the client certificate's issuer and subject are added to the outgoing FlowFiles as attributes. The processor does not perform authorization based on Distinguished Name values, but since these values are attached to the outgoing FlowFiles, authorization can be implemented based on these attributes.\",\n+                        \"version\": \"1.27.0\",\n+                        \"writesAttributes\": [\n+                            {\n+                                \"description\": \"The sending host of the messages.\",\n+                                \"name\": \"tcp.sender\"\n+                            },\n+                            {\n+                                \"description\": \"The sending port the messages were received.\",\n+                                \"name\": \"tcp.port\"\n+                            },\n+                            {\n+                                \"description\": \"For connections using mutual TLS, the Distinguished Name of the Certificate Authority that issued the client's certificate is attached to the FlowFile.\",\n+                                \"name\": \"client.certificate.issuer.dn\"\n+                            },\n+                            {\n+                                \"description\": \"For connections using mutual TLS, the Distinguished Name of the client certificate's owner (subject) is attached to the FlowFile.\",\n+                                \"name\": \"client.certificate.subject.dn\"\n+                            }\n+                        ]\n                     },\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-gcp-nar\",\n+                        \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -93441,1517 +93093,1265 @@\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_REQUIRED\",\n+                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"GCP Credentials Provider Service\": {\n-                                \"description\": \"The Controller Service used to obtain Google Cloud Platform credentials.\",\n-                                \"displayName\": \"GCP Credentials Provider Service\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"GCP Credentials Provider Service\",\n-                                \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-gcp-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.gcp.credentials.service.GCPCredentialsService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            },\n-                            \"gcp-project-id\": {\n-                                \"description\": \"Google Cloud Project ID\",\n-                                \"displayName\": \"Project ID\",\n+                            \"Local Network Interface\": {\n+                                \"description\": \"The name of a local network interface to be used to restrict listening to a specific LAN.\",\n+                                \"displayName\": \"Local Network Interface\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"gcp-project-id\",\n+                                \"name\": \"Local Network Interface\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"gcp-proxy-host\": {\n-                                \"description\": \"IP or hostname of the proxy to be used.\\n You might need to set the following properties in bootstrap for https proxy usage:\\n-Djdk.http.auth.tunneling.disabledSchemes=\\n-Djdk.http.auth.proxying.disabledSchemes=\",\n-                                \"displayName\": \"Proxy host\",\n+                            \"client-auth\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"WANT\",\n+                                        \"value\": \"WANT\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"REQUIRED\",\n+                                        \"value\": \"REQUIRED\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"NONE\",\n+                                        \"value\": \"NONE\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"REQUIRED\",\n+                                \"description\": \"The client authentication policy to use for the SSL Context. Only used if an SSL Context Service is provided.\",\n+                                \"displayName\": \"Client Auth\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"gcp-proxy-host\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"client-auth\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"gcp-proxy-port\": {\n-                                \"description\": \"Proxy port number\",\n-                                \"displayName\": \"Proxy port\",\n+                            \"max-number-tcp-connections\": {\n+                                \"defaultValue\": \"2\",\n+                                \"description\": \"The maximum number of concurrent TCP connections to accept. In cases where clients are keeping a connection open, the concurrent tasks for the processor should be adjusted to match the Max Number of TCP Connections allowed, so that there is a task processing each connection.\",\n+                                \"displayName\": \"Max Number of TCP Connections\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"gcp-proxy-port\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"max-number-tcp-connections\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"gcp-proxy-user-name\": {\n-                                \"description\": \"HTTP Proxy Username\",\n-                                \"displayName\": \"HTTP Proxy Username\",\n+                            \"max-size-socket-buffer\": {\n+                                \"defaultValue\": \"1 MB\",\n+                                \"description\": \"The maximum size of the socket buffer that should be used. This is a suggestion to the Operating System to indicate how big the socket buffer should be. If this value is set too low, the buffer may fill up before the data can be read, and incoming data will be dropped.\",\n+                                \"displayName\": \"Max Size of Socket Buffer\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"gcp-proxy-user-name\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"max-size-socket-buffer\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"gcp-proxy-user-password\": {\n-                                \"description\": \"HTTP Proxy Password\",\n-                                \"displayName\": \"HTTP Proxy Password\",\n+                            \"port\": {\n+                                \"description\": \"The port to listen on for communication.\",\n+                                \"displayName\": \"Port\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"gcp-proxy-user-password\",\n-                                \"required\": false,\n-                                \"sensitive\": true\n+                                \"name\": \"port\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n                             },\n-                            \"gcp-retry-count\": {\n-                                \"defaultValue\": \"6\",\n-                                \"description\": \"How many retry attempts should be made before routing to the failure relationship.\",\n-                                \"displayName\": \"Number of retries\",\n+                            \"read-timeout\": {\n+                                \"defaultValue\": \"10 seconds\",\n+                                \"description\": \"The amount of time to wait before timing out when reading from a connection.\",\n+                                \"displayName\": \"Read Timeout\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"gcp-retry-count\",\n+                                \"name\": \"read-timeout\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"gcs-bucket\": {\n-                                \"defaultValue\": \"${gcs.bucket}\",\n-                                \"description\": \"Bucket of the object.\",\n-                                \"displayName\": \"Bucket\",\n+                            \"reader-error-handling-strategy\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"Transfers any records already received and closes the connection.\",\n+                                        \"displayName\": \"Transfer\",\n+                                        \"value\": \"Transfer\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Discards any records already received and closes the connection.\",\n+                                        \"displayName\": \"Discard\",\n+                                        \"value\": \"Discard\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"Transfer\",\n+                                \"description\": \"Indicates how to deal with an error while reading the next record from a connection, when previous records have already been read from the connection.\",\n+                                \"displayName\": \"Read Error Strategy\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"gcs-bucket\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"reader-error-handling-strategy\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"gcs-generation\": {\n-                                \"description\": \"The generation of the Object to download. If not set, the latest generation will be downloaded.\",\n-                                \"displayName\": \"Object Generation\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"gcs-generation\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"gcs-key\": {\n-                                \"defaultValue\": \"${filename}\",\n-                                \"description\": \"Name of the object.\",\n-                                \"displayName\": \"Name\",\n+                            \"record-batch-size\": {\n+                                \"defaultValue\": \"1000\",\n+                                \"description\": \"The maximum number of records to write to a single FlowFile.\",\n+                                \"displayName\": \"Record Batch Size\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"gcs-key\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"record-batch-size\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"gcs-object-range-length\": {\n-                                \"description\": \"The number of bytes to download from the object, starting from the Range Start. An empty value or a value that extends beyond the end of the object will read to the end of the object.\",\n-                                \"displayName\": \"Range Length\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"gcs-object-range-length\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"gcs-object-range-start\": {\n-                                \"description\": \"The byte position at which to start reading from the object. An empty value or a value of zero will start reading at the beginning of the object.\",\n-                                \"displayName\": \"Range Start\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"gcs-object-range-start\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"gcs-server-side-encryption-key\": {\n-                                \"description\": \"An AES256 Key (encoded in base64) which the object has been encrypted in.\",\n-                                \"displayName\": \"Server Side Encryption Key\",\n+                            \"record-reader\": {\n+                                \"description\": \"The Record Reader to use for incoming FlowFiles\",\n+                                \"displayName\": \"Record Reader\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"gcs-server-side-encryption-key\",\n-                                \"required\": false,\n-                                \"sensitive\": true\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"record-reader\",\n+                                \"required\": true,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n                             },\n-                            \"proxy-configuration-service\": {\n-                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests. If set, it supersedes proxy settings configured per component. Supported proxies: HTTP + AuthN\",\n-                                \"displayName\": \"Proxy Configuration Service\",\n+                            \"record-writer\": {\n+                                \"description\": \"The Record Writer to use in order to serialize the data before writing to a FlowFile\",\n+                                \"displayName\": \"Record Writer\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"proxy-configuration-service\",\n-                                \"required\": false,\n+                                \"name\": \"record-writer\",\n+                                \"required\": true,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n                                     \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.proxy.ProxyConfigurationService\",\n+                                    \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             },\n-                            \"storage-api-url\": {\n-                                \"description\": \"Overrides the default storage URL. Configuring an alternative Storage API URL also overrides the HTTP Host header on requests as described in the Google documentation for Private Service Connections.\",\n-                                \"displayName\": \"Storage API URL\",\n+                            \"ssl-context-service\": {\n+                                \"description\": \"The Controller Service to use in order to obtain an SSL Context. If this property is set, messages will be received over a secure connection.\",\n+                                \"displayName\": \"SSL Context Service\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"storage-api-url\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"ssl-context-service\",\n                                 \"required\": false,\n-                                \"sensitive\": false\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.ssl.RestrictedSSLContextService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n                             }\n                         },\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.processors.gcp.storage.DeleteGCSObject\",\n-                            \"org.apache.nifi.processors.gcp.storage.ListGCSBucket\",\n-                            \"org.apache.nifi.processors.gcp.storage.PutGCSObject\"\n-                        ],\n                         \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"FlowFiles are routed to this relationship after a successful Google Cloud Storage operation.\",\n+                                \"description\": \"Messages received successfully will be sent out this relationship.\",\n                                 \"name\": \"success\"\n-                            },\n-                            {\n-                                \"description\": \"FlowFiles are routed to this relationship if the Google Cloud Storage operation fails.\",\n-                                \"name\": \"failure\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n-                        \"supportsBatching\": false,\n+                        \"supportsBatching\": true,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"fetch\",\n-                            \"gcs\",\n-                            \"google\",\n-                            \"google cloud\",\n-                            \"storage\"\n+                            \"listen\",\n+                            \"record\",\n+                            \"ssl\",\n+                            \"tcp\",\n+                            \"tls\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.gcp.storage.FetchGCSObject\",\n-                        \"typeDescription\": \"Fetches a file from a Google Cloud Bucket. Designed to be used in tandem with ListGCSBucket.\",\n+                        \"type\": \"org.apache.nifi.processors.standard.ListenTCPRecord\",\n+                        \"typeDescription\": \"Listens for incoming TCP connections and reads data from each connection using a configured record reader, and writes the records to a flow file using a configured record writer. The type of record reader selected will determine how clients are expected to send data. For example, when using a Grok reader to read logs, a client can keep an open connection and continuously stream data, but when using an JSON reader, the client cannot send an array of JSON documents and then send another array on the same connection, as the reader would be in a bad state at that point. Records will be read from the connection in blocking mode, and will timeout according to the Read Timeout specified in the processor. If the read times out, or if any other error is encountered when reading, the connection will be closed, and any records read up to that point will be handled according to the configured Read Error Strategy (Discard or Transfer). In cases where clients are keeping a connection open, the concurrent tasks for the processor should be adjusted to match the Max Number of TCP Connections allowed, so that there is a task processing each connection. The processor can be configured to use an SSL Context Service to only allow secure connections. When connected clients present certificates for mutual TLS authentication, the Distinguished Names of the client certificate's issuer and subject are added to the outgoing FlowFiles as attributes. The processor does not perform authorization based on Distinguished Name values, but since these values are attached to the outgoing FlowFiles, authorization can be implemented based on these attributes.\",\n                         \"version\": \"1.27.0\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"The name of the file, parsed if possible from the Content-Disposition response header\",\n-                                \"name\": \"filename\"\n-                            },\n-                            {\n-                                \"description\": \"Bucket of the object.\",\n-                                \"name\": \"gcs.bucket\"\n-                            },\n-                            {\n-                                \"description\": \"Name of the object.\",\n-                                \"name\": \"gcs.key\"\n-                            },\n-                            {\n-                                \"description\": \"Size of the object.\",\n-                                \"name\": \"gcs.size\"\n-                            },\n-                            {\n-                                \"description\": \"Data cache control of the object.\",\n-                                \"name\": \"gcs.cache.control\"\n-                            },\n-                            {\n-                                \"description\": \"The number of components which make up the object.\",\n-                                \"name\": \"gcs.component.count\"\n-                            },\n-                            {\n-                                \"description\": \"The data content disposition of the object.\",\n-                                \"name\": \"gcs.content.disposition\"\n+                                \"description\": \"The host that sent the data.\",\n+                                \"name\": \"tcp.sender\"\n                             },\n                             {\n-                                \"description\": \"The content encoding of the object.\",\n-                                \"name\": \"gcs.content.encoding\"\n+                                \"description\": \"The port that the processor accepted the connection on.\",\n+                                \"name\": \"tcp.port\"\n                             },\n                             {\n-                                \"description\": \"The content language of the object.\",\n-                                \"name\": \"gcs.content.language\"\n+                                \"description\": \"The number of records written to the flow file.\",\n+                                \"name\": \"record.count\"\n                             },\n                             {\n-                                \"description\": \"The MIME/Content-Type of the object\",\n+                                \"description\": \"The mime-type of the writer used to write the records to the flow file.\",\n                                 \"name\": \"mime.type\"\n                             },\n                             {\n-                                \"description\": \"The CRC32C checksum of object's data, encoded in base64 in big-endian order.\",\n-                                \"name\": \"gcs.crc32c\"\n-                            },\n-                            {\n-                                \"description\": \"The creation time of the object (milliseconds)\",\n-                                \"name\": \"gcs.create.time\"\n-                            },\n-                            {\n-                                \"description\": \"The last modification time of the object (milliseconds)\",\n-                                \"name\": \"gcs.update.time\"\n-                            },\n-                            {\n-                                \"description\": \"The algorithm used to encrypt the object.\",\n-                                \"name\": \"gcs.encryption.algorithm\"\n-                            },\n-                            {\n-                                \"description\": \"The SHA256 hash of the key used to encrypt the object\",\n-                                \"name\": \"gcs.encryption.sha256\"\n-                            },\n-                            {\n-                                \"description\": \"The HTTP 1.1 Entity tag for the object.\",\n-                                \"name\": \"gcs.etag\"\n-                            },\n-                            {\n-                                \"description\": \"The service-generated for the object\",\n-                                \"name\": \"gcs.generated.id\"\n-                            },\n-                            {\n-                                \"description\": \"The data generation of the object.\",\n-                                \"name\": \"gcs.generation\"\n-                            },\n-                            {\n-                                \"description\": \"The MD5 hash of the object's data encoded in base64.\",\n-                                \"name\": \"gcs.md5\"\n-                            },\n-                            {\n-                                \"description\": \"The media download link to the object.\",\n-                                \"name\": \"gcs.media.link\"\n-                            },\n-                            {\n-                                \"description\": \"The metageneration of the object.\",\n-                                \"name\": \"gcs.metageneration\"\n-                            },\n-                            {\n-                                \"description\": \"The owner (uploader) of the object.\",\n-                                \"name\": \"gcs.owner\"\n-                            },\n-                            {\n-                                \"description\": \"The ACL entity type of the uploader of the object.\",\n-                                \"name\": \"gcs.owner.type\"\n+                                \"description\": \"For connections using mutual TLS, the Distinguished Name of the Certificate Authority that issued the client's certificate is attached to the FlowFile.\",\n+                                \"name\": \"client.certificate.issuer.dn\"\n                             },\n                             {\n-                                \"description\": \"The URI of the object as a string.\",\n-                                \"name\": \"gcs.uri\"\n+                                \"description\": \"For connections using mutual TLS, the Distinguished Name of the client certificate's owner (subject) is attached to the FlowFile.\",\n+                                \"name\": \"client.certificate.subject.dn\"\n                             }\n                         ]\n                     },\n                     {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-gcp-nar\",\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n                         },\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"1 min\"\n+                            \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_FORBIDDEN\",\n-                        \"primaryNodeOnly\": true,\n+                        \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"GCP Credentials Provider Service\": {\n-                                \"description\": \"The Controller Service used to obtain Google Cloud Platform credentials.\",\n-                                \"displayName\": \"GCP Credentials Provider Service\",\n+                            \"Character Set\": {\n+                                \"defaultValue\": \"UTF-8\",\n+                                \"description\": \"Specifies the character set of the received data.\",\n+                                \"displayName\": \"Character Set\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"GCP Credentials Provider Service\",\n+                                \"name\": \"Character Set\",\n                                 \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-gcp-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.gcp.credentials.service.GCPCredentialsService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n+                                \"sensitive\": false\n                             },\n-                            \"et-initial-listing-target\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"Ignore entities having timestamp older than the specified 'Tracking Time Window' at the initial listing activity.\",\n-                                        \"displayName\": \"Tracking Time Window\",\n-                                        \"value\": \"window\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Regardless of entities timestamp, all existing entities will be listed at the initial listing activity.\",\n-                                        \"displayName\": \"All Available\",\n-                                        \"value\": \"all\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"all\",\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"entities\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Listing Strategy\",\n-                                        \"propertyName\": \"listing-strategy\"\n-                                    }\n-                                ],\n-                                \"description\": \"Specify how initial listing should be handled. Used by 'Tracking Entities' strategy.\",\n-                                \"displayName\": \"Entity Tracking Initial Listing Target\",\n+                            \"Local Network Interface\": {\n+                                \"description\": \"The name of a local network interface to be used to restrict listening to a specific LAN.\",\n+                                \"displayName\": \"Local Network Interface\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Local Network Interface\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Max Batch Size\": {\n+                                \"defaultValue\": \"1\",\n+                                \"description\": \"The maximum number of messages to add to a single FlowFile. If multiple messages are available, they will be concatenated along with the <Message Delimiter> up to this configured maximum number of messages\",\n+                                \"displayName\": \"Max Batch Size\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"et-initial-listing-target\",\n-                                \"required\": false,\n+                                \"name\": \"Max Batch Size\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"et-state-cache\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"entities\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Listing Strategy\",\n-                                        \"propertyName\": \"listing-strategy\"\n-                                    }\n-                                ],\n-                                \"description\": \"Listed entities are stored in the specified cache storage so that this processor can resume listing across NiFi restart or in case of primary node change. 'Tracking Entities' strategy require tracking information of all listed entities within the last 'Tracking Time Window'. To support large number of entities, the strategy uses DistributedMapCache instead of managed state. Cache key format is 'ListedEntities::{processorId}(::{nodeId})'. If it tracks per node listed entities, then the optional '::{nodeId}' part is added to manage state separately. E.g. cluster wide cache key = 'ListedEntities::8dda2321-0164-1000-50fa-3042fe7d6a7b', per node cache key = 'ListedEntities::8dda2321-0164-1000-50fa-3042fe7d6a7b::nifi-node3' The stored cache content is Gzipped JSON string. The cache key will be deleted when target listing configuration is changed. Used by 'Tracking Entities' strategy.\",\n-                                \"displayName\": \"Entity Tracking State Cache\",\n+                            \"Max Size of Message Queue\": {\n+                                \"defaultValue\": \"10000\",\n+                                \"description\": \"The maximum size of the internal queue used to buffer messages being transferred from the underlying channel to the processor. Setting this value higher allows more messages to be buffered in memory during surges of incoming messages, but increases the total memory used by the processor.\",\n+                                \"displayName\": \"Max Size of Message Queue\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"et-state-cache\",\n+                                \"name\": \"Max Size of Message Queue\",\n                                 \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.distributed.cache.client.DistributedMapCacheClient\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n+                                \"sensitive\": false\n                             },\n-                            \"et-time-window\": {\n-                                \"defaultValue\": \"3 hours\",\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"window\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Entity Tracking Initial Listing Target\",\n-                                        \"propertyName\": \"et-initial-listing-target\"\n-                                    }\n-                                ],\n-                                \"description\": \"Specify how long this processor should track already-listed entities. 'Tracking Entities' strategy can pick any entity whose timestamp is inside the specified time window. For example, if set to '30 minutes', any entity having timestamp in recent 30 minutes will be the listing target when this processor runs. A listed entity is considered 'new/updated' and a FlowFile is emitted if one of following condition meets: 1. does not exist in the already-listed entities, 2. has newer timestamp than the cached entity, 3. has different size than the cached entity. If a cached entity's timestamp becomes older than specified time window, that entity will be removed from the cached already-listed entities. Used by 'Tracking Entities' strategy.\",\n-                                \"displayName\": \"Entity Tracking Time Window\",\n+                            \"Max Size of Socket Buffer\": {\n+                                \"defaultValue\": \"1 MB\",\n+                                \"description\": \"The maximum size of the socket buffer that should be used. This is a suggestion to the Operating System to indicate how big the socket buffer should be. If this value is set too low, the buffer may fill up before the data can be read, and incoming data will be dropped.\",\n+                                \"displayName\": \"Max Size of Socket Buffer\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"et-time-window\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Max Size of Socket Buffer\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"gcp-project-id\": {\n-                                \"description\": \"Google Cloud Project ID\",\n-                                \"displayName\": \"Project ID\",\n+                            \"Message Delimiter\": {\n+                                \"defaultValue\": \"\\\\n\",\n+                                \"description\": \"Specifies the delimiter to place between messages when multiple messages are bundled together (see <Max Batch Size> property).\",\n+                                \"displayName\": \"Batching Message Delimiter\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"gcp-project-id\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Message Delimiter\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"gcp-proxy-host\": {\n-                                \"description\": \"IP or hostname of the proxy to be used.\\n You might need to set the following properties in bootstrap for https proxy usage:\\n-Djdk.http.auth.tunneling.disabledSchemes=\\n-Djdk.http.auth.proxying.disabledSchemes=\",\n-                                \"displayName\": \"Proxy host\",\n+                            \"Port\": {\n+                                \"description\": \"The port to listen on for communication.\",\n+                                \"displayName\": \"Port\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"gcp-proxy-host\",\n-                                \"required\": false,\n+                                \"name\": \"Port\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"gcp-proxy-port\": {\n-                                \"description\": \"Proxy port number\",\n-                                \"displayName\": \"Proxy port\",\n+                            \"Receive Buffer Size\": {\n+                                \"defaultValue\": \"65507 B\",\n+                                \"description\": \"The size of each buffer used to receive messages. Adjust this value appropriately based on the expected size of the incoming messages.\",\n+                                \"displayName\": \"Receive Buffer Size\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Receive Buffer Size\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Sending Host\": {\n+                                \"description\": \"IP, or name, of a remote host. Only Datagrams from the specified Sending Host Port and this host will be accepted. Improves Performance. May be a system property or an environment variable.\",\n+                                \"displayName\": \"Sending Host\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"gcp-proxy-port\",\n+                                \"name\": \"Sending Host\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"gcp-proxy-user-name\": {\n-                                \"description\": \"HTTP Proxy Username\",\n-                                \"displayName\": \"HTTP Proxy Username\",\n+                            \"Sending Host Port\": {\n+                                \"description\": \"Port being used by remote host to send Datagrams. Only Datagrams from the specified Sending Host and this port will be accepted. Improves Performance. May be a system property or an environment variable.\",\n+                                \"displayName\": \"Sending Host Port\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"gcp-proxy-user-name\",\n+                                \"name\": \"Sending Host Port\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n+                            }\n+                        },\n+                        \"sideEffectFree\": false,\n+                        \"supportedRelationships\": [\n+                            {\n+                                \"description\": \"Messages received successfully will be sent out this relationship.\",\n+                                \"name\": \"success\"\n+                            }\n+                        ],\n+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\"\n+                        ],\n+                        \"supportsBatching\": true,\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicRelationships\": false,\n+                        \"supportsEventDriven\": false,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"ingest\",\n+                            \"listen\",\n+                            \"source\",\n+                            \"udp\"\n+                        ],\n+                        \"triggerSerially\": false,\n+                        \"triggerWhenAnyDestinationAvailable\": false,\n+                        \"triggerWhenEmpty\": false,\n+                        \"type\": \"org.apache.nifi.processors.standard.ListenUDP\",\n+                        \"typeDescription\": \"Listens for Datagram Packets on a given port. The default behavior produces a FlowFile per datagram, however for higher throughput the Max Batch Size property may be increased to specify the number of datagrams to batch together in a single FlowFile. This processor can be restricted to listening for datagrams from  a specific remote host and port by specifying the Sending Host and Sending Host Port properties, otherwise it will listen for datagrams from all hosts and ports.\",\n+                        \"version\": \"1.27.0\",\n+                        \"writesAttributes\": [\n+                            {\n+                                \"description\": \"The sending host of the messages.\",\n+                                \"name\": \"udp.sender\"\n                             },\n-                            \"gcp-proxy-user-password\": {\n-                                \"description\": \"HTTP Proxy Password\",\n-                                \"displayName\": \"HTTP Proxy Password\",\n+                            {\n+                                \"description\": \"The sending port the messages were received.\",\n+                                \"name\": \"udp.port\"\n+                            }\n+                        ]\n+                    },\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-standard-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"e0c4461\"\n+                        },\n+                        \"defaultBulletinLevel\": \"WARN\",\n+                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": 1,\n+                            \"TIMER_DRIVEN\": 1\n+                        },\n+                        \"defaultPenaltyDuration\": \"30 sec\",\n+                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": \"* * * * * ?\",\n+                            \"TIMER_DRIVEN\": \"0 sec\"\n+                        },\n+                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n+                        \"defaultYieldDuration\": \"1 sec\",\n+                        \"group\": \"org.apache.nifi\",\n+                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n+                        \"primaryNodeOnly\": false,\n+                        \"propertyDescriptors\": {\n+                            \"Character Set\": {\n+                                \"defaultValue\": \"UTF-8\",\n+                                \"description\": \"Specifies the character set of the received data.\",\n+                                \"displayName\": \"Character Set\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Character Set\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Local Network Interface\": {\n+                                \"description\": \"The name of a local network interface to be used to restrict listening to a specific LAN.\",\n+                                \"displayName\": \"Local Network Interface\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"gcp-proxy-user-password\",\n+                                \"name\": \"Local Network Interface\",\n                                 \"required\": false,\n-                                \"sensitive\": true\n+                                \"sensitive\": false\n                             },\n-                            \"gcp-retry-count\": {\n-                                \"defaultValue\": \"6\",\n-                                \"description\": \"How many retry attempts should be made before routing to the failure relationship.\",\n-                                \"displayName\": \"Number of retries\",\n+                            \"Max Size of Message Queue\": {\n+                                \"defaultValue\": \"10000\",\n+                                \"description\": \"The maximum size of the internal queue used to buffer messages being transferred from the underlying channel to the processor. Setting this value higher allows more messages to be buffered in memory during surges of incoming messages, but increases the total memory used by the processor.\",\n+                                \"displayName\": \"Max Size of Message Queue\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"gcp-retry-count\",\n+                                \"name\": \"Max Size of Message Queue\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"gcs-bucket\": {\n-                                \"description\": \"Bucket of the object.\",\n-                                \"displayName\": \"Bucket\",\n+                            \"Max Size of Socket Buffer\": {\n+                                \"defaultValue\": \"1 MB\",\n+                                \"description\": \"The maximum size of the socket buffer that should be used. This is a suggestion to the Operating System to indicate how big the socket buffer should be. If this value is set too low, the buffer may fill up before the data can be read, and incoming data will be dropped.\",\n+                                \"displayName\": \"Max Size of Socket Buffer\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"gcs-bucket\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Max Size of Socket Buffer\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"gcs-prefix\": {\n-                                \"description\": \"The prefix used to filter the object list. In most cases, it should end with a forward slash ('/').\",\n-                                \"displayName\": \"Prefix\",\n+                            \"Port\": {\n+                                \"description\": \"The port to listen on for communication.\",\n+                                \"displayName\": \"Port\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"gcs-prefix\",\n-                                \"required\": false,\n+                                \"name\": \"Port\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"gcs-use-generations\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"Specifies whether to use GCS Generations, if applicable.  If false, only the latest version of each object will be returned.\",\n-                                \"displayName\": \"Use Generations\",\n+                            \"Receive Buffer Size\": {\n+                                \"defaultValue\": \"65507 B\",\n+                                \"description\": \"The size of each buffer used to receive messages. Adjust this value appropriately based on the expected size of the incoming messages.\",\n+                                \"displayName\": \"Receive Buffer Size\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"gcs-use-generations\",\n+                                \"name\": \"Receive Buffer Size\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"listing-strategy\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"This strategy tracks the latest timestamp of listed entity to determine new/updated entities. Since it only tracks few timestamps, it can manage listing state efficiently. This strategy will not pick up any newly added or modified entity if their timestamps are older than the tracked latest timestamp. Also may miss files when multiple subdirectories are being written at the same time while listing is running.\",\n-                                        \"displayName\": \"Tracking Timestamps\",\n-                                        \"value\": \"timestamps\"\n-                                    },\n-                                    {\n-                                        \"description\": \"This strategy tracks information of all the listed entities within the latest 'Entity Tracking Time Window' to determine new/updated entities. This strategy can pick entities having old timestamp that can be missed with 'Tracing Timestamps'. Works even when multiple subdirectories are being written at the same time while listing is running. However an additional DistributedMapCache controller service is required and more JVM heap memory is used. For more information on how the 'Entity Tracking Time Window' property works, see the description.\",\n-                                        \"displayName\": \"Tracking Entities\",\n-                                        \"value\": \"entities\"\n-                                    },\n-                                    {\n-                                        \"description\": \"This strategy lists all entities without any tracking. The same entities will be listed each time this processor is scheduled. It is recommended to change the default run schedule value. Any property that relates to the persisting state will be ignored.\",\n-                                        \"displayName\": \"No Tracking\",\n-                                        \"value\": \"none\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"timestamps\",\n-                                \"description\": \"Specify how to determine new/updated entities. See each strategy descriptions for detail.\",\n-                                \"displayName\": \"Listing Strategy\",\n+                            \"batch-size\": {\n+                                \"defaultValue\": \"1000\",\n+                                \"description\": \"The maximum number of datagrams to write as records to a single FlowFile. The Batch Size will only be reached when data is coming in more frequently than the Poll Timeout.\",\n+                                \"displayName\": \"Batch Size\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"listing-strategy\",\n+                                \"name\": \"batch-size\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"proxy-configuration-service\": {\n-                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests. If set, it supersedes proxy settings configured per component. Supported proxies: HTTP + AuthN\",\n-                                \"displayName\": \"Proxy Configuration Service\",\n+                            \"poll-timeout\": {\n+                                \"defaultValue\": \"50 ms\",\n+                                \"description\": \"The amount of time to wait when polling the internal queue for more datagrams. If no datagrams are found after waiting for the configured timeout, then the processor will emit whatever records have been obtained up to that point.\",\n+                                \"displayName\": \"Poll Timeout\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"proxy-configuration-service\",\n-                                \"required\": false,\n+                                \"name\": \"poll-timeout\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"record-reader\": {\n+                                \"description\": \"The Record Reader to use for reading the content of incoming datagrams.\",\n+                                \"displayName\": \"Record Reader\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"record-reader\",\n+                                \"required\": true,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n                                     \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.proxy.ProxyConfigurationService\",\n+                                    \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             },\n                             \"record-writer\": {\n-                                \"description\": \"Specifies the Record Writer to use for creating the listing. If not specified, one FlowFile will be created for each entity that is listed. If the Record Writer is specified, all entities will be written to a single FlowFile instead of adding attributes to individual FlowFiles.\",\n+                                \"description\": \"The Record Writer to use in order to serialize the data before writing to a flow file.\",\n                                 \"displayName\": \"Record Writer\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n                                 \"name\": \"record-writer\",\n-                                \"required\": false,\n+                                \"required\": true,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n                                     \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n                                     \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             },\n-                            \"storage-api-url\": {\n-                                \"description\": \"Overrides the default storage URL. Configuring an alternative Storage API URL also overrides the HTTP Host header on requests as described in the Google documentation for Private Service Connections.\",\n-                                \"displayName\": \"Storage API URL\",\n+                            \"sending-host\": {\n+                                \"description\": \"IP, or name, of a remote host. Only Datagrams from the specified Sending Host Port and this host will be accepted. Improves Performance. May be a system property or an environment variable.\",\n+                                \"displayName\": \"Sending Host\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"storage-api-url\",\n+                                \"name\": \"sending-host\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"sending-host-port\": {\n+                                \"description\": \"Port being used by remote host to send Datagrams. Only Datagrams from the specified Sending Host and this port will be accepted. Improves Performance. May be a system property or an environment variable.\",\n+                                \"displayName\": \"Sending Host Port\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"sending-host-port\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             }\n                         },\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.processors.gcp.storage.DeleteGCSObject\",\n-                            \"org.apache.nifi.processors.gcp.storage.FetchGCSObject\",\n-                            \"org.apache.nifi.processors.gcp.storage.PutGCSObject\"\n-                        ],\n                         \"sideEffectFree\": false,\n-                        \"stateful\": {\n-                            \"description\": \"After performing a listing of keys, the timestamp of the newest key is stored, along with the keys that share that same timestamp. This allows the Processor to list only keys that have been added or modified after this date the next time that the Processor is run. State is stored across the cluster so that this Processor can be run on Primary Node only and if a new Primary Node is selected, the new node can pick up where the previous node left off, without duplicating the data.\",\n-                            \"scopes\": [\n-                                \"CLUSTER\"\n-                            ]\n-                        },\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"FlowFiles are routed to this relationship after a successful Google Cloud Storage operation.\",\n+                                \"description\": \"Messages received successfully will be sent out this relationship.\",\n                                 \"name\": \"success\"\n+                            },\n+                            {\n+                                \"description\": \"If a datagram cannot be parsed using the configured Record Reader, the contents of the message will be routed to this Relationship as its own individual FlowFile.\",\n+                                \"name\": \"parse.failure\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n-                        \"supportsBatching\": false,\n+                        \"supportsBatching\": true,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"gcs\",\n-                            \"google\",\n-                            \"google cloud\",\n-                            \"list\",\n-                            \"storage\"\n+                            \"ingest\",\n+                            \"listen\",\n+                            \"record\",\n+                            \"source\",\n+                            \"udp\"\n                         ],\n-                        \"triggerSerially\": true,\n+                        \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": true,\n-                        \"type\": \"org.apache.nifi.processors.gcp.storage.ListGCSBucket\",\n-                        \"typeDescription\": \"Retrieves a listing of objects from a GCS bucket. For each object that is listed, creates a FlowFile that represents the object so that it can be fetched in conjunction with FetchGCSObject. This Processor is designed to run on Primary Node only in a cluster. If the primary node changes, the new Primary Node will pick up where the previous node left off without duplicating all of the data.\",\n+                        \"triggerWhenEmpty\": false,\n+                        \"type\": \"org.apache.nifi.processors.standard.ListenUDPRecord\",\n+                        \"typeDescription\": \"Listens for Datagram Packets on a given port and reads the content of each datagram using the configured Record Reader. Each record will then be written to a flow file using the configured Record Writer. This processor can be restricted to listening for datagrams from  a specific remote host and port by specifying the Sending Host and Sending Host Port properties, otherwise it will listen for datagrams from all hosts and ports.\",\n                         \"version\": \"1.27.0\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"The name of the file\",\n-                                \"name\": \"filename\"\n-                            },\n-                            {\n-                                \"description\": \"Bucket of the object.\",\n-                                \"name\": \"gcs.bucket\"\n-                            },\n-                            {\n-                                \"description\": \"Name of the object.\",\n-                                \"name\": \"gcs.key\"\n-                            },\n-                            {\n-                                \"description\": \"Size of the object.\",\n-                                \"name\": \"gcs.size\"\n-                            },\n-                            {\n-                                \"description\": \"Data cache control of the object.\",\n-                                \"name\": \"gcs.cache.control\"\n-                            },\n-                            {\n-                                \"description\": \"The number of components which make up the object.\",\n-                                \"name\": \"gcs.component.count\"\n-                            },\n-                            {\n-                                \"description\": \"The data content disposition of the object.\",\n-                                \"name\": \"gcs.content.disposition\"\n+                                \"description\": \"The sending host of the messages.\",\n+                                \"name\": \"udp.sender\"\n                             },\n                             {\n-                                \"description\": \"The content encoding of the object.\",\n-                                \"name\": \"gcs.content.encoding\"\n+                                \"description\": \"The sending port the messages were received.\",\n+                                \"name\": \"udp.port\"\n                             },\n                             {\n-                                \"description\": \"The content language of the object.\",\n-                                \"name\": \"gcs.content.language\"\n+                                \"description\": \"The number of records written to the flow file.\",\n+                                \"name\": \"record.count\"\n                             },\n                             {\n-                                \"description\": \"The MIME/Content-Type of the object\",\n+                                \"description\": \"The mime-type of the writer used to write the records to the flow file.\",\n                                 \"name\": \"mime.type\"\n-                            },\n-                            {\n-                                \"description\": \"The CRC32C checksum of object's data, encoded in base64 in big-endian order.\",\n-                                \"name\": \"gcs.crc32c\"\n-                            },\n-                            {\n-                                \"description\": \"The creation time of the object (milliseconds)\",\n-                                \"name\": \"gcs.create.time\"\n-                            },\n-                            {\n-                                \"description\": \"The last modification time of the object (milliseconds)\",\n-                                \"name\": \"gcs.update.time\"\n-                            },\n-                            {\n-                                \"description\": \"The algorithm used to encrypt the object.\",\n-                                \"name\": \"gcs.encryption.algorithm\"\n-                            },\n-                            {\n-                                \"description\": \"The SHA256 hash of the key used to encrypt the object\",\n-                                \"name\": \"gcs.encryption.sha256\"\n-                            },\n-                            {\n-                                \"description\": \"The HTTP 1.1 Entity tag for the object.\",\n-                                \"name\": \"gcs.etag\"\n-                            },\n-                            {\n-                                \"description\": \"The service-generated for the object\",\n-                                \"name\": \"gcs.generated.id\"\n-                            },\n-                            {\n-                                \"description\": \"The data generation of the object.\",\n-                                \"name\": \"gcs.generation\"\n-                            },\n-                            {\n-                                \"description\": \"The MD5 hash of the object's data encoded in base64.\",\n-                                \"name\": \"gcs.md5\"\n-                            },\n-                            {\n-                                \"description\": \"The media download link to the object.\",\n-                                \"name\": \"gcs.media.link\"\n-                            },\n-                            {\n-                                \"description\": \"The metageneration of the object.\",\n-                                \"name\": \"gcs.metageneration\"\n-                            },\n-                            {\n-                                \"description\": \"The owner (uploader) of the object.\",\n-                                \"name\": \"gcs.owner\"\n-                            },\n-                            {\n-                                \"description\": \"The ACL entity type of the uploader of the object.\",\n-                                \"name\": \"gcs.owner.type\"\n-                            },\n-                            {\n-                                \"description\": \"The URI of the object as a string.\",\n-                                \"name\": \"gcs.uri\"\n                             }\n                         ]\n                     },\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-gcp-nar\",\n+                        \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n+                            \"EVENT_DRIVEN\": 0,\n                             \"TIMER_DRIVEN\": 1\n                         },\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n-                        \"dynamicProperties\": [\n-                            {\n-                                \"description\": \"Allows user-defined metadata to be added to the GCS object as key/value pairs\",\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"name\": \"The name of a User-Defined Metadata field to add to the GCS Object\",\n-                                \"value\": \"The value of a User-Defined Metadata field to add to the GCS Object\"\n-                            }\n-                        ],\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"GCP Credentials Provider Service\": {\n-                                \"description\": \"The Controller Service used to obtain Google Cloud Platform credentials.\",\n-                                \"displayName\": \"GCP Credentials Provider Service\",\n+                            \"Attributes to Ignore\": {\n+                                \"description\": \"A comma-separated list of Attributes to ignore. If not specified, no attributes will be ignored unless `Attributes to Ignore by Regular Expression` is modified. There's an OR relationship between the two properties.\",\n+                                \"displayName\": \"Attributes to Ignore\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"GCP Credentials Provider Service\",\n-                                \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-gcp-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.gcp.credentials.service.GCPCredentialsService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            },\n-                            \"gcp-project-id\": {\n-                                \"description\": \"Google Cloud Project ID\",\n-                                \"displayName\": \"Project ID\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"gcp-project-id\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"gcp-proxy-host\": {\n-                                \"description\": \"IP or hostname of the proxy to be used.\\n You might need to set the following properties in bootstrap for https proxy usage:\\n-Djdk.http.auth.tunneling.disabledSchemes=\\n-Djdk.http.auth.proxying.disabledSchemes=\",\n-                                \"displayName\": \"Proxy host\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"gcp-proxy-host\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"gcp-proxy-port\": {\n-                                \"description\": \"Proxy port number\",\n-                                \"displayName\": \"Proxy port\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"gcp-proxy-port\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"gcp-proxy-user-name\": {\n-                                \"description\": \"HTTP Proxy Username\",\n-                                \"displayName\": \"HTTP Proxy Username\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"gcp-proxy-user-name\",\n+                                \"name\": \"Attributes to Ignore\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"gcp-proxy-user-password\": {\n-                                \"description\": \"HTTP Proxy Password\",\n-                                \"displayName\": \"HTTP Proxy Password\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"gcp-proxy-user-password\",\n-                                \"required\": false,\n-                                \"sensitive\": true\n-                            },\n-                            \"gcp-retry-count\": {\n-                                \"defaultValue\": \"6\",\n-                                \"description\": \"How many retry attempts should be made before routing to the failure relationship.\",\n-                                \"displayName\": \"Number of retries\",\n+                            \"Attributes to Log\": {\n+                                \"description\": \"A comma-separated list of Attributes to Log. If not specified, all attributes will be logged unless `Attributes to Log by Regular Expression` is modified. There's an AND relationship between the two properties.\",\n+                                \"displayName\": \"Attributes to Log\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"gcp-retry-count\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"gcs-bucket\": {\n-                                \"defaultValue\": \"${gcs.bucket}\",\n-                                \"description\": \"Bucket of the object.\",\n-                                \"displayName\": \"Bucket\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"gcs-bucket\",\n-                                \"required\": true,\n+                                \"name\": \"Attributes to Log\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"gcs-content-disposition-type\": {\n+                            \"Log FlowFile Properties\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Indicates that the object should be loaded and rendered within the browser.\",\n-                                        \"displayName\": \"Inline\",\n-                                        \"value\": \"inline\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n-                                        \"description\": \"Indicates that the object should be saved (using a Save As... dialog) rather than opened directly within the browser\",\n-                                        \"displayName\": \"Attachment\",\n-                                        \"value\": \"attachment\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"description\": \"Type of RFC-6266 Content Disposition to be attached to the object\",\n-                                \"displayName\": \"Content Disposition Type\",\n+                                \"defaultValue\": \"true\",\n+                                \"description\": \"Specifies whether or not to log FlowFile \\\"properties\\\", such as Entry Date, Lineage Start Date, and content size\",\n+                                \"displayName\": \"Log FlowFile Properties\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"gcs-content-disposition-type\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"gcs-content-type\": {\n-                                \"defaultValue\": \"${mime.type}\",\n-                                \"description\": \"Content Type for the file, i.e. text/plain\",\n-                                \"displayName\": \"Content Type\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"gcs-content-type\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"gcs-key\": {\n-                                \"defaultValue\": \"${filename}\",\n-                                \"description\": \"Name of the object.\",\n-                                \"displayName\": \"Key\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"gcs-key\",\n+                                \"name\": \"Log FlowFile Properties\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"gcs-object-acl\": {\n+                            \"Log Level\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Gives the bucket or object owner OWNER permission, and gives all authenticated Google account holders READER and WRITER permissions. All other permissions are removed.\",\n-                                        \"displayName\": \"All Authenticated Users\",\n-                                        \"value\": \"ALL_AUTHENTICATED_USERS\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Gives the bucket or object owner OWNER permission, and gives all authenticated Google account holders READER permission. All other permissions are removed.\",\n-                                        \"displayName\": \"Authenticated Read\",\n-                                        \"value\": \"AUTHENTICATED_READ\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Gives the object and bucket owners OWNER permission. All other permissions are removed.\",\n-                                        \"displayName\": \"Bucket Owner Full Control\",\n-                                        \"value\": \"BUCKET_OWNER_FULL_CONTROL\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"trace\",\n+                                        \"value\": \"trace\"\n                                     },\n                                     {\n-                                        \"description\": \"Gives the object owner OWNER permission, and gives the bucket owner READER permission. All other permissions are removed.\",\n-                                        \"displayName\": \"Bucket Owner Read Only\",\n-                                        \"value\": \"BUCKET_OWNER_READ\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"debug\",\n+                                        \"value\": \"debug\"\n                                     },\n                                     {\n-                                        \"description\": \"Gives the bucket or object owner OWNER permission for a bucket or object, and removes all other access permissions.\",\n-                                        \"displayName\": \"Private\",\n-                                        \"value\": \"PRIVATE\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"info\",\n+                                        \"value\": \"info\"\n                                     },\n                                     {\n-                                        \"description\": \"Gives permission to the project team based on their roles. Anyone who is part of the team has READER permission. Project owners and project editors have OWNER permission. This is the default ACL for newly created buckets. This is also the default ACL for newly created objects unless the default object ACL for that bucket has been changed.\",\n-                                        \"displayName\": \"Project Private\",\n-                                        \"value\": \"PROJECT_PRIVATE\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"warn\",\n+                                        \"value\": \"warn\"\n                                     },\n                                     {\n-                                        \"description\": \"Gives the bucket or object owner OWNER permission, and gives all users, both authenticated and anonymous, READER permission. When you apply this to an object, anyone on the Internet can read the object without authenticating.\",\n-                                        \"displayName\": \"Public Read Only\",\n-                                        \"value\": \"PUBLIC_READ\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"error\",\n+                                        \"value\": \"error\"\n                                     }\n                                 ],\n-                                \"description\": \"Access Control to be attached to the object uploaded. Not providing this will revert to bucket defaults.\",\n-                                \"displayName\": \"Object ACL\",\n+                                \"defaultValue\": \"info\",\n+                                \"description\": \"The Log Level to use when logging the Attributes\",\n+                                \"displayName\": \"Log Level\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"gcs-object-acl\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"gcs-object-crc32c\": {\n-                                \"description\": \"CRC32C Checksum (encoded in Base64, big-Endian order) of the file for server-side validation.\",\n-                                \"displayName\": \"CRC32C Checksum\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"gcs-object-crc32c\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"gcs-object-md5\": {\n-                                \"description\": \"MD5 Hash (encoded in Base64) of the file for server-side validation.\",\n-                                \"displayName\": \"MD5 Hash\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"gcs-object-md5\",\n-                                \"required\": false,\n+                                \"name\": \"Log Level\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"gcs-overwrite-object\": {\n+                            \"Log Payload\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"true\",\n                                         \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"false\",\n                                         \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"true\",\n-                                \"description\": \"If false, the upload to GCS will succeed only if the object does not exist.\",\n-                                \"displayName\": \"Overwrite Object\",\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"If true, the FlowFile's payload will be logged, in addition to its attributes; otherwise, just the Attributes will be logged.\",\n+                                \"displayName\": \"Log Payload\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"gcs-overwrite-object\",\n+                                \"name\": \"Log Payload\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"gcs-server-side-encryption-key\": {\n-                                \"description\": \"An AES256 Encryption Key (encoded in base64) for server-side encryption of the object.\",\n-                                \"displayName\": \"Server Side Encryption Key\",\n+                            \"Log prefix\": {\n+                                \"description\": \"Log prefix appended to the log lines. It helps to distinguish the output of multiple LogAttribute processors.\",\n+                                \"displayName\": \"Log prefix\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"gcs-server-side-encryption-key\",\n+                                \"name\": \"Log prefix\",\n                                 \"required\": false,\n-                                \"sensitive\": true\n+                                \"sensitive\": false\n                             },\n-                            \"gzip.content.enabled\": {\n+                            \"Output Format\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"description\": \"Each FlowFile attribute will be logged using a single line for the attribute name and another line for the attribute value. This format is often most advantageous when looking at the attributes of a single FlowFile.\",\n+                                        \"displayName\": \"Line per Attribute\",\n+                                        \"value\": \"Line per Attribute\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"description\": \"All FlowFile attribute names and values will be logged on a single line. This format is often most advantageous when comparing logs from multiple FlowFiles.\",\n+                                        \"displayName\": \"Single Line\",\n+                                        \"value\": \"Single Line\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"true\",\n-                                \"description\": \"Signals to the GCS Blob Writer whether GZIP compression during transfer is desired. False means do not gzip and can boost performance in many cases.\",\n-                                \"displayName\": \"GZIP Compression Enabled\",\n+                                \"defaultValue\": \"Line per Attribute\",\n+                                \"description\": \"Specifies the format to use for logging FlowFile attributes\",\n+                                \"displayName\": \"Output Format\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"gzip.content.enabled\",\n-                                \"required\": false,\n+                                \"name\": \"Output Format\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"proxy-configuration-service\": {\n-                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests. If set, it supersedes proxy settings configured per component. Supported proxies: HTTP + AuthN\",\n-                                \"displayName\": \"Proxy Configuration Service\",\n+                            \"attributes-to-ignore-regex\": {\n+                                \"description\": \"A regular expression indicating the Attributes to Ignore. If not specified, no attributes will be ignored unless `Attributes to Ignore` is modified. There's an OR relationship between the two properties.\",\n+                                \"displayName\": \"Attributes to Ignore by Regular Expression\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"proxy-configuration-service\",\n+                                \"name\": \"attributes-to-ignore-regex\",\n                                 \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.proxy.ProxyConfigurationService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n+                                \"sensitive\": false\n                             },\n-                            \"storage-api-url\": {\n-                                \"description\": \"Overrides the default storage URL. Configuring an alternative Storage API URL also overrides the HTTP Host header on requests as described in the Google documentation for Private Service Connections.\",\n-                                \"displayName\": \"Storage API URL\",\n+                            \"attributes-to-log-regex\": {\n+                                \"defaultValue\": \".*\",\n+                                \"description\": \"A regular expression indicating the Attributes to Log. If not specified, all attributes will be logged unless `Attributes to Log` is modified. There's an AND relationship between the two properties.\",\n+                                \"displayName\": \"Attributes to Log by Regular Expression\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"storage-api-url\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"attributes-to-log-regex\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n-                            }\n-                        },\n-                        \"readsAttributes\": [\n-                            {\n-                                \"description\": \"Uses the FlowFile's filename as the filename for the GCS object\",\n-                                \"name\": \"filename\"\n                             },\n-                            {\n-                                \"description\": \"Uses the FlowFile's MIME type as the content-type for the GCS object\",\n-                                \"name\": \"mime.type\"\n+                            \"character-set\": {\n+                                \"defaultValue\": \"UTF-8\",\n+                                \"description\": \"The name of the CharacterSet to use\",\n+                                \"displayName\": \"Character Set\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"character-set\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n                             }\n-                        ],\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.processors.gcp.storage.DeleteGCSObject\",\n-                            \"org.apache.nifi.processors.gcp.storage.FetchGCSObject\",\n-                            \"org.apache.nifi.processors.gcp.storage.ListGCSBucket\"\n-                        ],\n-                        \"sideEffectFree\": false,\n+                        },\n+                        \"sideEffectFree\": true,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"FlowFiles are routed to this relationship after a successful Google Cloud Storage operation.\",\n+                                \"description\": \"All FlowFiles are routed to this relationship\",\n                                 \"name\": \"success\"\n-                            },\n-                            {\n-                                \"description\": \"FlowFiles are routed to this relationship if the Google Cloud Storage operation fails.\",\n-                                \"name\": \"failure\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n+                            \"CRON_DRIVEN\",\n+                            \"EVENT_DRIVEN\"\n                         ],\n-                        \"supportsBatching\": false,\n-                        \"supportsDynamicProperties\": true,\n+                        \"supportsBatching\": true,\n+                        \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": false,\n+                        \"supportsEventDriven\": true,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"archive\",\n-                            \"gcs\",\n-                            \"google\",\n-                            \"google cloud\",\n-                            \"put\"\n+                            \"attributes\",\n+                            \"logging\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.gcp.storage.PutGCSObject\",\n-                        \"typeDescription\": \"Writes the contents of a FlowFile as an object in a Google Cloud Storage.\",\n-                        \"version\": \"1.27.0\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"Bucket of the object.\",\n-                                \"name\": \"gcs.bucket\"\n-                            },\n-                            {\n-                                \"description\": \"Name of the object.\",\n-                                \"name\": \"gcs.key\"\n-                            },\n-                            {\n-                                \"description\": \"Size of the object.\",\n-                                \"name\": \"gcs.size\"\n-                            },\n-                            {\n-                                \"description\": \"Data cache control of the object.\",\n-                                \"name\": \"gcs.cache.control\"\n-                            },\n-                            {\n-                                \"description\": \"The number of components which make up the object.\",\n-                                \"name\": \"gcs.component.count\"\n-                            },\n-                            {\n-                                \"description\": \"The data content disposition of the object.\",\n-                                \"name\": \"gcs.content.disposition\"\n-                            },\n-                            {\n-                                \"description\": \"The content encoding of the object.\",\n-                                \"name\": \"gcs.content.encoding\"\n-                            },\n-                            {\n-                                \"description\": \"The content language of the object.\",\n-                                \"name\": \"gcs.content.language\"\n-                            },\n-                            {\n-                                \"description\": \"The MIME/Content-Type of the object\",\n-                                \"name\": \"mime.type\"\n-                            },\n-                            {\n-                                \"description\": \"The CRC32C checksum of object's data, encoded in base64 in big-endian order.\",\n-                                \"name\": \"gcs.crc32c\"\n-                            },\n-                            {\n-                                \"description\": \"The creation time of the object (milliseconds)\",\n-                                \"name\": \"gcs.create.time\"\n-                            },\n-                            {\n-                                \"description\": \"The last modification time of the object (milliseconds)\",\n-                                \"name\": \"gcs.update.time\"\n-                            },\n-                            {\n-                                \"description\": \"The algorithm used to encrypt the object.\",\n-                                \"name\": \"gcs.encryption.algorithm\"\n-                            },\n-                            {\n-                                \"description\": \"The SHA256 hash of the key used to encrypt the object\",\n-                                \"name\": \"gcs.encryption.sha256\"\n-                            },\n-                            {\n-                                \"description\": \"The HTTP 1.1 Entity tag for the object.\",\n-                                \"name\": \"gcs.etag\"\n-                            },\n-                            {\n-                                \"description\": \"The service-generated for the object\",\n-                                \"name\": \"gcs.generated.id\"\n-                            },\n-                            {\n-                                \"description\": \"The data generation of the object.\",\n-                                \"name\": \"gcs.generation\"\n-                            },\n-                            {\n-                                \"description\": \"The MD5 hash of the object's data encoded in base64.\",\n-                                \"name\": \"gcs.md5\"\n-                            },\n-                            {\n-                                \"description\": \"The media download link to the object.\",\n-                                \"name\": \"gcs.media.link\"\n-                            },\n-                            {\n-                                \"description\": \"The metageneration of the object.\",\n-                                \"name\": \"gcs.metageneration\"\n-                            },\n-                            {\n-                                \"description\": \"The owner (uploader) of the object.\",\n-                                \"name\": \"gcs.owner\"\n-                            },\n-                            {\n-                                \"description\": \"The ACL entity type of the uploader of the object.\",\n-                                \"name\": \"gcs.owner.type\"\n-                            },\n-                            {\n-                                \"description\": \"The URI of the object as a string.\",\n-                                \"name\": \"gcs.uri\"\n-                            }\n-                        ]\n+                        \"type\": \"org.apache.nifi.processors.standard.LogAttribute\",\n+                        \"typeDescription\": \"Emits attributes of the FlowFile at the specified log level\",\n+                        \"version\": \"1.27.0\"\n                     },\n                     {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-gcp-nar\",\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n+                            \"EVENT_DRIVEN\": 0,\n                             \"TIMER_DRIVEN\": 1\n                         },\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"gcp-credentials-provider-service\": {\n-                                \"description\": \"The Controller Service used to obtain Google Cloud Platform credentials.\",\n-                                \"displayName\": \"GCP Credentials Provider Service\",\n+                            \"log-level\": {\n+                                \"defaultValue\": \"info\",\n+                                \"description\": \"The Log Level to use when logging the message: [trace, debug, info, warn, error]\",\n+                                \"displayName\": \"Log Level\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"gcp-credentials-provider-service\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"log-level\",\n                                 \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-gcp-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.gcp.credentials.service.GCPCredentialsService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n+                                \"sensitive\": false\n                             },\n-                            \"operationKey\": {\n-                                \"defaultValue\": \"${operationKey}\",\n-                                \"description\": \"The unique identifier of the Vision operation.\",\n-                                \"displayName\": \"GCP Operation Key\",\n+                            \"log-message\": {\n+                                \"description\": \"The log message to emit\",\n+                                \"displayName\": \"Log message\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"operationKey\",\n-                                \"required\": true,\n+                                \"name\": \"log-message\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"log-prefix\": {\n+                                \"description\": \"Log prefix appended to the log lines. It helps to distinguish the output of multiple LogMessage processors.\",\n+                                \"displayName\": \"Log prefix\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"log-prefix\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             }\n                         },\n-                        \"readsAttributes\": [\n-                            {\n-                                \"description\": \"A unique identifier of the operation designated by the Vision server.\",\n-                                \"name\": \"operationKey\"\n-                            }\n-                        ],\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.processors.gcp.vision.StartGcpVisionAnnotateFilesOperation\"\n-                        ],\n-                        \"sideEffectFree\": false,\n+                        \"sideEffectFree\": true,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"The job is currently still being processed\",\n-                                \"name\": \"running\"\n-                            },\n-                            {\n-                                \"description\": \"FlowFiles are routed to success relationship\",\n+                                \"description\": \"All FlowFiles are routed to this relationship\",\n                                 \"name\": \"success\"\n-                            },\n-                            {\n-                                \"description\": \"FlowFiles are routed to failure relationship\",\n-                                \"name\": \"failure\"\n-                            },\n-                            {\n-                                \"description\": \"Upon successful completion, the original FlowFile will be routed to this relationship.\",\n-                                \"name\": \"original\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n+                            \"CRON_DRIVEN\",\n+                            \"EVENT_DRIVEN\"\n                         ],\n-                        \"supportsBatching\": false,\n+                        \"supportsBatching\": true,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": false,\n+                        \"supportsEventDriven\": true,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"Cloud\",\n-                            \"Google\",\n-                            \"Machine Learning\",\n-                            \"Vision\"\n+                            \"attributes\",\n+                            \"logging\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.gcp.vision.GetGcpVisionAnnotateFilesOperationStatus\",\n-                        \"typeDescription\": \"Retrieves the current status of an Google Vision operation.\",\n+                        \"type\": \"org.apache.nifi.processors.standard.LogMessage\",\n+                        \"typeDescription\": \"Emits a log message at the specified log level\",\n                         \"version\": \"1.27.0\"\n                     },\n                     {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-gcp-nar\",\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n+                            \"EVENT_DRIVEN\": 0,\n                             \"TIMER_DRIVEN\": 1\n                         },\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n+                        \"dynamicProperties\": [\n+                            {\n+                                \"description\": \"Adds a FlowFile attribute specified by the dynamic property's key with the value found in the lookup service using the the dynamic property's value\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"name\": \"The name of the attribute to add to the FlowFile\",\n+                                \"value\": \"The name of the key or property to retrieve from the lookup service\"\n+                            }\n+                        ],\n                         \"group\": \"org.apache.nifi\",\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"gcp-credentials-provider-service\": {\n-                                \"description\": \"The Controller Service used to obtain Google Cloud Platform credentials.\",\n-                                \"displayName\": \"GCP Credentials Provider Service\",\n+                            \"include-empty-values\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"true\",\n+                                \"description\": \"Include null or blank values for keys that are null or blank\",\n+                                \"displayName\": \"Include Empty Values\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"gcp-credentials-provider-service\",\n+                                \"name\": \"include-empty-values\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"lookup-service\": {\n+                                \"description\": \"The lookup service to use for attribute lookups\",\n+                                \"displayName\": \"Lookup Service\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"lookup-service\",\n                                 \"required\": true,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-gcp-services-api-nar\",\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.gcp.credentials.service.GCPCredentialsService\",\n+                                    \"type\": \"org.apache.nifi.lookup.StringLookupService\",\n                                     \"version\": \"1.27.0\"\n                                 }\n-                            },\n-                            \"operationKey\": {\n-                                \"defaultValue\": \"${operationKey}\",\n-                                \"description\": \"The unique identifier of the Vision operation.\",\n-                                \"displayName\": \"GCP Operation Key\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"operationKey\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n                             }\n                         },\n-                        \"readsAttributes\": [\n-                            {\n-                                \"description\": \"A unique identifier of the operation designated by the Vision server.\",\n-                                \"name\": \"operationKey\"\n-                            }\n-                        ],\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.processors.gcp.vision.StartGcpVisionAnnotateImagesOperation\"\n-                        ],\n-                        \"sideEffectFree\": false,\n+                        \"sideEffectFree\": true,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"The job is currently still being processed\",\n-                                \"name\": \"running\"\n-                            },\n-                            {\n-                                \"description\": \"FlowFiles are routed to success relationship\",\n-                                \"name\": \"success\"\n+                                \"description\": \"FlowFiles with failing lookups are routed to this relationship\",\n+                                \"name\": \"failure\"\n                             },\n                             {\n-                                \"description\": \"FlowFiles are routed to failure relationship\",\n-                                \"name\": \"failure\"\n+                                \"description\": \"FlowFiles with missing lookups are routed to this relationship\",\n+                                \"name\": \"unmatched\"\n                             },\n                             {\n-                                \"description\": \"Upon successful completion, the original FlowFile will be routed to this relationship.\",\n-                                \"name\": \"original\"\n+                                \"description\": \"FlowFiles with matching lookups are routed to this relationship\",\n+                                \"name\": \"matched\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n+                            \"CRON_DRIVEN\",\n+                            \"EVENT_DRIVEN\"\n                         ],\n-                        \"supportsBatching\": false,\n-                        \"supportsDynamicProperties\": false,\n+                        \"supportsBatching\": true,\n+                        \"supportsDynamicProperties\": true,\n                         \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": false,\n+                        \"supportsEventDriven\": true,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"Cloud\",\n-                            \"Google\",\n-                            \"Machine Learning\",\n-                            \"Vision\"\n+                            \"Attribute Expression Language\",\n+                            \"attributes\",\n+                            \"cache\",\n+                            \"enrich\",\n+                            \"join\",\n+                            \"lookup\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.gcp.vision.GetGcpVisionAnnotateImagesOperationStatus\",\n-                        \"typeDescription\": \"Retrieves the current status of an Google Vision operation.\",\n+                        \"type\": \"org.apache.nifi.processors.standard.LookupAttribute\",\n+                        \"typeDescription\": \"Lookup attributes from a lookup service\",\n                         \"version\": \"1.27.0\"\n                     },\n                     {\n                         \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-gcp-nar\",\n+                        \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n+                            \"EVENT_DRIVEN\": 0,\n                             \"TIMER_DRIVEN\": 1\n                         },\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n+                        \"dynamicProperties\": [\n+                            {\n+                                \"description\": \"A RecordPath that points to the field whose value will be looked up in the configured Lookup Service\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"name\": \"Value To Lookup\",\n+                                \"value\": \"Valid Record Path\"\n+                            }\n+                        ],\n                         \"group\": \"org.apache.nifi\",\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"gcp-credentials-provider-service\": {\n-                                \"description\": \"The Controller Service used to obtain Google Cloud Platform credentials.\",\n-                                \"displayName\": \"GCP Credentials Provider Service\",\n+                            \"lookup-service\": {\n+                                \"description\": \"The Lookup Service to use in order to lookup a value in each Record\",\n+                                \"displayName\": \"Lookup Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"gcp-credentials-provider-service\",\n+                                \"name\": \"lookup-service\",\n                                 \"required\": true,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-gcp-services-api-nar\",\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.gcp.credentials.service.GCPCredentialsService\",\n+                                    \"type\": \"org.apache.nifi.lookup.LookupService\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             },\n-                            \"json-payload\": {\n-                                \"defaultValue\": \"{\\n    \\\"requests\\\": [\\n        {\\n            \\\"inputConfig\\\": {\\n                \\\"gcsSource\\\": {\\n                    \\\"uri\\\": \\\"gs://${gcs.bucket}/${filename}\\\"\\n                },\\n                \\\"mimeType\\\": \\\"application/pdf\\\"\\n            },\\n            \\\"features\\\": [{\\n                    \\\"type\\\": \\\"${vision-feature-type}\\\",\\n                    \\\"maxResults\\\": 4\\n                }],\\n            \\\"outputConfig\\\": {\\n                \\\"gcsDestination\\\": {\\n                    \\\"uri\\\": \\\"gs://${output-bucket}/${filename}/\\\"\\n                },\\n                \\\"batchSize\\\": 2\\n            }\\n        }]\\n}\",\n-                                \"description\": \"JSON request for AWS Machine Learning services. The Processor will use FlowFile content for the request when this property is not specified.\",\n-                                \"displayName\": \"JSON Payload\",\n+                            \"record-path-lookup-miss-result-cache-size\": {\n+                                \"defaultValue\": \"0\",\n+                                \"description\": \"Specifies how many lookup values/records should be cached.Setting this property to zero means no caching will be done and the table will be queried for each lookup value in each record. If the lookup table changes often or the most recent data must be retrieved, do not use the cache.\",\n+                                \"displayName\": \"Cache Size\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"json-payload\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"record-path-lookup-miss-result-cache-size\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"output-bucket\": {\n-                                \"description\": \"Name of the GCS bucket where the output of the Vision job will be persisted. The value of this property applies when the JSON Payload property is configured. The JSON Payload property value can use Expression Language to reference the value of ${output-bucket}\",\n-                                \"displayName\": \"Output Bucket\",\n+                            \"record-reader\": {\n+                                \"description\": \"Specifies the Controller Service to use for reading incoming data\",\n+                                \"displayName\": \"Record Reader\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"output-bucket\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"record-reader\",\n+                                \"required\": true,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"record-update-strategy\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"The \\\"Result RecordPath\\\" property will be ignored and the lookup service must be a single simple key lookup service. Every dynamic property value should be a record path. For each dynamic property, the value contained in the field corresponding to the record path will be used as the key in the Lookup Service and the value returned by the Lookup Service will be used to replace the existing value. It is possible to configure multiple dynamic properties to replace multiple values in one execution. This strategy only supports simple types replacements (strings, integers, etc).\",\n+                                        \"displayName\": \"Replace Existing Values\",\n+                                        \"value\": \"replace-existing-values\"\n+                                    },\n+                                    {\n+                                        \"description\": \"The \\\"Result RecordPath\\\" property will be used to determine which part of the record should be updated with the value returned by the Lookup Service\",\n+                                        \"displayName\": \"Use Property\",\n+                                        \"value\": \"use-property\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"use-property\",\n+                                \"description\": \"This property defines the strategy to use when updating the record with the value returned by the Lookup Service.\",\n+                                \"displayName\": \"Record Update Strategy\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"record-update-strategy\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"vision-feature-type\": {\n-                                \"defaultValue\": \"TEXT_DETECTION\",\n-                                \"description\": \"Type of GCP Vision Feature. The value of this property applies when the JSON Payload property is configured. The JSON Payload property value can use Expression Language to reference the value of ${vision-feature-type}\",\n-                                \"displayName\": \"Vision Feature Type\",\n+                            \"record-writer\": {\n+                                \"description\": \"Specifies the Controller Service to use for writing out the records\",\n+                                \"displayName\": \"Record Writer\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"record-writer\",\n+                                \"required\": true,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"result-contents\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"The entire Record that is retrieved from the Lookup Service will be inserted into the destination path.\",\n+                                        \"displayName\": \"Insert Entire Record\",\n+                                        \"value\": \"insert-entire-record\"\n+                                    },\n+                                    {\n+                                        \"description\": \"All of the fields in the Record that is retrieved from the Lookup Service will be inserted into the destination path.\",\n+                                        \"displayName\": \"Insert Record Fields\",\n+                                        \"value\": \"record-fields\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"insert-entire-record\",\n+                                \"description\": \"When a result is obtained that contains a Record, this property determines whether the Record itself is inserted at the configured path or if the contents of the Record (i.e., the sub-fields) will be inserted at the configured path.\",\n+                                \"displayName\": \"Record Result Contents\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"result-contents\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"result-record-path\": {\n+                                \"description\": \"A RecordPath that points to the field whose value should be updated with whatever value is returned from the Lookup Service. If not specified, the value that is returned from the Lookup Service will be ignored, except for determining whether the FlowFile should be routed to the 'matched' or 'unmatched' Relationship.\",\n+                                \"displayName\": \"Result RecordPath\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"vision-feature-type\",\n+                                \"name\": \"result-record-path\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n+                            },\n+                            \"routing-strategy\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"Records will be routed to a 'success' Relationship regardless of whether or not there is a match in the configured Lookup Service\",\n+                                        \"displayName\": \"Route to 'success'\",\n+                                        \"value\": \"route-to-success\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Records will be routed to either a 'matched' or an 'unmatched' Relationship depending on whether or not there was a match in the configured Lookup Service. A single input FlowFile may result in two different output FlowFiles.\",\n+                                        \"displayName\": \"Route to 'matched' or 'unmatched'\",\n+                                        \"value\": \"route-to-matched-unmatched\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"route-to-success\",\n+                                \"description\": \"Specifies how to route records after a Lookup has completed\",\n+                                \"displayName\": \"Routing Strategy\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"routing-strategy\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n                             }\n                         },\n                         \"seeAlso\": [\n-                            \"org.apache.nifi.processors.gcp.vision.GetGcpVisionAnnotateFilesOperationStatus\"\n+                            \"org.apache.nifi.lookup.SimpleKeyValueLookupService\",\n+                            \"org.apache.nifi.lookup.db.DatabaseRecordLookupService\",\n+                            \"org.apache.nifi.lookup.maxmind.IPLookupService\",\n+                            \"org.apache.nifi.processors.standard.ConvertRecord\",\n+                            \"org.apache.nifi.processors.standard.SplitRecord\"\n                         ],\n-                        \"sideEffectFree\": false,\n+                        \"sideEffectFree\": true,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"FlowFiles are routed to success relationship\",\n+                                \"description\": \"All records will be sent to this Relationship if configured to do so, unless a failure occurs\",\n                                 \"name\": \"success\"\n                             },\n                             {\n-                                \"description\": \"FlowFiles are routed to failure relationship\",\n+                                \"description\": \"If a FlowFile cannot be enriched, the unchanged FlowFile will be routed to this relationship\",\n                                 \"name\": \"failure\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n+                            \"CRON_DRIVEN\",\n+                            \"EVENT_DRIVEN\"\n                         ],\n-                        \"supportsBatching\": false,\n-                        \"supportsDynamicProperties\": false,\n+                        \"supportsBatching\": true,\n+                        \"supportsDynamicProperties\": true,\n                         \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": false,\n+                        \"supportsEventDriven\": true,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"Cloud\",\n-                            \"Google\",\n-                            \"Machine Learning\",\n-                            \"Vision\"\n+                            \"avro\",\n+                            \"convert\",\n+                            \"csv\",\n+                            \"database\",\n+                            \"db\",\n+                            \"enrichment\",\n+                            \"filter\",\n+                            \"json\",\n+                            \"logs\",\n+                            \"lookup\",\n+                            \"record\",\n+                            \"route\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.gcp.vision.StartGcpVisionAnnotateFilesOperation\",\n-                        \"typeDescription\": \"Trigger a Vision operation on file input. It should be followed by GetGcpVisionAnnotateFilesOperationStatus processor in order to monitor operation status.\",\n+                        \"type\": \"org.apache.nifi.processors.standard.LookupRecord\",\n+                        \"typeDescription\": \"Extracts one or more fields from a Record and looks up a value for those fields in a LookupService. If a result is returned by the LookupService, that result is optionally added to the Record. In this case, the processor functions as an Enrichment processor. Regardless, the Record is then routed to either the 'matched' relationship or 'unmatched' relationship (if the 'Routing Strategy' property is configured to do so), indicating whether or not a result was returned by the LookupService, allowing the processor to also function as a Routing processor. The \\\"coordinates\\\" to use for looking up a value in the Lookup Service are defined by adding a user-defined property. Each property that is added will have an entry added to a Map, where the name of the property becomes the Map Key and the value returned by the RecordPath becomes the value for that key. If multiple values are returned by the RecordPath, then the Record will be routed to the 'unmatched' relationship (or 'success', depending on the 'Routing Strategy' property's configuration). If one or more fields match the Result RecordPath, all fields that match will be updated. If there is no match in the configured LookupService, then no fields will be updated. I.e., it will not overwrite an existing value in the Record with a null value. Please note, however, that if the results returned by the LookupService are not accounted for in your schema (specifically, the schema that is configured for your Record Writer) then the fields will not be written out to the FlowFile.\",\n                         \"version\": \"1.27.0\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"A unique identifier of the operation returned by the Vision server.\",\n-                                \"name\": \"operationKey\"\n+                                \"description\": \"Sets the mime.type attribute to the MIME Type specified by the Record Writer\",\n+                                \"name\": \"mime.type\"\n+                            },\n+                            {\n+                                \"description\": \"The number of records in the FlowFile\",\n+                                \"name\": \"record.count\"\n                             }\n                         ]\n                     },\n                     {\n                         \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-gcp-nar\",\n+                        \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -94960,501 +94360,1243 @@\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"gcp-credentials-provider-service\": {\n-                                \"description\": \"The Controller Service used to obtain Google Cloud Platform credentials.\",\n-                                \"displayName\": \"GCP Credentials Provider Service\",\n+                            \"Attribute Strategy\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"Any attribute that is not the same on all FlowFiles in a bin will be dropped. Those that are the same across all FlowFiles will be retained.\",\n+                                        \"displayName\": \"Keep Only Common Attributes\",\n+                                        \"value\": \"Keep Only Common Attributes\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Any attribute that has the same value for all FlowFiles in a bin, or has no value for a FlowFile, will be kept. For example, if a bin consists of 3 FlowFiles and 2 of them have a value of 'hello' for the 'greeting' attribute and the third FlowFile has no 'greeting' attribute then the outbound FlowFile will get a 'greeting' attribute with the value 'hello'.\",\n+                                        \"displayName\": \"Keep All Unique Attributes\",\n+                                        \"value\": \"Keep All Unique Attributes\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"Keep Only Common Attributes\",\n+                                \"description\": \"Determines which FlowFile attributes should be added to the bundle. If 'Keep All Unique Attributes' is selected, any attribute on any FlowFile that gets bundled will be kept unless its value conflicts with the value from another FlowFile. If 'Keep Only Common Attributes' is selected, only the attributes that exist on all FlowFiles in the bundle, with the same value, will be preserved.\",\n+                                \"displayName\": \"Attribute Strategy\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"gcp-credentials-provider-service\",\n+                                \"name\": \"Attribute Strategy\",\n                                 \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-gcp-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.gcp.credentials.service.GCPCredentialsService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n+                                \"sensitive\": false\n                             },\n-                            \"json-payload\": {\n-                                \"defaultValue\": \"{\\n    \\\"requests\\\": [{\\n        \\\"image\\\": {\\n            \\\"source\\\": {\\n                \\\"imageUri\\\": \\\"gs://${gcs.bucket}/${filename}\\\"\\n            }\\n        },\\n        \\\"features\\\": [{\\n            \\\"type\\\": \\\"${vision-feature-type}\\\",\\n            \\\"maxResults\\\": 4\\n        }]\\n    }],\\n    \\\"outputConfig\\\": {\\n        \\\"gcsDestination\\\": {\\n            \\\"uri\\\": \\\"gs://${output-bucket}/${filename}/\\\"\\n        },\\n        \\\"batchSize\\\": 2\\n    }\\n}\",\n-                                \"description\": \"JSON request for AWS Machine Learning services. The Processor will use FlowFile content for the request when this property is not specified.\",\n-                                \"displayName\": \"JSON Payload\",\n+                            \"Compression Level\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"0\",\n+                                        \"value\": \"0\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"1\",\n+                                        \"value\": \"1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"2\",\n+                                        \"value\": \"2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"3\",\n+                                        \"value\": \"3\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"4\",\n+                                        \"value\": \"4\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"5\",\n+                                        \"value\": \"5\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"6\",\n+                                        \"value\": \"6\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"7\",\n+                                        \"value\": \"7\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"8\",\n+                                        \"value\": \"8\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"9\",\n+                                        \"value\": \"9\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"1\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"ZIP\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Merge Format\",\n+                                        \"propertyName\": \"Merge Format\"\n+                                    }\n+                                ],\n+                                \"description\": \"Specifies the compression level to use when using the Zip Merge Format; if not using the Zip Merge Format, this value is ignored\",\n+                                \"displayName\": \"Compression Level\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Compression Level\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Correlation Attribute Name\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"Bin-Packing Algorithm\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Merge Strategy\",\n+                                        \"propertyName\": \"Merge Strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"If specified, like FlowFiles will be binned together, where 'like FlowFiles' means FlowFiles that have the same value for this Attribute. If not specified, FlowFiles are bundled by the order in which they are pulled from the queue.\",\n+                                \"displayName\": \"Correlation Attribute Name\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"json-payload\",\n+                                \"name\": \"Correlation Attribute Name\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"output-bucket\": {\n-                                \"description\": \"Name of the GCS bucket where the output of the Vision job will be persisted. The value of this property applies when the JSON Payload property is configured. The JSON Payload property value can use Expression Language to reference the value of ${output-bucket}\",\n-                                \"displayName\": \"Output Bucket\",\n+                            \"Delimiter Strategy\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"No Header, Footer, or Demarcator will be used\",\n+                                        \"displayName\": \"Do Not Use Delimiters\",\n+                                        \"value\": \"Do Not Use Delimiters\"\n+                                    },\n+                                    {\n+                                        \"description\": \"The values of Header, Footer, and Demarcator will be retrieved from the contents of a file\",\n+                                        \"displayName\": \"Filename\",\n+                                        \"value\": \"Filename\"\n+                                    },\n+                                    {\n+                                        \"description\": \"The values of Header, Footer, and Demarcator will be specified as property values\",\n+                                        \"displayName\": \"Text\",\n+                                        \"value\": \"Text\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"Do Not Use Delimiters\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"Binary Concatenation\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Merge Format\",\n+                                        \"propertyName\": \"Merge Format\"\n+                                    }\n+                                ],\n+                                \"description\": \"Determines if Header, Footer, and Demarcator should point to files containing the respective content, or if the values of the properties should be used as the content.\",\n+                                \"displayName\": \"Delimiter Strategy\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Delimiter Strategy\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Demarcator File\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"Filename\",\n+                                            \"Text\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Delimiter Strategy\",\n+                                        \"propertyName\": \"Delimiter Strategy\"\n+                                    },\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"Binary Concatenation\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Merge Format\",\n+                                        \"propertyName\": \"Merge Format\"\n+                                    }\n+                                ],\n+                                \"description\": \"Filename or text specifying the demarcator to use. If not specified, no demarcator is supplied.\",\n+                                \"displayName\": \"Demarcator\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"output-bucket\",\n+                                \"name\": \"Demarcator File\",\n                                 \"required\": false,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"SINGLE\",\n+                                    \"resourceTypes\": [\n+                                        \"FILE\",\n+                                        \"TEXT\"\n+                                    ]\n+                                },\n                                 \"sensitive\": false\n                             },\n-                            \"vision-feature-type\": {\n-                                \"defaultValue\": \"TEXT_DETECTION\",\n-                                \"description\": \"Type of GCP Vision Feature. The value of this property applies when the JSON Payload property is configured. The JSON Payload property value can use Expression Language to reference the value of ${vision-feature-type}\",\n-                                \"displayName\": \"Vision Feature Type\",\n+                            \"Footer File\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"Filename\",\n+                                            \"Text\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Delimiter Strategy\",\n+                                        \"propertyName\": \"Delimiter Strategy\"\n+                                    },\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"Binary Concatenation\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Merge Format\",\n+                                        \"propertyName\": \"Merge Format\"\n+                                    }\n+                                ],\n+                                \"description\": \"Filename or text specifying the footer to use. If not specified, no footer is supplied.\",\n+                                \"displayName\": \"Footer\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"vision-feature-type\",\n+                                \"name\": \"Footer File\",\n+                                \"required\": false,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"SINGLE\",\n+                                    \"resourceTypes\": [\n+                                        \"FILE\",\n+                                        \"TEXT\"\n+                                    ]\n+                                },\n+                                \"sensitive\": false\n+                            },\n+                            \"Header File\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"Filename\",\n+                                            \"Text\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Delimiter Strategy\",\n+                                        \"propertyName\": \"Delimiter Strategy\"\n+                                    },\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"Binary Concatenation\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Merge Format\",\n+                                        \"propertyName\": \"Merge Format\"\n+                                    }\n+                                ],\n+                                \"description\": \"Filename or text specifying the header to use. If not specified, no header is supplied.\",\n+                                \"displayName\": \"Header\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Header File\",\n+                                \"required\": false,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"SINGLE\",\n+                                    \"resourceTypes\": [\n+                                        \"FILE\",\n+                                        \"TEXT\"\n+                                    ]\n+                                },\n+                                \"sensitive\": false\n+                            },\n+                            \"Keep Path\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"false\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"ZIP\",\n+                                            \"TAR\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Merge Format\",\n+                                        \"propertyName\": \"Merge Format\"\n+                                    }\n+                                ],\n+                                \"description\": \"If using the Zip or Tar Merge Format, specifies whether or not the FlowFiles' paths should be included in their entry names.\",\n+                                \"displayName\": \"Keep Path\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Keep Path\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Max Bin Age\": {\n+                                \"description\": \"The maximum age of a Bin that will trigger a Bin to be complete. Expected format is <duration> <time unit> where <duration> is a positive integer and time unit is one of seconds, minutes, hours\",\n+                                \"displayName\": \"Max Bin Age\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Max Bin Age\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Maximum Group Size\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"Bin-Packing Algorithm\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Merge Strategy\",\n+                                        \"propertyName\": \"Merge Strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"The maximum size for the bundle. If not specified, there is no maximum.\",\n+                                \"displayName\": \"Maximum Group Size\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Maximum Group Size\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Maximum Number of Entries\": {\n+                                \"defaultValue\": \"1000\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"Bin-Packing Algorithm\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Merge Strategy\",\n+                                        \"propertyName\": \"Merge Strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"The maximum number of files to include in a bundle\",\n+                                \"displayName\": \"Maximum Number of Entries\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Maximum Number of Entries\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Maximum number of Bins\": {\n+                                \"defaultValue\": \"5\",\n+                                \"description\": \"Specifies the maximum number of bins that can be held in memory at any one time\",\n+                                \"displayName\": \"Maximum number of Bins\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Maximum number of Bins\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Merge Format\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"A bin of FlowFiles will be combined into a single TAR file. The FlowFiles' <path> attribute will be used to create a directory in the TAR file if the <Keep Paths> property is set to true; otherwise, all FlowFiles will be added at the root of the TAR file. If a FlowFile has an attribute named <tar.permissions> that is 3 characters, each between 0-7, that attribute will be used as the TAR entry's 'mode'.\",\n+                                        \"displayName\": \"TAR\",\n+                                        \"value\": \"TAR\"\n+                                    },\n+                                    {\n+                                        \"description\": \"A bin of FlowFiles will be combined into a single ZIP file. The FlowFiles' <path> attribute will be used to create a directory in the ZIP file if the <Keep Paths> property is set to true; otherwise, all FlowFiles will be added at the root of the ZIP file. The <Compression Level> property indicates the ZIP compression to use.\",\n+                                        \"displayName\": \"ZIP\",\n+                                        \"value\": \"ZIP\"\n+                                    },\n+                                    {\n+                                        \"description\": \"A bin of FlowFiles will be combined into a single Version 3 FlowFile Stream\",\n+                                        \"displayName\": \"FlowFile Stream, v3\",\n+                                        \"value\": \"FlowFile Stream, v3\"\n+                                    },\n+                                    {\n+                                        \"description\": \"A bin of FlowFiles will be combined into a single Version 2 FlowFile Stream\",\n+                                        \"displayName\": \"FlowFile Stream, v2\",\n+                                        \"value\": \"FlowFile Stream, v2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"A bin of FlowFiles will be combined into a single Version 1 FlowFile Package\",\n+                                        \"displayName\": \"FlowFile Tar, v1\",\n+                                        \"value\": \"FlowFile Tar, v1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"The contents of all FlowFiles will be concatenated together into a single FlowFile\",\n+                                        \"displayName\": \"Binary Concatenation\",\n+                                        \"value\": \"Binary Concatenation\"\n+                                    },\n+                                    {\n+                                        \"description\": \"The Avro contents of all FlowFiles will be concatenated together into a single FlowFile\",\n+                                        \"displayName\": \"Avro\",\n+                                        \"value\": \"Avro\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"Binary Concatenation\",\n+                                \"description\": \"Determines the format that will be used to merge the content.\",\n+                                \"displayName\": \"Merge Format\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Merge Format\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Merge Strategy\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"Generates 'bins' of FlowFiles and fills each bin as full as possible. FlowFiles are placed into a bin based on their size and optionally their attributes (if the <Correlation Attribute> property is set)\",\n+                                        \"displayName\": \"Bin-Packing Algorithm\",\n+                                        \"value\": \"Bin-Packing Algorithm\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Combines fragments that are associated by attributes back into a single cohesive FlowFile. If using this strategy, all FlowFiles must have the attributes <fragment.identifier>, <fragment.count>, and <fragment.index> or alternatively (for backward compatibility purposes) <segment.identifier>, <segment.count>, and <segment.index>. All FlowFiles with the same value for \\\"fragment.identifier\\\" will be grouped together. All FlowFiles in this group must have the same value for the \\\"fragment.count\\\" attribute. All FlowFiles in this group must have a unique value for the \\\"fragment.index\\\" attribute between 0 and the value of the \\\"fragment.count\\\" attribute.\",\n+                                        \"displayName\": \"Defragment\",\n+                                        \"value\": \"Defragment\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"Bin-Packing Algorithm\",\n+                                \"description\": \"Specifies the algorithm used to merge content. The 'Defragment' algorithm combines fragments that are associated by attributes back into a single cohesive FlowFile. The 'Bin-Packing Algorithm' generates a FlowFile populated by arbitrarily chosen FlowFiles\",\n+                                \"displayName\": \"Merge Strategy\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Merge Strategy\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Minimum Group Size\": {\n+                                \"defaultValue\": \"0 B\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"Bin-Packing Algorithm\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Merge Strategy\",\n+                                        \"propertyName\": \"Merge Strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"The minimum size for the bundle\",\n+                                \"displayName\": \"Minimum Group Size\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Minimum Group Size\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Minimum Number of Entries\": {\n+                                \"defaultValue\": \"1\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"Bin-Packing Algorithm\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Merge Strategy\",\n+                                        \"propertyName\": \"Merge Strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"The minimum number of files to include in a bundle\",\n+                                \"displayName\": \"Minimum Number of Entries\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Minimum Number of Entries\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Tar Modified Time\": {\n+                                \"defaultValue\": \"${file.lastModifiedTime}\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"TAR\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Merge Format\",\n+                                        \"propertyName\": \"Merge Format\"\n+                                    }\n+                                ],\n+                                \"description\": \"If using the Tar Merge Format, specifies if the Tar entry should store the modified timestamp either by expression (e.g. ${file.lastModifiedTime} or static value, both of which must match the ISO8601 format 'yyyy-MM-dd'T'HH:mm:ssZ'.\",\n+                                \"displayName\": \"Tar Modified Time\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Tar Modified Time\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n+                            },\n+                            \"mergecontent-metadata-strategy\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"For any input format that supports metadata (Avro, e.g.), the metadata for the first FlowFile in the bin will be set on the output FlowFile.\",\n+                                        \"displayName\": \"Use First Metadata\",\n+                                        \"value\": \"Use First Metadata\"\n+                                    },\n+                                    {\n+                                        \"description\": \"For any input format that supports metadata (Avro, e.g.), any FlowFile whose metadata values match those of the first FlowFile, any additional metadata will be dropped but the FlowFile will be merged. Any FlowFile whose metadata values do not match those of the first FlowFile in the bin will not be merged.\",\n+                                        \"displayName\": \"Keep Only Common Metadata\",\n+                                        \"value\": \"Keep Only Common Metadata\"\n+                                    },\n+                                    {\n+                                        \"description\": \"For any input format that supports metadata (Avro, e.g.), any FlowFile whose metadata values do not match those of the first FlowFile in the bin will not be merged.\",\n+                                        \"displayName\": \"Do Not Merge Uncommon Metadata\",\n+                                        \"value\": \"Do Not Merge Uncommon Metadata\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Ignores (does not transfer, compare, etc.) any metadata from a FlowFile whose content supports embedded metadata.\",\n+                                        \"displayName\": \"Ignore Metadata\",\n+                                        \"value\": \"Ignore Metadata\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"Do Not Merge Uncommon Metadata\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"Avro\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Merge Format\",\n+                                        \"propertyName\": \"Merge Format\"\n+                                    }\n+                                ],\n+                                \"description\": \"For FlowFiles whose input format supports metadata (Avro, e.g.), this property determines which metadata should be added to the bundle. If 'Use First Metadata' is selected, the metadata keys/values from the first FlowFile to be bundled will be used. If 'Keep Only Common Metadata' is selected, only the metadata that exists on all FlowFiles in the bundle, with the same value, will be preserved. If 'Ignore Metadata' is selected, no metadata is transferred to the outgoing bundled FlowFile. If 'Do Not Merge Uncommon Metadata' is selected, any FlowFile whose metadata values do not match those of the first bundled FlowFile will not be merged.\",\n+                                \"displayName\": \"Metadata Strategy\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"mergecontent-metadata-strategy\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n                             }\n                         },\n+                        \"readsAttributes\": [\n+                            {\n+                                \"description\": \"Applicable only if the <Merge Strategy> property is set to Defragment. All FlowFiles with the same value for this attribute will be bundled together.\",\n+                                \"name\": \"fragment.identifier\"\n+                            },\n+                            {\n+                                \"description\": \"Applicable only if the <Merge Strategy> property is set to Defragment. This attribute indicates the order in which the fragments should be assembled. This attribute must be present on all FlowFiles when using the Defragment Merge Strategy and must be a unique (i.e., unique across all FlowFiles that have the same value for the \\\"fragment.identifier\\\" attribute) integer between 0 and the value of the fragment.count attribute. If two or more FlowFiles have the same value for the \\\"fragment.identifier\\\" attribute and the same value for the \\\"fragment.index\\\" attribute, the first FlowFile processed will be accepted and subsequent FlowFiles will not be accepted into the Bin.\",\n+                                \"name\": \"fragment.index\"\n+                            },\n+                            {\n+                                \"description\": \"Applicable only if the <Merge Strategy> property is set to Defragment. This attribute indicates how many FlowFiles should be expected in the given bundle. At least one FlowFile must have this attribute in the bundle. If multiple FlowFiles contain the \\\"fragment.count\\\" attribute in a given bundle, all must have the same value.\",\n+                                \"name\": \"fragment.count\"\n+                            },\n+                            {\n+                                \"description\": \"Applicable only if the <Merge Strategy> property is set to Defragment. This attribute must be present on all FlowFiles with the same value for the fragment.identifier attribute. All FlowFiles in the same bundle must have the same value for this attribute. The value of this attribute will be used for the filename of the completed merged FlowFile.\",\n+                                \"name\": \"segment.original.filename\"\n+                            },\n+                            {\n+                                \"description\": \"Applicable only if the <Merge Format> property is set to TAR. The value of this attribute must be 3 characters; each character must be in the range 0 to 7 (inclusive) and indicates the file permissions that should be used for the FlowFile's TAR entry. If this attribute is missing or has an invalid value, the default value of 644 will be used\",\n+                                \"name\": \"tar.permissions\"\n+                            }\n+                        ],\n                         \"seeAlso\": [\n-                            \"org.apache.nifi.processors.gcp.vision.GetGcpVisionAnnotateImagesOperationStatus\"\n+                            \"org.apache.nifi.processors.standard.MergeRecord\",\n+                            \"org.apache.nifi.processors.standard.SegmentContent\"\n                         ],\n-                        \"sideEffectFree\": false,\n+                        \"sideEffectFree\": true,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"FlowFiles are routed to success relationship\",\n-                                \"name\": \"success\"\n+                                \"description\": \"If the bundle cannot be created, all FlowFiles that would have been used to created the bundle will be transferred to failure\",\n+                                \"name\": \"failure\"\n                             },\n                             {\n-                                \"description\": \"FlowFiles are routed to failure relationship\",\n-                                \"name\": \"failure\"\n+                                \"description\": \"The FlowFiles that were used to create the bundle\",\n+                                \"name\": \"original\"\n+                            },\n+                            {\n+                                \"description\": \"The FlowFile containing the merged content\",\n+                                \"name\": \"merged\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n                         \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n+                        \"systemResourceConsiderations\": [\n+                            {\n+                                \"description\": \"While content is not stored in memory, the FlowFiles' attributes are. The configuration of MergeContent (maximum bin size, maximum group size, maximum bin age, max number of entries) will influence how much memory is used. If merging together many small FlowFiles, a two-stage approach may be necessary in order to avoid excessive use of memory.\",\n+                                \"resource\": \"MEMORY\"\n+                            }\n+                        ],\n                         \"tags\": [\n-                            \"Cloud\",\n-                            \"Google\",\n-                            \"Machine Learning\",\n-                            \"Vision\"\n+                            \"archive\",\n+                            \"concatenation\",\n+                            \"content\",\n+                            \"correlation\",\n+                            \"flowfile-stream\",\n+                            \"flowfile-stream-v3\",\n+                            \"merge\",\n+                            \"stream\",\n+                            \"tar\",\n+                            \"zip\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.gcp.vision.StartGcpVisionAnnotateImagesOperation\",\n-                        \"typeDescription\": \"Trigger a Vision operation on image input. It should be followed by GetGcpVisionAnnotateImagesOperationStatus processor in order to monitor operation status.\",\n+                        \"triggerWhenEmpty\": true,\n+                        \"type\": \"org.apache.nifi.processors.standard.MergeContent\",\n+                        \"typeDescription\": \"Merges a Group of FlowFiles together based on a user-defined strategy and packages them into a single FlowFile. It is recommended that the Processor be configured with only a single incoming connection, as Group of FlowFiles will not be created from FlowFiles in different connections. This processor updates the mime.type attribute as appropriate. NOTE: this processor should NOT be configured with Cron Driven for the Scheduling Strategy.\",\n                         \"version\": \"1.27.0\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"A unique identifier of the operation returned by the Vision server.\",\n-                                \"name\": \"operationKey\"\n+                                \"description\": \"When more than 1 file is merged, the filename comes from the segment.original.filename attribute. If that attribute does not exist in the source FlowFiles, then the filename is set to the number of nanoseconds matching system time. Then a filename extension may be applied:if Merge Format is TAR, then the filename will be appended with .tar, if Merge Format is ZIP, then the filename will be appended with .zip, if Merge Format is FlowFileStream, then the filename will be appended with .pkg\",\n+                                \"name\": \"filename\"\n+                            },\n+                            {\n+                                \"description\": \"The number of FlowFiles that were merged into this bundle\",\n+                                \"name\": \"merge.count\"\n+                            },\n+                            {\n+                                \"description\": \"The age of the bin, in milliseconds, when it was merged and output. Effectively this is the greatest amount of time that any FlowFile in this bundle remained waiting in this processor before it was output\",\n+                                \"name\": \"merge.bin.age\"\n+                            },\n+                            {\n+                                \"description\": \"UUID of the merged flow file that will be added to the original flow files attributes.\",\n+                                \"name\": \"merge.uuid\"\n+                            },\n+                            {\n+                                \"description\": \"This processor allows for several thresholds to be configured for merging FlowFiles. This attribute indicates which of the Thresholds resulted in the FlowFiles being merged. For an explanation of each of the possible values and their meanings, see the Processor's Usage / documentation and see the 'Additional Details' page.\",\n+                                \"name\": \"merge.reason\"\n                             }\n                         ]\n-                    }\n-                ],\n-                \"reportingTasks\": []\n-            },\n-            \"group\": \"org.apache.nifi\",\n-            \"version\": \"1.27.0\"\n-        },\n-        {\n-            \"artifact\": \"nifi-standard-nar\",\n-            \"componentManifest\": {\n-                \"controllerServices\": [],\n-                \"processors\": [\n+                    },\n                     {\n-                        \"additionalDetails\": false,\n+                        \"additionalDetails\": true,\n                         \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n-                            \"EVENT_DRIVEN\": 0,\n                             \"TIMER_DRIVEN\": 1\n                         },\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"attribute-list\": {\n-                                \"description\": \"Comma separated list of attributes to be included in the resulting CSV. If this value is left empty then all existing Attributes will be included. This list of attributes is case sensitive and supports attribute names that contain commas. If an attribute specified in the list is not found it will be emitted to the resulting CSV with an empty string or null depending on the 'Null Value' property. If a core attribute is specified in this list and the 'Include Core Attributes' property is false, the core attribute will be included. The attribute list ALWAYS wins.\",\n-                                \"displayName\": \"Attribute List\",\n+                            \"Attribute Strategy\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"Any attribute that is not the same on all FlowFiles in a bin will be dropped. Those that are the same across all FlowFiles will be retained.\",\n+                                        \"displayName\": \"Keep Only Common Attributes\",\n+                                        \"value\": \"Keep Only Common Attributes\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Any attribute that has the same value for all FlowFiles in a bin, or has no value for a FlowFile, will be kept. For example, if a bin consists of 3 FlowFiles and 2 of them have a value of 'hello' for the 'greeting' attribute and the third FlowFile has no 'greeting' attribute then the outbound FlowFile will get a 'greeting' attribute with the value 'hello'.\",\n+                                        \"displayName\": \"Keep All Unique Attributes\",\n+                                        \"value\": \"Keep All Unique Attributes\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"Keep Only Common Attributes\",\n+                                \"description\": \"Determines which FlowFile attributes should be added to the bundle. If 'Keep All Unique Attributes' is selected, any attribute on any FlowFile that gets bundled will be kept unless its value conflicts with the value from another FlowFile. If 'Keep Only Common Attributes' is selected, only the attributes that exist on all FlowFiles in the bundle, with the same value, will be preserved.\",\n+                                \"displayName\": \"Attribute Strategy\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"attribute-list\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Attribute Strategy\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"correlation-attribute-name\": {\n+                                \"description\": \"If specified, two FlowFiles will be binned together only if they have the same value for this Attribute. If not specified, FlowFiles are bundled by the order in which they are pulled from the queue.\",\n+                                \"displayName\": \"Correlation Attribute Name\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"correlation-attribute-name\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"attributes-regex\": {\n-                                \"description\": \"Regular expression that will be evaluated against the flow file attributes to select the matching attributes. This property can be used in combination with the attributes list property.  The final output will contain a combination of matches found in the ATTRIBUTE_LIST and ATTRIBUTE_REGEX.\",\n-                                \"displayName\": \"Attributes Regular Expression\",\n+                            \"max-bin-age\": {\n+                                \"description\": \"The maximum age of a Bin that will trigger a Bin to be complete. Expected format is <duration> <time unit> where <duration> is a positive integer and time unit is one of seconds, minutes, hours\",\n+                                \"displayName\": \"Max Bin Age\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"attributes-regex\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"max-bin-age\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"destination\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"The resulting CSV string will be placed into a new flowfile attribute named 'CSVData'.  The content of the flowfile will not be changed.\",\n-                                        \"displayName\": \"flowfile-attribute\",\n-                                        \"value\": \"flowfile-attribute\"\n-                                    },\n-                                    {\n-                                        \"description\": \"The resulting CSV string will be placed into the content of the flowfile.Existing flowfile context will be overwritten. 'CSVData' will not be written to at all (neither null nor empty string).\",\n-                                        \"displayName\": \"flowfile-content\",\n-                                        \"value\": \"flowfile-content\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"flowfile-attribute\",\n-                                \"description\": \"Control if CSV value is written as a new flowfile attribute 'CSVData' or written in the flowfile content.\",\n-                                \"displayName\": \"Destination\",\n+                            \"max-bin-size\": {\n+                                \"description\": \"The maximum size for the bundle. If not specified, there is no maximum. This is a 'soft limit' in that if a FlowFile is added to a bin, all records in that FlowFile will be added, so this limit may be exceeded by up to the number of bytes in last input FlowFile.\",\n+                                \"displayName\": \"Maximum Bin Size\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"destination\",\n+                                \"name\": \"max-bin-size\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"max-records\": {\n+                                \"defaultValue\": \"1000\",\n+                                \"description\": \"The maximum number of Records to include in a bin. This is a 'soft limit' in that if a FlowFIle is added to a bin, all records in that FlowFile will be added, so this limit may be exceeded by up to the number of records in the last input FlowFile.\",\n+                                \"displayName\": \"Maximum Number of Records\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"max-records\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"max.bin.count\": {\n+                                \"defaultValue\": \"10\",\n+                                \"description\": \"Specifies the maximum number of bins that can be held in memory at any one time. This number should not be smaller than the maximum number of concurrent threads for this Processor, or the bins that are created will often consist only of a single incoming FlowFile.\",\n+                                \"displayName\": \"Maximum Number of Bins\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"max.bin.count\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"include-core-attributes\": {\n+                            \"merge-strategy\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"description\": \"Generates 'bins' of FlowFiles and fills each bin as full as possible. FlowFiles are placed into a bin based on their size and optionally their attributes (if the <Correlation Attribute> property is set)\",\n+                                        \"displayName\": \"Bin-Packing Algorithm\",\n+                                        \"value\": \"Bin-Packing Algorithm\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"description\": \"Combines fragments that are associated by attributes back into a single cohesive FlowFile. If using this strategy, all FlowFiles must have the attributes <fragment.identifier> and <fragment.count>. All FlowFiles with the same value for \\\"fragment.identifier\\\" will be grouped together. All FlowFiles in this group must have the same value for the \\\"fragment.count\\\" attribute. The ordering of the Records that are output is not guaranteed.\",\n+                                        \"displayName\": \"Defragment\",\n+                                        \"value\": \"Defragment\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"true\",\n-                                \"description\": \"Determines if the FlowFile org.apache.nifi.flowfile.attributes.CoreAttributes, which are contained in every FlowFile, should be included in the final CSV value generated.  Core attributes will be added to the end of the CSVData and CSVSchema strings.  The Attribute List property overrides this setting.\",\n-                                \"displayName\": \"Include Core Attributes\",\n+                                \"defaultValue\": \"Bin-Packing Algorithm\",\n+                                \"description\": \"Specifies the algorithm used to merge records. The 'Defragment' algorithm combines fragments that are associated by attributes back into a single cohesive FlowFile. The 'Bin-Packing Algorithm' generates a FlowFile populated by arbitrarily chosen FlowFiles\",\n+                                \"displayName\": \"Merge Strategy\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"include-core-attributes\",\n+                                \"name\": \"merge-strategy\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"include-schema\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"If true the schema (attribute names) will also be converted to a CSV string which will either be applied to a new attribute named 'CSVSchema' or applied at the first row in the content depending on the DESTINATION property setting.\",\n-                                \"displayName\": \"Include Schema\",\n+                            \"min-bin-size\": {\n+                                \"defaultValue\": \"0 B\",\n+                                \"description\": \"The minimum size of for the bin\",\n+                                \"displayName\": \"Minimum Bin Size\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"include-schema\",\n+                                \"name\": \"min-bin-size\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"null-value\": {\n+                            \"min-records\": {\n+                                \"defaultValue\": \"1\",\n+                                \"description\": \"The minimum number of records to include in a bin\",\n+                                \"displayName\": \"Minimum Number of Records\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"min-records\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"record-reader\": {\n+                                \"description\": \"Specifies the Controller Service to use for reading incoming data\",\n+                                \"displayName\": \"Record Reader\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"record-reader\",\n+                                \"required\": true,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"record-writer\": {\n+                                \"description\": \"Specifies the Controller Service to use for writing out the records\",\n+                                \"displayName\": \"Record Writer\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"record-writer\",\n+                                \"required\": true,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            }\n+                        },\n+                        \"readsAttributes\": [\n+                            {\n+                                \"description\": \"Applicable only if the <Merge Strategy> property is set to Defragment. All FlowFiles with the same value for this attribute will be bundled together.\",\n+                                \"name\": \"fragment.identifier\"\n+                            },\n+                            {\n+                                \"description\": \"Applicable only if the <Merge Strategy> property is set to Defragment. This attribute must be present on all FlowFiles with the same value for the fragment.identifier attribute. All FlowFiles in the same bundle must have the same value for this attribute. The value of this attribute indicates how many FlowFiles should be expected in the given bundle.\",\n+                                \"name\": \"fragment.count\"\n+                            }\n+                        ],\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.processors.standard.MergeContent\",\n+                            \"org.apache.nifi.processors.standard.PartitionRecord\",\n+                            \"org.apache.nifi.processors.standard.SplitRecord\"\n+                        ],\n+                        \"sideEffectFree\": true,\n+                        \"supportedRelationships\": [\n+                            {\n+                                \"description\": \"If the bundle cannot be created, all FlowFiles that would have been used to created the bundle will be transferred to failure\",\n+                                \"name\": \"failure\"\n+                            },\n+                            {\n+                                \"description\": \"The FlowFiles that were used to create the bundle\",\n+                                \"name\": \"original\"\n+                            },\n+                            {\n+                                \"description\": \"The FlowFile containing the merged records\",\n+                                \"name\": \"merged\"\n+                            }\n+                        ],\n+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\"\n+                        ],\n+                        \"supportsBatching\": false,\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicRelationships\": false,\n+                        \"supportsEventDriven\": false,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"content\",\n+                            \"correlation\",\n+                            \"event\",\n+                            \"merge\",\n+                            \"record\",\n+                            \"stream\"\n+                        ],\n+                        \"triggerSerially\": false,\n+                        \"triggerWhenAnyDestinationAvailable\": false,\n+                        \"triggerWhenEmpty\": true,\n+                        \"type\": \"org.apache.nifi.processors.standard.MergeRecord\",\n+                        \"typeDescription\": \"This Processor merges together multiple record-oriented FlowFiles into a single FlowFile that contains all of the Records of the input FlowFiles. This Processor works by creating 'bins' and then adding FlowFiles to these bins until they are full. Once a bin is full, all of the FlowFiles will be combined into a single output FlowFile, and that FlowFile will be routed to the 'merged' Relationship. A bin will consist of potentially many 'like FlowFiles'. In order for two FlowFiles to be considered 'like FlowFiles', they must have the same Schema (as identified by the Record Reader) and, if the <Correlation Attribute Name> property is set, the same value for the specified attribute. See Processor Usage and Additional Details for more information. NOTE: this processor should NOT be configured with Cron Driven for the Scheduling Strategy.\",\n+                        \"version\": \"1.27.0\",\n+                        \"writesAttributes\": [\n+                            {\n+                                \"description\": \"The merged FlowFile will have a 'record.count' attribute indicating the number of records that were written to the FlowFile.\",\n+                                \"name\": \"record.count\"\n+                            },\n+                            {\n+                                \"description\": \"The MIME Type indicated by the Record Writer\",\n+                                \"name\": \"mime.type\"\n+                            },\n+                            {\n+                                \"description\": \"The number of FlowFiles that were merged into this bundle\",\n+                                \"name\": \"merge.count\"\n+                            },\n+                            {\n+                                \"description\": \"The age of the bin, in milliseconds, when it was merged and output. Effectively this is the greatest amount of time that any FlowFile in this bundle remained waiting in this processor before it was output\",\n+                                \"name\": \"merge.bin.age\"\n+                            },\n+                            {\n+                                \"description\": \"UUID of the merged FlowFile that will be added to the original FlowFiles attributes\",\n+                                \"name\": \"merge.uuid\"\n+                            },\n+                            {\n+                                \"description\": \"Any Attribute that the configured Record Writer returns will be added to the FlowFile.\",\n+                                \"name\": \"<Attributes from Record Writer>\"\n+                            }\n+                        ]\n+                    },\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-standard-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"e0c4461\"\n+                        },\n+                        \"defaultBulletinLevel\": \"WARN\",\n+                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": 1,\n+                            \"EVENT_DRIVEN\": 0,\n+                            \"TIMER_DRIVEN\": 1\n+                        },\n+                        \"defaultPenaltyDuration\": \"30 sec\",\n+                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": \"* * * * * ?\",\n+                            \"TIMER_DRIVEN\": \"0 sec\"\n+                        },\n+                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n+                        \"defaultYieldDuration\": \"1 sec\",\n+                        \"group\": \"org.apache.nifi\",\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n+                        \"primaryNodeOnly\": false,\n+                        \"propertyDescriptors\": {\n+                            \"End Offset\": {\n+                                \"defaultValue\": \"0 B\",\n+                                \"description\": \"Number of bytes removed at the end of the file.\",\n+                                \"displayName\": \"End Offset\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"End Offset\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Remove All Content\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"true\",\n                                         \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"false\",\n                                         \"value\": \"false\"\n                                     }\n                                 ],\n                                 \"defaultValue\": \"false\",\n-                                \"description\": \"If true a non existing or empty attribute will be 'null' in the resulting CSV. If false an empty string will be placed in the CSV\",\n-                                \"displayName\": \"Null Value\",\n+                                \"description\": \"Remove all content from the FlowFile superseding Start Offset and End Offset properties.\",\n+                                \"displayName\": \"Remove All Content\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"null-value\",\n+                                \"name\": \"Remove All Content\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Start Offset\": {\n+                                \"defaultValue\": \"0 B\",\n+                                \"description\": \"Number of bytes removed at the beginning of the file.\",\n+                                \"displayName\": \"Start Offset\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Start Offset\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             }\n                         },\n                         \"sideEffectFree\": true,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"Successfully converted attributes to CSV\",\n+                                \"description\": \"Processed flowfiles.\",\n                                 \"name\": \"success\"\n-                            },\n-                            {\n-                                \"description\": \"Failed to convert attributes to CSV\",\n-                                \"name\": \"failure\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\",\n                             \"EVENT_DRIVEN\"\n                         ],\n                         \"supportsBatching\": true,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsEventDriven\": true,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"attributes\",\n-                            \"csv\",\n-                            \"flowfile\"\n+                            \"binary\",\n+                            \"discard\",\n+                            \"keep\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.standard.AttributesToCSV\",\n-                        \"typeDescription\": \"Generates a CSV representation of the input FlowFile Attributes. The resulting CSV can be written to either a newly generated attribute named 'CSVAttributes' or written to the FlowFile as content.  If the attribute value contains a comma, newline or double quote, then the attribute value will be escaped with double quotes.  Any double quote characters in the attribute value are escaped with another double quote.\",\n-                        \"version\": \"1.27.0\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"CSV representation of the Schema\",\n-                                \"name\": \"CSVSchema\"\n-                            },\n-                            {\n-                                \"description\": \"CSV representation of Attributes\",\n-                                \"name\": \"CSVData\"\n-                            }\n-                        ]\n+                        \"type\": \"org.apache.nifi.processors.standard.ModifyBytes\",\n+                        \"typeDescription\": \"Discard byte range at the start and end or all content of a binary file.\",\n+                        \"version\": \"1.27.0\"\n                     },\n                     {\n                         \"additionalDetails\": false,\n                         \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n-                            \"EVENT_DRIVEN\": 0,\n                             \"TIMER_DRIVEN\": 1\n                         },\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Attributes List\": {\n-                                \"description\": \"Comma separated list of attributes to be included in the resulting JSON. If this value is left empty then all existing Attributes will be included. This list of attributes is case sensitive. If an attribute specified in the list is not found it will be be emitted to the resulting JSON with an empty string or NULL value.\",\n-                                \"displayName\": \"Attributes List\",\n+                            \"Activity Restored Message\": {\n+                                \"defaultValue\": \"Activity restored at time: ${now():format('yyyy/MM/dd HH:mm:ss')} after being inactive for ${inactivityDurationMillis:toNumber():divide(60000)} minutes\",\n+                                \"description\": \"The message that will be the content of FlowFiles that are sent to 'activity.restored' relationship\",\n+                                \"displayName\": \"Activity Restored Message\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Attributes List\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Activity Restored Message\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Destination\": {\n+                            \"Continually Send Messages\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"flowfile-attribute\",\n-                                        \"value\": \"flowfile-attribute\"\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"flowfile-content\",\n-                                        \"value\": \"flowfile-content\"\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"flowfile-attribute\",\n-                                \"description\": \"Control if JSON value is written as a new flowfile attribute 'JSONAttributes' or written in the flowfile content. Writing to flowfile content will overwrite any existing flowfile content.\",\n-                                \"displayName\": \"Destination\",\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"If true, will send inactivity indicator continually every Threshold Duration amount of time until activity is restored; if false, will send an indicator only when the flow first becomes inactive\",\n+                                \"displayName\": \"Continually Send Messages\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Destination\",\n+                                \"name\": \"Continually Send Messages\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Include Core Attributes\": {\n+                            \"Copy Attributes\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"true\",\n                                         \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"false\",\n                                         \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"true\",\n-                                \"description\": \"Determines if the FlowFile org.apache.nifi.flowfile.attributes.CoreAttributes which are contained in every FlowFile should be included in the final JSON value generated.\",\n-                                \"displayName\": \"Include Core Attributes\",\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"If true, will copy all flow file attributes from the flow file that resumed activity to the newly created indicator flow file\",\n+                                \"displayName\": \"Copy Attributes\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Include Core Attributes\",\n+                                \"name\": \"Copy Attributes\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"JSON Handling Strategy\": {\n+                            \"Inactivity Message\": {\n+                                \"defaultValue\": \"Lacking activity as of time: ${now():format('yyyy/MM/dd HH:mm:ss')}; flow has been inactive for ${inactivityDurationMillis:toNumber():divide(60000)} minutes\",\n+                                \"description\": \"The message that will be the content of FlowFiles that are sent to the 'inactive' relationship\",\n+                                \"displayName\": \"Inactivity Message\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Inactivity Message\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Monitoring Scope\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Escapes JSON attribute values to strings\",\n-                                        \"displayName\": \"Escaped\",\n-                                        \"value\": \"ESCAPED\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"node\",\n+                                        \"value\": \"node\"\n                                     },\n                                     {\n-                                        \"description\": \"Handles JSON attribute values as nested structured objects or arrays\",\n-                                        \"displayName\": \"Nested\",\n-                                        \"value\": \"NESTED\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"cluster\",\n+                                        \"value\": \"cluster\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"ESCAPED\",\n-                                \"description\": \"Strategy to use for handling attributes which contain nested JSON.\",\n-                                \"displayName\": \"JSON Handling Strategy\",\n+                                \"defaultValue\": \"node\",\n+                                \"description\": \"Specify how to determine activeness of the flow. 'node' means that activeness is examined at individual node separately. It can be useful if DFM expects each node should receive flow files in a distributed manner. With 'cluster', it defines the flow is active while at least one node receives flow files actively. If NiFi is running as standalone mode, this should be set as 'node', if it's 'cluster', NiFi logs a warning message and act as 'node' scope.\",\n+                                \"displayName\": \"Monitoring Scope\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"JSON Handling Strategy\",\n+                                \"name\": \"Monitoring Scope\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Null Value\": {\n+                            \"Reporting Node\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"displayName\": \"all\",\n+                                        \"value\": \"all\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"displayName\": \"primary\",\n+                                        \"value\": \"primary\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"If true a non existing selected attribute will be NULL in the resulting JSON. If false an empty string will be placed in the JSON\",\n-                                \"displayName\": \"Null Value\",\n+                                \"defaultValue\": \"all\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"cluster\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Monitoring Scope\",\n+                                        \"propertyName\": \"Monitoring Scope\"\n+                                    }\n+                                ],\n+                                \"description\": \"Specify which node should send notification flow-files to inactive and activity.restored relationships. With 'all', every node in this cluster send notification flow-files. 'primary' means flow-files will be sent only from a primary node. If NiFi is running as standalone mode, this should be set as 'all', even if it's 'primary', NiFi act as 'all'.\",\n+                                \"displayName\": \"Reporting Node\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Null Value\",\n+                                \"name\": \"Reporting Node\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Pretty Print\": {\n+                            \"Reset State on Restart\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"true\",\n                                         \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"false\",\n                                         \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"false\",\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"flowfile-content\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Destination\",\n-                                        \"propertyName\": \"Destination\"\n-                                    }\n-                                ],\n-                                \"description\": \"Apply pretty print formatting to the output.\",\n-                                \"displayName\": \"Pretty Print\",\n+                                \"defaultValue\": \"true\",\n+                                \"description\": \"When the processor gets started or restarted, if set to true, the initial state will always be active. Otherwise, the last reported flow state will be preserved.\",\n+                                \"displayName\": \"Reset State on Restart\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Pretty Print\",\n+                                \"name\": \"Reset State on Restart\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"attributes-to-json-regex\": {\n-                                \"description\": \"Regular expression that will be evaluated against the flow file attributes to select the matching attributes. This property can be used in combination with the attributes list property.\",\n-                                \"displayName\": \"Attributes Regular Expression\",\n+                            \"Threshold Duration\": {\n+                                \"defaultValue\": \"5 min\",\n+                                \"description\": \"Determines how much time must elapse before considering the flow to be inactive\",\n+                                \"displayName\": \"Threshold Duration\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"attributes-to-json-regex\",\n-                                \"required\": false,\n+                                \"name\": \"Threshold Duration\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Wait for Activity\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"When the processor gets started or restarted, if set to true, only send an inactive indicator if there had been activity beforehand. Otherwise send an inactive indicator even if there had not been activity beforehand.\",\n+                                \"displayName\": \"Wait for Activity\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Wait for Activity\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             }\n                         },\n                         \"sideEffectFree\": true,\n+                        \"stateful\": {\n+                            \"description\": \"MonitorActivity stores the last timestamp at each node as state, so that it can examine activity at cluster wide. If 'Copy Attribute' is set to true, then flow file attributes are also persisted. In local scope, it stores last known activity timestamp if the flow is inactive.\",\n+                            \"scopes\": [\n+                                \"CLUSTER\",\n+                                \"LOCAL\"\n+                            ]\n+                        },\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"Successfully converted attributes to JSON\",\n+                                \"description\": \"This relationship is used to transfer an Inactivity indicator when no FlowFiles are routed to 'success' for Threshold Duration amount of time\",\n+                                \"name\": \"inactive\"\n+                            },\n+                            {\n+                                \"description\": \"All incoming FlowFiles are routed to success\",\n                                 \"name\": \"success\"\n                             },\n                             {\n-                                \"description\": \"Failed to convert attributes to JSON\",\n-                                \"name\": \"failure\"\n+                                \"description\": \"This relationship is used to transfer an Activity Restored indicator when FlowFiles are routing to 'success' following a period of inactivity\",\n+                                \"name\": \"activity.restored\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\",\n-                            \"EVENT_DRIVEN\"\n+                            \"CRON_DRIVEN\"\n                         ],\n-                        \"supportsBatching\": true,\n+                        \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": true,\n+                        \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"attributes\",\n-                            \"flowfile\",\n-                            \"json\"\n+                            \"active\",\n+                            \"activity\",\n+                            \"detection\",\n+                            \"flow\",\n+                            \"inactive\",\n+                            \"monitor\"\n                         ],\n-                        \"triggerSerially\": false,\n+                        \"triggerSerially\": true,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.standard.AttributesToJSON\",\n-                        \"typeDescription\": \"Generates a JSON representation of the input FlowFile Attributes. The resulting JSON can be written to either a new Attribute 'JSONAttributes' or written to the FlowFile as content. Attributes  which contain nested JSON objects can either be handled as JSON or as escaped JSON depending on the strategy chosen.\",\n+                        \"triggerWhenEmpty\": true,\n+                        \"type\": \"org.apache.nifi.processors.standard.MonitorActivity\",\n+                        \"typeDescription\": \"Monitors the flow for activity and sends out an indicator when the flow has not had any data for some specified amount of time and again when the flow's activity is restored\",\n                         \"version\": \"1.27.0\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"JSON representation of Attributes\",\n-                                \"name\": \"JSONAttributes\"\n+                                \"description\": \"The time at which Inactivity began, in the form of milliseconds since Epoch\",\n+                                \"name\": \"inactivityStartMillis\"\n+                            },\n+                            {\n+                                \"description\": \"The number of milliseconds that the inactivity has spanned\",\n+                                \"name\": \"inactivityDurationMillis\"\n                             }\n                         ]\n                     },\n                     {\n                         \"additionalDetails\": false,\n                         \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n@@ -95469,81 +95611,137 @@\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n-                        \"deprecated\": true,\n-                        \"deprecationAlternatives\": [\n-                            \"org.apache.nifi.processors.standard.EncodeContent\"\n-                        ],\n-                        \"deprecationReason\": \"EncodeContent supports Base64 and additional encoding schemes\",\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Mode\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Encode\",\n-                                        \"value\": \"Encode\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Decode\",\n-                                        \"value\": \"Decode\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"Encode\",\n-                                \"description\": \"Specifies whether the content should be encoded or decoded\",\n-                                \"displayName\": \"Mode\",\n+                            \"attribute-cache-regex\": {\n+                                \"description\": \"Any attributes whose names match this regex will be stored in the distributed cache to be copied to any FlowFiles released from a corresponding Wait processor.  Note that the uuid attribute will not be cached regardless of this value.  If blank, no attributes will be cached.\",\n+                                \"displayName\": \"Attribute Cache Regex\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Mode\",\n+                                \"name\": \"attribute-cache-regex\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"distributed-cache-service\": {\n+                                \"description\": \"The Controller Service that is used to cache release signals in order to release files queued at a corresponding Wait processor\",\n+                                \"displayName\": \"Distributed Cache Service\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"distributed-cache-service\",\n+                                \"required\": true,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.distributed.cache.client.AtomicDistributedMapCacheClient\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"release-signal-id\": {\n+                                \"description\": \"A value, or the results of an Attribute Expression Language statement, which will be evaluated against a FlowFile in order to determine the release signal cache key\",\n+                                \"displayName\": \"Release Signal Identifier\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"release-signal-id\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"signal-buffer-count\": {\n+                                \"defaultValue\": \"1\",\n+                                \"description\": \"Specify the maximum number of incoming flow files that can be buffered until signals are notified to cache service. The more buffer can provide the better performance, as it reduces the number of interactions with cache service by grouping signals by signal identifier when multiple incoming flow files share the same signal identifier.\",\n+                                \"displayName\": \"Signal Buffer Count\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"signal-buffer-count\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"signal-counter-delta\": {\n+                                \"defaultValue\": \"1\",\n+                                \"description\": \"A value, or the results of an Attribute Expression Language statement, which will be evaluated against a FlowFile in order to determine the signal counter delta. Specify how much the counter should increase. For example, if multiple signal events are processed at upstream flow in batch oriented way, the number of events processed can be notified with this property at once. Zero (0) has a special meaning, it clears target count back to 0, which is especially useful when used with Wait Releasable FlowFile Count = Zero (0) mode, to provide 'open-close-gate' type of flow control. One (1) can open a corresponding Wait processor, and Zero (0) can negate it as if closing a gate.\",\n+                                \"displayName\": \"Signal Counter Delta\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"signal-counter-delta\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"signal-counter-name\": {\n+                                \"defaultValue\": \"default\",\n+                                \"description\": \"A value, or the results of an Attribute Expression Language statement, which will be evaluated against a FlowFile in order to determine the signal counter name. Signal counter name is useful when a corresponding Wait processor needs to know the number of occurrences of different types of events, such as success or failure, or destination data source names, etc.\",\n+                                \"displayName\": \"Signal Counter Name\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"signal-counter-name\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             }\n                         },\n-                        \"sideEffectFree\": true,\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.distributed.cache.client.DistributedMapCacheClientService\",\n+                            \"org.apache.nifi.distributed.cache.server.map.DistributedMapCacheServer\",\n+                            \"org.apache.nifi.processors.standard.Wait\"\n+                        ],\n+                        \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"Any FlowFile that is successfully encoded or decoded will be routed to success\",\n+                                \"description\": \"All FlowFiles where the release signal has been successfully entered in the cache will be routed to this relationship\",\n                                 \"name\": \"success\"\n                             },\n                             {\n-                                \"description\": \"Any FlowFile that cannot be encoded or decoded will be routed to failure\",\n+                                \"description\": \"When the cache cannot be reached, or if the Release Signal Identifier evaluates to null or empty, FlowFiles will be routed to this relationship\",\n                                 \"name\": \"failure\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\",\n                             \"EVENT_DRIVEN\"\n                         ],\n                         \"supportsBatching\": true,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsEventDriven\": true,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"base64\",\n-                            \"encode\"\n+                            \"cache\",\n+                            \"distributed\",\n+                            \"map\",\n+                            \"notify\",\n+                            \"release\",\n+                            \"signal\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.standard.Base64EncodeContent\",\n-                        \"typeDescription\": \"Encodes or decodes content to and from base64\",\n-                        \"version\": \"1.27.0\"\n+                        \"type\": \"org.apache.nifi.processors.standard.Notify\",\n+                        \"typeDescription\": \"Caches a release signal identifier in the distributed cache, optionally along with the FlowFile's attributes.  Any flow files held at a corresponding Wait processor will be released once this signal in the cache is discovered.\",\n+                        \"version\": \"1.27.0\",\n+                        \"writesAttributes\": [\n+                            {\n+                                \"description\": \"All FlowFiles will have an attribute 'notified'. The value of this attribute is true, is the FlowFile is notified, otherwise false.\",\n+                                \"name\": \"notified\"\n+                            }\n+                        ]\n                     },\n                     {\n-                        \"additionalDetails\": true,\n+                        \"additionalDetails\": false,\n                         \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n@@ -95552,97 +95750,71 @@\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n-                        \"dynamicProperties\": [\n-                            {\n-                                \"description\": \"A Record Path value, pointing to a field to be counted\",\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"name\": \"Record Path property\",\n-                                \"value\": \"The Record Path value\"\n-                            }\n-                        ],\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"record-stats-limit\": {\n-                                \"defaultValue\": \"10\",\n-                                \"description\": \"Limit the number of individual stats that are returned for each record path to the top N results.\",\n-                                \"displayName\": \"record-stats-limit\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"record-stats-limit\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"record-stats-reader\": {\n-                                \"description\": \"A record reader to use for reading the records.\",\n-                                \"displayName\": \"Record Reader\",\n+                            \"max-batch-size\": {\n+                                \"defaultValue\": \"1\",\n+                                \"description\": \"Maximum number of FlowFiles to package into one output FlowFile using a best effort, non guaranteed approach. Multiple input queues can produce unexpected batching behavior.\",\n+                                \"displayName\": \"Maximum Batch Size\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"record-stats-reader\",\n+                                \"name\": \"max-batch-size\",\n                                 \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n+                                \"sensitive\": false\n                             }\n                         },\n-                        \"sideEffectFree\": false,\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.processors.standard.MergeContent\",\n+                            \"org.apache.nifi.processors.standard.UnpackContent\"\n+                        ],\n+                        \"sideEffectFree\": true,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"If a flowfile is successfully processed, it goes here.\",\n+                                \"description\": \"The packaged FlowFile is sent to this relationship\",\n                                 \"name\": \"success\"\n                             },\n                             {\n-                                \"description\": \"If a flowfile fails to be processed, it goes here.\",\n-                                \"name\": \"failure\"\n+                                \"description\": \"The FlowFiles that were used to create the package are sent to this relationship\",\n+                                \"name\": \"original\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n-                        \"supportsBatching\": false,\n-                        \"supportsDynamicProperties\": true,\n+                        \"supportsBatching\": true,\n+                        \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"metrics\",\n-                            \"record\",\n-                            \"stats\"\n+                            \"attributes\",\n+                            \"flowfile\",\n+                            \"flowfile-stream\",\n+                            \"flowfile-stream-v3\",\n+                            \"package\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.standard.CalculateRecordStats\",\n-                        \"typeDescription\": \"A processor that can count the number of items in a record set, as well as provide counts based on user-defined criteria on subsets of the record set.\",\n+                        \"type\": \"org.apache.nifi.processors.standard.PackageFlowFile\",\n+                        \"typeDescription\": \"This processor will package FlowFile attributes and content into an output FlowFile that can be exported from NiFi and imported back into NiFi, preserving the original attributes and content.\",\n                         \"version\": \"1.27.0\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"A count of the records in the record set in the FlowFile.\",\n-                                \"name\": \"record.count\"\n-                            },\n-                            {\n-                                \"description\": \"A count of the records that contain a value for the user defined property.\",\n-                                \"name\": \"recordStats.<User Defined Property Name>.count\"\n-                            },\n-                            {\n-                                \"description\": \"Each value discovered for the user defined property will have its own count attribute. Total number of top N value counts to be added is defined by the limit configuration.\",\n-                                \"name\": \"recordStats.<User Defined Property Name>.<value>.count\"\n+                                \"description\": \"The mime.type will be changed to application/flowfile-v3\",\n+                                \"name\": \"mime.type\"\n                             }\n                         ]\n                     },\n                     {\n                         \"additionalDetails\": false,\n                         \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n@@ -95661,471 +95833,224 @@\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Compression Format\": {\n+                            \"ACCEPT_EMPTY_EXTENSIONS\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"use mime.type attribute\",\n-                                        \"value\": \"use mime.type attribute\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"gzip\",\n-                                        \"value\": \"gzip\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"deflate\",\n-                                        \"value\": \"deflate\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"bzip2\",\n-                                        \"value\": \"bzip2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"xz-lzma2\",\n-                                        \"value\": \"xz-lzma2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"lzma\",\n-                                        \"value\": \"lzma\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"snappy\",\n-                                        \"value\": \"snappy\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"snappy-hadoop\",\n-                                        \"value\": \"snappy-hadoop\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"snappy framed\",\n-                                        \"value\": \"snappy framed\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"lz4-framed\",\n-                                        \"value\": \"lz4-framed\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"zstd\",\n-                                        \"value\": \"zstd\"\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"brotli\",\n-                                        \"value\": \"brotli\"\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"use mime.type attribute\",\n-                                \"description\": \"The compression format to use. Valid values are: GZIP, Deflate, ZSTD, BZIP2, XZ-LZMA2, LZMA, Brotli, Snappy, Snappy Hadoop, Snappy Framed, and LZ4-Framed\",\n-                                \"displayName\": \"Compression Format\",\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"If set to true, empty extensions will be accepted and will be associated to a null value.\",\n+                                \"displayName\": \"Accept empty extensions\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Compression Format\",\n+                                \"name\": \"ACCEPT_EMPTY_EXTENSIONS\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Compression Level\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"0\",\n-                                        \"value\": \"0\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"1\",\n-                                        \"value\": \"1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"2\",\n-                                        \"value\": \"2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"3\",\n-                                        \"value\": \"3\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"4\",\n-                                        \"value\": \"4\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"5\",\n-                                        \"value\": \"5\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"6\",\n-                                        \"value\": \"6\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"7\",\n-                                        \"value\": \"7\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"8\",\n-                                        \"value\": \"8\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"9\",\n-                                        \"value\": \"9\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"1\",\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"zstd\",\n-                                            \"use mime.type attribute\",\n-                                            \"deflate\",\n-                                            \"brotli\",\n-                                            \"gzip\",\n-                                            \"xz-lzma2\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Compression Format\",\n-                                        \"propertyName\": \"Compression Format\"\n-                                    },\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"compress\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Mode\",\n-                                        \"propertyName\": \"Mode\"\n-                                    }\n-                                ],\n-                                \"description\": \"The compression level to use; this is valid only when using gzip, deflate or xz-lzma2 compression. A lower value results in faster processing but less compression; a value of 0 indicates no (that is, simple archiving) for gzip or minimal for xz-lzma2 compression. Higher levels can mean much larger memory usage such as the case with levels 7-9 for xz-lzma/2 so be careful relative to heap size.\",\n-                                \"displayName\": \"Compression Level\",\n+                            \"APPEND_RAW_MESSAGE_TO_JSON\": {\n+                                \"defaultValue\": \"true\",\n+                                \"description\": \"When using flowfile-content (i.e. JSON output), add the original CEF message to the resulting JSON object. The original message is added as a string to _raw.\",\n+                                \"displayName\": \"Append raw message to JSON\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Compression Level\",\n+                                \"name\": \"APPEND_RAW_MESSAGE_TO_JSON\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Mode\": {\n+                            \"DATETIME_REPRESENTATION\": {\n+                                \"defaultValue\": \"en-US\",\n+                                \"description\": \"The IETF BCP 47 representation of the Locale to be used when parsing date fields with long or short month names (e.g. may <en-US> vs. mai. <fr-FR>. The defaultvalue is generally safe. Only change if having issues parsing CEF messages\",\n+                                \"displayName\": \"DateTime Locale\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"DATETIME_REPRESENTATION\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"FIELDS_DESTINATION\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"compress\",\n-                                        \"value\": \"compress\"\n+                                        \"displayName\": \"flowfile-content\",\n+                                        \"value\": \"flowfile-content\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"decompress\",\n-                                        \"value\": \"decompress\"\n+                                        \"displayName\": \"flowfile-attribute\",\n+                                        \"value\": \"flowfile-attribute\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"compress\",\n-                                \"description\": \"Indicates whether the processor should compress content or decompress content. Must be either 'compress' or 'decompress'\",\n-                                \"displayName\": \"Mode\",\n+                                \"defaultValue\": \"flowfile-content\",\n+                                \"description\": \"Indicates whether the results of the CEF parser are written to the FlowFile content or a FlowFile attribute; if using flowfile-attributeattribute, fields will be populated as attributes. If set to flowfile-content, the CEF extension field will be converted into a flat JSON object.\",\n+                                \"displayName\": \"Parsed fields destination\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Mode\",\n+                                \"name\": \"FIELDS_DESTINATION\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Update Filename\": {\n+                            \"INCLUDE_CUSTOM_EXTENSIONS\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"true\",\n                                         \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"false\",\n                                         \"value\": \"false\"\n                                     }\n                                 ],\n                                 \"defaultValue\": \"false\",\n-                                \"description\": \"If true, will remove the filename extension when decompressing data (only if the extension indicates the appropriate compression format) and add the appropriate extension when compressing data\",\n-                                \"displayName\": \"Update Filename\",\n+                                \"description\": \"If set to true, custom extensions (not specified in the CEF specifications) will be included in the generated data/attributes.\",\n+                                \"displayName\": \"Include custom extensions\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Update Filename\",\n+                                \"name\": \"INCLUDE_CUSTOM_EXTENSIONS\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n-                            }\n-                        },\n-                        \"readsAttributes\": [\n-                            {\n-                                \"description\": \"If the Compression Format is set to use mime.type attribute, this attribute is used to determine the compression type. Otherwise, this attribute is ignored.\",\n-                                \"name\": \"mime.type\"\n-                            }\n-                        ],\n-                        \"sideEffectFree\": true,\n-                        \"supportedRelationships\": [\n-                            {\n-                                \"description\": \"FlowFiles will be transferred to the success relationship after successfully being compressed or decompressed\",\n-                                \"name\": \"success\"\n-                            },\n-                            {\n-                                \"description\": \"FlowFiles will be transferred to the failure relationship if they fail to compress/decompress\",\n-                                \"name\": \"failure\"\n-                            }\n-                        ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\",\n-                            \"EVENT_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": true,\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": true,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"systemResourceConsiderations\": [\n-                            {\n-                                \"description\": \"An instance of this component can cause high usage of this system resource.  Multiple instances or high concurrency settings may result a degradation of performance.\",\n-                                \"resource\": \"CPU\"\n-                            },\n-                            {\n-                                \"description\": \"An instance of this component can cause high usage of this system resource.  Multiple instances or high concurrency settings may result a degradation of performance.\",\n-                                \"resource\": \"MEMORY\"\n-                            }\n-                        ],\n-                        \"tags\": [\n-                            \"brotli\",\n-                            \"bzip2\",\n-                            \"compress\",\n-                            \"content\",\n-                            \"decompress\",\n-                            \"deflate\",\n-                            \"gzip\",\n-                            \"lz4-framed\",\n-                            \"lzma\",\n-                            \"snappy\",\n-                            \"snappy framed\",\n-                            \"snappy-hadoop\",\n-                            \"xz-lzma2\",\n-                            \"zstd\"\n-                        ],\n-                        \"triggerSerially\": false,\n-                        \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.standard.CompressContent\",\n-                        \"typeDescription\": \"Compresses or decompresses the contents of FlowFiles using a user-specified compression algorithm and updates the mime.type attribute as appropriate. A common idiom is to precede CompressContent with IdentifyMimeType and configure Mode='decompress' AND Compression Format='use mime.type attribute'. When used in this manner, the MIME type is automatically detected and the data is decompressed, if necessary. If decompression is unnecessary, the data is passed through to the 'success' relationship. This processor operates in a very memory efficient way so very large objects well beyond the heap size are generally fine to process.\",\n-                        \"version\": \"1.27.0\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"If the Mode property is set to compress, the appropriate MIME Type is set. If the Mode property is set to decompress and the file is successfully decompressed, this attribute is removed, as the MIME Type is no longer known.\",\n-                                \"name\": \"mime.type\"\n-                            }\n-                        ]\n-                    },\n-                    {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-standard-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"e0c4461\"\n-                        },\n-                        \"defaultBulletinLevel\": \"WARN\",\n-                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": 1,\n-                            \"TIMER_DRIVEN\": 1\n-                        },\n-                        \"defaultPenaltyDuration\": \"30 sec\",\n-                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"0 sec\"\n-                        },\n-                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n-                        \"defaultYieldDuration\": \"1 sec\",\n-                        \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_REQUIRED\",\n-                        \"primaryNodeOnly\": false,\n-                        \"propertyDescriptors\": {\n-                            \"Grouping Attribute\": {\n-                                \"description\": \"By default, a single \\\"throttle\\\" is used for all FlowFiles. If this value is specified, a separate throttle is used for each value specified by the attribute with this name. Changing this value resets the rate counters.\",\n-                                \"displayName\": \"Grouping Attribute\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Grouping Attribute\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Maximum Data Rate\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"data rate or flowfile count\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Rate Control Criteria\",\n-                                        \"propertyName\": \"Rate Control Criteria\"\n-                                    }\n-                                ],\n-                                \"description\": \"The maximum rate at which data should pass through this processor. The format of this property is expected to be a Data Size (such as '1 MB') representing bytes per Time Duration.\",\n-                                \"displayName\": \"Maximum Data Rate\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Maximum Data Rate\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Maximum FlowFile Rate\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"data rate or flowfile count\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Rate Control Criteria\",\n-                                        \"propertyName\": \"Rate Control Criteria\"\n-                                    }\n-                                ],\n-                                \"description\": \"The maximum rate at which FlowFiles should pass through this processor. The format of this property is expected to be a positive integer representing FlowFiles count per Time Duration\",\n-                                \"displayName\": \"Maximum FlowFile Rate\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Maximum FlowFile Rate\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Maximum Rate\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"data rate\",\n-                                            \"attribute value\",\n-                                            \"flowfile count\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Rate Control Criteria\",\n-                                        \"propertyName\": \"Rate Control Criteria\"\n-                                    }\n-                                ],\n-                                \"description\": \"The maximum rate at which data should pass through this processor. The format of this property is expected to be a positive integer, or a Data Size (such as '1 MB') if Rate Control Criteria is set to 'data rate'.\",\n-                                \"displayName\": \"Maximum Rate\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Maximum Rate\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n                             },\n-                            \"Rate Control Criteria\": {\n+                            \"TIME_REPRESENTATION\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Rate is controlled by counting bytes transferred per time duration.\",\n-                                        \"displayName\": \"data rate\",\n-                                        \"value\": \"data rate\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Rate is controlled by counting FlowFiles transferred per time duration\",\n-                                        \"displayName\": \"flowfile count\",\n-                                        \"value\": \"flowfile count\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Rate is controlled by accumulating the value of a specified attribute that is transferred per time duration\",\n-                                        \"displayName\": \"attribute value\",\n-                                        \"value\": \"attribute value\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"UTC\",\n+                                        \"value\": \"UTC\"\n                                     },\n                                     {\n-                                        \"description\": \"Rate is controlled by counting bytes and FlowFiles transferred per time duration; if either threshold is met, throttling is enforced\",\n-                                        \"displayName\": \"data rate or flowfile count\",\n-                                        \"value\": \"data rate or flowfile count\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"data rate\",\n-                                \"description\": \"Indicates the criteria that is used to control the throughput rate. Changing this value resets the rate counters.\",\n-                                \"displayName\": \"Rate Control Criteria\",\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Local Timezone (system Default)\",\n+                                        \"value\": \"Local Timezone (system Default)\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"Local Timezone (system Default)\",\n+                                \"description\": \"Timezone to be used when representing date fields. UTC will convert all dates to UTC, while Local Timezone will convert them to the timezone used by NiFi.\",\n+                                \"displayName\": \"Timezone\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Rate Control Criteria\",\n+                                \"name\": \"TIME_REPRESENTATION\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Rate Controlled Attribute\": {\n-                                \"dependencies\": [\n+                            \"VALIDATE_DATA\": {\n+                                \"allowableValues\": [\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"attribute value\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Rate Control Criteria\",\n-                                        \"propertyName\": \"Rate Control Criteria\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"description\": \"The name of an attribute whose values build toward the rate limit if Rate Control Criteria is set to 'attribute value'. The value of the attribute referenced by this property must be a positive long, or the FlowFile will be routed to failure. This value is ignored if Rate Control Criteria is not set to 'attribute value'. Changing this value resets the rate counters.\",\n-                                \"displayName\": \"Rate Controlled Attribute\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Rate Controlled Attribute\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Time Duration\": {\n-                                \"defaultValue\": \"1 min\",\n-                                \"description\": \"The amount of time to which the Maximum Rate pertains. Changing this value resets the rate counters.\",\n-                                \"displayName\": \"Time Duration\",\n+                                \"defaultValue\": \"true\",\n+                                \"description\": \"If set to true, the event will be validated against the CEF standard (revision 23). If the event is invalid, the FlowFile will be routed to the failure relationship. If this property is set to false, the event will be processed without validating the data.\",\n+                                \"displayName\": \"Validate the CEF event\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Time Duration\",\n+                                \"name\": \"VALIDATE_DATA\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             }\n                         },\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.processors.standard.ParseSyslog\"\n+                        ],\n                         \"sideEffectFree\": true,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"FlowFiles are transferred to this relationship under normal conditions\",\n+                                \"description\": \"Any FlowFile that is successfully parsed as a CEF message will be transferred to this Relationship.\",\n                                 \"name\": \"success\"\n                             },\n                             {\n-                                \"description\": \"FlowFiles will be routed to this relationship if they are missing a necessary Rate Controlled Attribute or the attribute is not in the expected format\",\n+                                \"description\": \"Any FlowFile that could not be parsed as a CEF message will be transferred to this Relationship without any attributes being added\",\n                                 \"name\": \"failure\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n+                            \"CRON_DRIVEN\",\n+                            \"EVENT_DRIVEN\"\n                         ],\n-                        \"supportsBatching\": false,\n+                        \"supportsBatching\": true,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": false,\n+                        \"supportsEventDriven\": true,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"rate\",\n-                            \"rate control\",\n-                            \"throttle\",\n-                            \"throughput\"\n+                            \"attributes\",\n+                            \"cef\",\n+                            \"event\",\n+                            \"logs\",\n+                            \"message\",\n+                            \"system\"\n                         ],\n-                        \"triggerSerially\": true,\n+                        \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.standard.ControlRate\",\n-                        \"typeDescription\": \"Controls the rate at which data is transferred to follow-on processors. If you configure a very small Time Duration, then the accuracy of the throttle gets worse. You can improve this accuracy by decreasing the Yield Duration, at the expense of more Tasks given to the processor.\",\n-                        \"version\": \"1.27.0\"\n+                        \"type\": \"org.apache.nifi.processors.standard.ParseCEF\",\n+                        \"typeDescription\": \"Parses the contents of a CEF formatted message and adds attributes to the FlowFile for headers and extensions of the parts of the CEF message.\\nNote: This Processor expects CEF messages WITHOUT the syslog headers (i.e. starting at \\\"CEF:0\\\"\",\n+                        \"version\": \"1.27.0\",\n+                        \"writesAttributes\": [\n+                            {\n+                                \"description\": \"The version of the CEF message.\",\n+                                \"name\": \"cef.header.version\"\n+                            },\n+                            {\n+                                \"description\": \"The Device Vendor of the CEF message.\",\n+                                \"name\": \"cef.header.deviceVendor\"\n+                            },\n+                            {\n+                                \"description\": \"The Device Product of the CEF message.\",\n+                                \"name\": \"cef.header.deviceProduct\"\n+                            },\n+                            {\n+                                \"description\": \"The Device Version of the CEF message.\",\n+                                \"name\": \"cef.header.deviceVersion\"\n+                            },\n+                            {\n+                                \"description\": \"The Device Event Class ID of the CEF message.\",\n+                                \"name\": \"cef.header.deviceEventClassId\"\n+                            },\n+                            {\n+                                \"description\": \"The name of the CEF message.\",\n+                                \"name\": \"cef.header.name\"\n+                            },\n+                            {\n+                                \"description\": \"The severity of the CEF message.\",\n+                                \"name\": \"cef.header.severity\"\n+                            },\n+                            {\n+                                \"description\": \"The key and value generated by the parsing of the message.\",\n+                                \"name\": \"cef.extension.*\"\n+                            }\n+                        ]\n                     },\n                     {\n                         \"additionalDetails\": false,\n                         \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n@@ -96142,400 +96067,280 @@\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Input Character Set\": {\n-                                \"description\": \"The name of the CharacterSet to expect for Input\",\n-                                \"displayName\": \"Input Character Set\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Input Character Set\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Output Character Set\": {\n-                                \"description\": \"The name of the CharacterSet to convert to\",\n-                                \"displayName\": \"Output Character Set\",\n+                            \"Character Set\": {\n+                                \"defaultValue\": \"UTF-8\",\n+                                \"description\": \"Specifies which character set of the Syslog messages\",\n+                                \"displayName\": \"Character Set\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Output Character Set\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Character Set\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             }\n                         },\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.processors.standard.ListenSyslog\",\n+                            \"org.apache.nifi.processors.standard.PutSyslog\"\n+                        ],\n                         \"sideEffectFree\": true,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"\",\n+                                \"description\": \"Any FlowFile that is successfully parsed as a Syslog message will be to this Relationship.\",\n                                 \"name\": \"success\"\n+                            },\n+                            {\n+                                \"description\": \"Any FlowFile that could not be parsed as a Syslog message will be transferred to this Relationship without any attributes being added\",\n+                                \"name\": \"failure\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\",\n                             \"EVENT_DRIVEN\"\n                         ],\n                         \"supportsBatching\": true,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsEventDriven\": true,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"character set\",\n-                            \"characterset\",\n-                            \"convert\",\n-                            \"text\"\n+                            \"attributes\",\n+                            \"event\",\n+                            \"logs\",\n+                            \"message\",\n+                            \"syslog\",\n+                            \"system\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.standard.ConvertCharacterSet\",\n-                        \"typeDescription\": \"Converts a FlowFile's content from one character set to another\",\n-                        \"version\": \"1.27.0\"\n+                        \"type\": \"org.apache.nifi.processors.standard.ParseSyslog\",\n+                        \"typeDescription\": \"Attempts to parses the contents of a Syslog message in accordance to RFC5424 and RFC3164 formats and adds attributes to the FlowFile for each of the parts of the Syslog message.Note: Be mindfull that RFC3164 is informational and a wide range of different implementations are present in the wild. If messages fail parsing, considering using RFC5424 or using a generic parsing processors such as ExtractGrok.\",\n+                        \"version\": \"1.27.0\",\n+                        \"writesAttributes\": [\n+                            {\n+                                \"description\": \"The priority of the Syslog message.\",\n+                                \"name\": \"syslog.priority\"\n+                            },\n+                            {\n+                                \"description\": \"The severity of the Syslog message derived from the priority.\",\n+                                \"name\": \"syslog.severity\"\n+                            },\n+                            {\n+                                \"description\": \"The facility of the Syslog message derived from the priority.\",\n+                                \"name\": \"syslog.facility\"\n+                            },\n+                            {\n+                                \"description\": \"The optional version from the Syslog message.\",\n+                                \"name\": \"syslog.version\"\n+                            },\n+                            {\n+                                \"description\": \"The timestamp of the Syslog message.\",\n+                                \"name\": \"syslog.timestamp\"\n+                            },\n+                            {\n+                                \"description\": \"The hostname or IP address of the Syslog message.\",\n+                                \"name\": \"syslog.hostname\"\n+                            },\n+                            {\n+                                \"description\": \"The hostname of the Syslog server that sent the message.\",\n+                                \"name\": \"syslog.sender\"\n+                            },\n+                            {\n+                                \"description\": \"The body of the Syslog message, everything after the hostname.\",\n+                                \"name\": \"syslog.body\"\n+                            }\n+                        ]\n                     },\n                     {\n                         \"additionalDetails\": false,\n                         \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n+                            \"EVENT_DRIVEN\": 0,\n                             \"TIMER_DRIVEN\": 1\n                         },\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Catalog Name\": {\n-                                \"description\": \"The name of the catalog that the statement should update. This may not apply for the database that you are updating. In this case, leave the field empty\",\n-                                \"displayName\": \"Catalog Name\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Catalog Name\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"JDBC Connection Pool\": {\n-                                \"description\": \"Specifies the JDBC Connection Pool to use in order to convert the JSON message to a SQL statement. The Connection Pool is necessary in order to determine the appropriate database column types.\",\n-                                \"displayName\": \"JDBC Connection Pool\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"JDBC Connection Pool\",\n-                                \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.dbcp.DBCPService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            },\n-                            \"Schema Name\": {\n-                                \"description\": \"The name of the schema that the table belongs to. This may not apply for the database that you are updating. In this case, leave the field empty\",\n-                                \"displayName\": \"Schema Name\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Schema Name\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Statement Type\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"UPDATE\",\n-                                        \"value\": \"UPDATE\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"INSERT\",\n-                                        \"value\": \"INSERT\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"DELETE\",\n-                                        \"value\": \"DELETE\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Use statement.type Attribute\",\n-                                        \"value\": \"Use statement.type Attribute\"\n-                                    }\n-                                ],\n-                                \"description\": \"Specifies the type of SQL Statement to generate\",\n-                                \"displayName\": \"Statement Type\",\n+                            \"Character Set\": {\n+                                \"defaultValue\": \"UTF-8\",\n+                                \"description\": \"Specifies which character set of the Syslog messages\",\n+                                \"displayName\": \"Character Set\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Statement Type\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Table Name\": {\n-                                \"description\": \"The name of the table that the statement should update\",\n-                                \"displayName\": \"Table Name\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Table Name\",\n+                                \"name\": \"Character Set\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Translate Field Names\": {\n+                            \"include_policy\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"true\",\n                                         \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"false\",\n                                         \"value\": \"false\"\n                                     }\n                                 ],\n                                 \"defaultValue\": \"true\",\n-                                \"description\": \"If true, the Processor will attempt to translate JSON field names into the appropriate column names for the table specified. If false, the JSON field names must match the column names exactly, or the column will not be updated\",\n-                                \"displayName\": \"Translate Field Names\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Translate Field Names\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Unmatched Column Behavior\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"Any column in the database that does not have a field in the JSON document will be assumed to not be required.  No notification will be logged\",\n-                                        \"displayName\": \"Ignore Unmatched Columns\",\n-                                        \"value\": \"Ignore Unmatched Columns\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Any column in the database that does not have a field in the JSON document will be assumed to not be required.  A warning will be logged\",\n-                                        \"displayName\": \"Warn on Unmatched Columns\",\n-                                        \"value\": \"Warn on Unmatched Columns\"\n-                                    },\n-                                    {\n-                                        \"description\": \"A flow will fail if any column in the database that does not have a field in the JSON document.  An error will be logged\",\n-                                        \"displayName\": \"Fail on Unmatched Columns\",\n-                                        \"value\": \"Fail on Unmatched Columns\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"Fail on Unmatched Columns\",\n-                                \"description\": \"If an incoming JSON element does not have a field mapping for all of the database table's columns, this property specifies how to handle the situation\",\n-                                \"displayName\": \"Unmatched Column Behavior\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Unmatched Column Behavior\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Unmatched Field Behavior\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"Any field in the JSON document that cannot be mapped to a column in the database is ignored\",\n-                                        \"displayName\": \"Ignore Unmatched Fields\",\n-                                        \"value\": \"Ignore Unmatched Fields\"\n-                                    },\n-                                    {\n-                                        \"description\": \"If the JSON document has any field that cannot be mapped to a column in the database, the FlowFile will be routed to the failure relationship\",\n-                                        \"displayName\": \"Fail\",\n-                                        \"value\": \"Fail\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"Ignore Unmatched Fields\",\n-                                \"description\": \"If an incoming JSON element has a field that does not map to any of the database table's columns, this property specifies how to handle the situation\",\n-                                \"displayName\": \"Unmatched Field Behavior\",\n+                                \"description\": \"If true, then the Syslog Message body will be included in the attributes.\",\n+                                \"displayName\": \"Include Message Body in Attributes\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Unmatched Field Behavior\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Update Keys\": {\n-                                \"description\": \"A comma-separated list of column names that uniquely identifies a row in the database for UPDATE statements. If the Statement Type is UPDATE and this property is not set, the table's Primary Keys are used. In this case, if no Primary Key exists, the conversion to SQL will fail if Unmatched Column Behaviour is set to FAIL. This property is ignored if the Statement Type is INSERT\",\n-                                \"displayName\": \"Update Keys\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Update Keys\",\n+                                \"name\": \"include_policy\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"jts-quoted-identifiers\": {\n+                            \"nil_policy\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"description\": \"The missing field will not have an attribute added.\",\n+                                        \"displayName\": \"OMIT\",\n+                                        \"value\": \"OMIT\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"Enabling this option will cause all column names to be quoted, allowing you to use reserved words as column names in your tables.\",\n-                                \"displayName\": \"Quote Column Identifiers\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"jts-quoted-identifiers\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"jts-quoted-table-identifiers\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"description\": \"The missing field will have an empty attribute added.\",\n+                                        \"displayName\": \"NULL\",\n+                                        \"value\": \"NULL\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"description\": \"The missing field will have an attribute added with the value of '-'.\",\n+                                        \"displayName\": \"DASH\",\n+                                        \"value\": \"DASH\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"Enabling this option will cause the table name to be quoted to support the use of special characters in the table name\",\n-                                \"displayName\": \"Quote Table Identifiers\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"jts-quoted-table-identifiers\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"jts-sql-param-attr-prefix\": {\n-                                \"defaultValue\": \"sql\",\n-                                \"description\": \"The string to be prepended to the outgoing flow file attributes, such as <sql>.args.1.value, where <sql> is replaced with the specified value\",\n-                                \"displayName\": \"SQL Parameter Attribute Prefix\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"jts-sql-param-attr-prefix\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"table-schema-cache-size\": {\n-                                \"defaultValue\": \"100\",\n-                                \"description\": \"Specifies how many Table Schemas should be cached\",\n-                                \"displayName\": \"Table Schema Cache Size\",\n+                                \"defaultValue\": \"NULL\",\n+                                \"description\": \"Defines how NIL values are handled for header fields.\",\n+                                \"displayName\": \"NIL Policy\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"table-schema-cache-size\",\n+                                \"name\": \"nil_policy\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             }\n                         },\n                         \"seeAlso\": [\n-                            \"org.apache.nifi.processors.standard.PutDatabaseRecord\",\n-                            \"org.apache.nifi.processors.standard.PutSQL\"\n+                            \"org.apache.nifi.processors.standard.ListenSyslog\",\n+                            \"org.apache.nifi.processors.standard.ParseSyslog\",\n+                            \"org.apache.nifi.processors.standard.PutSyslog\"\n                         ],\n                         \"sideEffectFree\": true,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"A FlowFile is routed to this relationship when its contents have successfully been converted into a SQL statement\",\n-                                \"name\": \"sql\"\n+                                \"description\": \"Any FlowFile that is successfully parsed as a Syslog message will be to this Relationship.\",\n+                                \"name\": \"success\"\n                             },\n                             {\n-                                \"description\": \"A FlowFile is routed to this relationship if it cannot be converted into a SQL statement. Common causes include invalid JSON content or the JSON content missing a required field (if using an INSERT statement type).\",\n+                                \"description\": \"Any FlowFile that could not be parsed as a Syslog message will be transferred to this Relationship without any attributes being added\",\n                                 \"name\": \"failure\"\n-                            },\n-                            {\n-                                \"description\": \"When a FlowFile is converted to SQL, the original JSON FlowFile is routed to this relationship\",\n-                                \"name\": \"original\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n+                            \"CRON_DRIVEN\",\n+                            \"EVENT_DRIVEN\"\n                         ],\n                         \"supportsBatching\": true,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": false,\n+                        \"supportsEventDriven\": true,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"database\",\n-                            \"delete\",\n-                            \"flat\",\n-                            \"insert\",\n-                            \"json\",\n-                            \"rdbms\",\n-                            \"relational\",\n-                            \"sql\",\n-                            \"update\"\n+                            \"attributes\",\n+                            \"event\",\n+                            \"logs\",\n+                            \"message\",\n+                            \"syslog\",\n+                            \"syslog5424\",\n+                            \"system\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.standard.ConvertJSONToSQL\",\n-                        \"typeDescription\": \"Converts a JSON-formatted FlowFile into an UPDATE, INSERT, or DELETE SQL statement. The incoming FlowFile is expected to be \\\"flat\\\" JSON message, meaning that it consists of a single JSON element and each field maps to a simple type. If a field maps to a JSON object, that JSON object will be interpreted as Text. If the input is an array of JSON elements, each element in the array is output as a separate FlowFile to the 'sql' relationship. Upon successful conversion, the original FlowFile is routed to the 'original' relationship and the SQL is routed to the 'sql' relationship.\",\n+                        \"type\": \"org.apache.nifi.processors.standard.ParseSyslog5424\",\n+                        \"typeDescription\": \"Attempts to parse the contents of a well formed Syslog message in accordance to RFC5424 format and adds attributes to the FlowFile for each of the parts of the Syslog message, including Structured Data.Structured Data will be written to attributes as one attribute per item id + parameter see https://tools.ietf.org/html/rfc5424.Note: ParseSyslog5424 follows the specification more closely than ParseSyslog.  If your Syslog producer does not follow the spec closely, with regards to using '-' for missing header entries for example, those logs will fail with this parser, where they would not fail with ParseSyslog.\",\n                         \"version\": \"1.27.0\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"Sets mime.type of FlowFile that is routed to 'sql' to 'text/plain'.\",\n-                                \"name\": \"mime.type\"\n+                                \"description\": \"The priority of the Syslog message.\",\n+                                \"name\": \"syslog.priority\"\n                             },\n                             {\n-                                \"description\": \"Sets the <sql>.table attribute of FlowFile that is routed to 'sql' to the name of the table that is updated by the SQL statement. The prefix for this attribute ('sql', e.g.) is determined by the SQL Parameter Attribute Prefix property.\",\n-                                \"name\": \"<sql>.table\"\n+                                \"description\": \"The severity of the Syslog message derived from the priority.\",\n+                                \"name\": \"syslog.severity\"\n                             },\n                             {\n-                                \"description\": \"If the Catalog name is set for this database, specifies the name of the catalog that the SQL statement will update. If no catalog is used, this attribute will not be added. The prefix for this attribute ('sql', e.g.) is determined by the SQL Parameter Attribute Prefix property.\",\n-                                \"name\": \"<sql>.catalog\"\n+                                \"description\": \"The facility of the Syslog message derived from the priority.\",\n+                                \"name\": \"syslog.facility\"\n                             },\n                             {\n-                                \"description\": \"All FlowFiles routed to the 'sql' relationship for the same incoming FlowFile (multiple will be output for the same incoming FlowFile if the incoming FlowFile is a JSON Array) will have the same value for the fragment.identifier attribute. This can then be used to correlate the results.\",\n-                                \"name\": \"fragment.identifier\"\n+                                \"description\": \"The optional version from the Syslog message.\",\n+                                \"name\": \"syslog.version\"\n                             },\n                             {\n-                                \"description\": \"The number of SQL FlowFiles that were produced for same incoming FlowFile. This can be used in conjunction with the fragment.identifier attribute in order to know how many FlowFiles belonged to the same incoming FlowFile.\",\n-                                \"name\": \"fragment.count\"\n+                                \"description\": \"The timestamp of the Syslog message.\",\n+                                \"name\": \"syslog.timestamp\"\n                             },\n                             {\n-                                \"description\": \"The position of this FlowFile in the list of outgoing FlowFiles that were all derived from the same incoming FlowFile. This can be used in conjunction with the fragment.identifier and fragment.count attributes to know which FlowFiles originated from the same incoming FlowFile and in what order the SQL FlowFiles were produced\",\n-                                \"name\": \"fragment.index\"\n+                                \"description\": \"The hostname or IP address of the Syslog message.\",\n+                                \"name\": \"syslog.hostname\"\n                             },\n                             {\n-                                \"description\": \"The output SQL statements are parametrized in order to avoid SQL Injection Attacks. The types of the Parameters to use are stored in attributes named <sql>.args.1.type, <sql>.args.2.type, <sql>.args.3.type, and so on. The type is a number representing a JDBC Type constant. Generally, this is useful only for software to read and interpret but is added so that a processor such as PutSQL can understand how to interpret the values. The prefix for this attribute ('sql', e.g.) is determined by the SQL Parameter Attribute Prefix property.\",\n-                                \"name\": \"<sql>.args.N.type\"\n+                                \"description\": \"The appname of the Syslog message.\",\n+                                \"name\": \"syslog.appname\"\n                             },\n                             {\n-                                \"description\": \"The output SQL statements are parametrized in order to avoid SQL Injection Attacks. The values of the Parameters to use are stored in the attributes named sql.args.1.value, sql.args.2.value, sql.args.3.value, and so on. Each of these attributes has a corresponding <sql>.args.N.type attribute that indicates how the value should be interpreted when inserting it into the database.The prefix for this attribute ('sql', e.g.) is determined by the SQL Parameter Attribute Prefix property.\",\n-                                \"name\": \"<sql>.args.N.value\"\n+                                \"description\": \"The procid of the Syslog message.\",\n+                                \"name\": \"syslog.procid\"\n+                            },\n+                            {\n+                                \"description\": \"The messageid the Syslog message.\",\n+                                \"name\": \"syslog.messageid\"\n+                            },\n+                            {\n+                                \"description\": \"Multiple entries per structuredData of the Syslog message.\",\n+                                \"name\": \"syslog.structuredData\"\n+                            },\n+                            {\n+                                \"description\": \"The hostname of the Syslog server that sent the message.\",\n+                                \"name\": \"syslog.sender\"\n+                            },\n+                            {\n+                                \"description\": \"The body of the Syslog message, everything after the hostname.\",\n+                                \"name\": \"syslog.body\"\n                             }\n                         ]\n                     },\n                     {\n-                        \"additionalDetails\": false,\n+                        \"additionalDetails\": true,\n                         \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n@@ -96545,41 +96350,26 @@\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n+                        \"dynamicProperties\": [\n+                            {\n+                                \"description\": \"Each dynamic property represents a RecordPath that will be evaluated against each record in an incoming FlowFile. When the value of the RecordPath is determined for a Record, an attribute is added to the outgoing FlowFile. The name of the attribute is the same as the name of this property. The value of the attribute is the same as the value of the field in the Record that the RecordPath points to. Note that no attribute will be added if the value returned for the RecordPath is null or is not a scalar value (i.e., the value is an Array, Map, or Record).\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"name\": \"The name given to the dynamic property is the name of the attribute that will be used to denote the value of the associated RecordPath.\",\n+                                \"value\": \"A RecordPath that points to a field in the Record.\"\n+                            }\n+                        ],\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"include-zero-record-flowfiles\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"true\",\n-                                \"description\": \"When converting an incoming FlowFile, if the conversion results in no data, this property specifies whether or not a FlowFile will be sent to the corresponding relationship\",\n-                                \"displayName\": \"Include Zero Record FlowFiles\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"include-zero-record-flowfiles\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n                             \"record-reader\": {\n                                 \"description\": \"Specifies the Controller Service to use for reading incoming data\",\n                                 \"displayName\": \"Record Reader\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n                                 \"name\": \"record-reader\",\n@@ -96605,329 +96395,367 @@\n                                     \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n                                     \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             }\n                         },\n-                        \"sideEffectFree\": true,\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.processors.standard.ConvertRecord\",\n+                            \"org.apache.nifi.processors.standard.QueryRecord\",\n+                            \"org.apache.nifi.processors.standard.SplitRecord\",\n+                            \"org.apache.nifi.processors.standard.UpdateRecord\"\n+                        ],\n+                        \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"FlowFiles that are successfully transformed will be routed to this relationship\",\n+                                \"description\": \"FlowFiles that are successfully partitioned will be routed to this relationship\",\n                                 \"name\": \"success\"\n                             },\n                             {\n-                                \"description\": \"If a FlowFile cannot be transformed from the configured input format to the configured output format, the unchanged FlowFile will be routed to this relationship\",\n+                                \"description\": \"If a FlowFile cannot be partitioned from the configured input format to the configured output format, the unchanged FlowFile will be routed to this relationship\",\n                                 \"name\": \"failure\"\n+                            },\n+                            {\n+                                \"description\": \"Once all records in an incoming FlowFile have been partitioned, the original FlowFile is routed to this relationship.\",\n+                                \"name\": \"original\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\",\n                             \"EVENT_DRIVEN\"\n                         ],\n                         \"supportsBatching\": true,\n-                        \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicProperties\": true,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsEventDriven\": true,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"avro\",\n-                            \"convert\",\n-                            \"csv\",\n-                            \"freeform\",\n-                            \"generic\",\n-                            \"json\",\n-                            \"log\",\n-                            \"logs\",\n+                            \"bin\",\n+                            \"group\",\n+                            \"organize\",\n+                            \"partition\",\n                             \"record\",\n-                            \"schema\",\n-                            \"text\"\n+                            \"recordpath\",\n+                            \"rpath\",\n+                            \"segment\",\n+                            \"split\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.standard.ConvertRecord\",\n-                        \"typeDescription\": \"Converts records from one data format to another using configured Record Reader and Record Write Controller Services. The Reader and Writer must be configured with \\\"matching\\\" schemas. By this, we mean the schemas must have the same field names. The types of the fields do not have to be the same if a field value can be coerced from one type to another. For instance, if the input schema has a field named \\\"balance\\\" of type double, the output schema can have a field named \\\"balance\\\" with a type of string, double, or float. If any field is present in the input that is not present in the output, the field will be left out of the output. If any field is specified in the output schema but is not present in the input data/schema, then the field will not be present in the output or will have a null value, depending on the writer.\",\n+                        \"type\": \"org.apache.nifi.processors.standard.PartitionRecord\",\n+                        \"typeDescription\": \"Splits, or partitions, record-oriented data based on the configured fields in the data. One or more properties must be added. The name of the property is the name of an attribute to add. The value of the property is a RecordPath to evaluate against each Record. Two records will go to the same outbound FlowFile only if they have the same value for each of the given RecordPaths. Because we know that all records in a given output FlowFile have the same value for the fields that are specified by the RecordPath, an attribute is added for each field. See Additional Details on the Usage page for more information and examples.\",\n                         \"version\": \"1.27.0\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"Sets the mime.type attribute to the MIME Type specified by the Record Writer\",\n+                                \"description\": \"The number of records in an outgoing FlowFile\",\n+                                \"name\": \"record.count\"\n+                            },\n+                            {\n+                                \"description\": \"The MIME Type that the configured Record Writer indicates is appropriate\",\n                                 \"name\": \"mime.type\"\n                             },\n                             {\n-                                \"description\": \"The number of records in the FlowFile\",\n-                                \"name\": \"record.count\"\n+                                \"description\": \"All partitioned FlowFiles produced from the same parent FlowFile will have the same randomly generated UUID added for this attribute\",\n+                                \"name\": \"fragment.identifier\"\n                             },\n                             {\n-                                \"description\": \"This attribute provides on failure the error message encountered by the Reader or Writer.\",\n-                                \"name\": \"record.error.message\"\n+                                \"description\": \"A one-up number that indicates the ordering of the partitioned FlowFiles that were created from a single parent FlowFile\",\n+                                \"name\": \"fragment.index\"\n+                            },\n+                            {\n+                                \"description\": \"The number of partitioned FlowFiles generated from the parent FlowFile\",\n+                                \"name\": \"fragment.count\"\n+                            },\n+                            {\n+                                \"description\": \"The filename of the parent FlowFile\",\n+                                \"name\": \"segment.original.filename \"\n+                            },\n+                            {\n+                                \"description\": \"For each dynamic property that is added, an attribute may be added to the FlowFile. See the description for Dynamic Properties for more information.\",\n+                                \"name\": \"<dynamic property name>\"\n                             }\n                         ]\n                     },\n                     {\n                         \"additionalDetails\": false,\n                         \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n-                            \"EVENT_DRIVEN\": 0,\n                             \"TIMER_DRIVEN\": 1\n                         },\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n+                        \"deprecated\": true,\n+                        \"deprecationAlternatives\": [\n+                            \"org.apache.nifi.processors.standard.InvokeHTTP\"\n+                        ],\n+                        \"deprecationReason\": \"This processor is deprecated and may be removed in future releases.\",\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"ajust-immediately\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"If true, the counter will be updated immediately, without regard to whether the ProcessSession is commit or rolled back;otherwise, the counter will be incremented only if and when the ProcessSession is committed.\",\n-                                \"displayName\": \"Call Immediate Adjustment\",\n+                            \"Attributes to Send as HTTP Headers (Regex)\": {\n+                                \"description\": \"Specifies the Regular Expression that determines the names of FlowFile attributes that should be sent as HTTP Headers\",\n+                                \"displayName\": \"Attributes to Send as HTTP Headers (Regex)\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"ajust-immediately\",\n-                                \"required\": true,\n+                                \"name\": \"Attributes to Send as HTTP Headers (Regex)\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"character-encoding\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"ISO-8859-1\",\n-                                        \"value\": \"ISO-8859-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"UTF-8\",\n-                                        \"value\": \"UTF-8\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"UTF-16\",\n-                                        \"value\": \"UTF-16\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"UTF-16LE\",\n-                                        \"value\": \"UTF-16LE\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"UTF-16BE\",\n-                                        \"value\": \"UTF-16BE\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"US-ASCII\",\n-                                        \"value\": \"US-ASCII\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"UTF-8\",\n-                                \"description\": \"Specifies a character encoding to use.\",\n-                                \"displayName\": \"Character Encoding\",\n+                            \"Compression Level\": {\n+                                \"defaultValue\": \"0\",\n+                                \"description\": \"Determines the GZIP Compression Level to use when sending the file; the value must be in the range of 0-9. A value of 0 indicates that the file will not be GZIP'ed\",\n+                                \"displayName\": \"Compression Level\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"character-encoding\",\n+                                \"name\": \"Compression Level\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"split-words-on-symbols\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"If enabled, the word count will identify strings separated by common logical delimiters [ _ - . ] as independent words (ex. split-words-on-symbols = 4 words).\",\n-                                \"displayName\": \"Split Words on Symbols\",\n+                            \"Connection Timeout\": {\n+                                \"defaultValue\": \"30 sec\",\n+                                \"description\": \"How long to wait when attempting to connect to the remote server before giving up\",\n+                                \"displayName\": \"Connection Timeout\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"split-words-on-symbols\",\n+                                \"name\": \"Connection Timeout\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"text-character-count\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"If enabled, will count the number of characters (including whitespace and symbols, but not including newlines and carriage returns) present in the incoming text.\",\n-                                \"displayName\": \"Count Characters\",\n+                            \"Content-Type\": {\n+                                \"defaultValue\": \"${mime.type}\",\n+                                \"description\": \"The Content-Type to specify for the content of the FlowFile being POSTed if Send as FlowFile is false. In the case of an empty value after evaluating an expression language expression, Content-Type defaults to application/octet-stream\",\n+                                \"displayName\": \"Content-Type\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Content-Type\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Data Timeout\": {\n+                                \"defaultValue\": \"30 sec\",\n+                                \"description\": \"How long to wait between receiving segments of data from the remote server before giving up and discarding the partial file\",\n+                                \"displayName\": \"Data Timeout\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"text-character-count\",\n+                                \"name\": \"Data Timeout\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"text-line-count\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"true\",\n-                                \"description\": \"If enabled, will count the number of lines present in the incoming text.\",\n-                                \"displayName\": \"Count Lines\",\n+                            \"Max Batch Size\": {\n+                                \"defaultValue\": \"100 MB\",\n+                                \"description\": \"If the Send as FlowFile property is true, specifies the max data size for a batch of FlowFiles to send in a single HTTP POST. If not specified, each FlowFile will be sent separately. If the Send as FlowFile property is false, this property is ignored\",\n+                                \"displayName\": \"Max Batch Size\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"text-line-count\",\n-                                \"required\": true,\n+                                \"name\": \"Max Batch Size\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"text-line-nonempty-count\": {\n+                            \"Max Data to Post per Second\": {\n+                                \"description\": \"The maximum amount of data to send per second; this allows the bandwidth to be throttled to a specified data rate; if not specified, the data rate is not throttled\",\n+                                \"displayName\": \"Max Data to Post per Second\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Max Data to Post per Second\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Password\": {\n+                                \"description\": \"Password required to access the URL\",\n+                                \"displayName\": \"Password\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Password\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n+                            },\n+                            \"Proxy Host\": {\n+                                \"description\": \"The fully qualified hostname or IP address of the proxy server\",\n+                                \"displayName\": \"Proxy Host\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Proxy Host\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Proxy Port\": {\n+                                \"description\": \"The port of the proxy server\",\n+                                \"displayName\": \"Proxy Port\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Proxy Port\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"SSL Context Service\": {\n+                                \"description\": \"The Controller Service to use in order to obtain an SSL Context\",\n+                                \"displayName\": \"SSL Context Service\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"SSL Context Service\",\n+                                \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"Send as FlowFile\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"true\",\n                                         \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"false\",\n                                         \"value\": \"false\"\n                                     }\n                                 ],\n                                 \"defaultValue\": \"false\",\n-                                \"description\": \"If enabled, will count the number of lines that contain a non-whitespace character present in the incoming text.\",\n-                                \"displayName\": \"Count Non-Empty Lines\",\n+                                \"description\": \"If true, will package the FlowFile's contents and attributes together and send the FlowFile Package; otherwise, will send only the FlowFile's content\",\n+                                \"displayName\": \"Send as FlowFile\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"text-line-nonempty-count\",\n+                                \"name\": \"Send as FlowFile\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"text-word-count\": {\n+                            \"URL\": {\n+                                \"description\": \"The URL to POST to. The URL may be defined using the Attribute Expression Language. A separate connection pool will be created for each unique host:port combination.\",\n+                                \"displayName\": \"URL\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"URL\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Use Chunked Encoding\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"true\",\n                                         \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"false\",\n                                         \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"If enabled, will count the number of words (alphanumeric character groups bounded by whitespace) present in the incoming text. Common logical delimiters [_-.] do not bound a word unless 'Split Words on Symbols' is true.\",\n-                                \"displayName\": \"Count Words\",\n+                                \"description\": \"Specifies whether or not to use Chunked Encoding to send the data. This property is ignored in the event the contents are compressed or sent as FlowFiles.\",\n+                                \"displayName\": \"Use Chunked Encoding\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"text-word-count\",\n-                                \"required\": true,\n+                                \"name\": \"Use Chunked Encoding\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"User Agent\": {\n+                                \"defaultValue\": \"Apache-HttpClient/4.5.14 (Java/1.8.0_422)\",\n+                                \"description\": \"What to report as the User Agent when we connect to the remote server\",\n+                                \"displayName\": \"User Agent\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"User Agent\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Username\": {\n+                                \"description\": \"Username required to access the URL\",\n+                                \"displayName\": \"Username\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Username\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n+                            },\n+                            \"proxy-configuration-service\": {\n+                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests. If set, it supersedes proxy settings configured per component. Supported proxies: HTTP + AuthN\",\n+                                \"displayName\": \"Proxy Configuration Service\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"proxy-configuration-service\",\n+                                \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.proxy.ProxyConfigurationService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n                             }\n                         },\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.processors.standard.SplitText\"\n-                        ],\n-                        \"sideEffectFree\": true,\n+                        \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"The flowfile contains the original content with one or more attributes added containing the respective counts\",\n+                                \"description\": \"Files that are successfully send will be transferred to success\",\n                                 \"name\": \"success\"\n                             },\n                             {\n-                                \"description\": \"If the flowfile text cannot be counted for some reason, the original file will be routed to this destination and nothing will be routed elsewhere\",\n+                                \"description\": \"Files that fail to send will transferred to failure\",\n                                 \"name\": \"failure\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\",\n-                            \"EVENT_DRIVEN\"\n+                            \"CRON_DRIVEN\"\n                         ],\n                         \"supportsBatching\": true,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": true,\n+                        \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"character\",\n-                            \"count\",\n-                            \"line\",\n-                            \"text\",\n-                            \"word\"\n+                            \"archive\",\n+                            \"copy\",\n+                            \"http\",\n+                            \"https\",\n+                            \"remote\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.standard.CountText\",\n-                        \"typeDescription\": \"Counts various metrics on incoming text. The requested results will be recorded as attributes. The resulting flowfile will not have its content modified.\",\n-                        \"version\": \"1.27.0\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"The number of lines of text present in the FlowFile content\",\n-                                \"name\": \"text.line.count\"\n-                            },\n-                            {\n-                                \"description\": \"The number of lines of text (with at least one non-whitespace character) present in the original FlowFile\",\n-                                \"name\": \"text.line.nonempty.count\"\n-                            },\n-                            {\n-                                \"description\": \"The number of words present in the original FlowFile\",\n-                                \"name\": \"text.word.count\"\n-                            },\n-                            {\n-                                \"description\": \"The number of characters (given the specified character encoding) present in the original FlowFile\",\n-                                \"name\": \"text.character.count\"\n-                            }\n-                        ]\n+                        \"type\": \"org.apache.nifi.processors.standard.PostHTTP\",\n+                        \"typeDescription\": \"Please be aware this processor is deprecated and may be removed in the near future. Use InvokeHTTP instead. Performs an HTTP Post with the content of the FlowFile. Uses a connection pool with max number of connections equal to the number of possible endpoints multiplied by the Concurrent Tasks configuration.\",\n+                        \"version\": \"1.27.0\"\n                     },\n                     {\n                         \"additionalDetails\": false,\n                         \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n@@ -96940,259 +96768,564 @@\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n-                        \"deprecated\": true,\n-                        \"deprecationAlternatives\": [\n-                            \"org.apache.nifi.processors.attributes.UpdateAttribute\"\n-                        ],\n-                        \"deprecationReason\": \"UpdateAttribute can be configured using the hash Expression Language function to digest one or more attributes\",\n-                        \"dynamicProperties\": [\n-                            {\n-                                \"description\": \"The property name defines the attribute to look for and hash in the incoming flowfile. The property value defines the name to give the generated attribute. Attribute names must be unique.\",\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"name\": \"A flowfile attribute key for attribute inspection\",\n-                                \"value\": \"Attribute Name\"\n-                            }\n-                        ],\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"character_set\": {\n+                            \"Data Record Path\": {\n+                                \"description\": \"If specified, this property denotes a RecordPath that will be evaluated against each incoming Record and the Record that results from evaluating the RecordPath will be sent to the database instead of sending the entire incoming Record. If not specified, the entire incoming Record will be published to the database.\",\n+                                \"displayName\": \"Data Record Path\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Data Record Path\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Statement Type Record Path\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"Use Record Path\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Statement Type\",\n+                                        \"propertyName\": \"put-db-record-statement-type\"\n+                                    }\n+                                ],\n+                                \"description\": \"Specifies a RecordPath to evaluate against each Record in order to determine the Statement Type. The RecordPath should equate to either INSERT, UPDATE, UPSERT, or DELETE.\",\n+                                \"displayName\": \"Statement Type Record Path\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Statement Type Record Path\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"database-session-autocommit\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"US-ASCII\",\n-                                        \"displayName\": \"US-ASCII\",\n-                                        \"value\": \"US-ASCII\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n-                                        \"description\": \"ISO-8859-1\",\n-                                        \"displayName\": \"ISO-8859-1\",\n-                                        \"value\": \"ISO-8859-1\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"The autocommit mode to set on the database connection being used. If set to false, the operation(s) will be explicitly committed or rolled back (based on success or failure respectively). If set to true, the driver/database automatically handles the commit/rollback. Setting this property to 'No value' will leave the database connection's autocommit mode unmodified.\",\n+                                \"displayName\": \"Database Session AutoCommit\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"database-session-autocommit\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"db-type\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"Generates ANSI SQL\",\n+                                        \"displayName\": \"Generic\",\n+                                        \"value\": \"Generic\"\n                                     },\n                                     {\n-                                        \"description\": \"UTF-8\",\n-                                        \"displayName\": \"UTF-8\",\n-                                        \"value\": \"UTF-8\"\n+                                        \"description\": \"Generates Oracle compliant SQL\",\n+                                        \"displayName\": \"Oracle\",\n+                                        \"value\": \"Oracle\"\n                                     },\n                                     {\n-                                        \"description\": \"UTF-16BE\",\n-                                        \"displayName\": \"UTF-16BE\",\n-                                        \"value\": \"UTF-16BE\"\n+                                        \"description\": \"Generates Oracle compliant SQL for version 12 or greater\",\n+                                        \"displayName\": \"Oracle 12+\",\n+                                        \"value\": \"Oracle 12+\"\n                                     },\n                                     {\n-                                        \"description\": \"UTF-16LE\",\n-                                        \"displayName\": \"UTF-16LE\",\n-                                        \"value\": \"UTF-16LE\"\n+                                        \"description\": \"Generates MS SQL Compatible SQL, for version 2012 or greater\",\n+                                        \"displayName\": \"MS SQL 2012+\",\n+                                        \"value\": \"MS SQL 2012+\"\n                                     },\n                                     {\n-                                        \"description\": \"This character set normally decodes using an optional BOM at the beginning of the data but encodes by inserting a BE BOM. For hashing, it will be replaced with UTF-16BE. \",\n-                                        \"displayName\": \"UTF-16\",\n-                                        \"value\": \"UTF-16\"\n+                                        \"description\": \"Generates MS SQL Compatible SQL for version 2008\",\n+                                        \"displayName\": \"MS SQL 2008\",\n+                                        \"value\": \"MS SQL 2008\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Generates MySQL compatible SQL\",\n+                                        \"displayName\": \"MySQL\",\n+                                        \"value\": \"MySQL\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Generates PostgreSQL compatible SQL\",\n+                                        \"displayName\": \"PostgreSQL\",\n+                                        \"value\": \"PostgreSQL\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Generates Phoenix compliant SQL\",\n+                                        \"displayName\": \"Phoenix\",\n+                                        \"value\": \"Phoenix\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"UTF-8\",\n-                                \"description\": \"The Character Set used to decode the attribute being hashed -- this applies to the incoming data encoding, not the resulting hash encoding. \",\n-                                \"displayName\": \"Character Set\",\n+                                \"defaultValue\": \"Generic\",\n+                                \"description\": \"The type/flavor of database, used for generating database-specific code. In many cases the Generic type should suffice, but some databases (such as Oracle) require custom SQL clauses. \",\n+                                \"displayName\": \"Database Type\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"character_set\",\n-                                \"required\": true,\n+                                \"name\": \"db-type\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"fail_when_empty\": {\n+                            \"put-db-record-allow-multiple-statements\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"true\",\n                                         \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"false\",\n                                         \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"true\",\n-                                \"description\": \"Route to failure when none of the attributes that are configured for hashing are found. If set to false, then flow files that do not contain any of the attributes that are configured for hashing will just pass through to success.\",\n-                                \"displayName\": \"Fail when no attributes present\",\n+                                \"defaultValue\": \"false\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"Use statement.type Attribute\",\n+                                            \"Use Record Path\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Statement Type\",\n+                                        \"propertyName\": \"put-db-record-statement-type\"\n+                                    }\n+                                ],\n+                                \"description\": \"If the Statement Type is 'SQL' (as set in the statement.type attribute), this field indicates whether to split the field value by a semicolon and execute each statement separately. If any statement causes an error, the entire set of statements will be rolled back. If the Statement Type is not 'SQL', this field is ignored.\",\n+                                \"displayName\": \"Allow Multiple SQL Statements\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"fail_when_empty\",\n+                                \"name\": \"put-db-record-allow-multiple-statements\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"hash_algorithm\": {\n+                            \"put-db-record-binary-format\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"MD2 (16 byte output) [WARNING -- Cryptographically broken] Cryptographically broken due to collisions\",\n-                                        \"displayName\": \"MD2\",\n-                                        \"value\": \"MD2\"\n+                                        \"description\": \"String values for binary columns contain the original value as text via UTF-8 character encoding\",\n+                                        \"displayName\": \"UTF-8\",\n+                                        \"value\": \"UTF-8\"\n                                     },\n                                     {\n-                                        \"description\": \"MD5 (16 byte output) [WARNING -- Cryptographically broken] Cryptographically broken due to collisions\",\n-                                        \"displayName\": \"MD5\",\n-                                        \"value\": \"MD5\"\n+                                        \"description\": \"String values for binary columns contain the original value in hexadecimal format\",\n+                                        \"displayName\": \"Hexadecimal\",\n+                                        \"value\": \"Hexadecimal\"\n                                     },\n                                     {\n-                                        \"description\": \"SHA-1 (20 byte output) [WARNING -- Cryptographically broken] Cryptographically broken due to collisions\",\n-                                        \"displayName\": \"SHA-1\",\n-                                        \"value\": \"SHA-1\"\n-                                    },\n+                                        \"description\": \"String values for binary columns contain the original value in Base64 encoded format\",\n+                                        \"displayName\": \"Base64\",\n+                                        \"value\": \"Base64\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"UTF-8\",\n+                                \"description\": \"The format to be applied when decoding string values to binary.\",\n+                                \"displayName\": \"Binary String Format\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"put-db-record-binary-format\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"put-db-record-catalog-name\": {\n+                                \"description\": \"The name of the catalog that the statement should update. This may not apply for the database that you are updating. In this case, leave the field empty. Note that if the property is set and the database is case-sensitive, the catalog name must match the database's catalog name exactly.\",\n+                                \"displayName\": \"Catalog Name\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"put-db-record-catalog-name\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"put-db-record-dcbp-service\": {\n+                                \"description\": \"The Controller Service that is used to obtain a connection to the database for sending records.\",\n+                                \"displayName\": \"Database Connection Pooling Service\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"put-db-record-dcbp-service\",\n+                                \"required\": true,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.dbcp.DBCPService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"put-db-record-field-containing-sql\": {\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"SHA-224 (28 byte output) SHA-2 family\",\n-                                        \"displayName\": \"SHA-224\",\n-                                        \"value\": \"SHA-224\"\n-                                    },\n+                                        \"dependentValues\": [\n+                                            \"Use statement.type Attribute\",\n+                                            \"Use Record Path\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Statement Type\",\n+                                        \"propertyName\": \"put-db-record-statement-type\"\n+                                    }\n+                                ],\n+                                \"description\": \"If the Statement Type is 'SQL' (as set in the statement.type attribute), this field indicates which field in the record(s) contains the SQL statement to execute. The value of the field must be a single SQL statement. If the Statement Type is not 'SQL', this field is ignored.\",\n+                                \"displayName\": \"Field Containing SQL\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"put-db-record-field-containing-sql\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"put-db-record-max-batch-size\": {\n+                                \"defaultValue\": \"1000\",\n+                                \"description\": \"Specifies maximum number of sql statements to be included in each batch sent to the database. Zero means the batch size is not limited, and all statements are put into a single batch which can cause high memory usage issues for a very large number of statements.\",\n+                                \"displayName\": \"Maximum Batch Size\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"put-db-record-max-batch-size\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"put-db-record-query-timeout\": {\n+                                \"defaultValue\": \"0 seconds\",\n+                                \"description\": \"The maximum amount of time allowed for a running SQL statement , zero means there is no limit. Max time less than 1 second will be equal to zero.\",\n+                                \"displayName\": \"Max Wait Time\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"put-db-record-query-timeout\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"put-db-record-quoted-identifiers\": {\n+                                \"allowableValues\": [\n                                     {\n-                                        \"description\": \"SHA-256 (32 byte output) SHA-2 family\",\n-                                        \"displayName\": \"SHA-256\",\n-                                        \"value\": \"SHA-256\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n-                                        \"description\": \"SHA-384 (48 byte output) SHA-2 family\",\n-                                        \"displayName\": \"SHA-384\",\n-                                        \"value\": \"SHA-384\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"Enabling this option will cause all column names to be quoted, allowing you to use reserved words as column names in your tables.\",\n+                                \"displayName\": \"Quote Column Identifiers\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"put-db-record-quoted-identifiers\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"put-db-record-quoted-table-identifiers\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n-                                        \"description\": \"SHA-512 (64 byte output) SHA-2 family\",\n-                                        \"displayName\": \"SHA-512\",\n-                                        \"value\": \"SHA-512\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"Enabling this option will cause the table name to be quoted to support the use of special characters in the table name.\",\n+                                \"displayName\": \"Quote Table Identifiers\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"put-db-record-quoted-table-identifiers\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"put-db-record-record-reader\": {\n+                                \"description\": \"Specifies the Controller Service to use for parsing incoming data and determining the data's schema.\",\n+                                \"displayName\": \"Record Reader\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"put-db-record-record-reader\",\n+                                \"required\": true,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"put-db-record-schema-name\": {\n+                                \"description\": \"The name of the schema that the table belongs to. This may not apply for the database that you are updating. In this case, leave the field empty. Note that if the property is set and the database is case-sensitive, the schema name must match the database's schema name exactly.\",\n+                                \"displayName\": \"Schema Name\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"put-db-record-schema-name\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"put-db-record-statement-type\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"UPDATE\",\n+                                        \"value\": \"UPDATE\"\n                                     },\n                                     {\n-                                        \"description\": \"SHA-512/224 (28 byte output) SHA-2 using SHA-512 with truncated output\",\n-                                        \"displayName\": \"SHA-512/224\",\n-                                        \"value\": \"SHA-512/224\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"INSERT\",\n+                                        \"value\": \"INSERT\"\n                                     },\n                                     {\n-                                        \"description\": \"SHA-512/256 (32 byte output) SHA-2 using SHA-512 with truncated output\",\n-                                        \"displayName\": \"SHA-512/256\",\n-                                        \"value\": \"SHA-512/256\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"UPSERT\",\n+                                        \"value\": \"UPSERT\"\n                                     },\n                                     {\n-                                        \"description\": \"SHA3-224 (28 byte output) Keccak-based SHA3 family\",\n-                                        \"displayName\": \"SHA3-224\",\n-                                        \"value\": \"SHA3-224\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"INSERT_IGNORE\",\n+                                        \"value\": \"INSERT_IGNORE\"\n                                     },\n                                     {\n-                                        \"description\": \"SHA3-256 (32 byte output) Keccak-based SHA3 family\",\n-                                        \"displayName\": \"SHA3-256\",\n-                                        \"value\": \"SHA3-256\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"DELETE\",\n+                                        \"value\": \"DELETE\"\n                                     },\n                                     {\n-                                        \"description\": \"SHA3-384 (48 byte output) Keccak-based SHA3 family\",\n-                                        \"displayName\": \"SHA3-384\",\n-                                        \"value\": \"SHA3-384\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Use statement.type Attribute\",\n+                                        \"value\": \"Use statement.type Attribute\"\n                                     },\n                                     {\n-                                        \"description\": \"SHA3-512 (64 byte output) Keccak-based SHA3 family\",\n-                                        \"displayName\": \"SHA3-512\",\n-                                        \"value\": \"SHA3-512\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Use Record Path\",\n+                                        \"value\": \"Use Record Path\"\n+                                    }\n+                                ],\n+                                \"description\": \"Specifies the type of SQL Statement to generate. Please refer to the database documentation for a description of the behavior of each operation. Please note that some Database Types may not support certain Statement Types. If 'Use statement.type Attribute' is chosen, then the value is taken from the statement.type attribute in the FlowFile. The 'Use statement.type Attribute' option is the only one that allows the 'SQL' statement type. If 'SQL' is specified, the value of the field specified by the 'Field Containing SQL' property is expected to be a valid SQL statement on the target database, and will be executed as-is.\",\n+                                \"displayName\": \"Statement Type\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"put-db-record-statement-type\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"put-db-record-table-name\": {\n+                                \"description\": \"The name of the table that the statement should affect. Note that if the database is case-sensitive, the table name must match the database's table name exactly.\",\n+                                \"displayName\": \"Table Name\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"put-db-record-table-name\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"put-db-record-translate-field-names\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n-                                        \"description\": \"BLAKE2-160 (20 byte output) Also known as Blake2b\",\n-                                        \"displayName\": \"BLAKE2-160\",\n-                                        \"value\": \"BLAKE2-160\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"true\",\n+                                \"description\": \"If true, the Processor will attempt to translate field names into the appropriate column names for the table specified. If false, the field names must match the column names exactly, or the column will not be updated\",\n+                                \"displayName\": \"Translate Field Names\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"put-db-record-translate-field-names\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"put-db-record-unmatched-column-behavior\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"Any column in the database that does not have a field in the document will be assumed to not be required.  No notification will be logged\",\n+                                        \"displayName\": \"Ignore Unmatched Columns\",\n+                                        \"value\": \"Ignore Unmatched Columns\"\n                                     },\n                                     {\n-                                        \"description\": \"BLAKE2-256 (32 byte output) Also known as Blake2b\",\n-                                        \"displayName\": \"BLAKE2-256\",\n-                                        \"value\": \"BLAKE2-256\"\n+                                        \"description\": \"Any column in the database that does not have a field in the document will be assumed to not be required.  A warning will be logged\",\n+                                        \"displayName\": \"Warn on Unmatched Columns\",\n+                                        \"value\": \"Warn on Unmatched Columns\"\n                                     },\n                                     {\n-                                        \"description\": \"BLAKE2-384 (48 byte output) Also known as Blake2b\",\n-                                        \"displayName\": \"BLAKE2-384\",\n-                                        \"value\": \"BLAKE2-384\"\n+                                        \"description\": \"A flow will fail if any column in the database that does not have a field in the document.  An error will be logged\",\n+                                        \"displayName\": \"Fail on Unmatched Columns\",\n+                                        \"value\": \"Fail on Unmatched Columns\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"Fail on Unmatched Columns\",\n+                                \"description\": \"If an incoming record does not have a field mapping for all of the database table's columns, this property specifies how to handle the situation\",\n+                                \"displayName\": \"Unmatched Column Behavior\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"put-db-record-unmatched-column-behavior\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"put-db-record-unmatched-field-behavior\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"Any field in the document that cannot be mapped to a column in the database is ignored\",\n+                                        \"displayName\": \"Ignore Unmatched Fields\",\n+                                        \"value\": \"Ignore Unmatched Fields\"\n                                     },\n                                     {\n-                                        \"description\": \"BLAKE2-512 (64 byte output) Also known as Blake2b\",\n-                                        \"displayName\": \"BLAKE2-512\",\n-                                        \"value\": \"BLAKE2-512\"\n+                                        \"description\": \"If the document has any field that cannot be mapped to a column in the database, the FlowFile will be routed to the failure relationship\",\n+                                        \"displayName\": \"Fail on Unmatched Fields\",\n+                                        \"value\": \"Fail on Unmatched Fields\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"SHA-256\",\n-                                \"description\": \"The cryptographic hash algorithm to use. Note that not all of the algorithms available are recommended for use (some are provided for legacy use). There are many things to consider when picking an algorithm; it is recommended to use the most secure algorithm possible.\",\n-                                \"displayName\": \"Hash Algorithm\",\n+                                \"defaultValue\": \"Ignore Unmatched Fields\",\n+                                \"description\": \"If an incoming record has a field that does not map to any of the database table's columns, this property specifies how to handle the situation\",\n+                                \"displayName\": \"Unmatched Field Behavior\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"hash_algorithm\",\n-                                \"required\": true,\n+                                \"name\": \"put-db-record-unmatched-field-behavior\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"missing_attr_policy\": {\n+                            \"put-db-record-update-keys\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"Use statement.type Attribute\",\n+                                            \"Use Record Path\",\n+                                            \"UPSERT\",\n+                                            \"UPDATE\",\n+                                            \"SQL\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Statement Type\",\n+                                        \"propertyName\": \"put-db-record-statement-type\"\n+                                    }\n+                                ],\n+                                \"description\": \"A comma-separated list of column names that uniquely identifies a row in the database for UPDATE statements. If the Statement Type is UPDATE and this property is not set, the table's Primary Keys are used. In this case, if no Primary Key exists, the conversion to SQL will fail if Unmatched Column Behaviour is set to FAIL. This property is ignored if the Statement Type is INSERT\",\n+                                \"displayName\": \"Update Keys\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"put-db-record-update-keys\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"rollback-on-failure\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Do not route to failure if there are attributes configured for hashing that are not present in the flowfile\",\n-                                        \"displayName\": \"Allow missing attributes\",\n-                                        \"value\": \"ALLOW\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n-                                        \"description\": \"Route to failure if there are attributes configured for hashing that are not present in the flowfile\",\n-                                        \"displayName\": \"Fail if missing attributes\",\n-                                        \"value\": \"PROHIBIT\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"ALLOW\",\n-                                \"description\": \"Policy for how the processor handles attributes that are configured for hashing but are not found in the flowfile.\",\n-                                \"displayName\": \"Missing attribute policy\",\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"Specify how to handle error. By default (false), if an error occurs while processing a FlowFile, the FlowFile will be routed to 'failure' or 'retry' relationship based on error type, and processor can continue with next FlowFile. Instead, you may want to rollback currently processed FlowFiles and stop further processing immediately. In that case, you can do so by enabling this 'Rollback On Failure' property.  If enabled, failed FlowFiles will stay in the input relationship without penalizing it and being processed repeatedly until it gets processed successfully or removed by other means. It is important to set adequate 'Yield Duration' to avoid retrying too frequently.\",\n+                                \"displayName\": \"Rollback On Failure\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"missing_attr_policy\",\n+                                \"name\": \"rollback-on-failure\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"table-schema-cache-size\": {\n+                                \"defaultValue\": \"100\",\n+                                \"description\": \"Specifies how many Table Schemas should be cached\",\n+                                \"displayName\": \"Table Schema Cache Size\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"table-schema-cache-size\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             }\n                         },\n-                        \"sideEffectFree\": true,\n+                        \"readsAttributes\": [\n+                            {\n+                                \"description\": \"If 'Use statement.type Attribute' is selected for the Statement Type property, the value of this attribute will be used to determine the type of statement (INSERT, UPDATE, DELETE, SQL, etc.) to generate and execute.\",\n+                                \"name\": \"statement.type\"\n+                            }\n+                        ],\n+                        \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"Used for flowfiles that have a hash value added\",\n+                                \"description\": \"A FlowFile is routed to this relationship if the database cannot be updated but attempting the operation again may succeed\",\n+                                \"name\": \"retry\"\n+                            },\n+                            {\n+                                \"description\": \"Successfully created FlowFile from SQL query result set.\",\n                                 \"name\": \"success\"\n                             },\n                             {\n-                                \"description\": \"Used for flowfiles that are missing required attributes\",\n+                                \"description\": \"A FlowFile is routed to this relationship if the database cannot be updated and retrying the operation will also fail, such as an invalid query or an integrity constraint violation\",\n                                 \"name\": \"failure\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\",\n                             \"EVENT_DRIVEN\"\n                         ],\n-                        \"supportsBatching\": true,\n-                        \"supportsDynamicProperties\": true,\n+                        \"supportsBatching\": false,\n+                        \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsEventDriven\": true,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"attributes\",\n-                            \"blake2\",\n-                            \"cryptography\",\n-                            \"hash\",\n-                            \"keccak\",\n-                            \"md5\",\n-                            \"sha\"\n+                            \"database\",\n+                            \"delete\",\n+                            \"insert\",\n+                            \"jdbc\",\n+                            \"put\",\n+                            \"record\",\n+                            \"sql\",\n+                            \"update\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.standard.CryptographicHashAttribute\",\n-                        \"typeDescription\": \"Calculates a hash value for each of the specified attributes using the given algorithm and writes it to an output attribute. Please refer to https://csrc.nist.gov/Projects/Hash-Functions/NIST-Policy-on-Hash-Functions for help to decide which algorithm to use. \",\n+                        \"type\": \"org.apache.nifi.processors.standard.PutDatabaseRecord\",\n+                        \"typeDescription\": \"The PutDatabaseRecord processor uses a specified RecordReader to input (possibly multiple) records from an incoming flow file. These records are translated to SQL statements and executed as a single transaction. If any errors occur, the flow file is routed to failure or retry, and if the records are transmitted successfully, the incoming flow file is routed to success.  The type of statement executed by the processor is specified via the Statement Type property, which accepts some hard-coded values such as INSERT, UPDATE, and DELETE, as well as 'Use statement.type Attribute', which causes the processor to get the statement type from a flow file attribute.  IMPORTANT: If the Statement Type is UPDATE, then the incoming records must not alter the value(s) of the primary keys (or user-specified Update Keys). If such records are encountered, the UPDATE statement issued to the database may do nothing (if no existing records with the new primary key values are found), or could inadvertently corrupt the existing data (by changing records for which the new values of the primary keys exist).\",\n                         \"version\": \"1.27.0\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"This Processor adds an attribute whose value is the result of hashing the specified attribute. The name of this attribute is specified by the value of the dynamic property.\",\n-                                \"name\": \"<Specified Attribute Name per Dynamic Property>\"\n+                                \"description\": \"If an error occurs during processing, the flow file will be routed to failure or retry, and this attribute will be populated with the cause of the error.\",\n+                                \"name\": \"putdatabaserecord.error\"\n                             }\n                         ]\n                     },\n                     {\n                         \"additionalDetails\": false,\n                         \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n@@ -97211,872 +97344,974 @@\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"fail_when_empty\": {\n+                            \"Cache Entry Identifier\": {\n+                                \"description\": \"A FlowFile attribute, or the results of an Attribute Expression Language statement, which will be evaluated against a FlowFile in order to determine the cache key\",\n+                                \"displayName\": \"Cache Entry Identifier\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Cache Entry Identifier\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Cache update strategy\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"description\": \"Adds the specified entry to the cache, replacing any value that is currently set.\",\n+                                        \"displayName\": \"Replace if present\",\n+                                        \"value\": \"replace\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"description\": \"Adds the specified entry to the cache, if the key does not exist.\",\n+                                        \"displayName\": \"Keep original\",\n+                                        \"value\": \"keeporiginal\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"Route to failure if the content is empty. While hashing an empty value is valid, some flows may want to detect empty input.\",\n-                                \"displayName\": \"Fail if the content is empty\",\n+                                \"defaultValue\": \"replace\",\n+                                \"description\": \"Determines how the cache is updated if the cache already contains the entry\",\n+                                \"displayName\": \"Cache update strategy\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"fail_when_empty\",\n+                                \"name\": \"Cache update strategy\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"hash_algorithm\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"MD2 (16 byte output) [WARNING -- Cryptographically broken] Cryptographically broken due to collisions\",\n-                                        \"displayName\": \"MD2\",\n-                                        \"value\": \"MD2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"MD5 (16 byte output) [WARNING -- Cryptographically broken] Cryptographically broken due to collisions\",\n-                                        \"displayName\": \"MD5\",\n-                                        \"value\": \"MD5\"\n-                                    },\n-                                    {\n-                                        \"description\": \"SHA-1 (20 byte output) [WARNING -- Cryptographically broken] Cryptographically broken due to collisions\",\n-                                        \"displayName\": \"SHA-1\",\n-                                        \"value\": \"SHA-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"SHA-224 (28 byte output) SHA-2 family\",\n-                                        \"displayName\": \"SHA-224\",\n-                                        \"value\": \"SHA-224\"\n-                                    },\n-                                    {\n-                                        \"description\": \"SHA-256 (32 byte output) SHA-2 family\",\n-                                        \"displayName\": \"SHA-256\",\n-                                        \"value\": \"SHA-256\"\n-                                    },\n-                                    {\n-                                        \"description\": \"SHA-384 (48 byte output) SHA-2 family\",\n-                                        \"displayName\": \"SHA-384\",\n-                                        \"value\": \"SHA-384\"\n-                                    },\n-                                    {\n-                                        \"description\": \"SHA-512 (64 byte output) SHA-2 family\",\n-                                        \"displayName\": \"SHA-512\",\n-                                        \"value\": \"SHA-512\"\n-                                    },\n-                                    {\n-                                        \"description\": \"SHA-512/224 (28 byte output) SHA-2 using SHA-512 with truncated output\",\n-                                        \"displayName\": \"SHA-512/224\",\n-                                        \"value\": \"SHA-512/224\"\n-                                    },\n-                                    {\n-                                        \"description\": \"SHA-512/256 (32 byte output) SHA-2 using SHA-512 with truncated output\",\n-                                        \"displayName\": \"SHA-512/256\",\n-                                        \"value\": \"SHA-512/256\"\n-                                    },\n-                                    {\n-                                        \"description\": \"SHA3-224 (28 byte output) Keccak-based SHA3 family\",\n-                                        \"displayName\": \"SHA3-224\",\n-                                        \"value\": \"SHA3-224\"\n-                                    },\n-                                    {\n-                                        \"description\": \"SHA3-256 (32 byte output) Keccak-based SHA3 family\",\n-                                        \"displayName\": \"SHA3-256\",\n-                                        \"value\": \"SHA3-256\"\n-                                    },\n-                                    {\n-                                        \"description\": \"SHA3-384 (48 byte output) Keccak-based SHA3 family\",\n-                                        \"displayName\": \"SHA3-384\",\n-                                        \"value\": \"SHA3-384\"\n-                                    },\n-                                    {\n-                                        \"description\": \"SHA3-512 (64 byte output) Keccak-based SHA3 family\",\n-                                        \"displayName\": \"SHA3-512\",\n-                                        \"value\": \"SHA3-512\"\n-                                    },\n-                                    {\n-                                        \"description\": \"BLAKE2-160 (20 byte output) Also known as Blake2b\",\n-                                        \"displayName\": \"BLAKE2-160\",\n-                                        \"value\": \"BLAKE2-160\"\n-                                    },\n-                                    {\n-                                        \"description\": \"BLAKE2-256 (32 byte output) Also known as Blake2b\",\n-                                        \"displayName\": \"BLAKE2-256\",\n-                                        \"value\": \"BLAKE2-256\"\n-                                    },\n-                                    {\n-                                        \"description\": \"BLAKE2-384 (48 byte output) Also known as Blake2b\",\n-                                        \"displayName\": \"BLAKE2-384\",\n-                                        \"value\": \"BLAKE2-384\"\n-                                    },\n-                                    {\n-                                        \"description\": \"BLAKE2-512 (64 byte output) Also known as Blake2b\",\n-                                        \"displayName\": \"BLAKE2-512\",\n-                                        \"value\": \"BLAKE2-512\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"SHA-256\",\n-                                \"description\": \"The hash algorithm to use. Note that not all of the algorithms available are recommended for use (some are provided for legacy compatibility). There are many things to consider when picking an algorithm; it is recommended to use the most secure algorithm possible.\",\n-                                \"displayName\": \"Hash Algorithm\",\n+                            \"Distributed Cache Service\": {\n+                                \"description\": \"The Controller Service that is used to cache flow files\",\n+                                \"displayName\": \"Distributed Cache Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"hash_algorithm\",\n+                                \"name\": \"Distributed Cache Service\",\n                                 \"required\": true,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.distributed.cache.client.DistributedMapCacheClient\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"Max cache entry size\": {\n+                                \"defaultValue\": \"1 MB\",\n+                                \"description\": \"The maximum amount of data to put into cache\",\n+                                \"displayName\": \"Max cache entry size\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Max cache entry size\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             }\n                         },\n-                        \"sideEffectFree\": true,\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.distributed.cache.client.DistributedMapCacheClientService\",\n+                            \"org.apache.nifi.distributed.cache.server.map.DistributedMapCacheServer\",\n+                            \"org.apache.nifi.processors.standard.FetchDistributedMapCache\"\n+                        ],\n+                        \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"Used for flowfiles that have a hash value added\",\n+                                \"description\": \"Any FlowFile that is successfully inserted into cache will be routed to this relationship\",\n                                 \"name\": \"success\"\n                             },\n                             {\n-                                \"description\": \"Used for flowfiles that have no content if the 'fail on empty' setting is enabled\",\n+                                \"description\": \"Any FlowFile that cannot be inserted into the cache will be routed to this relationship\",\n                                 \"name\": \"failure\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\",\n                             \"EVENT_DRIVEN\"\n                         ],\n                         \"supportsBatching\": true,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsEventDriven\": true,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"blake2\",\n-                            \"content\",\n-                            \"cryptography\",\n-                            \"hash\",\n-                            \"md5\",\n-                            \"sha\"\n+                            \"cache\",\n+                            \"distributed\",\n+                            \"map\",\n+                            \"put\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.standard.CryptographicHashContent\",\n-                        \"typeDescription\": \"Calculates a cryptographic hash value for the flowfile content using the given algorithm and writes it to an output attribute. Please refer to https://csrc.nist.gov/Projects/Hash-Functions/NIST-Policy-on-Hash-Functions for help to decide which algorithm to use.\",\n+                        \"type\": \"org.apache.nifi.processors.standard.PutDistributedMapCache\",\n+                        \"typeDescription\": \"Gets the content of a FlowFile and puts it to a distributed map cache, using a cache key computed from FlowFile attributes. If the cache already contains the entry and the cache update strategy is 'keep original' the entry is not replaced.'\",\n                         \"version\": \"1.27.0\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"This processor adds an attribute whose value is the result of hashing the flowfile content. The name of this attribute is specified by the value of the algorithm, e.g. 'content_SHA-256'.\",\n-                                \"name\": \"content_<algorithm>\"\n+                                \"description\": \"All FlowFiles will have an attribute 'cached'. The value of this attribute is true, is the FlowFile is cached, otherwise false.\",\n+                                \"name\": \"cached\"\n                             }\n                         ]\n                     },\n                     {\n                         \"additionalDetails\": true,\n                         \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n-                            \"EVENT_DRIVEN\": 0,\n                             \"TIMER_DRIVEN\": 1\n                         },\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n+                        \"dynamicProperties\": [\n+                            {\n+                                \"description\": \"Dynamic property names that will be passed to the Mail session. Possible properties can be found in: https://javaee.github.io/javamail/docs/api/com/sun/mail/smtp/package-summary.html.\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"name\": \"mail.propertyName\",\n+                                \"value\": \"Value for a specific property to be set in the JavaMail Session object\"\n+                            }\n+                        ],\n                         \"group\": \"org.apache.nifi\",\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"@OnScheduled Pause Time\": {\n-                                \"defaultValue\": \"0 sec\",\n-                                \"description\": \"Specifies how long the processor should sleep in the @OnScheduled method, so that the processor can be forced to take a long time to start up\",\n-                                \"displayName\": \"@OnScheduled Pause Time\",\n+                            \"Attach File\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"Specifies whether or not the FlowFile content should be attached to the email\",\n+                                \"displayName\": \"Attach File\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"@OnScheduled Pause Time\",\n+                                \"name\": \"Attach File\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"@OnStopped Pause Time\": {\n-                                \"defaultValue\": \"0 sec\",\n-                                \"description\": \"Specifies how long the processor should sleep in the @OnStopped method, so that the processor can be forced to take a long time to shutdown\",\n-                                \"displayName\": \"@OnStopped Pause Time\",\n+                            \"BCC\": {\n+                                \"description\": \"The recipients to include in the BCC-Line of the email. Comma separated sequence of addresses following RFC822 syntax.\",\n+                                \"displayName\": \"BCC\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"@OnStopped Pause Time\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"BCC\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"@OnUnscheduled Pause Time\": {\n-                                \"defaultValue\": \"0 sec\",\n-                                \"description\": \"Specifies how long the processor should sleep in the @OnUnscheduled method, so that the processor can be forced to take a long time to respond when user clicks stop\",\n-                                \"displayName\": \"@OnUnscheduled Pause Time\",\n+                            \"CC\": {\n+                                \"description\": \"The recipients to include in the CC-Line of the email. Comma separated sequence of addresses following RFC822 syntax.\",\n+                                \"displayName\": \"CC\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"@OnUnscheduled Pause Time\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"CC\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Content Size\": {\n-                                \"defaultValue\": \"1 KB\",\n-                                \"description\": \"The number of bytes to write each time that the FlowFile is written to\",\n-                                \"displayName\": \"Content Size\",\n+                            \"Content Type\": {\n+                                \"defaultValue\": \"text/plain\",\n+                                \"description\": \"Mime Type used to interpret the contents of the email, such as text/plain or text/html\",\n+                                \"displayName\": \"Content Type\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Content Size\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Content Type\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"CustomValidate Pause Time\": {\n-                                \"defaultValue\": \"0 sec\",\n-                                \"description\": \"Specifies how long the processor should sleep in the customValidate() method\",\n-                                \"displayName\": \"CustomValidate Pause Time\",\n+                            \"From\": {\n+                                \"description\": \"Specifies the Email address to use as the sender. Comma separated sequence of addresses following RFC822 syntax.\",\n+                                \"displayName\": \"From\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"CustomValidate Pause Time\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"From\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Fail When @OnScheduled called\": {\n+                            \"Include All Attributes In Message\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"true\",\n                                         \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"false\",\n                                         \"value\": \"false\"\n                                     }\n                                 ],\n                                 \"defaultValue\": \"false\",\n-                                \"description\": \"Specifies whether or not the Processor should throw an Exception when the methods annotated with @OnScheduled are called\",\n-                                \"displayName\": \"Fail When @OnScheduled called\",\n+                                \"description\": \"Specifies whether or not all FlowFile attributes should be recorded in the body of the email message\",\n+                                \"displayName\": \"Include All Attributes In Message\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Fail When @OnScheduled called\",\n+                                \"name\": \"Include All Attributes In Message\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Fail When @OnStopped called\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"Specifies whether or not the Processor should throw an Exception when the methods annotated with @OnStopped are called\",\n-                                \"displayName\": \"Fail When @OnStopped called\",\n+                            \"Message\": {\n+                                \"description\": \"The body of the email message\",\n+                                \"displayName\": \"Message\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Fail When @OnStopped called\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Message\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Fail When @OnUnscheduled called\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"Specifies whether or not the Processor should throw an Exception when the methods annotated with @OnUnscheduled are called\",\n-                                \"displayName\": \"Fail When @OnUnscheduled called\",\n+                            \"SMTP Auth\": {\n+                                \"defaultValue\": \"true\",\n+                                \"description\": \"Flag indicating whether authentication should be used\",\n+                                \"displayName\": \"SMTP Auth\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Fail When @OnUnscheduled called\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"SMTP Auth\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"FlowFile Exception Class\": {\n-                                \"defaultValue\": \"java.lang.RuntimeException\",\n-                                \"description\": \"Exception class to be thrown (must extend java.lang.RuntimeException).\",\n-                                \"displayName\": \"FlowFile Exception Class\",\n+                            \"SMTP Hostname\": {\n+                                \"description\": \"The hostname of the SMTP host\",\n+                                \"displayName\": \"SMTP Hostname\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"FlowFile Exception Class\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"SMTP Hostname\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"FlowFile Exception Iterations\": {\n-                                \"defaultValue\": \"0\",\n-                                \"description\": \"Number of FlowFiles to throw exception.\",\n-                                \"displayName\": \"FlowFile Exception Iterations\",\n+                            \"SMTP Password\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"password-based-authorization-mode\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Authorization Mode\",\n+                                        \"propertyName\": \"authorization-mode\"\n+                                    }\n+                                ],\n+                                \"description\": \"Password for the SMTP account\",\n+                                \"displayName\": \"SMTP Password\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"FlowFile Exception Iterations\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"SMTP Password\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n                             },\n-                            \"FlowFile Failure Iterations\": {\n-                                \"defaultValue\": \"0\",\n-                                \"description\": \"Number of FlowFiles to forward to failure relationship.\",\n-                                \"displayName\": \"FlowFile Failure Iterations\",\n+                            \"SMTP Port\": {\n+                                \"defaultValue\": \"25\",\n+                                \"description\": \"The Port used for SMTP communications\",\n+                                \"displayName\": \"SMTP Port\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"FlowFile Failure Iterations\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"SMTP Port\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"FlowFile Rollback Iterations\": {\n-                                \"defaultValue\": \"0\",\n-                                \"description\": \"Number of FlowFiles to roll back (without penalty).\",\n-                                \"displayName\": \"FlowFile Rollback Iterations\",\n+                            \"SMTP Socket Factory\": {\n+                                \"defaultValue\": \"javax.net.ssl.SSLSocketFactory\",\n+                                \"description\": \"Socket Factory to use for SMTP Connection\",\n+                                \"displayName\": \"SMTP Socket Factory\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"FlowFile Rollback Iterations\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"SMTP Socket Factory\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"FlowFile Rollback Penalty Iterations\": {\n-                                \"defaultValue\": \"0\",\n-                                \"description\": \"Number of FlowFiles to roll back with penalty.\",\n-                                \"displayName\": \"FlowFile Rollback Penalty Iterations\",\n+                            \"SMTP TLS\": {\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"Flag indicating whether Opportunistic TLS should be enabled using STARTTLS command\",\n+                                \"displayName\": \"SMTP STARTTLS\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"FlowFile Rollback Penalty Iterations\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"SMTP TLS\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"FlowFile Rollback Yield Iterations\": {\n-                                \"defaultValue\": \"0\",\n-                                \"description\": \"Number of FlowFiles to roll back and yield.\",\n-                                \"displayName\": \"FlowFile Rollback Yield Iterations\",\n+                            \"SMTP Username\": {\n+                                \"description\": \"Username for the SMTP account\",\n+                                \"displayName\": \"SMTP Username\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"FlowFile Rollback Yield Iterations\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"SMTP Username\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"FlowFile Success Iterations\": {\n-                                \"defaultValue\": \"1\",\n-                                \"description\": \"Number of FlowFiles to forward to success relationship.\",\n-                                \"displayName\": \"FlowFile Success Iterations\",\n+                            \"SMTP X-Mailer Header\": {\n+                                \"defaultValue\": \"NiFi\",\n+                                \"description\": \"X-Mailer used in the header of the outgoing email\",\n+                                \"displayName\": \"SMTP X-Mailer Header\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"FlowFile Success Iterations\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"SMTP X-Mailer Header\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Ignore Interrupts When Paused\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"If the Processor's thread(s) are sleeping (due to one of the \\\"Pause Time\\\" properties above), and the thread is interrupted, this indicates whether the Processor should ignore the interrupt and continue sleeping or if it should allow itself to be interrupted.\",\n-                                \"displayName\": \"Ignore Interrupts When Paused\",\n+                            \"Subject\": {\n+                                \"defaultValue\": \"Message from NiFi\",\n+                                \"description\": \"The email subject\",\n+                                \"displayName\": \"Subject\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Ignore Interrupts When Paused\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Subject\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"No FlowFile Exception Class\": {\n-                                \"defaultValue\": \"java.lang.RuntimeException\",\n-                                \"description\": \"Exception class to be thrown if no FlowFile (must extend java.lang.RuntimeException).\",\n-                                \"displayName\": \"No FlowFile Exception Class\",\n+                            \"To\": {\n+                                \"description\": \"The recipients to include in the To-Line of the email. Comma separated sequence of addresses following RFC822 syntax.\",\n+                                \"displayName\": \"To\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"No FlowFile Exception Class\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"To\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"No FlowFile Exception Iterations\": {\n-                                \"defaultValue\": \"0\",\n-                                \"description\": \"Number of times to throw NPE exception if no FlowFile.\",\n-                                \"displayName\": \"No FlowFile Exception Iterations\",\n+                            \"attribute-name-regex\": {\n+                                \"description\": \"A Regular Expression that is matched against all FlowFile attribute names. Any attribute whose name matches the regex will be added to the Email messages as a Header. If not specified, no FlowFile attributes will be added as headers.\",\n+                                \"displayName\": \"Attributes to Send as Headers (Regex)\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"No FlowFile Exception Iterations\",\n-                                \"required\": true,\n+                                \"name\": \"attribute-name-regex\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"No FlowFile Skip Iterations\": {\n-                                \"defaultValue\": \"1\",\n-                                \"description\": \"Number of times to skip onTrigger if no FlowFile.\",\n-                                \"displayName\": \"No FlowFile Skip Iterations\",\n+                            \"authorization-mode\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"Use password\",\n+                                        \"displayName\": \"Use Password\",\n+                                        \"value\": \"password-based-authorization-mode\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Use OAuth2 to acquire access token\",\n+                                        \"displayName\": \"Use OAuth2\",\n+                                        \"value\": \"oauth-based-authorization-mode\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"password-based-authorization-mode\",\n+                                \"description\": \"How to authorize sending email on the user's behalf.\",\n+                                \"displayName\": \"Authorization Mode\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"No FlowFile Skip Iterations\",\n+                                \"name\": \"authorization-mode\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"No FlowFile Yield Iterations\": {\n-                                \"defaultValue\": \"0\",\n-                                \"description\": \"Number of times to yield if no FlowFile.\",\n-                                \"displayName\": \"No FlowFile Yield Iterations\",\n+                            \"email-ff-content-as-message\": {\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"Specifies whether or not the FlowFile content should be the message of the email. If true, the 'Message' property is ignored.\",\n+                                \"displayName\": \"Flow file content as message\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"No FlowFile Yield Iterations\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"email-ff-content-as-message\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"OnTrigger Pause Time\": {\n-                                \"defaultValue\": \"0 sec\",\n-                                \"description\": \"Specifies how long the processor should sleep in the onTrigger() method, so that the processor can be forced to take a long time to perform its task\",\n-                                \"displayName\": \"OnTrigger Pause Time\",\n+                            \"input-character-set\": {\n+                                \"defaultValue\": \"UTF-8\",\n+                                \"description\": \"Specifies the character set of the FlowFile contents for reading input FlowFile contents to generate the message body or as an attachment to the message. If not set, UTF-8 will be the default value.\",\n+                                \"displayName\": \"Input Character Set\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"OnTrigger Pause Time\",\n+                                \"name\": \"input-character-set\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Write Iterations\": {\n-                                \"defaultValue\": \"0\",\n-                                \"description\": \"Number of times to write to the FlowFile\",\n-                                \"displayName\": \"Write Iterations\",\n+                            \"oauth2-access-token-provider\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"oauth-based-authorization-mode\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Authorization Mode\",\n+                                        \"propertyName\": \"authorization-mode\"\n+                                    }\n+                                ],\n+                                \"description\": \"OAuth2 service that can provide access tokens.\",\n+                                \"displayName\": \"OAuth2 Access Token Provider\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Write Iterations\",\n+                                \"name\": \"oauth2-access-token-provider\",\n                                 \"required\": true,\n-                                \"sensitive\": false\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.oauth2.OAuth2AccessTokenProvider\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n                             }\n                         },\n                         \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"FlowFiles processed successfully.\",\n+                                \"description\": \"FlowFiles that are successfully sent will be routed to this relationship\",\n                                 \"name\": \"success\"\n                             },\n                             {\n-                                \"description\": \"FlowFiles that failed to process.\",\n+                                \"description\": \"FlowFiles that fail to send will be routed to this relationship\",\n                                 \"name\": \"failure\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\",\n-                            \"EVENT_DRIVEN\"\n+                            \"CRON_DRIVEN\"\n                         ],\n-                        \"supportsBatching\": false,\n-                        \"supportsDynamicProperties\": false,\n+                        \"supportsBatching\": true,\n+                        \"supportsDynamicProperties\": true,\n                         \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": true,\n-                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"supportsEventDriven\": false,\n+                        \"supportsSensitiveDynamicProperties\": true,\n+                        \"systemResourceConsiderations\": [\n+                            {\n+                                \"description\": \"The entirety of the FlowFile's content (as a String object) will be read into memory in case the property to use the flow file content as the email body is set to true.\",\n+                                \"resource\": \"MEMORY\"\n+                            }\n+                        ],\n                         \"tags\": [\n-                            \"FlowFile\",\n-                            \"debug\",\n-                            \"flow\",\n-                            \"processor\",\n-                            \"test\",\n-                            \"utility\"\n+                            \"email\",\n+                            \"notify\",\n+                            \"put\",\n+                            \"smtp\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.standard.DebugFlow\",\n-                        \"typeDescription\": \"The DebugFlow processor aids testing and debugging the FlowFile framework by allowing various responses to be explicitly triggered in response to the receipt of a FlowFile or a timer event without a FlowFile if using timer or cron based scheduling.  It can force responses needed to exercise or test various failure modes that can occur when a processor runs.\",\n+                        \"type\": \"org.apache.nifi.processors.standard.PutEmail\",\n+                        \"typeDescription\": \"Sends an e-mail to configured recipients for each incoming FlowFile\",\n                         \"version\": \"1.27.0\"\n                     },\n                     {\n                         \"additionalDetails\": false,\n                         \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n-                            \"EVENT_DRIVEN\": 0,\n                             \"TIMER_DRIVEN\": 1\n                         },\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n                         \"dynamicProperties\": [\n                             {\n-                                \"description\": \"A record's cache key is generated by combining the name of each dynamic property with its evaluated record value (as specified by the corresponding RecordPath).\",\n+                                \"description\": \"The command specified in the key will be executed before doing a put.  You may add these optional properties  to send any commands to the FTP server before the file is actually transferred (before the put command). This option is only available for the PutFTP processor, as only FTP has this functionality. This is essentially the same as sending quote commands to an FTP server from the command line.  While this is the same as sending a quote command, it is very important that you leave off the .\",\n                                 \"expressionLanguageScope\": \"NONE\",\n-                                \"name\": \"Name of the property.\",\n-                                \"value\": \"A valid RecordPath to the record field to be included in the cache key used for deduplication.\"\n+                                \"name\": \"pre.cmd._____\",\n+                                \"value\": \"Not used\"\n+                            },\n+                            {\n+                                \"description\": \"The command specified in the key will be executed after doing a put.  You may add these optional properties  to send any commands to the FTP server before the file is actually transferred (before the put command). This option is only available for the PutFTP processor, as only FTP has this functionality. This is essentially the same as sending quote commands to an FTP server from the command line.  While this is the same as sending a quote command, it is very important that you leave off the .\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"name\": \"post.cmd._____\",\n+                                \"value\": \"Not used\"\n                             }\n                         ],\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"bloom-filter-certainty\": {\n-                                \"defaultValue\": \"0.10\",\n-                                \"description\": \"The desired false positive probability when using the BloomFilter type. Using a value of .05 for example, guarantees a five-percent probability that the result is a false positive. The closer to 1 this value is set, the more precise the result at the expense of more storage space utilization.\",\n-                                \"displayName\": \"Bloom Filter Certainty\",\n+                            \"Batch Size\": {\n+                                \"defaultValue\": \"500\",\n+                                \"description\": \"The maximum number of FlowFiles to send in a single connection\",\n+                                \"displayName\": \"Batch Size\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"bloom-filter-certainty\",\n-                                \"required\": false,\n+                                \"name\": \"Batch Size\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"cache-identifier\": {\n-                                \"dependencies\": [\n+                            \"Conflict Resolution\": {\n+                                \"allowableValues\": [\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"multiple\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Deduplication Strategy\",\n-                                        \"propertyName\": \"deduplication-strategy\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"REPLACE\",\n+                                        \"value\": \"REPLACE\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"IGNORE\",\n+                                        \"value\": \"IGNORE\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"RENAME\",\n+                                        \"value\": \"RENAME\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"REJECT\",\n+                                        \"value\": \"REJECT\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"FAIL\",\n+                                        \"value\": \"FAIL\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"NONE\",\n+                                        \"value\": \"NONE\"\n                                     }\n                                 ],\n-                                \"description\": \"An optional expression language field that overrides the record's computed cache key. This field has an additional attribute available: ${record.hash.value}, which contains the cache key derived from dynamic properties (if set) or record fields.\",\n-                                \"displayName\": \"Cache Identifier\",\n+                                \"defaultValue\": \"NONE\",\n+                                \"description\": \"Determines how to handle the problem of filename collisions\",\n+                                \"displayName\": \"Conflict Resolution\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"cache-identifier\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Conflict Resolution\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"deduplication-strategy\": {\n+                            \"Connection Mode\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"Single File\",\n-                                        \"value\": \"single\"\n+                                        \"displayName\": \"Active\",\n+                                        \"value\": \"Active\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"Multiple Files\",\n-                                        \"value\": \"multiple\"\n+                                        \"displayName\": \"Passive\",\n+                                        \"value\": \"Passive\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"single\",\n-                                \"description\": \"The strategy to use for detecting and routing duplicate records. The option for detecting duplicates across a single FlowFile operates in-memory, whereas detection spanning multiple FlowFiles utilises a distributed map cache.\",\n-                                \"displayName\": \"Deduplication Strategy\",\n+                                \"defaultValue\": \"Passive\",\n+                                \"description\": \"The FTP Connection Mode\",\n+                                \"displayName\": \"Connection Mode\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"deduplication-strategy\",\n+                                \"name\": \"Connection Mode\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Connection Timeout\": {\n+                                \"defaultValue\": \"30 sec\",\n+                                \"description\": \"Amount of time to wait before timing out while creating a connection\",\n+                                \"displayName\": \"Connection Timeout\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Connection Timeout\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"distributed-map-cache\": {\n-                                \"dependencies\": [\n+                            \"Create Directory\": {\n+                                \"allowableValues\": [\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"multiple\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Deduplication Strategy\",\n-                                        \"propertyName\": \"deduplication-strategy\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"description\": \"This property is required when the deduplication strategy is set to 'multiple files.' The map cache will for each record, atomically check whether the cache key exists and if not, set it.\",\n-                                \"displayName\": \"Distributed Map Cache client\",\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"Specifies whether or not the remote directory should be created if it does not exist.\",\n+                                \"displayName\": \"Create Directory\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"distributed-map-cache\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.distributed.cache.client.DistributedMapCacheClient\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n+                                \"name\": \"Create Directory\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n                             },\n-                            \"filter-capacity-hint\": {\n-                                \"defaultValue\": \"25000\",\n-                                \"dependencies\": [\n+                            \"Data Timeout\": {\n+                                \"defaultValue\": \"30 sec\",\n+                                \"description\": \"When transferring a file between the local and remote system, this value specifies how long is allowed to elapse without any data being transferred between systems\",\n+                                \"displayName\": \"Data Timeout\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Data Timeout\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Dot Rename\": {\n+                                \"allowableValues\": [\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"bloom-filter\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Filter Type\",\n-                                        \"propertyName\": \"filter-type\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"description\": \"An estimation of the total number of unique records to be processed. The more accurate this number is will lead to fewer false negatives on a BloomFilter.\",\n-                                \"displayName\": \"Filter Capacity Hint\",\n+                                \"defaultValue\": \"true\",\n+                                \"description\": \"If true, then the filename of the sent file is prepended with a \\\".\\\" and then renamed back to the original once the file is completely sent. Otherwise, there is no rename. This property is ignored if the Temporary Filename property is set.\",\n+                                \"displayName\": \"Dot Rename\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"filter-capacity-hint\",\n+                                \"name\": \"Dot Rename\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Hostname\": {\n+                                \"description\": \"The fully qualified hostname or IP address of the remote system\",\n+                                \"displayName\": \"Hostname\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Hostname\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"filter-type\": {\n+                            \"Http Proxy Password\": {\n+                                \"description\": \"Http Proxy Password\",\n+                                \"displayName\": \"Http Proxy Password\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Http Proxy Password\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n+                            },\n+                            \"Http Proxy Username\": {\n+                                \"description\": \"Http Proxy Username\",\n+                                \"displayName\": \"Http Proxy Username\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Http Proxy Username\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Internal Buffer Size\": {\n+                                \"defaultValue\": \"16KB\",\n+                                \"description\": \"Set the internal buffer size for buffered data streams\",\n+                                \"displayName\": \"Internal Buffer Size\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Internal Buffer Size\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Last Modified Time\": {\n+                                \"description\": \"The lastModifiedTime to assign to the file after transferring it. If not set, the lastModifiedTime will not be changed. Format must be yyyy-MM-dd'T'HH:mm:ssZ. You may also use expression language such as ${file.lastModifiedTime}. If the value is invalid, the processor will not be invalid but will fail to change lastModifiedTime of the file.\",\n+                                \"displayName\": \"Last Modified Time\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Last Modified Time\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Password\": {\n+                                \"description\": \"Password for the user account\",\n+                                \"displayName\": \"Password\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Password\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n+                            },\n+                            \"Permissions\": {\n+                                \"description\": \"The permissions to assign to the file after transferring it. Format must be either UNIX rwxrwxrwx with a - in place of denied permissions (e.g. rw-r--r--) or an octal number (e.g. 644). If not set, the permissions will not be changed. You may also use expression language such as ${file.permissions}. If the value is invalid, the processor will not be invalid but will fail to change permissions of the file.\",\n+                                \"displayName\": \"Permissions\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Permissions\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Port\": {\n+                                \"defaultValue\": \"21\",\n+                                \"description\": \"The port that the remote system is listening on for file transfers\",\n+                                \"displayName\": \"Port\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Port\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Proxy Host\": {\n+                                \"description\": \"The fully qualified hostname or IP address of the proxy server\",\n+                                \"displayName\": \"Proxy Host\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Proxy Host\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Proxy Port\": {\n+                                \"description\": \"The port of the proxy server\",\n+                                \"displayName\": \"Proxy Port\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Proxy Port\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Proxy Type\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Exactly matches records seen before with 100% accuracy at the expense of more storage usage. Stores the filter data in a single cache entry in the distributed cache, and is loaded entirely into memory during duplicate detection. This filter is preferred for small to medium data sets and offers high performance, being loaded into memory when this processor is running.\",\n-                                        \"displayName\": \"HashSet\",\n-                                        \"value\": \"hash-set\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"DIRECT\",\n+                                        \"value\": \"DIRECT\"\n                                     },\n                                     {\n-                                        \"description\": \"Space-efficient data structure ideal for large data sets using probability to determine if a record was seen previously. False positive matches are possible, but false negatives are not \\u2013 in other words, a query returns either \\\"possibly in the set\\\" or \\\"definitely not in the set\\\". You should use this option if the FlowFile content is large and you can tolerate some duplication in the data. Uses constant storage space regardless of the record set size.\",\n-                                        \"displayName\": \"BloomFilter\",\n-                                        \"value\": \"bloom-filter\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"hash-set\",\n-                                \"dependencies\": [\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"HTTP\",\n+                                        \"value\": \"HTTP\"\n+                                    },\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"single\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Deduplication Strategy\",\n-                                        \"propertyName\": \"deduplication-strategy\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"SOCKS\",\n+                                        \"value\": \"SOCKS\"\n                                     }\n                                 ],\n-                                \"description\": \"The filter used to determine whether a record has been seen before based on the matching RecordPath criteria. If hash set is selected, a Java HashSet object will be used to deduplicate all encountered records. If the bloom filter option is selected, a bloom filter will be used. The bloom filter option is less memory intensive, but has a chance of having false positives.\",\n-                                \"displayName\": \"Filter Type\",\n+                                \"defaultValue\": \"DIRECT\",\n+                                \"description\": \"Proxy type used for file transfers\",\n+                                \"displayName\": \"Proxy Type\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"filter-type\",\n-                                \"required\": true,\n+                                \"name\": \"Proxy Type\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"include-zero-record-flowfiles\": {\n+                            \"Reject Zero-Byte Files\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"true\",\n                                         \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"false\",\n                                         \"value\": \"false\"\n                                     }\n                                 ],\n                                 \"defaultValue\": \"true\",\n-                                \"description\": \"If a FlowFile sent to either the duplicate or non-duplicate relationships contains no records, a value of `false` in this property causes the FlowFile to be dropped. Otherwise, the empty FlowFile is emitted.\",\n-                                \"displayName\": \"Include Zero Record FlowFiles\",\n+                                \"description\": \"Determines whether or not Zero-byte files should be rejected without attempting to transfer\",\n+                                \"displayName\": \"Reject Zero-Byte Files\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"include-zero-record-flowfiles\",\n-                                \"required\": true,\n+                                \"name\": \"Reject Zero-Byte Files\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"put-cache-identifier\": {\n+                            \"Remote Path\": {\n+                                \"description\": \"The path on the remote system from which to pull or push files\",\n+                                \"displayName\": \"Remote Path\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Remote Path\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Temporary Filename\": {\n+                                \"description\": \"If set, the filename of the sent file will be equal to the value specified during the transfer and after successful completion will be renamed to the original filename. If this value is set, the Dot Rename property is ignored.\",\n+                                \"displayName\": \"Temporary Filename\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Temporary Filename\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Transfer Mode\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Binary\",\n+                                        \"value\": \"Binary\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"ASCII\",\n+                                        \"value\": \"ASCII\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"Binary\",\n+                                \"description\": \"The FTP Transfer Mode\",\n+                                \"displayName\": \"Transfer Mode\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Transfer Mode\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Use Compression\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"true\",\n                                         \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"false\",\n                                         \"value\": \"false\"\n                                     }\n                                 ],\n                                 \"defaultValue\": \"false\",\n-                                \"dependencies\": [\n-                                    {\n-                                        \"propertyDisplayName\": \"Distributed Map Cache client\",\n-                                        \"propertyName\": \"distributed-map-cache\"\n-                                    }\n-                                ],\n-                                \"description\": \"For each record, check whether the cache identifier exists in the distributed map cache. If it doesn't exist and this property is true, put the identifier to the cache.\",\n-                                \"displayName\": \"Cache the Entry Identifier\",\n+                                \"description\": \"Indicates whether or not ZLIB compression should be used when transferring files\",\n+                                \"displayName\": \"Use Compression\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"put-cache-identifier\",\n+                                \"name\": \"Use Compression\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"record-hashing-algorithm\": {\n+                            \"Username\": {\n+                                \"description\": \"Username\",\n+                                \"displayName\": \"Username\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Username\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"ftp-use-utf8\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Do not use a hashing algorithm. The value of resolved RecordPaths will be combined with a delimiter (~) to form the unique cache key. This may use significantly more storage depending on the size and shape or your data.\",\n-                                        \"displayName\": \"None\",\n-                                        \"value\": \"none\"\n-                                    },\n-                                    {\n-                                        \"description\": \"SHA-256 cryptographic hashing algorithm.\",\n-                                        \"displayName\": \"SHA-256\",\n-                                        \"value\": \"SHA-256\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n-                                        \"description\": \"SHA-512 cryptographic hashing algorithm.\",\n-                                        \"displayName\": \"SHA-512\",\n-                                        \"value\": \"SHA-512\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"SHA-256\",\n-                                \"description\": \"The algorithm used to hash the cache key.\",\n-                                \"displayName\": \"Record Hashing Algorithm\",\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"Tells the client to use UTF-8 encoding when processing files and filenames. If set to true, the server must also support UTF-8 encoding.\",\n+                                \"displayName\": \"Use UTF-8 Encoding\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"record-hashing-algorithm\",\n+                                \"name\": \"ftp-use-utf8\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"record-reader\": {\n-                                \"description\": \"Specifies the Controller Service to use for reading incoming data\",\n-                                \"displayName\": \"Record Reader\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"record-reader\",\n-                                \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            },\n-                            \"record-writer\": {\n-                                \"description\": \"Specifies the Controller Service to use for writing out the records\",\n-                                \"displayName\": \"Record Writer\",\n+                            \"proxy-configuration-service\": {\n+                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests. If set, it supersedes proxy settings configured per component. Supported proxies: HTTP + AuthN, SOCKS + AuthN\",\n+                                \"displayName\": \"Proxy Configuration Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"record-writer\",\n-                                \"required\": true,\n+                                \"name\": \"proxy-configuration-service\",\n+                                \"required\": false,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n                                     \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n+                                    \"type\": \"org.apache.nifi.proxy.ProxyConfigurationService\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             }\n                         },\n                         \"seeAlso\": [\n-                            \"org.apache.nifi.distributed.cache.client.DistributedMapCacheClientService\",\n-                            \"org.apache.nifi.distributed.cache.server.map.DistributedMapCacheServer\",\n-                            \"org.apache.nifi.processors.standard.DetectDuplicate\"\n+                            \"org.apache.nifi.processors.standard.GetFTP\"\n                         ],\n                         \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"Records detected as duplicates are routed to this relationship.\",\n-                                \"name\": \"duplicate\"\n+                                \"description\": \"FlowFiles that are successfully sent will be routed to success\",\n+                                \"name\": \"success\"\n                             },\n                             {\n-                                \"description\": \"Records not found in the cache are routed to this relationship.\",\n-                                \"name\": \"non-duplicate\"\n+                                \"description\": \"FlowFiles that were rejected by the destination system\",\n+                                \"name\": \"reject\"\n                             },\n                             {\n-                                \"description\": \"If unable to communicate with the cache, the FlowFile will be penalized and routed to this relationship\",\n+                                \"description\": \"FlowFiles that failed to send to the remote system; failure is usually looped back to this processor\",\n                                 \"name\": \"failure\"\n-                            },\n-                            {\n-                                \"description\": \"The original input FlowFile is sent to this relationship unless a fatal error occurs.\",\n-                                \"name\": \"original\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\",\n-                            \"EVENT_DRIVEN\"\n+                            \"CRON_DRIVEN\"\n                         ],\n                         \"supportsBatching\": true,\n                         \"supportsDynamicProperties\": true,\n                         \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": true,\n+                        \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n-                        \"systemResourceConsiderations\": [\n-                            {\n-                                \"description\": \"The HashSet filter type will grow memory space proportionate to the number of unique records processed. The BloomFilter type will use constant memory regardless of the number of records processed.\",\n-                                \"resource\": \"MEMORY\"\n-                            },\n-                            {\n-                                \"description\": \"If a more advanced hash algorithm is chosen, the amount of time required to hash any particular record could increase substantially.\",\n-                                \"resource\": \"CPU\"\n-                            }\n-                        ],\n                         \"tags\": [\n-                            \"change\",\n-                            \"dedupe\",\n-                            \"distinct\",\n-                            \"dupe\",\n-                            \"duplicate\",\n-                            \"filter\",\n-                            \"hash\",\n-                            \"modify\",\n-                            \"record\",\n-                            \"replace\",\n-                            \"text\",\n-                            \"unique\",\n-                            \"update\"\n+                            \"archive\",\n+                            \"copy\",\n+                            \"egress\",\n+                            \"files\",\n+                            \"ftp\",\n+                            \"put\",\n+                            \"remote\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.standard.DeduplicateRecord\",\n-                        \"typeDescription\": \"This processor de-duplicates individual records within a record set. It can operate on a per-file basis using an in-memory hashset or bloom filter. When configured with a distributed map cache, it de-duplicates records across multiple files.\",\n-                        \"version\": \"1.27.0\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"Number of records written to the destination FlowFile.\",\n-                                \"name\": \"record.count\"\n-                            }\n-                        ]\n+                        \"type\": \"org.apache.nifi.processors.standard.PutFTP\",\n+                        \"typeDescription\": \"Sends FlowFiles to an FTP Server\",\n+                        \"version\": \"1.27.0\"\n                     },\n                     {\n                         \"additionalDetails\": false,\n                         \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n@@ -98089,1626 +98324,1910 @@\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n+                        \"explicitRestrictions\": [\n+                            {\n+                                \"explanation\": \"Provides operator the ability to write to any file that NiFi has access to.\",\n+                                \"requiredPermission\": \"write filesystem\"\n+                            }\n+                        ],\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Age Off Duration\": {\n-                                \"description\": \"Time interval to age off cached FlowFiles\",\n-                                \"displayName\": \"Age Off Duration\",\n+                            \"Conflict Resolution Strategy\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"replace\",\n+                                        \"value\": \"replace\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"ignore\",\n+                                        \"value\": \"ignore\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"fail\",\n+                                        \"value\": \"fail\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"fail\",\n+                                \"description\": \"Indicates what should happen when a file with the same name already exists in the output directory\",\n+                                \"displayName\": \"Conflict Resolution Strategy\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Age Off Duration\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Cache Entry Identifier\": {\n-                                \"defaultValue\": \"${hash.value}\",\n-                                \"description\": \"A FlowFile attribute, or the results of an Attribute Expression Language statement, which will be evaluated against a FlowFile in order to determine the value used to identify duplicates; it is this value that is cached\",\n-                                \"displayName\": \"Cache Entry Identifier\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Cache Entry Identifier\",\n+                                \"name\": \"Conflict Resolution Strategy\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Cache The Entry Identifier\": {\n+                            \"Create Missing Directories\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"true\",\n                                         \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"false\",\n                                         \"value\": \"false\"\n                                     }\n                                 ],\n                                 \"defaultValue\": \"true\",\n-                                \"description\": \"When true this cause the processor to check for duplicates and cache the Entry Identifier. When false, the processor would only check for duplicates and not cache the Entry Identifier, requiring another processor to add identifiers to the distributed cache.\",\n-                                \"displayName\": \"Cache The Entry Identifier\",\n+                                \"description\": \"If true, then missing destination directories will be created. If false, flowfiles are penalized and sent to failure.\",\n+                                \"displayName\": \"Create Missing Directories\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Cache The Entry Identifier\",\n+                                \"name\": \"Create Missing Directories\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Directory\": {\n+                                \"description\": \"The directory to which files should be written. You may use expression language such as /aa/bb/${path}\",\n+                                \"displayName\": \"Directory\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Directory\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Group\": {\n+                                \"description\": \"Sets the group on the output file to the value of this attribute.  You may also use expression language such as ${file.group}.\",\n+                                \"displayName\": \"Group\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Group\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Distributed Cache Service\": {\n-                                \"description\": \"The Controller Service that is used to cache unique identifiers, used to determine duplicates\",\n-                                \"displayName\": \"Distributed Cache Service\",\n+                            \"Last Modified Time\": {\n+                                \"description\": \"Sets the lastModifiedTime on the output file to the value of this attribute.  Format must be yyyy-MM-dd'T'HH:mm:ssZ.  You may also use expression language such as ${file.lastModifiedTime}.\",\n+                                \"displayName\": \"Last Modified Time\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Last Modified Time\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Maximum File Count\": {\n+                                \"description\": \"Specifies the maximum number of files that can exist in the output directory\",\n+                                \"displayName\": \"Maximum File Count\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Distributed Cache Service\",\n-                                \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.distributed.cache.client.DistributedMapCacheClient\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n+                                \"name\": \"Maximum File Count\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n                             },\n-                            \"FlowFile Description\": {\n-                                \"defaultValue\": \"\",\n-                                \"description\": \"When a FlowFile is added to the cache, this value is stored along with it so that if a duplicate is found, this description of the original FlowFile will be added to the duplicate's \\\"original.flowfile.description\\\" attribute\",\n-                                \"displayName\": \"FlowFile Description\",\n+                            \"Owner\": {\n+                                \"description\": \"Sets the owner on the output file to the value of this attribute.  You may also use expression language such as ${file.owner}. Note on many operating systems Nifi must be running as a super-user to have the permissions to set the file owner.\",\n+                                \"displayName\": \"Owner\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"FlowFile Description\",\n-                                \"required\": true,\n+                                \"name\": \"Owner\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Permissions\": {\n+                                \"description\": \"Sets the permissions on the output file to the value of this attribute.  Format must be either UNIX rwxrwxrwx with a - in place of denied permissions (e.g. rw-r--r--) or an octal number (e.g. 644).  You may also use expression language such as ${file.permissions}.\",\n+                                \"displayName\": \"Permissions\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Permissions\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             }\n                         },\n+                        \"readsAttributes\": [\n+                            {\n+                                \"description\": \"The filename to use when writing the FlowFile to disk.\",\n+                                \"name\": \"filename\"\n+                            }\n+                        ],\n+                        \"restricted\": true,\n                         \"seeAlso\": [\n-                            \"org.apache.nifi.distributed.cache.client.DistributedMapCacheClientService\",\n-                            \"org.apache.nifi.distributed.cache.server.map.DistributedMapCacheServer\"\n+                            \"org.apache.nifi.processors.standard.FetchFile\",\n+                            \"org.apache.nifi.processors.standard.GetFile\"\n                         ],\n                         \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"If a FlowFile has been detected to be a duplicate, it will be routed to this relationship\",\n-                                \"name\": \"duplicate\"\n-                            },\n-                            {\n-                                \"description\": \"If a FlowFile's Cache Entry Identifier was not found in the cache, it will be routed to this relationship\",\n-                                \"name\": \"non-duplicate\"\n+                                \"description\": \"Files that have been successfully written to the output directory are transferred to this relationship\",\n+                                \"name\": \"success\"\n                             },\n                             {\n-                                \"description\": \"If unable to communicate with the cache, the FlowFile will be penalized and routed to this relationship\",\n+                                \"description\": \"Files that could not be written to the output directory for some reason are transferred to this relationship\",\n                                 \"name\": \"failure\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\",\n                             \"EVENT_DRIVEN\"\n                         ],\n                         \"supportsBatching\": true,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsEventDriven\": true,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"dedupe\",\n-                            \"dupe\",\n-                            \"duplicate\",\n-                            \"hash\"\n+                            \"archive\",\n+                            \"copy\",\n+                            \"files\",\n+                            \"filesystem\",\n+                            \"local\",\n+                            \"put\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.standard.DetectDuplicate\",\n-                        \"typeDescription\": \"Caches a value, computed from FlowFile attributes, for each incoming FlowFile and determines if the cached value has already been seen. If so, routes the FlowFile to 'duplicate' with an attribute named 'original.identifier' that specifies the original FlowFile's \\\"description\\\", which is specified in the <FlowFile Description> property. If the FlowFile is not determined to be a duplicate, the Processor routes the FlowFile to 'non-duplicate'\",\n-                        \"version\": \"1.27.0\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"All FlowFiles routed to the duplicate relationship will have an attribute added named original.flowfile.description. The value of this attribute is determined by the attributes of the original copy of the data and by the FlowFile Description property.\",\n-                                \"name\": \"original.flowfile.description\"\n-                            }\n-                        ]\n+                        \"type\": \"org.apache.nifi.processors.standard.PutFile\",\n+                        \"typeDescription\": \"Writes the contents of a FlowFile to the local file system\",\n+                        \"version\": \"1.27.0\"\n                     },\n                     {\n                         \"additionalDetails\": false,\n                         \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n-                            \"EVENT_DRIVEN\": 0,\n                             \"TIMER_DRIVEN\": 1\n                         },\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n-                        \"dynamicProperties\": [\n-                            {\n-                                \"description\": \"Adding a property with the name '5' and value '10' means that the relationship with name '5' will receive 10 FlowFiles in each iteration instead of 1.\",\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"name\": \"The relationship name (positive number)\",\n-                                \"value\": \"The relationship Weight (positive number)\"\n-                            }\n+                        \"deprecated\": true,\n+                        \"deprecationAlternatives\": [\n+                            \"org.apache.nifi.jms.processors.PublishJMS\"\n                         ],\n-                        \"dynamicRelationship\": {\n-                            \"description\": \"FlowFiles are sent to this relationship per the <Distribution Strategy>\",\n-                            \"name\": \"A number 1..<Number Of Relationships>\"\n-                        },\n+                        \"deprecationReason\": \"This processor is deprecated and may be removed in future releases.\",\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Distribution Strategy\": {\n+                            \"Client ID Prefix\": {\n+                                \"description\": \"A human-readable ID that can be used to associate connections with yourself so that the maintainers of the JMS Server know who to contact if problems arise\",\n+                                \"displayName\": \"Client ID Prefix\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Client ID Prefix\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Communications Timeout\": {\n+                                \"defaultValue\": \"30 sec\",\n+                                \"description\": \"The amount of time to wait when attempting to receive a message before giving up and assuming failure\",\n+                                \"displayName\": \"Communications Timeout\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Communications Timeout\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Copy Attributes to JMS Properties\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Relationship selection is evenly distributed in a round robin fashion; all relationships must be available.\",\n-                                        \"displayName\": \"round robin\",\n-                                        \"value\": \"round robin\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n-                                        \"description\": \"Relationship selection is distributed across all available relationships in order of their weight; at least one relationship must be available.\",\n-                                        \"displayName\": \"next available\",\n-                                        \"value\": \"next available\"\n-                                    },\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"true\",\n+                                \"description\": \"Whether or not FlowFile Attributes should be translated into JMS Message Properties. If true, all attributes starting with 'jms.' will be set as Properties on the JMS Message (without the 'jms.' prefix). If an attribute exists that starts with the same value but ends in '.type', that attribute will be used to determine the JMS Message Property type.\",\n+                                \"displayName\": \"Copy Attributes to JMS Properties\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Copy Attributes to JMS Properties\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Destination Name\": {\n+                                \"description\": \"The name of the JMS Topic or queue to use\",\n+                                \"displayName\": \"Destination Name\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Destination Name\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Destination Type\": {\n+                                \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Relationship selection is distributed by supplied LoadDistributionService Controller Service; at least one relationship must be available.\",\n-                                        \"displayName\": \"load distribution service\",\n-                                        \"value\": \"load distribution service\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Queue\",\n+                                        \"value\": \"Queue\"\n                                     },\n                                     {\n-                                        \"description\": \"Relationship selection is the first available relationship without further distribution among all relationships; at least one relationship must be available.\",\n-                                        \"displayName\": \"overflow\",\n-                                        \"value\": \"overflow\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Topic\",\n+                                        \"value\": \"Topic\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"round robin\",\n-                                \"description\": \"Determines how the load will be distributed. Relationship weight is in numeric order where '1' has the greatest weight.\",\n-                                \"displayName\": \"Distribution Strategy\",\n+                                \"defaultValue\": \"Queue\",\n+                                \"description\": \"The type of the JMS Destination to use\",\n+                                \"displayName\": \"Destination Type\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Distribution Strategy\",\n+                                \"name\": \"Destination Type\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Number of Relationships\": {\n-                                \"defaultValue\": \"1\",\n-                                \"description\": \"Determines the number of Relationships to which the load should be distributed\",\n-                                \"displayName\": \"Number of Relationships\",\n+                            \"JMS Provider\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"ActiveMQ\",\n+                                        \"value\": \"ActiveMQ\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"ActiveMQ\",\n+                                \"description\": \"The Provider used for the JMS Server\",\n+                                \"displayName\": \"JMS Provider\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Number of Relationships\",\n+                                \"name\": \"JMS Provider\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n-                            }\n-                        },\n-                        \"sideEffectFree\": true,\n-                        \"supportedRelationships\": [\n-                            {\n-                                \"description\": \"Where to route flowfiles for this relationship index\",\n-                                \"name\": \"1\"\n-                            }\n-                        ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\",\n-                            \"EVENT_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": true,\n-                        \"supportsDynamicProperties\": true,\n-                        \"supportsDynamicRelationships\": true,\n-                        \"supportsEventDriven\": true,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"distribute\",\n-                            \"load balance\",\n-                            \"round robin\",\n-                            \"route\",\n-                            \"weighted\"\n-                        ],\n-                        \"triggerSerially\": false,\n-                        \"triggerWhenAnyDestinationAvailable\": true,\n-                        \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.standard.DistributeLoad\",\n-                        \"typeDescription\": \"Distributes FlowFiles to downstream processors based on a Distribution Strategy. If using the Round Robin strategy, the default is to assign each destination a weighting of 1 (evenly distributed). However, optional properties can be added to the change this; adding a property with the name '5' and value '10' means that the relationship with name '5' will be receive 10 FlowFiles in each iteration instead of 1.\",\n-                        \"version\": \"1.27.0\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"The name of the specific relationship the FlowFile has been routed through\",\n-                                \"name\": \"distribute.load.relationship\"\n-                            }\n-                        ]\n-                    },\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-standard-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"e0c4461\"\n-                        },\n-                        \"defaultBulletinLevel\": \"WARN\",\n-                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": 1,\n-                            \"EVENT_DRIVEN\": 0,\n-                            \"TIMER_DRIVEN\": 1\n-                        },\n-                        \"defaultPenaltyDuration\": \"30 sec\",\n-                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"0 sec\"\n-                        },\n-                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n-                        \"defaultYieldDuration\": \"1 sec\",\n-                        \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_REQUIRED\",\n-                        \"primaryNodeOnly\": false,\n-                        \"propertyDescriptors\": {\n-                            \"Number of Copies\": {\n-                                \"defaultValue\": \"100\",\n-                                \"description\": \"Specifies how many copies of each incoming FlowFile will be made\",\n-                                \"displayName\": \"Number of Copies\",\n+                            },\n+                            \"Max Buffer Size\": {\n+                                \"defaultValue\": \"1 MB\",\n+                                \"description\": \"The maximum amount of data that can be buffered for a JMS Message. If a FlowFile's size exceeds this value, the FlowFile will be routed to failure.\",\n+                                \"displayName\": \"Max Buffer Size\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Max Buffer Size\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Message Batch Size\": {\n+                                \"defaultValue\": \"10\",\n+                                \"description\": \"The number of messages to pull/push in a single iteration of the processor\",\n+                                \"displayName\": \"Message Batch Size\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Message Batch Size\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Message Priority\": {\n+                                \"description\": \"The Priority of the Message\",\n+                                \"displayName\": \"Message Priority\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Number of Copies\",\n+                                \"name\": \"Message Priority\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Message Time to Live\": {\n+                                \"description\": \"The amount of time that the message should live on the destination before being removed; if not specified, the message will never expire.\",\n+                                \"displayName\": \"Message Time to Live\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Message Time to Live\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Message Type\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"byte\",\n+                                        \"value\": \"byte\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"stream\",\n+                                        \"value\": \"stream\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"text\",\n+                                        \"value\": \"text\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"map\",\n+                                        \"value\": \"map\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"empty\",\n+                                        \"value\": \"empty\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"byte\",\n+                                \"description\": \"The Type of JMS Message to Construct\",\n+                                \"displayName\": \"Message Type\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Message Type\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Password\": {\n+                                \"description\": \"Password used for authentication and authorization\",\n+                                \"displayName\": \"Password\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Password\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n+                            },\n+                            \"Reply-To Queue\": {\n+                                \"description\": \"The name of the queue to which a reply to should be added\",\n+                                \"displayName\": \"Reply-To Queue\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Reply-To Queue\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"SSL Context Service\": {\n+                                \"description\": \"The Controller Service to use in order to obtain an SSL Context.\",\n+                                \"displayName\": \"SSL Context Service\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"SSL Context Service\",\n+                                \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"URL\": {\n+                                \"description\": \"The URL of the JMS Server\",\n+                                \"displayName\": \"URL\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"URL\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n+                            },\n+                            \"Username\": {\n+                                \"description\": \"Username used for authentication and authorization\",\n+                                \"displayName\": \"Username\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Username\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n                             }\n                         },\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.processors.standard.GetJMSQueue\",\n+                            \"org.apache.nifi.processors.standard.GetJMSTopic\"\n+                        ],\n                         \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"The original FlowFile and all copies will be sent to this relationship\",\n+                                \"description\": \"All FlowFiles that are sent to the JMS destination are routed to this relationship\",\n                                 \"name\": \"success\"\n+                            },\n+                            {\n+                                \"description\": \"All FlowFiles that cannot be routed to the JMS destination are routed to this relationship\",\n+                                \"name\": \"failure\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\",\n-                            \"EVENT_DRIVEN\"\n+                            \"CRON_DRIVEN\"\n                         ],\n-                        \"supportsBatching\": true,\n+                        \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": true,\n+                        \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"duplicate\",\n-                            \"load\",\n-                            \"test\"\n+                            \"jms\",\n+                            \"put\",\n+                            \"send\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.standard.DuplicateFlowFile\",\n-                        \"typeDescription\": \"Intended for load testing, this processor will create the configured number of copies of each incoming FlowFile. The original FlowFile as well as all generated copies are sent to the 'success' relationship. In addition, each FlowFile gets an attribute 'copy.index' set to the copy number, where the original FlowFile gets a value of zero, and all copies receive incremented integer values.\",\n-                        \"version\": \"1.27.0\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"A zero-based incrementing integer value based on which copy the FlowFile is.\",\n-                                \"name\": \"copy.index\"\n-                            }\n-                        ]\n+                        \"type\": \"org.apache.nifi.processors.standard.PutJMS\",\n+                        \"typeDescription\": \"Creates a JMS Message from the contents of a FlowFile and sends the message to a ActiveMQ JMS Server.\",\n+                        \"version\": \"1.27.0\"\n                     },\n                     {\n                         \"additionalDetails\": false,\n                         \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n+                            \"EVENT_DRIVEN\": 0,\n                             \"TIMER_DRIVEN\": 1\n                         },\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Encoding\": {\n+                            \"put-record-include-zero-record-results\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"base64\",\n-                                        \"value\": \"base64\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"base32\",\n-                                        \"value\": \"base32\"\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"hex\",\n-                                        \"value\": \"hex\"\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"base64\",\n-                                \"description\": \"Specifies the type of encoding used\",\n-                                \"displayName\": \"Encoding\",\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"If no records are read from the incoming FlowFile, this property specifies whether or not an empty record set will be transmitted. The original FlowFile will still be routed to success, but if no transmission occurs, no provenance SEND event will be generated.\",\n+                                \"displayName\": \"Include Zero Record Results\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Encoding\",\n+                                \"name\": \"put-record-include-zero-record-results\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Mode\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Encode\",\n-                                        \"value\": \"Encode\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Decode\",\n-                                        \"value\": \"Decode\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"Encode\",\n-                                \"description\": \"Specifies whether the content should be encoded or decoded\",\n-                                \"displayName\": \"Mode\",\n+                            \"put-record-reader\": {\n+                                \"description\": \"Specifies the Controller Service to use for reading incoming data\",\n+                                \"displayName\": \"Record Reader\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Mode\",\n+                                \"name\": \"put-record-reader\",\n                                 \"required\": true,\n-                                \"sensitive\": false\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"put-record-sink\": {\n+                                \"description\": \"Specifies the Controller Service to use for writing out the query result records to some destination.\",\n+                                \"displayName\": \"Record Destination Service\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"put-record-sink\",\n+                                \"required\": true,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.record.sink.RecordSinkService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n                             }\n                         },\n-                        \"sideEffectFree\": true,\n+                        \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"Any FlowFile that is successfully encoded or decoded will be routed to success\",\n+                                \"description\": \"The original FlowFile is routed to this relationship if the records could not be transmitted but attempting the operation again may succeed\",\n+                                \"name\": \"retry\"\n+                            },\n+                            {\n+                                \"description\": \"The original FlowFile will be routed to this relationship if the records were transmitted successfully\",\n                                 \"name\": \"success\"\n                             },\n                             {\n-                                \"description\": \"Any FlowFile that cannot be encoded or decoded will be routed to failure\",\n+                                \"description\": \"A FlowFile is routed to this relationship if the records could not be transmitted and retrying the operation will also fail\",\n                                 \"name\": \"failure\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n+                            \"CRON_DRIVEN\",\n+                            \"EVENT_DRIVEN\"\n                         ],\n-                        \"supportsBatching\": true,\n+                        \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": false,\n+                        \"supportsEventDriven\": true,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"base32\",\n-                            \"base64\",\n-                            \"decode\",\n-                            \"encode\",\n-                            \"hex\"\n+                            \"put\",\n+                            \"record\",\n+                            \"sink\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.standard.EncodeContent\",\n-                        \"typeDescription\": \"Encode or decode the contents of a FlowFile using Base64, Base32, or hex encoding schemes\",\n+                        \"type\": \"org.apache.nifi.processors.standard.PutRecord\",\n+                        \"typeDescription\": \"The PutRecord processor uses a specified RecordReader to input (possibly multiple) records from an incoming flow file, and sends them to a destination specified by a Record Destination Service (i.e. record sink).\",\n                         \"version\": \"1.27.0\"\n                     },\n                     {\n-                        \"additionalDetails\": true,\n+                        \"additionalDetails\": false,\n                         \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n-                            \"EVENT_DRIVEN\": 0,\n                             \"TIMER_DRIVEN\": 1\n                         },\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n-                        \"deprecated\": true,\n-                        \"deprecationAlternatives\": [\n-                            \"org.apache.nifi.processors.cipher.DecryptContent\",\n-                            \"org.apache.nifi.processors.cipher.DecryptContentAge\",\n-                            \"org.apache.nifi.processors.cipher.DecryptContentCompatibility\",\n-                            \"org.apache.nifi.processors.cipher.EncryptContentAge\",\n-                            \"org.apache.nifi.processors.pgp.DecryptContentPGP\",\n-                            \"org.apache.nifi.processors.pgp.EncryptContentPGP\"\n-                        ],\n-                        \"deprecationReason\": \"EncryptContentAge or EncryptContentPGP should be used for encrypting new files using standard formatting. DecryptContent supports deciphering historical files.\",\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Encryption Algorithm\": {\n+                            \"Batch Size\": {\n+                                \"defaultValue\": \"500\",\n+                                \"description\": \"The maximum number of FlowFiles to send in a single connection\",\n+                                \"displayName\": \"Batch Size\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Batch Size\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Ciphers Allowed\": {\n+                                \"description\": \"A comma-separated list of Ciphers allowed for SFTP connections. Leave unset to allow all. Available options are: 3des-cbc, 3des-ctr, aes128-cbc, aes128-ctr, aes128-gcm@openssh.com, aes192-cbc, aes192-ctr, aes256-cbc, aes256-ctr, aes256-gcm@openssh.com, arcfour, arcfour128, arcfour256, blowfish-cbc, blowfish-ctr, cast128-cbc, cast128-ctr, chacha20-poly1305@openssh.com, idea-cbc, idea-ctr, serpent128-cbc, serpent128-ctr, serpent192-cbc, serpent192-ctr, serpent256-cbc, serpent256-ctr, twofish-cbc, twofish128-cbc, twofish128-ctr, twofish192-cbc, twofish192-ctr, twofish256-cbc, twofish256-ctr\",\n+                                \"displayName\": \"Ciphers Allowed\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Ciphers Allowed\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Conflict Resolution\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"org.apache.nifi.security.util.EncryptionMethod@634a45d1[Algorithm name=PBEWITHMD5AND128BITAES-CBC-OPENSSL,Requires unlimited strength JCE policy=false,Algorithm Provider=BC,Compatible with strong KDFs=false,Keyed cipher=false]\",\n-                                        \"displayName\": \"MD5_128AES\",\n-                                        \"value\": \"MD5_128AES\"\n-                                    },\n-                                    {\n-                                        \"description\": \"EncryptionMethod[Algorithm name=PBEWITHMD5AND192BITAES-CBC-OPENSSL,Requires unlimited strength JCE policy=true,Algorithm Provider=BC,Compatible with strong KDFs=false,Keyed cipher=false]\",\n-                                        \"displayName\": \"MD5_192AES\",\n-                                        \"value\": \"MD5_192AES\"\n-                                    },\n-                                    {\n-                                        \"description\": \"EncryptionMethod[Algorithm name=PBEWITHMD5AND256BITAES-CBC-OPENSSL,Requires unlimited strength JCE policy=true,Algorithm Provider=BC,Compatible with strong KDFs=false,Keyed cipher=false]\",\n-                                        \"displayName\": \"MD5_256AES\",\n-                                        \"value\": \"MD5_256AES\"\n-                                    },\n-                                    {\n-                                        \"description\": \"EncryptionMethod[Algorithm name=PBEWITHMD5ANDDES,Requires unlimited strength JCE policy=false,Algorithm Provider=BC,Compatible with strong KDFs=false,Keyed cipher=false]\",\n-                                        \"displayName\": \"MD5_DES\",\n-                                        \"value\": \"MD5_DES\"\n-                                    },\n-                                    {\n-                                        \"description\": \"EncryptionMethod[Algorithm name=PBEWITHMD5ANDRC2,Requires unlimited strength JCE policy=false,Algorithm Provider=BC,Compatible with strong KDFs=false,Keyed cipher=false]\",\n-                                        \"displayName\": \"MD5_RC2\",\n-                                        \"value\": \"MD5_RC2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"EncryptionMethod[Algorithm name=PBEWITHSHA1ANDRC2,Requires unlimited strength JCE policy=false,Algorithm Provider=BC,Compatible with strong KDFs=false,Keyed cipher=false]\",\n-                                        \"displayName\": \"SHA1_RC2\",\n-                                        \"value\": \"SHA1_RC2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"EncryptionMethod[Algorithm name=PBEWITHSHA1ANDDES,Requires unlimited strength JCE policy=false,Algorithm Provider=BC,Compatible with strong KDFs=false,Keyed cipher=false]\",\n-                                        \"displayName\": \"SHA1_DES\",\n-                                        \"value\": \"SHA1_DES\"\n-                                    },\n-                                    {\n-                                        \"description\": \"EncryptionMethod[Algorithm name=PBEWITHSHAAND128BITAES-CBC-BC,Requires unlimited strength JCE policy=false,Algorithm Provider=BC,Compatible with strong KDFs=false,Keyed cipher=false]\",\n-                                        \"displayName\": \"SHA_128AES\",\n-                                        \"value\": \"SHA_128AES\"\n-                                    },\n-                                    {\n-                                        \"description\": \"EncryptionMethod[Algorithm name=PBEWITHSHAAND192BITAES-CBC-BC,Requires unlimited strength JCE policy=true,Algorithm Provider=BC,Compatible with strong KDFs=false,Keyed cipher=false]\",\n-                                        \"displayName\": \"SHA_192AES\",\n-                                        \"value\": \"SHA_192AES\"\n-                                    },\n-                                    {\n-                                        \"description\": \"EncryptionMethod[Algorithm name=PBEWITHSHAAND256BITAES-CBC-BC,Requires unlimited strength JCE policy=true,Algorithm Provider=BC,Compatible with strong KDFs=false,Keyed cipher=false]\",\n-                                        \"displayName\": \"SHA_256AES\",\n-                                        \"value\": \"SHA_256AES\"\n-                                    },\n-                                    {\n-                                        \"description\": \"EncryptionMethod[Algorithm name=PBEWITHSHAAND40BITRC2-CBC,Requires unlimited strength JCE policy=false,Algorithm Provider=BC,Compatible with strong KDFs=false,Keyed cipher=false]\",\n-                                        \"displayName\": \"SHA_40RC2\",\n-                                        \"value\": \"SHA_40RC2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"EncryptionMethod[Algorithm name=PBEWITHSHAAND128BITRC2-CBC,Requires unlimited strength JCE policy=false,Algorithm Provider=BC,Compatible with strong KDFs=false,Keyed cipher=false]\",\n-                                        \"displayName\": \"SHA_128RC2\",\n-                                        \"value\": \"SHA_128RC2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"EncryptionMethod[Algorithm name=PBEWITHSHAAND40BITRC4,Requires unlimited strength JCE policy=false,Algorithm Provider=BC,Compatible with strong KDFs=false,Keyed cipher=false]\",\n-                                        \"displayName\": \"SHA_40RC4\",\n-                                        \"value\": \"SHA_40RC4\"\n-                                    },\n-                                    {\n-                                        \"description\": \"EncryptionMethod[Algorithm name=PBEWITHSHAAND128BITRC4,Requires unlimited strength JCE policy=false,Algorithm Provider=BC,Compatible with strong KDFs=false,Keyed cipher=false]\",\n-                                        \"displayName\": \"SHA_128RC4\",\n-                                        \"value\": \"SHA_128RC4\"\n-                                    },\n-                                    {\n-                                        \"description\": \"EncryptionMethod[Algorithm name=PBEWITHSHA256AND128BITAES-CBC-BC,Requires unlimited strength JCE policy=false,Algorithm Provider=BC,Compatible with strong KDFs=false,Keyed cipher=false]\",\n-                                        \"displayName\": \"SHA256_128AES\",\n-                                        \"value\": \"SHA256_128AES\"\n-                                    },\n-                                    {\n-                                        \"description\": \"EncryptionMethod[Algorithm name=PBEWITHSHA256AND192BITAES-CBC-BC,Requires unlimited strength JCE policy=true,Algorithm Provider=BC,Compatible with strong KDFs=false,Keyed cipher=false]\",\n-                                        \"displayName\": \"SHA256_192AES\",\n-                                        \"value\": \"SHA256_192AES\"\n-                                    },\n-                                    {\n-                                        \"description\": \"EncryptionMethod[Algorithm name=PBEWITHSHA256AND256BITAES-CBC-BC,Requires unlimited strength JCE policy=true,Algorithm Provider=BC,Compatible with strong KDFs=false,Keyed cipher=false]\",\n-                                        \"displayName\": \"SHA256_256AES\",\n-                                        \"value\": \"SHA256_256AES\"\n-                                    },\n-                                    {\n-                                        \"description\": \"EncryptionMethod[Algorithm name=PBEWITHSHAAND2-KEYTRIPLEDES-CBC,Requires unlimited strength JCE policy=false,Algorithm Provider=BC,Compatible with strong KDFs=false,Keyed cipher=false]\",\n-                                        \"displayName\": \"SHA_2KEYTRIPLEDES\",\n-                                        \"value\": \"SHA_2KEYTRIPLEDES\"\n-                                    },\n-                                    {\n-                                        \"description\": \"EncryptionMethod[Algorithm name=PBEWITHSHAAND3-KEYTRIPLEDES-CBC,Requires unlimited strength JCE policy=false,Algorithm Provider=BC,Compatible with strong KDFs=false,Keyed cipher=false]\",\n-                                        \"displayName\": \"SHA_3KEYTRIPLEDES\",\n-                                        \"value\": \"SHA_3KEYTRIPLEDES\"\n-                                    },\n-                                    {\n-                                        \"description\": \"EncryptionMethod[Algorithm name=PBEWITHSHAANDTWOFISH-CBC,Requires unlimited strength JCE policy=false,Algorithm Provider=BC,Compatible with strong KDFs=false,Keyed cipher=false]\",\n-                                        \"displayName\": \"SHA_TWOFISH\",\n-                                        \"value\": \"SHA_TWOFISH\"\n-                                    },\n-                                    {\n-                                        \"description\": \"EncryptionMethod[Algorithm name=PGP,Requires unlimited strength JCE policy=false,Algorithm Provider=BC,Compatible with strong KDFs=false,Keyed cipher=false]\",\n-                                        \"displayName\": \"PGP\",\n-                                        \"value\": \"PGP\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"REPLACE\",\n+                                        \"value\": \"REPLACE\"\n                                     },\n                                     {\n-                                        \"description\": \"EncryptionMethod[Algorithm name=PGP-ASCII-ARMOR,Requires unlimited strength JCE policy=false,Algorithm Provider=BC,Compatible with strong KDFs=false,Keyed cipher=false]\",\n-                                        \"displayName\": \"PGP_ASCII_ARMOR\",\n-                                        \"value\": \"PGP_ASCII_ARMOR\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"IGNORE\",\n+                                        \"value\": \"IGNORE\"\n                                     },\n                                     {\n-                                        \"description\": \"EncryptionMethod[Algorithm name=AES/CBC/NoPadding,Requires unlimited strength JCE policy=false,Algorithm Provider=BC,Compatible with strong KDFs=true,Keyed cipher=true]\",\n-                                        \"displayName\": \"AES_CBC_NO_PADDING\",\n-                                        \"value\": \"AES_CBC_NO_PADDING\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"RENAME\",\n+                                        \"value\": \"RENAME\"\n                                     },\n                                     {\n-                                        \"description\": \"EncryptionMethod[Algorithm name=AES/CBC/PKCS7Padding,Requires unlimited strength JCE policy=false,Algorithm Provider=BC,Compatible with strong KDFs=true,Keyed cipher=true]\",\n-                                        \"displayName\": \"AES_CBC\",\n-                                        \"value\": \"AES_CBC\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"REJECT\",\n+                                        \"value\": \"REJECT\"\n                                     },\n                                     {\n-                                        \"description\": \"EncryptionMethod[Algorithm name=AES/CTR/NoPadding,Requires unlimited strength JCE policy=false,Algorithm Provider=BC,Compatible with strong KDFs=true,Keyed cipher=true]\",\n-                                        \"displayName\": \"AES_CTR\",\n-                                        \"value\": \"AES_CTR\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"FAIL\",\n+                                        \"value\": \"FAIL\"\n                                     },\n                                     {\n-                                        \"description\": \"EncryptionMethod[Algorithm name=AES/GCM/NoPadding,Requires unlimited strength JCE policy=false,Algorithm Provider=BC,Compatible with strong KDFs=true,Keyed cipher=true]\",\n-                                        \"displayName\": \"AES_GCM\",\n-                                        \"value\": \"AES_GCM\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"NONE\",\n+                                        \"value\": \"NONE\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"AES_GCM\",\n-                                \"description\": \"The Encryption Algorithm to use\",\n-                                \"displayName\": \"Encryption Algorithm\",\n+                                \"defaultValue\": \"NONE\",\n+                                \"description\": \"Determines how to handle the problem of filename collisions\",\n+                                \"displayName\": \"Conflict Resolution\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Encryption Algorithm\",\n+                                \"name\": \"Conflict Resolution\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Mode\": {\n+                            \"Connection Timeout\": {\n+                                \"defaultValue\": \"30 sec\",\n+                                \"description\": \"Amount of time to wait before timing out while creating a connection\",\n+                                \"displayName\": \"Connection Timeout\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Connection Timeout\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Create Directory\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"Encrypt\",\n-                                        \"value\": \"Encrypt\"\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"Decrypt\",\n-                                        \"value\": \"Decrypt\"\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"Encrypt\",\n-                                \"description\": \"Specifies whether the content should be encrypted or decrypted\",\n-                                \"displayName\": \"Mode\",\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"Specifies whether or not the remote directory should be created if it does not exist.\",\n+                                \"displayName\": \"Create Directory\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Mode\",\n+                                \"name\": \"Create Directory\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Password\": {\n-                                \"description\": \"The Password to use for encrypting or decrypting the data\",\n-                                \"displayName\": \"Password\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Password\",\n-                                \"required\": false,\n-                                \"sensitive\": true\n-                            },\n-                            \"allow-weak-crypto\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"Operation will not be blocked and no alerts will be presented when unsafe combinations of encryption algorithms and passwords are provided\",\n-                                        \"displayName\": \"Allowed\",\n-                                        \"value\": \"allowed\"\n-                                    },\n-                                    {\n-                                        \"description\": \"When set, operation will be blocked and alerts will be presented to the user if unsafe combinations of encryption algorithms and passwords are provided on a JVM with limited strength crypto. To fix this, see the Admin Guide.\",\n-                                        \"displayName\": \"Not Allowed\",\n-                                        \"value\": \"not-allowed\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"not-allowed\",\n-                                \"description\": \"Overrides the default behavior to prevent unsafe combinations of encryption algorithms and short passwords on JVMs with limited strength cryptographic jurisdiction policies\",\n-                                \"displayName\": \"Allow insecure cryptographic modes\",\n+                            \"Data Timeout\": {\n+                                \"defaultValue\": \"30 sec\",\n+                                \"description\": \"When transferring a file between the local and remote system, this value specifies how long is allowed to elapse without any data being transferred between systems\",\n+                                \"displayName\": \"Data Timeout\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"allow-weak-crypto\",\n+                                \"name\": \"Data Timeout\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"key-derivation-function\": {\n+                            \"Disable Directory Listing\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"The cipher is given a raw key conforming to the algorithm specifications\",\n-                                        \"displayName\": \"None\",\n-                                        \"value\": \"NONE\"\n-                                    },\n-                                    {\n-                                        \"description\": \"MD5 @ 1000 iterations\",\n-                                        \"displayName\": \"NiFi Legacy KDF\",\n-                                        \"value\": \"NIFI_LEGACY\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Single iteration MD5 compatible with PKCS#5 v1.5\",\n-                                        \"displayName\": \"OpenSSL EVP_BytesToKey\",\n-                                        \"value\": \"OPENSSL_EVP_BYTES_TO_KEY\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Bcrypt with configurable work factor. See Admin Guide\",\n-                                        \"displayName\": \"Bcrypt\",\n-                                        \"value\": \"BCRYPT\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Scrypt with configurable cost parameters. See Admin Guide\",\n-                                        \"displayName\": \"Scrypt\",\n-                                        \"value\": \"SCRYPT\"\n-                                    },\n-                                    {\n-                                        \"description\": \"PBKDF2 with configurable hash function and iteration count. See Admin Guide\",\n-                                        \"displayName\": \"PBKDF2\",\n-                                        \"value\": \"PBKDF2\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n-                                        \"description\": \"Argon2 with configurable cost parameters. See Admin Guide.\",\n-                                        \"displayName\": \"Argon2\",\n-                                        \"value\": \"ARGON2\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"NONE\",\n-                                \"description\": \"Specifies the key derivation function to generate the key from the password (and salt)\",\n-                                \"displayName\": \"Key Derivation Function\",\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"If set to 'true', directory listing is not performed prior to create missing directories. By default, this processor executes a directory listing command to see target directory existence before creating missing directories. However, there are situations that you might need to disable the directory listing such as the following. Directory listing might fail with some permission setups (e.g. chmod 100) on a directory. Also, if any other SFTP client created the directory after this processor performed a listing and before a directory creation request by this processor is finished, then an error is returned because the directory already exists.\",\n+                                \"displayName\": \"Disable Directory Listing\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"key-derivation-function\",\n-                                \"required\": true,\n+                                \"name\": \"Disable Directory Listing\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"pgp-symmetric-cipher\": {\n+                            \"Dot Rename\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"IDEA\",\n-                                        \"value\": \"1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"TRIPLE_DES\",\n-                                        \"value\": \"2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"CAST5\",\n-                                        \"value\": \"3\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"BLOWFISH\",\n-                                        \"value\": \"4\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"DES\",\n-                                        \"value\": \"6\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"AES_128\",\n-                                        \"value\": \"7\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"AES_192\",\n-                                        \"value\": \"8\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"AES_256\",\n-                                        \"value\": \"9\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"TWOFISH\",\n-                                        \"value\": \"10\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"CAMELLIA_128\",\n-                                        \"value\": \"11\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"CAMELLIA_192\",\n-                                        \"value\": \"12\"\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"CAMELLIA_256\",\n-                                        \"value\": \"13\"\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"7\",\n-                                \"description\": \"When using PGP encryption, this is the symmetric cipher to be used. This property is ignored if Encryption Algorithm is not PGP or PGP-ASCII-ARMOR\\nNote that the provided cipher is only used duringthe encryption phase, while it is inferred from the ciphertext in the decryption phase\",\n-                                \"displayName\": \"PGP Symmetric Cipher\",\n+                                \"defaultValue\": \"true\",\n+                                \"description\": \"If true, then the filename of the sent file is prepended with a \\\".\\\" and then renamed back to the original once the file is completely sent. Otherwise, there is no rename. This property is ignored if the Temporary Filename property is set.\",\n+                                \"displayName\": \"Dot Rename\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"pgp-symmetric-cipher\",\n+                                \"name\": \"Dot Rename\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"private-keyring-file\": {\n-                                \"description\": \"In a PGP decrypt mode, this keyring contains the private key of the recipient\",\n-                                \"displayName\": \"Private Keyring File\",\n+                            \"Host Key File\": {\n+                                \"description\": \"If supplied, the given file will be used as the Host Key; otherwise, if 'Strict Host Key Checking' property is applied (set to true) then uses the 'known_hosts' and 'known_hosts2' files from ~/.ssh directory else no host key file will be used\",\n+                                \"displayName\": \"Host Key File\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"private-keyring-file\",\n+                                \"name\": \"Host Key File\",\n                                 \"required\": false,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"SINGLE\",\n+                                    \"resourceTypes\": [\n+                                        \"FILE\"\n+                                    ]\n+                                },\n                                 \"sensitive\": false\n                             },\n-                            \"private-keyring-passphrase\": {\n-                                \"description\": \"In a PGP decrypt mode, this is the private keyring passphrase\",\n-                                \"displayName\": \"Private Keyring Passphrase\",\n+                            \"Hostname\": {\n+                                \"description\": \"The fully qualified hostname or IP address of the remote system\",\n+                                \"displayName\": \"Hostname\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Hostname\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Http Proxy Password\": {\n+                                \"description\": \"Http Proxy Password\",\n+                                \"displayName\": \"Http Proxy Password\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"private-keyring-passphrase\",\n+                                \"name\": \"Http Proxy Password\",\n                                 \"required\": false,\n                                 \"sensitive\": true\n                             },\n-                            \"public-key-user-id\": {\n-                                \"description\": \"In a PGP encrypt mode, this user id of the recipient\",\n-                                \"displayName\": \"Public Key User Id\",\n+                            \"Http Proxy Username\": {\n+                                \"description\": \"Http Proxy Username\",\n+                                \"displayName\": \"Http Proxy Username\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"public-key-user-id\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Http Proxy Username\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"public-keyring-file\": {\n-                                \"description\": \"In a PGP encrypt mode, this keyring contains the public key of the recipient\",\n-                                \"displayName\": \"Public Keyring File\",\n+                            \"Key Algorithms Allowed\": {\n+                                \"description\": \"A comma-separated list of Key Algorithms allowed for SFTP connections. Leave unset to allow all. Available options are: ecdsa-sha2-nistp256, ecdsa-sha2-nistp256-cert-v01@openssh.com, ecdsa-sha2-nistp384, ecdsa-sha2-nistp384-cert-v01@openssh.com, ecdsa-sha2-nistp521, ecdsa-sha2-nistp521-cert-v01@openssh.com, rsa-sha2-256, rsa-sha2-512, ssh-dss, ssh-dss-cert-v01@openssh.com, ssh-ed25519, ssh-ed25519-cert-v01@openssh.com, ssh-rsa, ssh-rsa-cert-v01@openssh.com\",\n+                                \"displayName\": \"Key Algorithms Allowed\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"public-keyring-file\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Key Algorithms Allowed\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"raw-key-hex\": {\n-                                \"description\": \"In keyed encryption, this is the raw key, encoded in hexadecimal\",\n-                                \"displayName\": \"Raw Key (hexadecimal)\",\n+                            \"Key Exchange Algorithms Allowed\": {\n+                                \"description\": \"A comma-separated list of Key Exchange Algorithms allowed for SFTP connections. Leave unset to allow all. Available options are: curve25519-sha256, curve25519-sha256@libssh.org, diffie-hellman-group-exchange-sha1, diffie-hellman-group-exchange-sha256, diffie-hellman-group1-sha1, diffie-hellman-group14-sha1, diffie-hellman-group14-sha256, diffie-hellman-group14-sha256@ssh.com, diffie-hellman-group15-sha256, diffie-hellman-group15-sha256@ssh.com, diffie-hellman-group15-sha384@ssh.com, diffie-hellman-group15-sha512, diffie-hellman-group16-sha256, diffie-hellman-group16-sha384@ssh.com, diffie-hellman-group16-sha512, diffie-hellman-group16-sha512@ssh.com, diffie-hellman-group17-sha512, diffie-hellman-group18-sha512, diffie-hellman-group18-sha512@ssh.com, ecdh-sha2-nistp256, ecdh-sha2-nistp384, ecdh-sha2-nistp521, ext-info-c\",\n+                                \"displayName\": \"Key Exchange Algorithms Allowed\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"raw-key-hex\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Key Exchange Algorithms Allowed\",\n                                 \"required\": false,\n-                                \"sensitive\": true\n-                            }\n-                        },\n-                        \"sideEffectFree\": true,\n-                        \"supportedRelationships\": [\n-                            {\n-                                \"description\": \"Any FlowFile that is successfully encrypted or decrypted will be routed to success\",\n-                                \"name\": \"success\"\n-                            },\n-                            {\n-                                \"description\": \"Any FlowFile that cannot be encrypted or decrypted will be routed to failure\",\n-                                \"name\": \"failure\"\n-                            }\n-                        ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\",\n-                            \"EVENT_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": true,\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": true,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"systemResourceConsiderations\": [\n-                            {\n-                                \"description\": \"An instance of this component can cause high usage of this system resource.  Multiple instances or high concurrency settings may result a degradation of performance.\",\n-                                \"resource\": \"CPU\"\n-                            }\n-                        ],\n-                        \"tags\": [\n-                            \"Argon2\",\n-                            \"Bcrypt\",\n-                            \"JCE\",\n-                            \"KDF\",\n-                            \"PBKDF2\",\n-                            \"Scrypt\",\n-                            \"decryption\",\n-                            \"encryption\",\n-                            \"iv\",\n-                            \"password\",\n-                            \"salt\"\n-                        ],\n-                        \"triggerSerially\": false,\n-                        \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.standard.EncryptContent\",\n-                        \"typeDescription\": \"Encrypts or Decrypts a FlowFile using either symmetric encryption with a raw key or password and randomly generated salt, or asymmetric encryption using a public and secret key.\",\n-                        \"version\": \"1.27.0\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"\\\"encrypted\\\" or \\\"decrypted\\\" depending on the processor action\",\n-                                \"name\": \"encryptcontent.action\"\n-                            },\n-                            {\n-                                \"description\": \"The algorithm used for the cryptographic operation\",\n-                                \"name\": \"encryptcontent.algorithm\"\n+                                \"sensitive\": false\n                             },\n-                            {\n-                                \"description\": \"The cipher text length in bytes (including IV, salt, and delimiters if present). Determined from incoming content in decrypt mode; outgoing content in encrypt mode\",\n-                                \"name\": \"encryptcontent.cipher_text_length\"\n+                            \"Last Modified Time\": {\n+                                \"description\": \"The lastModifiedTime to assign to the file after transferring it. If not set, the lastModifiedTime will not be changed. Format must be yyyy-MM-dd'T'HH:mm:ssZ. You may also use expression language such as ${file.lastModifiedTime}. If the value is invalid, the processor will not be invalid but will fail to change lastModifiedTime of the file.\",\n+                                \"displayName\": \"Last Modified Time\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Last Modified Time\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n                             },\n-                            {\n-                                \"description\": \"The Initialization Vector in hex encoding (if present)\",\n-                                \"name\": \"encryptcontent.iv\"\n+                            \"Message Authentication Codes Allowed\": {\n+                                \"description\": \"A comma-separated list of Message Authentication Codes allowed for SFTP connections. Leave unset to allow all. Available options are: hmac-md5, hmac-md5-96, hmac-md5-96-etm@openssh.com, hmac-md5-etm@openssh.com, hmac-ripemd160, hmac-ripemd160-96, hmac-ripemd160-etm@openssh.com, hmac-ripemd160@openssh.com, hmac-sha1, hmac-sha1-96, hmac-sha1-96@openssh.com, hmac-sha1-etm@openssh.com, hmac-sha2-256, hmac-sha2-256-etm@openssh.com, hmac-sha2-512, hmac-sha2-512-etm@openssh.com\",\n+                                \"displayName\": \"Message Authentication Codes Allowed\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Message Authentication Codes Allowed\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n                             },\n-                            {\n-                                \"description\": \"The IV length in bytes\",\n-                                \"name\": \"encryptcontent.iv_length\"\n+                            \"Password\": {\n+                                \"description\": \"Password for the user account\",\n+                                \"displayName\": \"Password\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Password\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n                             },\n-                            {\n-                                \"description\": \"The Key Derivation Function used if Password-Based Encryption was enabled. See Admin Guide - Key Derivation Functions\",\n-                                \"name\": \"encryptcontent.kdf\"\n+                            \"Permissions\": {\n+                                \"description\": \"The permissions to assign to the file after transferring it. Format must be either UNIX rwxrwxrwx with a - in place of denied permissions (e.g. rw-r--r--) or an octal number (e.g. 644). If not set, the permissions will not be changed. You may also use expression language such as ${file.permissions}. If the value is invalid, the processor will not be invalid but will fail to change permissions of the file.\",\n+                                \"displayName\": \"Permissions\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Permissions\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n                             },\n-                            {\n-                                \"description\": \"The KDF-specific salt including algorithm and cost parameters (if present). See Admin Guide - Key Derivation Functions\",\n-                                \"name\": \"encryptcontent.kdf_salt\"\n+                            \"Port\": {\n+                                \"defaultValue\": \"22\",\n+                                \"description\": \"The port that the remote system is listening on for file transfers\",\n+                                \"displayName\": \"Port\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Port\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n                             },\n-                            {\n-                                \"description\": \"The KDF salt length in bytes\",\n-                                \"name\": \"encryptcontent.kdf_salt_length\"\n+                            \"Private Key Passphrase\": {\n+                                \"description\": \"Password for the private key\",\n+                                \"displayName\": \"Private Key Passphrase\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Private Key Passphrase\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n                             },\n-                            {\n-                                \"description\": \"The number of iterations used in PBKDF2 KDF (if present). PBKDF2 does not encode the cost parameter in a custom salt\",\n-                                \"name\": \"encryptcontent.pbkdf2_iterations\"\n+                            \"Private Key Path\": {\n+                                \"description\": \"The fully qualified path to the Private Key file\",\n+                                \"displayName\": \"Private Key Path\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Private Key Path\",\n+                                \"required\": false,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"SINGLE\",\n+                                    \"resourceTypes\": [\n+                                        \"FILE\"\n+                                    ]\n+                                },\n+                                \"sensitive\": false\n                             },\n-                            {\n-                                \"description\": \"The plaintext length in bytes. Determined from incoming content in encrypt mode; outgoing content in decrypt mode\",\n-                                \"name\": \"encryptcontent.plaintext_length\"\n+                            \"Proxy Host\": {\n+                                \"description\": \"The fully qualified hostname or IP address of the proxy server\",\n+                                \"displayName\": \"Proxy Host\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Proxy Host\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n                             },\n-                            {\n-                                \"description\": \"The raw salt in hex encoding (if present)\",\n-                                \"name\": \"encryptcontent.salt\"\n+                            \"Proxy Port\": {\n+                                \"description\": \"The port of the proxy server\",\n+                                \"displayName\": \"Proxy Port\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Proxy Port\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n                             },\n-                            {\n-                                \"description\": \"The raw salt length in bytes\",\n-                                \"name\": \"encryptcontent.salt_length\"\n+                            \"Proxy Type\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"DIRECT\",\n+                                        \"value\": \"DIRECT\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"HTTP\",\n+                                        \"value\": \"HTTP\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"SOCKS\",\n+                                        \"value\": \"SOCKS\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"DIRECT\",\n+                                \"description\": \"Proxy type used for file transfers\",\n+                                \"displayName\": \"Proxy Type\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Proxy Type\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n                             },\n-                            {\n-                                \"description\": \"The timestamp at which the cryptographic operation occurred in 'yyyy-MM-dd HH:mm:ss.SSS Z' format\",\n-                                \"name\": \"encryptcontent.timestamp\"\n-                            }\n-                        ]\n-                    },\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-standard-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"e0c4461\"\n-                        },\n-                        \"defaultBulletinLevel\": \"WARN\",\n-                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": 1,\n-                            \"EVENT_DRIVEN\": 0,\n-                            \"TIMER_DRIVEN\": 1\n-                        },\n-                        \"defaultPenaltyDuration\": \"30 sec\",\n-                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"0 sec\"\n-                        },\n-                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n-                        \"defaultYieldDuration\": \"1 sec\",\n-                        \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_REQUIRED\",\n-                        \"primaryNodeOnly\": false,\n-                        \"propertyDescriptors\": {\n-                            \"batch-count\": {\n-                                \"defaultValue\": \"1000\",\n-                                \"description\": \"The maximum number of FlowFiles that EnforceOrder can process at an execution.\",\n-                                \"displayName\": \"Batch Count\",\n+                            \"Reject Zero-Byte Files\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"true\",\n+                                \"description\": \"Determines whether or not Zero-byte files should be rejected without attempting to transfer\",\n+                                \"displayName\": \"Reject Zero-Byte Files\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"batch-count\",\n-                                \"required\": true,\n+                                \"name\": \"Reject Zero-Byte Files\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"group-id\": {\n-                                \"defaultValue\": \"${filename}\",\n-                                \"description\": \"EnforceOrder is capable of multiple ordering groups. 'Group Identifier' is used to determine which group a FlowFile belongs to. This property will be evaluated with each incoming FlowFile. If evaluated result is empty, the FlowFile will be routed to failure.\",\n-                                \"displayName\": \"Group Identifier\",\n+                            \"Remote Group\": {\n+                                \"description\": \"Integer value representing the Group ID to set on the file after transferring it. If not set, the group will not be set. You may also use expression language such as ${file.group}. If the value is invalid, the processor will not be invalid but will fail to change the group of the file.\",\n+                                \"displayName\": \"Remote Group\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"group-id\",\n-                                \"required\": true,\n+                                \"name\": \"Remote Group\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"inactive-timeout\": {\n-                                \"defaultValue\": \"30 min\",\n-                                \"description\": \"Indicates the duration after which state for an inactive group will be cleared from managed state. Group is determined as inactive if any new incoming FlowFile has not seen for a group for specified duration. Inactive Timeout must be longer than Wait Timeout. If a FlowFile arrives late after its group is already cleared, it will be treated as a brand new group, but will never match the order since expected preceding FlowFiles are already gone. The FlowFile will eventually timeout for waiting and routed to 'overtook'. To avoid this, group states should be kept long enough, however, shorter duration would be helpful for reusing the same group identifier again.\",\n-                                \"displayName\": \"Inactive Timeout\",\n+                            \"Remote Owner\": {\n+                                \"description\": \"Integer value representing the User ID to set on the file after transferring it. If not set, the owner will not be set. You may also use expression language such as ${file.owner}. If the value is invalid, the processor will not be invalid but will fail to change the owner of the file.\",\n+                                \"displayName\": \"Remote Owner\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Remote Owner\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Remote Path\": {\n+                                \"description\": \"The path on the remote system from which to pull or push files\",\n+                                \"displayName\": \"Remote Path\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Remote Path\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Send Keep Alive On Timeout\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"true\",\n+                                \"description\": \"Send a Keep Alive message every 5 seconds up to 5 times for an overall timeout of 25 seconds.\",\n+                                \"displayName\": \"Send Keep Alive On Timeout\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"inactive-timeout\",\n+                                \"name\": \"Send Keep Alive On Timeout\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"initial-order\": {\n-                                \"defaultValue\": \"0\",\n-                                \"description\": \"When the first FlowFile of a group arrives, initial target order will be computed and stored in the managed state. After that, target order will start being tracked by EnforceOrder and stored in the state management store. If Expression Language is used but evaluated result was not an integer, then the FlowFile will be routed to failure, and initial order will be left unknown until consecutive FlowFiles provide a valid initial order.\",\n-                                \"displayName\": \"Initial Order\",\n+                            \"Strict Host Key Checking\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"Indicates whether or not strict enforcement of hosts keys should be applied\",\n+                                \"displayName\": \"Strict Host Key Checking\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"initial-order\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Strict Host Key Checking\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"maximum-order\": {\n-                                \"description\": \"If specified, any FlowFiles that have larger order will be routed to failure. This property is computed only once for a given group. After a maximum order is computed, it will be persisted in the state management store and used for other FlowFiles belonging to the same group. If Expression Language is used but evaluated result was not an integer, then the FlowFile will be routed to failure, and maximum order will be left unknown until consecutive FlowFiles provide a valid maximum order.\",\n-                                \"displayName\": \"Maximum Order\",\n+                            \"Temporary Filename\": {\n+                                \"description\": \"If set, the filename of the sent file will be equal to the value specified during the transfer and after successful completion will be renamed to the original filename. If this value is set, the Dot Rename property is ignored.\",\n+                                \"displayName\": \"Temporary Filename\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"maximum-order\",\n+                                \"name\": \"Temporary Filename\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"order-attribute\": {\n-                                \"description\": \"A name of FlowFile attribute whose value will be used to enforce order of FlowFiles within a group. If a FlowFile does not have this attribute, or its value is not an integer, the FlowFile will be routed to failure.\",\n-                                \"displayName\": \"Order Attribute\",\n+                            \"Use Compression\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"Indicates whether or not ZLIB compression should be used when transferring files\",\n+                                \"displayName\": \"Use Compression\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"order-attribute\",\n+                                \"name\": \"Use Compression\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"wait-timeout\": {\n-                                \"defaultValue\": \"10 min\",\n-                                \"description\": \"Indicates the duration after which waiting FlowFiles will be routed to the 'overtook' relationship.\",\n-                                \"displayName\": \"Wait Timeout\",\n+                            \"Username\": {\n+                                \"description\": \"Username\",\n+                                \"displayName\": \"Username\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"wait-timeout\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Username\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n+                            },\n+                            \"proxy-configuration-service\": {\n+                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests. If set, it supersedes proxy settings configured per component. Supported proxies: HTTP + AuthN, SOCKS + AuthN\",\n+                                \"displayName\": \"Proxy Configuration Service\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"proxy-configuration-service\",\n+                                \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.proxy.ProxyConfigurationService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n                             }\n                         },\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.processors.standard.GetSFTP\"\n+                        ],\n                         \"sideEffectFree\": false,\n-                        \"stateful\": {\n-                            \"description\": \"EnforceOrder uses following states per ordering group: '<groupId>.target' is a order number which is being waited to arrive next. When a FlowFile with a matching order arrives, or a FlowFile overtakes the FlowFile being waited for because of wait timeout, target order will be updated to (FlowFile.order + 1). '<groupId>.max is the maximum order number for a group. '<groupId>.updatedAt' is a timestamp when the order of a group was updated last time. These managed states will be removed automatically once a group is determined as inactive, see 'Inactive Timeout' for detail.\",\n-                            \"scopes\": [\n-                                \"LOCAL\"\n-                            ]\n-                        },\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"A FlowFile that waited for preceding FlowFiles longer than Wait Timeout and overtook those FlowFiles, will be routed to this relationship.\",\n-                                \"name\": \"overtook\"\n-                            },\n-                            {\n-                                \"description\": \"A FlowFile that has an order younger than current, which means arrived too late and skipped, will be routed to this relationship.\",\n-                                \"name\": \"skipped\"\n-                            },\n-                            {\n-                                \"description\": \"A FlowFile with a matching order number will be routed to this relationship.\",\n+                                \"description\": \"FlowFiles that are successfully sent will be routed to success\",\n                                 \"name\": \"success\"\n                             },\n                             {\n-                                \"description\": \"A FlowFile with non matching order will be routed to this relationship\",\n-                                \"name\": \"wait\"\n+                                \"description\": \"FlowFiles that were rejected by the destination system\",\n+                                \"name\": \"reject\"\n                             },\n                             {\n-                                \"description\": \"A FlowFiles which does not have required attributes, or fails to compute those will be routed to this relationship\",\n+                                \"description\": \"FlowFiles that failed to send to the remote system; failure is usually looped back to this processor\",\n                                 \"name\": \"failure\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\",\n-                            \"EVENT_DRIVEN\"\n+                            \"CRON_DRIVEN\"\n                         ],\n-                        \"supportsBatching\": false,\n+                        \"supportsBatching\": true,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": true,\n+                        \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"order\",\n-                            \"sort\"\n+                            \"archive\",\n+                            \"copy\",\n+                            \"egress\",\n+                            \"files\",\n+                            \"put\",\n+                            \"remote\",\n+                            \"sftp\"\n                         ],\n-                        \"triggerSerially\": true,\n+                        \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.standard.EnforceOrder\",\n-                        \"typeDescription\": \"Enforces expected ordering of FlowFiles that belong to the same data group within a single node.  Although PriorityAttributePrioritizer can be used on a connection to ensure that flow files going through that connection are in priority order, depending on error-handling, branching, and other flow designs, it is possible for FlowFiles to get out-of-order. EnforceOrder can be used to enforce original ordering for those FlowFiles. [IMPORTANT] In order to take effect of EnforceOrder, FirstInFirstOutPrioritizer should be used at EVERY downstream relationship UNTIL the order of FlowFiles physically get FIXED by operation such as MergeContent or being stored to the final destination.\",\n-                        \"version\": \"1.27.0\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"All FlowFiles going through this processor will have this attribute. This value is used to determine wait timeout.\",\n-                                \"name\": \"EnforceOrder.startedAt\"\n-                            },\n-                            {\n-                                \"description\": \"All FlowFiles going through this processor will have this attribute denoting which relationship it was routed to.\",\n-                                \"name\": \"EnforceOrder.result\"\n-                            },\n-                            {\n-                                \"description\": \"FlowFiles routed to 'failure' or 'skipped' relationship will have this attribute describing details.\",\n-                                \"name\": \"EnforceOrder.detail\"\n-                            },\n-                            {\n-                                \"description\": \"FlowFiles routed to 'wait' or 'skipped' relationship will have this attribute denoting expected order when the FlowFile was processed.\",\n-                                \"name\": \"EnforceOrder.expectedOrder\"\n-                            }\n-                        ]\n+                        \"type\": \"org.apache.nifi.processors.standard.PutSFTP\",\n+                        \"typeDescription\": \"Sends FlowFiles to an SFTP Server\",\n+                        \"version\": \"1.27.0\"\n                     },\n                     {\n-                        \"additionalDetails\": true,\n+                        \"additionalDetails\": false,\n                         \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n-                            \"EVENT_DRIVEN\": 0,\n                             \"TIMER_DRIVEN\": 1\n                         },\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n-                        \"dynamicProperties\": [\n-                            {\n-                                \"description\": \"If <Destination>='flowfile-attribute' then that FlowFile attribute will be set to any JSON objects that match the JsonPath.  If <Destination>='flowfile-content' then the FlowFile content will be updated to any JSON objects that match the JsonPath.\",\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"name\": \"A FlowFile attribute(if <Destination> is set to 'flowfile-attribute')\",\n-                                \"value\": \"A JsonPath expression\"\n-                            }\n-                        ],\n-                        \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_REQUIRED\",\n-                        \"primaryNodeOnly\": false,\n-                        \"propertyDescriptors\": {\n-                            \"Destination\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"flowfile-content\",\n-                                        \"value\": \"flowfile-content\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"flowfile-attribute\",\n-                                        \"value\": \"flowfile-attribute\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"flowfile-content\",\n-                                \"description\": \"Indicates whether the results of the JsonPath evaluation are written to the FlowFile content or a FlowFile attribute; if using attribute, must specify the Attribute Name property. If set to flowfile-content, only one JsonPath may be specified, and the property name is ignored.\",\n-                                \"displayName\": \"Destination\",\n+                        \"group\": \"org.apache.nifi\",\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n+                        \"primaryNodeOnly\": false,\n+                        \"propertyDescriptors\": {\n+                            \"Batch Size\": {\n+                                \"defaultValue\": \"100\",\n+                                \"description\": \"The preferred number of FlowFiles to put to the database in a single transaction\",\n+                                \"displayName\": \"Batch Size\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Destination\",\n+                                \"name\": \"Batch Size\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Max String Length\": {\n-                                \"defaultValue\": \"20 MB\",\n-                                \"description\": \"The maximum allowed length of a string value when parsing the JSON document\",\n-                                \"displayName\": \"Max String Length\",\n+                            \"JDBC Connection Pool\": {\n+                                \"description\": \"Specifies the JDBC Connection Pool to use in order to convert the JSON message to a SQL statement. The Connection Pool is necessary in order to determine the appropriate database column types.\",\n+                                \"displayName\": \"JDBC Connection Pool\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Max String Length\",\n+                                \"name\": \"JDBC Connection Pool\",\n                                 \"required\": true,\n-                                \"sensitive\": false\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.dbcp.DBCPService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n                             },\n-                            \"Null Value Representation\": {\n+                            \"Obtain Generated Keys\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"empty string\",\n-                                        \"value\": \"empty string\"\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"the string 'null'\",\n-                                        \"value\": \"the string 'null'\"\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"empty string\",\n-                                \"description\": \"Indicates the desired representation of JSON Path expressions resulting in a null value.\",\n-                                \"displayName\": \"Null Value Representation\",\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"If true, any key that is automatically generated by the database will be added to the FlowFile that generated it using the sql.generate.key attribute. This may result in slightly slower performance and is not supported by all databases.\",\n+                                \"displayName\": \"Obtain Generated Keys\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Null Value Representation\",\n-                                \"required\": true,\n+                                \"name\": \"Obtain Generated Keys\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Path Not Found Behavior\": {\n+                            \"Support Fragmented Transactions\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"warn\",\n-                                        \"value\": \"warn\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"ignore\",\n-                                        \"value\": \"ignore\"\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"skip\",\n-                                        \"value\": \"skip\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"ignore\",\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"flowfile-attribute\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Destination\",\n-                                        \"propertyName\": \"Destination\"\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"description\": \"Indicates how to handle missing JSON path expressions when destination is set to 'flowfile-attribute'. Selecting 'warn' will generate a warning when a JSON path expression is not found. Selecting 'skip' will omit attributes for any unmatched JSON path expressions.\",\n-                                \"displayName\": \"Path Not Found Behavior\",\n+                                \"defaultValue\": \"true\",\n+                                \"description\": \"If true, when a FlowFile is consumed by this Processor, the Processor will first check the fragment.identifier and fragment.count attributes of that FlowFile. If the fragment.count value is greater than 1, the Processor will not process any FlowFile with that fragment.identifier until all are available; at that point, it will process all FlowFiles with that fragment.identifier as a single transaction, in the order specified by the FlowFiles' fragment.index attributes. This Provides atomicity of those SQL statements. Once any statement of this transaction throws exception when executing, this transaction will be rolled back. When transaction rollback happened, none of these FlowFiles would be routed to 'success'. If the <Rollback On Failure> is set true, these FlowFiles will stay in the input relationship. When the <Rollback On Failure> is set false,, if any of these FlowFiles will be routed to 'retry', all of these FlowFiles will be routed to 'retry'.Otherwise, they will be routed to 'failure'. If this value is false, these attributes will be ignored and the updates will occur independent of one another.\",\n+                                \"displayName\": \"Support Fragmented Transactions\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Path Not Found Behavior\",\n-                                \"required\": true,\n+                                \"name\": \"Support Fragmented Transactions\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Return Type\": {\n+                            \"Transaction Timeout\": {\n+                                \"description\": \"If the <Support Fragmented Transactions> property is set to true, specifies how long to wait for all FlowFiles for a particular fragment.identifier attribute to arrive before just transferring all of the FlowFiles with that identifier to the 'failure' relationship\",\n+                                \"displayName\": \"Transaction Timeout\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Transaction Timeout\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"database-session-autocommit\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"auto-detect\",\n-                                        \"value\": \"auto-detect\"\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"json\",\n-                                        \"value\": \"json\"\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"The autocommit mode to set on the database connection being used. If set to false, the operation(s) will be explicitly committed or rolled back (based on success or failure respectively), if set to true the driver/database handles the commit/rollback.\",\n+                                \"displayName\": \"Database Session AutoCommit\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"database-session-autocommit\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"putsql-sql-statement\": {\n+                                \"description\": \"The SQL statement to execute. The statement can be empty, a constant value, or built from attributes using Expression Language. If this property is specified, it will be used regardless of the content of incoming FlowFiles. If this property is empty, the content of the incoming FlowFile is expected to contain a valid SQL statement, to be issued by the processor to the database.\",\n+                                \"displayName\": \"SQL Statement\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"putsql-sql-statement\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"rollback-on-failure\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"scalar\",\n-                                        \"value\": \"scalar\"\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"auto-detect\",\n-                                \"description\": \"Indicates the desired return type of the JSON Path expressions.  Selecting 'auto-detect' will set the return type to 'json' for a Destination of 'flowfile-content', and 'scalar' for a Destination of 'flowfile-attribute'.\",\n-                                \"displayName\": \"Return Type\",\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"Specify how to handle error. By default (false), if an error occurs while processing a FlowFile, the FlowFile will be routed to 'failure' or 'retry' relationship based on error type, and processor can continue with next FlowFile. Instead, you may want to rollback currently processed FlowFiles and stop further processing immediately. In that case, you can do so by enabling this 'Rollback On Failure' property.  If enabled, failed FlowFiles will stay in the input relationship without penalizing it and being processed repeatedly until it gets processed successfully or removed by other means. It is important to set adequate 'Yield Duration' to avoid retrying too frequently.\",\n+                                \"displayName\": \"Rollback On Failure\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Return Type\",\n+                                \"name\": \"rollback-on-failure\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             }\n                         },\n-                        \"sideEffectFree\": true,\n+                        \"readsAttributes\": [\n+                            {\n+                                \"description\": \"If the <Support Fragment Transactions> property is true, this attribute is used to determine whether or not two FlowFiles belong to the same transaction.\",\n+                                \"name\": \"fragment.identifier\"\n+                            },\n+                            {\n+                                \"description\": \"If the <Support Fragment Transactions> property is true, this attribute is used to determine how many FlowFiles are needed to complete the transaction.\",\n+                                \"name\": \"fragment.count\"\n+                            },\n+                            {\n+                                \"description\": \"If the <Support Fragment Transactions> property is true, this attribute is used to determine the order that the FlowFiles in a transaction should be evaluated.\",\n+                                \"name\": \"fragment.index\"\n+                            },\n+                            {\n+                                \"description\": \"Incoming FlowFiles are expected to be parametrized SQL statements. The type of each Parameter is specified as an integer that represents the JDBC Type of the parameter.\",\n+                                \"name\": \"sql.args.N.type\"\n+                            },\n+                            {\n+                                \"description\": \"Incoming FlowFiles are expected to be parametrized SQL statements. The value of the Parameters are specified as sql.args.1.value, sql.args.2.value, sql.args.3.value, and so on. The type of the sql.args.1.value Parameter is specified by the sql.args.1.type attribute.\",\n+                                \"name\": \"sql.args.N.value\"\n+                            },\n+                            {\n+                                \"description\": \"This attribute is always optional, but default options may not always work for your data. Incoming FlowFiles are expected to be parametrized SQL statements. In some cases a format option needs to be specified, currently this is only applicable for binary data types, dates, times and timestamps. Binary Data Types (defaults to 'ascii') - ascii: each string character in your attribute value represents a single byte. This is the format provided by Avro Processors. base64: the string is a Base64 encoded string that can be decoded to bytes. hex: the string is hex encoded with all letters in upper case and no '0x' at the beginning. Dates/Times/Timestamps - Date, Time and Timestamp formats all support both custom formats or named format ('yyyy-MM-dd','ISO_OFFSET_DATE_TIME') as specified according to java.time.format.DateTimeFormatter. If not specified, a long value input is expected to be an unix epoch (milli seconds from 1970/1/1), or a string value in 'yyyy-MM-dd' format for Date, 'HH:mm:ss.SSS' for Time (some database engines e.g. Derby or MySQL do not support milliseconds and will truncate milliseconds), 'yyyy-MM-dd HH:mm:ss.SSS' for Timestamp is used.\",\n+                                \"name\": \"sql.args.N.format\"\n+                            }\n+                        ],\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.processors.standard.ConvertJSONToSQL\"\n+                        ],\n+                        \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"FlowFiles are routed to this relationship when the JsonPath cannot be evaluated against the content of the FlowFile; for instance, if the FlowFile is not valid JSON\",\n-                                \"name\": \"failure\"\n+                                \"description\": \"A FlowFile is routed to this relationship if the database cannot be updated but attempting the operation again may succeed\",\n+                                \"name\": \"retry\"\n                             },\n                             {\n-                                \"description\": \"FlowFiles are routed to this relationship when the JsonPath does not match the content of the FlowFile and the Destination is set to flowfile-content\",\n-                                \"name\": \"unmatched\"\n+                                \"description\": \"A FlowFile is routed to this relationship after the database is successfully updated\",\n+                                \"name\": \"success\"\n                             },\n                             {\n-                                \"description\": \"FlowFiles are routed to this relationship when the JsonPath is successfully evaluated and the FlowFile is modified as a result\",\n-                                \"name\": \"matched\"\n+                                \"description\": \"A FlowFile is routed to this relationship if the database cannot be updated and retrying the operation will also fail, such as an invalid query or an integrity constraint violation\",\n+                                \"name\": \"failure\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\",\n-                            \"EVENT_DRIVEN\"\n+                            \"CRON_DRIVEN\"\n                         ],\n                         \"supportsBatching\": true,\n-                        \"supportsDynamicProperties\": true,\n+                        \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": true,\n+                        \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"JSON\",\n-                            \"JsonPath\",\n-                            \"evaluate\"\n+                            \"database\",\n+                            \"insert\",\n+                            \"put\",\n+                            \"rdbms\",\n+                            \"relational\",\n+                            \"sql\",\n+                            \"update\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.standard.EvaluateJsonPath\",\n-                        \"typeDescription\": \"Evaluates one or more JsonPath expressions against the content of a FlowFile. The results of those expressions are assigned to FlowFile Attributes or are written to the content of the FlowFile itself, depending on configuration of the Processor. JsonPaths are entered by adding user-defined properties; the name of the property maps to the Attribute Name into which the result will be placed (if the Destination is flowfile-attribute; otherwise, the property name is ignored). The value of the property must be a valid JsonPath expression. A Return Type of 'auto-detect' will make a determination based off the configured destination. When 'Destination' is set to 'flowfile-attribute,' a return type of 'scalar' will be used. When 'Destination' is set to 'flowfile-content,' a return type of 'JSON' will be used.If the JsonPath evaluates to a JSON array or JSON object and the Return Type is set to 'scalar' the FlowFile will be unmodified and will be routed to failure. A Return Type of JSON can return scalar values if the provided JsonPath evaluates to the specified value and will be routed as a match.If Destination is 'flowfile-content' and the JsonPath does not evaluate to a defined path, the FlowFile will be routed to 'unmatched' without having its contents modified. If Destination is 'flowfile-attribute' and the expression matches nothing, attributes will be created with empty strings as the value unless 'Path Not Found Behaviour' is set to 'skip', and the FlowFile will always be routed to 'matched.'\",\n-                        \"version\": \"1.27.0\"\n+                        \"type\": \"org.apache.nifi.processors.standard.PutSQL\",\n+                        \"typeDescription\": \"Executes a SQL UPDATE or INSERT command. The content of an incoming FlowFile is expected to be the SQL command to execute. The SQL command may use the ? to escape parameters. In this case, the parameters to use must exist as FlowFile attributes with the naming convention sql.args.N.type and sql.args.N.value, where N is a positive integer. The sql.args.N.type is expected to be a number indicating the JDBC Type. The content of the FlowFile is expected to be in UTF-8 format.\",\n+                        \"version\": \"1.27.0\",\n+                        \"writesAttributes\": [\n+                            {\n+                                \"description\": \"If the database generated a key for an INSERT statement and the Obtain Generated Keys property is set to true, this attribute will be added to indicate the generated key, if possible. This feature is not supported by all database vendors.\",\n+                                \"name\": \"sql.generated.key\"\n+                            }\n+                        ]\n                     },\n                     {\n                         \"additionalDetails\": false,\n                         \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n-                            \"EVENT_DRIVEN\": 0,\n                             \"TIMER_DRIVEN\": 1\n                         },\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n-                        \"dynamicProperties\": [\n-                            {\n-                                \"description\": \"If <Destination>='flowfile-attribute' then the FlowFile attribute is set to the result of the XPath Expression.  If <Destination>='flowfile-content' then the FlowFile content is set to the result of the XPath Expression.\",\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"name\": \"A FlowFile attribute(if <Destination> is set to 'flowfile-attribute'\",\n-                                \"value\": \"An XPath expression\"\n-                            }\n-                        ],\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Destination\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"flowfile-content\",\n-                                        \"value\": \"flowfile-content\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"flowfile-attribute\",\n-                                        \"value\": \"flowfile-attribute\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"flowfile-content\",\n-                                \"description\": \"Indicates whether the results of the XPath evaluation are written to the FlowFile content or a FlowFile attribute; if using attribute, must specify the Attribute Name property. If set to flowfile-content, only one XPath may be specified, and the property name is ignored.\",\n-                                \"displayName\": \"Destination\",\n+                            \"Batch Size\": {\n+                                \"defaultValue\": \"25\",\n+                                \"description\": \"The number of incoming FlowFiles to process in a single execution of this processor.\",\n+                                \"displayName\": \"Batch Size\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Destination\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Batch Size\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Return Type\": {\n+                            \"Character Set\": {\n+                                \"defaultValue\": \"UTF-8\",\n+                                \"description\": \"Specifies the character set of the Syslog messages. Note that Expression language is not evaluated per FlowFile.\",\n+                                \"displayName\": \"Character Set\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Character Set\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Hostname\": {\n+                                \"defaultValue\": \"localhost\",\n+                                \"description\": \"The IP address or hostname of the Syslog server.\",\n+                                \"displayName\": \"Hostname\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Hostname\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Idle Connection Expiration\": {\n+                                \"defaultValue\": \"5 seconds\",\n+                                \"description\": \"The amount of time a connection should be held open without being used before closing the connection.\",\n+                                \"displayName\": \"Idle Connection Expiration\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Idle Connection Expiration\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Max Size of Socket Send Buffer\": {\n+                                \"defaultValue\": \"1 MB\",\n+                                \"description\": \"The maximum size of the socket send buffer that should be used. This is a suggestion to the Operating System to indicate how big the socket buffer should be. If this value is set too low, the buffer may fill up before the data can be read, and incoming data will be dropped.\",\n+                                \"displayName\": \"Max Size of Socket Send Buffer\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Max Size of Socket Send Buffer\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Message Body\": {\n+                                \"description\": \"The body for the Syslog messages.\",\n+                                \"displayName\": \"Message Body\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Message Body\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Message Hostname\": {\n+                                \"defaultValue\": \"${hostname(true)}\",\n+                                \"description\": \"The hostname for the Syslog messages.\",\n+                                \"displayName\": \"Message Hostname\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Message Hostname\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Message Priority\": {\n+                                \"description\": \"The priority for the Syslog messages, excluding < >.\",\n+                                \"displayName\": \"Message Priority\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Message Priority\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Message Timestamp\": {\n+                                \"defaultValue\": \"${now():format('MMM d HH:mm:ss')}\",\n+                                \"description\": \"The timestamp for the Syslog messages. The timestamp can be an RFC5424 timestamp with a format of \\\"yyyy-MM-dd'T'HH:mm:ss.SZ\\\" or \\\"yyyy-MM-dd'T'HH:mm:ss.S+hh:mm\\\", \\\" or it can be an RFC3164 timestamp with a format of \\\"MMM d HH:mm:ss\\\".\",\n+                                \"displayName\": \"Message Timestamp\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Message Timestamp\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Message Version\": {\n+                                \"description\": \"The version for the Syslog messages.\",\n+                                \"displayName\": \"Message Version\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Message Version\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Port\": {\n+                                \"description\": \"The port for Syslog communication. Note that Expression language is not evaluated per FlowFile.\",\n+                                \"displayName\": \"Port\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Port\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Protocol\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"auto-detect\",\n-                                        \"value\": \"auto-detect\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"nodeset\",\n-                                        \"value\": \"nodeset\"\n+                                        \"displayName\": \"TCP\",\n+                                        \"value\": \"TCP\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"string\",\n-                                        \"value\": \"string\"\n+                                        \"displayName\": \"UDP\",\n+                                        \"value\": \"UDP\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"auto-detect\",\n-                                \"description\": \"Indicates the desired return type of the Xpath expressions.  Selecting 'auto-detect' will set the return type to 'nodeset' for a Destination of 'flowfile-content', and 'string' for a Destination of 'flowfile-attribute'.\",\n-                                \"displayName\": \"Return Type\",\n+                                \"defaultValue\": \"UDP\",\n+                                \"description\": \"The protocol for Syslog communication.\",\n+                                \"displayName\": \"Protocol\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Return Type\",\n+                                \"name\": \"Protocol\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Validate DTD\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n+                            \"SSL Context Service\": {\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"dependentValues\": [\n+                                            \"TCP\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Protocol\",\n+                                        \"propertyName\": \"Protocol\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"Allow embedded Document Type Declaration in XML. This feature should be disabled to avoid XML entity expansion vulnerabilities.\",\n-                                \"displayName\": \"Allow DTD\",\n+                                \"description\": \"The Controller Service to use in order to obtain an SSL Context. If this property is set, syslog messages will be sent over a secure connection.\",\n+                                \"displayName\": \"SSL Context Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Validate DTD\",\n-                                \"required\": true,\n+                                \"name\": \"SSL Context Service\",\n+                                \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"Timeout\": {\n+                                \"defaultValue\": \"10 seconds\",\n+                                \"description\": \"The timeout for connecting to and communicating with the syslog server. Does not apply to UDP. Note that Expression language is not evaluated per FlowFile.\",\n+                                \"displayName\": \"Timeout\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Timeout\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             }\n                         },\n-                        \"sideEffectFree\": true,\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.processors.standard.ListenSyslog\",\n+                            \"org.apache.nifi.processors.standard.ParseSyslog\"\n+                        ],\n+                        \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"FlowFiles are routed to this relationship when the XPath cannot be evaluated against the content of the FlowFile; for instance, if the FlowFile is not valid XML, or if the Return Type is 'nodeset' and the XPath evaluates to multiple nodes\",\n-                                \"name\": \"failure\"\n+                                \"description\": \"FlowFiles that are sent successfully to Syslog are sent out this relationship.\",\n+                                \"name\": \"success\"\n                             },\n                             {\n-                                \"description\": \"FlowFiles are routed to this relationship when the XPath does not match the content of the FlowFile and the Destination is set to flowfile-content\",\n-                                \"name\": \"unmatched\"\n+                                \"description\": \"FlowFiles that failed to send to Syslog are sent out this relationship.\",\n+                                \"name\": \"failure\"\n                             },\n                             {\n-                                \"description\": \"FlowFiles are routed to this relationship when the XPath is successfully evaluated and the FlowFile is modified as a result\",\n-                                \"name\": \"matched\"\n+                                \"description\": \"FlowFiles that do not form a valid Syslog message are sent out this relationship.\",\n+                                \"name\": \"invalid\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\",\n-                            \"EVENT_DRIVEN\"\n+                            \"CRON_DRIVEN\"\n                         ],\n-                        \"supportsBatching\": true,\n-                        \"supportsDynamicProperties\": true,\n+                        \"supportsBatching\": false,\n+                        \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": true,\n+                        \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n-                        \"systemResourceConsiderations\": [\n-                            {\n-                                \"description\": \"Processing requires reading the entire FlowFile into memory\",\n-                                \"resource\": \"MEMORY\"\n-                            }\n-                        ],\n                         \"tags\": [\n-                            \"XML\",\n-                            \"XPath\",\n-                            \"evaluate\"\n+                            \"logs\",\n+                            \"put\",\n+                            \"syslog\",\n+                            \"tcp\",\n+                            \"udp\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.standard.EvaluateXPath\",\n-                        \"typeDescription\": \"Evaluates one or more XPaths against the content of a FlowFile. The results of those XPaths are assigned to FlowFile Attributes or are written to the content of the FlowFile itself, depending on configuration of the Processor. XPaths are entered by adding user-defined properties; the name of the property maps to the Attribute Name into which the result will be placed (if the Destination is flowfile-attribute; otherwise, the property name is ignored). The value of the property must be a valid XPath expression. If the XPath evaluates to more than one node and the Return Type is set to 'nodeset' (either directly, or via 'auto-detect' with a Destination of 'flowfile-content'), the FlowFile will be unmodified and will be routed to failure. If the XPath does not evaluate to a Node, the FlowFile will be routed to 'unmatched' without having its contents modified. If Destination is flowfile-attribute and the expression matches nothing, attributes will be created with empty strings as the value, and the FlowFile will always be routed to 'matched'\",\n-                        \"version\": \"1.27.0\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"This processor adds user-defined attributes if the <Destination> property is set to flowfile-attribute.\",\n-                                \"name\": \"user-defined\"\n-                            }\n-                        ]\n+                        \"triggerWhenEmpty\": true,\n+                        \"type\": \"org.apache.nifi.processors.standard.PutSyslog\",\n+                        \"typeDescription\": \"Sends Syslog messages to a given host and port over TCP or UDP. Messages are constructed from the \\\"Message ___\\\" properties of the processor which can use expression language to generate messages from incoming FlowFiles. The properties are used to construct messages of the form: (<PRIORITY>)(VERSION )(TIMESTAMP) (HOSTNAME) (BODY) where version is optional.  The constructed messages are checked against regular expressions for RFC5424 and RFC3164 formatted messages. The timestamp can be an RFC5424 timestamp with a format of \\\"yyyy-MM-dd'T'HH:mm:ss.SZ\\\" or \\\"yyyy-MM-dd'T'HH:mm:ss.S+hh:mm\\\", or it can be an RFC3164 timestamp with a format of \\\"MMM d HH:mm:ss\\\". If a message is constructed that does not form a valid Syslog message according to the above description, then it is routed to the invalid relationship. Valid messages are sent to the Syslog server and successes are routed to the success relationship, failures routed to the failure relationship.\",\n+                        \"version\": \"1.27.0\"\n                     },\n                     {\n-                        \"additionalDetails\": true,\n+                        \"additionalDetails\": false,\n                         \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n-                            \"EVENT_DRIVEN\": 0,\n                             \"TIMER_DRIVEN\": 1\n                         },\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n-                        \"dynamicProperties\": [\n-                            {\n-                                \"description\": \"If <Destination>='flowfile-attribute' then the FlowFile attribute is set to the result of the XQuery.  If <Destination>='flowfile-content' then the FlowFile content is set to the result of the XQuery.\",\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"name\": \"A FlowFile attribute(if <Destination> is set to 'flowfile-attribute'\",\n-                                \"value\": \"An XQuery\"\n-                            }\n-                        ],\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Destination\": {\n+                            \"Character Set\": {\n+                                \"defaultValue\": \"UTF-8\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"FLOWFILE_ORIENTED\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Transmission Strategy\",\n+                                        \"propertyName\": \"Transmission Strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"Specifies the character set of the data being sent.\",\n+                                \"displayName\": \"Character Set\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Character Set\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Connection Per FlowFile\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"flowfile-content\",\n-                                        \"value\": \"flowfile-content\"\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"flowfile-attribute\",\n-                                        \"value\": \"flowfile-attribute\"\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"flowfile-content\",\n-                                \"description\": \"Indicates whether the results of the XQuery evaluation are written to the FlowFile content or a FlowFile attribute. If set to <flowfile-content>, only one XQuery may be specified and the property name is ignored.  If set to <flowfile-attribute> and the XQuery returns more than one result, multiple attributes will be added to theFlowFile, each named with a '.n' one-up number appended to the specified attribute name\",\n-                                \"displayName\": \"Destination\",\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"Specifies whether to send each FlowFile's content on an individual connection.\",\n+                                \"displayName\": \"Connection Per FlowFile\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Destination\",\n+                                \"name\": \"Connection Per FlowFile\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Output: Indent\": {\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"Specifies whether the processor may add additional whitespace when outputting a result tree.\",\n-                                \"displayName\": \"Output: Indent\",\n+                            \"Hostname\": {\n+                                \"defaultValue\": \"localhost\",\n+                                \"description\": \"Destination hostname or IP address\",\n+                                \"displayName\": \"Hostname\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Hostname\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Idle Connection Expiration\": {\n+                                \"defaultValue\": \"15 seconds\",\n+                                \"description\": \"The amount of time a connection should be held open without being used before closing the connection. A value of 0 seconds will disable this feature.\",\n+                                \"displayName\": \"Idle Connection Expiration\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Idle Connection Expiration\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Max Size of Socket Send Buffer\": {\n+                                \"defaultValue\": \"1 MB\",\n+                                \"description\": \"The maximum size of the socket send buffer that should be used. This is a suggestion to the Operating System to indicate how big the socket buffer should be. If this value is set too low, the buffer may fill up before the data can be read, and incoming data will be dropped.\",\n+                                \"displayName\": \"Max Size of Socket Send Buffer\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Output: Indent\",\n+                                \"name\": \"Max Size of Socket Send Buffer\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Output: Method\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"xml\",\n-                                        \"value\": \"xml\"\n-                                    },\n+                            \"Outgoing Message Delimiter\": {\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"html\",\n-                                        \"value\": \"html\"\n-                                    },\n+                                        \"dependentValues\": [\n+                                            \"FLOWFILE_ORIENTED\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Transmission Strategy\",\n+                                        \"propertyName\": \"Transmission Strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"Specifies the delimiter to use when sending messages out over the same TCP stream. The delimiter is appended to each FlowFile message that is transmitted over the stream so that the receiver can determine when one message ends and the next message begins. Users should ensure that the FlowFile content does not contain the delimiter character to avoid errors. In order to use a new line character you can enter '\\\\n'. For a tab character use '\\\\t'. Finally for a carriage return use '\\\\r'.\",\n+                                \"displayName\": \"Outgoing Message Delimiter\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Outgoing Message Delimiter\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Port\": {\n+                                \"description\": \"Destination port number\",\n+                                \"displayName\": \"Port\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Port\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Record Reader\": {\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"text\",\n-                                        \"value\": \"text\"\n+                                        \"dependentValues\": [\n+                                            \"RECORD_ORIENTED\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Transmission Strategy\",\n+                                        \"propertyName\": \"Transmission Strategy\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"xml\",\n-                                \"description\": \"Identifies the overall method that should be used for outputting a result tree.\",\n-                                \"displayName\": \"Output: Method\",\n+                                \"description\": \"Specifies the Controller Service to use for reading Records from input FlowFiles\",\n+                                \"displayName\": \"Record Reader\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Output: Method\",\n+                                \"name\": \"Record Reader\",\n                                 \"required\": true,\n-                                \"sensitive\": false\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n                             },\n-                            \"Output: Omit XML Declaration\": {\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"Specifies whether the processor should output an XML declaration when transforming a result tree.\",\n-                                \"displayName\": \"Output: Omit XML Declaration\",\n+                            \"Record Writer\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"RECORD_ORIENTED\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Transmission Strategy\",\n+                                        \"propertyName\": \"Transmission Strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"Specifies the Controller Service to use for writing Records to the configured socket address\",\n+                                \"displayName\": \"Record Writer\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Output: Omit XML Declaration\",\n+                                \"name\": \"Record Writer\",\n                                 \"required\": true,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"SSL Context Service\": {\n+                                \"description\": \"Specifies the SSL Context Service to enable TLS socket communication\",\n+                                \"displayName\": \"SSL Context Service\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"SSL Context Service\",\n+                                \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"Timeout\": {\n+                                \"defaultValue\": \"10 seconds\",\n+                                \"description\": \"The timeout for connecting to and communicating with the destination. Does not apply to UDP\",\n+                                \"displayName\": \"Timeout\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Timeout\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Validate DTD\": {\n+                            \"Transmission Strategy\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"description\": \"Send FlowFile content as a single stream\",\n+                                        \"displayName\": \"FlowFile-oriented\",\n+                                        \"value\": \"FLOWFILE_ORIENTED\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"description\": \"Read Records from input FlowFiles and send serialized Records as individual messages\",\n+                                        \"displayName\": \"Record-oriented\",\n+                                        \"value\": \"RECORD_ORIENTED\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"Allow embedded Document Type Declaration in XML. This feature should be disabled to avoid XML entity expansion vulnerabilities.\",\n-                                \"displayName\": \"Allow DTD\",\n+                                \"defaultValue\": \"FLOWFILE_ORIENTED\",\n+                                \"description\": \"Specifies the strategy used for reading input FlowFiles and transmitting messages to the destination socket address\",\n+                                \"displayName\": \"Transmission Strategy\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Validate DTD\",\n+                                \"name\": \"Transmission Strategy\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             }\n                         },\n-                        \"sideEffectFree\": true,\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.processors.standard.ListenTCP\",\n+                            \"org.apache.nifi.processors.standard.PutUDP\"\n+                        ],\n+                        \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"FlowFiles are routed to this relationship when the XQuery cannot be evaluated against the content of the FlowFile.\",\n-                                \"name\": \"failure\"\n-                            },\n-                            {\n-                                \"description\": \"FlowFiles are routed to this relationship when the XQuery does not match the content of the FlowFile and the Destination is set to flowfile-content\",\n-                                \"name\": \"unmatched\"\n+                                \"description\": \"FlowFiles that are sent successfully to the destination are sent out this relationship.\",\n+                                \"name\": \"success\"\n                             },\n                             {\n-                                \"description\": \"FlowFiles are routed to this relationship when the XQuery is successfully evaluated and the FlowFile is modified as a result\",\n-                                \"name\": \"matched\"\n+                                \"description\": \"FlowFiles that failed to send to the destination are sent out this relationship.\",\n+                                \"name\": \"failure\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\",\n-                            \"EVENT_DRIVEN\"\n+                            \"CRON_DRIVEN\"\n                         ],\n                         \"supportsBatching\": true,\n-                        \"supportsDynamicProperties\": true,\n+                        \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": true,\n+                        \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n-                        \"systemResourceConsiderations\": [\n-                            {\n-                                \"description\": \"Processing requires reading the entire FlowFile into memory\",\n-                                \"resource\": \"MEMORY\"\n-                            }\n-                        ],\n                         \"tags\": [\n-                            \"XML\",\n-                            \"XPath\",\n-                            \"XQuery\",\n-                            \"evaluate\"\n+                            \"egress\",\n+                            \"put\",\n+                            \"remote\",\n+                            \"tcp\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.standard.EvaluateXQuery\",\n-                        \"typeDescription\": \"Evaluates one or more XQueries against the content of a FlowFile.  The results of those XQueries are assigned to FlowFile Attributes or are written to the content of the FlowFile itself, depending on configuration of the Processor.  XQueries are entered by adding user-defined properties; the name of the property maps to the Attribute Name into which the result will be placed (if the Destination is 'flowfile-attribute'; otherwise, the property name is ignored).  The value of the property must be a valid XQuery.  If the XQuery returns more than one result, new attributes or FlowFiles (for Destinations of 'flowfile-attribute' or 'flowfile-content' respectively) will be created for each result (attributes will have a '.n' one-up number appended to the specified attribute name).  If any provided XQuery returns a result, the FlowFile(s) will be routed to 'matched'. If no provided XQuery returns a result, the FlowFile will be routed to 'unmatched'.  If the Destination is 'flowfile-attribute' and the XQueries matche nothing, no attributes will be applied to the FlowFile.\",\n+                        \"type\": \"org.apache.nifi.processors.standard.PutTCP\",\n+                        \"typeDescription\": \"Sends serialized FlowFiles or Records over TCP to a configurable destination with optional support for TLS\",\n                         \"version\": \"1.27.0\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"This processor adds user-defined attributes if the <Destination> property is set to flowfile-attribute .\",\n-                                \"name\": \"user-defined\"\n+                                \"description\": \"Count of records transmitted to configured destination address\",\n+                                \"name\": \"record.count.transmitted\"\n                             }\n                         ]\n                     },\n                     {\n                         \"additionalDetails\": false,\n                         \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n@@ -99722,299 +100241,321 @@\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n-                        \"dynamicProperties\": [\n-                            {\n-                                \"description\": \"These environment variables are passed to the process spawned by this Processor\",\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"name\": \"An environment variable name\",\n-                                \"value\": \"An environment variable value\"\n-                            }\n-                        ],\n-                        \"explicitRestrictions\": [\n-                            {\n-                                \"explanation\": \"Provides operator the ability to execute arbitrary code assuming all permissions that NiFi has.\",\n-                                \"requiredPermission\": \"execute code\"\n-                            }\n-                        ],\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Argument Delimiter\": {\n-                                \"defaultValue\": \" \",\n-                                \"description\": \"Delimiter to use to separate arguments for a command [default: space]. Must be a single character.\",\n-                                \"displayName\": \"Argument Delimiter\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Argument Delimiter\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Batch Duration\": {\n-                                \"description\": \"If the process is expected to be long-running and produce textual output, a batch duration can be specified so that the output will be captured for this amount of time and a FlowFile will then be sent out with the results and a new FlowFile will be started, rather than waiting for the process to finish before sending out the results\",\n-                                \"displayName\": \"Batch Duration\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Batch Duration\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Command\": {\n-                                \"description\": \"Specifies the command to be executed; if just the name of an executable is provided, it must be in the user's environment PATH.\",\n-                                \"displayName\": \"Command\",\n+                            \"Hostname\": {\n+                                \"defaultValue\": \"localhost\",\n+                                \"description\": \"Destination hostname or IP address\",\n+                                \"displayName\": \"Hostname\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Command\",\n+                                \"name\": \"Hostname\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Command Arguments\": {\n-                                \"description\": \"The arguments to supply to the executable delimited by white space. White space can be escaped by enclosing it in double-quotes.\",\n-                                \"displayName\": \"Command Arguments\",\n+                            \"Idle Connection Expiration\": {\n+                                \"defaultValue\": \"15 seconds\",\n+                                \"description\": \"The amount of time a connection should be held open without being used before closing the connection. A value of 0 seconds will disable this feature.\",\n+                                \"displayName\": \"Idle Connection Expiration\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Command Arguments\",\n-                                \"required\": false,\n+                                \"name\": \"Idle Connection Expiration\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Output MIME type\": {\n-                                \"description\": \"Specifies the value to set for the \\\"mime.type\\\" attribute. This property is ignored if 'Batch Duration' is set.\",\n-                                \"displayName\": \"Output MIME Type\",\n+                            \"Max Size of Socket Send Buffer\": {\n+                                \"defaultValue\": \"1 MB\",\n+                                \"description\": \"The maximum size of the socket send buffer that should be used. This is a suggestion to the Operating System to indicate how big the socket buffer should be. If this value is set too low, the buffer may fill up before the data can be read, and incoming data will be dropped.\",\n+                                \"displayName\": \"Max Size of Socket Send Buffer\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Output MIME type\",\n-                                \"required\": false,\n+                                \"name\": \"Max Size of Socket Send Buffer\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Redirect Error Stream\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"If true will redirect any error stream output of the process to the output stream. This is particularly helpful for processes which write extensively to the error stream or for troubleshooting.\",\n-                                \"displayName\": \"Redirect Error Stream\",\n+                            \"Port\": {\n+                                \"description\": \"Destination port number\",\n+                                \"displayName\": \"Port\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Redirect Error Stream\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Port\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Working Directory\": {\n-                                \"description\": \"The directory to use as the current working directory when executing the command\",\n-                                \"displayName\": \"Working Directory\",\n+                            \"Timeout\": {\n+                                \"defaultValue\": \"10 seconds\",\n+                                \"description\": \"The timeout for connecting to and communicating with the destination. Does not apply to UDP\",\n+                                \"displayName\": \"Timeout\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Working Directory\",\n+                                \"name\": \"Timeout\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             }\n                         },\n-                        \"restricted\": true,\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.processors.standard.ListenUDP\",\n+                            \"org.apache.nifi.processors.standard.PutTCP\"\n+                        ],\n                         \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"All created FlowFiles are routed to this relationship\",\n+                                \"description\": \"FlowFiles that are sent successfully to the destination are sent out this relationship.\",\n                                 \"name\": \"success\"\n+                            },\n+                            {\n+                                \"description\": \"FlowFiles that failed to send to the destination are sent out this relationship.\",\n+                                \"name\": \"failure\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n-                        \"supportsBatching\": false,\n-                        \"supportsDynamicProperties\": true,\n+                        \"supportsBatching\": true,\n+                        \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"command\",\n-                            \"external\",\n-                            \"invoke\",\n-                            \"process\",\n-                            \"script\",\n-                            \"source\"\n+                            \"egress\",\n+                            \"put\",\n+                            \"remote\",\n+                            \"udp\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.standard.ExecuteProcess\",\n-                        \"typeDescription\": \"Runs an operating system command specified by the user and writes the output of that command to a FlowFile. If the command is expected to be long-running, the Processor can output the partial data on a specified interval. When this option is used, the output is expected to be in textual format, as it typically does not make sense to split binary data on arbitrary time-based intervals.\",\n-                        \"version\": \"1.27.0\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"Executed command\",\n-                                \"name\": \"command\"\n-                            },\n-                            {\n-                                \"description\": \"Arguments of the command\",\n-                                \"name\": \"command.arguments\"\n-                            },\n-                            {\n-                                \"description\": \"Sets the MIME type of the output if the 'Output MIME Type' property is set and 'Batch Duration' is not set\",\n-                                \"name\": \"mime.type\"\n-                            }\n-                        ]\n+                        \"type\": \"org.apache.nifi.processors.standard.PutUDP\",\n+                        \"typeDescription\": \"The PutUDP processor receives a FlowFile and packages the FlowFile content into a single UDP datagram packet which is then transmitted to the configured UDP server. The user must ensure that the FlowFile content being fed to this processor is not larger than the maximum size for the underlying UDP transport. The maximum transport size will vary based on the platform setup but is generally just under 64KB. FlowFiles will be marked as failed if their content is larger than the maximum transport size.\",\n+                        \"version\": \"1.27.0\"\n                     },\n                     {\n                         \"additionalDetails\": false,\n                         \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n-                            \"EVENT_DRIVEN\": 0,\n                             \"TIMER_DRIVEN\": 1\n                         },\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"0 sec\"\n+                            \"TIMER_DRIVEN\": \"1 min\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n                         \"dynamicProperties\": [\n                             {\n-                                \"description\": \"Incoming FlowFiles are expected to be parametrized SQL statements. The type of each Parameter is specified as an integer that represents the JDBC Type of the parameter. The following types are accepted: [LONGNVARCHAR: -16], [BIT: -7], [BOOLEAN: 16], [TINYINT: -6], [BIGINT: -5], [LONGVARBINARY: -4], [VARBINARY: -3], [BINARY: -2], [LONGVARCHAR: -1], [CHAR: 1], [NUMERIC: 2], [DECIMAL: 3], [INTEGER: 4], [SMALLINT: 5] [FLOAT: 6], [REAL: 7], [DOUBLE: 8], [VARCHAR: 12], [DATE: 91], [TIME: 92], [TIMESTAMP: 93], [VARCHAR: 12], [CLOB: 2005], [NCLOB: 2011]\",\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"name\": \"sql.args.N.type\",\n-                                \"value\": \"SQL type argument to be supplied\"\n-                            },\n-                            {\n-                                \"description\": \"Incoming FlowFiles are expected to be parametrized SQL statements. The value of the Parameters are specified as sql.args.1.value, sql.args.2.value, sql.args.3.value, and so on. The type of the sql.args.1.value Parameter is specified by the sql.args.1.type attribute.\",\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"name\": \"sql.args.N.value\",\n-                                \"value\": \"Argument to be supplied\"\n-                            },\n-                            {\n-                                \"description\": \"This attribute is always optional, but default options may not always work for your data. Incoming FlowFiles are expected to be parametrized SQL statements. In some cases a format option needs to be specified, currently this is only applicable for binary data types, dates, times and timestamps. Binary Data Types (defaults to 'ascii') - ascii: each string character in your attribute value represents a single byte. This is the format provided by Avro Processors. base64: the string is a Base64 encoded string that can be decoded to bytes. hex: the string is hex encoded with all letters in upper case and no '0x' at the beginning. Dates/Times/Timestamps - Date, Time and Timestamp formats all support both custom formats or named format ('yyyy-MM-dd','ISO_OFFSET_DATE_TIME') as specified according to java.time.format.DateTimeFormatter. If not specified, a long value input is expected to be an unix epoch (milli seconds from 1970/1/1), or a string value in 'yyyy-MM-dd' format for Date, 'HH:mm:ss.SSS' for Time (some database engines e.g. Derby or MySQL do not support milliseconds and will truncate milliseconds), 'yyyy-MM-dd HH:mm:ss.SSS' for Timestamp is used.\",\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"name\": \"sql.args.N.format\",\n-                                \"value\": \"SQL format argument to be supplied\"\n+                                \"description\": \"Specifies an initial max value for max value column(s). Properties should be added in the format `initial.maxvalue.<max_value_column>`. This value is only used the first time the table is accessed (when a Maximum Value Column is specified).\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"name\": \"initial.maxvalue.<max_value_column>\",\n+                                \"value\": \"Initial maximum value for the specified column\"\n                             }\n                         ],\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_ALLOWED\",\n-                        \"primaryNodeOnly\": false,\n+                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n+                        \"primaryNodeOnly\": true,\n                         \"propertyDescriptors\": {\n+                            \"Columns to Return\": {\n+                                \"description\": \"A comma-separated list of column names to be used in the query. If your database requires special treatment of the names (quoting, e.g.), each name should include such treatment. If no column names are supplied, all columns in the specified table will be returned. NOTE: It is important to use consistent column names for a given table for incremental fetch to work properly.\",\n+                                \"displayName\": \"Columns to Return\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Columns to Return\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n                             \"Database Connection Pooling Service\": {\n-                                \"description\": \"The Controller Service that is used to obtain connection to database\",\n+                                \"description\": \"The Controller Service that is used to obtain a connection to the database.\",\n                                 \"displayName\": \"Database Connection Pooling Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n                                 \"name\": \"Database Connection Pooling Service\",\n                                 \"required\": true,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n                                     \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n                                     \"type\": \"org.apache.nifi.dbcp.DBCPService\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             },\n+                            \"Fetch Size\": {\n+                                \"defaultValue\": \"0\",\n+                                \"description\": \"The number of result rows to be fetched from the result set at a time. This is a hint to the database driver and may not be honored and/or exact. If the value specified is zero, then the hint is ignored. If using PostgreSQL, then 'Set Auto Commit' must be equal to 'false' to cause 'Fetch Size' to take effect.\",\n+                                \"displayName\": \"Fetch Size\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Fetch Size\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n                             \"Max Wait Time\": {\n                                 \"defaultValue\": \"0 seconds\",\n-                                \"description\": \"The maximum amount of time allowed for a running SQL select query  , zero means there is no limit. Max time less than 1 second will be equal to zero.\",\n+                                \"description\": \"The maximum amount of time allowed for a running SQL select query , zero means there is no limit. Max time less than 1 second will be equal to zero.\",\n                                 \"displayName\": \"Max Wait Time\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n                                 \"name\": \"Max Wait Time\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"SQL select query\": {\n-                                \"description\": \"The SQL select query to execute. The query can be empty, a constant value, or built from attributes using Expression Language. If this property is specified, it will be used regardless of the content of incoming flowfiles. If this property is empty, the content of the incoming flow file is expected to contain a valid SQL select query, to be issued by the processor to the database. Note that Expression Language is not evaluated for flow file contents.\",\n-                                \"displayName\": \"SQL select query\",\n+                            \"Maximum-value Columns\": {\n+                                \"description\": \"A comma-separated list of column names. The processor will keep track of the maximum value for each column that has been returned since the processor started running. Using multiple columns implies an order to the column list, and each column's values are expected to increase more slowly than the previous columns' values. Thus, using multiple columns implies a hierarchical structure of columns, which is usually used for partitioning tables. This processor can be used to retrieve only those rows that have been added/updated since the last retrieval. Note that some JDBC types such as bit/boolean are not conducive to maintaining maximum value, so columns of these types should not be listed in this property, and will result in error(s) during processing. If no columns are provided, all rows from the table will be considered, which could have a performance impact. NOTE: It is important to use consistent max-value column names for a given table for incremental fetch to work properly.\",\n+                                \"displayName\": \"Maximum-value Columns\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"SQL select query\",\n+                                \"name\": \"Maximum-value Columns\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"compression-format\": {\n+                            \"Set Auto Commit\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"BZIP2\",\n-                                        \"value\": \"BZIP2\"\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"DEFLATE\",\n-                                        \"value\": \"DEFLATE\"\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n+                                    }\n+                                ],\n+                                \"description\": \"Allows enabling or disabling the auto commit functionality of the DB connection. Default value is 'No value set'. 'No value set' will leave the db connection's auto commit mode unchanged. For some JDBC drivers such as PostgreSQL driver, it is required to disable the auto commit functionality to get the 'Fetch Size' setting to take effect. When auto commit is enabled, PostgreSQL driver ignores 'Fetch Size' setting and loads all rows of the result set to memory at once. This could lead for a large amount of memory usage when executing queries which fetch large data sets. More Details of this behaviour in PostgreSQL driver can be found in https://jdbc.postgresql.org//documentation/head/query.html.\",\n+                                \"displayName\": \"Set Auto Commit\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Set Auto Commit\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Table Name\": {\n+                                \"description\": \"The name of the database table to be queried. When a custom query is used, this property is used to alias the query and appears as an attribute on the FlowFile.\",\n+                                \"displayName\": \"Table Name\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Table Name\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"db-fetch-db-type\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"Generates ANSI SQL\",\n+                                        \"displayName\": \"Generic\",\n+                                        \"value\": \"Generic\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"NONE\",\n-                                        \"value\": \"NONE\"\n+                                        \"description\": \"Generates Oracle compliant SQL\",\n+                                        \"displayName\": \"Oracle\",\n+                                        \"value\": \"Oracle\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"SNAPPY\",\n-                                        \"value\": \"SNAPPY\"\n+                                        \"description\": \"Generates Oracle compliant SQL for version 12 or greater\",\n+                                        \"displayName\": \"Oracle 12+\",\n+                                        \"value\": \"Oracle 12+\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"LZO\",\n-                                        \"value\": \"LZO\"\n+                                        \"description\": \"Generates MS SQL Compatible SQL, for version 2012 or greater\",\n+                                        \"displayName\": \"MS SQL 2012+\",\n+                                        \"value\": \"MS SQL 2012+\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Generates MS SQL Compatible SQL for version 2008\",\n+                                        \"displayName\": \"MS SQL 2008\",\n+                                        \"value\": \"MS SQL 2008\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Generates MySQL compatible SQL\",\n+                                        \"displayName\": \"MySQL\",\n+                                        \"value\": \"MySQL\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Generates PostgreSQL compatible SQL\",\n+                                        \"displayName\": \"PostgreSQL\",\n+                                        \"value\": \"PostgreSQL\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Generates Phoenix compliant SQL\",\n+                                        \"displayName\": \"Phoenix\",\n+                                        \"value\": \"Phoenix\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"NONE\",\n-                                \"description\": \"Compression type to use when writing Avro files. Default is None.\",\n-                                \"displayName\": \"Compression Format\",\n+                                \"defaultValue\": \"Generic\",\n+                                \"description\": \"The type/flavor of database, used for generating database-specific code. In many cases the Generic type should suffice, but some databases (such as Oracle) require custom SQL clauses. \",\n+                                \"displayName\": \"Database Type\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"compression-format\",\n+                                \"name\": \"db-fetch-db-type\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n+                            \"db-fetch-sql-query\": {\n+                                \"description\": \"A custom SQL query used to retrieve data. Instead of building a SQL query from other properties, this query will be wrapped as a sub-query. Query must have no ORDER BY statement.\",\n+                                \"displayName\": \"Custom Query\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"db-fetch-sql-query\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"db-fetch-where-clause\": {\n+                                \"description\": \"A custom clause to be added in the WHERE condition when building SQL queries.\",\n+                                \"displayName\": \"Additional WHERE clause\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"db-fetch-where-clause\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n                             \"dbf-default-precision\": {\n                                 \"defaultValue\": \"10\",\n                                 \"description\": \"When a DECIMAL/NUMBER value is written as a 'decimal' Avro logical type, a specific 'precision' denoting number of available digits is required. Generally, precision is defined by column data type definition or database engines default. However undefined precision (0) can be returned from some database engines. 'Default Decimal Precision' is used when writing those undefined precision numbers.\",\n                                 \"displayName\": \"Default Decimal Precision\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n                                 \"name\": \"dbf-default-precision\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n                             \"dbf-default-scale\": {\n                                 \"defaultValue\": \"0\",\n                                 \"description\": \"When a DECIMAL/NUMBER value is written as a 'decimal' Avro logical type, a specific 'scale' denoting number of available decimal digits is required. Generally, scale is defined by column data type definition or database engines default. However when undefined precision (0) is returned, scale can also be uncertain with some database engines. 'Default Decimal Scale' is used when writing those undefined numbers. If a value has more decimals than specified scale, then the value will be rounded-up, e.g. 1.53 becomes 2 with scale 0, and 1.5 with scale 1.\",\n                                 \"displayName\": \"Default Decimal Scale\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n                                 \"name\": \"dbf-default-scale\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n                             \"dbf-normalize\": {\n                                 \"allowableValues\": [\n                                     {\n@@ -100057,280 +100598,385 @@\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n                                 \"name\": \"dbf-user-logical-types\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"esql-auto-commit\": {\n+                            \"initial-load-strategy\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"description\": \"Loads all existing rows from the database table.\",\n+                                        \"displayName\": \"Start at Beginning\",\n+                                        \"value\": \"Start at Beginning\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"description\": \"Loads only the newly inserted or updated rows based on the maximum value(s) of the column(s) configured in the 'Maximum-value Columns' property.\",\n+                                        \"displayName\": \"Start at Current Maximum Values\",\n+                                        \"value\": \"Start at Current Maximum Values\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"true\",\n-                                \"description\": \"Enables or disables the auto commit functionality of the DB connection. Default value is 'true'. The default value can be used with most of the JDBC drivers and this functionality doesn't have any impact in most of the cases since this processor is used to read data. However, for some JDBC drivers such as PostgreSQL driver, it is required to disable the auto committing functionality to limit the number of result rows fetching at a time. When auto commit is enabled, postgreSQL driver loads whole result set to memory at once. This could lead for a large amount of memory usage when executing queries which fetch large data sets. More Details of this behaviour in PostgreSQL driver can be found in https://jdbc.postgresql.org//documentation/head/query.html. \",\n-                                \"displayName\": \"Set Auto Commit\",\n+                                \"defaultValue\": \"Start at Beginning\",\n+                                \"description\": \"How to handle existing rows in the database table when the processor is started for the first time (or its state has been cleared). The property will be ignored, if any 'initial.maxvalue.*' dynamic property has also been configured.\",\n+                                \"displayName\": \"Initial Load Strategy\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"esql-auto-commit\",\n+                                \"name\": \"initial-load-strategy\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"esql-fetch-size\": {\n+                            \"qdbt-max-frags\": {\n                                 \"defaultValue\": \"0\",\n-                                \"description\": \"The number of result rows to be fetched from the result set at a time. This is a hint to the database driver and may not be honored and/or exact. If the value specified is zero, then the hint is ignored.\",\n-                                \"displayName\": \"Fetch Size\",\n+                                \"description\": \"The maximum number of fragments. If the value specified is zero, then all fragments are returned. This prevents OutOfMemoryError when this processor ingests huge table. NOTE: Setting this property can result in data loss, as the incoming results are not ordered, and fragments may end at arbitrary boundaries where rows are not included in the result set.\",\n+                                \"displayName\": \"Maximum Number of Fragments\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"esql-fetch-size\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"qdbt-max-frags\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"esql-max-rows\": {\n+                            \"qdbt-max-rows\": {\n                                 \"defaultValue\": \"0\",\n                                 \"description\": \"The maximum number of result rows that will be included in a single FlowFile. This will allow you to break up very large result sets into multiple FlowFiles. If the value specified is zero, then all rows are returned in a single FlowFile.\",\n                                 \"displayName\": \"Max Rows Per Flow File\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"esql-max-rows\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"qdbt-max-rows\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"esql-output-batch-size\": {\n+                            \"qdbt-output-batch-size\": {\n                                 \"defaultValue\": \"0\",\n-                                \"description\": \"The number of output FlowFiles to queue before committing the process session. When set to zero, the session will be committed when all result set rows have been processed and the output FlowFiles are ready for transfer to the downstream relationship. For large result sets, this can cause a large burst of FlowFiles to be transferred at the end of processor execution. If this property is set, then when the specified number of FlowFiles are ready for transfer, then the session will be committed, thus releasing the FlowFiles to the downstream relationship. NOTE: The fragment.count attribute will not be set on FlowFiles when this property is set.\",\n+                                \"description\": \"The number of output FlowFiles to queue before committing the process session. When set to zero, the session will be committed when all result set rows have been processed and the output FlowFiles are ready for transfer to the downstream relationship. For large result sets, this can cause a large burst of FlowFiles to be transferred at the end of processor execution. If this property is set, then when the specified number of FlowFiles are ready for transfer, then the session will be committed, thus releasing the FlowFiles to the downstream relationship. NOTE: The maxvalue.* and fragment.count attributes will not be set on FlowFiles when this property is set.\",\n                                 \"displayName\": \"Output Batch Size\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"esql-output-batch-size\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"qdbt-output-batch-size\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"sql-post-query\": {\n-                                \"description\": \"A semicolon-delimited list of queries executed after the main SQL query is executed. Example like setting session properties after main query. It's possible to include semicolons in the statements themselves by escaping them with a backslash ('\\\\;'). Results/outputs from these queries will be suppressed if there are no errors.\",\n-                                \"displayName\": \"SQL Post-Query\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"sql-post-query\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"sql-pre-query\": {\n-                                \"description\": \"A semicolon-delimited list of queries executed before the main SQL query is executed. For example, set session properties before main query. It's possible to include semicolons in the statements themselves by escaping them with a backslash ('\\\\;'). Results/outputs from these queries will be suppressed if there are no errors.\",\n-                                \"displayName\": \"SQL Pre-Query\",\n+                            \"transaction-isolation-level\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"TRANSACTION_NONE\",\n+                                        \"value\": \"0\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"TRANSACTION_READ_COMMITTED\",\n+                                        \"value\": \"2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"TRANSACTION_READ_UNCOMMITTED\",\n+                                        \"value\": \"1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"TRANSACTION_REPEATABLE_READ\",\n+                                        \"value\": \"4\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"TRANSACTION_SERIALIZABLE\",\n+                                        \"value\": \"8\"\n+                                    }\n+                                ],\n+                                \"description\": \"This setting will set the transaction isolation level for the database connection for drivers that support this setting\",\n+                                \"displayName\": \"Transaction Isolation Level\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"sql-pre-query\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"transaction-isolation-level\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             }\n                         },\n-                        \"readsAttributes\": [\n-                            {\n-                                \"description\": \"Incoming FlowFiles are expected to be parametrized SQL statements. The type of each Parameter is specified as an integer that represents the JDBC Type of the parameter. The following types are accepted: [LONGNVARCHAR: -16], [BIT: -7], [BOOLEAN: 16], [TINYINT: -6], [BIGINT: -5], [LONGVARBINARY: -4], [VARBINARY: -3], [BINARY: -2], [LONGVARCHAR: -1], [CHAR: 1], [NUMERIC: 2], [DECIMAL: 3], [INTEGER: 4], [SMALLINT: 5] [FLOAT: 6], [REAL: 7], [DOUBLE: 8], [VARCHAR: 12], [DATE: 91], [TIME: 92], [TIMESTAMP: 93], [VARCHAR: 12], [CLOB: 2005], [NCLOB: 2011]\",\n-                                \"name\": \"sql.args.N.type\"\n-                            },\n-                            {\n-                                \"description\": \"Incoming FlowFiles are expected to be parametrized SQL statements. The value of the Parameters are specified as sql.args.1.value, sql.args.2.value, sql.args.3.value, and so on. The type of the sql.args.1.value Parameter is specified by the sql.args.1.type attribute.\",\n-                                \"name\": \"sql.args.N.value\"\n-                            },\n-                            {\n-                                \"description\": \"This attribute is always optional, but default options may not always work for your data. Incoming FlowFiles are expected to be parametrized SQL statements. In some cases a format option needs to be specified, currently this is only applicable for binary data types, dates, times and timestamps. Binary Data Types (defaults to 'ascii') - ascii: each string character in your attribute value represents a single byte. This is the format provided by Avro Processors. base64: the string is a Base64 encoded string that can be decoded to bytes. hex: the string is hex encoded with all letters in upper case and no '0x' at the beginning. Dates/Times/Timestamps - Date, Time and Timestamp formats all support both custom formats or named format ('yyyy-MM-dd','ISO_OFFSET_DATE_TIME') as specified according to java.time.format.DateTimeFormatter. If not specified, a long value input is expected to be an unix epoch (milli seconds from 1970/1/1), or a string value in 'yyyy-MM-dd' format for Date, 'HH:mm:ss.SSS' for Time (some database engines e.g. Derby or MySQL do not support milliseconds and will truncate milliseconds), 'yyyy-MM-dd HH:mm:ss.SSS' for Timestamp is used.\",\n-                                \"name\": \"sql.args.N.format\"\n-                            }\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.processors.standard.ExecuteSQL\",\n+                            \"org.apache.nifi.processors.standard.GenerateTableFetch\"\n                         ],\n                         \"sideEffectFree\": false,\n+                        \"stateful\": {\n+                            \"description\": \"After performing a query on the specified table, the maximum values for the specified column(s) will be retained for use in future executions of the query. This allows the Processor to fetch only those records that have max values greater than the retained values. This can be used for incremental fetching, fetching of newly added rows, etc. To clear the maximum values, clear the state of the processor per the State Management documentation\",\n+                            \"scopes\": [\n+                                \"CLUSTER\"\n+                            ]\n+                        },\n                         \"supportedRelationships\": [\n                             {\n                                 \"description\": \"Successfully created FlowFile from SQL query result set.\",\n                                 \"name\": \"success\"\n-                            },\n-                            {\n-                                \"description\": \"SQL query execution failed. Incoming FlowFile will be penalized and routed to this relationship\",\n-                                \"name\": \"failure\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\",\n-                            \"EVENT_DRIVEN\"\n+                            \"CRON_DRIVEN\"\n                         ],\n                         \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": true,\n                         \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": true,\n-                        \"supportsSensitiveDynamicProperties\": true,\n+                        \"supportsEventDriven\": false,\n+                        \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n                             \"database\",\n                             \"jdbc\",\n                             \"query\",\n                             \"select\",\n                             \"sql\"\n                         ],\n-                        \"triggerSerially\": false,\n+                        \"triggerSerially\": true,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.standard.ExecuteSQL\",\n-                        \"typeDescription\": \"Executes provided SQL select query. Query result will be converted to Avro format. Streaming is used so arbitrarily large result sets are supported. This processor can be scheduled to run on a timer, or cron expression, using the standard scheduling methods, or it can be triggered by an incoming FlowFile. If it is triggered by an incoming FlowFile, then attributes of that FlowFile will be available when evaluating the select query, and the query may use the ? to escape parameters. In this case, the parameters to use must exist as FlowFile attributes with the naming convention sql.args.N.type and sql.args.N.value, where N is a positive integer. The sql.args.N.type is expected to be a number indicating the JDBC Type. The content of the FlowFile is expected to be in UTF-8 format. FlowFile attribute 'executesql.row.count' indicates how many rows were selected.\",\n+                        \"type\": \"org.apache.nifi.processors.standard.QueryDatabaseTable\",\n+                        \"typeDescription\": \"Generates a SQL select query, or uses a provided statement, and executes it to fetch all rows whose values in the specified Maximum Value column(s) are larger than the previously-seen maxima. Query result will be converted to Avro format. Expression Language is supported for several properties, but no incoming connections are permitted. The Variable Registry may be used to provide values for any property containing Expression Language. If it is desired to leverage flow file attributes to perform these queries, the GenerateTableFetch and/or ExecuteSQL processors can be used for this purpose. Streaming is used so arbitrarily large result sets are supported. This processor can be scheduled to run on a timer or cron expression, using the standard scheduling methods. This processor is intended to be run on the Primary Node only. FlowFile attribute 'querydbtable.row.count' indicates how many rows were selected.\",\n                         \"version\": \"1.27.0\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"Contains the number of rows returned by the query. If 'Max Rows Per Flow File' is set, then this number will reflect the number of rows in the Flow File instead of the entire result set.\",\n-                                \"name\": \"executesql.row.count\"\n-                            },\n-                            {\n-                                \"description\": \"Combined duration of the query execution time and fetch time in milliseconds. If 'Max Rows Per Flow File' is set, then this number will reflect only the fetch time for the rows in the Flow File instead of the entire result set.\",\n-                                \"name\": \"executesql.query.duration\"\n-                            },\n-                            {\n-                                \"description\": \"Duration of the query execution time in milliseconds. This number will reflect the query execution time regardless of the 'Max Rows Per Flow File' setting.\",\n-                                \"name\": \"executesql.query.executiontime\"\n-                            },\n-                            {\n-                                \"description\": \"Duration of the result set fetch time in milliseconds. If 'Max Rows Per Flow File' is set, then this number will reflect only the fetch time for the rows in the Flow File instead of the entire result set.\",\n-                                \"name\": \"executesql.query.fetchtime\"\n-                            },\n-                            {\n-                                \"description\": \"Assuming multiple result sets are returned, the zero based index of this result set.\",\n-                                \"name\": \"executesql.resultset.index\"\n+                                \"description\": \"Name of the table being queried\",\n+                                \"name\": \"tablename\"\n                             },\n                             {\n-                                \"description\": \"If processing an incoming flow file causes an Exception, the Flow File is routed to failure and this attribute is set to the exception message.\",\n-                                \"name\": \"executesql.error.message\"\n+                                \"description\": \"The number of rows selected by the query\",\n+                                \"name\": \"querydbtable.row.count\"\n                             },\n                             {\n                                 \"description\": \"If 'Max Rows Per Flow File' is set then all FlowFiles from the same query result set will have the same value for the fragment.identifier attribute. This can then be used to correlate the results.\",\n                                 \"name\": \"fragment.identifier\"\n                             },\n                             {\n                                 \"description\": \"If 'Max Rows Per Flow File' is set then this is the total number of  FlowFiles produced by a single ResultSet. This can be used in conjunction with the fragment.identifier attribute in order to know how many FlowFiles belonged to the same incoming ResultSet. If Output Batch Size is set, then this attribute will not be populated.\",\n                                 \"name\": \"fragment.count\"\n                             },\n                             {\n                                 \"description\": \"If 'Max Rows Per Flow File' is set then the position of this FlowFile in the list of outgoing FlowFiles that were all derived from the same result set FlowFile. This can be used in conjunction with the fragment.identifier attribute to know which FlowFiles originated from the same query result set and in what order  FlowFiles were produced\",\n                                 \"name\": \"fragment.index\"\n                             },\n                             {\n-                                \"description\": \"If the processor has an incoming connection, outgoing FlowFiles will have this attribute set to the value of the input FlowFile's UUID. If there is no incoming connection, the attribute will not be added.\",\n-                                \"name\": \"input.flowfile.uuid\"\n+                                \"description\": \"Each attribute contains the observed maximum value of a specified 'Maximum-value Column'. The suffix of the attribute is the name of the column. If Output Batch Size is set, then this attribute will not be populated.\",\n+                                \"name\": \"maxvalue.*\"\n                             }\n                         ]\n                     },\n                     {\n                         \"additionalDetails\": false,\n                         \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n-                            \"EVENT_DRIVEN\": 0,\n                             \"TIMER_DRIVEN\": 1\n                         },\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"0 sec\"\n+                            \"TIMER_DRIVEN\": \"1 min\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n                         \"dynamicProperties\": [\n                             {\n-                                \"description\": \"Incoming FlowFiles are expected to be parametrized SQL statements. The type of each Parameter is specified as an integer that represents the JDBC Type of the parameter. The following types are accepted: [LONGNVARCHAR: -16], [BIT: -7], [BOOLEAN: 16], [TINYINT: -6], [BIGINT: -5], [LONGVARBINARY: -4], [VARBINARY: -3], [BINARY: -2], [LONGVARCHAR: -1], [CHAR: 1], [NUMERIC: 2], [DECIMAL: 3], [INTEGER: 4], [SMALLINT: 5] [FLOAT: 6], [REAL: 7], [DOUBLE: 8], [VARCHAR: 12], [DATE: 91], [TIME: 92], [TIMESTAMP: 93], [VARCHAR: 12], [CLOB: 2005], [NCLOB: 2011]\",\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"name\": \"sql.args.N.type\",\n-                                \"value\": \"SQL type argument to be supplied\"\n-                            },\n-                            {\n-                                \"description\": \"Incoming FlowFiles are expected to be parametrized SQL statements. The value of the Parameters are specified as sql.args.1.value, sql.args.2.value, sql.args.3.value, and so on. The type of the sql.args.1.value Parameter is specified by the sql.args.1.type attribute.\",\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"name\": \"sql.args.N.value\",\n-                                \"value\": \"Argument to be supplied\"\n-                            },\n-                            {\n-                                \"description\": \"This attribute is always optional, but default options may not always work for your data. Incoming FlowFiles are expected to be parametrized SQL statements. In some cases a format option needs to be specified, currently this is only applicable for binary data types, dates, times and timestamps. Binary Data Types (defaults to 'ascii') - ascii: each string character in your attribute value represents a single byte. This is the format provided by Avro Processors. base64: the string is a Base64 encoded string that can be decoded to bytes. hex: the string is hex encoded with all letters in upper case and no '0x' at the beginning. Dates/Times/Timestamps - Date, Time and Timestamp formats all support both custom formats or named format ('yyyy-MM-dd','ISO_OFFSET_DATE_TIME') as specified according to java.time.format.DateTimeFormatter. If not specified, a long value input is expected to be an unix epoch (milli seconds from 1970/1/1), or a string value in 'yyyy-MM-dd' format for Date, 'HH:mm:ss.SSS' for Time (some database engines e.g. Derby or MySQL do not support milliseconds and will truncate milliseconds), 'yyyy-MM-dd HH:mm:ss.SSS' for Timestamp is used.\",\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"name\": \"sql.args.N.format\",\n-                                \"value\": \"SQL format argument to be supplied\"\n+                                \"description\": \"Specifies an initial max value for max value column(s). Properties should be added in the format `initial.maxvalue.<max_value_column>`. This value is only used the first time the table is accessed (when a Maximum Value Column is specified).\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"name\": \"initial.maxvalue.<max_value_column>\",\n+                                \"value\": \"Initial maximum value for the specified column\"\n                             }\n                         ],\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_ALLOWED\",\n-                        \"primaryNodeOnly\": false,\n+                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n+                        \"primaryNodeOnly\": true,\n                         \"propertyDescriptors\": {\n+                            \"Columns to Return\": {\n+                                \"description\": \"A comma-separated list of column names to be used in the query. If your database requires special treatment of the names (quoting, e.g.), each name should include such treatment. If no column names are supplied, all columns in the specified table will be returned. NOTE: It is important to use consistent column names for a given table for incremental fetch to work properly.\",\n+                                \"displayName\": \"Columns to Return\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Columns to Return\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n                             \"Database Connection Pooling Service\": {\n-                                \"description\": \"The Controller Service that is used to obtain connection to database\",\n+                                \"description\": \"The Controller Service that is used to obtain a connection to the database.\",\n                                 \"displayName\": \"Database Connection Pooling Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n                                 \"name\": \"Database Connection Pooling Service\",\n                                 \"required\": true,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n                                     \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n                                     \"type\": \"org.apache.nifi.dbcp.DBCPService\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             },\n+                            \"Fetch Size\": {\n+                                \"defaultValue\": \"0\",\n+                                \"description\": \"The number of result rows to be fetched from the result set at a time. This is a hint to the database driver and may not be honored and/or exact. If the value specified is zero, then the hint is ignored. If using PostgreSQL, then 'Set Auto Commit' must be equal to 'false' to cause 'Fetch Size' to take effect.\",\n+                                \"displayName\": \"Fetch Size\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Fetch Size\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n                             \"Max Wait Time\": {\n                                 \"defaultValue\": \"0 seconds\",\n-                                \"description\": \"The maximum amount of time allowed for a running SQL select query  , zero means there is no limit. Max time less than 1 second will be equal to zero.\",\n+                                \"description\": \"The maximum amount of time allowed for a running SQL select query , zero means there is no limit. Max time less than 1 second will be equal to zero.\",\n                                 \"displayName\": \"Max Wait Time\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n                                 \"name\": \"Max Wait Time\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"SQL select query\": {\n-                                \"description\": \"The SQL select query to execute. The query can be empty, a constant value, or built from attributes using Expression Language. If this property is specified, it will be used regardless of the content of incoming flowfiles. If this property is empty, the content of the incoming flow file is expected to contain a valid SQL select query, to be issued by the processor to the database. Note that Expression Language is not evaluated for flow file contents.\",\n-                                \"displayName\": \"SQL select query\",\n+                            \"Maximum-value Columns\": {\n+                                \"description\": \"A comma-separated list of column names. The processor will keep track of the maximum value for each column that has been returned since the processor started running. Using multiple columns implies an order to the column list, and each column's values are expected to increase more slowly than the previous columns' values. Thus, using multiple columns implies a hierarchical structure of columns, which is usually used for partitioning tables. This processor can be used to retrieve only those rows that have been added/updated since the last retrieval. Note that some JDBC types such as bit/boolean are not conducive to maintaining maximum value, so columns of these types should not be listed in this property, and will result in error(s) during processing. If no columns are provided, all rows from the table will be considered, which could have a performance impact. NOTE: It is important to use consistent max-value column names for a given table for incremental fetch to work properly.\",\n+                                \"displayName\": \"Maximum-value Columns\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"SQL select query\",\n+                                \"name\": \"Maximum-value Columns\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Set Auto Commit\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n+                                    }\n+                                ],\n+                                \"description\": \"Allows enabling or disabling the auto commit functionality of the DB connection. Default value is 'No value set'. 'No value set' will leave the db connection's auto commit mode unchanged. For some JDBC drivers such as PostgreSQL driver, it is required to disable the auto commit functionality to get the 'Fetch Size' setting to take effect. When auto commit is enabled, PostgreSQL driver ignores 'Fetch Size' setting and loads all rows of the result set to memory at once. This could lead for a large amount of memory usage when executing queries which fetch large data sets. More Details of this behaviour in PostgreSQL driver can be found in https://jdbc.postgresql.org//documentation/head/query.html.\",\n+                                \"displayName\": \"Set Auto Commit\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Set Auto Commit\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Table Name\": {\n+                                \"description\": \"The name of the database table to be queried. When a custom query is used, this property is used to alias the query and appears as an attribute on the FlowFile.\",\n+                                \"displayName\": \"Table Name\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Table Name\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"db-fetch-db-type\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"Generates ANSI SQL\",\n+                                        \"displayName\": \"Generic\",\n+                                        \"value\": \"Generic\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Generates Oracle compliant SQL\",\n+                                        \"displayName\": \"Oracle\",\n+                                        \"value\": \"Oracle\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Generates Oracle compliant SQL for version 12 or greater\",\n+                                        \"displayName\": \"Oracle 12+\",\n+                                        \"value\": \"Oracle 12+\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Generates MS SQL Compatible SQL, for version 2012 or greater\",\n+                                        \"displayName\": \"MS SQL 2012+\",\n+                                        \"value\": \"MS SQL 2012+\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Generates MS SQL Compatible SQL for version 2008\",\n+                                        \"displayName\": \"MS SQL 2008\",\n+                                        \"value\": \"MS SQL 2008\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Generates MySQL compatible SQL\",\n+                                        \"displayName\": \"MySQL\",\n+                                        \"value\": \"MySQL\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Generates PostgreSQL compatible SQL\",\n+                                        \"displayName\": \"PostgreSQL\",\n+                                        \"value\": \"PostgreSQL\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Generates Phoenix compliant SQL\",\n+                                        \"displayName\": \"Phoenix\",\n+                                        \"value\": \"Phoenix\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"Generic\",\n+                                \"description\": \"The type/flavor of database, used for generating database-specific code. In many cases the Generic type should suffice, but some databases (such as Oracle) require custom SQL clauses. \",\n+                                \"displayName\": \"Database Type\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"db-fetch-db-type\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"db-fetch-sql-query\": {\n+                                \"description\": \"A custom SQL query used to retrieve data. Instead of building a SQL query from other properties, this query will be wrapped as a sub-query. Query must have no ORDER BY statement.\",\n+                                \"displayName\": \"Custom Query\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"db-fetch-sql-query\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"db-fetch-where-clause\": {\n+                                \"description\": \"A custom clause to be added in the WHERE condition when building SQL queries.\",\n+                                \"displayName\": \"Additional WHERE clause\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"db-fetch-where-clause\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n                             \"dbf-default-precision\": {\n                                 \"defaultValue\": \"10\",\n                                 \"description\": \"When a DECIMAL/NUMBER value is written as a 'decimal' Avro logical type, a specific 'precision' denoting number of available digits is required. Generally, precision is defined by column data type definition or database engines default. However undefined precision (0) can be returned from some database engines. 'Default Decimal Precision' is used when writing those undefined precision numbers.\",\n                                 \"displayName\": \"Default Decimal Precision\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n                                 \"name\": \"dbf-default-precision\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n                             \"dbf-default-scale\": {\n                                 \"defaultValue\": \"0\",\n                                 \"description\": \"When a DECIMAL/NUMBER value is written as a 'decimal' Avro logical type, a specific 'scale' denoting number of available decimal digits is required. Generally, scale is defined by column data type definition or database engines default. However when undefined precision (0) is returned, scale can also be uncertain with some database engines. 'Default Decimal Scale' is used when writing those undefined numbers. If a value has more decimals than specified scale, then the value will be rounded-up, e.g. 1.53 becomes 2 with scale 0, and 1.5 with scale 1.\",\n                                 \"displayName\": \"Default Decimal Scale\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n                                 \"name\": \"dbf-default-scale\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n                             \"dbf-user-logical-types\": {\n                                 \"allowableValues\": [\n                                     {\n@@ -100350,219 +100996,174 @@\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n                                 \"name\": \"dbf-user-logical-types\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"esql-auto-commit\": {\n+                            \"initial-load-strategy\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"description\": \"Loads all existing rows from the database table.\",\n+                                        \"displayName\": \"Start at Beginning\",\n+                                        \"value\": \"Start at Beginning\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"description\": \"Loads only the newly inserted or updated rows based on the maximum value(s) of the column(s) configured in the 'Maximum-value Columns' property.\",\n+                                        \"displayName\": \"Start at Current Maximum Values\",\n+                                        \"value\": \"Start at Current Maximum Values\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"true\",\n-                                \"description\": \"Enables or disables the auto commit functionality of the DB connection. Default value is 'true'. The default value can be used with most of the JDBC drivers and this functionality doesn't have any impact in most of the cases since this processor is used to read data. However, for some JDBC drivers such as PostgreSQL driver, it is required to disable the auto committing functionality to limit the number of result rows fetching at a time. When auto commit is enabled, postgreSQL driver loads whole result set to memory at once. This could lead for a large amount of memory usage when executing queries which fetch large data sets. More Details of this behaviour in PostgreSQL driver can be found in https://jdbc.postgresql.org//documentation/head/query.html. \",\n-                                \"displayName\": \"Set Auto Commit\",\n+                                \"defaultValue\": \"Start at Beginning\",\n+                                \"description\": \"How to handle existing rows in the database table when the processor is started for the first time (or its state has been cleared). The property will be ignored, if any 'initial.maxvalue.*' dynamic property has also been configured.\",\n+                                \"displayName\": \"Initial Load Strategy\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"esql-auto-commit\",\n+                                \"name\": \"initial-load-strategy\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"esql-fetch-size\": {\n+                            \"qdbt-max-frags\": {\n                                 \"defaultValue\": \"0\",\n-                                \"description\": \"The number of result rows to be fetched from the result set at a time. This is a hint to the database driver and may not be honored and/or exact. If the value specified is zero, then the hint is ignored.\",\n-                                \"displayName\": \"Fetch Size\",\n+                                \"description\": \"The maximum number of fragments. If the value specified is zero, then all fragments are returned. This prevents OutOfMemoryError when this processor ingests huge table. NOTE: Setting this property can result in data loss, as the incoming results are not ordered, and fragments may end at arbitrary boundaries where rows are not included in the result set.\",\n+                                \"displayName\": \"Maximum Number of Fragments\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"esql-fetch-size\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"qdbt-max-frags\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"esql-max-rows\": {\n+                            \"qdbt-max-rows\": {\n                                 \"defaultValue\": \"0\",\n                                 \"description\": \"The maximum number of result rows that will be included in a single FlowFile. This will allow you to break up very large result sets into multiple FlowFiles. If the value specified is zero, then all rows are returned in a single FlowFile.\",\n                                 \"displayName\": \"Max Rows Per Flow File\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"esql-max-rows\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"qdbt-max-rows\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"esql-output-batch-size\": {\n+                            \"qdbt-output-batch-size\": {\n                                 \"defaultValue\": \"0\",\n-                                \"description\": \"The number of output FlowFiles to queue before committing the process session. When set to zero, the session will be committed when all result set rows have been processed and the output FlowFiles are ready for transfer to the downstream relationship. For large result sets, this can cause a large burst of FlowFiles to be transferred at the end of processor execution. If this property is set, then when the specified number of FlowFiles are ready for transfer, then the session will be committed, thus releasing the FlowFiles to the downstream relationship. NOTE: The fragment.count attribute will not be set on FlowFiles when this property is set.\",\n+                                \"description\": \"The number of output FlowFiles to queue before committing the process session. When set to zero, the session will be committed when all result set rows have been processed and the output FlowFiles are ready for transfer to the downstream relationship. For large result sets, this can cause a large burst of FlowFiles to be transferred at the end of processor execution. If this property is set, then when the specified number of FlowFiles are ready for transfer, then the session will be committed, thus releasing the FlowFiles to the downstream relationship. NOTE: The maxvalue.* and fragment.count attributes will not be set on FlowFiles when this property is set.\",\n                                 \"displayName\": \"Output Batch Size\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"esql-output-batch-size\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"qdbt-output-batch-size\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"esqlrecord-normalize\": {\n+                            \"qdbtr-normalize\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"true\",\n                                         \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"false\",\n                                         \"value\": \"false\"\n                                     }\n                                 ],\n                                 \"defaultValue\": \"false\",\n-                                \"description\": \"Whether to change characters in column names. For example, colons and periods will be changed to underscores.\",\n+                                \"description\": \"Whether to change characters in column names when creating the output schema. For example, colons and periods will be changed to underscores.\",\n                                 \"displayName\": \"Normalize Table/Column Names\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"esqlrecord-normalize\",\n+                                \"name\": \"qdbtr-normalize\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"esqlrecord-record-writer\": {\n+                            \"qdbtr-record-writer\": {\n                                 \"description\": \"Specifies the Controller Service to use for writing results to a FlowFile. The Record Writer may use Inherit Schema to emulate the inferred schema behavior, i.e. an explicit schema need not be defined in the writer, and will be supplied by the same logic used to infer the schema from the column types.\",\n                                 \"displayName\": \"Record Writer\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"esqlrecord-record-writer\",\n+                                \"name\": \"qdbtr-record-writer\",\n                                 \"required\": true,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n                                     \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n                                     \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n                                     \"version\": \"1.27.0\"\n                                 }\n-                            },\n-                            \"sql-post-query\": {\n-                                \"description\": \"A semicolon-delimited list of queries executed after the main SQL query is executed. Example like setting session properties after main query. It's possible to include semicolons in the statements themselves by escaping them with a backslash ('\\\\;'). Results/outputs from these queries will be suppressed if there are no errors.\",\n-                                \"displayName\": \"SQL Post-Query\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"sql-post-query\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"sql-pre-query\": {\n-                                \"description\": \"A semicolon-delimited list of queries executed before the main SQL query is executed. For example, set session properties before main query. It's possible to include semicolons in the statements themselves by escaping them with a backslash ('\\\\;'). Results/outputs from these queries will be suppressed if there are no errors.\",\n-                                \"displayName\": \"SQL Pre-Query\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"sql-pre-query\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n                             }\n                         },\n-                        \"readsAttributes\": [\n-                            {\n-                                \"description\": \"Incoming FlowFiles are expected to be parametrized SQL statements. The type of each Parameter is specified as an integer that represents the JDBC Type of the parameter. The following types are accepted: [LONGNVARCHAR: -16], [BIT: -7], [BOOLEAN: 16], [TINYINT: -6], [BIGINT: -5], [LONGVARBINARY: -4], [VARBINARY: -3], [BINARY: -2], [LONGVARCHAR: -1], [CHAR: 1], [NUMERIC: 2], [DECIMAL: 3], [INTEGER: 4], [SMALLINT: 5] [FLOAT: 6], [REAL: 7], [DOUBLE: 8], [VARCHAR: 12], [DATE: 91], [TIME: 92], [TIMESTAMP: 93], [VARCHAR: 12], [CLOB: 2005], [NCLOB: 2011]\",\n-                                \"name\": \"sql.args.N.type\"\n-                            },\n-                            {\n-                                \"description\": \"Incoming FlowFiles are expected to be parametrized SQL statements. The value of the Parameters are specified as sql.args.1.value, sql.args.2.value, sql.args.3.value, and so on. The type of the sql.args.1.value Parameter is specified by the sql.args.1.type attribute.\",\n-                                \"name\": \"sql.args.N.value\"\n-                            },\n-                            {\n-                                \"description\": \"This attribute is always optional, but default options may not always work for your data. Incoming FlowFiles are expected to be parametrized SQL statements. In some cases a format option needs to be specified, currently this is only applicable for binary data types, dates, times and timestamps. Binary Data Types (defaults to 'ascii') - ascii: each string character in your attribute value represents a single byte. This is the format provided by Avro Processors. base64: the string is a Base64 encoded string that can be decoded to bytes. hex: the string is hex encoded with all letters in upper case and no '0x' at the beginning. Dates/Times/Timestamps - Date, Time and Timestamp formats all support both custom formats or named format ('yyyy-MM-dd','ISO_OFFSET_DATE_TIME') as specified according to java.time.format.DateTimeFormatter. If not specified, a long value input is expected to be an unix epoch (milli seconds from 1970/1/1), or a string value in 'yyyy-MM-dd' format for Date, 'HH:mm:ss.SSS' for Time (some database engines e.g. Derby or MySQL do not support milliseconds and will truncate milliseconds), 'yyyy-MM-dd HH:mm:ss.SSS' for Timestamp is used.\",\n-                                \"name\": \"sql.args.N.format\"\n-                            }\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.processors.standard.ExecuteSQL\",\n+                            \"org.apache.nifi.processors.standard.GenerateTableFetch\"\n                         ],\n                         \"sideEffectFree\": false,\n+                        \"stateful\": {\n+                            \"description\": \"After performing a query on the specified table, the maximum values for the specified column(s) will be retained for use in future executions of the query. This allows the Processor to fetch only those records that have max values greater than the retained values. This can be used for incremental fetching, fetching of newly added rows, etc. To clear the maximum values, clear the state of the processor per the State Management documentation\",\n+                            \"scopes\": [\n+                                \"CLUSTER\"\n+                            ]\n+                        },\n                         \"supportedRelationships\": [\n                             {\n                                 \"description\": \"Successfully created FlowFile from SQL query result set.\",\n                                 \"name\": \"success\"\n-                            },\n-                            {\n-                                \"description\": \"SQL query execution failed. Incoming FlowFile will be penalized and routed to this relationship\",\n-                                \"name\": \"failure\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\",\n-                            \"EVENT_DRIVEN\"\n+                            \"CRON_DRIVEN\"\n                         ],\n                         \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": true,\n                         \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": true,\n-                        \"supportsSensitiveDynamicProperties\": true,\n+                        \"supportsEventDriven\": false,\n+                        \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n                             \"database\",\n                             \"jdbc\",\n                             \"query\",\n                             \"record\",\n                             \"select\",\n                             \"sql\"\n                         ],\n-                        \"triggerSerially\": false,\n+                        \"triggerSerially\": true,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.standard.ExecuteSQLRecord\",\n-                        \"typeDescription\": \"Executes provided SQL select query. Query result will be converted to the format specified by a Record Writer. Streaming is used so arbitrarily large result sets are supported. This processor can be scheduled to run on a timer, or cron expression, using the standard scheduling methods, or it can be triggered by an incoming FlowFile. If it is triggered by an incoming FlowFile, then attributes of that FlowFile will be available when evaluating the select query, and the query may use the ? to escape parameters. In this case, the parameters to use must exist as FlowFile attributes with the naming convention sql.args.N.type and sql.args.N.value, where N is a positive integer. The sql.args.N.type is expected to be a number indicating the JDBC Type. The content of the FlowFile is expected to be in UTF-8 format. FlowFile attribute 'executesql.row.count' indicates how many rows were selected.\",\n+                        \"type\": \"org.apache.nifi.processors.standard.QueryDatabaseTableRecord\",\n+                        \"typeDescription\": \"Generates a SQL select query, or uses a provided statement, and executes it to fetch all rows whose values in the specified Maximum Value column(s) are larger than the previously-seen maxima. Query result will be converted to the format specified by the record writer. Expression Language is supported for several properties, but no incoming connections are permitted. The Variable Registry may be used to provide values for any property containing Expression Language. If it is desired to leverage flow file attributes to perform these queries, the GenerateTableFetch and/or ExecuteSQL processors can be used for this purpose. Streaming is used so arbitrarily large result sets are supported. This processor can be scheduled to run on a timer or cron expression, using the standard scheduling methods. This processor is intended to be run on the Primary Node only. FlowFile attribute 'querydbtable.row.count' indicates how many rows were selected.\",\n                         \"version\": \"1.27.0\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"Contains the number of rows returned in the select query\",\n-                                \"name\": \"executesql.row.count\"\n-                            },\n-                            {\n-                                \"description\": \"Combined duration of the query execution time and fetch time in milliseconds\",\n-                                \"name\": \"executesql.query.duration\"\n-                            },\n-                            {\n-                                \"description\": \"Duration of the query execution time in milliseconds\",\n-                                \"name\": \"executesql.query.executiontime\"\n-                            },\n-                            {\n-                                \"description\": \"Duration of the result set fetch time in milliseconds\",\n-                                \"name\": \"executesql.query.fetchtime\"\n-                            },\n-                            {\n-                                \"description\": \"Assuming multiple result sets are returned, the zero based index of this result set.\",\n-                                \"name\": \"executesql.resultset.index\"\n+                                \"description\": \"Name of the table being queried\",\n+                                \"name\": \"tablename\"\n                             },\n                             {\n-                                \"description\": \"If processing an incoming flow file causes an Exception, the Flow File is routed to failure and this attribute is set to the exception message.\",\n-                                \"name\": \"executesql.error.message\"\n+                                \"description\": \"The number of rows selected by the query\",\n+                                \"name\": \"querydbtable.row.count\"\n                             },\n                             {\n                                 \"description\": \"If 'Max Rows Per Flow File' is set then all FlowFiles from the same query result set will have the same value for the fragment.identifier attribute. This can then be used to correlate the results.\",\n                                 \"name\": \"fragment.identifier\"\n                             },\n                             {\n                                 \"description\": \"If 'Max Rows Per Flow File' is set then this is the total number of  FlowFiles produced by a single ResultSet. This can be used in conjunction with the fragment.identifier attribute in order to know how many FlowFiles belonged to the same incoming ResultSet. If Output Batch Size is set, then this attribute will not be populated.\",\n                                 \"name\": \"fragment.count\"\n                             },\n                             {\n                                 \"description\": \"If 'Max Rows Per Flow File' is set then the position of this FlowFile in the list of outgoing FlowFiles that were all derived from the same result set FlowFile. This can be used in conjunction with the fragment.identifier attribute to know which FlowFiles originated from the same query result set and in what order  FlowFiles were produced\",\n                                 \"name\": \"fragment.index\"\n                             },\n                             {\n-                                \"description\": \"If the processor has an incoming connection, outgoing FlowFiles will have this attribute set to the value of the input FlowFile's UUID. If there is no incoming connection, the attribute will not be added.\",\n-                                \"name\": \"input.flowfile.uuid\"\n+                                \"description\": \"Each attribute contains the observed maximum value of a specified 'Maximum-value Column'. The suffix of the attribute is the name of the column. If Output Batch Size is set, then this attribute will not be populated.\",\n+                                \"name\": \"maxvalue.*\"\n                             },\n                             {\n                                 \"description\": \"Sets the mime.type attribute to the MIME Type specified by the Record Writer.\",\n                                 \"name\": \"mime.type\"\n                             },\n                             {\n                                 \"description\": \"The number of records output by the Record Writer.\",\n@@ -100587,428 +101188,192 @@\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n                         \"dynamicProperties\": [\n                             {\n-                                \"description\": \"These environment variables are passed to the process spawned by this Processor\",\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"name\": \"An environment variable name\",\n-                                \"value\": \"An environment variable value\"\n-                            },\n-                            {\n-                                \"description\": \"These arguments are supplied to the process spawned by this Processor when using the Command Arguments Strategy : Dynamic Property Arguments. <commandIndex> is a number and it will determine the order.\",\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"name\": \"command.argument.<commandIndex>\",\n-                                \"value\": \"Argument to be supplied to the command\"\n-                            }\n-                        ],\n-                        \"explicitRestrictions\": [\n-                            {\n-                                \"explanation\": \"Provides operator the ability to execute arbitrary code assuming all permissions that NiFi has.\",\n-                                \"requiredPermission\": \"execute code\"\n+                                \"description\": \"Each user-defined property specifies a SQL SELECT statement to run over the data, with the data that is selected being routed to the relationship whose name is the property name\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"name\": \"The name of the relationship to route data to\",\n+                                \"value\": \"A SQL SELECT statement that is used to determine what data should be routed to this relationship.\"\n                             }\n                         ],\n+                        \"dynamicRelationship\": {\n+                            \"description\": \"Each user-defined property defines a new Relationship for this Processor.\",\n+                            \"name\": \"<Property Name>\"\n+                        },\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Argument Delimiter\": {\n-                                \"defaultValue\": \";\",\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"Command Arguments Property\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Command Arguments Strategy\",\n-                                        \"propertyName\": \"argumentsStrategy\"\n-                                    }\n-                                ],\n-                                \"description\": \"Delimiter to use to separate arguments for a command [default: ;]. Must be a single character\",\n-                                \"displayName\": \"Argument Delimiter\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Argument Delimiter\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Command Arguments\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"Command Arguments Property\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Command Arguments Strategy\",\n-                                        \"propertyName\": \"argumentsStrategy\"\n-                                    }\n-                                ],\n-                                \"description\": \"The arguments to supply to the executable delimited by the ';' character.\",\n-                                \"displayName\": \"Command Arguments\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Command Arguments\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Command Path\": {\n-                                \"description\": \"Specifies the command to be executed; if just the name of an executable is provided, it must be in the user's environment PATH.\",\n-                                \"displayName\": \"Command Path\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Command Path\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Ignore STDIN\": {\n+                            \"cache-schema\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"true\",\n                                         \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"false\",\n                                         \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"If true, the contents of the incoming flowfile will not be passed to the executing command\",\n-                                \"displayName\": \"Ignore STDIN\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Ignore STDIN\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Max Attribute Length\": {\n-                                \"defaultValue\": \"256\",\n-                                \"description\": \"If routing the output of the stream command to an attribute, the number of characters put to the attribute value will be at most this amount. This is important because attributes are held in memory and large attributes will quickly cause out of memory issues. If the output goes longer than this value, it will truncated to fit. Consider making this smaller if able.\",\n-                                \"displayName\": \"Max Attribute Length\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Max Attribute Length\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Output Destination Attribute\": {\n-                                \"description\": \"If set, the output of the stream command will be put into an attribute of the original FlowFile instead of a separate FlowFile. There will no longer be a relationship for 'output stream' or 'nonzero status'. The value of this property will be the key for the output attribute.\",\n-                                \"displayName\": \"Output Destination Attribute\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Output Destination Attribute\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Output MIME Type\": {\n-                                \"description\": \"Specifies the value to set for the \\\"mime.type\\\" attribute. This property is ignored if 'Output Destination Attribute' is set.\",\n-                                \"displayName\": \"Output MIME Type\",\n+                                \"defaultValue\": \"true\",\n+                                \"description\": \"This property is no longer used. It remains solely for backward compatibility in order to avoid making existing Processors invalid upon upgrade. This property will be removed in future versions. Now, instead of forcing the user to understand the semantics of schema caching, the Processor caches up to 25 schemas and automatically rolls off the old schemas. This provides the same performance when caching was enabled previously and in some cases very significant performance improvements if caching was previously disabled.\",\n+                                \"displayName\": \"Cache Schema\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Output MIME Type\",\n-                                \"required\": false,\n+                                \"name\": \"cache-schema\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Working Directory\": {\n-                                \"description\": \"The directory to use as the current working directory when executing the command\",\n-                                \"displayName\": \"Working Directory\",\n+                            \"dbf-default-precision\": {\n+                                \"defaultValue\": \"10\",\n+                                \"description\": \"When a DECIMAL/NUMBER value is written as a 'decimal' Avro logical type, a specific 'precision' denoting number of available digits is required. Generally, precision is defined by column data type definition or database engines default. However undefined precision (0) can be returned from some database engines. 'Default Decimal Precision' is used when writing those undefined precision numbers.\",\n+                                \"displayName\": \"Default Decimal Precision\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Working Directory\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"argumentsStrategy\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"Arguments to be supplied to the executable are taken from the Command Arguments property\",\n-                                        \"displayName\": \"Command Arguments Property\",\n-                                        \"value\": \"Command Arguments Property\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Arguments to be supplied to the executable are taken from dynamic properties with pattern of 'command.argument.<commandIndex>'\",\n-                                        \"displayName\": \"Dynamic Property Arguments\",\n-                                        \"value\": \"Dynamic Property Arguments\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"Command Arguments Property\",\n-                                \"description\": \"Strategy for configuring arguments to be supplied to the command.\",\n-                                \"displayName\": \"Command Arguments Strategy\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"argumentsStrategy\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            }\n-                        },\n-                        \"restricted\": true,\n-                        \"sideEffectFree\": false,\n-                        \"supportedRelationships\": [\n-                            {\n-                                \"description\": \"The destination path for the flow file created from the command's output, if the returned status code is zero.\",\n-                                \"name\": \"output stream\"\n-                            },\n-                            {\n-                                \"description\": \"The destination path for the flow file created from the command's output, if the returned status code is non-zero. All flow files routed to this relationship will be penalized.\",\n-                                \"name\": \"nonzero status\"\n-                            },\n-                            {\n-                                \"description\": \"The original FlowFile will be routed. It will have new attributes detailing the result of the script execution.\",\n-                                \"name\": \"original\"\n-                            }\n-                        ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\",\n-                            \"EVENT_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": true,\n-                        \"supportsDynamicProperties\": true,\n-                        \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": true,\n-                        \"supportsSensitiveDynamicProperties\": true,\n-                        \"tags\": [\n-                            \"command\",\n-                            \"command execution\",\n-                            \"execute\",\n-                            \"stream\"\n-                        ],\n-                        \"triggerSerially\": false,\n-                        \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.standard.ExecuteStreamCommand\",\n-                        \"typeDescription\": \"The ExecuteStreamCommand processor provides a flexible way to integrate external commands and scripts into NiFi data flows. ExecuteStreamCommand can pass the incoming FlowFile's content to the command that it executes similarly how piping works.\",\n-                        \"version\": \"1.27.0\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"The name of the command executed\",\n-                                \"name\": \"execution.command\"\n-                            },\n-                            {\n-                                \"description\": \"The semi-colon delimited list of arguments. Sensitive properties will be masked\",\n-                                \"name\": \"execution.command.args\"\n-                            },\n-                            {\n-                                \"description\": \"The exit status code returned from executing the command\",\n-                                \"name\": \"execution.status\"\n-                            },\n-                            {\n-                                \"description\": \"Any error messages returned from executing the command\",\n-                                \"name\": \"execution.error\"\n-                            },\n-                            {\n-                                \"description\": \"Sets the MIME type of the output if the 'Output MIME Type' property is set and 'Output Destination Attribute' is not set\",\n-                                \"name\": \"mime.type\"\n-                            }\n-                        ]\n-                    },\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-standard-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"e0c4461\"\n-                        },\n-                        \"defaultBulletinLevel\": \"WARN\",\n-                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": 1,\n-                            \"EVENT_DRIVEN\": 0,\n-                            \"TIMER_DRIVEN\": 1\n-                        },\n-                        \"defaultPenaltyDuration\": \"30 sec\",\n-                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"0 sec\"\n-                        },\n-                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n-                        \"defaultYieldDuration\": \"1 sec\",\n-                        \"explicitRestrictions\": [\n-                            {\n-                                \"explanation\": \"Patterns can reference resources over HTTP\",\n-                                \"requiredPermission\": \"reference remote resources\"\n-                            }\n-                        ],\n-                        \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_REQUIRED\",\n-                        \"primaryNodeOnly\": false,\n-                        \"propertyDescriptors\": {\n-                            \"Character Set\": {\n-                                \"defaultValue\": \"UTF-8\",\n-                                \"description\": \"The Character Set in which the file is encoded\",\n-                                \"displayName\": \"Character Set\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Character Set\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Destination\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"flowfile-attribute\",\n-                                        \"value\": \"flowfile-attribute\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"flowfile-content\",\n-                                        \"value\": \"flowfile-content\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"flowfile-attribute\",\n-                                \"description\": \"Control if Grok output value is written as a new flowfile attributes, in this case each of the Grok identifier that is matched in the flowfile will be added as an attribute, prefixed with \\\"grok.\\\" or written in the flowfile content. Writing to flowfile content will overwrite any existing flowfile content.\",\n-                                \"displayName\": \"Destination\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Destination\",\n+                                \"name\": \"dbf-default-precision\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Grok Expression\": {\n-                                \"description\": \"Grok expression. If other Grok expressions are referenced in this expression, they must be provided in the Grok Pattern File if set or exist in the default Grok patterns\",\n-                                \"displayName\": \"Grok Expression\",\n+                            \"dbf-default-scale\": {\n+                                \"defaultValue\": \"0\",\n+                                \"description\": \"When a DECIMAL/NUMBER value is written as a 'decimal' Avro logical type, a specific 'scale' denoting number of available decimal digits is required. Generally, scale is defined by column data type definition or database engines default. However when undefined precision (0) is returned, scale can also be uncertain with some database engines. 'Default Decimal Scale' is used when writing those undefined numbers. If a value has more decimals than specified scale, then the value will be rounded-up, e.g. 1.53 becomes 2 with scale 0, and 1.5 with scale 1.\",\n+                                \"displayName\": \"Default Decimal Scale\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Grok Expression\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"dbf-default-scale\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Grok Pattern file\": {\n-                                \"description\": \"Custom Grok pattern definitions. These definitions will be loaded after the default Grok patterns. The Grok Parser will use the default Grok patterns when this property is not configured.\",\n-                                \"displayName\": \"Grok Patterns\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Grok Pattern file\",\n-                                \"required\": false,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"SINGLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\",\n-                                        \"URL\",\n-                                        \"TEXT\"\n-                                    ]\n-                                },\n-                                \"sensitive\": false\n-                            },\n-                            \"Keep Empty Captures\": {\n+                            \"include-zero-record-flowfiles\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"true\",\n                                         \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"false\",\n                                         \"value\": \"false\"\n                                     }\n                                 ],\n                                 \"defaultValue\": \"true\",\n-                                \"description\": \"If true, then empty capture values will be included in the returned capture map.\",\n-                                \"displayName\": \"Keep Empty Captures\",\n+                                \"description\": \"When running the SQL statement against an incoming FlowFile, if the result has no data, this property specifies whether or not a FlowFile will be sent to the corresponding relationship\",\n+                                \"displayName\": \"Include Zero Record FlowFiles\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Keep Empty Captures\",\n+                                \"name\": \"include-zero-record-flowfiles\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Maximum Buffer Size\": {\n-                                \"defaultValue\": \"1 MB\",\n-                                \"description\": \"Specifies the maximum amount of data to buffer (per file) in order to apply the Grok expressions. Files larger than the specified maximum will not be fully evaluated.\",\n-                                \"displayName\": \"Maximum Buffer Size\",\n+                            \"record-reader\": {\n+                                \"description\": \"Specifies the Controller Service to use for parsing incoming data and determining the data's schema\",\n+                                \"displayName\": \"Record Reader\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Maximum Buffer Size\",\n+                                \"name\": \"record-reader\",\n                                 \"required\": true,\n-                                \"sensitive\": false\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n                             },\n-                            \"Named captures only\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"Only store named captures from grok\",\n-                                \"displayName\": \"Named captures only\",\n+                            \"record-writer\": {\n+                                \"description\": \"Specifies the Controller Service to use for writing results to a FlowFile\",\n+                                \"displayName\": \"Record Writer\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Named captures only\",\n+                                \"name\": \"record-writer\",\n                                 \"required\": true,\n-                                \"sensitive\": false\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n                             }\n                         },\n-                        \"restricted\": true,\n                         \"sideEffectFree\": true,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"FlowFiles are routed to this relationship when no provided Grok Expression matches the content of the FlowFile\",\n-                                \"name\": \"unmatched\"\n+                                \"description\": \"If a FlowFile fails processing for any reason (for example, the SQL statement contains columns not present in input data), the original FlowFile it will be routed to this relationship\",\n+                                \"name\": \"failure\"\n                             },\n                             {\n-                                \"description\": \"FlowFiles are routed to this relationship when the Grok Expression is successfully evaluated and the FlowFile is modified as a result\",\n-                                \"name\": \"matched\"\n+                                \"description\": \"The original FlowFile is routed to this relationship\",\n+                                \"name\": \"original\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\",\n                             \"EVENT_DRIVEN\"\n                         ],\n                         \"supportsBatching\": true,\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsDynamicRelationships\": false,\n+                        \"supportsDynamicProperties\": true,\n+                        \"supportsDynamicRelationships\": true,\n                         \"supportsEventDriven\": true,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"delimit\",\n-                            \"extract\",\n-                            \"grok\",\n-                            \"log\",\n-                            \"parse\",\n-                            \"text\"\n+                            \"aggregate\",\n+                            \"avro\",\n+                            \"calcite\",\n+                            \"csv\",\n+                            \"etl\",\n+                            \"filter\",\n+                            \"json\",\n+                            \"logs\",\n+                            \"modify\",\n+                            \"query\",\n+                            \"record\",\n+                            \"route\",\n+                            \"select\",\n+                            \"sql\",\n+                            \"text\",\n+                            \"transform\",\n+                            \"update\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.standard.ExtractGrok\",\n-                        \"typeDescription\": \"Evaluates one or more Grok Expressions against the content of a FlowFile, adding the results as attributes or replacing the content of the FlowFile with a JSON notation of the matched content\",\n+                        \"type\": \"org.apache.nifi.processors.standard.QueryRecord\",\n+                        \"typeDescription\": \"Evaluates one or more SQL queries against the contents of a FlowFile. The result of the SQL query then becomes the content of the output FlowFile. This can be used, for example, for field-specific filtering, transformation, and row-level filtering. Columns can be renamed, simple calculations and aggregations performed, etc. The Processor is configured with a Record Reader Controller Service and a Record Writer service so as to allow flexibility in incoming and outgoing data formats. The Processor must be configured with at least one user-defined property. The name of the Property is the Relationship to route data to, and the value of the Property is a SQL SELECT statement that is used to specify how input data should be transformed/filtered. The SQL statement must be valid ANSI SQL and is powered by Apache Calcite. If the transformation fails, the original FlowFile is routed to the 'failure' relationship. Otherwise, the data selected will be routed to the associated relationship. If the Record Writer chooses to inherit the schema from the Record, it is important to note that the schema that is inherited will be from the ResultSet, rather than the input Record. This allows a single instance of the QueryRecord processor to have multiple queries, each of which returns a different set of columns and aggregations. As a result, though, the schema that is derived will have no schema name, so it is important that the configured Record Writer not attempt to write the Schema Name as an attribute if inheriting the Schema from the Record. See the Processor Usage documentation for more information.\",\n                         \"version\": \"1.27.0\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"When operating in flowfile-attribute mode, each of the Grok identifier that is matched in the flowfile will be added as an attribute, prefixed with \\\"grok.\\\" For example,if the grok identifier \\\"timestamp\\\" is matched, then the value will be added to an attribute named \\\"grok.timestamp\\\"\",\n-                                \"name\": \"grok.XXX\"\n+                                \"description\": \"Sets the mime.type attribute to the MIME Type specified by the Record Writer\",\n+                                \"name\": \"mime.type\"\n+                            },\n+                            {\n+                                \"description\": \"The number of records selected by the query\",\n+                                \"name\": \"record.count\"\n+                            },\n+                            {\n+                                \"description\": \"The relation to which the FlowFile was routed\",\n+                                \"name\": \"QueryRecord.Route\"\n                             }\n                         ]\n                     },\n                     {\n-                        \"additionalDetails\": false,\n+                        \"additionalDetails\": true,\n                         \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n@@ -101017,29 +101382,26 @@\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n+                        \"dynamicProperties\": [\n+                            {\n+                                \"description\": \"Allows users to specify fields to remove that match the RecordPath.\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"name\": \"(Ignored)\",\n+                                \"value\": \"A RecordPath to the field to be removed.\"\n+                            }\n+                        ],\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"cache-size\": {\n-                                \"defaultValue\": \"10\",\n-                                \"description\": \"Specifies the number of schemas to cache. This value should reflect the expected number of different schemas that may be in the incoming FlowFiles. This ensures more efficient retrieval of the schemas and thus the processor performance.\",\n-                                \"displayName\": \"Schema Cache Size\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"cache-size\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n                             \"record-reader\": {\n                                 \"description\": \"Specifies the Controller Service to use for reading incoming data\",\n                                 \"displayName\": \"Record Reader\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n                                 \"name\": \"record-reader\",\n@@ -101047,66 +101409,83 @@\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n                                     \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n                                     \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n                                     \"version\": \"1.27.0\"\n                                 }\n+                            },\n+                            \"record-writer\": {\n+                                \"description\": \"Specifies the Controller Service to use for writing out the records\",\n+                                \"displayName\": \"Record Writer\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"record-writer\",\n+                                \"required\": true,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n                             }\n                         },\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.processors.standard.UpdateRecord\"\n+                        ],\n                         \"sideEffectFree\": true,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"FlowFiles whose record schemas are successfully extracted will be routed to this relationship\",\n+                                \"description\": \"FlowFiles that are successfully transformed will be routed to this relationship\",\n                                 \"name\": \"success\"\n                             },\n                             {\n-                                \"description\": \"If a FlowFile's record schema cannot be extracted from the configured input format, the FlowFile will be routed to this relationship\",\n+                                \"description\": \"If a FlowFile cannot be transformed from the configured input format to the configured output format, the unchanged FlowFile will be routed to this relationship\",\n                                 \"name\": \"failure\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n                         \"supportsBatching\": true,\n-                        \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicProperties\": true,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n                             \"avro\",\n                             \"csv\",\n+                            \"delete\",\n                             \"freeform\",\n                             \"generic\",\n                             \"json\",\n                             \"record\",\n+                            \"remove\",\n                             \"schema\",\n                             \"text\",\n-                            \"xml\"\n+                            \"update\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.standard.ExtractRecordSchema\",\n-                        \"typeDescription\": \"Extracts the record schema from the FlowFile using the supplied Record Reader and writes it to the `avro.schema` attribute.\",\n+                        \"type\": \"org.apache.nifi.processors.standard.RemoveRecordField\",\n+                        \"typeDescription\": \"Modifies the contents of a FlowFile that contains Record-oriented data (i.e. data that can be read via a RecordReader and written by a RecordWriter) by removing selected fields. This Processor requires that at least one user-defined Property be added. The name of the property is ignored by the processor, but could be a meaningful identifier for the user. The value of the property should indicate a RecordPath that determines the field to be removed. The processor executes the removal in the order in which these properties are added to the processor. Set the \\\"Record Writer\\\" to \\\"Inherit Record Schema\\\" in order to use the updated Record Schema modified when removing Fields.\",\n                         \"version\": \"1.27.0\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"This attribute provides on failure the error message encountered by the Reader.\",\n+                                \"description\": \"This attribute provides on failure the error message encountered by the Reader or Writer.\",\n                                 \"name\": \"record.error.message\"\n-                            },\n-                            {\n-                                \"description\": \"This attribute provides the schema extracted from the input FlowFile using the provided RecordReader.\",\n-                                \"name\": \"avro.schema\"\n                             }\n                         ]\n                     },\n                     {\n-                        \"additionalDetails\": true,\n+                        \"additionalDetails\": false,\n                         \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n@@ -101116,22 +101495,14 @@\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n-                        \"dynamicProperties\": [\n-                            {\n-                                \"description\": \"The first capture group, if any found, will be placed into that attribute name.But all capture groups, including the matching string sequence itself will also be provided at that attribute name with an index value provided.\",\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"name\": \"A FlowFile attribute\",\n-                                \"value\": \"A Regular Expression with one or more capturing group\"\n-                            }\n-                        ],\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n                             \"Character Set\": {\n                                 \"defaultValue\": \"UTF-8\",\n                                 \"description\": \"The Character Set in which the file is encoded\",\n@@ -101139,346 +101510,259 @@\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n                                 \"name\": \"Character Set\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Enable Canonical Equivalence\": {\n+                            \"Evaluation Mode\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"displayName\": \"Line-by-Line\",\n+                                        \"value\": \"Line-by-Line\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"displayName\": \"Entire text\",\n+                                        \"value\": \"Entire text\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"Indicates that two characters match only when their full canonical decompositions match.\",\n-                                \"displayName\": \"Enable Canonical Equivalence\",\n+                                \"defaultValue\": \"Line-by-Line\",\n+                                \"description\": \"Run the 'Replacement Strategy' against each line separately (Line-by-Line) or buffer the entire file into memory (Entire Text) and run against that.\",\n+                                \"displayName\": \"Evaluation Mode\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Enable Canonical Equivalence\",\n+                                \"name\": \"Evaluation Mode\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Enable Case-insensitive Matching\": {\n+                            \"Line-by-Line Evaluation Mode\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"displayName\": \"All\",\n+                                        \"value\": \"All\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"Indicates that two characters match even if they are in a different case.  Can also be specified via the embedded flag (?i).\",\n-                                \"displayName\": \"Enable Case-insensitive Matching\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Enable Case-insensitive Matching\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Enable DOTALL Mode\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"displayName\": \"First-Line\",\n+                                        \"value\": \"First-Line\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"Indicates that the expression '.' should match any character, including a line terminator.  Can also be specified via the embedded flag (?s).\",\n-                                \"displayName\": \"Enable DOTALL Mode\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Enable DOTALL Mode\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Enable Literal Parsing of the Pattern\": {\n-                                \"allowableValues\": [\n+                                        \"displayName\": \"Last-Line\",\n+                                        \"value\": \"Last-Line\"\n+                                    },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"displayName\": \"Except-First-Line\",\n+                                        \"value\": \"Except-First-Line\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"displayName\": \"Except-Last-Line\",\n+                                        \"value\": \"Except-Last-Line\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"Indicates that Metacharacters and escape characters should be given no special meaning.\",\n-                                \"displayName\": \"Enable Literal Parsing of the Pattern\",\n+                                \"defaultValue\": \"All\",\n+                                \"description\": \"Run the 'Replacement Strategy' against each line separately (Line-by-Line) for all lines in the FlowFile, First Line (Header) alone, Last Line (Footer) alone, Except the First Line (Header) or Except the Last Line (Footer).\",\n+                                \"displayName\": \"Line-by-Line Evaluation Mode\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Enable Literal Parsing of the Pattern\",\n-                                \"required\": true,\n+                                \"name\": \"Line-by-Line Evaluation Mode\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Enable Multiline Mode\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"Indicates that '^' and '$' should match just after and just before a line terminator or end of sequence, instead of only the beginning or end of the entire input.  Can also be specified via the embeded flag (?m).\",\n-                                \"displayName\": \"Enable Multiline Mode\",\n+                            \"Maximum Buffer Size\": {\n+                                \"defaultValue\": \"1 MB\",\n+                                \"description\": \"Specifies the maximum amount of data to buffer (per file or per line, depending on the Evaluation Mode) in order to apply the replacement. If 'Entire Text' (in Evaluation Mode) is selected and the FlowFile is larger than this value, the FlowFile will be routed to 'failure'. In 'Line-by-Line' Mode, if a single line is larger than this value, the FlowFile will be routed to 'failure'. A default value of 1 MB is provided, primarily for 'Entire Text' mode. In 'Line-by-Line' Mode, a value such as 8 KB or 16 KB is suggested. This value is ignored if the <Replacement Strategy> property is set to one of: Append, Prepend, Always Replace\",\n+                                \"displayName\": \"Maximum Buffer Size\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Enable Multiline Mode\",\n+                                \"name\": \"Maximum Buffer Size\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Enable Unicode Predefined Character Classes\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n+                            \"Regular Expression\": {\n+                                \"defaultValue\": \"(?s)(^.*$)\",\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"dependentValues\": [\n+                                            \"Regex Replace\",\n+                                            \"Literal Replace\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Replacement Strategy\",\n+                                        \"propertyName\": \"Replacement Strategy\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"Specifies conformance with the Unicode Technical Standard #18: Unicode Regular Expression Annex C: Compatibility Properties.  Can also be specified via the embedded flag (?U).\",\n-                                \"displayName\": \"Enable Unicode Predefined Character Classes\",\n+                                \"description\": \"The Search Value to search for in the FlowFile content. Only used for 'Literal Replace' and 'Regex Replace' matching strategies\",\n+                                \"displayName\": \"Search Value\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Enable Unicode Predefined Character Classes\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Regular Expression\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Enable Unicode-aware Case Folding\": {\n+                            \"Replacement Strategy\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"description\": \"Insert the Replacement Value at the beginning of the FlowFile or the beginning of each line (depending on the Evaluation Mode). For \\\"Line-by-Line\\\" Evaluation Mode, the value will be prepended to each line. Similarly, for \\\"First-Line\\\", \\\"Last-Line\\\", \\\"Except-Last-Line\\\" and \\\"Except-First-Line\\\" Evaluation Modes,the value will be prepended to header alone, footer alone, all lines except header and all lines except footer respectively. For \\\"Entire Text\\\" evaluation mode,the value will be prepended to the entire text.\",\n+                                        \"displayName\": \"Prepend\",\n+                                        \"value\": \"Prepend\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"When used with 'Enable Case-insensitive Matching', matches in a manner consistent with the Unicode Standard.  Can also be specified via the embedded flag (?u).\",\n-                                \"displayName\": \"Enable Unicode-aware Case Folding\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Enable Unicode-aware Case Folding\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Enable Unix Lines Mode\": {\n-                                \"allowableValues\": [\n+                                        \"description\": \"Insert the Replacement Value at the end of the FlowFile or the end of each line (depending on the Evaluation Mode). For \\\"Line-by-Line\\\" Evaluation Mode, the value will be appended to each line. Similarly, for \\\"First-Line\\\", \\\"Last-Line\\\", \\\"Except-Last-Line\\\" and \\\"Except-First-Line\\\" Evaluation Modes,the value will be appended to header alone, footer alone, all lines except header and all lines except footer respectively. For \\\"Entire Text\\\" evaluation mode,the value will be appended to the entire text.\",\n+                                        \"displayName\": \"Append\",\n+                                        \"value\": \"Append\"\n+                                    },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"description\": \"Prepends text before the start of the FlowFile (or the start of each line, depending on the configuration of the Evaluation Mode property) as well as appending text to the end of the FlowFile (or the end of each line, depending on the configuration of the Evaluation Mode property)\",\n+                                        \"displayName\": \"Surround\",\n+                                        \"value\": \"Surround\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"Indicates that only the '\\n' line terminator is recognized in the behavior of '.', '^', and '$'.  Can also be specified via the embedded flag (?d).\",\n-                                \"displayName\": \"Enable Unix Lines Mode\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Enable Unix Lines Mode\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Include Capture Group 0\": {\n-                                \"allowableValues\": [\n+                                        \"description\": \"Interpret the Search Value as a Regular Expression and replace all matches with the Replacement Value. The Replacement Value may reference Capturing Groups used in the Search Value by using a dollar-sign followed by the Capturing Group number, such as $1 or $2. If the Search Value is set to .* then everything is replaced without even evaluating the Regular Expression.\",\n+                                        \"displayName\": \"Regex Replace\",\n+                                        \"value\": \"Regex Replace\"\n+                                    },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"description\": \"Search for all instances of the Search Value and replace the matches with the Replacement Value.\",\n+                                        \"displayName\": \"Literal Replace\",\n+                                        \"value\": \"Literal Replace\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"description\": \"Always replaces the entire line or the entire contents of the FlowFile (depending on the value of the <Evaluation Mode> property) and does not bother searching for any value. When this strategy is chosen, the <Search Value> property is ignored.\",\n+                                        \"displayName\": \"Always Replace\",\n+                                        \"value\": \"Always Replace\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Substitute variable references (specified in ${var} form) using FlowFile attributes for looking up the replacement value by variable name. When this strategy is chosen, both the <Search Value> and <Replacement Value> properties are ignored.\",\n+                                        \"displayName\": \"Substitute Variables\",\n+                                        \"value\": \"Substitute Variables\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"true\",\n-                                \"description\": \"Indicates that Capture Group 0 should be included as an attribute. Capture Group 0 represents the entirety of the regular expression match, is typically not used, and could have considerable length.\",\n-                                \"displayName\": \"Include Capture Group 0\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Include Capture Group 0\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Maximum Buffer Size\": {\n-                                \"defaultValue\": \"1 MB\",\n-                                \"description\": \"Specifies the maximum amount of data to buffer (per FlowFile) in order to apply the regular expressions. FlowFiles larger than the specified maximum will not be fully evaluated.\",\n-                                \"displayName\": \"Maximum Buffer Size\",\n+                                \"defaultValue\": \"Regex Replace\",\n+                                \"description\": \"The strategy for how and what to replace within the FlowFile's text content.\",\n+                                \"displayName\": \"Replacement Strategy\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Maximum Buffer Size\",\n+                                \"name\": \"Replacement Strategy\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Maximum Capture Group Length\": {\n-                                \"defaultValue\": \"1024\",\n-                                \"description\": \"Specifies the maximum number of characters a given capture group value can have. Any characters beyond the max will be truncated.\",\n-                                \"displayName\": \"Maximum Capture Group Length\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Maximum Capture Group Length\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Permit Whitespace and Comments in Pattern\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n+                            \"Replacement Value\": {\n+                                \"defaultValue\": \"$1\",\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"dependentValues\": [\n+                                            \"Prepend\",\n+                                            \"Regex Replace\",\n+                                            \"Always Replace\",\n+                                            \"Append\",\n+                                            \"Literal Replace\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Replacement Strategy\",\n+                                        \"propertyName\": \"Replacement Strategy\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"In this mode, whitespace is ignored, and embedded comments starting with # are ignored until the end of a line.  Can also be specified via the embedded flag (?x).\",\n-                                \"displayName\": \"Permit Whitespace and Comments in Pattern\",\n+                                \"description\": \"The value to insert using the 'Replacement Strategy'. Using \\\"Regex Replace\\\" back-references to Regular Expression capturing groups are supported, but back-references that reference capturing groups that do not exist in the regular expression will be treated as literal value. Back References may also be referenced using the Expression Language, as '$1', '$2', etc. The single-tick marks MUST be included, as these variables are not \\\"Standard\\\" attribute names (attribute names must be quoted unless they contain only numbers, letters, and _).\",\n+                                \"displayName\": \"Replacement Value\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Permit Whitespace and Comments in Pattern\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Replacement Value\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"extract-text-enable-named-groups\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n+                            \"Text to Append\": {\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"dependentValues\": [\n+                                            \"Surround\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Replacement Strategy\",\n+                                        \"propertyName\": \"Replacement Strategy\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"If set to true, when named groups are present in the regular expression, the name of the group will be used in the attribute name as opposed to the group index.  All capturing groups must be named, if the number of groups (not including capture group 0) does not equal the number of named groups validation will fail.\",\n-                                \"displayName\": \"Enable named group support\",\n+                                \"description\": \"The text to append to the end of the FlowFile, or each line, depending on teh configured value of the Evaluation Mode property\",\n+                                \"displayName\": \"Text to Append\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"extract-text-enable-named-groups\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Text to Append\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"extract-text-enable-repeating-capture-group\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n+                            \"Text to Prepend\": {\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"dependentValues\": [\n+                                            \"Surround\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Replacement Strategy\",\n+                                        \"propertyName\": \"Replacement Strategy\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"If set to true, every string matching the capture groups will be extracted. Otherwise, if the Regular Expression matches more than once, only the first match will be extracted.\",\n-                                \"displayName\": \"Enable repeating capture group\",\n+                                \"description\": \"The text to prepend to the start of the FlowFile, or each line, depending on teh configured value of the Evaluation Mode property\",\n+                                \"displayName\": \"Text to Prepend\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"extract-text-enable-repeating-capture-group\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Text to Prepend\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             }\n                         },\n                         \"sideEffectFree\": true,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"FlowFiles are routed to this relationship when no provided Regular Expression matches the content of the FlowFile\",\n-                                \"name\": \"unmatched\"\n+                                \"description\": \"FlowFiles that have been successfully processed are routed to this relationship. This includes both FlowFiles that had text replaced and those that did not.\",\n+                                \"name\": \"success\"\n                             },\n                             {\n-                                \"description\": \"FlowFiles are routed to this relationship when the Regular Expression is successfully evaluated and the FlowFile is modified as a result\",\n-                                \"name\": \"matched\"\n+                                \"description\": \"FlowFiles that could not be updated are routed to this relationship\",\n+                                \"name\": \"failure\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\",\n                             \"EVENT_DRIVEN\"\n                         ],\n                         \"supportsBatching\": true,\n-                        \"supportsDynamicProperties\": true,\n+                        \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsEventDriven\": true,\n                         \"supportsSensitiveDynamicProperties\": false,\n+                        \"systemResourceConsiderations\": [\n+                            {\n+                                \"description\": \"An instance of this component can cause high usage of this system resource.  Multiple instances or high concurrency settings may result a degradation of performance.\",\n+                                \"resource\": \"MEMORY\"\n+                            }\n+                        ],\n                         \"tags\": [\n+                            \"Change\",\n+                            \"Modify\",\n+                            \"Regex\",\n                             \"Regular Expression\",\n+                            \"Replace\",\n                             \"Text\",\n-                            \"evaluate\",\n-                            \"extract\",\n-                            \"regex\"\n+                            \"Update\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.standard.ExtractText\",\n-                        \"typeDescription\": \"Evaluates one or more Regular Expressions against the content of a FlowFile.  The results of those Regular Expressions are assigned to FlowFile Attributes.  Regular Expressions are entered by adding user-defined properties; the name of the property maps to the Attribute Name into which the result will be placed.  The attributes are generated differently based on the enabling of named capture groups.  If named capture groups are not enabled:  The first capture group, if any found, will be placed into that attribute name.But all capture groups, including the matching string sequence itself will also be provided at that attribute name with an index value provided, with the exception of a capturing group that is optional and does not match - for example, given the attribute name \\\"regex\\\" and expression \\\"abc(def)?(g)\\\" we would add an attribute \\\"regex.1\\\" with a value of \\\"def\\\" if the \\\"def\\\" matched. If the \\\"def\\\" did not match, no attribute named \\\"regex.1\\\" would be added but an attribute named \\\"regex.2\\\" with a value of \\\"g\\\" will be added regardless.If named capture groups are enabled:  Each named capture group, if found will be placed into the attributes name with the name provided.  If enabled the matching string sequence itself will be placed into the attribute name.  If multiple matches are enabled, and index will be applied after the first set of matches. The exception is a capturing group that is optional and does not match  For example, given the attribute name \\\"regex\\\" and expression \\\"abc(?<NAMED>def)?(?<NAMED-TWO>g)\\\"  we would add an attribute \\\"regex.NAMED\\\" with the value of \\\"def\\\" if the \\\"def\\\" matched.  We would   add an attribute \\\"regex.NAMED-TWO\\\" with the value of \\\"g\\\" if the \\\"g\\\" matched regardless.  The value of the property must be a valid Regular Expressions with one or more capturing groups. If named capture groups are enabled, all capture groups must be named.  If they are not, then the  processor configuration will fail validation.  If the Regular Expression matches more than once, only the first match will be used unless the property enabling repeating capture group is set to true. If any provided Regular Expression matches, the FlowFile(s) will be routed to 'matched'. If no provided Regular Expression matches, the FlowFile will be routed to 'unmatched' and no attributes will be applied to the FlowFile.\",\n+                        \"type\": \"org.apache.nifi.processors.standard.ReplaceText\",\n+                        \"typeDescription\": \"Updates the content of a FlowFile by searching for some textual value in the FlowFile content (via Regular Expression/regex, or literal value) and replacing the section of the content that matches with some alternate value. It can also be used to append or prepend text to the contents of a FlowFile.\",\n                         \"version\": \"1.27.0\"\n                     },\n                     {\n                         \"additionalDetails\": false,\n                         \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n@@ -101496,122 +101780,123 @@\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Cache Entry Identifier\": {\n-                                \"defaultValue\": \"${hash.value}\",\n-                                \"description\": \"A comma-delimited list of FlowFile attributes, or the results of Attribute Expression Language statements, which will be evaluated against a FlowFile in order to determine the value(s) used to identify duplicates; it is these values that are cached. NOTE: Only a single Cache Entry Identifier is allowed unless Put Cache Value In Attribute is specified. Multiple cache lookups are only supported when the destination is a set of attributes (see the documentation for 'Put Cache Value In Attribute' for more details including naming convention.\",\n-                                \"displayName\": \"Cache Entry Identifier\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Cache Entry Identifier\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n                             \"Character Set\": {\n                                 \"defaultValue\": \"UTF-8\",\n-                                \"description\": \"The Character Set in which the cached value is encoded. This will only be used when routing to an attribute.\",\n+                                \"description\": \"The Character Set in which the file is encoded\",\n                                 \"displayName\": \"Character Set\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n                                 \"name\": \"Character Set\",\n-                                \"required\": false,\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Distributed Cache Service\": {\n-                                \"description\": \"The Controller Service that is used to get the cached values.\",\n-                                \"displayName\": \"Distributed Cache Service\",\n+                            \"Mapping File\": {\n+                                \"description\": \"The name of the file (including the full path) containing the Mappings.\",\n+                                \"displayName\": \"Mapping File\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Distributed Cache Service\",\n+                                \"name\": \"Mapping File\",\n                                 \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.distributed.cache.client.DistributedMapCacheClient\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"SINGLE\",\n+                                    \"resourceTypes\": [\n+                                        \"FILE\"\n+                                    ]\n+                                },\n+                                \"sensitive\": false\n                             },\n-                            \"Max Length To Put In Attribute\": {\n-                                \"defaultValue\": \"256\",\n-                                \"description\": \"If routing the cache value to an attribute of the FlowFile (by setting the \\\"Put Cache Value in attribute\\\" property), the number of characters put to the attribute value will be at most this amount. This is important because attributes are held in memory and large attributes will quickly cause out of memory issues. If the output goes longer than this value, it will be truncated to fit. Consider making this smaller if able.\",\n-                                \"displayName\": \"Max Length To Put In Attribute\",\n+                            \"Mapping File Refresh Interval\": {\n+                                \"defaultValue\": \"60s\",\n+                                \"description\": \"The polling interval to check for updates to the mapping file. The default is 60s.\",\n+                                \"displayName\": \"Mapping File Refresh Interval\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Max Length To Put In Attribute\",\n-                                \"required\": false,\n+                                \"name\": \"Mapping File Refresh Interval\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Put Cache Value In Attribute\": {\n-                                \"description\": \"If set, the cache value received will be put into an attribute of the FlowFile instead of a the content of theFlowFile. The attribute key to put to is determined by evaluating value of this property. If multiple Cache Entry Identifiers are selected, multiple attributes will be written, using the evaluated value of this property, appended by a period (.) and the name of the cache entry identifier.\",\n-                                \"displayName\": \"Put Cache Value In Attribute\",\n+                            \"Matching Group\": {\n+                                \"defaultValue\": \"0\",\n+                                \"description\": \"The number of the matching group of the provided regex to replace with the corresponding value from the mapping file (if it exists).\",\n+                                \"displayName\": \"Matching Group\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Matching Group\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Maximum Buffer Size\": {\n+                                \"defaultValue\": \"1 MB\",\n+                                \"description\": \"Specifies the maximum amount of data to buffer (per file) in order to apply the regular expressions. If a FlowFile is larger than this value, the FlowFile will be routed to 'failure'\",\n+                                \"displayName\": \"Maximum Buffer Size\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Maximum Buffer Size\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Regular Expression\": {\n+                                \"defaultValue\": \"\\\\S+\",\n+                                \"description\": \"The Regular Expression to search for in the FlowFile content\",\n+                                \"displayName\": \"Regular Expression\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Put Cache Value In Attribute\",\n-                                \"required\": false,\n+                                \"name\": \"Regular Expression\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             }\n                         },\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.distributed.cache.client.DistributedMapCacheClientService\",\n-                            \"org.apache.nifi.distributed.cache.server.map.DistributedMapCacheServer\",\n-                            \"org.apache.nifi.processors.standard.PutDistributedMapCache\"\n-                        ],\n-                        \"sideEffectFree\": false,\n+                        \"sideEffectFree\": true,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"If the cache was successfully communicated with it will be routed to this relationship\",\n+                                \"description\": \"FlowFiles that have been successfully updated are routed to this relationship, as well as FlowFiles whose content does not match the given Regular Expression\",\n                                 \"name\": \"success\"\n                             },\n                             {\n-                                \"description\": \"If unable to communicate with the cache or if the cache entry is evaluated to be blank, the FlowFile will be penalized and routed to this relationship\",\n+                                \"description\": \"FlowFiles that could not be updated are routed to this relationship\",\n                                 \"name\": \"failure\"\n-                            },\n-                            {\n-                                \"description\": \"If a FlowFile's Cache Entry Identifier was not found in the cache, it will be routed to this relationship\",\n-                                \"name\": \"not-found\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\",\n                             \"EVENT_DRIVEN\"\n                         ],\n                         \"supportsBatching\": true,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsEventDriven\": true,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"cache\",\n-                            \"distributed\",\n-                            \"fetch\",\n-                            \"map\"\n+                            \"Change\",\n+                            \"Mapping\",\n+                            \"Modify\",\n+                            \"Regex\",\n+                            \"Regular Expression\",\n+                            \"Replace\",\n+                            \"Text\",\n+                            \"Update\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.standard.FetchDistributedMapCache\",\n-                        \"typeDescription\": \"Computes cache key(s) from FlowFile attributes, for each incoming FlowFile, and fetches the value(s) from the Distributed Map Cache associated with each key. If configured without a destination attribute, the incoming FlowFile's content is replaced with the binary data received by the Distributed Map Cache. If there is no value stored under that key then the flow file will be routed to 'not-found'. Note that the processor will always attempt to read the entire cached value into memory before placing it in it's destination. This could be potentially problematic if the cached value is very large.\",\n-                        \"version\": \"1.27.0\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"If the 'Put Cache Value In Attribute' property is set then whatever it is set to will become the attribute key and the value would be whatever the response was from the Distributed Map Cache. If multiple cache entry identifiers are selected, multiple attributes will be written, using the evaluated value of this property, appended by a period (.) and the name of the cache entry identifier. For example, if the Cache Entry Identifier property is set to 'id,name', and the user-defined property is named 'fetched', then two attributes will be written, fetched.id and fetched.name, containing their respective values.\",\n-                                \"name\": \"user-defined\"\n-                            }\n-                        ]\n+                        \"type\": \"org.apache.nifi.processors.standard.ReplaceTextWithMapping\",\n+                        \"typeDescription\": \"Updates the content of a FlowFile by evaluating a Regular Expression against it and replacing the section of the content that matches the Regular Expression with some alternate value provided in a mapping file.\",\n+                        \"version\": \"1.27.0\"\n                     },\n                     {\n                         \"additionalDetails\": false,\n                         \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n@@ -101623,1410 +101908,1353 @@\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n+                        \"dynamicProperties\": [\n+                            {\n+                                \"description\": \"One or more dynamic properties can be used to add attributes to FlowFiles passed to the 'retries_exceeded' relationship\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"name\": \"Exceeded FlowFile Attribute Key\",\n+                                \"value\": \"The value of the attribute added to the FlowFile\"\n+                            }\n+                        ],\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Completion Strategy\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"Leave the file as-is\",\n-                                        \"displayName\": \"None\",\n-                                        \"value\": \"None\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Move the file to the directory specified by the <Move Destination Directory> property\",\n-                                        \"displayName\": \"Move File\",\n-                                        \"value\": \"Move File\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Deletes the original file from the remote system\",\n-                                        \"displayName\": \"Delete File\",\n-                                        \"value\": \"Delete File\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"None\",\n-                                \"description\": \"Specifies what to do with the original file on the server once it has been pulled into NiFi. If the Completion Strategy fails, a warning will be logged but the data will still be transferred.\",\n-                                \"displayName\": \"Completion Strategy\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Completion Strategy\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Connection Mode\": {\n+                            \"Fail on Non-numerical Overwrite\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"Active\",\n-                                        \"value\": \"Active\"\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"Passive\",\n-                                        \"value\": \"Passive\"\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"Passive\",\n-                                \"description\": \"The FTP Connection Mode\",\n-                                \"displayName\": \"Connection Mode\",\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"If the FlowFile already has the attribute defined in 'Retry Attribute' that is *not* a number, fail the FlowFile instead of resetting that value to '1'\",\n+                                \"displayName\": \"Fail on Non-numerical Overwrite\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Connection Mode\",\n-                                \"required\": false,\n+                                \"name\": \"Fail on Non-numerical Overwrite\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Connection Timeout\": {\n-                                \"defaultValue\": \"30 sec\",\n-                                \"description\": \"Amount of time to wait before timing out while creating a connection\",\n-                                \"displayName\": \"Connection Timeout\",\n+                            \"maximum-retries\": {\n+                                \"defaultValue\": \"3\",\n+                                \"description\": \"The maximum number of times a FlowFile can be retried before being passed to the 'retries_exceeded' relationship\",\n+                                \"displayName\": \"Maximum Retries\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Connection Timeout\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"maximum-retries\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Create Directory\": {\n+                            \"penalize-retries\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"true\",\n                                         \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"false\",\n                                         \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"Used when 'Completion Strategy' is 'Move File'. Specifies whether or not the remote directory should be created if it does not exist.\",\n-                                \"displayName\": \"Create Directory\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Create Directory\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Data Timeout\": {\n-                                \"defaultValue\": \"30 sec\",\n-                                \"description\": \"When transferring a file between the local and remote system, this value specifies how long is allowed to elapse without any data being transferred between systems\",\n-                                \"displayName\": \"Data Timeout\",\n+                                \"defaultValue\": \"true\",\n+                                \"description\": \"If set to 'true', this Processor will penalize input FlowFiles before passing them to the 'retry' relationship. This does not apply to the 'retries_exceeded' relationship.\",\n+                                \"displayName\": \"Penalize Retries\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Data Timeout\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Hostname\": {\n-                                \"description\": \"The fully-qualified hostname or IP address of the host to fetch the data from\",\n-                                \"displayName\": \"Hostname\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Hostname\",\n+                                \"name\": \"penalize-retries\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Http Proxy Password\": {\n-                                \"description\": \"Http Proxy Password\",\n-                                \"displayName\": \"Http Proxy Password\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Http Proxy Password\",\n-                                \"required\": false,\n-                                \"sensitive\": true\n-                            },\n-                            \"Http Proxy Username\": {\n-                                \"description\": \"Http Proxy Username\",\n-                                \"displayName\": \"Http Proxy Username\",\n+                            \"retry-attribute\": {\n+                                \"defaultValue\": \"flowfile.retries\",\n+                                \"description\": \"The name of the attribute that contains the current retry count for the FlowFile. WARNING: If the name matches an attribute already on the FlowFile that does not contain a numerical value, the processor will either overwrite that attribute with '1' or fail based on configuration.\",\n+                                \"displayName\": \"Retry Attribute\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Http Proxy Username\",\n-                                \"required\": false,\n+                                \"name\": \"retry-attribute\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Internal Buffer Size\": {\n-                                \"defaultValue\": \"16KB\",\n-                                \"description\": \"Set the internal buffer size for buffered data streams\",\n-                                \"displayName\": \"Internal Buffer Size\",\n+                            \"reuse-mode\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"If the RetryFlowFile's UUID does not match the FlowFile's retry UUID, fail the FlowFile regardless of current retry count\",\n+                                        \"displayName\": \"Fail on Reuse\",\n+                                        \"value\": \"fail\"\n+                                    },\n+                                    {\n+                                        \"description\": \"If the RetryFlowFile's UUID does not match the FlowFile's retry UUID, log a warning message before resetting the retry attribute and UUID for this instance\",\n+                                        \"displayName\": \"Warn on Reuse\",\n+                                        \"value\": \"warn\"\n+                                    },\n+                                    {\n+                                        \"description\": \"If the RetryFlowFile's UUID does not match the FlowFile's retry UUID, log a debug message before resetting the retry attribute and UUID for this instance\",\n+                                        \"displayName\": \"Reset Reuse\",\n+                                        \"value\": \"reset\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"fail\",\n+                                \"description\": \"Defines how the Processor behaves if the retry FlowFile has a different retry UUID than the instance that received the FlowFile. This generally means that the attribute was not reset after being successfully retried by a previous instance of this processor.\",\n+                                \"displayName\": \"Reuse Mode\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Internal Buffer Size\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Move Destination Directory\": {\n-                                \"description\": \"The directory on the remote server to move the original file to once it has been ingested into NiFi. This property is ignored unless the Completion Strategy is set to 'Move File'. The specified directory must already exist on the remote system if 'Create Directory' is disabled, or the rename will fail.\",\n-                                \"displayName\": \"Move Destination Directory\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Move Destination Directory\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Password\": {\n-                                \"description\": \"Password for the user account\",\n-                                \"displayName\": \"Password\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Password\",\n-                                \"required\": false,\n-                                \"sensitive\": true\n-                            },\n-                            \"Port\": {\n-                                \"defaultValue\": \"21\",\n-                                \"description\": \"The port to connect to on the remote host to fetch the data from\",\n-                                \"displayName\": \"Port\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Port\",\n+                                \"name\": \"reuse-mode\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n+                            }\n+                        },\n+                        \"readsAttributes\": [\n+                            {\n+                                \"description\": \"Will read the attribute or attribute expression language result as defined in 'Retry Attribute'\",\n+                                \"name\": \"Retry Attribute\"\n+                            }\n+                        ],\n+                        \"sideEffectFree\": true,\n+                        \"supportedRelationships\": [\n+                            {\n+                                \"description\": \"Input FlowFile has exceeded the configured maximum retry count, do not pass this relationship back to the input Processor to terminate the limited feedback loop.\",\n+                                \"name\": \"retries_exceeded\"\n                             },\n-                            \"Proxy Host\": {\n-                                \"description\": \"The fully qualified hostname or IP address of the proxy server\",\n-                                \"displayName\": \"Proxy Host\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Proxy Host\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n+                            {\n+                                \"description\": \"Input FlowFile has not exceeded the configured maximum retry count, pass this relationship back to the input Processor to create a limited feedback loop.\",\n+                                \"name\": \"retry\"\n                             },\n-                            \"Proxy Port\": {\n-                                \"description\": \"The port of the proxy server\",\n-                                \"displayName\": \"Proxy Port\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Proxy Port\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n+                            {\n+                                \"description\": \"The processor is configured such that a non-numerical value on 'Retry Attribute' results in a failure instead of resetting that value to '1'. This will immediately terminate the limited feedback loop. Might also include when 'Maximum Retries' contains attribute expression language that does not resolve to an Integer.\",\n+                                \"name\": \"failure\"\n+                            }\n+                        ],\n+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\"\n+                        ],\n+                        \"supportsBatching\": true,\n+                        \"supportsDynamicProperties\": true,\n+                        \"supportsDynamicRelationships\": false,\n+                        \"supportsEventDriven\": false,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"FlowFile\",\n+                            \"Retry\"\n+                        ],\n+                        \"triggerSerially\": false,\n+                        \"triggerWhenAnyDestinationAvailable\": false,\n+                        \"triggerWhenEmpty\": false,\n+                        \"type\": \"org.apache.nifi.processors.standard.RetryFlowFile\",\n+                        \"typeDescription\": \"FlowFiles passed to this Processor have a 'Retry Attribute' value checked against a configured 'Maximum Retries' value. If the current attribute value is below the configured maximum, the FlowFile is passed to a retry relationship. The FlowFile may or may not be penalized in that condition. If the FlowFile's attribute value exceeds the configured maximum, the FlowFile will be passed to a 'retries_exceeded' relationship. WARNING: If the incoming FlowFile has a non-numeric value in the configured 'Retry Attribute' attribute, it will be reset to '1'. You may choose to fail the FlowFile instead of performing the reset. Additional dynamic properties can be defined for any attributes you wish to add to the FlowFiles transferred to 'retries_exceeded'. These attributes support attribute expression language.\",\n+                        \"version\": \"1.27.0\",\n+                        \"writesAttributes\": [\n+                            {\n+                                \"description\": \"User defined retry attribute is updated with the current retry count\",\n+                                \"name\": \"Retry Attribute\"\n                             },\n-                            \"Proxy Type\": {\n+                            {\n+                                \"description\": \"User defined retry attribute with .uuid that determines what processor retried the FlowFile last\",\n+                                \"name\": \"Retry Attribute .uuid\"\n+                            }\n+                        ]\n+                    },\n+                    {\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-standard-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"e0c4461\"\n+                        },\n+                        \"defaultBulletinLevel\": \"WARN\",\n+                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": 1,\n+                            \"EVENT_DRIVEN\": 0,\n+                            \"TIMER_DRIVEN\": 1\n+                        },\n+                        \"defaultPenaltyDuration\": \"30 sec\",\n+                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": \"* * * * * ?\",\n+                            \"TIMER_DRIVEN\": \"0 sec\"\n+                        },\n+                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n+                        \"defaultYieldDuration\": \"1 sec\",\n+                        \"dynamicProperties\": [\n+                            {\n+                                \"description\": \"Routes FlowFiles whose attributes match the Attribute Expression Language specified in the Dynamic Property Value to the Relationship specified in the Dynamic Property Key\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"name\": \"Relationship Name\",\n+                                \"value\": \"Attribute Expression Language\"\n+                            }\n+                        ],\n+                        \"dynamicRelationship\": {\n+                            \"description\": \"FlowFiles that match the Dynamic Property's Attribute Expression Language\",\n+                            \"name\": \"Name from Dynamic Property\"\n+                        },\n+                        \"group\": \"org.apache.nifi\",\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n+                        \"primaryNodeOnly\": false,\n+                        \"propertyDescriptors\": {\n+                            \"Routing Strategy\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"DIRECT\",\n-                                        \"value\": \"DIRECT\"\n+                                        \"description\": \"A copy of the FlowFile will be routed to each relationship whose corresponding expression evaluates to 'true'\",\n+                                        \"displayName\": \"Route to Property name\",\n+                                        \"value\": \"Route to Property name\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"HTTP\",\n-                                        \"value\": \"HTTP\"\n+                                        \"description\": \"Requires that all user-defined expressions evaluate to 'true' for the FlowFile to be considered a match\",\n+                                        \"displayName\": \"Route to 'matched' if all match\",\n+                                        \"value\": \"Route to 'match' if all match\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"SOCKS\",\n-                                        \"value\": \"SOCKS\"\n+                                        \"description\": \"Requires that at least one user-defined expression evaluate to 'true' for the FlowFile to be considered a match\",\n+                                        \"displayName\": \"Route to 'matched' if any matches\",\n+                                        \"value\": \"Route to 'match' if any matches\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"DIRECT\",\n-                                \"description\": \"Proxy type used for file transfers\",\n-                                \"displayName\": \"Proxy Type\",\n+                                \"defaultValue\": \"Route to Property name\",\n+                                \"description\": \"Specifies how to determine which relationship to use when evaluating the Expression Language\",\n+                                \"displayName\": \"Routing Strategy\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Proxy Type\",\n-                                \"required\": false,\n+                                \"name\": \"Routing Strategy\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            }\n+                        },\n+                        \"sideEffectFree\": true,\n+                        \"supportedRelationships\": [\n+                            {\n+                                \"description\": \"FlowFiles that do not match any user-define expression will be routed here\",\n+                                \"name\": \"unmatched\"\n+                            }\n+                        ],\n+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\",\n+                            \"EVENT_DRIVEN\"\n+                        ],\n+                        \"supportsBatching\": true,\n+                        \"supportsDynamicProperties\": true,\n+                        \"supportsDynamicRelationships\": true,\n+                        \"supportsEventDriven\": true,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"Attribute Expression Language\",\n+                            \"Expression Language\",\n+                            \"Regular Expression\",\n+                            \"attributes\",\n+                            \"detect\",\n+                            \"filter\",\n+                            \"find\",\n+                            \"regex\",\n+                            \"regexp\",\n+                            \"routing\",\n+                            \"search\",\n+                            \"string\",\n+                            \"text\"\n+                        ],\n+                        \"triggerSerially\": false,\n+                        \"triggerWhenAnyDestinationAvailable\": false,\n+                        \"triggerWhenEmpty\": false,\n+                        \"type\": \"org.apache.nifi.processors.standard.RouteOnAttribute\",\n+                        \"typeDescription\": \"Routes FlowFiles based on their Attributes using the Attribute Expression Language\",\n+                        \"version\": \"1.27.0\",\n+                        \"writesAttributes\": [\n+                            {\n+                                \"description\": \"The relation to which the FlowFile was routed\",\n+                                \"name\": \"RouteOnAttribute.Route\"\n+                            }\n+                        ]\n+                    },\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-standard-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"e0c4461\"\n+                        },\n+                        \"defaultBulletinLevel\": \"WARN\",\n+                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": 1,\n+                            \"EVENT_DRIVEN\": 0,\n+                            \"TIMER_DRIVEN\": 1\n+                        },\n+                        \"defaultPenaltyDuration\": \"30 sec\",\n+                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": \"* * * * * ?\",\n+                            \"TIMER_DRIVEN\": \"0 sec\"\n+                        },\n+                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n+                        \"defaultYieldDuration\": \"1 sec\",\n+                        \"dynamicProperties\": [\n+                            {\n+                                \"description\": \"Routes FlowFiles whose content matches the regular expression defined by Dynamic Property's value to the Relationship defined by the Dynamic Property's key\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"name\": \"Relationship Name\",\n+                                \"value\": \"A Regular Expression\"\n+                            }\n+                        ],\n+                        \"dynamicRelationship\": {\n+                            \"description\": \"FlowFiles that match the Dynamic Property's Regular Expression\",\n+                            \"name\": \"Name from Dynamic Property\"\n+                        },\n+                        \"group\": \"org.apache.nifi\",\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n+                        \"primaryNodeOnly\": false,\n+                        \"propertyDescriptors\": {\n+                            \"Character Set\": {\n+                                \"defaultValue\": \"UTF-8\",\n+                                \"description\": \"The Character Set in which the file is encoded\",\n+                                \"displayName\": \"Character Set\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Character Set\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Remote File\": {\n-                                \"description\": \"The fully qualified filename on the remote system\",\n-                                \"displayName\": \"Remote File\",\n+                            \"Content Buffer Size\": {\n+                                \"defaultValue\": \"1 MB\",\n+                                \"description\": \"Specifies the maximum amount of data to buffer in order to apply the regular expressions. If the size of the FlowFile exceeds this value, any amount of this value will be ignored\",\n+                                \"displayName\": \"Content Buffer Size\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Remote File\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Content Buffer Size\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Transfer Mode\": {\n+                            \"Match Requirement\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"Binary\",\n-                                        \"value\": \"Binary\"\n+                                        \"displayName\": \"content must match exactly\",\n+                                        \"value\": \"content must match exactly\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"ASCII\",\n-                                        \"value\": \"ASCII\"\n+                                        \"displayName\": \"content must contain match\",\n+                                        \"value\": \"content must contain match\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"Binary\",\n-                                \"description\": \"The FTP Transfer Mode\",\n-                                \"displayName\": \"Transfer Mode\",\n+                                \"defaultValue\": \"content must match exactly\",\n+                                \"description\": \"Specifies whether the entire content of the file must match the regular expression exactly, or if any part of the file (up to Content Buffer Size) can contain the regular expression in order to be considered a match\",\n+                                \"displayName\": \"Match Requirement\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Transfer Mode\",\n+                                \"name\": \"Match Requirement\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            }\n+                        },\n+                        \"sideEffectFree\": true,\n+                        \"supportedRelationships\": [\n+                            {\n+                                \"description\": \"FlowFiles that do not match any of the user-supplied regular expressions will be routed to this relationship\",\n+                                \"name\": \"unmatched\"\n+                            }\n+                        ],\n+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\",\n+                            \"EVENT_DRIVEN\"\n+                        ],\n+                        \"supportsBatching\": true,\n+                        \"supportsDynamicProperties\": true,\n+                        \"supportsDynamicRelationships\": true,\n+                        \"supportsEventDriven\": true,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"content\",\n+                            \"detect\",\n+                            \"filter\",\n+                            \"find\",\n+                            \"regex\",\n+                            \"regexp\",\n+                            \"regular expression\",\n+                            \"route\",\n+                            \"search\",\n+                            \"string\",\n+                            \"text\"\n+                        ],\n+                        \"triggerSerially\": false,\n+                        \"triggerWhenAnyDestinationAvailable\": false,\n+                        \"triggerWhenEmpty\": false,\n+                        \"type\": \"org.apache.nifi.processors.standard.RouteOnContent\",\n+                        \"typeDescription\": \"Applies Regular Expressions to the content of a FlowFile and routes a copy of the FlowFile to each destination whose Regular Expression matches. Regular Expressions are added as User-Defined Properties where the name of the property is the name of the relationship and the value is a Regular Expression to match against the FlowFile content. User-Defined properties do support the Attribute Expression Language, but the results are interpreted as literal values, not Regular Expressions\",\n+                        \"version\": \"1.27.0\"\n+                    },\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-standard-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"e0c4461\"\n+                        },\n+                        \"defaultBulletinLevel\": \"WARN\",\n+                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": 1,\n+                            \"EVENT_DRIVEN\": 0,\n+                            \"TIMER_DRIVEN\": 1\n+                        },\n+                        \"defaultPenaltyDuration\": \"30 sec\",\n+                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": \"* * * * * ?\",\n+                            \"TIMER_DRIVEN\": \"0 sec\"\n+                        },\n+                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n+                        \"defaultYieldDuration\": \"1 sec\",\n+                        \"dynamicProperties\": [\n+                            {\n+                                \"description\": \"Routes data that matches the value specified in the Dynamic Property Value to the Relationship specified in the Dynamic Property Key.\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"name\": \"Relationship Name\",\n+                                \"value\": \"value to match against\"\n+                            }\n+                        ],\n+                        \"dynamicRelationship\": {\n+                            \"description\": \"FlowFiles that match the Dynamic Property's value\",\n+                            \"name\": \"Name from Dynamic Property\"\n+                        },\n+                        \"group\": \"org.apache.nifi\",\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n+                        \"primaryNodeOnly\": false,\n+                        \"propertyDescriptors\": {\n+                            \"Character Set\": {\n+                                \"defaultValue\": \"UTF-8\",\n+                                \"description\": \"The Character Set in which the incoming text is encoded\",\n+                                \"displayName\": \"Character Set\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Character Set\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Grouping Regular Expression\": {\n+                                \"description\": \"Specifies a Regular Expression to evaluate against each line to determine which Group the line should be placed in. The Regular Expression must have at least one Capturing Group that defines the line's Group. If multiple Capturing Groups exist in the Regular Expression, the values from all Capturing Groups will be concatenated together. Two lines will not be placed into the same FlowFile unless they both have the same value for the Group (or neither line matches the Regular Expression). For example, to group together all lines in a CSV File by the first column, we can set this value to \\\"(.*?),.*\\\". Two lines that have the same Group but different Relationships will never be placed into the same FlowFile.\",\n+                                \"displayName\": \"Grouping Regular Expression\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Grouping Regular Expression\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Use Compression\": {\n+                            \"Ignore Case\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"true\",\n                                         \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"false\",\n                                         \"value\": \"false\"\n                                     }\n                                 ],\n                                 \"defaultValue\": \"false\",\n-                                \"description\": \"Indicates whether or not ZLIB compression should be used when transferring files\",\n-                                \"displayName\": \"Use Compression\",\n+                                \"description\": \"If true, capitalization will not be taken into account when comparing values. E.g., matching against 'HELLO' or 'hello' will have the same result. This property is ignored if the 'Matching Strategy' is set to 'Satisfies Expression'.\",\n+                                \"displayName\": \"Ignore Case\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Use Compression\",\n+                                \"name\": \"Ignore Case\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Username\": {\n-                                \"description\": \"Username\",\n-                                \"displayName\": \"Username\",\n+                            \"Ignore Leading/Trailing Whitespace\": {\n+                                \"defaultValue\": \"true\",\n+                                \"description\": \"Indicates whether or not the whitespace at the beginning and end of the lines should be ignored when evaluating the line.\",\n+                                \"displayName\": \"Ignore Leading/Trailing Whitespace\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Username\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Ignore Leading/Trailing Whitespace\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"fetchfiletransfer-notfound-loglevel\": {\n+                            \"Matching Strategy\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"TRACE\",\n-                                        \"value\": \"TRACE\"\n+                                        \"description\": \"Match lines based on whether or not the the text satisfies the given Expression Language expression. I.e., the line will match if the property value, evaluated as an Expression, returns true. The expression is able to reference FlowFile Attributes, as well as the variables 'line' (which is the text of the line to evaluate) and 'lineNo' (which is the line number being evaluated. This will be 1 for the first line, 2 for the second and so on).\",\n+                                        \"displayName\": \"Satisfies Expression\",\n+                                        \"value\": \"Satisfies Expression\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"DEBUG\",\n-                                        \"value\": \"DEBUG\"\n+                                        \"description\": \"Match lines based on whether the line starts with the property value\",\n+                                        \"displayName\": \"Starts With\",\n+                                        \"value\": \"Starts With\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"INFO\",\n-                                        \"value\": \"INFO\"\n+                                        \"description\": \"Match lines based on whether the line ends with the property value\",\n+                                        \"displayName\": \"Ends With\",\n+                                        \"value\": \"Ends With\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"WARN\",\n-                                        \"value\": \"WARN\"\n+                                        \"description\": \"Match lines based on whether the line contains the property value\",\n+                                        \"displayName\": \"Contains\",\n+                                        \"value\": \"Contains\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"ERROR\",\n-                                        \"value\": \"ERROR\"\n+                                        \"description\": \"Match lines based on whether the line equals the property value\",\n+                                        \"displayName\": \"Equals\",\n+                                        \"value\": \"Equals\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"FATAL\",\n-                                        \"value\": \"FATAL\"\n+                                        \"description\": \"Match lines based on whether the line exactly matches the Regular Expression that is provided as the Property value\",\n+                                        \"displayName\": \"Matches Regular Expression\",\n+                                        \"value\": \"Matches Regular Expression\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"NONE\",\n-                                        \"value\": \"NONE\"\n+                                        \"description\": \"Match lines based on whether the line contains some text that matches the Regular Expression that is provided as the Property value\",\n+                                        \"displayName\": \"Contains Regular Expression\",\n+                                        \"value\": \"Contains Regular Expression\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"ERROR\",\n-                                \"description\": \"Log level to use in case the file does not exist when the processor is triggered\",\n-                                \"displayName\": \"Log level when file not found\",\n+                                \"description\": \"Specifies how to evaluate each line of incoming text against the user-defined properties.\",\n+                                \"displayName\": \"Matching Strategy\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"fetchfiletransfer-notfound-loglevel\",\n+                                \"name\": \"Matching Strategy\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"ftp-use-utf8\": {\n+                            \"Routing Strategy\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"description\": \"Lines will be routed to each relationship whose corresponding expression evaluates to 'true'\",\n+                                        \"displayName\": \"Route to each matching Property Name\",\n+                                        \"value\": \"Route to each matching Property Name\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"description\": \"Requires that all user-defined expressions evaluate to 'true' for the line to be considered a match\",\n+                                        \"displayName\": \"Route to 'matched' if line matches all conditions\",\n+                                        \"value\": \"Route to 'matched' if line matches all conditions\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Requires that at least one user-defined expression evaluate to 'true' for the line to be considered a match\",\n+                                        \"displayName\": \"Route to 'matched' if lines matches any condition\",\n+                                        \"value\": \"Route to 'matched' if lines matches any condition\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"Tells the client to use UTF-8 encoding when processing files and filenames. If set to true, the server must also support UTF-8 encoding.\",\n-                                \"displayName\": \"Use UTF-8 Encoding\",\n+                                \"defaultValue\": \"Route to each matching Property Name\",\n+                                \"description\": \"Specifies how to determine which Relationship(s) to use when evaluating the lines of incoming text against the 'Matching Strategy' and user-defined properties.\",\n+                                \"displayName\": \"Routing Strategy\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"ftp-use-utf8\",\n+                                \"name\": \"Routing Strategy\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n-                            },\n-                            \"proxy-configuration-service\": {\n-                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests. If set, it supersedes proxy settings configured per component. Supported proxies: SOCKS + AuthN, HTTP + AuthN\",\n-                                \"displayName\": \"Proxy Configuration Service\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"proxy-configuration-service\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.proxy.ProxyConfigurationService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n                             }\n                         },\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.processors.standard.GetFTP\",\n-                            \"org.apache.nifi.processors.standard.GetSFTP\",\n-                            \"org.apache.nifi.processors.standard.PutFTP\",\n-                            \"org.apache.nifi.processors.standard.PutSFTP\"\n-                        ],\n-                        \"sideEffectFree\": false,\n+                        \"sideEffectFree\": true,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"All FlowFiles that are received are routed to success\",\n-                                \"name\": \"success\"\n-                            },\n-                            {\n-                                \"description\": \"Any FlowFile that could not be fetched from the remote server due to a communications failure will be transferred to this Relationship.\",\n-                                \"name\": \"comms.failure\"\n-                            },\n-                            {\n-                                \"description\": \"Any FlowFile for which we receive a 'Not Found' message from the remote server will be transferred to this Relationship.\",\n-                                \"name\": \"not.found\"\n+                                \"description\": \"The original input file will be routed to this destination when the lines have been successfully routed to 1 or more relationships\",\n+                                \"name\": \"original\"\n                             },\n                             {\n-                                \"description\": \"Any FlowFile that could not be fetched from the remote server due to insufficient permissions will be transferred to this Relationship.\",\n-                                \"name\": \"permission.denied\"\n+                                \"description\": \"Data that does not satisfy the required user-defined rules will be routed to this Relationship\",\n+                                \"name\": \"unmatched\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n+                            \"CRON_DRIVEN\",\n+                            \"EVENT_DRIVEN\"\n                         ],\n-                        \"supportsBatching\": false,\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": false,\n+                        \"supportsBatching\": true,\n+                        \"supportsDynamicProperties\": true,\n+                        \"supportsDynamicRelationships\": true,\n+                        \"supportsEventDriven\": true,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"fetch\",\n-                            \"files\",\n-                            \"ftp\",\n-                            \"get\",\n-                            \"ingest\",\n-                            \"input\",\n-                            \"remote\",\n-                            \"retrieve\",\n-                            \"source\"\n+                            \"Expression Language\",\n+                            \"Regular Expression\",\n+                            \"attributes\",\n+                            \"csv\",\n+                            \"delimited\",\n+                            \"detect\",\n+                            \"filter\",\n+                            \"find\",\n+                            \"logs\",\n+                            \"regex\",\n+                            \"regexp\",\n+                            \"routing\",\n+                            \"search\",\n+                            \"string\",\n+                            \"text\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.standard.FetchFTP\",\n-                        \"typeDescription\": \"Fetches the content of a file from a remote FTP server and overwrites the contents of an incoming FlowFile with the content of the remote file.\",\n+                        \"type\": \"org.apache.nifi.processors.standard.RouteText\",\n+                        \"typeDescription\": \"Routes textual data based on a set of user-defined rules. Each line in an incoming FlowFile is compared against the values specified by user-defined Properties. The mechanism by which the text is compared to these user-defined properties is defined by the 'Matching Strategy'. The data is then routed according to these rules, routing each line of the text individually.\",\n                         \"version\": \"1.27.0\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"The hostname or IP address from which the file was pulled\",\n-                                \"name\": \"ftp.remote.host\"\n-                            },\n-                            {\n-                                \"description\": \"The port that was used to communicate with the remote FTP server\",\n-                                \"name\": \"ftp.remote.port\"\n-                            },\n-                            {\n-                                \"description\": \"The name of the remote file that was pulled\",\n-                                \"name\": \"ftp.remote.filename\"\n-                            },\n-                            {\n-                                \"description\": \"The filename is updated to point to the filename fo the remote file\",\n-                                \"name\": \"filename\"\n-                            },\n-                            {\n-                                \"description\": \"If the Remote File contains a directory name, that directory name will be added to the FlowFile using the 'path' attribute\",\n-                                \"name\": \"path\"\n+                                \"description\": \"The name of the relationship to which the FlowFile was routed.\",\n+                                \"name\": \"RouteText.Route\"\n                             },\n                             {\n-                                \"description\": \"The name of the failure relationship applied when routing to any failure relationship\",\n-                                \"name\": \"fetch.failure.reason\"\n+                                \"description\": \"The value captured by all capturing groups in the 'Grouping Regular Expression' property. If this property is not set or contains no capturing groups, this attribute will not be added.\",\n+                                \"name\": \"RouteText.Group\"\n                             }\n                         ]\n                     },\n                     {\n-                        \"additionalDetails\": false,\n+                        \"additionalDetails\": true,\n                         \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n+                            \"EVENT_DRIVEN\": 0,\n                             \"TIMER_DRIVEN\": 1\n                         },\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n-                        \"explicitRestrictions\": [\n-                            {\n-                                \"explanation\": \"Provides operator the ability to read from any file that NiFi has access to.\",\n-                                \"requiredPermission\": \"read filesystem\"\n-                            },\n-                            {\n-                                \"explanation\": \"Provides operator the ability to delete any file that NiFi has access to.\",\n-                                \"requiredPermission\": \"write filesystem\"\n-                            }\n-                        ],\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Completion Strategy\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"Leave the file as-is\",\n-                                        \"displayName\": \"None\",\n-                                        \"value\": \"None\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Moves the file to the directory specified by the <Move Destination Directory> property\",\n-                                        \"displayName\": \"Move File\",\n-                                        \"value\": \"Move File\"\n-                                    },\n+                            \"record-reader\": {\n+                                \"description\": \"Specifies the Controller Service to use for parsing incoming data and determining the data's schema\",\n+                                \"displayName\": \"Record Reader\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"record-reader\",\n+                                \"required\": true,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"record-writer\": {\n+                                \"description\": \"Specifies the Controller Service to use for writing results to a FlowFile\",\n+                                \"displayName\": \"Record Writer\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"record-writer\",\n+                                \"required\": true,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"sample-record-interval\": {\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"Deletes the original file from the file system\",\n-                                        \"displayName\": \"Delete File\",\n-                                        \"value\": \"Delete File\"\n+                                        \"dependentValues\": [\n+                                            \"interval\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Sampling Strategy\",\n+                                        \"propertyName\": \"sample-record-sampling-strategy\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"None\",\n-                                \"description\": \"Specifies what to do with the original file on the file system once it has been pulled into NiFi\",\n-                                \"displayName\": \"Completion Strategy\",\n+                                \"description\": \"Specifies the number of records to skip before writing a record to the outgoing FlowFile. This property is only used if Sampling Strategy is set to Interval Sampling. A value of zero (0) will cause no records to be included in theoutgoing FlowFile, a value of one (1) will cause all records to be included, and a value of two (2) will cause half the records to be included, and so on.\",\n+                                \"displayName\": \"Sampling Interval\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Completion Strategy\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"sample-record-interval\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"File to Fetch\": {\n-                                \"defaultValue\": \"${absolute.path}/${filename}\",\n-                                \"description\": \"The fully-qualified filename of the file to fetch from the file system\",\n-                                \"displayName\": \"File to Fetch\",\n+                            \"sample-record-probability\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"probabilistic\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Sampling Strategy\",\n+                                        \"propertyName\": \"sample-record-sampling-strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"Specifies the probability (as a percent from 0-100) of a record being included in the outgoing FlowFile. This property is only used if Sampling Strategy is set to Probabilistic Sampling. A value of zero (0) will cause no records to be included in theoutgoing FlowFile, and a value of 100 will cause all records to be included in the outgoing FlowFile..\",\n+                                \"displayName\": \"Sampling Probability\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"File to Fetch\",\n+                                \"name\": \"sample-record-probability\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Log level when file not found\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"TRACE\",\n-                                        \"value\": \"TRACE\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"DEBUG\",\n-                                        \"value\": \"DEBUG\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"INFO\",\n-                                        \"value\": \"INFO\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"WARN\",\n-                                        \"value\": \"WARN\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"ERROR\",\n-                                        \"value\": \"ERROR\"\n-                                    },\n+                            \"sample-record-random-seed\": {\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"FATAL\",\n-                                        \"value\": \"FATAL\"\n-                                    },\n+                                        \"dependentValues\": [\n+                                            \"probabilistic\",\n+                                            \"reservoir\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Sampling Strategy\",\n+                                        \"propertyName\": \"sample-record-sampling-strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"Specifies a particular number to use as the seed for the random number generator (used by probabilistic strategies). Setting this property will ensure the same records are selected even when using probabilistic strategies.\",\n+                                \"displayName\": \"Random Seed\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"sample-record-random-seed\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"sample-record-range\": {\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"NONE\",\n-                                        \"value\": \"NONE\"\n+                                        \"dependentValues\": [\n+                                            \"range\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Sampling Strategy\",\n+                                        \"propertyName\": \"sample-record-sampling-strategy\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"ERROR\",\n-                                \"description\": \"Log level to use in case the file does not exist when the processor is triggered\",\n-                                \"displayName\": \"Log level when file not found\",\n+                                \"description\": \"Specifies the range of records to include in the sample, from 1 to the total number of records. An example is '3,6-8,20-' which includes the third record, the sixth, seventh and eighth records, and all records from the twentieth record on. Commas separate intervals that don't overlap, and an interval can be between two numbers (i.e. 6-8) or up to a given number (i.e. -5), or from a number to the number of the last record (i.e. 20-). If this property is unset, all records will be included.\",\n+                                \"displayName\": \"Sampling Range\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Log level when file not found\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"sample-record-range\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Log level when permission denied\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"TRACE\",\n-                                        \"value\": \"TRACE\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"DEBUG\",\n-                                        \"value\": \"DEBUG\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"INFO\",\n-                                        \"value\": \"INFO\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"WARN\",\n-                                        \"value\": \"WARN\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"ERROR\",\n-                                        \"value\": \"ERROR\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"FATAL\",\n-                                        \"value\": \"FATAL\"\n-                                    },\n+                            \"sample-record-reservoir\": {\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"NONE\",\n-                                        \"value\": \"NONE\"\n+                                        \"dependentValues\": [\n+                                            \"reservoir\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Sampling Strategy\",\n+                                        \"propertyName\": \"sample-record-sampling-strategy\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"ERROR\",\n-                                \"description\": \"Log level to use in case user pierre does not have sufficient permissions to read the file\",\n-                                \"displayName\": \"Log level when permission denied\",\n+                                \"description\": \"Specifies the number of records to write to the outgoing FlowFile. This property is only used if Sampling Strategy is set to reservoir-based strategies such as Reservoir Sampling.\",\n+                                \"displayName\": \"Reservoir Size\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Log level when permission denied\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"sample-record-reservoir\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Move Conflict Strategy\": {\n+                            \"sample-record-sampling-strategy\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"The existing destination file should remain intact. The newly ingested file should be moved to the destination directory but be renamed to a random filename\",\n-                                        \"displayName\": \"Rename\",\n-                                        \"value\": \"Rename\"\n+                                        \"description\": \"Selects every Nth record where N is the value of the 'Interval Value' property\",\n+                                        \"displayName\": \"Interval Sampling\",\n+                                        \"value\": \"interval\"\n                                     },\n                                     {\n-                                        \"description\": \"The newly ingested file should replace the existing file in the Destination Directory\",\n-                                        \"displayName\": \"Replace File\",\n-                                        \"value\": \"Replace File\"\n+                                        \"description\": \"Creates a sample of records based on the index (i.e. record number) of the records using the specified range. An example is '3,6-8,20-' which includes the third record, the sixth, seventh and eighth record, and all records from the twentieth record on. Commas separate intervals that don't overlap, and an interval can be between two numbers (i.e. 6-8) or up to a given number (i.e. -5), or from a number to the number of the last record (i.e. 20-).\",\n+                                        \"displayName\": \"Range Sampling\",\n+                                        \"value\": \"range\"\n                                     },\n                                     {\n-                                        \"description\": \"The existing file should in the Destination Directory should stay intact and the newly ingested file should be deleted\",\n-                                        \"displayName\": \"Keep Existing\",\n-                                        \"value\": \"Keep Existing\"\n+                                        \"description\": \"Selects each record with probability P where P is the value of the 'Selection Probability' property\",\n+                                        \"displayName\": \"Probabilistic Sampling\",\n+                                        \"value\": \"probabilistic\"\n                                     },\n                                     {\n-                                        \"description\": \"The existing destination file should remain intact and the incoming FlowFile should be routed to failure\",\n-                                        \"displayName\": \"Fail\",\n-                                        \"value\": \"Fail\"\n+                                        \"description\": \"Creates a sample of K records where each record has equal probability of being included, where K is the value of the 'Reservoir Size' property. Note that if the value is very large it may cause memory issues as the reservoir is kept in-memory.\",\n+                                        \"displayName\": \"Reservoir Sampling\",\n+                                        \"value\": \"reservoir\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"Rename\",\n-                                \"description\": \"If Completion Strategy is set to Move File and a file already exists in the destination directory with the same name, this property specifies how that naming conflict should be resolved\",\n-                                \"displayName\": \"Move Conflict Strategy\",\n+                                \"defaultValue\": \"reservoir\",\n+                                \"description\": \"Specifies which method to use for sampling records from the incoming FlowFile\",\n+                                \"displayName\": \"Sampling Strategy\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Move Conflict Strategy\",\n+                                \"name\": \"sample-record-sampling-strategy\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n-                            },\n-                            \"Move Destination Directory\": {\n-                                \"description\": \"The directory to the move the original file to once it has been fetched from the file system. This property is ignored unless the Completion Strategy is set to \\\"Move File\\\". If the directory does not exist, it will be created.\",\n-                                \"displayName\": \"Move Destination Directory\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Move Destination Directory\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n                             }\n                         },\n-                        \"restricted\": true,\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.processors.standard.GetFile\",\n-                            \"org.apache.nifi.processors.standard.ListFile\",\n-                            \"org.apache.nifi.processors.standard.PutFile\"\n-                        ],\n-                        \"sideEffectFree\": false,\n+                        \"sideEffectFree\": true,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"Any FlowFile that is successfully fetched from the file system will be transferred to this Relationship.\",\n+                                \"description\": \"The FlowFile is routed to this relationship if the sampling completed successfully\",\n                                 \"name\": \"success\"\n                             },\n                             {\n-                                \"description\": \"Any FlowFile that could not be fetched from the file system because the file could not be found will be transferred to this Relationship.\",\n-                                \"name\": \"not.found\"\n-                            },\n-                            {\n-                                \"description\": \"Any FlowFile that could not be fetched from the file system due to the user running NiFi not having sufficient permissions will be transferred to this Relationship.\",\n-                                \"name\": \"permission.denied\"\n+                                \"description\": \"If a FlowFile fails processing for any reason (for example, any record is not valid), the original FlowFile will be routed to this relationship\",\n+                                \"name\": \"failure\"\n                             },\n                             {\n-                                \"description\": \"Any FlowFile that could not be fetched from the file system for any reason other than insufficient permissions or the file not existing will be transferred to this Relationship.\",\n-                                \"name\": \"failure\"\n+                                \"description\": \"The original FlowFile is routed to this relationship if sampling is successful\",\n+                                \"name\": \"original\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n+                            \"CRON_DRIVEN\",\n+                            \"EVENT_DRIVEN\"\n                         ],\n-                        \"supportsBatching\": false,\n+                        \"supportsBatching\": true,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": false,\n+                        \"supportsEventDriven\": true,\n                         \"supportsSensitiveDynamicProperties\": false,\n+                        \"systemResourceConsiderations\": [\n+                            {\n+                                \"description\": \"An instance of this component can cause high usage of this system resource.  Multiple instances or high concurrency settings may result a degradation of performance.\",\n+                                \"resource\": \"MEMORY\"\n+                            }\n+                        ],\n                         \"tags\": [\n-                            \"fetch\",\n-                            \"files\",\n-                            \"filesystem\",\n-                            \"get\",\n-                            \"ingest\",\n-                            \"ingress\",\n-                            \"input\",\n-                            \"local\",\n-                            \"source\"\n+                            \"interval\",\n+                            \"range\",\n+                            \"record\",\n+                            \"reservoir\",\n+                            \"sample\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.standard.FetchFile\",\n-                        \"typeDescription\": \"Reads the contents of a file from disk and streams it into the contents of an incoming FlowFile. Once this is done, the file is optionally moved elsewhere or deleted to help keep the file system organized.\",\n-                        \"version\": \"1.27.0\"\n+                        \"type\": \"org.apache.nifi.processors.standard.SampleRecord\",\n+                        \"typeDescription\": \"Samples the records of a FlowFile based on a specified sampling strategy (such as Reservoir Sampling). The resulting FlowFile may be of a fixed number of records (in the case of reservoir-based algorithms) or some subset of the total number of records (in the case of probabilistic sampling), or a deterministic number of records (in the case of interval sampling).\",\n+                        \"version\": \"1.27.0\",\n+                        \"writesAttributes\": [\n+                            {\n+                                \"description\": \"The MIME type indicated by the record writer\",\n+                                \"name\": \"mime.type\"\n+                            },\n+                            {\n+                                \"description\": \"The number of records in the resulting flow file\",\n+                                \"name\": \"record.count\"\n+                            }\n+                        ]\n                     },\n                     {\n                         \"additionalDetails\": false,\n                         \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n+                            \"EVENT_DRIVEN\": 0,\n                             \"TIMER_DRIVEN\": 1\n                         },\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Ciphers Allowed\": {\n-                                \"description\": \"A comma-separated list of Ciphers allowed for SFTP connections. Leave unset to allow all. Available options are: 3des-cbc, 3des-ctr, aes128-cbc, aes128-ctr, aes128-gcm@openssh.com, aes192-cbc, aes192-ctr, aes256-cbc, aes256-ctr, aes256-gcm@openssh.com, arcfour, arcfour128, arcfour256, blowfish-cbc, blowfish-ctr, cast128-cbc, cast128-ctr, chacha20-poly1305@openssh.com, idea-cbc, idea-ctr, serpent128-cbc, serpent128-ctr, serpent192-cbc, serpent192-ctr, serpent256-cbc, serpent256-ctr, twofish-cbc, twofish128-cbc, twofish128-ctr, twofish192-cbc, twofish192-ctr, twofish256-cbc, twofish256-ctr\",\n-                                \"displayName\": \"Ciphers Allowed\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Ciphers Allowed\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Completion Strategy\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"Leave the file as-is\",\n-                                        \"displayName\": \"None\",\n-                                        \"value\": \"None\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Move the file to the directory specified by the <Move Destination Directory> property\",\n-                                        \"displayName\": \"Move File\",\n-                                        \"value\": \"Move File\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Deletes the original file from the remote system\",\n-                                        \"displayName\": \"Delete File\",\n-                                        \"value\": \"Delete File\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"None\",\n-                                \"description\": \"Specifies what to do with the original file on the server once it has been pulled into NiFi. If the Completion Strategy fails, a warning will be logged but the data will still be transferred.\",\n-                                \"displayName\": \"Completion Strategy\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Completion Strategy\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Connection Timeout\": {\n-                                \"defaultValue\": \"30 sec\",\n-                                \"description\": \"Amount of time to wait before timing out while creating a connection\",\n-                                \"displayName\": \"Connection Timeout\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Connection Timeout\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Create Directory\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"Used when 'Completion Strategy' is 'Move File'. Specifies whether or not the remote directory should be created if it does not exist.\",\n-                                \"displayName\": \"Create Directory\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Create Directory\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Data Timeout\": {\n-                                \"defaultValue\": \"30 sec\",\n-                                \"description\": \"When transferring a file between the local and remote system, this value specifies how long is allowed to elapse without any data being transferred between systems\",\n-                                \"displayName\": \"Data Timeout\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Data Timeout\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Disable Directory Listing\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"Control how 'Move Destination Directory' is created when 'Completion Strategy' is 'Move File' and 'Create Directory' is enabled. If set to 'true', directory listing is not performed prior to create missing directories. By default, this processor executes a directory listing command to see target directory existence before creating missing directories. However, there are situations that you might need to disable the directory listing such as the following. Directory listing might fail with some permission setups (e.g. chmod 100) on a directory. Also, if any other SFTP client created the directory after this processor performed a listing and before a directory creation request by this processor is finished, then an error is returned because the directory already exists.\",\n-                                \"displayName\": \"Disable Directory Listing\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Disable Directory Listing\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Host Key File\": {\n-                                \"description\": \"If supplied, the given file will be used as the Host Key; otherwise, if 'Strict Host Key Checking' property is applied (set to true) then uses the 'known_hosts' and 'known_hosts2' files from ~/.ssh directory else no host key file will be used\",\n-                                \"displayName\": \"Host Key File\",\n+                            \"Attribute Pattern\": {\n+                                \"defaultValue\": \".*\",\n+                                \"description\": \"Regular Expression that specifies the names of attributes whose values will be matched against the terms in the dictionary\",\n+                                \"displayName\": \"Attribute Pattern\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Host Key File\",\n-                                \"required\": false,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"SINGLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\"\n-                                    ]\n-                                },\n-                                \"sensitive\": false\n-                            },\n-                            \"Hostname\": {\n-                                \"description\": \"The fully-qualified hostname or IP address of the host to fetch the data from\",\n-                                \"displayName\": \"Hostname\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Hostname\",\n+                                \"name\": \"Attribute Pattern\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Http Proxy Password\": {\n-                                \"description\": \"Http Proxy Password\",\n-                                \"displayName\": \"Http Proxy Password\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Http Proxy Password\",\n-                                \"required\": false,\n-                                \"sensitive\": true\n-                            },\n-                            \"Http Proxy Username\": {\n-                                \"description\": \"Http Proxy Username\",\n-                                \"displayName\": \"Http Proxy Username\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Http Proxy Username\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Key Algorithms Allowed\": {\n-                                \"description\": \"A comma-separated list of Key Algorithms allowed for SFTP connections. Leave unset to allow all. Available options are: ecdsa-sha2-nistp256, ecdsa-sha2-nistp256-cert-v01@openssh.com, ecdsa-sha2-nistp384, ecdsa-sha2-nistp384-cert-v01@openssh.com, ecdsa-sha2-nistp521, ecdsa-sha2-nistp521-cert-v01@openssh.com, rsa-sha2-256, rsa-sha2-512, ssh-dss, ssh-dss-cert-v01@openssh.com, ssh-ed25519, ssh-ed25519-cert-v01@openssh.com, ssh-rsa, ssh-rsa-cert-v01@openssh.com\",\n-                                \"displayName\": \"Key Algorithms Allowed\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Key Algorithms Allowed\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Key Exchange Algorithms Allowed\": {\n-                                \"description\": \"A comma-separated list of Key Exchange Algorithms allowed for SFTP connections. Leave unset to allow all. Available options are: curve25519-sha256, curve25519-sha256@libssh.org, diffie-hellman-group-exchange-sha1, diffie-hellman-group-exchange-sha256, diffie-hellman-group1-sha1, diffie-hellman-group14-sha1, diffie-hellman-group14-sha256, diffie-hellman-group14-sha256@ssh.com, diffie-hellman-group15-sha256, diffie-hellman-group15-sha256@ssh.com, diffie-hellman-group15-sha384@ssh.com, diffie-hellman-group15-sha512, diffie-hellman-group16-sha256, diffie-hellman-group16-sha384@ssh.com, diffie-hellman-group16-sha512, diffie-hellman-group16-sha512@ssh.com, diffie-hellman-group17-sha512, diffie-hellman-group18-sha512, diffie-hellman-group18-sha512@ssh.com, ecdh-sha2-nistp256, ecdh-sha2-nistp384, ecdh-sha2-nistp521, ext-info-c\",\n-                                \"displayName\": \"Key Exchange Algorithms Allowed\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Key Exchange Algorithms Allowed\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Message Authentication Codes Allowed\": {\n-                                \"description\": \"A comma-separated list of Message Authentication Codes allowed for SFTP connections. Leave unset to allow all. Available options are: hmac-md5, hmac-md5-96, hmac-md5-96-etm@openssh.com, hmac-md5-etm@openssh.com, hmac-ripemd160, hmac-ripemd160-96, hmac-ripemd160-etm@openssh.com, hmac-ripemd160@openssh.com, hmac-sha1, hmac-sha1-96, hmac-sha1-96@openssh.com, hmac-sha1-etm@openssh.com, hmac-sha2-256, hmac-sha2-256-etm@openssh.com, hmac-sha2-512, hmac-sha2-512-etm@openssh.com\",\n-                                \"displayName\": \"Message Authentication Codes Allowed\",\n+                            \"Dictionary File\": {\n+                                \"description\": \"A new-line-delimited text file that includes the terms that should trigger a match. Empty lines are ignored.  The contents of the text file are loaded into memory when the processor is scheduled and reloaded when the contents are modified.\",\n+                                \"displayName\": \"Dictionary File\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Message Authentication Codes Allowed\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Move Destination Directory\": {\n-                                \"description\": \"The directory on the remote server to move the original file to once it has been ingested into NiFi. This property is ignored unless the Completion Strategy is set to 'Move File'. The specified directory must already exist on the remote system if 'Create Directory' is disabled, or the rename will fail.\",\n-                                \"displayName\": \"Move Destination Directory\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Move Destination Directory\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Password\": {\n-                                \"description\": \"Password for the user account\",\n-                                \"displayName\": \"Password\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Password\",\n-                                \"required\": false,\n-                                \"sensitive\": true\n-                            },\n-                            \"Port\": {\n-                                \"defaultValue\": \"22\",\n-                                \"description\": \"The port to connect to on the remote host to fetch the data from\",\n-                                \"displayName\": \"Port\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Port\",\n+                                \"name\": \"Dictionary File\",\n                                 \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Private Key Passphrase\": {\n-                                \"description\": \"Password for the private key\",\n-                                \"displayName\": \"Private Key Passphrase\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Private Key Passphrase\",\n-                                \"required\": false,\n-                                \"sensitive\": true\n-                            },\n-                            \"Private Key Path\": {\n-                                \"description\": \"The fully qualified path to the Private Key file\",\n-                                \"displayName\": \"Private Key Path\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Private Key Path\",\n-                                \"required\": false,\n                                 \"resourceDefinition\": {\n                                     \"cardinality\": \"SINGLE\",\n                                     \"resourceTypes\": [\n                                         \"FILE\"\n                                     ]\n                                 },\n                                 \"sensitive\": false\n                             },\n-                            \"Proxy Host\": {\n-                                \"description\": \"The fully qualified hostname or IP address of the proxy server\",\n-                                \"displayName\": \"Proxy Host\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Proxy Host\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Proxy Port\": {\n-                                \"description\": \"The port of the proxy server\",\n-                                \"displayName\": \"Proxy Port\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Proxy Port\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Proxy Type\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"DIRECT\",\n-                                        \"value\": \"DIRECT\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"HTTP\",\n-                                        \"value\": \"HTTP\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"SOCKS\",\n-                                        \"value\": \"SOCKS\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"DIRECT\",\n-                                \"description\": \"Proxy type used for file transfers\",\n-                                \"displayName\": \"Proxy Type\",\n+                            \"Dictionary Filter Pattern\": {\n+                                \"description\": \"A Regular Expression that will be applied to each line in the dictionary file. If the regular expression does not match the line, the line will not be included in the list of terms to search for. If a Matching Group is specified, only the portion of the term that matches that Matching Group will be used instead of the entire term. If not specified, all terms in the dictionary will be used and each term will consist of the text of the entire line in the file\",\n+                                \"displayName\": \"Dictionary Filter Pattern\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Proxy Type\",\n+                                \"name\": \"Dictionary Filter Pattern\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Remote File\": {\n-                                \"description\": \"The fully qualified filename on the remote system\",\n-                                \"displayName\": \"Remote File\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Remote File\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Send Keep Alive On Timeout\": {\n+                            \"Match Criteria\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"displayName\": \"At Least 1 Must Match\",\n+                                        \"value\": \"At Least 1 Must Match\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"displayName\": \"All Must Match\",\n+                                        \"value\": \"All Must Match\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"true\",\n-                                \"description\": \"Send a Keep Alive message every 5 seconds up to 5 times for an overall timeout of 25 seconds.\",\n-                                \"displayName\": \"Send Keep Alive On Timeout\",\n+                                \"defaultValue\": \"At Least 1 Must Match\",\n+                                \"description\": \"If set to All Must Match, then FlowFiles will be routed to 'matched' only if all specified attributes' values are found in the dictionary. If set to At Least 1 Must Match, FlowFiles will be routed to 'matched' if any attribute specified is found in the dictionary\",\n+                                \"displayName\": \"Match Criteria\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Send Keep Alive On Timeout\",\n+                                \"name\": \"Match Criteria\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n+                            }\n+                        },\n+                        \"sideEffectFree\": true,\n+                        \"supportedRelationships\": [\n+                            {\n+                                \"description\": \"FlowFiles whose attributes are not found in the dictionary will be routed to this relationship\",\n+                                \"name\": \"unmatched\"\n                             },\n-                            \"Strict Host Key Checking\": {\n+                            {\n+                                \"description\": \"FlowFiles whose attributes are found in the dictionary will be routed to this relationship\",\n+                                \"name\": \"matched\"\n+                            }\n+                        ],\n+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\",\n+                            \"EVENT_DRIVEN\"\n+                        ],\n+                        \"supportsBatching\": true,\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicRelationships\": false,\n+                        \"supportsEventDriven\": true,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"attributes\",\n+                            \"find\",\n+                            \"lookup\",\n+                            \"scan\",\n+                            \"search\",\n+                            \"text\"\n+                        ],\n+                        \"triggerSerially\": false,\n+                        \"triggerWhenAnyDestinationAvailable\": false,\n+                        \"triggerWhenEmpty\": false,\n+                        \"type\": \"org.apache.nifi.processors.standard.ScanAttribute\",\n+                        \"typeDescription\": \"Scans the specified attributes of FlowFiles, checking to see if any of their values are present within the specified dictionary of terms\",\n+                        \"version\": \"1.27.0\"\n+                    },\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-standard-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"e0c4461\"\n+                        },\n+                        \"defaultBulletinLevel\": \"WARN\",\n+                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": 1,\n+                            \"EVENT_DRIVEN\": 0,\n+                            \"TIMER_DRIVEN\": 1\n+                        },\n+                        \"defaultPenaltyDuration\": \"30 sec\",\n+                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": \"* * * * * ?\",\n+                            \"TIMER_DRIVEN\": \"0 sec\"\n+                        },\n+                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n+                        \"defaultYieldDuration\": \"1 sec\",\n+                        \"group\": \"org.apache.nifi\",\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n+                        \"primaryNodeOnly\": false,\n+                        \"propertyDescriptors\": {\n+                            \"Dictionary Encoding\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"displayName\": \"text\",\n+                                        \"value\": \"text\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"displayName\": \"binary\",\n+                                        \"value\": \"binary\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"Indicates whether or not strict enforcement of hosts keys should be applied\",\n-                                \"displayName\": \"Strict Host Key Checking\",\n+                                \"defaultValue\": \"text\",\n+                                \"description\": \"Indicates how the dictionary is encoded. If 'text', dictionary terms are new-line delimited and UTF-8 encoded; if 'binary', dictionary terms are denoted by a 4-byte integer indicating the term length followed by the term itself\",\n+                                \"displayName\": \"Dictionary Encoding\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Strict Host Key Checking\",\n+                                \"name\": \"Dictionary Encoding\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Use Compression\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"Indicates whether or not ZLIB compression should be used when transferring files\",\n-                                \"displayName\": \"Use Compression\",\n+                            \"Dictionary File\": {\n+                                \"description\": \"The filename of the terms dictionary\",\n+                                \"displayName\": \"Dictionary File\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Use Compression\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Username\": {\n-                                \"description\": \"Username\",\n-                                \"displayName\": \"Username\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Username\",\n+                                \"name\": \"Dictionary File\",\n                                 \"required\": true,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"SINGLE\",\n+                                    \"resourceTypes\": [\n+                                        \"FILE\"\n+                                    ]\n+                                },\n                                 \"sensitive\": false\n+                            }\n+                        },\n+                        \"sideEffectFree\": true,\n+                        \"supportedRelationships\": [\n+                            {\n+                                \"description\": \"FlowFiles that do not match any term in the dictionary are routed to this relationship\",\n+                                \"name\": \"unmatched\"\n                             },\n-                            \"fetchfiletransfer-notfound-loglevel\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"TRACE\",\n-                                        \"value\": \"TRACE\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"DEBUG\",\n-                                        \"value\": \"DEBUG\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"INFO\",\n-                                        \"value\": \"INFO\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"WARN\",\n-                                        \"value\": \"WARN\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"ERROR\",\n-                                        \"value\": \"ERROR\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"FATAL\",\n-                                        \"value\": \"FATAL\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"NONE\",\n-                                        \"value\": \"NONE\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"ERROR\",\n-                                \"description\": \"Log level to use in case the file does not exist when the processor is triggered\",\n-                                \"displayName\": \"Log level when file not found\",\n+                            {\n+                                \"description\": \"FlowFiles that match at least one term in the dictionary are routed to this relationship\",\n+                                \"name\": \"matched\"\n+                            }\n+                        ],\n+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\",\n+                            \"EVENT_DRIVEN\"\n+                        ],\n+                        \"supportsBatching\": true,\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicRelationships\": false,\n+                        \"supportsEventDriven\": true,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"aho-corasick\",\n+                            \"byte sequence\",\n+                            \"content\",\n+                            \"dictionary\",\n+                            \"find\",\n+                            \"scan\",\n+                            \"search\"\n+                        ],\n+                        \"triggerSerially\": false,\n+                        \"triggerWhenAnyDestinationAvailable\": false,\n+                        \"triggerWhenEmpty\": false,\n+                        \"type\": \"org.apache.nifi.processors.standard.ScanContent\",\n+                        \"typeDescription\": \"Scans the content of FlowFiles for terms that are found in a user-supplied dictionary. If a term is matched, the UTF-8 encoded version of the term will be added to the FlowFile using the 'matching.term' attribute\",\n+                        \"version\": \"1.27.0\",\n+                        \"writesAttributes\": [\n+                            {\n+                                \"description\": \"The term that caused the Processor to route the FlowFile to the 'matched' relationship; if FlowFile is routed to the 'unmatched' relationship, this attribute is not added\",\n+                                \"name\": \"matching.term\"\n+                            }\n+                        ]\n+                    },\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-standard-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"e0c4461\"\n+                        },\n+                        \"defaultBulletinLevel\": \"WARN\",\n+                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": 1,\n+                            \"EVENT_DRIVEN\": 0,\n+                            \"TIMER_DRIVEN\": 1\n+                        },\n+                        \"defaultPenaltyDuration\": \"30 sec\",\n+                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": \"* * * * * ?\",\n+                            \"TIMER_DRIVEN\": \"0 sec\"\n+                        },\n+                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n+                        \"defaultYieldDuration\": \"1 sec\",\n+                        \"group\": \"org.apache.nifi\",\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n+                        \"primaryNodeOnly\": false,\n+                        \"propertyDescriptors\": {\n+                            \"Segment Size\": {\n+                                \"description\": \"The maximum data size in bytes for each segment\",\n+                                \"displayName\": \"Segment Size\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"fetchfiletransfer-notfound-loglevel\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Segment Size\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n-                            },\n-                            \"proxy-configuration-service\": {\n-                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests. If set, it supersedes proxy settings configured per component. Supported proxies: SOCKS + AuthN, HTTP + AuthN\",\n-                                \"displayName\": \"Proxy Configuration Service\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"proxy-configuration-service\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.proxy.ProxyConfigurationService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n                             }\n                         },\n                         \"seeAlso\": [\n-                            \"org.apache.nifi.processors.standard.GetFTP\",\n-                            \"org.apache.nifi.processors.standard.GetSFTP\",\n-                            \"org.apache.nifi.processors.standard.PutFTP\",\n-                            \"org.apache.nifi.processors.standard.PutSFTP\"\n+                            \"org.apache.nifi.processors.standard.MergeContent\"\n                         ],\n-                        \"sideEffectFree\": false,\n+                        \"sideEffectFree\": true,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"All FlowFiles that are received are routed to success\",\n-                                \"name\": \"success\"\n-                            },\n-                            {\n-                                \"description\": \"Any FlowFile that could not be fetched from the remote server due to a communications failure will be transferred to this Relationship.\",\n-                                \"name\": \"comms.failure\"\n-                            },\n-                            {\n-                                \"description\": \"Any FlowFile for which we receive a 'Not Found' message from the remote server will be transferred to this Relationship.\",\n-                                \"name\": \"not.found\"\n+                                \"description\": \"All segments will be sent to this relationship. If the file was small enough that it was not segmented, a copy of the original is sent to this relationship as well as original\",\n+                                \"name\": \"segments\"\n                             },\n                             {\n-                                \"description\": \"Any FlowFile that could not be fetched from the remote server due to insufficient permissions will be transferred to this Relationship.\",\n-                                \"name\": \"permission.denied\"\n+                                \"description\": \"The original FlowFile will be sent to this relationship\",\n+                                \"name\": \"original\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n+                            \"CRON_DRIVEN\",\n+                            \"EVENT_DRIVEN\"\n                         ],\n-                        \"supportsBatching\": false,\n+                        \"supportsBatching\": true,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": false,\n+                        \"supportsEventDriven\": true,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"fetch\",\n-                            \"files\",\n-                            \"get\",\n-                            \"ingest\",\n-                            \"input\",\n-                            \"remote\",\n-                            \"retrieve\",\n-                            \"sftp\",\n-                            \"source\"\n+                            \"segment\",\n+                            \"split\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.standard.FetchSFTP\",\n-                        \"typeDescription\": \"Fetches the content of a file from a remote SFTP server and overwrites the contents of an incoming FlowFile with the content of the remote file.\",\n+                        \"type\": \"org.apache.nifi.processors.standard.SegmentContent\",\n+                        \"typeDescription\": \"Segments a FlowFile into multiple smaller segments on byte boundaries. Each segment is given the following attributes: fragment.identifier, fragment.index, fragment.count, segment.original.filename; these attributes can then be used by the MergeContent processor in order to reconstitute the original FlowFile\",\n                         \"version\": \"1.27.0\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"The hostname or IP address from which the file was pulled\",\n-                                \"name\": \"sftp.remote.host\"\n+                                \"description\": \"All segments produced from the same parent FlowFile will have the same randomly generated UUID added for this attribute. This attribute is added to maintain backward compatibility, but the fragment.identifier is preferred, as it is designed to work in conjunction with the MergeContent Processor\",\n+                                \"name\": \"segment.identifier\"\n                             },\n                             {\n-                                \"description\": \"The port that was used to communicate with the remote SFTP server\",\n-                                \"name\": \"sftp.remote.port\"\n+                                \"description\": \"A one-up number that indicates the ordering of the segments that were created from a single parent FlowFile. This attribute is added to maintain backward compatibility, but the fragment.index is preferred, as it is designed to work in conjunction with the MergeContent Processor\",\n+                                \"name\": \"segment.index\"\n                             },\n                             {\n-                                \"description\": \"The name of the remote file that was pulled\",\n-                                \"name\": \"sftp.remote.filename\"\n+                                \"description\": \"The number of segments generated from the parent FlowFile. This attribute is added to maintain backward compatibility, but the fragment.count is preferred, as it is designed to work in conjunction with the MergeContent Processor\",\n+                                \"name\": \"segment.count\"\n                             },\n                             {\n-                                \"description\": \"The filename is updated to point to the filename fo the remote file\",\n-                                \"name\": \"filename\"\n+                                \"description\": \"All segments produced from the same parent FlowFile will have the same randomly generated UUID added for this attribute\",\n+                                \"name\": \"fragment.identifier\"\n                             },\n                             {\n-                                \"description\": \"If the Remote File contains a directory name, that directory name will be added to the FlowFile using the 'path' attribute\",\n-                                \"name\": \"path\"\n+                                \"description\": \"A one-up number that indicates the ordering of the segments that were created from a single parent FlowFile\",\n+                                \"name\": \"fragment.index\"\n                             },\n                             {\n-                                \"description\": \"The name of the failure relationship applied when routing to any failure relationship\",\n-                                \"name\": \"fetch.failure.reason\"\n+                                \"description\": \"The number of segments generated from the parent FlowFile\",\n+                                \"name\": \"fragment.count\"\n+                            },\n+                            {\n+                                \"description\": \"The filename of the parent FlowFile\",\n+                                \"name\": \"segment.original.filename \"\n+                            },\n+                            {\n+                                \"description\": \"The filename will be updated to include the parent's filename, the segment index, and the segment count\",\n+                                \"name\": \"segment.original.filename \"\n                             }\n                         ]\n                     },\n                     {\n                         \"additionalDetails\": false,\n                         \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n+                            \"EVENT_DRIVEN\": 0,\n                             \"TIMER_DRIVEN\": 1\n                         },\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Attribute Matching Strategy\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"Provides a set of attribute keys to filter for, separated by a comma delimiter ','.\",\n-                                        \"displayName\": \"Enumerate attributes\",\n-                                        \"value\": \"Enumerate attributes\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Provides a regular expression to match keys of attributes to filter for.\",\n-                                        \"displayName\": \"Use regular expression\",\n-                                        \"value\": \"Use regular expression\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"Enumerate attributes\",\n-                                \"description\": \"Specifies the strategy to filter attributes by.\",\n-                                \"displayName\": \"Attribute Matching Strategy\",\n+                            \"Byte Sequence\": {\n+                                \"description\": \"A representation of bytes to look for and upon which to split the source file into separate files\",\n+                                \"displayName\": \"Byte Sequence\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Attribute Matching Strategy\",\n+                                \"name\": \"Byte Sequence\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Filter Mode\": {\n+                            \"Byte Sequence Format\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Retains only the attributes matching the filter, all other attributes are removed.\",\n-                                        \"displayName\": \"Retain\",\n-                                        \"value\": \"Retain\"\n+                                        \"description\": \"The Byte Sequence will be interpreted as a hexadecimal representation of bytes\",\n+                                        \"displayName\": \"Hexadecimal\",\n+                                        \"value\": \"Hexadecimal\"\n                                     },\n                                     {\n-                                        \"description\": \"Removes the attributes matching the filter, all other attributes are retained.\",\n-                                        \"displayName\": \"Remove\",\n-                                        \"value\": \"Remove\"\n+                                        \"description\": \"The Byte Sequence will be interpreted as UTF-8 Encoded text\",\n+                                        \"displayName\": \"Text\",\n+                                        \"value\": \"Text\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"Retain\",\n-                                \"description\": \"Specifies the strategy to apply on filtered attributes. Either 'Remove' or 'Retain' only the matching attributes.\",\n-                                \"displayName\": \"Filter Mode\",\n+                                \"defaultValue\": \"Hexadecimal\",\n+                                \"description\": \"Specifies how the <Byte Sequence> property should be interpreted\",\n+                                \"displayName\": \"Byte Sequence Format\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Filter Mode\",\n+                                \"name\": \"Byte Sequence Format\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Filtered Attributes\": {\n-                                \"dependencies\": [\n+                            \"Byte Sequence Location\": {\n+                                \"allowableValues\": [\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"Enumerate attributes\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Attribute Matching Strategy\",\n-                                        \"propertyName\": \"Attribute Matching Strategy\"\n+                                        \"description\": \"Keep the Byte Sequence at the end of the first split if <Keep Byte Sequence> is true\",\n+                                        \"displayName\": \"Trailing\",\n+                                        \"value\": \"Trailing\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Keep the Byte Sequence at the beginning of the second split if <Keep Byte Sequence> is true\",\n+                                        \"displayName\": \"Leading\",\n+                                        \"value\": \"Leading\"\n                                     }\n                                 ],\n-                                \"description\": \"A set of attribute names to filter from FlowFiles. Each attribute name is separated by the comma delimiter ','.\",\n-                                \"displayName\": \"Filtered Attributes\",\n+                                \"defaultValue\": \"Trailing\",\n+                                \"description\": \"If <Keep Byte Sequence> is set to true, specifies whether the byte sequence should be added to the end of the first split or the beginning of the second; if <Keep Byte Sequence> is false, this property is ignored.\",\n+                                \"displayName\": \"Byte Sequence Location\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Filtered Attributes\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Byte Sequence Location\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Filtered Attributes Pattern\": {\n-                                \"dependencies\": [\n+                            \"Keep Byte Sequence\": {\n+                                \"allowableValues\": [\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"Use regular expression\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Attribute Matching Strategy\",\n-                                        \"propertyName\": \"Attribute Matching Strategy\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"description\": \"A regular expression to match names of attributes to filter from FlowFiles.\",\n-                                \"displayName\": \"Filtered Attributes Pattern\",\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"Determines whether or not the Byte Sequence should be included with each Split\",\n+                                \"displayName\": \"Keep Byte Sequence\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Filtered Attributes Pattern\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Keep Byte Sequence\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             }\n                         },\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.processors.standard.MergeContent\"\n+                        ],\n                         \"sideEffectFree\": true,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"All successful FlowFiles are routed to this relationship\",\n-                                \"name\": \"success\"\n+                                \"description\": \"All Splits will be routed to the splits relationship\",\n+                                \"name\": \"splits\"\n+                            },\n+                            {\n+                                \"description\": \"The original file\",\n+                                \"name\": \"original\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n+                            \"CRON_DRIVEN\",\n+                            \"EVENT_DRIVEN\"\n                         ],\n                         \"supportsBatching\": true,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": false,\n+                        \"supportsEventDriven\": true,\n                         \"supportsSensitiveDynamicProperties\": false,\n+                        \"systemResourceConsiderations\": [\n+                            {\n+                                \"description\": \"The FlowFile with its attributes is stored in memory, not the content of the FlowFile. If many splits are generated due to the size of the content, or how the content is configured to be split, a two-phase approach may be necessary to avoid excessive use of memory.\",\n+                                \"resource\": \"MEMORY\"\n+                            }\n+                        ],\n                         \"tags\": [\n-                            \"Attribute Expression Language\",\n-                            \"attributes\",\n-                            \"delete\",\n-                            \"filter\",\n-                            \"modification\",\n-                            \"regex\",\n-                            \"regular expression\",\n-                            \"remove\",\n-                            \"retain\"\n+                            \"binary\",\n+                            \"content\",\n+                            \"split\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.standard.FilterAttribute\",\n-                        \"typeDescription\": \"Filters the attributes of a FlowFile by retaining specified attributes and removing the rest or by removing specified attributes and retaining the rest.\",\n-                        \"version\": \"1.27.0\"\n+                        \"type\": \"org.apache.nifi.processors.standard.SplitContent\",\n+                        \"typeDescription\": \"Splits incoming FlowFiles by a specified byte sequence\",\n+                        \"version\": \"1.27.0\",\n+                        \"writesAttributes\": [\n+                            {\n+                                \"description\": \"All split FlowFiles produced from the same parent FlowFile will have the same randomly generated UUID added for this attribute\",\n+                                \"name\": \"fragment.identifier\"\n+                            },\n+                            {\n+                                \"description\": \"A one-up number that indicates the ordering of the split FlowFiles that were created from a single parent FlowFile\",\n+                                \"name\": \"fragment.index\"\n+                            },\n+                            {\n+                                \"description\": \"The number of split FlowFiles generated from the parent FlowFile\",\n+                                \"name\": \"fragment.count\"\n+                            },\n+                            {\n+                                \"description\": \"The filename of the parent FlowFile\",\n+                                \"name\": \"segment.original.filename \"\n+                            }\n+                        ]\n                     },\n                     {\n                         \"additionalDetails\": false,\n                         \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n@@ -103043,1007 +103271,1201 @@\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"flatten-json-character-set\": {\n-                                \"defaultValue\": \"UTF-8\",\n-                                \"description\": \"The Character Set in which file is encoded\",\n-                                \"displayName\": \"Character Set\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"flatten-json-character-set\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"flatten-json-pretty-print-json\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"Specifies whether or not resulted json should be pretty printed\",\n-                                \"displayName\": \"Pretty Print JSON\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"flatten-json-pretty-print-json\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"flatten-json-return-type\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"flatten\",\n-                                        \"value\": \"flatten\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"unflatten\",\n-                                        \"value\": \"unflatten\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"flatten\",\n-                                \"description\": \"Specifies the desired return type of json such as flatten/unflatten\",\n-                                \"displayName\": \"Return Type\",\n+                            \"JsonPath Expression\": {\n+                                \"description\": \"A JsonPath expression that indicates the array element to split into JSON/scalar fragments.\",\n+                                \"displayName\": \"JsonPath Expression\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"flatten-json-return-type\",\n+                                \"name\": \"JsonPath Expression\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"flatten-json-separator\": {\n-                                \"defaultValue\": \".\",\n-                                \"description\": \"The separator character used for joining keys. Must be a JSON-legal character.\",\n-                                \"displayName\": \"Separator\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"flatten-json-separator\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"flatten-mode\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"Flattens every objects into a single level json\",\n-                                        \"displayName\": \"normal\",\n-                                        \"value\": \"normal\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Flattens every objects and keep arrays format\",\n-                                        \"displayName\": \"keep arrays\",\n-                                        \"value\": \"keep arrays\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Conforms to MongoDB dot notation to update also nested documents\",\n-                                        \"displayName\": \"dot notation\",\n-                                        \"value\": \"dot notation\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Flattens every objects except arrays which contain only primitive types (strings, numbers, booleans and null)\",\n-                                        \"displayName\": \"keep primitive arrays\",\n-                                        \"value\": \"keep primitive arrays\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"keep arrays\",\n-                                \"description\": \"Specifies how json should be flattened/unflattened\",\n-                                \"displayName\": \"Flatten Mode\",\n+                            \"Max String Length\": {\n+                                \"defaultValue\": \"20 MB\",\n+                                \"description\": \"The maximum allowed length of a string value when parsing the JSON document\",\n+                                \"displayName\": \"Max String Length\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"flatten-mode\",\n+                                \"name\": \"Max String Length\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"ignore-reserved-characters\": {\n+                            \"Null Value Representation\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"displayName\": \"empty string\",\n+                                        \"value\": \"empty string\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"displayName\": \"the string 'null'\",\n+                                        \"value\": \"the string 'null'\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"If true, reserved characters in keys will be ignored\",\n-                                \"displayName\": \"Ignore Reserved Characters\",\n+                                \"defaultValue\": \"empty string\",\n+                                \"description\": \"Indicates the desired representation of JSON Path expressions resulting in a null value.\",\n+                                \"displayName\": \"Null Value Representation\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"ignore-reserved-characters\",\n+                                \"name\": \"Null Value Representation\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             }\n                         },\n                         \"sideEffectFree\": true,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"Successfully flattened/unflattened files go to this relationship.\",\n-                                \"name\": \"success\"\n+                                \"description\": \"If a FlowFile fails processing for any reason (for example, the FlowFile is not valid JSON or the specified path does not exist), it will be routed to this relationship\",\n+                                \"name\": \"failure\"\n                             },\n                             {\n-                                \"description\": \"Files that cannot be flattened/unflattened go to this relationship.\",\n-                                \"name\": \"failure\"\n+                                \"description\": \"The original FlowFile that was split into segments. If the FlowFile fails processing, nothing will be sent to this relationship\",\n+                                \"name\": \"original\"\n+                            },\n+                            {\n+                                \"description\": \"All segments of the original FlowFile will be routed to this relationship\",\n+                                \"name\": \"split\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\",\n                             \"EVENT_DRIVEN\"\n                         ],\n                         \"supportsBatching\": true,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsEventDriven\": true,\n                         \"supportsSensitiveDynamicProperties\": false,\n+                        \"systemResourceConsiderations\": [\n+                            {\n+                                \"description\": \"The entirety of the FlowFile's content (as a JsonNode object) is read into memory, in addition to all of the generated FlowFiles representing the split JSON. If many splits are generated due to the size of the JSON, or how the JSON is configured to be split, a two-phase approach may be necessary to avoid excessive use of memory.\",\n+                                \"resource\": \"MEMORY\"\n+                            }\n+                        ],\n                         \"tags\": [\n-                            \"flatten\",\n                             \"json\",\n-                            \"unflatten\"\n+                            \"jsonpath\",\n+                            \"split\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.standard.FlattenJson\",\n-                        \"typeDescription\": \"Provides the user with the ability to take a nested JSON document and flatten it into a simple key/value pair document. The keys are combined at each level with a user-defined separator that defaults to '.'. This Processor also allows to unflatten back the flattened json. It supports four kinds of flatten mode such as normal, keep-arrays, dot notation for MongoDB query and keep-primitive-arrays. Default flatten mode is 'keep-arrays'.\",\n-                        \"version\": \"1.27.0\"\n+                        \"type\": \"org.apache.nifi.processors.standard.SplitJson\",\n+                        \"typeDescription\": \"Splits a JSON File into multiple, separate FlowFiles for an array element specified by a JsonPath expression. Each generated FlowFile is comprised of an element of the specified array and transferred to relationship 'split,' with the original file transferred to the 'original' relationship. If the specified JsonPath is not found or does not evaluate to an array element, the original file is routed to 'failure' and no files are generated.\",\n+                        \"version\": \"1.27.0\",\n+                        \"writesAttributes\": [\n+                            {\n+                                \"description\": \"All split FlowFiles produced from the same parent FlowFile will have the same randomly generated UUID added for this attribute\",\n+                                \"name\": \"fragment.identifier\"\n+                            },\n+                            {\n+                                \"description\": \"A one-up number that indicates the ordering of the split FlowFiles that were created from a single parent FlowFile\",\n+                                \"name\": \"fragment.index\"\n+                            },\n+                            {\n+                                \"description\": \"The number of split FlowFiles generated from the parent FlowFile\",\n+                                \"name\": \"fragment.count\"\n+                            },\n+                            {\n+                                \"description\": \"The filename of the parent FlowFile\",\n+                                \"name\": \"segment.original.filename \"\n+                            }\n+                        ]\n                     },\n                     {\n-                        \"additionalDetails\": true,\n+                        \"additionalDetails\": false,\n                         \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n+                            \"EVENT_DRIVEN\": 0,\n                             \"TIMER_DRIVEN\": 1\n                         },\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"primaryNodeOnly\": false,\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.processors.standard.JoinEnrichment\"\n-                        ],\n+                        \"propertyDescriptors\": {\n+                            \"Record Reader\": {\n+                                \"description\": \"Specifies the Controller Service to use for reading incoming data\",\n+                                \"displayName\": \"Record Reader\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Record Reader\",\n+                                \"required\": true,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"Record Writer\": {\n+                                \"description\": \"Specifies the Controller Service to use for writing out the records\",\n+                                \"displayName\": \"Record Writer\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Record Writer\",\n+                                \"required\": true,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"Records Per Split\": {\n+                                \"description\": \"Specifies how many records should be written to each 'split' or 'segment' FlowFile\",\n+                                \"displayName\": \"Records Per Split\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Records Per Split\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            }\n+                        },\n                         \"sideEffectFree\": true,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"A clone of the incoming FlowFile will be routed to this relationship, after adding appropriate attributes.\",\n-                                \"name\": \"enrichment\"\n+                                \"description\": \"If a FlowFile cannot be transformed from the configured input format to the configured output format, the unchanged FlowFile will be routed to this relationship.\",\n+                                \"name\": \"failure\"\n                             },\n                             {\n-                                \"description\": \"The incoming FlowFile will be routed to this relationship, after adding appropriate attributes.\",\n+                                \"description\": \"The individual 'segments' of the original FlowFile will be routed to this relationship.\",\n+                                \"name\": \"splits\"\n+                            },\n+                            {\n+                                \"description\": \"Upon successfully splitting an input FlowFile, the original FlowFile will be sent to this relationship.\",\n                                 \"name\": \"original\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n+                            \"CRON_DRIVEN\",\n+                            \"EVENT_DRIVEN\"\n                         ],\n                         \"supportsBatching\": true,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": false,\n+                        \"supportsEventDriven\": true,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"enrich\",\n-                            \"fork\",\n-                            \"join\",\n-                            \"record\"\n+                            \"avro\",\n+                            \"csv\",\n+                            \"freeform\",\n+                            \"generic\",\n+                            \"json\",\n+                            \"log\",\n+                            \"logs\",\n+                            \"schema\",\n+                            \"split\",\n+                            \"text\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.standard.ForkEnrichment\",\n-                        \"typeDescription\": \"Used in conjunction with the JoinEnrichment processor, this processor is responsible for adding the attributes that are necessary for the JoinEnrichment processor to perform its function. Each incoming FlowFile will be cloned. The original FlowFile will have appropriate attributes added and then be transferred to the 'original' relationship. The clone will have appropriate attributes added and then be routed to the 'enrichment' relationship. See the documentation for the JoinEnrichment processor (and especially its Additional Details) for more information on how these Processors work together and how to perform enrichment tasks in NiFi by using these Processors.\",\n+                        \"type\": \"org.apache.nifi.processors.standard.SplitRecord\",\n+                        \"typeDescription\": \"Splits up an input FlowFile that is in a record-oriented data format into multiple smaller FlowFiles\",\n                         \"version\": \"1.27.0\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"The Group ID to use in order to correlate the 'original' FlowFile with the 'enrichment' FlowFile.\",\n-                                \"name\": \"enrichment.group.id\"\n+                                \"description\": \"Sets the mime.type attribute to the MIME Type specified by the Record Writer for the FlowFiles routed to the 'splits' Relationship.\",\n+                                \"name\": \"mime.type\"\n                             },\n                             {\n-                                \"description\": \"The role to use for enrichment. This will either be ORIGINAL or ENRICHMENT.\",\n-                                \"name\": \"enrichment.role\"\n+                                \"description\": \"The number of records in the FlowFile. This is added to FlowFiles that are routed to the 'splits' Relationship.\",\n+                                \"name\": \"record.count\"\n+                            },\n+                            {\n+                                \"description\": \"All split FlowFiles produced from the same parent FlowFile will have the same randomly generated UUID added for this attribute\",\n+                                \"name\": \"fragment.identifier\"\n+                            },\n+                            {\n+                                \"description\": \"A one-up number that indicates the ordering of the split FlowFiles that were created from a single parent FlowFile\",\n+                                \"name\": \"fragment.index\"\n+                            },\n+                            {\n+                                \"description\": \"The number of split FlowFiles generated from the parent FlowFile\",\n+                                \"name\": \"fragment.count\"\n+                            },\n+                            {\n+                                \"description\": \"The filename of the parent FlowFile\",\n+                                \"name\": \"segment.original.filename \"\n                             }\n                         ]\n                     },\n                     {\n-                        \"additionalDetails\": true,\n+                        \"additionalDetails\": false,\n                         \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n+                            \"EVENT_DRIVEN\": 0,\n                             \"TIMER_DRIVEN\": 1\n                         },\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n-                        \"dynamicProperties\": [\n-                            {\n-                                \"description\": \"A Record Path value, pointing to a field of type ARRAY containing RECORD objects\",\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"name\": \"Record Path property\",\n-                                \"value\": \"The Record Path value\"\n-                            }\n-                        ],\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"fork-mode\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"Generated records will be the elements of the array\",\n-                                        \"displayName\": \"Extract\",\n-                                        \"value\": \"extract\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Generated records will preserve the input schema and will contain a one-element array\",\n-                                        \"displayName\": \"Split\",\n-                                        \"value\": \"split\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"split\",\n-                                \"description\": \"Specifies the forking mode of the processor\",\n-                                \"displayName\": \"Mode\",\n+                            \"Header Line Count\": {\n+                                \"defaultValue\": \"0\",\n+                                \"description\": \"The number of lines that should be considered part of the header; the header lines will be duplicated to all split files\",\n+                                \"displayName\": \"Header Line Count\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"fork-mode\",\n+                                \"name\": \"Header Line Count\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"include-parent-fields\": {\n+                            \"Header Line Marker Characters\": {\n+                                \"description\": \"The first character(s) on the line of the datafile which signifies a header line. This value is ignored when Header Line Count is non-zero. The first line not containing the Header Line Marker Characters and all subsequent lines are considered non-header\",\n+                                \"displayName\": \"Header Line Marker Characters\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Header Line Marker Characters\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Line Split Count\": {\n+                                \"description\": \"The number of lines that will be added to each split file, excluding header lines. A value of zero requires Maximum Fragment Size to be set, and line count will not be considered in determining splits.\",\n+                                \"displayName\": \"Line Split Count\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Line Split Count\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Maximum Fragment Size\": {\n+                                \"description\": \"The maximum size of each split file, including header lines. NOTE: in the case where a single line exceeds this property (including headers, if applicable), that line will be output in a split of its own which exceeds this Maximum Fragment Size setting.\",\n+                                \"displayName\": \"Maximum Fragment Size\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Maximum Fragment Size\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Remove Trailing Newlines\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"true\",\n                                         \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"false\",\n                                         \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"This parameter is only valid with the 'extract' mode. If set to true, all the fields from the root level to the given array will be added as fields of each element of the array to fork.\",\n-                                \"displayName\": \"Include Parent Fields\",\n+                                \"defaultValue\": \"true\",\n+                                \"description\": \"Whether to remove newlines at the end of each split file. This should be false if you intend to merge the split files later. If this is set to 'true' and a FlowFile is generated that contains only 'empty lines' (i.e., consists only of \\\\r and \\\\n characters), the FlowFile will not be emitted. Note, however, that if header lines are specified, the resultant FlowFile will never be empty as it will consist of the header lines, so a FlowFile may be emitted that contains only the header lines.\",\n+                                \"displayName\": \"Remove Trailing Newlines\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"include-parent-fields\",\n+                                \"name\": \"Remove Trailing Newlines\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n+                            }\n+                        },\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.processors.standard.MergeContent\"\n+                        ],\n+                        \"sideEffectFree\": true,\n+                        \"supportedRelationships\": [\n+                            {\n+                                \"description\": \"If a file cannot be split for some reason, the original file will be routed to this destination and nothing will be routed elsewhere\",\n+                                \"name\": \"failure\"\n                             },\n-                            \"record-reader\": {\n-                                \"description\": \"Specifies the Controller Service to use for reading incoming data\",\n-                                \"displayName\": \"Record Reader\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"record-reader\",\n-                                \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n+                            {\n+                                \"description\": \"The original input file will be routed to this destination when it has been successfully split into 1 or more files\",\n+                                \"name\": \"original\"\n                             },\n-                            \"record-writer\": {\n-                                \"description\": \"Specifies the Controller Service to use for writing out the records\",\n-                                \"displayName\": \"Record Writer\",\n+                            {\n+                                \"description\": \"The split files will be routed to this destination when an input file is successfully split into 1 or more split files\",\n+                                \"name\": \"splits\"\n+                            }\n+                        ],\n+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\",\n+                            \"EVENT_DRIVEN\"\n+                        ],\n+                        \"supportsBatching\": true,\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicRelationships\": false,\n+                        \"supportsEventDriven\": true,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"systemResourceConsiderations\": [\n+                            {\n+                                \"description\": \"The FlowFile with its attributes is stored in memory, not the content of the FlowFile. If many splits are generated due to the size of the content, or how the content is configured to be split, a two-phase approach may be necessary to avoid excessive use of memory.\",\n+                                \"resource\": \"MEMORY\"\n+                            }\n+                        ],\n+                        \"tags\": [\n+                            \"split\",\n+                            \"text\"\n+                        ],\n+                        \"triggerSerially\": false,\n+                        \"triggerWhenAnyDestinationAvailable\": false,\n+                        \"triggerWhenEmpty\": false,\n+                        \"type\": \"org.apache.nifi.processors.standard.SplitText\",\n+                        \"typeDescription\": \"Splits a text file into multiple smaller text files on line boundaries limited by maximum number of lines or total size of fragment. Each output split file will contain no more than the configured number of lines or bytes. If both Line Split Count and Maximum Fragment Size are specified, the split occurs at whichever limit is reached first. If the first line of a fragment exceeds the Maximum Fragment Size, that line will be output in a single split file which exceeds the configured maximum size limit. This component also allows one to specify that each split should include a header lines. Header lines can be computed by either specifying the amount of lines that should constitute a header or by using header marker to match against the read lines. If such match happens then the corresponding line will be treated as header. Keep in mind that upon the first failure of header marker match, no more matches will be performed and the rest of the data will be parsed as regular lines for a given split. If after computation of the header there are no more data, the resulting split will consists of only header lines.\",\n+                        \"version\": \"1.27.0\",\n+                        \"writesAttributes\": [\n+                            {\n+                                \"description\": \"The number of lines of text from the original FlowFile that were copied to this FlowFile\",\n+                                \"name\": \"text.line.count\"\n+                            },\n+                            {\n+                                \"description\": \"The number of bytes from the original FlowFile that were copied to this FlowFile, including header, if applicable, which is duplicated in each split FlowFile\",\n+                                \"name\": \"fragment.size\"\n+                            },\n+                            {\n+                                \"description\": \"All split FlowFiles produced from the same parent FlowFile will have the same randomly generated UUID added for this attribute\",\n+                                \"name\": \"fragment.identifier\"\n+                            },\n+                            {\n+                                \"description\": \"A one-up number that indicates the ordering of the split FlowFiles that were created from a single parent FlowFile\",\n+                                \"name\": \"fragment.index\"\n+                            },\n+                            {\n+                                \"description\": \"The number of split FlowFiles generated from the parent FlowFile\",\n+                                \"name\": \"fragment.count\"\n+                            },\n+                            {\n+                                \"description\": \"The filename of the parent FlowFile\",\n+                                \"name\": \"segment.original.filename \"\n+                            }\n+                        ]\n+                    },\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-standard-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"e0c4461\"\n+                        },\n+                        \"defaultBulletinLevel\": \"WARN\",\n+                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": 1,\n+                            \"EVENT_DRIVEN\": 0,\n+                            \"TIMER_DRIVEN\": 1\n+                        },\n+                        \"defaultPenaltyDuration\": \"30 sec\",\n+                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": \"* * * * * ?\",\n+                            \"TIMER_DRIVEN\": \"0 sec\"\n+                        },\n+                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n+                        \"defaultYieldDuration\": \"1 sec\",\n+                        \"group\": \"org.apache.nifi\",\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n+                        \"primaryNodeOnly\": false,\n+                        \"propertyDescriptors\": {\n+                            \"Split Depth\": {\n+                                \"defaultValue\": \"1\",\n+                                \"description\": \"Indicates the XML-nesting depth to start splitting XML fragments. A depth of 1 means split the root's children, whereas a depth of 2 means split the root's children's children and so forth.\",\n+                                \"displayName\": \"Split Depth\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"record-writer\",\n+                                \"name\": \"Split Depth\",\n                                 \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n+                                \"sensitive\": false\n                             }\n                         },\n                         \"sideEffectFree\": true,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"In case a FlowFile generates an error during the fork operation, it will be routed to this relationship\",\n+                                \"description\": \"If a FlowFile fails processing for any reason (for example, the FlowFile is not valid XML), it will be routed to this relationship\",\n                                 \"name\": \"failure\"\n                             },\n                             {\n-                                \"description\": \"The original FlowFiles will be routed to this relationship\",\n+                                \"description\": \"The original FlowFile that was split into segments. If the FlowFile fails processing, nothing will be sent to this relationship\",\n                                 \"name\": \"original\"\n                             },\n                             {\n-                                \"description\": \"The FlowFiles containing the forked records will be routed to this relationship\",\n-                                \"name\": \"fork\"\n+                                \"description\": \"All segments of the original FlowFile will be routed to this relationship\",\n+                                \"name\": \"split\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n+                            \"CRON_DRIVEN\",\n+                            \"EVENT_DRIVEN\"\n                         ],\n                         \"supportsBatching\": true,\n-                        \"supportsDynamicProperties\": true,\n+                        \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": false,\n+                        \"supportsEventDriven\": true,\n                         \"supportsSensitiveDynamicProperties\": false,\n+                        \"systemResourceConsiderations\": [\n+                            {\n+                                \"description\": \"The entirety of the FlowFile's content (as a Document object) is read into memory, in addition to all of the generated FlowFiles representing the split XML. A Document object can take approximately 10 times as much memory as the size of the XML. For example, a 1 MB XML document may use 10 MB of memory. If many splits are generated due to the size of the XML, a two-phase approach may be necessary to avoid excessive use of memory.\",\n+                                \"resource\": \"MEMORY\"\n+                            }\n+                        ],\n                         \"tags\": [\n-                            \"array\",\n-                            \"content\",\n-                            \"event\",\n-                            \"fork\",\n-                            \"record\",\n-                            \"stream\"\n+                            \"split\",\n+                            \"xml\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.standard.ForkRecord\",\n-                        \"typeDescription\": \"This processor allows the user to fork a record into multiple records. The user must specify at least one Record Path, as a dynamic property, pointing to a field of type ARRAY containing RECORD objects. The processor accepts two modes: 'split' and 'extract'. In both modes, there is one record generated per element contained in the designated array. In the 'split' mode, each generated record will preserve the same schema as given in the input but the array will contain only one element. In the 'extract' mode, the element of the array must be of record type and will be the generated record. Additionally, in the 'extract' mode, it is possible to specify if each generated record should contain all the fields of the parent records from the root level to the extracted record. This assumes that the fields to add in the record are defined in the schema of the Record Writer controller service. See examples in the additional details documentation of this processor.\",\n+                        \"type\": \"org.apache.nifi.processors.standard.SplitXml\",\n+                        \"typeDescription\": \"Splits an XML File into multiple separate FlowFiles, each comprising a child or descendant of the original root element\",\n                         \"version\": \"1.27.0\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"The generated FlowFile will have a 'record.count' attribute indicating the number of records that were written to the FlowFile.\",\n-                                \"name\": \"record.count\"\n+                                \"description\": \"All split FlowFiles produced from the same parent FlowFile will have the same randomly generated UUID added for this attribute\",\n+                                \"name\": \"fragment.identifier\"\n                             },\n                             {\n-                                \"description\": \"The MIME Type indicated by the Record Writer\",\n-                                \"name\": \"mime.type\"\n+                                \"description\": \"A one-up number that indicates the ordering of the split FlowFiles that were created from a single parent FlowFile\",\n+                                \"name\": \"fragment.index\"\n                             },\n                             {\n-                                \"description\": \"Any Attribute that the configured Record Writer returns will be added to the FlowFile.\",\n-                                \"name\": \"<Attributes from Record Writer>\"\n+                                \"description\": \"The number of split FlowFiles generated from the parent FlowFile\",\n+                                \"name\": \"fragment.count\"\n+                            },\n+                            {\n+                                \"description\": \"The filename of the parent FlowFile\",\n+                                \"name\": \"segment.original.filename \"\n                             }\n                         ]\n                     },\n                     {\n-                        \"additionalDetails\": false,\n+                        \"additionalDetails\": true,\n                         \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n                         },\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"1 min\"\n+                            \"TIMER_DRIVEN\": \"30 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n-                        \"dynamicProperties\": [\n+                        \"explicitRestrictions\": [\n                             {\n-                                \"description\": \"Specifies an attribute on generated FlowFiles defined by the Dynamic Property's key and value. If Expression Language is used, evaluation will be performed only once per batch of generated FlowFiles.\",\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"name\": \"Generated FlowFile attribute name\",\n-                                \"value\": \"Generated FlowFile attribute value\"\n+                                \"explanation\": \"Provides operator the ability to read from any file that NiFi has access to.\",\n+                                \"requiredPermission\": \"read filesystem\"\n                             }\n                         ],\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_FORBIDDEN\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Batch Size\": {\n-                                \"defaultValue\": \"1\",\n-                                \"description\": \"The number of FlowFiles to be transferred in each invocation\",\n-                                \"displayName\": \"Batch Size\",\n+                            \"File Location\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"State is stored locally. Each node in a cluster will tail a different file.\",\n+                                        \"displayName\": \"Local\",\n+                                        \"value\": \"Local\"\n+                                    },\n+                                    {\n+                                        \"description\": \"State is located on a remote resource. This Processor will store state across the cluster so that it can be run on Primary Node Only and a new Primary Node can pick up where the last one left off.\",\n+                                        \"displayName\": \"Remote\",\n+                                        \"value\": \"Remote\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"Local\",\n+                                \"description\": \"Specifies where the state is located either local or cluster so that state can be stored appropriately in order to ensure that all data is consumed without duplicating data upon restart of NiFi\",\n+                                \"displayName\": \"State Location\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Batch Size\",\n+                                \"name\": \"File Location\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Data Format\": {\n+                            \"File to Tail\": {\n+                                \"description\": \"Path of the file to tail in case of single file mode. If using multifile mode, regular expression to find files to tail in the base directory. In case recursivity is set to true, the regular expression will be used to match the path starting from the base directory (see additional details for examples).\",\n+                                \"displayName\": \"File(s) to Tail\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"File to Tail\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Initial Start Position\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Binary\",\n-                                        \"value\": \"Binary\"\n+                                        \"description\": \"Start with the oldest data that matches the Rolling Filename Pattern and then begin reading from the File to Tail\",\n+                                        \"displayName\": \"Beginning of Time\",\n+                                        \"value\": \"Beginning of Time\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Text\",\n-                                        \"value\": \"Text\"\n+                                        \"description\": \"Start with the beginning of the File to Tail. Do not ingest any data that has already been rolled over\",\n+                                        \"displayName\": \"Beginning of File\",\n+                                        \"value\": \"Beginning of File\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Start with the data at the end of the File to Tail. Do not ingest any data thas has already been rolled over or any data in the File to Tail that has already been written.\",\n+                                        \"displayName\": \"Current Time\",\n+                                        \"value\": \"Current Time\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"Text\",\n-                                \"description\": \"Specifies whether the data should be Text or Binary\",\n-                                \"displayName\": \"Data Format\",\n+                                \"defaultValue\": \"Beginning of File\",\n+                                \"description\": \"When the Processor first begins to tail data, this property specifies where the Processor should begin reading data. Once data has been ingested from a file, the Processor will continue from the last point from which it has received data.\",\n+                                \"displayName\": \"Initial Start Position\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Data Format\",\n+                                \"name\": \"Initial Start Position\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"File Size\": {\n-                                \"defaultValue\": \"0B\",\n-                                \"description\": \"The size of the file that will be used\",\n-                                \"displayName\": \"File Size\",\n+                            \"Line Start Pattern\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"Single file\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Tailing mode\",\n+                                        \"propertyName\": \"tail-mode\"\n+                                    }\n+                                ],\n+                                \"description\": \"A Regular Expression to match against the start of a log line. If specified, any line that matches the expression, and any following lines, will be buffered until another line matches the Expression. In doing this, we can avoid splitting apart multi-line messages in the file. This assumes that the data is in UTF-8 format.\",\n+                                \"displayName\": \"Line Start Pattern\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"File Size\",\n+                                \"name\": \"Line Start Pattern\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Max Buffer Size\": {\n+                                \"defaultValue\": \"64 KB\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"propertyDisplayName\": \"Line Start Pattern\",\n+                                        \"propertyName\": \"Line Start Pattern\"\n+                                    }\n+                                ],\n+                                \"description\": \"When using the Line Start Pattern, there may be situations in which the data in the file being tailed never matches the Regular Expression. This would result in the processor buffering all data from the tailed file, which can quickly exhaust the heap. To avoid this, the Processor will buffer only up to this amount of data before flushing the buffer, even if it means ingesting partial data from the file.\",\n+                                \"displayName\": \"Max Buffer Size\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Max Buffer Size\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Unique FlowFiles\": {\n+                            \"Post-Rollover Tail Period\": {\n+                                \"defaultValue\": \"0 sec\",\n+                                \"description\": \"When a file is rolled over, the processor will continue tailing the rolled over file until it has not been modified for this amount of time. This allows for another process to rollover a file, and then flush out any buffered data. Note that when this value is set, and the tailed file rolls over, the new file will not be tailed until the old file has not been modified for the configured amount of time. Additionally, when using this capability, in order to avoid data duplication, this period must be set longer than the Processor's Run Schedule, and the Processor must not be stopped after the file being tailed has been rolled over and before the data has been fully consumed. Otherwise, the data may be duplicated, as the entire file may be written out as the contents of a single FlowFile.\",\n+                                \"displayName\": \"Post-Rollover Tail Period\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Post-Rollover Tail Period\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Rolling Filename Pattern\": {\n+                                \"description\": \"If the file to tail \\\"rolls over\\\" as would be the case with log files, this filename pattern will be used to identify files that have rolled over so that if NiFi is restarted, and the file has rolled over, it will be able to pick up where it left off. This pattern supports wildcard characters * and ?, it also supports the notation ${filename} to specify a pattern based on the name of the file (without extension), and will assume that the files that have rolled over live in the same directory as the file being tailed. The same glob pattern will be used for all files.\",\n+                                \"displayName\": \"Rolling Filename Pattern\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Rolling Filename Pattern\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"pre-allocated-buffer-size\": {\n+                                \"defaultValue\": \"65536 B\",\n+                                \"description\": \"Sets the amount of memory that is pre-allocated for each tailed file.\",\n+                                \"displayName\": \"Pre-Allocated Buffer Size\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"pre-allocated-buffer-size\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"reread-on-nul\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"true\",\n                                         \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"false\",\n                                         \"value\": \"false\"\n                                     }\n                                 ],\n                                 \"defaultValue\": \"false\",\n-                                \"description\": \"If true, each FlowFile that is generated will be unique. If false, a random value will be generated and all FlowFiles will get the same content but this offers much higher throughput\",\n-                                \"displayName\": \"Unique FlowFiles\",\n+                                \"description\": \"If this option is set to 'true', when a NUL character is read, the processor will yield and try to read the same part again later. (Note: Yielding may delay the processing of other files tailed by this processor, not just the one with the NUL character.) The purpose of this flag is to allow users to handle cases where reading a file may return temporary NUL values. NFS for example may send file contents out of order. In this case the missing parts are temporarily replaced by NUL values. CAUTION! If the file contains legitimate NUL values, setting this flag causes this processor to get stuck indefinitely. For this reason users should refrain from using this feature if they can help it and try to avoid having the target file on a file system where reads are unreliable.\",\n+                                \"displayName\": \"Reread when NUL encountered\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Unique FlowFiles\",\n-                                \"required\": true,\n+                                \"name\": \"reread-on-nul\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"character-set\": {\n-                                \"defaultValue\": \"UTF-8\",\n-                                \"description\": \"Specifies the character set to use when writing the bytes of Custom Text to a flow file.\",\n-                                \"displayName\": \"Character Set\",\n+                            \"tail-base-directory\": {\n+                                \"description\": \"Base directory used to look for files to tail. This property is required when using Multifile mode.\",\n+                                \"displayName\": \"Base directory\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"tail-base-directory\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"tail-mode\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"In this mode, only the one file indicated in the 'Files to tail' property will be watched by the processor. In this mode, the file may not exist when starting the processor.\",\n+                                        \"displayName\": \"Single file\",\n+                                        \"value\": \"Single file\"\n+                                    },\n+                                    {\n+                                        \"description\": \"In this mode, the 'Files to tail' property accepts a regular expression and the processor will look for files in 'Base directory' to list the files to tail by the processor.\",\n+                                        \"displayName\": \"Multiple files\",\n+                                        \"value\": \"Multiple files\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"Single file\",\n+                                \"description\": \"Mode to use: single file will tail only one file, multiple file will look for a list of file. In Multiple mode the Base directory is required.\",\n+                                \"displayName\": \"Tailing mode\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"character-set\",\n+                                \"name\": \"tail-mode\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"generate-ff-custom-text\": {\n-                                \"description\": \"If Data Format is text and if Unique FlowFiles is false, then this custom text will be used as content of the generated FlowFiles and the File Size will be ignored. Finally, if Expression Language is used, evaluation will be performed only once per batch of generated FlowFiles\",\n-                                \"displayName\": \"Custom Text\",\n+                            \"tailfile-lookup-frequency\": {\n+                                \"defaultValue\": \"10 minutes\",\n+                                \"description\": \"Only used in Multiple files mode. It specifies the minimum duration the processor will wait before listing again the files to tail.\",\n+                                \"displayName\": \"Lookup frequency\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"generate-ff-custom-text\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"tailfile-lookup-frequency\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"mime-type\": {\n-                                \"description\": \"Specifies the value to set for the \\\"mime.type\\\" attribute.\",\n-                                \"displayName\": \"Mime Type\",\n+                            \"tailfile-maximum-age\": {\n+                                \"defaultValue\": \"24 hours\",\n+                                \"description\": \"Only used in Multiple files mode. It specifies the necessary minimum duration to consider that no new messages will be appended in a file regarding its last modification date. This should not be set too low to avoid duplication of data in case new messages are appended at a lower frequency.\",\n+                                \"displayName\": \"Maximum age\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"mime-type\",\n+                                \"name\": \"tailfile-maximum-age\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n+                            },\n+                            \"tailfile-recursive-lookup\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"When using Multiple files mode, this property defines if files must be listed recursively or not in the base directory.\",\n+                                \"displayName\": \"Recursive lookup\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"tailfile-recursive-lookup\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n                             }\n                         },\n+                        \"restricted\": true,\n                         \"sideEffectFree\": false,\n+                        \"stateful\": {\n+                            \"description\": \"Stores state about where in the Tailed File it left off so that on restart it does not have to duplicate data. State is stored either local or clustered depend on the <File Location> property.\",\n+                            \"scopes\": [\n+                                \"CLUSTER\",\n+                                \"LOCAL\"\n+                            ]\n+                        },\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"\",\n+                                \"description\": \"All FlowFiles are routed to this Relationship.\",\n                                 \"name\": \"success\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n-                        \"supportsBatching\": true,\n-                        \"supportsDynamicProperties\": true,\n+                        \"supportsBatching\": false,\n+                        \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"generate\",\n-                            \"load\",\n-                            \"random\",\n-                            \"test\"\n+                            \"file\",\n+                            \"log\",\n+                            \"source\",\n+                            \"tail\",\n+                            \"text\"\n                         ],\n-                        \"triggerSerially\": false,\n+                        \"triggerSerially\": true,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.standard.GenerateFlowFile\",\n-                        \"typeDescription\": \"This processor creates FlowFiles with random data or custom content. GenerateFlowFile is useful for load testing, configuration, and simulation. Also see DuplicateFlowFile for additional load testing.\",\n+                        \"type\": \"org.apache.nifi.processors.standard.TailFile\",\n+                        \"typeDescription\": \"\\\"Tails\\\" a file, or a list of files, ingesting data from the file as it is written to the file. The file is expected to be textual. Data is ingested only when a new line is encountered (carriage return or new-line character or combination). If the file to tail is periodically \\\"rolled over\\\", as is generally the case with log files, an optional Rolling Filename Pattern can be used to retrieve data from files that have rolled over, even if the rollover occurred while NiFi was not running (provided that the data still exists upon restart of NiFi). It is generally advisable to set the Run Schedule to a few seconds, rather than running with the default value of 0 secs, as this Processor will consume a lot of resources if scheduled very aggressively. At this time, this Processor does not support ingesting files that have been compressed when 'rolled over'.\",\n                         \"version\": \"1.27.0\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"Sets the MIME type of the output if the 'Mime Type' property is set\",\n-                                \"name\": \"mime.type\"\n+                                \"description\": \"Path of the original file the flow file comes from.\",\n+                                \"name\": \"tailfile.original.path\"\n                             }\n                         ]\n                     },\n                     {\n                         \"additionalDetails\": false,\n                         \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n+                            \"EVENT_DRIVEN\": 0,\n                             \"TIMER_DRIVEN\": 1\n                         },\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n                         \"dynamicProperties\": [\n                             {\n-                                \"description\": \"Custom properties define the generated record schema using configured field names and value data types in absence of the Schema Text property\",\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"name\": \"Field name in generated record\",\n-                                \"value\": \"Faker category for generated record values\"\n+                                \"description\": \"These XSLT parameters are passed to the transformer\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"name\": \"An XSLT transform parameter name\",\n+                                \"value\": \"An XSLT transform parameter value\"\n                             }\n                         ],\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"null-percentage\": {\n-                                \"defaultValue\": \"0\",\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"true\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Nullable Fields\",\n-                                        \"propertyName\": \"nullable-fields\"\n-                                    }\n-                                ],\n-                                \"description\": \"The percent probability (0-100%) that a generated value for any nullable field will be null. Set this property to zero to have no null values, or 100 to have all null values.\",\n-                                \"displayName\": \"Null Value Percentage\",\n+                            \"XSLT file name\": {\n+                                \"description\": \"Provides the name (including full path) of the XSLT file to apply to the FlowFile XML content.One of the 'XSLT file name' and 'XSLT Lookup' properties must be defined.\",\n+                                \"displayName\": \"XSLT file name\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"null-percentage\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"XSLT file name\",\n+                                \"required\": false,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"SINGLE\",\n+                                    \"resourceTypes\": [\n+                                        \"FILE\"\n+                                    ]\n+                                },\n+                                \"sensitive\": false\n+                            },\n+                            \"cache-size\": {\n+                                \"defaultValue\": \"10\",\n+                                \"description\": \"Maximum number of stylesheets to cache. Zero disables the cache.\",\n+                                \"displayName\": \"Cache size\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"cache-size\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"nullable-fields\": {\n+                            \"cache-ttl-after-last-access\": {\n+                                \"defaultValue\": \"60 secs\",\n+                                \"description\": \"The cache TTL (time-to-live) or how long to keep stylesheets in the cache after last access.\",\n+                                \"displayName\": \"Cache TTL after last access\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"cache-ttl-after-last-access\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"indent-output\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"true\",\n                                         \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"false\",\n                                         \"value\": \"false\"\n                                     }\n                                 ],\n                                 \"defaultValue\": \"true\",\n-                                \"description\": \"Whether the generated fields will be nullable. Note that this property is ignored if Schema Text is set. Also it only affects the schema of the generated data, not whether any values will be null. If this property is true, see 'Null Value Percentage' to set the probability that any generated field will be null.\",\n-                                \"displayName\": \"Nullable Fields\",\n+                                \"description\": \"Whether or not to indent the output.\",\n+                                \"displayName\": \"Indent\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"nullable-fields\",\n+                                \"name\": \"indent-output\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"number-of-records\": {\n-                                \"defaultValue\": \"100\",\n-                                \"description\": \"Specifies how many records will be generated for each outgoing FlowFile.\",\n-                                \"displayName\": \"Number of Records\",\n+                            \"secure-processing\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"true\",\n+                                \"description\": \"Whether or not to mitigate various XML-related attacks like XXE (XML External Entity) attacks.\",\n+                                \"displayName\": \"Secure processing\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"number-of-records\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"secure-processing\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"record-writer\": {\n-                                \"description\": \"Specifies the Controller Service to use for writing out the records\",\n-                                \"displayName\": \"Record Writer\",\n+                            \"xslt-controller\": {\n+                                \"description\": \"Controller lookup used to store XSLT definitions. One of the 'XSLT file name' and 'XSLT Lookup' properties must be defined. WARNING: note that the lookup controller service should not be used to store large XSLT files.\",\n+                                \"displayName\": \"XSLT Lookup\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"record-writer\",\n-                                \"required\": true,\n+                                \"name\": \"xslt-controller\",\n+                                \"required\": false,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n                                     \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n+                                    \"type\": \"org.apache.nifi.lookup.StringLookupService\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             },\n-                            \"schema-text\": {\n-                                \"description\": \"The text of an Avro-formatted Schema used to generate record data. If this property is set, any user-defined properties are ignored.\",\n-                                \"displayName\": \"Schema Text\",\n+                            \"xslt-controller-key\": {\n+                                \"description\": \"Key used to retrieve the XSLT definition from the XSLT lookup controller. This property must be set when using the XSLT controller property.\",\n+                                \"displayName\": \"XSLT Lookup key\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"schema-text\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"xslt-controller-key\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             }\n                         },\n-                        \"sideEffectFree\": false,\n+                        \"sideEffectFree\": true,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"FlowFiles that are successfully created will be routed to this relationship\",\n+                                \"description\": \"The FlowFile with transformed content will be routed to this relationship\",\n                                 \"name\": \"success\"\n+                            },\n+                            {\n+                                \"description\": \"If a FlowFile fails processing for any reason (for example, the FlowFile is not valid XML), it will be routed to this relationship\",\n+                                \"name\": \"failure\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n+                            \"CRON_DRIVEN\",\n+                            \"EVENT_DRIVEN\"\n                         ],\n                         \"supportsBatching\": true,\n                         \"supportsDynamicProperties\": true,\n                         \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": false,\n+                        \"supportsEventDriven\": true,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"fake\",\n-                            \"generate\",\n-                            \"random\",\n-                            \"test\"\n+                            \"transform\",\n+                            \"xml\",\n+                            \"xslt\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.standard.GenerateRecord\",\n-                        \"typeDescription\": \"This processor creates FlowFiles with records having random value for the specified fields. GenerateRecord is useful for testing, configuration, and simulation. It uses either user-defined properties to define a record schema or a provided schema and generates the specified number of records using random data for the fields in the schema.\",\n-                        \"version\": \"1.27.0\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"Sets the mime.type attribute to the MIME Type specified by the Record Writer\",\n-                                \"name\": \"mime.type\"\n-                            },\n-                            {\n-                                \"description\": \"The number of records in the FlowFile\",\n-                                \"name\": \"record.count\"\n-                            }\n-                        ]\n+                        \"type\": \"org.apache.nifi.processors.standard.TransformXml\",\n+                        \"typeDescription\": \"Applies the provided XSLT file to the FlowFile XML payload. A new FlowFile is created with transformed content and is routed to the 'success' relationship. If the XSL transform fails, the original FlowFile is routed to the 'failure' relationship\",\n+                        \"version\": \"1.27.0\"\n                     },\n                     {\n-                        \"additionalDetails\": true,\n+                        \"additionalDetails\": false,\n                         \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n+                            \"EVENT_DRIVEN\": 0,\n                             \"TIMER_DRIVEN\": 1\n                         },\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n-                        \"dynamicProperties\": [\n-                            {\n-                                \"description\": \"Specifies an initial max value for max value columns. Properties should be added in the format `initial.maxvalue.<max_value_column>`. This value is only used the first time the table is accessed (when a Maximum Value Column is specified). In the case of incoming connections, the value is only used the first time for each table specified in the FlowFiles.\",\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"name\": \"initial.maxvalue.<max_value_column>\",\n-                                \"value\": \"Initial maximum value for the specified column\"\n-                            }\n-                        ],\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_ALLOWED\",\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Columns to Return\": {\n-                                \"description\": \"A comma-separated list of column names to be used in the query. If your database requires special treatment of the names (quoting, e.g.), each name should include such treatment. If no column names are supplied, all columns in the specified table will be returned. NOTE: It is important to use consistent column names for a given table for incremental fetch to work properly.\",\n-                                \"displayName\": \"Columns to Return\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Columns to Return\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Database Connection Pooling Service\": {\n-                                \"description\": \"The Controller Service that is used to obtain a connection to the database.\",\n-                                \"displayName\": \"Database Connection Pooling Service\",\n+                            \"File Filter\": {\n+                                \"defaultValue\": \".*\",\n+                                \"description\": \"Only files contained in the archive whose names match the given regular expression will be extracted (tar/zip only)\",\n+                                \"displayName\": \"File Filter\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Database Connection Pooling Service\",\n-                                \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.dbcp.DBCPService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            },\n-                            \"Max Wait Time\": {\n-                                \"defaultValue\": \"0 seconds\",\n-                                \"description\": \"The maximum amount of time allowed for a running SQL select query , zero means there is no limit. Max time less than 1 second will be equal to zero.\",\n-                                \"displayName\": \"Max Wait Time\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Max Wait Time\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Maximum-value Columns\": {\n-                                \"description\": \"A comma-separated list of column names. The processor will keep track of the maximum value for each column that has been returned since the processor started running. Using multiple columns implies an order to the column list, and each column's values are expected to increase more slowly than the previous columns' values. Thus, using multiple columns implies a hierarchical structure of columns, which is usually used for partitioning tables. This processor can be used to retrieve only those rows that have been added/updated since the last retrieval. Note that some JDBC types such as bit/boolean are not conducive to maintaining maximum value, so columns of these types should not be listed in this property, and will result in error(s) during processing. If no columns are provided, all rows from the table will be considered, which could have a performance impact. NOTE: It is important to use consistent max-value column names for a given table for incremental fetch to work properly.\",\n-                                \"displayName\": \"Maximum-value Columns\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Maximum-value Columns\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Table Name\": {\n-                                \"description\": \"The name of the database table to be queried.\",\n-                                \"displayName\": \"Table Name\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Table Name\",\n+                                \"name\": \"File Filter\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"db-fetch-db-type\": {\n+                            \"Packaging Format\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Generates ANSI SQL\",\n-                                        \"displayName\": \"Generic\",\n-                                        \"value\": \"Generic\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Generates Oracle compliant SQL\",\n-                                        \"displayName\": \"Oracle\",\n-                                        \"value\": \"Oracle\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Generates Oracle compliant SQL for version 12 or greater\",\n-                                        \"displayName\": \"Oracle 12+\",\n-                                        \"value\": \"Oracle 12+\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"use mime.type attribute\",\n+                                        \"value\": \"use mime.type attribute\"\n                                     },\n                                     {\n-                                        \"description\": \"Generates MS SQL Compatible SQL, for version 2012 or greater\",\n-                                        \"displayName\": \"MS SQL 2012+\",\n-                                        \"value\": \"MS SQL 2012+\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"tar\",\n+                                        \"value\": \"tar\"\n                                     },\n                                     {\n-                                        \"description\": \"Generates MS SQL Compatible SQL for version 2008\",\n-                                        \"displayName\": \"MS SQL 2008\",\n-                                        \"value\": \"MS SQL 2008\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"zip\",\n+                                        \"value\": \"zip\"\n                                     },\n                                     {\n-                                        \"description\": \"Generates MySQL compatible SQL\",\n-                                        \"displayName\": \"MySQL\",\n-                                        \"value\": \"MySQL\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"flowfile-stream-v3\",\n+                                        \"value\": \"flowfile-stream-v3\"\n                                     },\n                                     {\n-                                        \"description\": \"Generates PostgreSQL compatible SQL\",\n-                                        \"displayName\": \"PostgreSQL\",\n-                                        \"value\": \"PostgreSQL\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"flowfile-stream-v2\",\n+                                        \"value\": \"flowfile-stream-v2\"\n                                     },\n                                     {\n-                                        \"description\": \"Generates Phoenix compliant SQL\",\n-                                        \"displayName\": \"Phoenix\",\n-                                        \"value\": \"Phoenix\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"flowfile-tar-v1\",\n+                                        \"value\": \"flowfile-tar-v1\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"Generic\",\n-                                \"description\": \"The type/flavor of database, used for generating database-specific code. In many cases the Generic type should suffice, but some databases (such as Oracle) require custom SQL clauses. \",\n-                                \"displayName\": \"Database Type\",\n+                                \"defaultValue\": \"use mime.type attribute\",\n+                                \"description\": \"The Packaging Format used to create the file\",\n+                                \"displayName\": \"Packaging Format\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"db-fetch-db-type\",\n+                                \"name\": \"Packaging Format\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"db-fetch-where-clause\": {\n-                                \"description\": \"A custom clause to be added in the WHERE condition when building SQL queries.\",\n-                                \"displayName\": \"Additional WHERE clause\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"db-fetch-where-clause\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"gen-table-column-for-val-partitioning\": {\n-                                \"description\": \"The name of a column whose values will be used for partitioning. The default behavior is to use row numbers on the result set for partitioning into 'pages' to be fetched from the database, using an offset/limit strategy. However for certain databases, it can be more efficient under the right circumstances to use the column values themselves to define the 'pages'. This property should only be used when the default queries are not performing well, when there is no maximum-value column or a single maximum-value column whose type can be coerced to a long integer (i.e. not date or timestamp), and the column values are evenly distributed and not sparse, for best performance.\",\n-                                \"displayName\": \"Column for Value Partitioning\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"gen-table-column-for-val-partitioning\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"gen-table-custom-orderby-column\": {\n-                                \"description\": \"The name of a column to be used for ordering the results if Max-Value Columns are not provided and partitioning is enabled. This property is ignored if either Max-Value Columns is set or Partition Size = 0. NOTE: If neither Max-Value Columns nor Custom ORDER BY Column is set, then depending on the the database/driver, the processor may report an error and/or the generated SQL may result in missing and/or duplicate rows. This is because without an explicit ordering, fetching each partition is done using an arbitrary ordering.\",\n-                                \"displayName\": \"Custom ORDER BY Column\",\n+                            \"Password\": {\n+                                \"description\": \"Password used for decrypting Zip archives encrypted with ZipCrypto or AES. Configuring a password disables support for alternative Zip compression algorithms.\",\n+                                \"displayName\": \"Password\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"gen-table-custom-orderby-column\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Password\",\n                                 \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"gen-table-fetch-partition-size\": {\n-                                \"defaultValue\": \"10000\",\n-                                \"description\": \"The number of result rows to be fetched by each generated SQL statement. The total number of rows in the table divided by the partition size gives the number of SQL statements (i.e. FlowFiles) generated. A value of zero indicates that a single FlowFile is to be generated whose SQL statement will fetch all rows in the table.\",\n-                                \"displayName\": \"Partition Size\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"gen-table-fetch-partition-size\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n+                                \"sensitive\": true\n                             },\n-                            \"gen-table-output-flowfile-on-zero-results\": {\n+                            \"allow-stored-entries-wdd\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"true\",\n                                         \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"false\",\n                                         \"value\": \"false\"\n                                     }\n                                 ],\n                                 \"defaultValue\": \"false\",\n-                                \"description\": \"Depending on the specified properties, an execution of this processor may not result in any SQL statements generated. When this property is true, an empty FlowFile will be generated (having the parent of the incoming FlowFile if present) and transferred to the 'success' relationship. When this property is false, no output FlowFiles will be generated.\",\n-                                \"displayName\": \"Output Empty FlowFile on Zero Results\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"zip\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Packaging Format\",\n+                                        \"propertyName\": \"Packaging Format\"\n+                                    }\n+                                ],\n+                                \"description\": \"Some zip archives contain stored entries with data descriptors which by spec should not happen.  If this property is true they will be read anyway.  If false and such an entry is discovered the zip will fail to process.\",\n+                                \"displayName\": \"Allow Stored Entries With Data Descriptor\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"gen-table-output-flowfile-on-zero-results\",\n+                                \"name\": \"allow-stored-entries-wdd\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             }\n                         },\n+                        \"readsAttributes\": [\n+                            {\n+                                \"description\": \"If the <Packaging Format> property is set to use mime.type attribute, this attribute is used to determine the FlowFile's MIME Type. In this case, if the attribute is set to application/tar, the TAR Packaging Format will be used. If the attribute is set to application/zip, the ZIP Packaging Format will be used. If the attribute is set to application/flowfile-v3 or application/flowfile-v2 or application/flowfile-v1, the appropriate FlowFile Packaging Format will be used. If this attribute is missing, the FlowFile will be routed to 'failure'. Otherwise, if the attribute's value is not one of those mentioned above, the FlowFile will be routed to 'success' without being unpacked. Use the File Filter property only extract files matching a specific regular expression.\",\n+                                \"name\": \"mime.type\"\n+                            }\n+                        ],\n                         \"seeAlso\": [\n-                            \"org.apache.nifi.processors.standard.ExecuteSQL\",\n-                            \"org.apache.nifi.processors.standard.ListDatabaseTables\",\n-                            \"org.apache.nifi.processors.standard.QueryDatabaseTable\"\n+                            \"org.apache.nifi.processors.standard.MergeContent\"\n                         ],\n-                        \"sideEffectFree\": false,\n-                        \"stateful\": {\n-                            \"description\": \"After performing a query on the specified table, the maximum values for the specified column(s) will be retained for use in future executions of the query. This allows the Processor to fetch only those records that have max values greater than the retained values. This can be used for incremental fetching, fetching of newly added rows, etc. To clear the maximum values, clear the state of the processor per the State Management documentation\",\n-                            \"scopes\": [\n-                                \"CLUSTER\"\n-                            ]\n-                        },\n+                        \"sideEffectFree\": true,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"Successfully created FlowFile from SQL query result set.\",\n+                                \"description\": \"Unpacked FlowFiles are sent to this relationship\",\n                                 \"name\": \"success\"\n                             },\n                             {\n-                                \"description\": \"This relationship is only used when SQL query execution (using an incoming FlowFile) failed. The incoming FlowFile will be penalized and routed to this relationship. If no incoming connection(s) are specified, this relationship is unused.\",\n+                                \"description\": \"The original FlowFile is sent to this relationship when it cannot be unpacked for some reason\",\n                                 \"name\": \"failure\"\n+                            },\n+                            {\n+                                \"description\": \"The original FlowFile is sent to this relationship after it has been successfully unpacked\",\n+                                \"name\": \"original\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n+                            \"CRON_DRIVEN\",\n+                            \"EVENT_DRIVEN\"\n                         ],\n-                        \"supportsBatching\": false,\n-                        \"supportsDynamicProperties\": true,\n+                        \"supportsBatching\": true,\n+                        \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": false,\n+                        \"supportsEventDriven\": true,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"database\",\n-                            \"fetch\",\n-                            \"generate\",\n-                            \"jdbc\",\n-                            \"query\",\n-                            \"select\",\n-                            \"sql\"\n+                            \"Unpack\",\n+                            \"archive\",\n+                            \"flowfile-stream\",\n+                            \"flowfile-stream-v3\",\n+                            \"tar\",\n+                            \"un-merge\",\n+                            \"zip\"\n                         ],\n-                        \"triggerSerially\": true,\n+                        \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.standard.GenerateTableFetch\",\n-                        \"typeDescription\": \"Generates SQL select queries that fetch \\\"pages\\\" of rows from a table. The partition size property, along with the table's row count, determine the size and number of pages and generated FlowFiles. In addition, incremental fetching can be achieved by setting Maximum-Value Columns, which causes the processor to track the columns' maximum values, thus only fetching rows whose columns' values exceed the observed maximums. This processor is intended to be run on the Primary Node only.\\n\\nThis processor can accept incoming connections; the behavior of the processor is different whether incoming connections are provided:\\n  - If no incoming connection(s) are specified, the processor will generate SQL queries on the specified processor schedule. Expression Language is supported for many fields, but no FlowFile attributes are available. However the properties will be evaluated using the Variable Registry.\\n  - If incoming connection(s) are specified and no FlowFile is available to a processor task, no work will be performed.\\n  - If incoming connection(s) are specified and a FlowFile is available to a processor task, the FlowFile's attributes may be used in Expression Language for such fields as Table Name and others. However, the Max-Value Columns and Columns to Return fields must be empty or refer to columns that are available in each specified table.\",\n+                        \"type\": \"org.apache.nifi.processors.standard.UnpackContent\",\n+                        \"typeDescription\": \"Unpacks the content of FlowFiles that have been packaged with one of several different Packaging Formats, emitting one to many FlowFiles for each input FlowFile. Supported formats are TAR, ZIP, and FlowFile Stream packages.\",\n                         \"version\": \"1.27.0\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"If the processor has incoming connections, and processing an incoming FlowFile causes a SQL Exception, the FlowFile is routed to failure and this attribute is set to the exception message.\",\n-                                \"name\": \"generatetablefetch.sql.error\"\n+                                \"description\": \"If the FlowFile is successfully unpacked, its MIME Type is no longer known, so the mime.type attribute is set to application/octet-stream.\",\n+                                \"name\": \"mime.type\"\n                             },\n                             {\n-                                \"description\": \"The name of the database table to be queried.\",\n-                                \"name\": \"generatetablefetch.tableName\"\n+                                \"description\": \"All unpacked FlowFiles produced from the same parent FlowFile will have the same randomly generated UUID added for this attribute\",\n+                                \"name\": \"fragment.identifier\"\n                             },\n                             {\n-                                \"description\": \"The comma-separated list of column names used in the query.\",\n-                                \"name\": \"generatetablefetch.columnNames\"\n+                                \"description\": \"A one-up number that indicates the ordering of the unpacked FlowFiles that were created from a single parent FlowFile\",\n+                                \"name\": \"fragment.index\"\n                             },\n                             {\n-                                \"description\": \"Where clause used in the query to get the expected rows.\",\n-                                \"name\": \"generatetablefetch.whereClause\"\n+                                \"description\": \"The number of unpacked FlowFiles generated from the parent FlowFile\",\n+                                \"name\": \"fragment.count\"\n                             },\n                             {\n-                                \"description\": \"The comma-separated list of column names used to keep track of data that has been returned since the processor started running.\",\n-                                \"name\": \"generatetablefetch.maxColumnNames\"\n+                                \"description\": \"The filename of the parent FlowFile. Extensions of .tar, .zip or .pkg are removed because the MergeContent processor automatically adds those extensions if it is used to rebuild the original FlowFile\",\n+                                \"name\": \"segment.original.filename \"\n                             },\n                             {\n-                                \"description\": \"The number of result rows to be fetched by the SQL statement.\",\n-                                \"name\": \"generatetablefetch.limit\"\n+                                \"description\": \"The date and time that the unpacked file was last modified (tar only).\",\n+                                \"name\": \"file.lastModifiedTime\"\n                             },\n                             {\n-                                \"description\": \"Offset to be used to retrieve the corresponding partition.\",\n-                                \"name\": \"generatetablefetch.offset\"\n+                                \"description\": \"The date and time that the file was created. This attribute holds always the same value as file.lastModifiedTime (tar only).\",\n+                                \"name\": \"file.creationTime\"\n                             },\n                             {\n-                                \"description\": \"All FlowFiles generated from the same query result set will have the same value for the fragment.identifier attribute. This can then be used to correlate the results.\",\n-                                \"name\": \"fragment.identifier\"\n+                                \"description\": \"The owner of the unpacked file (tar only)\",\n+                                \"name\": \"file.owner\"\n                             },\n                             {\n-                                \"description\": \"This is the total number of  FlowFiles produced by a single ResultSet. This can be used in conjunction with the fragment.identifier attribute in order to know how many FlowFiles belonged to the same incoming ResultSet.\",\n-                                \"name\": \"fragment.count\"\n+                                \"description\": \"The group owner of the unpacked file (tar only)\",\n+                                \"name\": \"file.group\"\n                             },\n                             {\n-                                \"description\": \"This is the position of this FlowFile in the list of outgoing FlowFiles that were all generated from the same execution. This can be used in conjunction with the fragment.identifier attribute to know which FlowFiles originated from the same execution and in what order  FlowFiles were produced\",\n-                                \"name\": \"fragment.index\"\n+                                \"description\": \"The read/write/execute permissions of the unpacked file (tar only)\",\n+                                \"name\": \"file.permissions\"\n+                            },\n+                            {\n+                                \"description\": \"The encryption method for entries in Zip archives\",\n+                                \"name\": \"file.encryptionMethod\"\n                             }\n                         ]\n                     },\n                     {\n                         \"additionalDetails\": false,\n                         \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n@@ -104058,764 +104480,759 @@\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Connection Mode\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Active\",\n-                                        \"value\": \"Active\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Passive\",\n-                                        \"value\": \"Passive\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"Passive\",\n-                                \"description\": \"The FTP Connection Mode\",\n-                                \"displayName\": \"Connection Mode\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Connection Mode\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Connection Timeout\": {\n-                                \"defaultValue\": \"30 sec\",\n-                                \"description\": \"Amount of time to wait before timing out while creating a connection\",\n-                                \"displayName\": \"Connection Timeout\",\n+                            \"counter-name\": {\n+                                \"description\": \"The name of the counter you want to set the value of - supports expression language like ${counterName}\",\n+                                \"displayName\": \"Counter Name\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Connection Timeout\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"counter-name\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Data Timeout\": {\n-                                \"defaultValue\": \"30 sec\",\n-                                \"description\": \"When transferring a file between the local and remote system, this value specifies how long is allowed to elapse without any data being transferred between systems\",\n-                                \"displayName\": \"Data Timeout\",\n+                            \"delta\": {\n+                                \"defaultValue\": \"1\",\n+                                \"description\": \"Adjusts the counter by the specified delta for each flow file received. May be a positive or negative integer.\",\n+                                \"displayName\": \"Delta\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Data Timeout\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"delta\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n-                            },\n-                            \"Delete Original\": {\n+                            }\n+                        },\n+                        \"readsAttributes\": [\n+                            {\n+                                \"description\": \"The name of the counter to update/get.\",\n+                                \"name\": \"counterName\"\n+                            }\n+                        ],\n+                        \"sideEffectFree\": false,\n+                        \"supportedRelationships\": [\n+                            {\n+                                \"description\": \"Counter was updated/retrieved\",\n+                                \"name\": \"success\"\n+                            }\n+                        ],\n+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\"\n+                        ],\n+                        \"supportsBatching\": false,\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicRelationships\": false,\n+                        \"supportsEventDriven\": false,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"counter\",\n+                            \"debug\",\n+                            \"instrumentation\"\n+                        ],\n+                        \"triggerSerially\": false,\n+                        \"triggerWhenAnyDestinationAvailable\": false,\n+                        \"triggerWhenEmpty\": false,\n+                        \"type\": \"org.apache.nifi.processors.standard.UpdateCounter\",\n+                        \"typeDescription\": \"This processor allows users to set specific counters and key points in their flow. It is useful for debugging and basic counting functions.\",\n+                        \"version\": \"1.27.0\"\n+                    },\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-standard-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"e0c4461\"\n+                        },\n+                        \"defaultBulletinLevel\": \"WARN\",\n+                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": 1,\n+                            \"TIMER_DRIVEN\": 1\n+                        },\n+                        \"defaultPenaltyDuration\": \"30 sec\",\n+                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": \"* * * * * ?\",\n+                            \"TIMER_DRIVEN\": \"0 sec\"\n+                        },\n+                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n+                        \"defaultYieldDuration\": \"1 sec\",\n+                        \"group\": \"org.apache.nifi\",\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n+                        \"primaryNodeOnly\": false,\n+                        \"propertyDescriptors\": {\n+                            \"db-type\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"description\": \"Generates ANSI SQL\",\n+                                        \"displayName\": \"Generic\",\n+                                        \"value\": \"Generic\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"description\": \"Generates Oracle compliant SQL\",\n+                                        \"displayName\": \"Oracle\",\n+                                        \"value\": \"Oracle\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Generates Oracle compliant SQL for version 12 or greater\",\n+                                        \"displayName\": \"Oracle 12+\",\n+                                        \"value\": \"Oracle 12+\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Generates MS SQL Compatible SQL, for version 2012 or greater\",\n+                                        \"displayName\": \"MS SQL 2012+\",\n+                                        \"value\": \"MS SQL 2012+\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Generates MS SQL Compatible SQL for version 2008\",\n+                                        \"displayName\": \"MS SQL 2008\",\n+                                        \"value\": \"MS SQL 2008\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Generates MySQL compatible SQL\",\n+                                        \"displayName\": \"MySQL\",\n+                                        \"value\": \"MySQL\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Generates PostgreSQL compatible SQL\",\n+                                        \"displayName\": \"PostgreSQL\",\n+                                        \"value\": \"PostgreSQL\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Generates Phoenix compliant SQL\",\n+                                        \"displayName\": \"Phoenix\",\n+                                        \"value\": \"Phoenix\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"true\",\n-                                \"description\": \"Determines whether or not the file is deleted from the remote system after it has been successfully transferred\",\n-                                \"displayName\": \"Delete Original\",\n+                                \"defaultValue\": \"Generic\",\n+                                \"description\": \"The type/flavor of database, used for generating database-specific code. In many cases the Generic type should suffice, but some databases (such as Oracle) require custom SQL clauses.\",\n+                                \"displayName\": \"Database Type\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Delete Original\",\n-                                \"required\": true,\n+                                \"name\": \"db-type\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"File Filter Regex\": {\n-                                \"description\": \"Provides a Java Regular Expression for filtering Filenames; if a filter is supplied, only files whose names match that Regular Expression will be fetched\",\n-                                \"displayName\": \"File Filter Regex\",\n+                            \"record-reader\": {\n+                                \"description\": \"The service for reading incoming flow files. The reader is only used to determine the schema of the records, the actual records will not be processed.\",\n+                                \"displayName\": \"Record Reader\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"File Filter Regex\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n+                                \"name\": \"record-reader\",\n+                                \"required\": true,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n                             },\n-                            \"Hostname\": {\n-                                \"description\": \"The fully qualified hostname or IP address of the remote system\",\n-                                \"displayName\": \"Hostname\",\n+                            \"updatedatabasetable-catalog-name\": {\n+                                \"description\": \"The name of the catalog that the statement should update. This may not apply for the database that you are updating. In this case, leave the field empty. Note that if the property is set and the database is case-sensitive, the catalog name must match the database's catalog name exactly.\",\n+                                \"displayName\": \"Catalog Name\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Hostname\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Http Proxy Password\": {\n-                                \"description\": \"Http Proxy Password\",\n-                                \"displayName\": \"Http Proxy Password\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Http Proxy Password\",\n-                                \"required\": false,\n-                                \"sensitive\": true\n-                            },\n-                            \"Http Proxy Username\": {\n-                                \"description\": \"Http Proxy Username\",\n-                                \"displayName\": \"Http Proxy Username\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Http Proxy Username\",\n+                                \"name\": \"updatedatabasetable-catalog-name\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Ignore Dotted Files\": {\n+                            \"updatedatabasetable-create-table\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"description\": \"Create a table with the given schema if it does not already exist\",\n+                                        \"displayName\": \"Create If Not Exists\",\n+                                        \"value\": \"Create If Not Exists\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"description\": \"If the target does not already exist, log an error and route the flowfile to failure\",\n+                                        \"displayName\": \"Fail If Not Exists\",\n+                                        \"value\": \"Fail If Not Exists\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"true\",\n-                                \"description\": \"If true, files whose names begin with a dot (\\\".\\\") will be ignored\",\n-                                \"displayName\": \"Ignore Dotted Files\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Ignore Dotted Files\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Internal Buffer Size\": {\n-                                \"defaultValue\": \"16KB\",\n-                                \"description\": \"Set the internal buffer size for buffered data streams\",\n-                                \"displayName\": \"Internal Buffer Size\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Internal Buffer Size\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Max Selects\": {\n-                                \"defaultValue\": \"100\",\n-                                \"description\": \"The maximum number of files to pull in a single connection\",\n-                                \"displayName\": \"Max Selects\",\n+                                \"defaultValue\": \"Fail If Not Exists\",\n+                                \"description\": \"Specifies how to process the target table when it does not exist (create it, fail, e.g.).\",\n+                                \"displayName\": \"Create Table Strategy\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Max Selects\",\n+                                \"name\": \"updatedatabasetable-create-table\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Password\": {\n-                                \"description\": \"Password for the user account\",\n-                                \"displayName\": \"Password\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Password\",\n-                                \"required\": false,\n-                                \"sensitive\": true\n-                            },\n-                            \"Path Filter Regex\": {\n-                                \"description\": \"When Search Recursively is true, then only subdirectories whose path matches the given Regular Expression will be scanned\",\n-                                \"displayName\": \"Path Filter Regex\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Path Filter Regex\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Polling Interval\": {\n-                                \"defaultValue\": \"60 sec\",\n-                                \"description\": \"Determines how long to wait between fetching the listing for new files\",\n-                                \"displayName\": \"Polling Interval\",\n+                            \"updatedatabasetable-dbcp-service\": {\n+                                \"description\": \"The Controller Service that is used to obtain connection(s) to the database\",\n+                                \"displayName\": \"Database Connection Pooling Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Polling Interval\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Port\": {\n-                                \"defaultValue\": \"21\",\n-                                \"description\": \"The port that the remote system is listening on for file transfers\",\n-                                \"displayName\": \"Port\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Port\",\n+                                \"name\": \"updatedatabasetable-dbcp-service\",\n                                 \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Proxy Host\": {\n-                                \"description\": \"The fully qualified hostname or IP address of the proxy server\",\n-                                \"displayName\": \"Proxy Host\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Proxy Host\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Proxy Port\": {\n-                                \"description\": \"The port of the proxy server\",\n-                                \"displayName\": \"Proxy Port\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Proxy Port\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.dbcp.DBCPService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n                             },\n-                            \"Proxy Type\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"DIRECT\",\n-                                        \"value\": \"DIRECT\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"HTTP\",\n-                                        \"value\": \"HTTP\"\n-                                    },\n+                            \"updatedatabasetable-primary-keys\": {\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"SOCKS\",\n-                                        \"value\": \"SOCKS\"\n+                                        \"dependentValues\": [\n+                                            \"Create If Not Exists\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Create Table Strategy\",\n+                                        \"propertyName\": \"updatedatabasetable-create-table\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"DIRECT\",\n-                                \"description\": \"Proxy type used for file transfers\",\n-                                \"displayName\": \"Proxy Type\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Proxy Type\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Remote Path\": {\n-                                \"description\": \"The path on the remote system from which to pull or push files\",\n-                                \"displayName\": \"Remote Path\",\n+                                \"description\": \"A comma-separated list of record field names that uniquely identifies a row in the database. This property is only used if the specified table needs to be created, in which case the Primary Key Fields will be used to specify the primary keys of the newly-created table. IMPORTANT: Primary Key Fields must match the record field names exactly unless 'Quote Column Identifiers' is false and the database allows for case-insensitive column names. In practice it is best to specify Primary Key Fields that exactly match the record field names, and those will become the column names in the created table.\",\n+                                \"displayName\": \"Primary Key Fields\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Remote Path\",\n+                                \"name\": \"updatedatabasetable-primary-keys\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Remote Poll Batch Size\": {\n-                                \"defaultValue\": \"5000\",\n-                                \"description\": \"The value specifies how many file paths to find in a given directory on the remote system when doing a file listing. This value in general should not need to be modified but when polling against a remote system with a tremendous number of files this value can be critical.  Setting this value too high can result very poor performance and setting it too low can cause the flow to be slower than normal.\",\n-                                \"displayName\": \"Remote Poll Batch Size\",\n+                            \"updatedatabasetable-query-timeout\": {\n+                                \"defaultValue\": \"0\",\n+                                \"description\": \"Sets the number of seconds the driver will wait for a query to execute. A value of 0 means no timeout. NOTE: Non-zero values may not be supported by the driver.\",\n+                                \"displayName\": \"Query Timeout\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Remote Poll Batch Size\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"updatedatabasetable-query-timeout\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Search Recursively\": {\n+                            \"updatedatabasetable-quoted-column-identifiers\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"true\",\n                                         \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"false\",\n                                         \"value\": \"false\"\n                                     }\n                                 ],\n                                 \"defaultValue\": \"false\",\n-                                \"description\": \"If true, will pull files from arbitrarily nested subdirectories; otherwise, will not traverse subdirectories\",\n-                                \"displayName\": \"Search Recursively\",\n+                                \"description\": \"Enabling this option will cause all column names to be quoted, allowing you to use reserved words as column names in your tables and/or forcing the record field names to match the column names exactly.\",\n+                                \"displayName\": \"Quote Column Identifiers\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Search Recursively\",\n-                                \"required\": true,\n+                                \"name\": \"updatedatabasetable-quoted-column-identifiers\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Transfer Mode\": {\n+                            \"updatedatabasetable-quoted-table-identifiers\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"Binary\",\n-                                        \"value\": \"Binary\"\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"ASCII\",\n-                                        \"value\": \"ASCII\"\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"Binary\",\n-                                \"description\": \"The FTP Transfer Mode\",\n-                                \"displayName\": \"Transfer Mode\",\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"Enabling this option will cause the table name to be quoted to support the use of special characters in the table name and/or forcing the value of the Table Name property to match the target table name exactly.\",\n+                                \"displayName\": \"Quote Table Identifiers\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Transfer Mode\",\n+                                \"name\": \"updatedatabasetable-quoted-table-identifiers\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Use Natural Ordering\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n+                            \"updatedatabasetable-record-writer\": {\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"dependentValues\": [\n+                                            \"true\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Update Field Names\",\n+                                        \"propertyName\": \"updatedatabasetable-update-field-names\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"If true, will pull files in the order in which they are naturally listed; otherwise, the order in which the files will be pulled is not defined\",\n-                                \"displayName\": \"Use Natural Ordering\",\n+                                \"description\": \"Specifies the Controller Service to use for writing results to a FlowFile. The Record Writer should use Inherit Schema to emulate the inferred schema behavior, i.e. an explicit schema need not be defined in the writer, and will be supplied by the same logic used to infer the schema from the column types. If Create Table Strategy is set 'Create If Not Exists', the Record Writer's output format must match the Record Reader's format in order for the data to be placed in the created table location. Note that this property is only used if 'Update Field Names' is set to true and the field names do not all match the column names exactly. If no update is needed for any field names (or 'Update Field Names' is false), the Record Writer is not used and instead the input FlowFile is routed to success or failure without modification.\",\n+                                \"displayName\": \"Record Writer\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Use Natural Ordering\",\n+                                \"name\": \"updatedatabasetable-record-writer\",\n                                 \"required\": true,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"updatedatabasetable-schema-name\": {\n+                                \"description\": \"The name of the database schema that the table belongs to. This may not apply for the database that you are updating. In this case, leave the field empty. Note that if the property is set and the database is case-sensitive, the schema name must match the database's schema name exactly.\",\n+                                \"displayName\": \"Schema Name\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"updatedatabasetable-schema-name\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Username\": {\n-                                \"description\": \"Username\",\n-                                \"displayName\": \"Username\",\n+                            \"updatedatabasetable-table-name\": {\n+                                \"description\": \"The name of the database table to update. If the table does not exist, then it will either be created or an error thrown, depending on the value of the Create Table property.\",\n+                                \"displayName\": \"Table Name\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Username\",\n+                                \"name\": \"updatedatabasetable-table-name\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"follow-symlink\": {\n+                            \"updatedatabasetable-translate-field-names\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"true\",\n                                         \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"false\",\n                                         \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"If true, will pull even symbolic files and also nested symbolic subdirectories; otherwise, will not read symbolic files and will not traverse symbolic link subdirectories\",\n-                                \"displayName\": \"Follow symlink\",\n+                                \"defaultValue\": \"true\",\n+                                \"description\": \"If true, the Processor will attempt to translate field names into the corresponding column names for the table specified, for the purposes of determining whether the field name exists as a column in the target table. NOTE: If the target table does not exist and is to be created, this property is ignored and the field names will be used as-is. If false, the field names must match the column names exactly, or the column may not be found and instead an error my be reported that the column already exists.\",\n+                                \"displayName\": \"Translate Field Names\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"follow-symlink\",\n+                                \"name\": \"updatedatabasetable-translate-field-names\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"ftp-use-utf8\": {\n+                            \"updatedatabasetable-update-field-names\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"true\",\n                                         \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"false\",\n                                         \"value\": \"false\"\n                                     }\n                                 ],\n                                 \"defaultValue\": \"false\",\n-                                \"description\": \"Tells the client to use UTF-8 encoding when processing files and filenames. If set to true, the server must also support UTF-8 encoding.\",\n-                                \"displayName\": \"Use UTF-8 Encoding\",\n+                                \"description\": \"This property indicates whether to update the output schema such that the field names are set to the exact column names from the specified table. This should be used if the incoming record field names may not match the table's column names in terms of upper- and lower-case. For example, this property should be set to true if the output FlowFile is destined for Oracle e.g., which expects the field names to match the column names exactly. NOTE: The value of the 'Translate Field Names' property is ignored when updating field names; instead they are updated to match the column name as returned by the database.\",\n+                                \"displayName\": \"Update Field Names\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"ftp-use-utf8\",\n+                                \"name\": \"updatedatabasetable-update-field-names\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n-                            },\n-                            \"proxy-configuration-service\": {\n-                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests. If set, it supersedes proxy settings configured per component. Supported proxies: SOCKS + AuthN, HTTP + AuthN\",\n-                                \"displayName\": \"Proxy Configuration Service\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"proxy-configuration-service\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.proxy.ProxyConfigurationService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n                             }\n                         },\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.processors.standard.PutFTP\"\n-                        ],\n                         \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"All FlowFiles that are received are routed to success\",\n+                                \"description\": \"A FlowFile containing records routed to this relationship after the record has been successfully transmitted to the database.\",\n                                 \"name\": \"success\"\n+                            },\n+                            {\n+                                \"description\": \"A FlowFile containing records routed to this relationship if the record could not be transmitted to the database.\",\n+                                \"name\": \"failure\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n                         \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"FTP\",\n-                            \"fetch\",\n-                            \"files\",\n-                            \"get\",\n-                            \"ingest\",\n-                            \"input\",\n-                            \"remote\",\n-                            \"retrieve\",\n-                            \"source\"\n+                            \"alter\",\n+                            \"database\",\n+                            \"jdbc\",\n+                            \"metadata\",\n+                            \"table\",\n+                            \"update\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.standard.GetFTP\",\n-                        \"typeDescription\": \"Fetches files from an FTP Server and creates FlowFiles from them\",\n+                        \"type\": \"org.apache.nifi.processors.standard.UpdateDatabaseTable\",\n+                        \"typeDescription\": \"This processor uses a JDBC connection and incoming records to generate any database table changes needed to support the incoming records. It expects a 'flat' record layout, meaning none of the top-level record fields has nested fields that are intended to become columns themselves.\",\n                         \"version\": \"1.27.0\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"The filename is set to the name of the file on the remote server\",\n-                                \"name\": \"filename\"\n-                            },\n-                            {\n-                                \"description\": \"The path is set to the path of the file's directory on the remote server. For example, if the <Remote Path> property is set to /tmp, files picked up from /tmp will have the path attribute set to /tmp. If the <Search Recursively> property is set to true and a file is picked up from /tmp/abc/1/2/3, then the path attribute will be set to /tmp/abc/1/2/3\",\n-                                \"name\": \"path\"\n-                            },\n-                            {\n-                                \"description\": \"The date and time that the source file was last modified\",\n-                                \"name\": \"file.lastModifiedTime\"\n-                            },\n-                            {\n-                                \"description\": \"The date and time that the file was last accessed. May not work on all file systems\",\n-                                \"name\": \"file.lastAccessTime\"\n-                            },\n-                            {\n-                                \"description\": \"The numeric owner id of the source file\",\n-                                \"name\": \"file.owner\"\n+                                \"description\": \"This attribute is written on the flow files routed to the 'success' and 'failure' relationships, and contains the target table name.\",\n+                                \"name\": \"output.table\"\n                             },\n                             {\n-                                \"description\": \"The numeric group id of the source file\",\n-                                \"name\": \"file.group\"\n+                                \"description\": \"This attribute is written on the flow files routed to the 'success' and 'failure' relationships, and contains the path on the file system to the table (or partition location if the table is partitioned).\",\n+                                \"name\": \"output.path\"\n                             },\n                             {\n-                                \"description\": \"The read/write/execute permissions of the source file\",\n-                                \"name\": \"file.permissions\"\n+                                \"description\": \"Sets the mime.type attribute to the MIME Type specified by the Record Writer, only if a Record Writer is specified and Update Field Names is 'true'.\",\n+                                \"name\": \"mime.type\"\n                             },\n                             {\n-                                \"description\": \"The full/absolute path from where a file was picked up. The current 'path' attribute is still populated, but may be a relative path\",\n-                                \"name\": \"absolute.path\"\n+                                \"description\": \"Sets the number of records in the FlowFile, only if a Record Writer is specified and Update Field Names is 'true'.\",\n+                                \"name\": \"record.count\"\n                             }\n                         ]\n                     },\n                     {\n-                        \"additionalDetails\": false,\n+                        \"additionalDetails\": true,\n                         \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n+                            \"EVENT_DRIVEN\": 0,\n                             \"TIMER_DRIVEN\": 1\n                         },\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n-                        \"explicitRestrictions\": [\n-                            {\n-                                \"explanation\": \"Provides operator the ability to read from any file that NiFi has access to.\",\n-                                \"requiredPermission\": \"read filesystem\"\n-                            },\n+                        \"dynamicProperties\": [\n                             {\n-                                \"explanation\": \"Provides operator the ability to delete any file that NiFi has access to.\",\n-                                \"requiredPermission\": \"write filesystem\"\n+                                \"description\": \"Allows users to specify values to use to replace fields in the record that match the RecordPath.\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"name\": \"A RecordPath.\",\n+                                \"value\": \"The value to use to replace fields in the record that match the RecordPath\"\n                             }\n                         ],\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Batch Size\": {\n-                                \"defaultValue\": \"10\",\n-                                \"description\": \"The maximum number of files to pull in each iteration\",\n-                                \"displayName\": \"Batch Size\",\n+                            \"record-reader\": {\n+                                \"description\": \"Specifies the Controller Service to use for reading incoming data\",\n+                                \"displayName\": \"Record Reader\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Batch Size\",\n+                                \"name\": \"record-reader\",\n                                 \"required\": true,\n-                                \"sensitive\": false\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n                             },\n-                            \"File Filter\": {\n-                                \"defaultValue\": \"[^\\\\.].*\",\n-                                \"description\": \"Only files whose names match the given regular expression will be picked up\",\n-                                \"displayName\": \"File Filter\",\n+                            \"record-writer\": {\n+                                \"description\": \"Specifies the Controller Service to use for writing out the records\",\n+                                \"displayName\": \"Record Writer\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"File Filter\",\n+                                \"name\": \"record-writer\",\n                                 \"required\": true,\n-                                \"sensitive\": false\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n                             },\n-                            \"Ignore Hidden Files\": {\n+                            \"replacement-value-strategy\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"description\": \"The value entered for a Property (after Expression Language has been evaluated) is the desired value to update the Record Fields with. Expression Language may reference variables 'field.name', 'field.type', and 'field.value' to access information about the field and the value of the field being evaluated.\",\n+                                        \"displayName\": \"Literal Value\",\n+                                        \"value\": \"literal-value\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"description\": \"The value entered for a Property (after Expression Language has been evaluated) is not the literal value to use but rather is a Record Path that should be evaluated against the Record, and the result of the RecordPath will be used to update the Record. Note that if this option is selected, and the Record Path results in multiple values for a given Record, the input FlowFile will be routed to the 'failure' Relationship.\",\n+                                        \"displayName\": \"Record Path Value\",\n+                                        \"value\": \"record-path-value\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"true\",\n-                                \"description\": \"Indicates whether or not hidden files should be ignored\",\n-                                \"displayName\": \"Ignore Hidden Files\",\n+                                \"defaultValue\": \"literal-value\",\n+                                \"description\": \"Specifies how to interpret the configured replacement values\",\n+                                \"displayName\": \"Replacement Value Strategy\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Ignore Hidden Files\",\n+                                \"name\": \"replacement-value-strategy\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n+                            }\n+                        },\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.processors.standard.ConvertRecord\"\n+                        ],\n+                        \"sideEffectFree\": true,\n+                        \"supportedRelationships\": [\n+                            {\n+                                \"description\": \"FlowFiles that are successfully transformed will be routed to this relationship\",\n+                                \"name\": \"success\"\n                             },\n-                            \"Input Directory\": {\n-                                \"description\": \"The input directory from which to pull files\",\n-                                \"displayName\": \"Input Directory\",\n+                            {\n+                                \"description\": \"If a FlowFile cannot be transformed from the configured input format to the configured output format, the unchanged FlowFile will be routed to this relationship\",\n+                                \"name\": \"failure\"\n+                            }\n+                        ],\n+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\",\n+                            \"EVENT_DRIVEN\"\n+                        ],\n+                        \"supportsBatching\": true,\n+                        \"supportsDynamicProperties\": true,\n+                        \"supportsDynamicRelationships\": false,\n+                        \"supportsEventDriven\": true,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"avro\",\n+                            \"csv\",\n+                            \"freeform\",\n+                            \"generic\",\n+                            \"json\",\n+                            \"log\",\n+                            \"logs\",\n+                            \"record\",\n+                            \"schema\",\n+                            \"text\",\n+                            \"update\"\n+                        ],\n+                        \"triggerSerially\": false,\n+                        \"triggerWhenAnyDestinationAvailable\": false,\n+                        \"triggerWhenEmpty\": false,\n+                        \"type\": \"org.apache.nifi.processors.standard.UpdateRecord\",\n+                        \"typeDescription\": \"Updates the contents of a FlowFile that contains Record-oriented data (i.e., data that can be read via a RecordReader and written by a RecordWriter). This Processor requires that at least one user-defined Property be added. The name of the Property should indicate a RecordPath that determines the field that should be updated. The value of the Property is either a replacement value (optionally making use of the Expression Language) or is itself a RecordPath that extracts a value from the Record. Whether the Property value is determined to be a RecordPath or a literal value depends on the configuration of the <Replacement Value Strategy> Property.\",\n+                        \"version\": \"1.27.0\",\n+                        \"writesAttributes\": [\n+                            {\n+                                \"description\": \"This attribute provides the current row index and is only available inside the literal value expression.\",\n+                                \"name\": \"record.index\"\n+                            },\n+                            {\n+                                \"description\": \"This attribute provides on failure the error message encountered by the Reader or Writer.\",\n+                                \"name\": \"record.error.message\"\n+                            }\n+                        ]\n+                    },\n+                    {\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-standard-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"e0c4461\"\n+                        },\n+                        \"defaultBulletinLevel\": \"WARN\",\n+                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": 1,\n+                            \"EVENT_DRIVEN\": 0,\n+                            \"TIMER_DRIVEN\": 1\n+                        },\n+                        \"defaultPenaltyDuration\": \"30 sec\",\n+                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": \"* * * * * ?\",\n+                            \"TIMER_DRIVEN\": \"0 sec\"\n+                        },\n+                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n+                        \"defaultYieldDuration\": \"1 sec\",\n+                        \"group\": \"org.apache.nifi\",\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n+                        \"primaryNodeOnly\": false,\n+                        \"propertyDescriptors\": {\n+                            \"validate-csv-delimiter\": {\n+                                \"defaultValue\": \",\",\n+                                \"description\": \"Character used as 'delimiter' in the incoming data. Example: ,\",\n+                                \"displayName\": \"Delimiter character\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Input Directory\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"validate-csv-delimiter\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Keep Source File\": {\n+                            \"validate-csv-eol\": {\n+                                \"defaultValue\": \"\\\\n\",\n+                                \"description\": \"Symbols used as 'end of line' in the incoming data. Example: \\\\n\",\n+                                \"displayName\": \"End of line symbols\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"validate-csv-eol\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"validate-csv-header\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"true\",\n                                         \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"false\",\n                                         \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"If true, the file is not deleted after it has been copied to the Content Repository; this causes the file to be picked up continually and is useful for testing purposes.  If not keeping original NiFi will need write permissions on the directory it is pulling from otherwise it will ignore the file.\",\n-                                \"displayName\": \"Keep Source File\",\n+                                \"defaultValue\": \"true\",\n+                                \"description\": \"True if the incoming flow file contains a header to ignore, false otherwise.\",\n+                                \"displayName\": \"Header\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Keep Source File\",\n+                                \"name\": \"validate-csv-header\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Maximum File Age\": {\n-                                \"description\": \"The maximum age that a file must be in order to be pulled; any file older than this amount of time (according to last modification date) will be ignored\",\n-                                \"displayName\": \"Maximum File Age\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Maximum File Age\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Maximum File Size\": {\n-                                \"description\": \"The maximum size that a file can be in order to be pulled\",\n-                                \"displayName\": \"Maximum File Size\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Maximum File Size\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Minimum File Age\": {\n-                                \"defaultValue\": \"0 sec\",\n-                                \"description\": \"The minimum age that a file must be in order to be pulled; any file younger than this amount of time (according to last modification date) will be ignored\",\n-                                \"displayName\": \"Minimum File Age\",\n+                            \"validate-csv-quote\": {\n+                                \"defaultValue\": \"\\\"\",\n+                                \"description\": \"Character used as 'quote' in the incoming data. Example: \\\"\",\n+                                \"displayName\": \"Quote character\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Minimum File Age\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"validate-csv-quote\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Minimum File Size\": {\n-                                \"defaultValue\": \"0 B\",\n-                                \"description\": \"The minimum size that a file must be in order to be pulled\",\n-                                \"displayName\": \"Minimum File Size\",\n+                            \"validate-csv-schema\": {\n+                                \"description\": \"The schema to be used for validation. Is expected a comma-delimited string representing the cell processors to apply. The following cell processors are allowed in the schema definition: [ParseBigDecimal, ParseBool, ParseChar, ParseDate, ParseDouble, ParseInt, ParseLong, Optional, DMinMax, Equals, ForbidSubStr, LMinMax, NotNull, Null, RequireHashCode, RequireSubStr, Strlen, StrMinMax, StrNotNullOrEmpty, StrRegEx, Unique, UniqueHashCode, IsIncludedIn]. Note: cell processors cannot be nested except with Optional.\",\n+                                \"displayName\": \"Schema\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Minimum File Size\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"validate-csv-schema\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Path Filter\": {\n-                                \"description\": \"When Recurse Subdirectories is true, then only subdirectories whose path matches the given regular expression will be scanned\",\n-                                \"displayName\": \"Path Filter\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Path Filter\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Polling Interval\": {\n-                                \"defaultValue\": \"0 sec\",\n-                                \"description\": \"Indicates how long to wait before performing a directory listing\",\n-                                \"displayName\": \"Polling Interval\",\n+                            \"validate-csv-strategy\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"In case an error is found, the input CSV file will be split into two FlowFiles: one routed to the 'valid' relationship containing all the correct lines and one routed to the 'invalid' relationship containing all the incorrect lines. Take care if choosing this option while using Unique cell processors in schema definition:the first occurrence will be considered valid and the next ones as invalid.\",\n+                                        \"displayName\": \"Line by line validation\",\n+                                        \"value\": \"Line by line validation\"\n+                                    },\n+                                    {\n+                                        \"description\": \"As soon as an error is found in the CSV file, the validation will stop and the whole flow file will be routed to the 'invalid' relationship. This option offers best performances.\",\n+                                        \"displayName\": \"FlowFile validation\",\n+                                        \"value\": \"FlowFile validation\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"FlowFile validation\",\n+                                \"description\": \"Strategy to apply when routing input files to output relationships.\",\n+                                \"displayName\": \"Validation strategy\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Polling Interval\",\n+                                \"name\": \"validate-csv-strategy\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Recurse Subdirectories\": {\n+                            \"validate-csv-violations\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"true\",\n                                         \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"false\",\n                                         \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"true\",\n-                                \"description\": \"Indicates whether or not to pull files from subdirectories\",\n-                                \"displayName\": \"Recurse Subdirectories\",\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"If true, the validation.error.message attribute would include the list of all the violations for the first invalid line. Note that setting this property to true would slightly decrease the performances as all columns would be validated. If false, a line is invalid as soon as a column is found violating the specified constraint and only this violation for the first invalid line will be included in the validation.error.message attribute.\",\n+                                \"displayName\": \"Include all violations\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Recurse Subdirectories\",\n+                                \"name\": \"validate-csv-violations\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             }\n                         },\n-                        \"restricted\": true,\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.processors.standard.FetchFile\",\n-                            \"org.apache.nifi.processors.standard.PutFile\"\n-                        ],\n-                        \"sideEffectFree\": false,\n+                        \"sideEffectFree\": true,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"All files are routed to success\",\n-                                \"name\": \"success\"\n+                                \"description\": \"FlowFiles that are successfully validated against the schema are routed to this relationship\",\n+                                \"name\": \"valid\"\n+                            },\n+                            {\n+                                \"description\": \"FlowFiles that are not valid according to the specified schema are routed to this relationship\",\n+                                \"name\": \"invalid\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n+                            \"CRON_DRIVEN\",\n+                            \"EVENT_DRIVEN\"\n                         ],\n-                        \"supportsBatching\": false,\n+                        \"supportsBatching\": true,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": false,\n+                        \"supportsEventDriven\": true,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"files\",\n-                            \"filesystem\",\n-                            \"get\",\n-                            \"ingest\",\n-                            \"ingress\",\n-                            \"input\",\n-                            \"local\",\n-                            \"source\"\n+                            \"csv\",\n+                            \"schema\",\n+                            \"validation\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": true,\n-                        \"type\": \"org.apache.nifi.processors.standard.GetFile\",\n-                        \"typeDescription\": \"Creates FlowFiles from files in a directory.  NiFi will ignore files it doesn't have at least read permissions for.\",\n+                        \"triggerWhenEmpty\": false,\n+                        \"type\": \"org.apache.nifi.processors.standard.ValidateCsv\",\n+                        \"typeDescription\": \"Validates the contents of FlowFiles against a user-specified CSV schema. Take a look at the additional documentation of this processor for some schema examples.\",\n                         \"version\": \"1.27.0\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"The filename is set to the name of the file on disk\",\n-                                \"name\": \"filename\"\n-                            },\n-                            {\n-                                \"description\": \"The path is set to the relative path of the file's directory on disk. For example, if the <Input Directory> property is set to /tmp, files picked up from /tmp will have the path attribute set to ./. If the <Recurse Subdirectories> property is set to true and a file is picked up from /tmp/abc/1/2/3, then the path attribute will be set to abc/1/2/3\",\n-                                \"name\": \"path\"\n-                            },\n-                            {\n-                                \"description\": \"The date and time that the file was created. May not work on all file systems\",\n-                                \"name\": \"file.creationTime\"\n-                            },\n-                            {\n-                                \"description\": \"The date and time that the file was last modified. May not work on all file systems\",\n-                                \"name\": \"file.lastModifiedTime\"\n-                            },\n-                            {\n-                                \"description\": \"The date and time that the file was last accessed. May not work on all file systems\",\n-                                \"name\": \"file.lastAccessTime\"\n-                            },\n-                            {\n-                                \"description\": \"The owner of the file. May not work on all file systems\",\n-                                \"name\": \"file.owner\"\n+                                \"description\": \"If line by line validation, number of valid lines extracted from the source data\",\n+                                \"name\": \"count.valid.lines\"\n                             },\n                             {\n-                                \"description\": \"The group owner of the file. May not work on all file systems\",\n-                                \"name\": \"file.group\"\n+                                \"description\": \"If line by line validation, number of invalid lines extracted from the source data\",\n+                                \"name\": \"count.invalid.lines\"\n                             },\n                             {\n-                                \"description\": \"The read/write/execute permissions of the file. May not work on all file systems\",\n-                                \"name\": \"file.permissions\"\n+                                \"description\": \"If line by line validation, total number of lines in the source data\",\n+                                \"name\": \"count.total.lines\"\n                             },\n                             {\n-                                \"description\": \"The full/absolute path from where a file was picked up. The current 'path' attribute is still populated, but may be a relative path\",\n-                                \"name\": \"absolute.path\"\n+                                \"description\": \"For flow files routed to invalid, message of the first validation error\",\n+                                \"name\": \"validation.error.message\"\n                             }\n                         ]\n                     },\n                     {\n                         \"additionalDetails\": false,\n                         \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n@@ -104829,1323 +105246,1594 @@\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n-                        \"deprecated\": true,\n-                        \"deprecationAlternatives\": [\n-                            \"org.apache.nifi.processors.standard.InvokeHTTP\"\n-                        ],\n-                        \"deprecationReason\": \"This processor is deprecated and may be removed in future releases.\",\n-                        \"dynamicProperties\": [\n+                        \"explicitRestrictions\": [\n                             {\n-                                \"description\": \"The additional headers to be sent by the processor whenever making a new HTTP request. \\n Setting a dynamic property name to XYZ and value to ${attribute} will result in the header 'XYZ: attribute_value' being sent to the HTTP endpoint\",\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"name\": \"Header Name\",\n-                                \"value\": \"The Expression Language to be used to populate the header value\"\n+                                \"explanation\": \"Schema configuration can reference resources over HTTP\",\n+                                \"requiredPermission\": \"reference remote resources\"\n                             }\n                         ],\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Accept Content-Type\": {\n-                                \"description\": \"If specified, requests will only accept the provided Content-Type\",\n-                                \"displayName\": \"Accept Content-Type\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Accept Content-Type\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Connection Timeout\": {\n-                                \"defaultValue\": \"30 sec\",\n-                                \"description\": \"How long to wait when attempting to connect to the remote server before giving up\",\n-                                \"displayName\": \"Connection Timeout\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Connection Timeout\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Data Timeout\": {\n-                                \"defaultValue\": \"30 sec\",\n-                                \"description\": \"How long to wait between receiving segments of data from the remote server before giving up and discarding the partial file\",\n-                                \"displayName\": \"Data Timeout\",\n+                            \"JSON Schema\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"SCHEMA_CONTENT_PROPERTY\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n+                                        \"propertyName\": \"Schema Access Strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"A URL or file path to the JSON schema or the actual JSON schema content\",\n+                                \"displayName\": \"JSON Schema\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Data Timeout\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Filename\": {\n-                                \"description\": \"The filename to assign to the file when pulled\",\n-                                \"displayName\": \"Filename\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Filename\",\n+                                \"name\": \"JSON Schema\",\n                                 \"required\": true,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"SINGLE\",\n+                                    \"resourceTypes\": [\n+                                        \"FILE\",\n+                                        \"URL\",\n+                                        \"TEXT\"\n+                                    ]\n+                                },\n                                 \"sensitive\": false\n                             },\n-                            \"Follow Redirects\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n+                            \"JSON Schema Registry\": {\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"dependentValues\": [\n+                                            \"SCHEMA_NAME_PROPERTY\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n+                                        \"propertyName\": \"Schema Access Strategy\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"If we receive a 3xx HTTP Status Code from the server, indicates whether or not we should follow the redirect that the server specifies\",\n-                                \"displayName\": \"Follow Redirects\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Follow Redirects\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Password\": {\n-                                \"description\": \"Password required to access the URL\",\n-                                \"displayName\": \"Password\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Password\",\n-                                \"required\": false,\n-                                \"sensitive\": true\n-                            },\n-                            \"Proxy Host\": {\n-                                \"description\": \"The fully qualified hostname or IP address of the proxy server\",\n-                                \"displayName\": \"Proxy Host\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Proxy Host\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Proxy Port\": {\n-                                \"description\": \"The port of the proxy server\",\n-                                \"displayName\": \"Proxy Port\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Proxy Port\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"SSL Context Service\": {\n-                                \"description\": \"The Controller Service to use in order to obtain an SSL Context\",\n-                                \"displayName\": \"SSL Context Service\",\n+                                \"description\": \"Specifies the Controller Service to use for the JSON Schema Registry\",\n+                                \"displayName\": \"JSON Schema Registry\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"SSL Context Service\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            },\n-                            \"URL\": {\n-                                \"description\": \"The URL to pull from\",\n-                                \"displayName\": \"URL\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"URL\",\n+                                \"name\": \"JSON Schema Registry\",\n                                 \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"User Agent\": {\n-                                \"description\": \"What to report as the User Agent when we connect to the remote server\",\n-                                \"displayName\": \"User Agent\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"User Agent\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Username\": {\n-                                \"description\": \"Username required to access the URL\",\n-                                \"displayName\": \"Username\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Username\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"proxy-configuration-service\": {\n-                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests. If set, it supersedes proxy settings configured per component. Supported proxies: HTTP + AuthN\",\n-                                \"displayName\": \"Proxy Configuration Service\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"proxy-configuration-service\",\n-                                \"required\": false,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n                                     \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.proxy.ProxyConfigurationService\",\n+                                    \"type\": \"org.apache.nifi.schemaregistry.services.JsonSchemaRegistry\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             },\n-                            \"redirect-cookie-policy\": {\n+                            \"JSON Schema Version\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Default cookie policy that provides a higher degree of compatibility with common cookie management of popular HTTP agents for non-standard (Netscape style) cookies.\",\n-                                        \"displayName\": \"default\",\n-                                        \"value\": \"default\"\n+                                        \"description\": \"Draft Version 4\",\n+                                        \"displayName\": \"Draft 4\",\n+                                        \"value\": \"DRAFT_4\"\n                                     },\n                                     {\n-                                        \"description\": \"RFC 6265 compliant cookie policy (interoperability profile).\",\n-                                        \"displayName\": \"standard\",\n-                                        \"value\": \"standard\"\n+                                        \"description\": \"Draft Version 6\",\n+                                        \"displayName\": \"Draft 6\",\n+                                        \"value\": \"DRAFT_6\"\n                                     },\n                                     {\n-                                        \"description\": \"RFC 6265 compliant cookie policy (strict profile).\",\n-                                        \"displayName\": \"strict\",\n-                                        \"value\": \"strict\"\n+                                        \"description\": \"Draft Version 7\",\n+                                        \"displayName\": \"Draft 7\",\n+                                        \"value\": \"DRAFT_7\"\n                                     },\n                                     {\n-                                        \"description\": \"Netscape draft compliant cookie policy.\",\n-                                        \"displayName\": \"netscape\",\n-                                        \"value\": \"netscape\"\n+                                        \"description\": \"Draft Version 2019-09\",\n+                                        \"displayName\": \"Draft 2019-09\",\n+                                        \"value\": \"DRAFT_2019_09\"\n                                     },\n                                     {\n-                                        \"description\": \"A cookie policy that ignores cookies.\",\n-                                        \"displayName\": \"ignore\",\n-                                        \"value\": \"ignore\"\n+                                        \"description\": \"Draft Version 2020-12\",\n+                                        \"displayName\": \"Draft 2020-12\",\n+                                        \"value\": \"DRAFT_2020_12\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"default\",\n-                                \"description\": \"When a HTTP server responds to a request with a redirect, this is the cookie policy used to copy cookies to the following request.\",\n-                                \"displayName\": \"Redirect Cookie Policy\",\n+                                \"defaultValue\": \"DRAFT_2020_12\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"SCHEMA_CONTENT_PROPERTY\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n+                                        \"propertyName\": \"Schema Access Strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"The JSON schema specification\",\n+                                \"displayName\": \"JSON Schema Version\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"redirect-cookie-policy\",\n-                                \"required\": false,\n+                                \"name\": \"JSON Schema Version\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Schema Access Strategy\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"The name of the Schema to use is specified by the 'Schema Name' Property. The value of this property is used to lookup the Schema in the configured JSON Schema Registry Service.\",\n+                                        \"displayName\": \"Schema Name Property\",\n+                                        \"value\": \"SCHEMA_NAME_PROPERTY\"\n+                                    },\n+                                    {\n+                                        \"description\": \"A URL or file path to the JSON schema or the actual JSON schema is specified by the 'JSON Schema' Property. No matter how the JSON schema is specified, it must be a valid JSON schema\",\n+                                        \"displayName\": \"JSON Schema Property\",\n+                                        \"value\": \"SCHEMA_CONTENT_PROPERTY\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"SCHEMA_CONTENT_PROPERTY\",\n+                                \"description\": \"Specifies how to obtain the schema that is to be used for interpreting the data.\",\n+                                \"displayName\": \"Schema Access Strategy\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Schema Access Strategy\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Schema Name\": {\n+                                \"defaultValue\": \"${schema.name}\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"SCHEMA_NAME_PROPERTY\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n+                                        \"propertyName\": \"Schema Access Strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"Specifies the name of the schema to lookup in the Schema Registry property\",\n+                                \"displayName\": \"Schema Name\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Schema Name\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             }\n                         },\n-                        \"sideEffectFree\": false,\n-                        \"stateful\": {\n-                            \"description\": \"Stores Last Modified Time and ETag headers returned by server so that the same data will not be fetched multiple times.\",\n-                            \"scopes\": [\n-                                \"LOCAL\"\n-                            ]\n-                        },\n+                        \"restricted\": true,\n+                        \"sideEffectFree\": true,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"All files are transferred to the success relationship\",\n-                                \"name\": \"success\"\n+                                \"description\": \"FlowFiles that are successfully validated against the schema are routed to this relationship\",\n+                                \"name\": \"valid\"\n+                            },\n+                            {\n+                                \"description\": \"FlowFiles that are not valid according to the specified schema are routed to this relationship\",\n+                                \"name\": \"invalid\"\n+                            },\n+                            {\n+                                \"description\": \"FlowFiles that cannot be read as JSON are routed to this relationship\",\n+                                \"name\": \"failure\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n-                        \"supportsBatching\": false,\n-                        \"supportsDynamicProperties\": true,\n+                        \"supportsBatching\": true,\n+                        \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n+                        \"systemResourceConsiderations\": [\n+                            {\n+                                \"description\": \"Validating JSON requires reading FlowFile content into memory\",\n+                                \"resource\": \"MEMORY\"\n+                            }\n+                        ],\n                         \"tags\": [\n-                            \"fetch\",\n-                            \"get\",\n-                            \"http\",\n-                            \"https\",\n-                            \"ingest\",\n-                            \"input\",\n-                            \"poll\",\n-                            \"source\"\n+                            \"JSON\",\n+                            \"schema\",\n+                            \"validation\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.standard.GetHTTP\",\n-                        \"typeDescription\": \"Please be aware this processor is deprecated and may be removed in the near future. Use InvokeHTTP instead. Fetches data from an HTTP or HTTPS URL and writes the data to the content of a FlowFile. Once the content has been fetched, the ETag and Last Modified dates are remembered (if the web server supports these concepts). This allows the Processor to fetch new data only if the remote data has changed or until the state is cleared. That is, once the content has been fetched from the given URL, it will not be fetched again until the content on the remote server changes. Note that due to limitations on state management, stored \\\"last modified\\\" and etag fields never expire. If the URL in GetHttp uses Expression Language that is unbounded, there is the potential for Out of Memory Errors to occur.\",\n+                        \"type\": \"org.apache.nifi.processors.standard.ValidateJson\",\n+                        \"typeDescription\": \"Validates the contents of FlowFiles against a configurable JSON Schema. See json-schema.org for specification standards. This Processor does not support input containing multiple JSON objects, such as newline-delimited JSON. If the input FlowFile contains newline-delimited JSON, only the first line will be validated.\",\n                         \"version\": \"1.27.0\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"The filename is set to the name of the file on the remote server\",\n-                                \"name\": \"filename\"\n-                            },\n-                            {\n-                                \"description\": \"The MIME Type of the FlowFile, as reported by the HTTP Content-Type header\",\n-                                \"name\": \"mime.type\"\n+                                \"description\": \"If the flow file is routed to the invalid relationship , this attribute will contain the error message resulting from the validation failure.\",\n+                                \"name\": \"json.validation.errors\"\n                             }\n                         ]\n                     },\n                     {\n-                        \"additionalDetails\": false,\n+                        \"additionalDetails\": true,\n                         \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n+                            \"EVENT_DRIVEN\": 0,\n                             \"TIMER_DRIVEN\": 1\n                         },\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n-                        \"deprecated\": true,\n-                        \"deprecationAlternatives\": [\n-                            \"org.apache.nifi.jms.processors.ConsumeJMS\"\n-                        ],\n-                        \"deprecationReason\": \"This processor is deprecated and may be removed in future releases. \",\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Acknowledgement Mode\": {\n+                            \"allow-extra-fields\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"Client Acknowledge\",\n-                                        \"value\": \"Client Acknowledge\"\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"Auto Acknowledge\",\n-                                        \"value\": \"Auto Acknowledge\"\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"Client Acknowledge\",\n-                                \"description\": \"The JMS Acknowledgement Mode. Using Auto Acknowledge can cause messages to be lost on restart of NiFi but may provide better performance than Client Acknowledge.\",\n-                                \"displayName\": \"Acknowledgement Mode\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Acknowledgement Mode\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Client ID Prefix\": {\n-                                \"description\": \"A human-readable ID that can be used to associate connections with yourself so that the maintainers of the JMS Server know who to contact if problems arise\",\n-                                \"displayName\": \"Client ID Prefix\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Client ID Prefix\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Communications Timeout\": {\n-                                \"defaultValue\": \"30 sec\",\n-                                \"description\": \"The amount of time to wait when attempting to receive a message before giving up and assuming failure\",\n-                                \"displayName\": \"Communications Timeout\",\n+                                \"defaultValue\": \"true\",\n+                                \"description\": \"If the incoming data has fields that are not present in the schema, this property determines whether or not the Record is valid. If true, the Record is still valid. If false, the Record will be invalid due to the extra fields.\",\n+                                \"displayName\": \"Allow Extra Fields\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Communications Timeout\",\n+                                \"name\": \"allow-extra-fields\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Copy JMS Properties to Attributes\": {\n+                            \"coerce-types\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"true\",\n                                         \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"false\",\n                                         \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"true\",\n-                                \"description\": \"Whether or not the JMS Message Properties should be copied to the FlowFile Attributes; if so, the attribute name will be jms.XXX, where XXX is the JMS Property name\",\n-                                \"displayName\": \"Copy JMS Properties to Attributes\",\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"If enabled, the processor will coerce every field to the type specified in the Reader's schema. If the value of a field cannot be coerced to the type, the field will be skipped (will not be read from the input data), thus will not appear in the output. If not enabled, then every field will appear in the output but their types may differ from what is specified in the schema. For details please see the Additional Details page of the processor's Help. This property controls how the data is read by the specified Record Reader.\",\n+                                \"displayName\": \"Force Types From Reader's Schema\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Copy JMS Properties to Attributes\",\n+                                \"name\": \"coerce-types\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Destination Name\": {\n-                                \"description\": \"The name of the JMS Topic or queue to use\",\n-                                \"displayName\": \"Destination Name\",\n+                            \"invalid-record-writer\": {\n+                                \"description\": \"If specified, this Controller Service will be used to write out any records that are invalid. If not specified, the writer specified by the \\\"Record Writer\\\" property will be used with the schema used to read the input records. This is useful, for example, when the configured Record Writer cannot write data that does not adhere to its schema (as is the case with Avro) or when it is desirable to keep invalid records in their original format while converting valid records to another format.\",\n+                                \"displayName\": \"Record Writer for Invalid Records\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Destination Name\",\n-                                \"required\": true,\n+                                \"name\": \"invalid-record-writer\",\n+                                \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"maximum-validation-details-length\": {\n+                                \"defaultValue\": \"1024\",\n+                                \"description\": \"Specifies the maximum number of characters that validation details value can have. Any characters beyond the max will be truncated. This property is only used if 'Validation Details Attribute Name' is set\",\n+                                \"displayName\": \"Maximum Validation Details Length\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"maximum-validation-details-length\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"JMS Provider\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"ActiveMQ\",\n-                                        \"value\": \"ActiveMQ\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"ActiveMQ\",\n-                                \"description\": \"The Provider used for the JMS Server\",\n-                                \"displayName\": \"JMS Provider\",\n+                            \"record-reader\": {\n+                                \"description\": \"Specifies the Controller Service to use for reading incoming data\",\n+                                \"displayName\": \"Record Reader\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"JMS Provider\",\n+                                \"name\": \"record-reader\",\n                                 \"required\": true,\n-                                \"sensitive\": false\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n                             },\n-                            \"Message Batch Size\": {\n-                                \"defaultValue\": \"10\",\n-                                \"description\": \"The number of messages to pull/push in a single iteration of the processor\",\n-                                \"displayName\": \"Message Batch Size\",\n+                            \"record-writer\": {\n+                                \"description\": \"Specifies the Controller Service to use for writing out the records. Regardless of the Controller Service schema access configuration, the schema that is used to validate record is used to write the valid results.\",\n+                                \"displayName\": \"Record Writer\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Message Batch Size\",\n+                                \"name\": \"record-writer\",\n                                 \"required\": true,\n-                                \"sensitive\": false\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n                             },\n-                            \"Message Selector\": {\n-                                \"description\": \"The JMS Message Selector to use in order to narrow the messages that are pulled\",\n-                                \"displayName\": \"Message Selector\",\n+                            \"schema-access-strategy\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"The schema to validate the data against is determined by asking the configured Record Reader for its schema\",\n+                                        \"displayName\": \"Use Reader's Schema\",\n+                                        \"value\": \"reader-schema\"\n+                                    },\n+                                    {\n+                                        \"description\": \"The schema to validate the data against is determined by looking at the 'Schema Name' Property and looking up the schema in the configured Schema Registry\",\n+                                        \"displayName\": \"Use Schema Name Property\",\n+                                        \"value\": \"schema-name-property\"\n+                                    },\n+                                    {\n+                                        \"description\": \"The schema to validate the data against is determined by looking at the 'Schema Text' Property and parsing the schema as an Avro schema\",\n+                                        \"displayName\": \"Use Schema Text Property\",\n+                                        \"value\": \"schema-text-property\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"reader-schema\",\n+                                \"description\": \"Specifies how to obtain the schema that should be used to validate records\",\n+                                \"displayName\": \"Schema Access Strategy\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Message Selector\",\n-                                \"required\": false,\n+                                \"name\": \"schema-access-strategy\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Password\": {\n-                                \"description\": \"Password used for authentication and authorization\",\n-                                \"displayName\": \"Password\",\n+                            \"schema-name\": {\n+                                \"defaultValue\": \"${schema.name}\",\n+                                \"description\": \"Specifies the name of the schema to lookup in the Schema Registry property\",\n+                                \"displayName\": \"Schema Name\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Password\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"schema-name\",\n                                 \"required\": false,\n-                                \"sensitive\": true\n+                                \"sensitive\": false\n                             },\n-                            \"SSL Context Service\": {\n-                                \"description\": \"The Controller Service to use in order to obtain an SSL Context.\",\n-                                \"displayName\": \"SSL Context Service\",\n+                            \"schema-registry\": {\n+                                \"description\": \"Specifies the Controller Service to use for the Schema Registry. This is necessary only if the Schema Access Strategy is set to \\\"Use 'Schema Name' Property\\\".\",\n+                                \"displayName\": \"Schema Registry\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"SSL Context Service\",\n+                                \"name\": \"schema-registry\",\n                                 \"required\": false,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n                                     \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n+                                    \"type\": \"org.apache.nifi.schemaregistry.services.SchemaRegistry\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             },\n-                            \"URL\": {\n-                                \"description\": \"The URL of the JMS Server\",\n-                                \"displayName\": \"URL\",\n+                            \"schema-text\": {\n+                                \"defaultValue\": \"${avro.schema}\",\n+                                \"description\": \"The text of an Avro-formatted Schema\",\n+                                \"displayName\": \"Schema Text\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"schema-text\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"strict-type-checking\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"true\",\n+                                \"description\": \"If the incoming data has a Record where a field is not of the correct type, this property determines how to handle the Record. If true, the Record will be considered invalid. If false, the Record will be considered valid and the field will be coerced into the correct type (if possible, according to the type coercion supported by the Record Writer). This property controls how the data is validated against the validation schema.\",\n+                                \"displayName\": \"Strict Type Checking\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"URL\",\n+                                \"name\": \"strict-type-checking\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Username\": {\n-                                \"description\": \"Username used for authentication and authorization\",\n-                                \"displayName\": \"Username\",\n+                            \"validation-details-attribute-name\": {\n+                                \"description\": \"If specified, when a validation error occurs, this attribute name will be used to leave the details. The number of characters will be limited by the property 'Maximum Validation Details Length'.\",\n+                                \"displayName\": \"Validation Details Attribute Name\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Username\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"validation-details-attribute-name\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             }\n                         },\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.processors.standard.PutJMS\"\n-                        ],\n-                        \"sideEffectFree\": false,\n+                        \"sideEffectFree\": true,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"All FlowFiles are routed to success\",\n-                                \"name\": \"success\"\n+                                \"description\": \"Records that are valid according to the schema will be routed to this relationship\",\n+                                \"name\": \"valid\"\n+                            },\n+                            {\n+                                \"description\": \"Records that are not valid according to the schema will be routed to this relationship\",\n+                                \"name\": \"invalid\"\n+                            },\n+                            {\n+                                \"description\": \"If the records cannot be read, validated, or written, for any reason, the original FlowFile will be routed to this relationship\",\n+                                \"name\": \"failure\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n+                            \"CRON_DRIVEN\",\n+                            \"EVENT_DRIVEN\"\n                         ],\n-                        \"supportsBatching\": false,\n+                        \"supportsBatching\": true,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": false,\n+                        \"supportsEventDriven\": true,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"consume\",\n-                            \"consumer\",\n-                            \"get\",\n-                            \"jms\",\n-                            \"listen\",\n-                            \"pull\",\n-                            \"queue\",\n-                            \"source\"\n+                            \"record\",\n+                            \"schema\",\n+                            \"validate\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": true,\n-                        \"type\": \"org.apache.nifi.processors.standard.GetJMSQueue\",\n-                        \"typeDescription\": \"Pulls messages from a ActiveMQ JMS Queue, creating a FlowFile for each JMS Message or bundle of messages, as configured\",\n-                        \"version\": \"1.27.0\"\n+                        \"triggerWhenEmpty\": false,\n+                        \"type\": \"org.apache.nifi.processors.standard.ValidateRecord\",\n+                        \"typeDescription\": \"Validates the Records of an incoming FlowFile against a given schema. All records that adhere to the schema are routed to the \\\"valid\\\" relationship while records that do not adhere to the schema are routed to the \\\"invalid\\\" relationship. It is therefore possible for a single incoming FlowFile to be split into two individual FlowFiles if some records are valid according to the schema and others are not. Any FlowFile that is routed to the \\\"invalid\\\" relationship will emit a ROUTE Provenance Event with the Details field populated to explain why records were invalid. In addition, to gain further explanation of why records were invalid, DEBUG-level logging can be enabled for the \\\"org.apache.nifi.processors.standard.ValidateRecord\\\" logger.\",\n+                        \"version\": \"1.27.0\",\n+                        \"writesAttributes\": [\n+                            {\n+                                \"description\": \"Sets the mime.type attribute to the MIME Type specified by the Record Writer\",\n+                                \"name\": \"mime.type\"\n+                            },\n+                            {\n+                                \"description\": \"The number of records in the FlowFile routed to a relationship\",\n+                                \"name\": \"record.count\"\n+                            }\n+                        ]\n                     },\n                     {\n-                        \"additionalDetails\": false,\n+                        \"additionalDetails\": true,\n                         \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n+                            \"EVENT_DRIVEN\": 0,\n                             \"TIMER_DRIVEN\": 1\n                         },\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n-                        \"deprecated\": true,\n-                        \"deprecationAlternatives\": [\n-                            \"org.apache.nifi.jms.processors.ConsumeJMS\"\n+                        \"explicitRestrictions\": [\n+                            {\n+                                \"explanation\": \"Schema configuration can reference resources over HTTP\",\n+                                \"requiredPermission\": \"reference remote resources\"\n+                            }\n                         ],\n-                        \"deprecationReason\": \"This processor is deprecated and may be removed in future releases.\",\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n-                        \"primaryNodeOnly\": true,\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n+                        \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Acknowledgement Mode\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Client Acknowledge\",\n-                                        \"value\": \"Client Acknowledge\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Auto Acknowledge\",\n-                                        \"value\": \"Auto Acknowledge\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"Client Acknowledge\",\n-                                \"description\": \"The JMS Acknowledgement Mode. Using Auto Acknowledge can cause messages to be lost on restart of NiFi but may provide better performance than Client Acknowledge.\",\n-                                \"displayName\": \"Acknowledgement Mode\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Acknowledgement Mode\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Client ID Prefix\": {\n-                                \"description\": \"A human-readable ID that can be used to associate connections with yourself so that the maintainers of the JMS Server know who to contact if problems arise\",\n-                                \"displayName\": \"Client ID Prefix\",\n+                            \"Schema File\": {\n+                                \"description\": \"The file path or URL to the XSD Schema file that is to be used for validation. If this property is blank, only XML syntax/structure will be validated.\",\n+                                \"displayName\": \"Schema File\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Client ID Prefix\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Schema File\",\n                                 \"required\": false,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"SINGLE\",\n+                                    \"resourceTypes\": [\n+                                        \"FILE\",\n+                                        \"URL\"\n+                                    ]\n+                                },\n                                 \"sensitive\": false\n                             },\n-                            \"Communications Timeout\": {\n-                                \"defaultValue\": \"30 sec\",\n-                                \"description\": \"The amount of time to wait when attempting to receive a message before giving up and assuming failure\",\n-                                \"displayName\": \"Communications Timeout\",\n+                            \"XML Source Attribute\": {\n+                                \"description\": \"The name of the attribute containing XML to be validated. If this property is blank, the FlowFile content will be validated.\",\n+                                \"displayName\": \"XML Source Attribute\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Communications Timeout\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"XML Source Attribute\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n+                            }\n+                        },\n+                        \"restricted\": true,\n+                        \"sideEffectFree\": true,\n+                        \"supportedRelationships\": [\n+                            {\n+                                \"description\": \"FlowFiles that are successfully validated against the schema, if provided, or verified to be well-formed XML are routed to this relationship\",\n+                                \"name\": \"valid\"\n                             },\n-                            \"Copy JMS Properties to Attributes\": {\n+                            {\n+                                \"description\": \"FlowFiles that are not valid according to the specified schema or contain invalid XML are routed to this relationship\",\n+                                \"name\": \"invalid\"\n+                            }\n+                        ],\n+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\",\n+                            \"EVENT_DRIVEN\"\n+                        ],\n+                        \"supportsBatching\": true,\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicRelationships\": false,\n+                        \"supportsEventDriven\": true,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"systemResourceConsiderations\": [\n+                            {\n+                                \"description\": \"While this processor supports processing XML within attributes, it is strongly discouraged to hold large amounts of data in attributes. In general, attribute values should be as small as possible and hold no more than a couple hundred characters.\",\n+                                \"resource\": \"MEMORY\"\n+                            }\n+                        ],\n+                        \"tags\": [\n+                            \"schema\",\n+                            \"validation\",\n+                            \"xml\",\n+                            \"xsd\"\n+                        ],\n+                        \"triggerSerially\": false,\n+                        \"triggerWhenAnyDestinationAvailable\": false,\n+                        \"triggerWhenEmpty\": false,\n+                        \"type\": \"org.apache.nifi.processors.standard.ValidateXml\",\n+                        \"typeDescription\": \"Validates XML contained in a FlowFile. By default, the XML is contained in the FlowFile content. If the 'XML Source Attribute' property is set, the XML to be validated is contained in the specified attribute. It is not recommended to use attributes to hold large XML documents; doing so could adversely affect system performance. Full schema validation is performed if the processor is configured with the XSD schema details. Otherwise, the only validation performed is to ensure the XML syntax is correct and well-formed, e.g. all opening tags are properly closed.\",\n+                        \"version\": \"1.27.0\",\n+                        \"writesAttributes\": [\n+                            {\n+                                \"description\": \"If the flow file is routed to the invalid relationship the attribute will contain the error message resulting from the validation failure.\",\n+                                \"name\": \"validatexml.invalid.error\"\n+                            }\n+                        ]\n+                    },\n+                    {\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-standard-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"e0c4461\"\n+                        },\n+                        \"defaultBulletinLevel\": \"WARN\",\n+                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": 1,\n+                            \"EVENT_DRIVEN\": 0,\n+                            \"TIMER_DRIVEN\": 1\n+                        },\n+                        \"defaultPenaltyDuration\": \"30 sec\",\n+                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": \"* * * * * ?\",\n+                            \"TIMER_DRIVEN\": \"0 sec\"\n+                        },\n+                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n+                        \"defaultYieldDuration\": \"1 sec\",\n+                        \"group\": \"org.apache.nifi\",\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n+                        \"primaryNodeOnly\": false,\n+                        \"propertyDescriptors\": {\n+                            \"attribute-copy-mode\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"description\": \"When cached attributes are copied onto released FlowFiles, they replace any matching attributes.\",\n+                                        \"displayName\": \"Replace if present\",\n+                                        \"value\": \"replace\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"description\": \"Attributes on released FlowFiles are not overwritten by copied cached attributes.\",\n+                                        \"displayName\": \"Keep original\",\n+                                        \"value\": \"keeporiginal\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"true\",\n-                                \"description\": \"Whether or not the JMS Message Properties should be copied to the FlowFile Attributes; if so, the attribute name will be jms.XXX, where XXX is the JMS Property name\",\n-                                \"displayName\": \"Copy JMS Properties to Attributes\",\n+                                \"defaultValue\": \"keeporiginal\",\n+                                \"description\": \"Specifies how to handle attributes copied from FlowFiles entering the Notify processor\",\n+                                \"displayName\": \"Attribute Copy Mode\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Copy JMS Properties to Attributes\",\n+                                \"name\": \"attribute-copy-mode\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Destination Name\": {\n-                                \"description\": \"The name of the JMS Topic or queue to use\",\n-                                \"displayName\": \"Destination Name\",\n+                            \"distributed-cache-service\": {\n+                                \"description\": \"The Controller Service that is used to check for release signals from a corresponding Notify processor\",\n+                                \"displayName\": \"Distributed Cache Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Destination Name\",\n+                                \"name\": \"distributed-cache-service\",\n                                 \"required\": true,\n-                                \"sensitive\": false\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.distributed.cache.client.AtomicDistributedMapCacheClient\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n                             },\n-                            \"JMS Provider\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"ActiveMQ\",\n-                                        \"value\": \"ActiveMQ\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"ActiveMQ\",\n-                                \"description\": \"The Provider used for the JMS Server\",\n-                                \"displayName\": \"JMS Provider\",\n+                            \"expiration-duration\": {\n+                                \"defaultValue\": \"10 min\",\n+                                \"description\": \"Indicates the duration after which waiting FlowFiles will be routed to the 'expired' relationship\",\n+                                \"displayName\": \"Expiration Duration\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"JMS Provider\",\n+                                \"name\": \"expiration-duration\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Message Batch Size\": {\n-                                \"defaultValue\": \"10\",\n-                                \"description\": \"The number of messages to pull/push in a single iteration of the processor\",\n-                                \"displayName\": \"Message Batch Size\",\n+                            \"releasable-flowfile-count\": {\n+                                \"defaultValue\": \"1\",\n+                                \"description\": \"A value, or the results of an Attribute Expression Language statement, which will be evaluated against a FlowFile in order to determine the releasable FlowFile count. This specifies how many FlowFiles can be released when a target count reaches target signal count. Zero (0) has a special meaning, any number of FlowFiles can be released as long as signal count matches target.\",\n+                                \"displayName\": \"Releasable FlowFile Count\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Message Batch Size\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"releasable-flowfile-count\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Message Selector\": {\n-                                \"description\": \"The JMS Message Selector to use in order to narrow the messages that are pulled\",\n-                                \"displayName\": \"Message Selector\",\n+                            \"release-signal-id\": {\n+                                \"description\": \"A value that specifies the key to a specific release signal cache. To decide whether the FlowFile that is being processed by the Wait processor should be sent to the 'success' or the 'wait' relationship, the processor checks the signals in the cache specified by this key.\",\n+                                \"displayName\": \"Release Signal Identifier\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Message Selector\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"release-signal-id\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Password\": {\n-                                \"description\": \"Password used for authentication and authorization\",\n-                                \"displayName\": \"Password\",\n+                            \"signal-counter-name\": {\n+                                \"description\": \"Within the cache (specified by the Release Signal Identifier) the signals may belong to different counters. If this property is specified, the processor checks the number of signals in the cache that belong to this particular counter. If not specified, the processor checks the total number of signals in the cache.\",\n+                                \"displayName\": \"Signal Counter Name\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Password\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"signal-counter-name\",\n                                 \"required\": false,\n-                                \"sensitive\": true\n+                                \"sensitive\": false\n                             },\n-                            \"SSL Context Service\": {\n-                                \"description\": \"The Controller Service to use in order to obtain an SSL Context.\",\n-                                \"displayName\": \"SSL Context Service\",\n+                            \"target-signal-count\": {\n+                                \"defaultValue\": \"1\",\n+                                \"description\": \"The number of signals that need to be in the cache (specified by the Release Signal Identifier) in order for the FlowFile processed by the Wait processor to be sent to the \\u2018success\\u2019 relationship. If the number of signals in the cache has reached this number, the FlowFile is routed to the 'success' relationship and the number of signals in the cache is decreased by this value. If Signal Counter Name is specified, this processor checks a particular counter, otherwise checks against the total number of signals in the cache.\",\n+                                \"displayName\": \"Target Signal Count\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"SSL Context Service\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"target-signal-count\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n                             },\n-                            \"URL\": {\n-                                \"description\": \"The URL of the JMS Server\",\n-                                \"displayName\": \"URL\",\n+                            \"wait-buffer-count\": {\n+                                \"defaultValue\": \"1\",\n+                                \"description\": \"Specify the maximum number of incoming FlowFiles that can be buffered to check whether it can move forward. The more buffer can provide the better performance, as it reduces the number of interactions with cache service by grouping FlowFiles by signal identifier. Only a signal identifier can be processed at a processor execution.\",\n+                                \"displayName\": \"Wait Buffer Count\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"URL\",\n+                                \"name\": \"wait-buffer-count\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Use Durable Subscription\": {\n+                            \"wait-mode\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"description\": \"Transfer a FlowFile to the 'wait' relationship when whose release signal has not been notified yet. This mode allows other incoming FlowFiles to be enqueued by moving FlowFiles into the wait relationship. It is recommended to set a prioritizer (for instance First In First Out) on the 'wait' relationship.\",\n+                                        \"displayName\": \"Transfer to wait relationship\",\n+                                        \"value\": \"wait\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"description\": \"Transfer a FlowFile to the upstream connection where it comes from when whose release signal has not been notified yet. This mode helps keeping upstream connection being full so that the upstream source processor will not be scheduled while back-pressure is active and limit incoming FlowFiles. \",\n+                                        \"displayName\": \"Keep in the upstream connection\",\n+                                        \"value\": \"keep\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"If true, connections to the specified topic will use Durable Subscription so that messages are queued when we are not pulling them\",\n-                                \"displayName\": \"Use Durable Subscription\",\n+                                \"defaultValue\": \"wait\",\n+                                \"description\": \"Specifies how to handle a FlowFile waiting for a notify signal\",\n+                                \"displayName\": \"Wait Mode\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Use Durable Subscription\",\n+                                \"name\": \"wait-mode\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Username\": {\n-                                \"description\": \"Username used for authentication and authorization\",\n-                                \"displayName\": \"Username\",\n+                            \"wait-penalty-duration\": {\n+                                \"description\": \"If configured, after a signal identifier got processed but did not meet the release criteria, the signal identifier is penalized and FlowFiles having the signal identifier will not be processed again for the specified period of time, so that the signal identifier will not block others to be processed. This can be useful for use cases where a Wait processor is expected to process multiple signal identifiers, and each signal identifier has multiple FlowFiles, and also the order of releasing FlowFiles is important within a signal identifier. The FlowFile order can be configured with Prioritizers. IMPORTANT: There is a limitation of number of queued signals can be processed, and Wait processor may not be able to check all queued signal ids. See additional details for the best practice.\",\n+                                \"displayName\": \"Wait Penalty Duration\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Username\",\n+                                \"name\": \"wait-penalty-duration\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             }\n                         },\n                         \"seeAlso\": [\n-                            \"org.apache.nifi.processors.standard.PutJMS\"\n+                            \"org.apache.nifi.distributed.cache.client.DistributedMapCacheClientService\",\n+                            \"org.apache.nifi.distributed.cache.server.map.DistributedMapCacheServer\",\n+                            \"org.apache.nifi.processors.standard.Notify\"\n                         ],\n                         \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"All FlowFiles are routed to success\",\n+                                \"description\": \"A FlowFile that has exceeded the configured Expiration Duration will be routed to this relationship\",\n+                                \"name\": \"expired\"\n+                            },\n+                            {\n+                                \"description\": \"A FlowFile with a matching release signal in the cache will be routed to this relationship\",\n                                 \"name\": \"success\"\n+                            },\n+                            {\n+                                \"description\": \"A FlowFile with no matching release signal in the cache will be routed to this relationship\",\n+                                \"name\": \"wait\"\n+                            },\n+                            {\n+                                \"description\": \"When the cache cannot be reached, or if the Release Signal Identifier evaluates to null or empty, FlowFiles will be routed to this relationship\",\n+                                \"name\": \"failure\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n+                            \"CRON_DRIVEN\",\n+                            \"EVENT_DRIVEN\"\n                         ],\n-                        \"supportsBatching\": false,\n+                        \"supportsBatching\": true,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": false,\n+                        \"supportsEventDriven\": true,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"consume\",\n-                            \"consumer\",\n-                            \"durable\",\n-                            \"get\",\n-                            \"jms\",\n-                            \"listen\",\n-                            \"non-durable\",\n-                            \"pull\",\n-                            \"source\",\n-                            \"subscription\",\n-                            \"topic\"\n+                            \"cache\",\n+                            \"distributed\",\n+                            \"hold\",\n+                            \"map\",\n+                            \"release\",\n+                            \"signal\",\n+                            \"wait\"\n                         ],\n-                        \"triggerSerially\": true,\n+                        \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": true,\n-                        \"type\": \"org.apache.nifi.processors.standard.GetJMSTopic\",\n-                        \"typeDescription\": \"Pulls messages from a ActiveMQ JMS Topic, creating a FlowFile for each JMS Message or bundle of messages, as configured.\",\n-                        \"version\": \"1.27.0\"\n-                    },\n+                        \"triggerWhenEmpty\": false,\n+                        \"type\": \"org.apache.nifi.processors.standard.Wait\",\n+                        \"typeDescription\": \"Routes incoming FlowFiles to the 'wait' relationship until a matching release signal is stored in the distributed cache from a corresponding Notify processor. When a matching release signal is identified, a waiting FlowFile is routed to the 'success' relationship. The release signal entry is then removed from the cache. The attributes of the FlowFile that produced the release signal are copied to the waiting FlowFile if the Attribute Cache Regex property of the corresponding Notify processor is set properly. If there are multiple release signals in the cache identified by the Release Signal Identifier, and the Notify processor is configured to copy the FlowFile attributes to the cache, then the FlowFile passing the Wait processor receives the union of the attributes of the FlowFiles that produced the release signals in the cache (identified by Release Signal Identifier). Waiting FlowFiles will be routed to 'expired' if they exceed the Expiration Duration. If you need to wait for more than one signal, specify the desired number of signals via the 'Target Signal Count' property. This is particularly useful with processors that split a source FlowFile into multiple fragments, such as SplitText. In order to wait for all fragments to be processed, connect the 'original' relationship to a Wait processor, and the 'splits' relationship to a corresponding Notify processor. Configure the Notify and Wait processors to use the '${fragment.identifier}' as the value of 'Release Signal Identifier', and specify '${fragment.count}' as the value of 'Target Signal Count' in the Wait processor.It is recommended to use a prioritizer (for instance First In First Out) when using the 'wait' relationship as a loop.\",\n+                        \"version\": \"1.27.0\",\n+                        \"writesAttributes\": [\n+                            {\n+                                \"description\": \"All FlowFiles will have an attribute 'wait.start.timestamp', which sets the initial epoch timestamp when the file first entered this processor.  This is used to determine the expiration time of the FlowFile.  This attribute is not written when the FlowFile is transferred to failure, expired or success\",\n+                                \"name\": \"wait.start.timestamp\"\n+                            },\n+                            {\n+                                \"description\": \"The name of each counter for which at least one signal has been present in the cache since the last time the cache was empty gets copied to the current FlowFile as an attribute.\",\n+                                \"name\": \"wait.counter.<counterName>\"\n+                            }\n+                        ]\n+                    }\n+                ],\n+                \"reportingTasks\": [\n                     {\n-                        \"additionalDetails\": false,\n+                        \"additionalDetails\": true,\n                         \"artifact\": \"nifi-standard-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n-                        \"defaultBulletinLevel\": \"WARN\",\n-                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": 1,\n-                            \"TIMER_DRIVEN\": 1\n-                        },\n-                        \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n-                        \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n-                        \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Ciphers Allowed\": {\n-                                \"description\": \"A comma-separated list of Ciphers allowed for SFTP connections. Leave unset to allow all. Available options are: 3des-cbc, 3des-ctr, aes128-cbc, aes128-ctr, aes128-gcm@openssh.com, aes192-cbc, aes192-ctr, aes256-cbc, aes256-ctr, aes256-gcm@openssh.com, arcfour, arcfour128, arcfour256, blowfish-cbc, blowfish-ctr, cast128-cbc, cast128-ctr, chacha20-poly1305@openssh.com, idea-cbc, idea-ctr, serpent128-cbc, serpent128-ctr, serpent192-cbc, serpent192-ctr, serpent256-cbc, serpent256-ctr, twofish-cbc, twofish128-cbc, twofish128-ctr, twofish192-cbc, twofish192-ctr, twofish256-cbc, twofish256-ctr\",\n-                                \"displayName\": \"Ciphers Allowed\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Ciphers Allowed\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Connection Timeout\": {\n-                                \"defaultValue\": \"30 sec\",\n-                                \"description\": \"Amount of time to wait before timing out while creating a connection\",\n-                                \"displayName\": \"Connection Timeout\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Connection Timeout\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Data Timeout\": {\n-                                \"defaultValue\": \"30 sec\",\n-                                \"description\": \"When transferring a file between the local and remote system, this value specifies how long is allowed to elapse without any data being transferred between systems\",\n-                                \"displayName\": \"Data Timeout\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Data Timeout\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Delete Original\": {\n+                            \"Show Deltas\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"true\",\n                                         \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"false\",\n                                         \"value\": \"false\"\n                                     }\n                                 ],\n                                 \"defaultValue\": \"true\",\n-                                \"description\": \"Determines whether or not the file is deleted from the remote system after it has been successfully transferred\",\n-                                \"displayName\": \"Delete Original\",\n+                                \"description\": \"Specifies whether or not to show the difference in values between the current status and the previous status\",\n+                                \"displayName\": \"Show Deltas\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Delete Original\",\n+                                \"name\": \"Show Deltas\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"File Filter Regex\": {\n-                                \"description\": \"Provides a Java Regular Expression for filtering Filenames; if a filter is supplied, only files whose names match that Regular Expression will be fetched\",\n-                                \"displayName\": \"File Filter Regex\",\n+                            \"reporting-granularity\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"The stats that are reported will reflect up to the last 5 minutes' worth of processing, which will coincide with the stats that are shown in the UI.\",\n+                                        \"displayName\": \"Five Minutes\",\n+                                        \"value\": \"five-minutes\"\n+                                    },\n+                                    {\n+                                        \"description\": \"The stats that are reported will be an average of the value per second, gathered over the last 5 minutes. This is essentially obtained by dividing the stats that are shown in the UI by 300 (300 seconds in 5 minutes), with the exception of when NiFi has been running for less than 5 minutes. In that case, the stats will be divided by the amount of time NiFi has been running.\",\n+                                        \"displayName\": \"One Second\",\n+                                        \"value\": \"one-second\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"five-minutes\",\n+                                \"description\": \"When reporting information, specifies the granularity of the metrics to report\",\n+                                \"displayName\": \"Reporting Granularity\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"File Filter Regex\",\n+                                \"name\": \"reporting-granularity\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n-                            },\n-                            \"Host Key File\": {\n-                                \"description\": \"If supplied, the given file will be used as the Host Key; otherwise, if 'Strict Host Key Checking' property is applied (set to true) then uses the 'known_hosts' and 'known_hosts2' files from ~/.ssh directory else no host key file will be used\",\n-                                \"displayName\": \"Host Key File\",\n+                            }\n+                        },\n+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\"\n+                        ],\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"log\",\n+                            \"stats\"\n+                        ],\n+                        \"type\": \"org.apache.nifi.controller.ControllerStatusReportingTask\",\n+                        \"typeDescription\": \"Logs the 5-minute stats that are shown in the NiFi Summary Page for Processors and Connections, as well optionally logging the deltas between the previous iteration and the current iteration. Processors' stats are logged using the org.apache.nifi.controller.ControllerStatusReportingTask.Processors logger, while Connections' stats are logged using the org.apache.nifi.controller.ControllerStatusReportingTask.Connections logger. These can be configured in the NiFi logging configuration to log to different files, if desired.\",\n+                        \"version\": \"1.27.0\"\n+                    },\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-standard-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"e0c4461\"\n+                        },\n+                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": \"* * * * * ?\",\n+                            \"TIMER_DRIVEN\": \"0 sec\"\n+                        },\n+                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n+                        \"group\": \"org.apache.nifi\",\n+                        \"propertyDescriptors\": {\n+                            \"Directory Display Name\": {\n+                                \"defaultValue\": \"Un-Named\",\n+                                \"description\": \"The name to display for the directory in alerts.\",\n+                                \"displayName\": \"Directory Display Name\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Host Key File\",\n+                                \"name\": \"Directory Display Name\",\n                                 \"required\": false,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"SINGLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\"\n-                                    ]\n-                                },\n                                 \"sensitive\": false\n                             },\n-                            \"Hostname\": {\n-                                \"description\": \"The fully qualified hostname or IP address of the remote system\",\n-                                \"displayName\": \"Hostname\",\n+                            \"Directory Location\": {\n+                                \"description\": \"The directory path of the partition to be monitored.\",\n+                                \"displayName\": \"Directory Location\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Hostname\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Directory Location\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Http Proxy Password\": {\n-                                \"description\": \"Http Proxy Password\",\n-                                \"displayName\": \"Http Proxy Password\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Http Proxy Password\",\n-                                \"required\": false,\n-                                \"sensitive\": true\n-                            },\n-                            \"Http Proxy Username\": {\n-                                \"description\": \"Http Proxy Username\",\n-                                \"displayName\": \"Http Proxy Username\",\n+                            \"Threshold\": {\n+                                \"defaultValue\": \"80%\",\n+                                \"description\": \"The threshold at which a bulletin will be generated to indicate that the disk usage of the partition on which the directory found is of concern\",\n+                                \"displayName\": \"Threshold\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Http Proxy Username\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Threshold\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n-                            },\n-                            \"Ignore Dotted Files\": {\n+                            }\n+                        },\n+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\"\n+                        ],\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"disk\",\n+                            \"monitoring\",\n+                            \"repo\",\n+                            \"storage\",\n+                            \"warning\"\n+                        ],\n+                        \"type\": \"org.apache.nifi.controller.MonitorDiskUsage\",\n+                        \"typeDescription\": \"Checks the amount of storage space available for the specified directory and warns (via a log message and a System-Level Bulletin) if the partition on which it lives exceeds some configurable threshold of storage space\",\n+                        \"version\": \"1.27.0\"\n+                    },\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-standard-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"e0c4461\"\n+                        },\n+                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": \"* * * * * ?\",\n+                            \"TIMER_DRIVEN\": \"0 sec\"\n+                        },\n+                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n+                        \"group\": \"org.apache.nifi\",\n+                        \"propertyDescriptors\": {\n+                            \"Memory Pool\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"displayName\": \"PS Eden Space\",\n+                                        \"value\": \"PS Eden Space\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"displayName\": \"PS Survivor Space\",\n+                                        \"value\": \"PS Survivor Space\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"PS Old Gen\",\n+                                        \"value\": \"PS Old Gen\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"true\",\n-                                \"description\": \"If true, files whose names begin with a dot (\\\".\\\") will be ignored\",\n-                                \"displayName\": \"Ignore Dotted Files\",\n+                                \"defaultValue\": \"PS Old Gen\",\n+                                \"description\": \"The name of the JVM Memory Pool to monitor. The allowed values for Memory Pools are platform and JVM dependent and may vary for different versions of Java and from published documentation. This reporting task will become invalidated if configured to use a Memory Pool that is not available on the currently running host platform and JVM\",\n+                                \"displayName\": \"Memory Pool\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Ignore Dotted Files\",\n+                                \"name\": \"Memory Pool\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Key Algorithms Allowed\": {\n-                                \"description\": \"A comma-separated list of Key Algorithms allowed for SFTP connections. Leave unset to allow all. Available options are: ecdsa-sha2-nistp256, ecdsa-sha2-nistp256-cert-v01@openssh.com, ecdsa-sha2-nistp384, ecdsa-sha2-nistp384-cert-v01@openssh.com, ecdsa-sha2-nistp521, ecdsa-sha2-nistp521-cert-v01@openssh.com, rsa-sha2-256, rsa-sha2-512, ssh-dss, ssh-dss-cert-v01@openssh.com, ssh-ed25519, ssh-ed25519-cert-v01@openssh.com, ssh-rsa, ssh-rsa-cert-v01@openssh.com\",\n-                                \"displayName\": \"Key Algorithms Allowed\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Key Algorithms Allowed\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Key Exchange Algorithms Allowed\": {\n-                                \"description\": \"A comma-separated list of Key Exchange Algorithms allowed for SFTP connections. Leave unset to allow all. Available options are: curve25519-sha256, curve25519-sha256@libssh.org, diffie-hellman-group-exchange-sha1, diffie-hellman-group-exchange-sha256, diffie-hellman-group1-sha1, diffie-hellman-group14-sha1, diffie-hellman-group14-sha256, diffie-hellman-group14-sha256@ssh.com, diffie-hellman-group15-sha256, diffie-hellman-group15-sha256@ssh.com, diffie-hellman-group15-sha384@ssh.com, diffie-hellman-group15-sha512, diffie-hellman-group16-sha256, diffie-hellman-group16-sha384@ssh.com, diffie-hellman-group16-sha512, diffie-hellman-group16-sha512@ssh.com, diffie-hellman-group17-sha512, diffie-hellman-group18-sha512, diffie-hellman-group18-sha512@ssh.com, ecdh-sha2-nistp256, ecdh-sha2-nistp384, ecdh-sha2-nistp521, ext-info-c\",\n-                                \"displayName\": \"Key Exchange Algorithms Allowed\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Key Exchange Algorithms Allowed\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Max Selects\": {\n-                                \"defaultValue\": \"100\",\n-                                \"description\": \"The maximum number of files to pull in a single connection\",\n-                                \"displayName\": \"Max Selects\",\n+                            \"Reporting Interval\": {\n+                                \"description\": \"Indicates how often this reporting task should report bulletins while the memory utilization exceeds the configured threshold\",\n+                                \"displayName\": \"Reporting Interval\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Max Selects\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Message Authentication Codes Allowed\": {\n-                                \"description\": \"A comma-separated list of Message Authentication Codes allowed for SFTP connections. Leave unset to allow all. Available options are: hmac-md5, hmac-md5-96, hmac-md5-96-etm@openssh.com, hmac-md5-etm@openssh.com, hmac-ripemd160, hmac-ripemd160-96, hmac-ripemd160-etm@openssh.com, hmac-ripemd160@openssh.com, hmac-sha1, hmac-sha1-96, hmac-sha1-96@openssh.com, hmac-sha1-etm@openssh.com, hmac-sha2-256, hmac-sha2-256-etm@openssh.com, hmac-sha2-512, hmac-sha2-512-etm@openssh.com\",\n-                                \"displayName\": \"Message Authentication Codes Allowed\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Message Authentication Codes Allowed\",\n+                                \"name\": \"Reporting Interval\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Password\": {\n-                                \"description\": \"Password for the user account\",\n-                                \"displayName\": \"Password\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Password\",\n-                                \"required\": false,\n-                                \"sensitive\": true\n-                            },\n-                            \"Path Filter Regex\": {\n-                                \"description\": \"When Search Recursively is true, then only subdirectories whose path matches the given Regular Expression will be scanned\",\n-                                \"displayName\": \"Path Filter Regex\",\n+                            \"Usage Threshold\": {\n+                                \"defaultValue\": \"65%\",\n+                                \"description\": \"Indicates the threshold at which warnings should be generated. This can be a percentage or a Data Size\",\n+                                \"displayName\": \"Usage Threshold\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Path Filter Regex\",\n-                                \"required\": false,\n+                                \"name\": \"Usage Threshold\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n-                            },\n-                            \"Polling Interval\": {\n-                                \"defaultValue\": \"60 sec\",\n-                                \"description\": \"Determines how long to wait between fetching the listing for new files\",\n-                                \"displayName\": \"Polling Interval\",\n+                            }\n+                        },\n+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\"\n+                        ],\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"garbage collection\",\n+                            \"gc\",\n+                            \"heap\",\n+                            \"jvm\",\n+                            \"memory\",\n+                            \"monitor\",\n+                            \"warning\"\n+                        ],\n+                        \"type\": \"org.apache.nifi.controller.MonitorMemory\",\n+                        \"typeDescription\": \"Checks the amount of Java Heap available in the JVM for a particular JVM Memory Pool. If the amount of space used exceeds some configurable threshold, will warn (via a log message and System-Level Bulletin) that the memory pool is exceeding this threshold.\",\n+                        \"version\": \"1.27.0\"\n+                    },\n+                    {\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-standard-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"e0c4461\"\n+                        },\n+                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": \"* * * * * ?\",\n+                            \"TIMER_DRIVEN\": \"0 sec\"\n+                        },\n+                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n+                        \"group\": \"org.apache.nifi\",\n+                        \"propertyDescriptors\": {\n+                            \"Hostname\": {\n+                                \"defaultValue\": \"localhost\",\n+                                \"description\": \"The fully-qualified name of the host on which Ganglia is running\",\n+                                \"displayName\": \"Hostname\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Polling Interval\",\n+                                \"name\": \"Hostname\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n                             \"Port\": {\n-                                \"defaultValue\": \"22\",\n-                                \"description\": \"The port that the remote system is listening on for file transfers\",\n+                                \"defaultValue\": \"8649\",\n+                                \"description\": \"The Port on which Ganglia is listening for incoming connections\",\n                                 \"displayName\": \"Port\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n                                 \"name\": \"Port\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Private Key Passphrase\": {\n-                                \"description\": \"Password for the private key\",\n-                                \"displayName\": \"Private Key Passphrase\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Private Key Passphrase\",\n-                                \"required\": false,\n-                                \"sensitive\": true\n-                            },\n-                            \"Private Key Path\": {\n-                                \"description\": \"The fully qualified path to the Private Key file\",\n-                                \"displayName\": \"Private Key Path\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Private Key Path\",\n-                                \"required\": false,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"SINGLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\"\n-                                    ]\n-                                },\n-                                \"sensitive\": false\n-                            },\n-                            \"Proxy Host\": {\n-                                \"description\": \"The fully qualified hostname or IP address of the proxy server\",\n-                                \"displayName\": \"Proxy Host\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Proxy Host\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Proxy Port\": {\n-                                \"description\": \"The port of the proxy server\",\n-                                \"displayName\": \"Proxy Port\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Proxy Port\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Proxy Type\": {\n+                            \"Send JVM Metrics\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"DIRECT\",\n-                                        \"value\": \"DIRECT\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"HTTP\",\n-                                        \"value\": \"HTTP\"\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"SOCKS\",\n-                                        \"value\": \"SOCKS\"\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"DIRECT\",\n-                                \"description\": \"Proxy type used for file transfers\",\n-                                \"displayName\": \"Proxy Type\",\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"Specifies whether or not JVM Metrics should be gathered and sent, in addition to NiFi-specific metrics\",\n+                                \"displayName\": \"Send JVM Metrics\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Proxy Type\",\n-                                \"required\": false,\n+                                \"name\": \"Send JVM Metrics\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n-                            },\n-                            \"Remote Path\": {\n-                                \"description\": \"The path on the remote system from which to pull or push files\",\n-                                \"displayName\": \"Remote Path\",\n+                            }\n+                        },\n+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\"\n+                        ],\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"ganglia\",\n+                            \"stats\"\n+                        ],\n+                        \"type\": \"org.apache.nifi.reporting.ganglia.StandardGangliaReporter\",\n+                        \"typeDescription\": \"Reports metrics to Ganglia so that Ganglia can be used for external monitoring of the application. Metrics reported include JVM Metrics (optional); the following 5-minute NiFi statistics: FlowFiles Received, Bytes Received, FlowFiles Sent, Bytes Sent, Bytes Read, Bytes Written, Total Task Duration; and the current values for FlowFiles Queued, Bytes Queued, and number of Active Threads.\",\n+                        \"version\": \"1.27.0\"\n+                    }\n+                ]\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"1.27.0\"\n+        },\n+        {\n+            \"artifact\": \"nifi-kerberos-iaa-providers-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [],\n+                \"processors\": [],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"1.27.0\"\n+        },\n+        {\n+            \"artifact\": \"nifi-hl7-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [],\n+                \"processors\": [\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-hl7-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"e0c4461\"\n+                        },\n+                        \"defaultBulletinLevel\": \"WARN\",\n+                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": 1,\n+                            \"TIMER_DRIVEN\": 1\n+                        },\n+                        \"defaultPenaltyDuration\": \"30 sec\",\n+                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": \"* * * * * ?\",\n+                            \"TIMER_DRIVEN\": \"0 sec\"\n+                        },\n+                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n+                        \"defaultYieldDuration\": \"1 sec\",\n+                        \"group\": \"org.apache.nifi\",\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n+                        \"primaryNodeOnly\": false,\n+                        \"propertyDescriptors\": {\n+                            \"Character Encoding\": {\n+                                \"defaultValue\": \"UTF-8\",\n+                                \"description\": \"The Character Encoding that is used to encode the HL7 data\",\n+                                \"displayName\": \"Character Encoding\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Remote Path\",\n-                                \"required\": false,\n+                                \"name\": \"Character Encoding\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Remote Poll Batch Size\": {\n-                                \"defaultValue\": \"5000\",\n-                                \"description\": \"The value specifies how many file paths to find in a given directory on the remote system when doing a file listing. This value in general should not need to be modified but when polling against a remote system with a tremendous number of files this value can be critical.  Setting this value too high can result very poor performance and setting it too low can cause the flow to be slower than normal.\",\n-                                \"displayName\": \"Remote Poll Batch Size\",\n+                            \"hl7-input-version\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"autodetect\",\n+                                        \"value\": \"autodetect\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"2.2\",\n+                                        \"value\": \"2.2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"2.3\",\n+                                        \"value\": \"2.3\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"2.3.1\",\n+                                        \"value\": \"2.3.1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"2.4\",\n+                                        \"value\": \"2.4\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"2.5\",\n+                                        \"value\": \"2.5\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"2.5.1\",\n+                                        \"value\": \"2.5.1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"2.6\",\n+                                        \"value\": \"2.6\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"autodetect\",\n+                                \"description\": \"The HL7 version to use for parsing and validation\",\n+                                \"displayName\": \"HL7 Input Version\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Remote Poll Batch Size\",\n+                                \"name\": \"hl7-input-version\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Search Recursively\": {\n+                            \"parse-segment-fields\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"true\",\n                                         \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"false\",\n                                         \"value\": \"false\"\n                                     }\n                                 ],\n                                 \"defaultValue\": \"false\",\n-                                \"description\": \"If true, will pull files from arbitrarily nested subdirectories; otherwise, will not traverse subdirectories\",\n-                                \"displayName\": \"Search Recursively\",\n+                                \"description\": \"Whether or not to parse HL7 segment fields into attributes\",\n+                                \"displayName\": \"Parse Segment Fields\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Search Recursively\",\n+                                \"name\": \"parse-segment-fields\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Send Keep Alive On Timeout\": {\n+                            \"skip-validation\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"true\",\n                                         \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"false\",\n                                         \"value\": \"false\"\n                                     }\n                                 ],\n                                 \"defaultValue\": \"true\",\n-                                \"description\": \"Send a Keep Alive message every 5 seconds up to 5 times for an overall timeout of 25 seconds.\",\n-                                \"displayName\": \"Send Keep Alive On Timeout\",\n+                                \"description\": \"Whether or not to validate HL7 message values\",\n+                                \"displayName\": \"Skip Validation\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Send Keep Alive On Timeout\",\n+                                \"name\": \"skip-validation\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Strict Host Key Checking\": {\n+                            \"use-segment-names\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"true\",\n                                         \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"false\",\n                                         \"value\": \"false\"\n                                     }\n                                 ],\n                                 \"defaultValue\": \"false\",\n-                                \"description\": \"Indicates whether or not strict enforcement of hosts keys should be applied\",\n-                                \"displayName\": \"Strict Host Key Checking\",\n+                                \"description\": \"Whether or not to use HL7 segment names in attributes\",\n+                                \"displayName\": \"Use Segment Names\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Strict Host Key Checking\",\n+                                \"name\": \"use-segment-names\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n+                            }\n+                        },\n+                        \"sideEffectFree\": true,\n+                        \"supportedRelationships\": [\n+                            {\n+                                \"description\": \"A FlowFile is routed to this relationship if it is properly parsed as HL7 and its attributes extracted\",\n+                                \"name\": \"success\"\n                             },\n-                            \"Use Compression\": {\n+                            {\n+                                \"description\": \"A FlowFile is routed to this relationship if it cannot be mapped to FlowFile Attributes. This would happen if the FlowFile does not contain valid HL7 data\",\n+                                \"name\": \"failure\"\n+                            }\n+                        ],\n+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\"\n+                        ],\n+                        \"supportsBatching\": true,\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicRelationships\": false,\n+                        \"supportsEventDriven\": false,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"HL7\",\n+                            \"attributes\",\n+                            \"extract\",\n+                            \"health level 7\",\n+                            \"healthcare\"\n+                        ],\n+                        \"triggerSerially\": false,\n+                        \"triggerWhenAnyDestinationAvailable\": false,\n+                        \"triggerWhenEmpty\": false,\n+                        \"type\": \"org.apache.nifi.processors.hl7.ExtractHL7Attributes\",\n+                        \"typeDescription\": \"Extracts information from an HL7 (Health Level 7) formatted FlowFile and adds the information as FlowFile Attributes. The attributes are named as <Segment Name> <dot> <Field Index>. If the segment is repeating, the naming will be <Segment Name> <underscore> <Segment Index> <dot> <Field Index>. For example, we may have an attribute named \\\"MHS.12\\\" with a value of \\\"2.1\\\" and an attribute named \\\"OBX_11.3\\\" with a value of \\\"93000^CPT4\\\".\",\n+                        \"version\": \"1.27.0\"\n+                    },\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-hl7-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"e0c4461\"\n+                        },\n+                        \"defaultBulletinLevel\": \"WARN\",\n+                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": 1,\n+                            \"EVENT_DRIVEN\": 0,\n+                            \"TIMER_DRIVEN\": 1\n+                        },\n+                        \"defaultPenaltyDuration\": \"30 sec\",\n+                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": \"* * * * * ?\",\n+                            \"TIMER_DRIVEN\": \"0 sec\"\n+                        },\n+                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n+                        \"defaultYieldDuration\": \"1 sec\",\n+                        \"dynamicProperties\": [\n+                            {\n+                                \"description\": \"If a FlowFile matches the query, it will be routed to a relationship with the name of the property\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"name\": \"Name of a Relationship\",\n+                                \"value\": \"An HL7 Query Language query\"\n+                            }\n+                        ],\n+                        \"group\": \"org.apache.nifi\",\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n+                        \"primaryNodeOnly\": false,\n+                        \"propertyDescriptors\": {\n+                            \"Character Encoding\": {\n+                                \"defaultValue\": \"UTF-8\",\n+                                \"description\": \"The Character Encoding that is used to encode the HL7 data\",\n+                                \"displayName\": \"Character Encoding\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Character Encoding\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            }\n+                        },\n+                        \"sideEffectFree\": true,\n+                        \"supportedRelationships\": [\n+                            {\n+                                \"description\": \"Any FlowFile that cannot be parsed as HL7 will be routed to this relationship\",\n+                                \"name\": \"failure\"\n+                            },\n+                            {\n+                                \"description\": \"The original FlowFile that comes into this processor will be routed to this relationship, unless it is routed to 'failure'\",\n+                                \"name\": \"original\"\n+                            }\n+                        ],\n+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\",\n+                            \"EVENT_DRIVEN\"\n+                        ],\n+                        \"supportsBatching\": true,\n+                        \"supportsDynamicProperties\": true,\n+                        \"supportsDynamicRelationships\": false,\n+                        \"supportsEventDriven\": true,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"HL7\",\n+                            \"Health Level 7\",\n+                            \"healthcare\",\n+                            \"route\"\n+                        ],\n+                        \"triggerSerially\": false,\n+                        \"triggerWhenAnyDestinationAvailable\": false,\n+                        \"triggerWhenEmpty\": false,\n+                        \"type\": \"org.apache.nifi.processors.hl7.RouteHL7\",\n+                        \"typeDescription\": \"Routes incoming HL7 data according to user-defined queries. To add a query, add a new property to the processor. The name of the property will become a new relationship for the processor, and the value is an HL7 Query Language query. If a FlowFile matches the query, a copy of the FlowFile will be routed to the associated relationship.\",\n+                        \"version\": \"1.27.0\",\n+                        \"writesAttributes\": [\n+                            {\n+                                \"description\": \"The name of the relationship to which the FlowFile was routed\",\n+                                \"name\": \"RouteHL7.Route\"\n+                            }\n+                        ]\n+                    }\n+                ],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"1.27.0\"\n+        },\n+        {\n+            \"artifact\": \"nifi-smb-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [],\n+                \"processors\": [\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-smb-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"e0c4461\"\n+                        },\n+                        \"defaultBulletinLevel\": \"WARN\",\n+                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": 1,\n+                            \"TIMER_DRIVEN\": 1\n+                        },\n+                        \"defaultPenaltyDuration\": \"30 sec\",\n+                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": \"* * * * * ?\",\n+                            \"TIMER_DRIVEN\": \"0 sec\"\n+                        },\n+                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n+                        \"defaultYieldDuration\": \"1 sec\",\n+                        \"group\": \"org.apache.nifi\",\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n+                        \"primaryNodeOnly\": false,\n+                        \"propertyDescriptors\": {\n+                            \"Completion Strategy\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"description\": \"Leaves the file as-is.\",\n+                                        \"displayName\": \"None\",\n+                                        \"value\": \"NONE\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"description\": \"Moves the file to the specified directory on the remote system. This option cannot be used when DFS is enabled on 'SMB Client Provider Service'.\",\n+                                        \"displayName\": \"Move File\",\n+                                        \"value\": \"MOVE\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Deletes the file from the remote system.\",\n+                                        \"displayName\": \"Delete File\",\n+                                        \"value\": \"DELETE\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"Indicates whether or not ZLIB compression should be used when transferring files\",\n-                                \"displayName\": \"Use Compression\",\n+                                \"defaultValue\": \"NONE\",\n+                                \"description\": \"Specifies what to do with the original file on the server once it has been processed. If the Completion Strategy fails, a warning will be logged but the data will still be transferred.\",\n+                                \"displayName\": \"Completion Strategy\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Use Compression\",\n+                                \"name\": \"Completion Strategy\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Use Natural Ordering\": {\n+                            \"Create Destination Directory\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"true\",\n                                         \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"false\",\n                                         \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"If true, will pull files in the order in which they are naturally listed; otherwise, the order in which the files will be pulled is not defined\",\n-                                \"displayName\": \"Use Natural Ordering\",\n+                                \"defaultValue\": \"false\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"MOVE\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Completion Strategy\",\n+                                        \"propertyName\": \"Completion Strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"Specifies whether or not the remote directory should be created if it does not exist.\",\n+                                \"displayName\": \"Create Destination Directory\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Create Destination Directory\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Destination Directory\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"MOVE\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Completion Strategy\",\n+                                        \"propertyName\": \"Completion Strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"The directory on the remote server to move the original file to once it has been processed.\",\n+                                \"displayName\": \"Destination Directory\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Use Natural Ordering\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Destination Directory\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Username\": {\n-                                \"description\": \"Username\",\n-                                \"displayName\": \"Username\",\n+                            \"remote-file\": {\n+                                \"defaultValue\": \"${path}/${filename}\",\n+                                \"description\": \"The full path of the file to be retrieved from the remote server. Expression language is supported.\",\n+                                \"displayName\": \"Remote File\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Username\",\n+                                \"name\": \"remote-file\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"follow-symlink\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"If true, will pull even symbolic files and also nested symbolic subdirectories; otherwise, will not read symbolic files and will not traverse symbolic link subdirectories\",\n-                                \"displayName\": \"Follow symlink\",\n+                            \"smb-client-provider-service\": {\n+                                \"description\": \"Specifies the SMB client provider to use for creating SMB connections.\",\n+                                \"displayName\": \"SMB Client Provider Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"follow-symlink\",\n+                                \"name\": \"smb-client-provider-service\",\n                                 \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"proxy-configuration-service\": {\n-                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests. If set, it supersedes proxy settings configured per component. Supported proxies: SOCKS + AuthN, HTTP + AuthN\",\n-                                \"displayName\": \"Proxy Configuration Service\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"proxy-configuration-service\",\n-                                \"required\": false,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"artifact\": \"nifi-smb-client-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.proxy.ProxyConfigurationService\",\n+                                    \"type\": \"org.apache.nifi.services.smb.SmbClientProviderService\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             }\n                         },\n                         \"seeAlso\": [\n-                            \"org.apache.nifi.processors.standard.PutSFTP\"\n+                            \"org.apache.nifi.processors.smb.GetSmbFile\",\n+                            \"org.apache.nifi.processors.smb.ListSmb\",\n+                            \"org.apache.nifi.processors.smb.PutSmbFile\"\n                         ],\n                         \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"All FlowFiles that are received are routed to success\",\n+                                \"description\": \"A FlowFile will be routed here for each successfully fetched file.\",\n                                 \"name\": \"success\"\n+                            },\n+                            {\n+                                \"description\": \"A FlowFile will be routed here when failed to fetch its content.\",\n+                                \"name\": \"failure\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n                         \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n+                            \"cifs\",\n                             \"fetch\",\n                             \"files\",\n-                            \"get\",\n-                            \"ingest\",\n-                            \"input\",\n-                            \"remote\",\n-                            \"retrieve\",\n-                            \"sftp\",\n-                            \"source\"\n+                            \"samba\",\n+                            \"smb\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.standard.GetSFTP\",\n-                        \"typeDescription\": \"Fetches files from an SFTP Server and creates FlowFiles from them\",\n+                        \"type\": \"org.apache.nifi.processors.smb.FetchSmb\",\n+                        \"typeDescription\": \"Fetches files from a SMB Share. Designed to be used in tandem with ListSmb.\",\n                         \"version\": \"1.27.0\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"The filename is set to the name of the file on the remote server\",\n-                                \"name\": \"filename\"\n-                            },\n-                            {\n-                                \"description\": \"The path is set to the path of the file's directory on the remote server. For example, if the <Remote Path> property is set to /tmp, files picked up from /tmp will have the path attribute set to /tmp. If the <Search Recursively> property is set to true and a file is picked up from /tmp/abc/1/2/3, then the path attribute will be set to /tmp/abc/1/2/3\",\n-                                \"name\": \"path\"\n-                            },\n-                            {\n-                                \"description\": \"The date and time that the source file was last modified\",\n-                                \"name\": \"file.lastModifiedTime\"\n-                            },\n-                            {\n-                                \"description\": \"The numeric owner id of the source file\",\n-                                \"name\": \"file.owner\"\n-                            },\n-                            {\n-                                \"description\": \"The numeric group id of the source file\",\n-                                \"name\": \"file.group\"\n-                            },\n-                            {\n-                                \"description\": \"The read/write/execute permissions of the source file\",\n-                                \"name\": \"file.permissions\"\n+                                \"description\": \"The error code returned by SMB when the fetch of a file fails.\",\n+                                \"name\": \"error.code\"\n                             },\n                             {\n-                                \"description\": \"The full/absolute path from where a file was picked up. The current 'path' attribute is still populated, but may be a relative path\",\n-                                \"name\": \"absolute.path\"\n+                                \"description\": \"The error message returned by SMB when the fetch of a file fails.\",\n+                                \"name\": \"error.message\"\n                             }\n                         ]\n                     },\n                     {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-standard-nar\",\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-smb-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -106157,1348 +106845,686 @@\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_FORBIDDEN\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Additional HTTP Methods\": {\n-                                \"description\": \"A comma-separated list of non-standard HTTP Methods that should be allowed\",\n-                                \"displayName\": \"Additional HTTP Methods\",\n+                            \"Batch Size\": {\n+                                \"defaultValue\": \"10\",\n+                                \"description\": \"The maximum number of files to pull in each iteration\",\n+                                \"displayName\": \"Batch Size\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Additional HTTP Methods\",\n+                                \"name\": \"Batch Size\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Directory\": {\n+                                \"description\": \"The network folder to which files should be written. This is the remaining relative path after the share: \\\\\\\\hostname\\\\share\\\\[dir1\\\\dir2].\",\n+                                \"displayName\": \"Directory\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Directory\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Allow DELETE\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"true\",\n-                                \"description\": \"Allow HTTP DELETE Method\",\n-                                \"displayName\": \"Allow DELETE\",\n+                            \"Domain\": {\n+                                \"description\": \"The domain used for authentication. Optional, in most cases username and password is sufficient.\",\n+                                \"displayName\": \"Domain\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Allow DELETE\",\n+                                \"name\": \"Domain\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"File Filter\": {\n+                                \"description\": \"Only files whose names match the given regular expression will be picked up\",\n+                                \"displayName\": \"File Filter\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"File Filter\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Hostname\": {\n+                                \"description\": \"The network host to which files should be written.\",\n+                                \"displayName\": \"Hostname\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Hostname\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Allow GET\": {\n+                            \"Ignore Hidden Files\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"true\",\n                                         \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"false\",\n                                         \"value\": \"false\"\n                                     }\n                                 ],\n                                 \"defaultValue\": \"true\",\n-                                \"description\": \"Allow HTTP GET Method\",\n-                                \"displayName\": \"Allow GET\",\n+                                \"description\": \"Indicates whether or not hidden files should be ignored\",\n+                                \"displayName\": \"Ignore Hidden Files\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Allow GET\",\n+                                \"name\": \"Ignore Hidden Files\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Allow HEAD\": {\n+                            \"Keep Source File\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"true\",\n                                         \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"false\",\n                                         \"value\": \"false\"\n                                     }\n                                 ],\n                                 \"defaultValue\": \"false\",\n-                                \"description\": \"Allow HTTP HEAD Method\",\n-                                \"displayName\": \"Allow HEAD\",\n+                                \"description\": \"If true, the file is not deleted after it has been copied to the Content Repository; this causes the file to be picked up continually and is useful for testing purposes.  If not keeping original NiFi will need write permissions on the directory it is pulling from otherwise it will ignore the file.\",\n+                                \"displayName\": \"Keep Source File\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Allow HEAD\",\n+                                \"name\": \"Keep Source File\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Allow OPTIONS\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"Allow HTTP OPTIONS Method\",\n-                                \"displayName\": \"Allow OPTIONS\",\n+                            \"Password\": {\n+                                \"description\": \"The password used for authentication. Required if Username is set.\",\n+                                \"displayName\": \"Password\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Allow OPTIONS\",\n-                                \"required\": true,\n+                                \"name\": \"Password\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n+                            },\n+                            \"Path Filter\": {\n+                                \"description\": \"When Recurse Subdirectories is true, then only subdirectories whose path matches the given regular expression will be scanned\",\n+                                \"displayName\": \"Path Filter\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Path Filter\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Allow POST\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"true\",\n-                                \"description\": \"Allow HTTP POST Method\",\n-                                \"displayName\": \"Allow POST\",\n+                            \"Polling Interval\": {\n+                                \"defaultValue\": \"0 sec\",\n+                                \"description\": \"Indicates how long to wait before performing a directory listing\",\n+                                \"displayName\": \"Polling Interval\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Allow POST\",\n+                                \"name\": \"Polling Interval\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Allow PUT\": {\n+                            \"Recurse Subdirectories\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"true\",\n                                         \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"false\",\n                                         \"value\": \"false\"\n                                     }\n                                 ],\n                                 \"defaultValue\": \"true\",\n-                                \"description\": \"Allow HTTP PUT Method\",\n-                                \"displayName\": \"Allow PUT\",\n+                                \"description\": \"Indicates whether or not to pull files from subdirectories\",\n+                                \"displayName\": \"Recurse Subdirectories\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Allow PUT\",\n+                                \"name\": \"Recurse Subdirectories\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Allowed Paths\": {\n-                                \"description\": \"A Regular Expression that specifies the valid HTTP Paths that are allowed in the incoming URL Requests. If this value is specified and the path of the HTTP Requests does not match this Regular Expression, the Processor will respond with a 404: NotFound\",\n-                                \"displayName\": \"Allowed Paths\",\n+                            \"Share\": {\n+                                \"description\": \"The network share to which files should be written. This is the \\\"first folder\\\"after the hostname: \\\\\\\\hostname\\\\[share]\\\\dir1\\\\dir2\",\n+                                \"displayName\": \"Share\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Allowed Paths\",\n-                                \"required\": false,\n+                                \"name\": \"Share\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Client Authentication\": {\n+                            \"Share Access Strategy\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Processor will not authenticate clients. Anyone can communicate with this Processor anonymously\",\n-                                        \"displayName\": \"No Authentication\",\n-                                        \"value\": \"No Authentication\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"none\",\n+                                        \"value\": \"none\"\n                                     },\n                                     {\n-                                        \"description\": \"Processor will try to verify the client but if unable to verify will allow the client to communicate anonymously\",\n-                                        \"displayName\": \"Want Authentication\",\n-                                        \"value\": \"Want Authentication\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"read\",\n+                                        \"value\": \"read\"\n                                     },\n                                     {\n-                                        \"description\": \"Processor will reject communications from any client unless the client provides a certificate that is trusted by the TrustStorespecified in the SSL Context Service\",\n-                                        \"displayName\": \"Need Authentication\",\n-                                        \"value\": \"Need Authentication\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"read, delete\",\n+                                        \"value\": \"read, delete\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"read, write, delete\",\n+                                        \"value\": \"read, write, delete\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"No Authentication\",\n-                                \"description\": \"Specifies whether or not the Processor should authenticate clients. This value is ignored if the <SSL Context Service> Property is not specified or the SSL Context provided uses only a KeyStore and not a TrustStore.\",\n-                                \"displayName\": \"Client Authentication\",\n+                                \"defaultValue\": \"none\",\n+                                \"description\": \"Indicates which shared access are granted on the file during the read. None is the most restrictive, but the safest setting to prevent corruption.\",\n+                                \"displayName\": \"Share Access Strategy\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Client Authentication\",\n+                                \"name\": \"Share Access Strategy\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Default URL Character Set\": {\n-                                \"defaultValue\": \"UTF-8\",\n-                                \"description\": \"The character set to use for decoding URL parameters if the HTTP Request does not supply one\",\n-                                \"displayName\": \"Default URL Character Set\",\n+                            \"Username\": {\n+                                \"description\": \"The username used for authentication. If no username is set then anonymous authentication is attempted.\",\n+                                \"displayName\": \"Username\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Default URL Character Set\",\n-                                \"required\": true,\n+                                \"name\": \"Username\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"HTTP Context Map\": {\n-                                \"description\": \"The HTTP Context Map Controller Service to use for caching the HTTP Request Information\",\n-                                \"displayName\": \"HTTP Context Map\",\n+                            \"enable-dfs\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"Enables accessing Distributed File System (DFS) and following DFS links during SMB operations.\",\n+                                \"displayName\": \"Enable DFS\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"HTTP Context Map\",\n+                                \"name\": \"enable-dfs\",\n                                 \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.http.HttpContextMap\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n+                                \"sensitive\": false\n                             },\n-                            \"HTTP Protocols\": {\n+                            \"smb-dialect\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"HTTP/1.1\",\n-                                        \"displayName\": \"http/1.1\",\n-                                        \"value\": \"HTTP_1_1\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"AUTO\",\n+                                        \"value\": \"AUTO\"\n                                     },\n                                     {\n-                                        \"description\": \"HTTP/2 and HTTP/1.1 negotiated based on requested protocols\",\n-                                        \"displayName\": \"h2 http/1.1\",\n-                                        \"value\": \"H2_HTTP_1_1\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"SMB 2.0.2\",\n+                                        \"value\": \"SMB_2_0_2\"\n                                     },\n                                     {\n-                                        \"description\": \"HTTP/2\",\n-                                        \"displayName\": \"h2\",\n-                                        \"value\": \"H2\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"HTTP_1_1\",\n-                                \"dependencies\": [\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"SMB 2.1\",\n+                                        \"value\": \"SMB_2_1\"\n+                                    },\n                                     {\n-                                        \"propertyDisplayName\": \"SSL Context Service\",\n-                                        \"propertyName\": \"SSL Context Service\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"SMB 3.0\",\n+                                        \"value\": \"SMB_3_0\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"SMB 3.0.2\",\n+                                        \"value\": \"SMB_3_0_2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"SMB 3.1.1\",\n+                                        \"value\": \"SMB_3_1_1\"\n                                     }\n                                 ],\n-                                \"description\": \"HTTP Protocols supported for Application Layer Protocol Negotiation with TLS\",\n-                                \"displayName\": \"HTTP Protocols\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"HTTP Protocols\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Hostname\": {\n-                                \"description\": \"The Hostname to bind to. If not specified, will bind to all hosts\",\n-                                \"displayName\": \"Hostname\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Hostname\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Listening Port\": {\n-                                \"defaultValue\": \"80\",\n-                                \"description\": \"The Port to listen on for incoming HTTP requests\",\n-                                \"displayName\": \"Listening Port\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Listening Port\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Maximum Threads\": {\n-                                \"defaultValue\": \"200\",\n-                                \"description\": \"The maximum number of threads that the embedded HTTP server will use for handling requests.\",\n-                                \"displayName\": \"Maximum Threads\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Maximum Threads\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"SSL Context Service\": {\n-                                \"description\": \"The SSL Context Service to use in order to secure the server. If specified, the server will accept only HTTPS requests; otherwise, the server will accept only HTTP requests\",\n-                                \"displayName\": \"SSL Context Service\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"SSL Context Service\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.ssl.RestrictedSSLContextService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            },\n-                            \"container-queue-size\": {\n-                                \"defaultValue\": \"50\",\n-                                \"description\": \"The size of the queue for Http Request Containers\",\n-                                \"displayName\": \"Container Queue Size\",\n+                                \"defaultValue\": \"AUTO\",\n+                                \"description\": \"The SMB dialect is negotiated between the client and the server by default to the highest common version supported by both end. In some rare cases, the client-server communication may fail with the automatically negotiated dialect. This property can be used to set the dialect explicitly (e.g. to downgrade to a lower version), when those situations would occur.\",\n+                                \"displayName\": \"SMB Dialect\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"container-queue-size\",\n+                                \"name\": \"smb-dialect\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"multipart-read-buffer-size\": {\n-                                \"defaultValue\": \"512 KB\",\n-                                \"description\": \"The threshold size, at which the contents of an incoming file would be written to disk. Only applies for requests with Content-Type: multipart/form-data. It is used to prevent denial of service type of attacks, to prevent filling up the heap or disk space.\",\n-                                \"displayName\": \"Multipart Read Buffer Size\",\n+                            \"timeout\": {\n+                                \"defaultValue\": \"5 sec\",\n+                                \"description\": \"Timeout for read and write operations.\",\n+                                \"displayName\": \"Timeout\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"multipart-read-buffer-size\",\n+                                \"name\": \"timeout\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"multipart-request-max-size\": {\n-                                \"defaultValue\": \"1 MB\",\n-                                \"description\": \"The max size of the request. Only applies for requests with Content-Type: multipart/form-data, and is used to prevent denial of service type of attacks, to prevent filling up the heap or disk space\",\n-                                \"displayName\": \"Multipart Request Max Size\",\n+                            \"use-encryption\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"Turns on/off encrypted communication between the client and the server. The property's behavior is SMB dialect dependent: SMB 2.x does not support encryption and the property has no effect. In case of SMB 3.x, it is a hint/request to the server to turn encryption on if the server also supports it.\",\n+                                \"displayName\": \"Use Encryption\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"multipart-request-max-size\",\n+                                \"name\": \"use-encryption\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n-                            },\n-                            \"parameters-to-attributes\": {\n-                                \"description\": \"A comma-separated list of HTTP parameters or form data to output as attributes\",\n-                                \"displayName\": \"Parameters to Attributes List\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"parameters-to-attributes\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n                             }\n                         },\n                         \"seeAlso\": [\n-                            \"org.apache.nifi.processors.standard.HandleHttpResponse\"\n+                            \"org.apache.nifi.processors.smb.FetchSmb\",\n+                            \"org.apache.nifi.processors.smb.ListSmb\",\n+                            \"org.apache.nifi.processors.smb.PutSmbFile\"\n                         ],\n                         \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"All content that is received is routed to the 'success' relationship\",\n+                                \"description\": \"All files are routed to success\",\n                                 \"name\": \"success\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n                         \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"http\",\n-                            \"https\",\n-                            \"ingress\",\n-                            \"listen\",\n-                            \"request\",\n-                            \"web service\"\n+                            \"samba, smb, cifs, files, get\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.standard.HandleHttpRequest\",\n-                        \"typeDescription\": \"Starts an HTTP Server and listens for HTTP Requests. For each request, creates a FlowFile and transfers to 'success'. This Processor is designed to be used in conjunction with the HandleHttpResponse Processor in order to create a Web Service. In case  of a multipart request, one FlowFile is generated for each part.\",\n+                        \"triggerWhenEmpty\": true,\n+                        \"type\": \"org.apache.nifi.processors.smb.GetSmbFile\",\n+                        \"typeDescription\": \"Reads file from a samba network location to FlowFiles. Use this processor instead of a cifs mounts if share access control is important. Configure the Hostname, Share and Directory accordingly: \\\\\\\\[Hostname]\\\\[Share]\\\\[path\\\\to\\\\Directory]\",\n                         \"version\": \"1.27.0\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"An identifier that allows the HandleHttpRequest and HandleHttpResponse to coordinate which FlowFile belongs to which HTTP Request/Response.\",\n-                                \"name\": \"http.context.identifier\"\n-                            },\n-                            {\n-                                \"description\": \"The MIME Type of the data, according to the HTTP Header \\\"Content-Type\\\"\",\n-                                \"name\": \"mime.type\"\n-                            },\n-                            {\n-                                \"description\": \"The part of the request URL that is considered the Servlet Path\",\n-                                \"name\": \"http.servlet.path\"\n-                            },\n-                            {\n-                                \"description\": \"The part of the request URL that is considered to be the Context Path\",\n-                                \"name\": \"http.context.path\"\n-                            },\n-                            {\n-                                \"description\": \"The HTTP Method that was used for the request, such as GET or POST\",\n-                                \"name\": \"http.method\"\n-                            },\n-                            {\n-                                \"description\": \"IP address/hostname of the server\",\n-                                \"name\": \"http.local.name\"\n-                            },\n-                            {\n-                                \"description\": \"Listening port of the server\",\n-                                \"name\": \"http.server.port\"\n-                            },\n-                            {\n-                                \"description\": \"The query string portion of the Request URL\",\n-                                \"name\": \"http.query.string\"\n-                            },\n-                            {\n-                                \"description\": \"The hostname of the requestor\",\n-                                \"name\": \"http.remote.host\"\n-                            },\n-                            {\n-                                \"description\": \"The hostname:port combination of the requestor\",\n-                                \"name\": \"http.remote.addr\"\n-                            },\n-                            {\n-                                \"description\": \"The username of the requestor\",\n-                                \"name\": \"http.remote.user\"\n-                            },\n-                            {\n-                                \"description\": \"The protocol used to communicate\",\n-                                \"name\": \"http.protocol\"\n-                            },\n-                            {\n-                                \"description\": \"The full Request URL\",\n-                                \"name\": \"http.request.uri\"\n-                            },\n-                            {\n-                                \"description\": \"The type of HTTP Authorization used\",\n-                                \"name\": \"http.auth.type\"\n-                            },\n-                            {\n-                                \"description\": \"The name of the authenticated user making the request\",\n-                                \"name\": \"http.principal.name\"\n-                            },\n-                            {\n-                                \"description\": \"Each of query parameters in the request will be added as an attribute, prefixed with \\\"http.query.param.\\\"\",\n-                                \"name\": \"http.query.param.XXX\"\n-                            },\n-                            {\n-                                \"description\": \"Form parameters in the request that are configured by \\\"Parameters to Attributes List\\\" will be added as an attribute, prefixed with \\\"http.param.\\\". Putting form parameters of large size is not recommended.\",\n-                                \"name\": \"http.param.XXX\"\n-                            },\n-                            {\n-                                \"description\": \"The Distinguished Name of the requestor. This value will not be populated unless the Processor is configured to use an SSLContext Service\",\n-                                \"name\": \"http.subject.dn\"\n-                            },\n-                            {\n-                                \"description\": \"The Distinguished Name of the entity that issued the Subject's certificate. This value will not be populated unless the Processor is configured to use an SSLContext Service\",\n-                                \"name\": \"http.issuer.dn\"\n-                            },\n-                            {\n-                                \"description\": \"X.509 Client Certificate Subject Alternative Name value from mutual TLS authentication. The attribute name has a zero-based index ordered according to the content of Client Certificate\",\n-                                \"name\": \"http.certificate.sans.N.name\"\n-                            },\n-                            {\n-                                \"description\": \"X.509 Client Certificate Subject Alternative Name type from mutual TLS authentication. The attribute name has a zero-based index ordered according to the content of Client Certificate. The attribute value is one of the General Names from RFC 3280 Section 4.1.2.7\",\n-                                \"name\": \"http.certificate.sans.N.nameType\"\n-                            },\n-                            {\n-                                \"description\": \"Each of the HTTP Headers that is received in the request will be added as an attribute, prefixed with \\\"http.headers.\\\" For example, if the request contains an HTTP Header named \\\"x-my-header\\\", then the value will be added to an attribute named \\\"http.headers.x-my-header\\\"\",\n-                                \"name\": \"http.headers.XXX\"\n-                            },\n-                            {\n-                                \"description\": \"Each of the HTTP Headers that is received in the multipart request will be added as an attribute, prefixed with \\\"http.headers.multipart.\\\" For example, if the multipart request contains an HTTP Header named \\\"content-disposition\\\", then the value will be added to an attribute named \\\"http.headers.multipart.content-disposition\\\"\",\n-                                \"name\": \"http.headers.multipart.XXX\"\n-                            },\n-                            {\n-                                \"description\": \"For requests with Content-Type \\\"multipart/form-data\\\", the part's content size is recorded into this attribute\",\n-                                \"name\": \"http.multipart.size\"\n+                                \"description\": \"The filename is set to the name of the file on the network share\",\n+                                \"name\": \"filename\"\n                             },\n                             {\n-                                \"description\": \"For requests with Content-Type \\\"multipart/form-data\\\", the part's content type is recorded into this attribute\",\n-                                \"name\": \"http.multipart.content.type\"\n+                                \"description\": \"The path is set to the relative path of the file's network share name. For example, if the input is set to \\\\\\\\hostname\\\\share\\\\tmp, files picked up from \\\\tmp will have the path attribute set to tmp\",\n+                                \"name\": \"path\"\n                             },\n                             {\n-                                \"description\": \"For requests with Content-Type \\\"multipart/form-data\\\", the part's name is recorded into this attribute\",\n-                                \"name\": \"http.multipart.name\"\n+                                \"description\": \"The date and time that the file was created. May not work on all file systems\",\n+                                \"name\": \"file.creationTime\"\n                             },\n                             {\n-                                \"description\": \"For requests with Content-Type \\\"multipart/form-data\\\", when the part contains an uploaded file, the name of the file is recorded into this attribute. Files are stored temporarily at the default temporary-file directory specified in \\\"java.io.File\\\" Java Docs)\",\n-                                \"name\": \"http.multipart.filename\"\n+                                \"description\": \"The date and time that the file was last modified. May not work on all file systems\",\n+                                \"name\": \"file.lastModifiedTime\"\n                             },\n                             {\n-                                \"description\": \"For requests with Content-Type \\\"multipart/form-data\\\", the part's index is recorded into this attribute. The index starts with 1.\",\n-                                \"name\": \"http.multipart.fragments.sequence.number\"\n+                                \"description\": \"The date and time that the file was last accessed. May not work on all file systems\",\n+                                \"name\": \"file.lastAccessTime\"\n                             },\n                             {\n-                                \"description\": \"For requests with Content-Type \\\"multipart/form-data\\\", the count of all parts is recorded into this attribute.\",\n-                                \"name\": \"http.multipart.fragments.total.number\"\n+                                \"description\": \"The full path from where a file was picked up. This includes the hostname and the share name\",\n+                                \"name\": \"absolute.path\"\n                             }\n                         ]\n                     },\n                     {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-standard-nar\",\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-smb-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n                         },\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"0 sec\"\n+                            \"TIMER_DRIVEN\": \"1 min\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n-                        \"dynamicProperties\": [\n-                            {\n-                                \"description\": \"These HTTPHeaders are set in the HTTP Response\",\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"name\": \"An HTTP header name\",\n-                                \"value\": \"An HTTP header value\"\n-                            }\n-                        ],\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_REQUIRED\",\n-                        \"primaryNodeOnly\": false,\n+                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n+                        \"primaryNodeOnly\": true,\n                         \"propertyDescriptors\": {\n-                            \"Attributes to add to the HTTP Response (Regex)\": {\n-                                \"description\": \"Specifies the Regular Expression that determines the names of FlowFile attributes that should be added to the HTTP response\",\n-                                \"displayName\": \"Attributes to add to the HTTP Response (Regex)\",\n+                            \"directory\": {\n+                                \"description\": \"The network folder from which to list files. This is the remaining relative path after the share: smb://HOSTNAME:PORT/SHARE/[DIRECTORY]/sub/directories. It is also possible to add subdirectories. The given path on the remote file share must exist. This can be checked using verification. You may mix Windows and Linux-style directory separators.\",\n+                                \"displayName\": \"Input Directory\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Attributes to add to the HTTP Response (Regex)\",\n+                                \"name\": \"directory\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"HTTP Context Map\": {\n-                                \"description\": \"The HTTP Context Map Controller Service to use for caching the HTTP Request Information\",\n-                                \"displayName\": \"HTTP Context Map\",\n+                            \"et-initial-listing-target\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"Ignore entities having timestamp older than the specified 'Tracking Time Window' at the initial listing activity.\",\n+                                        \"displayName\": \"Tracking Time Window\",\n+                                        \"value\": \"window\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Regardless of entities timestamp, all existing entities will be listed at the initial listing activity.\",\n+                                        \"displayName\": \"All Available\",\n+                                        \"value\": \"all\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"all\",\n+                                \"description\": \"Specify how initial listing should be handled. Used by 'Tracking Entities' strategy.\",\n+                                \"displayName\": \"Entity Tracking Initial Listing Target\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"HTTP Context Map\",\n-                                \"required\": true,\n+                                \"name\": \"et-initial-listing-target\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"et-state-cache\": {\n+                                \"description\": \"Listed entities are stored in the specified cache storage so that this processor can resume listing across NiFi restart or in case of primary node change. 'Tracking Entities' strategy require tracking information of all listed entities within the last 'Tracking Time Window'. To support large number of entities, the strategy uses DistributedMapCache instead of managed state. Cache key format is 'ListedEntities::{processorId}(::{nodeId})'. If it tracks per node listed entities, then the optional '::{nodeId}' part is added to manage state separately. E.g. cluster wide cache key = 'ListedEntities::8dda2321-0164-1000-50fa-3042fe7d6a7b', per node cache key = 'ListedEntities::8dda2321-0164-1000-50fa-3042fe7d6a7b::nifi-node3' The stored cache content is Gzipped JSON string. The cache key will be deleted when target listing configuration is changed. Used by 'Tracking Entities' strategy.\",\n+                                \"displayName\": \"Entity Tracking State Cache\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"et-state-cache\",\n+                                \"required\": false,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n                                     \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.http.HttpContextMap\",\n+                                    \"type\": \"org.apache.nifi.distributed.cache.client.DistributedMapCacheClient\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             },\n-                            \"HTTP Status Code\": {\n-                                \"description\": \"The HTTP Status Code to use when responding to the HTTP Request. See Section 10 of RFC 2616 for more information.\",\n-                                \"displayName\": \"HTTP Status Code\",\n+                            \"et-time-window\": {\n+                                \"defaultValue\": \"3 hours\",\n+                                \"description\": \"Specify how long this processor should track already-listed entities. 'Tracking Entities' strategy can pick any entity whose timestamp is inside the specified time window. For example, if set to '30 minutes', any entity having timestamp in recent 30 minutes will be the listing target when this processor runs. A listed entity is considered 'new/updated' and a FlowFile is emitted if one of following condition meets: 1. does not exist in the already-listed entities, 2. has newer timestamp than the cached entity, 3. has different size than the cached entity. If a cached entity's timestamp becomes older than specified time window, that entity will be removed from the cached already-listed entities. Used by 'Tracking Entities' strategy.\",\n+                                \"displayName\": \"Entity Tracking Time Window\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"HTTP Status Code\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"et-time-window\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n-                            }\n-                        },\n-                        \"readsAttributes\": [\n-                            {\n-                                \"description\": \"The value of this attribute is used to lookup the HTTP Response so that the proper message can be sent back to the requestor. If this attribute is missing, the FlowFile will be routed to 'failure.'\",\n-                                \"name\": \"http.context.identifier\"\n-                            },\n-                            {\n-                                \"description\": \"Value of the URI requested by the client. Used for provenance event.\",\n-                                \"name\": \"http.request.uri\"\n-                            },\n-                            {\n-                                \"description\": \"IP address of the client. Used for provenance event.\",\n-                                \"name\": \"http.remote.host\"\n-                            },\n-                            {\n-                                \"description\": \"IP address/hostname of the server. Used for provenance event.\",\n-                                \"name\": \"http.local.name\"\n-                            },\n-                            {\n-                                \"description\": \"Listening port of the server. Used for provenance event.\",\n-                                \"name\": \"http.server.port\"\n-                            },\n-                            {\n-                                \"description\": \"SSL distinguished name (if any). Used for provenance event.\",\n-                                \"name\": \"http.subject.dn\"\n-                            }\n-                        ],\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.http.StandardHttpContextMap\",\n-                            \"org.apache.nifi.processors.standard.HandleHttpRequest\"\n-                        ],\n-                        \"sideEffectFree\": false,\n-                        \"supportedRelationships\": [\n-                            {\n-                                \"description\": \"FlowFiles will be routed to this Relationship after the response has been successfully sent to the requestor\",\n-                                \"name\": \"success\"\n                             },\n-                            {\n-                                \"description\": \"FlowFiles will be routed to this Relationship if the Processor is unable to respond to the requestor. This may happen, for instance, if the connection times out or if NiFi is restarted before responding to the HTTP Request.\",\n-                                \"name\": \"failure\"\n-                            }\n-                        ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": false,\n-                        \"supportsDynamicProperties\": true,\n-                        \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": false,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"egress\",\n-                            \"http\",\n-                            \"https\",\n-                            \"response\",\n-                            \"web service\"\n-                        ],\n-                        \"triggerSerially\": false,\n-                        \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.standard.HandleHttpResponse\",\n-                        \"typeDescription\": \"Sends an HTTP Response to the Requestor that generated a FlowFile. This Processor is designed to be used in conjunction with the HandleHttpRequest in order to create a web service.\",\n-                        \"version\": \"1.27.0\"\n-                    },\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-standard-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"e0c4461\"\n-                        },\n-                        \"defaultBulletinLevel\": \"WARN\",\n-                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": 1,\n-                            \"EVENT_DRIVEN\": 0,\n-                            \"TIMER_DRIVEN\": 1\n-                        },\n-                        \"defaultPenaltyDuration\": \"30 sec\",\n-                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"0 sec\"\n-                        },\n-                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n-                        \"defaultYieldDuration\": \"1 sec\",\n-                        \"deprecated\": true,\n-                        \"deprecationAlternatives\": [\n-                            \"org.apache.nifi.processors.attributes.UpdateAttribute\"\n-                        ],\n-                        \"deprecationReason\": \"UpdateAttribute can be configured using the hash Expression Language function to digest one or more attributes\",\n-                        \"dynamicProperties\": [\n-                            {\n-                                \"description\": \"This regular expression is evaluated against the flowfile attribute values. If the regular expression contains a capturing group, the value of that group will be used when comparing flow file attributes. Otherwise, the original flow file attribute's value will be used if and only if the value matches the given regular expression.\",\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"name\": \"A flowfile attribute key for attribute inspection\",\n-                                \"value\": \"A Regular Expression\"\n-                            }\n-                        ],\n-                        \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_REQUIRED\",\n-                        \"primaryNodeOnly\": false,\n-                        \"propertyDescriptors\": {\n-                            \"Hash Value Attribute Key\": {\n-                                \"description\": \"The name of the flowfile attribute where the hash value should be stored\",\n-                                \"displayName\": \"Hash Value Attribute Key\",\n+                            \"file-name-suffix-filter\": {\n+                                \"description\": \"Files ending with the given suffix will be omitted. Can be used to make sure that files that are still uploading are not listed multiple times, by having those files have a suffix and remove the suffix once the upload finishes. This is highly recommended when using 'Tracking Entities' or 'Tracking Timestamps' listing strategies.\",\n+                                \"displayName\": \"File Name Suffix Filter\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Hash Value Attribute Key\",\n-                                \"required\": true,\n+                                \"name\": \"file-name-suffix-filter\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n-                            }\n-                        },\n-                        \"sideEffectFree\": true,\n-                        \"supportedRelationships\": [\n-                            {\n-                                \"description\": \"Used for flowfiles that have a hash value added\",\n-                                \"name\": \"success\"\n                             },\n-                            {\n-                                \"description\": \"Used for flowfiles that are missing required attributes\",\n-                                \"name\": \"failure\"\n-                            }\n-                        ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\",\n-                            \"EVENT_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": true,\n-                        \"supportsDynamicProperties\": true,\n-                        \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": true,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"attributes\",\n-                            \"hash\"\n-                        ],\n-                        \"triggerSerially\": false,\n-                        \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.standard.HashAttribute\",\n-                        \"typeDescription\": \"Hashes together the key/value pairs of several flowfile attributes and adds the hash as a new attribute. Optional properties are to be added such that the name of the property is the name of a flowfile attribute to consider and the value of the property is a regular expression that, if matched by the attribute value, will cause that attribute to be used as part of the hash. If the regular expression contains a capturing group, only the value of the capturing group will be used. For a processor which accepts various attributes and generates a cryptographic hash of each, see \\\"CryptographicHashAttribute\\\". \",\n-                        \"version\": \"1.27.0\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"This Processor adds an attribute whose value is the result of Hashing the existing flowfile attributes. The name of this attribute is specified by the <Hash Value Attribute Key> property.\",\n-                                \"name\": \"<Hash Value Attribute Key>\"\n-                            }\n-                        ]\n-                    },\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-standard-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"e0c4461\"\n-                        },\n-                        \"defaultBulletinLevel\": \"WARN\",\n-                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": 1,\n-                            \"EVENT_DRIVEN\": 0,\n-                            \"TIMER_DRIVEN\": 1\n-                        },\n-                        \"defaultPenaltyDuration\": \"30 sec\",\n-                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"0 sec\"\n-                        },\n-                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n-                        \"defaultYieldDuration\": \"1 sec\",\n-                        \"deprecated\": true,\n-                        \"deprecationAlternatives\": [\n-                            \"org.apache.nifi.processors.standard.CryptographicHashContent\"\n-                        ],\n-                        \"deprecationReason\": \"This processor is deprecated and may be removed in future releases.\",\n-                        \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_REQUIRED\",\n-                        \"primaryNodeOnly\": false,\n-                        \"propertyDescriptors\": {\n-                            \"Hash Algorithm\": {\n+                            \"listing-strategy\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"1.0.10118.3.0.55\",\n-                                        \"value\": \"1.0.10118.3.0.55\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"SHA-1\",\n-                                        \"value\": \"SHA-1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"SHA-384\",\n-                                        \"value\": \"SHA-384\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"HARAKA-256\",\n-                                        \"value\": \"HARAKA-256\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"SKEIN-512-256\",\n-                                        \"value\": \"SKEIN-512-256\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"SKEIN-1024-384\",\n-                                        \"value\": \"SKEIN-1024-384\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"BLAKE3-256\",\n-                                        \"value\": \"BLAKE3-256\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"BLAKE2B-160\",\n-                                        \"value\": \"BLAKE2B-160\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"SHA\",\n-                                        \"value\": \"SHA\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"KECCAK-288\",\n-                                        \"value\": \"KECCAK-288\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"WHIRLPOOL\",\n-                                        \"value\": \"WHIRLPOOL\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"SKEIN-512-384\",\n-                                        \"value\": \"SKEIN-512-384\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"SHA-224\",\n-                                        \"value\": \"SHA-224\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"SM3\",\n-                                        \"value\": \"SM3\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"BLAKE2B-512\",\n-                                        \"value\": \"BLAKE2B-512\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"OID.1.0.10118.3.0.55\",\n-                                        \"value\": \"OID.1.0.10118.3.0.55\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"TUPLEHASH128-256\",\n-                                        \"value\": \"TUPLEHASH128-256\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"GOST3411-2012-512\",\n-                                        \"value\": \"GOST3411-2012-512\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"KECCAK-256\",\n-                                        \"value\": \"KECCAK-256\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"SKEIN-512-128\",\n-                                        \"value\": \"SKEIN-512-128\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"BLAKE2B-384\",\n-                                        \"value\": \"BLAKE2B-384\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"SHAKE256-512\",\n-                                        \"value\": \"SHAKE256-512\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"OID.2.16.840.1.101.3.4.2.12\",\n-                                        \"value\": \"OID.2.16.840.1.101.3.4.2.12\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"OID.2.16.840.1.101.3.4.2.11\",\n-                                        \"value\": \"OID.2.16.840.1.101.3.4.2.11\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"SKEIN-256-160\",\n-                                        \"value\": \"SKEIN-256-160\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"OID.2.16.840.1.101.3.4.2.10\",\n-                                        \"value\": \"OID.2.16.840.1.101.3.4.2.10\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"DSTU7564-256\",\n-                                        \"value\": \"DSTU7564-256\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"SHA-256\",\n-                                        \"value\": \"SHA-256\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"BLAKE2S-224\",\n-                                        \"value\": \"BLAKE2S-224\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"SHA3-256\",\n-                                        \"value\": \"SHA3-256\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"KECCAK-384\",\n-                                        \"value\": \"KECCAK-384\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"SKEIN-256-128\",\n-                                        \"value\": \"SKEIN-256-128\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"DSTU7564-384\",\n-                                        \"value\": \"DSTU7564-384\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"HARAKA-512\",\n-                                        \"value\": \"HARAKA-512\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"PARALLELHASH128-256\",\n-                                        \"value\": \"PARALLELHASH128-256\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"SHAKE128-256\",\n-                                        \"value\": \"SHAKE128-256\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"KECCAK-224\",\n-                                        \"value\": \"KECCAK-224\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"SKEIN-512-512\",\n-                                        \"value\": \"SKEIN-512-512\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"PARALLELHASH256-512\",\n-                                        \"value\": \"PARALLELHASH256-512\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"SKEIN-1024-512\",\n-                                        \"value\": \"SKEIN-1024-512\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"SKEIN-512-160\",\n-                                        \"value\": \"SKEIN-512-160\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"OID.1.2.804.2.1.1.1.1.2.2.3\",\n-                                        \"value\": \"OID.1.2.804.2.1.1.1.1.2.2.3\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"GOST3411\",\n-                                        \"value\": \"GOST3411\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"1.2.804.2.1.1.1.1.2.2.3\",\n-                                        \"value\": \"1.2.804.2.1.1.1.1.2.2.3\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"BLAKE2B-256\",\n-                                        \"value\": \"BLAKE2B-256\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"OID.1.2.804.2.1.1.1.1.2.2.2\",\n-                                        \"value\": \"OID.1.2.804.2.1.1.1.1.2.2.2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"SKEIN-1024-1024\",\n-                                        \"value\": \"SKEIN-1024-1024\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"OID.1.2.804.2.1.1.1.1.2.2.1\",\n-                                        \"value\": \"OID.1.2.804.2.1.1.1.1.2.2.1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"SHA3-384\",\n-                                        \"value\": \"SHA3-384\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"SHA-512/224\",\n-                                        \"value\": \"SHA-512/224\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"OID.2.16.840.1.101.3.4.2.9\",\n-                                        \"value\": \"OID.2.16.840.1.101.3.4.2.9\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"BLAKE2S-256\",\n-                                        \"value\": \"BLAKE2S-256\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"OID.2.16.840.1.101.3.4.2.8\",\n-                                        \"value\": \"OID.2.16.840.1.101.3.4.2.8\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"OID.2.16.840.1.101.3.4.2.7\",\n-                                        \"value\": \"OID.2.16.840.1.101.3.4.2.7\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"TIGER\",\n-                                        \"value\": \"TIGER\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"RIPEMD256\",\n-                                        \"value\": \"RIPEMD256\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"SHA3-224\",\n-                                        \"value\": \"SHA3-224\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"SKEIN-256-256\",\n-                                        \"value\": \"SKEIN-256-256\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"SHA3-512\",\n-                                        \"value\": \"SHA3-512\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"RIPEMD320\",\n-                                        \"value\": \"RIPEMD320\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"2.16.840.1.101.3.4.2.9\",\n-                                        \"value\": \"2.16.840.1.101.3.4.2.9\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"RIPEMD160\",\n-                                        \"value\": \"RIPEMD160\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"TUPLEHASH256-512\",\n-                                        \"value\": \"TUPLEHASH256-512\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"GOST3411-2012-256\",\n-                                        \"value\": \"GOST3411-2012-256\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"2.16.840.1.101.3.4.2.8\",\n-                                        \"value\": \"2.16.840.1.101.3.4.2.8\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"1.2.804.2.1.1.1.1.2.2.1\",\n-                                        \"value\": \"1.2.804.2.1.1.1.1.2.2.1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"KECCAK-512\",\n-                                        \"value\": \"KECCAK-512\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"SKEIN-512-224\",\n-                                        \"value\": \"SKEIN-512-224\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"2.16.840.1.101.3.4.2.7\",\n-                                        \"value\": \"2.16.840.1.101.3.4.2.7\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"1.2.804.2.1.1.1.1.2.2.2\",\n-                                        \"value\": \"1.2.804.2.1.1.1.1.2.2.2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"2.16.840.1.101.3.4.2.12\",\n-                                        \"value\": \"2.16.840.1.101.3.4.2.12\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"2.16.840.1.101.3.4.2.10\",\n-                                        \"value\": \"2.16.840.1.101.3.4.2.10\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"2.16.840.1.101.3.4.2.11\",\n-                                        \"value\": \"2.16.840.1.101.3.4.2.11\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"BLAKE2S-160\",\n-                                        \"value\": \"BLAKE2S-160\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"SHA-512/256\",\n-                                        \"value\": \"SHA-512/256\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"MD2\",\n-                                        \"value\": \"MD2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"RIPEMD128\",\n-                                        \"value\": \"RIPEMD128\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"MD4\",\n-                                        \"value\": \"MD4\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"SHA-512\",\n-                                        \"value\": \"SHA-512\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"SKEIN-256-224\",\n-                                        \"value\": \"SKEIN-256-224\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"MD5\",\n-                                        \"value\": \"MD5\"\n+                                        \"description\": \"This strategy tracks information of all the listed entities within the latest 'Entity Tracking Time Window' to determine new/updated entities. This strategy can pick entities having old timestamp that can be missed with 'Tracking Timestamps'. Works even when multiple subdirectories are being written at the same time while listing is running. However additional DistributedMapCache controller service is required and more JVM heap memory is used. See the description of 'Entity Tracking Time Window' property for further details on how it works.\",\n+                                        \"displayName\": \"Tracking Entities\",\n+                                        \"value\": \"entities\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"BLAKE2S-128\",\n-                                        \"value\": \"BLAKE2S-128\"\n+                                        \"description\": \"This strategy lists an entity without any tracking. The same entity will be listed each time on executing this processor. It is recommended to change the default run schedule value. Any property that related to the persisting state will be disregarded.\",\n+                                        \"displayName\": \"No Tracking\",\n+                                        \"value\": \"none\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"DSTU7564-512\",\n-                                        \"value\": \"DSTU7564-512\"\n+                                        \"description\": \"This strategy tracks the latest timestamp of listed entity to determine new/updated entities. Since it only tracks few timestamps, it can manage listing state efficiently. However, any newly added, or updated entity having timestamp older than the tracked latest timestamp can not be picked by this strategy. For example, such situation can happen in a file system if a file with old timestamp is copied or moved into the target directory without its last modified timestamp being updated. Also may miss files when multiple subdirectories are being written at the same time while listing is running.\",\n+                                        \"displayName\": \"Tracking Timestamps\",\n+                                        \"value\": \"timestamps\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"MD5\",\n-                                \"description\": \"Determines what hashing algorithm should be used to perform the hashing function\",\n-                                \"displayName\": \"Hash Algorithm\",\n+                                \"defaultValue\": \"timestamps\",\n+                                \"description\": \"Specify how to determine new/updated entities. See each strategy descriptions for detail.\",\n+                                \"displayName\": \"Listing Strategy\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Hash Algorithm\",\n+                                \"name\": \"listing-strategy\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Hash Attribute Name\": {\n-                                \"defaultValue\": \"hash.value\",\n-                                \"description\": \"The name of the FlowFile Attribute into which the Hash Value should be written. If the value already exists, it will be overwritten\",\n-                                \"displayName\": \"Hash Attribute Name\",\n+                            \"max-file-age\": {\n+                                \"description\": \"Any file older than the given value will be omitted.\",\n+                                \"displayName\": \"Maximum File Age\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Hash Attribute Name\",\n-                                \"required\": true,\n+                                \"name\": \"max-file-age\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n-                            }\n-                        },\n-                        \"sideEffectFree\": false,\n-                        \"supportedRelationships\": [\n-                            {\n-                                \"description\": \"FlowFiles that are process successfully will be sent to this relationship\",\n-                                \"name\": \"success\"\n                             },\n-                            {\n-                                \"description\": \"Any FlowFile that cannot be processed successfully will be sent to this relationship without any attribute being added\",\n-                                \"name\": \"failure\"\n-                            }\n-                        ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\",\n-                            \"EVENT_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": true,\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": true,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"MD5\",\n-                            \"SHA-1\",\n-                            \"SHA-256\",\n-                            \"content\",\n-                            \"hash\"\n-                        ],\n-                        \"triggerSerially\": false,\n-                        \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.standard.HashContent\",\n-                        \"typeDescription\": \"Calculates a hash value for the Content of a FlowFile and puts that hash value on the FlowFile as an attribute whose name is determined by the <Hash Attribute Name> property. This processor did not provide a consistent offering of hash algorithms, and is now deprecated. For modern cryptographic hashing capabilities, see \\\"CryptographicHashContent\\\". \",\n-                        \"version\": \"1.27.0\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"This Processor adds an attribute whose value is the result of Hashing the existing FlowFile content. The name of this attribute is specified by the <Hash Attribute Name> property\",\n-                                \"name\": \"<Hash Attribute Name>\"\n-                            }\n-                        ]\n-                    },\n-                    {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-standard-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"e0c4461\"\n-                        },\n-                        \"defaultBulletinLevel\": \"WARN\",\n-                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": 1,\n-                            \"EVENT_DRIVEN\": 0,\n-                            \"TIMER_DRIVEN\": 1\n-                        },\n-                        \"defaultPenaltyDuration\": \"30 sec\",\n-                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"0 sec\"\n-                        },\n-                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n-                        \"defaultYieldDuration\": \"1 sec\",\n-                        \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_REQUIRED\",\n-                        \"primaryNodeOnly\": false,\n-                        \"propertyDescriptors\": {\n-                            \"config-body\": {\n-                                \"description\": \"Body of MIME type config file. Only one of Config File or Config Body may be used.\",\n-                                \"displayName\": \"Config Body\",\n+                            \"max-file-size\": {\n+                                \"description\": \"Any file larger than the given value will be omitted.\",\n+                                \"displayName\": \"Maximum File Size\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"config-body\",\n+                                \"name\": \"max-file-size\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"config-file\": {\n-                                \"description\": \"Path to MIME type config file. Only one of Config File or Config Body may be used.\",\n-                                \"displayName\": \"Config File\",\n+                            \"min-file-age\": {\n+                                \"defaultValue\": \"5 secs\",\n+                                \"description\": \"The minimum age that a file must be in order to be listed; any file younger than this amount of time will be ignored.\",\n+                                \"displayName\": \"Minimum File Age\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"config-file\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"min-file-age\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"min-file-size\": {\n+                                \"description\": \"Any file smaller than the given value will be omitted.\",\n+                                \"displayName\": \"Minimum File Size\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"min-file-size\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"use-filename-in-detection\": {\n+                            \"record-writer\": {\n+                                \"description\": \"Specifies the Record Writer to use for creating the listing. If not specified, one FlowFile will be created for each entity that is listed. If the Record Writer is specified, all entities will be written to a single FlowFile instead of adding attributes to individual FlowFiles.\",\n+                                \"displayName\": \"Record Writer\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"record-writer\",\n+                                \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"smb-client-provider-service\": {\n+                                \"description\": \"Specifies the SMB client provider to use for creating SMB connections.\",\n+                                \"displayName\": \"SMB Client Provider Service\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"smb-client-provider-service\",\n+                                \"required\": true,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-smb-client-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.services.smb.SmbClientProviderService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"target-system-timestamp-precision\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"description\": \"Automatically detect time unit deterministically based on candidate entries timestamp. Please note that this option may take longer to list entities unnecessarily, if none of entries has a precise precision timestamp. E.g. even if a target system supports millis, if all entries only have timestamps without millis, such as '2017-06-16 09:06:34.000', then its precision is determined as 'seconds'.\",\n+                                        \"displayName\": \"Auto Detect\",\n+                                        \"value\": \"auto-detect\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"description\": \"This option provides the minimum latency for an entry from being available to being listed if target system supports millis, if not, use other options.\",\n+                                        \"displayName\": \"Milliseconds\",\n+                                        \"value\": \"millis\"\n+                                    },\n+                                    {\n+                                        \"description\": \"For a target system that does not have millis precision, but has in seconds.\",\n+                                        \"displayName\": \"Seconds\",\n+                                        \"value\": \"seconds\"\n+                                    },\n+                                    {\n+                                        \"description\": \"For a target system that only supports precision in minutes.\",\n+                                        \"displayName\": \"Minutes\",\n+                                        \"value\": \"minutes\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"true\",\n-                                \"description\": \"If true will pass the filename to Tika to aid in detection.\",\n-                                \"displayName\": \"Use Filename In Detection\",\n+                                \"defaultValue\": \"auto-detect\",\n+                                \"description\": \"Specify timestamp precision at the target system. Since this processor uses timestamp of entities to decide which should be listed, it is crucial to use the right timestamp precision.\",\n+                                \"displayName\": \"Target System Timestamp Precision\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"use-filename-in-detection\",\n+                                \"name\": \"target-system-timestamp-precision\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             }\n                         },\n-                        \"sideEffectFree\": true,\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.processors.smb.FetchSmb\",\n+                            \"org.apache.nifi.processors.smb.GetSmbFile\",\n+                            \"org.apache.nifi.processors.smb.PutSmbFile\"\n+                        ],\n+                        \"sideEffectFree\": false,\n+                        \"stateful\": {\n+                            \"description\": \"After performing a listing of files, the state of the previous listing can be stored in order to list files continuously without duplication.\",\n+                            \"scopes\": [\n+                                \"CLUSTER\"\n+                            ]\n+                        },\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"All FlowFiles are routed to success\",\n+                                \"description\": \"All FlowFiles that are received are routed to success\",\n                                 \"name\": \"success\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\",\n-                            \"EVENT_DRIVEN\"\n+                            \"CRON_DRIVEN\"\n                         ],\n-                        \"supportsBatching\": true,\n+                        \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": true,\n+                        \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"MIME\",\n-                            \"bzip2\",\n-                            \"compression\",\n-                            \"file\",\n-                            \"gzip\",\n-                            \"identify\",\n-                            \"mime.type\",\n-                            \"zip\"\n+                            \"list\",\n+                            \"samba, smb, cifs, files\"\n                         ],\n-                        \"triggerSerially\": false,\n+                        \"triggerSerially\": true,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.standard.IdentifyMimeType\",\n-                        \"typeDescription\": \"Attempts to identify the MIME Type used for a FlowFile. If the MIME Type can be identified, an attribute with the name 'mime.type' is added with the value being the MIME Type. If the MIME Type cannot be determined, the value will be set to 'application/octet-stream'. In addition, the attribute 'mime.extension' will be set if a common file extension for the MIME Type is known. If the MIME Type detected is of type text/*, attempts to identify the charset used and an attribute with the name 'mime.charset' is added with the value being the charset.If both Config File and Config Body are not set, the default NiFi MIME Types will be used.\",\n+                        \"type\": \"org.apache.nifi.processors.smb.ListSmb\",\n+                        \"typeDescription\": \"Lists concrete files shared via SMB protocol. Each listed file may result in one flowfile, the metadata being written as flowfile attributes. Or - in case the 'Record Writer' property is set - the entire result is written as records to a single flowfile. This Processor is designed to run on Primary Node only in a cluster. If the primary node changes, the new Primary Node will pick up where the previous node left off without duplicating all of the data.\",\n                         \"version\": \"1.27.0\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"This Processor sets the FlowFile's mime.type attribute to the detected MIME Type. If unable to detect the MIME Type, the attribute's value will be set to application/octet-stream\",\n-                                \"name\": \"mime.type\"\n+                                \"description\": \"The name of the file that was read from filesystem.\",\n+                                \"name\": \"filename\"\n                             },\n                             {\n-                                \"description\": \"This Processor sets the FlowFile's mime.extension attribute to the file extension associated with the detected MIME Type. If there is no correlated extension, the attribute's value will be empty\",\n-                                \"name\": \"mime.extension\"\n+                                \"description\": \"The short name of the file that was read from filesystem.\",\n+                                \"name\": \"shortName\"\n                             },\n                             {\n-                                \"description\": \"This Processor sets the FlowFile's mime.charset attribute to the detected charset. If unable to detect the charset or the detected MIME type is not of type text/*, the attribute will not be set\",\n-                                \"name\": \"mime.charset\"\n+                                \"description\": \"The path is set to the relative path of the file's directory on the remote filesystem compared to the Share root directory. For example, for a given remote locationsmb://HOSTNAME:PORT/SHARE/DIRECTORY, and a file is being listed from smb://HOSTNAME:PORT/SHARE/DIRECTORY/sub/folder/file then the path attribute will be set to \\\"DIRECTORY/sub/folder\\\".\",\n+                                \"name\": \"path\"\n+                            },\n+                            {\n+                                \"description\": \"The SMB URL of the share.\",\n+                                \"name\": \"serviceLocation\"\n+                            },\n+                            {\n+                                \"description\": \"The timestamp of when the file's content changed in the filesystem as 'yyyy-MM-dd'T'HH:mm:ss'.\",\n+                                \"name\": \"lastModifiedTime\"\n+                            },\n+                            {\n+                                \"description\": \"The timestamp of when the file was created in the filesystem as 'yyyy-MM-dd'T'HH:mm:ss'.\",\n+                                \"name\": \"creationTime\"\n+                            },\n+                            {\n+                                \"description\": \"The timestamp of when the file was accessed in the filesystem as 'yyyy-MM-dd'T'HH:mm:ss'.\",\n+                                \"name\": \"lastAccessTime\"\n+                            },\n+                            {\n+                                \"description\": \"The timestamp of when the file's attributes was changed in the filesystem as 'yyyy-MM-dd'T'HH:mm:ss'.\",\n+                                \"name\": \"changeTime\"\n+                            },\n+                            {\n+                                \"description\": \"The size of the file in bytes.\",\n+                                \"name\": \"size\"\n+                            },\n+                            {\n+                                \"description\": \"The number of bytes allocated for the file on the server.\",\n+                                \"name\": \"allocationSize\"\n                             }\n                         ]\n                     },\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-standard-nar\",\n+                        \"artifact\": \"nifi-smb-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -107506,1546 +107532,1244 @@\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n-                        \"dynamicProperties\": [\n-                            {\n-                                \"description\": \"Send request header with a key matching the Dynamic Property Key and a value created by evaluating the Attribute Expression Language set in the value of the Dynamic Property.\",\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"name\": \"Header Name\",\n-                                \"value\": \"Attribute Expression Language\"\n-                            },\n-                            {\n-                                \"description\": \"When the HTTP Method is POST, dynamic properties with the property name in the form of post:form:<NAME>, where the <NAME> will be the form data name, will be used to fill out the multipart form parts.  If send message body is false, the flowfile will not be sent, but any other form data will be.\",\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"name\": \"post:form:<NAME>\",\n-                                \"value\": \"Attribute Expression Language\"\n-                            }\n-                        ],\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_ALLOWED\",\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Add Response Headers to Request\": {\n+                            \"Batch Size\": {\n+                                \"defaultValue\": \"100\",\n+                                \"description\": \"The maximum number of files to put in each iteration\",\n+                                \"displayName\": \"Batch Size\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Batch Size\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Conflict Resolution Strategy\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"displayName\": \"replace\",\n+                                        \"value\": \"replace\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"displayName\": \"ignore\",\n+                                        \"value\": \"ignore\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"fail\",\n+                                        \"value\": \"fail\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"Enable adding HTTP response headers as attributes to FlowFiles transferred to the Original relationship.\",\n-                                \"displayName\": \"Response Header Request Attributes Enabled\",\n+                                \"defaultValue\": \"replace\",\n+                                \"description\": \"Indicates what should happen when a file with the same name already exists in the output directory\",\n+                                \"displayName\": \"Conflict Resolution Strategy\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Add Response Headers to Request\",\n-                                \"required\": false,\n+                                \"name\": \"Conflict Resolution Strategy\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Always Output Response\": {\n+                            \"Create Missing Directories\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"true\",\n                                         \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"false\",\n                                         \"value\": \"false\"\n                                     }\n                                 ],\n                                 \"defaultValue\": \"false\",\n-                                \"description\": \"Enable generation and transfer of a FlowFile to the Response relationship regardless of HTTP response received.\",\n-                                \"displayName\": \"Response Generation Required\",\n+                                \"description\": \"If true, then missing destination directories will be created. If false, flowfiles are penalized and sent to failure.\",\n+                                \"displayName\": \"Create Missing Directories\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Always Output Response\",\n+                                \"name\": \"Create Missing Directories\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Directory\": {\n+                                \"description\": \"The network folder to which files should be written. This is the remaining relative path after the share: \\\\\\\\hostname\\\\share\\\\[dir1\\\\dir2]. You may use expression language.\",\n+                                \"displayName\": \"Directory\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Directory\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Attributes to Send\": {\n-                                \"description\": \"Regular expression that defines which FlowFile attributes to send as HTTP headers in the request. If not defined, no attributes are sent as headers. Dynamic properties will be always be sent as headers. The dynamic property name will be the header key and the dynamic property value, interpreted as Expression Language, will be the header value. Attributes and their values are limited to ASCII characters due to the requirement of the HTTP protocol.\",\n-                                \"displayName\": \"Request Header Attributes Pattern\",\n+                            \"Domain\": {\n+                                \"description\": \"The domain used for authentication. Optional, in most cases username and password is sufficient.\",\n+                                \"displayName\": \"Domain\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Attributes to Send\",\n+                                \"name\": \"Domain\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Basic Authentication Password\": {\n-                                \"description\": \"The password provided for authentication of HTTP requests. Encoded using Base64 for HTTP Basic Authentication as described in RFC 7617.\",\n-                                \"displayName\": \"Request Password\",\n+                            \"Hostname\": {\n+                                \"description\": \"The network host to which files should be written.\",\n+                                \"displayName\": \"Hostname\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Basic Authentication Password\",\n-                                \"required\": false,\n-                                \"sensitive\": true\n+                                \"name\": \"Hostname\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n                             },\n-                            \"Basic Authentication Username\": {\n-                                \"description\": \"The username provided for authentication of HTTP requests. Encoded using Base64 for HTTP Basic Authentication as described in RFC 7617.\",\n-                                \"displayName\": \"Request Username\",\n+                            \"Password\": {\n+                                \"description\": \"The password used for authentication. Required if Username is set.\",\n+                                \"displayName\": \"Password\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Basic Authentication Username\",\n+                                \"name\": \"Password\",\n                                 \"required\": false,\n-                                \"sensitive\": false\n+                                \"sensitive\": true\n                             },\n-                            \"Connection Timeout\": {\n-                                \"defaultValue\": \"5 secs\",\n-                                \"description\": \"Maximum time to wait for initial socket connection to the HTTP URL.\",\n-                                \"displayName\": \"Socket Connect Timeout\",\n+                            \"Share\": {\n+                                \"description\": \"The network share to which files should be written. This is the \\\"first folder\\\"after the hostname: \\\\\\\\hostname\\\\[share]\\\\dir1\\\\dir2\",\n+                                \"displayName\": \"Share\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Connection Timeout\",\n+                                \"name\": \"Share\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Content-Encoding\": {\n+                            \"Share Access Strategy\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Content encoding not applied during transmission\",\n-                                        \"displayName\": \"DISABLED\",\n-                                        \"value\": \"DISABLED\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"none\",\n+                                        \"value\": \"none\"\n                                     },\n                                     {\n-                                        \"description\": \"Gzip content encoding and HTTP Content-Encoding header applied during transmission\",\n-                                        \"displayName\": \"GZIP\",\n-                                        \"value\": \"GZIP\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"DISABLED\",\n-                                \"dependencies\": [\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"read\",\n+                                        \"value\": \"read\"\n+                                    },\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"POST\",\n-                                            \"PATCH\",\n-                                            \"PUT\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"HTTP Method\",\n-                                        \"propertyName\": \"HTTP Method\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"read, delete\",\n+                                        \"value\": \"read, delete\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"read, write, delete\",\n+                                        \"value\": \"read, write, delete\"\n                                     }\n                                 ],\n-                                \"description\": \"HTTP Content-Encoding applied to request body during transmission. The receiving server must support the selected encoding to avoid request failures.\",\n-                                \"displayName\": \"Request Content-Encoding\",\n+                                \"defaultValue\": \"none\",\n+                                \"description\": \"Indicates which shared access are granted on the file during the write. None is the most restrictive, but the safest setting to prevent corruption.\",\n+                                \"displayName\": \"Share Access Strategy\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Content-Encoding\",\n+                                \"name\": \"Share Access Strategy\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Content-Type\": {\n-                                \"defaultValue\": \"${mime.type}\",\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"POST\",\n-                                            \"PATCH\",\n-                                            \"PUT\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"HTTP Method\",\n-                                        \"propertyName\": \"HTTP Method\"\n-                                    }\n-                                ],\n-                                \"description\": \"HTTP Content-Type Header applied to when sending an HTTP request body for PATCH, POST, or PUT methods. The Content-Type defaults to application/octet-stream when not configured.\",\n-                                \"displayName\": \"Request Content-Type\",\n+                            \"Temporary Suffix\": {\n+                                \"description\": \"A temporary suffix which will be apended to the filename while it's transfering. After the transfer is complete, the suffix will be removed.\",\n+                                \"displayName\": \"Temporary Suffix\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Content-Type\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Temporary Suffix\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Digest Authentication\": {\n+                            \"Username\": {\n+                                \"description\": \"The username used for authentication. If no username is set then anonymous authentication is attempted.\",\n+                                \"displayName\": \"Username\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Username\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"enable-dfs\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"true\",\n                                         \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"false\",\n                                         \"value\": \"false\"\n                                     }\n                                 ],\n                                 \"defaultValue\": \"false\",\n-                                \"dependencies\": [\n-                                    {\n-                                        \"propertyDisplayName\": \"Request Username\",\n-                                        \"propertyName\": \"Basic Authentication Username\"\n-                                    }\n-                                ],\n-                                \"description\": \"Enable Digest Authentication on HTTP requests with Username and Password credentials as described in RFC 7616.\",\n-                                \"displayName\": \"Request Digest Authentication Enabled\",\n+                                \"description\": \"Enables accessing Distributed File System (DFS) and following DFS links during SMB operations.\",\n+                                \"displayName\": \"Enable DFS\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Digest Authentication\",\n-                                \"required\": false,\n+                                \"name\": \"enable-dfs\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Follow Redirects\": {\n+                            \"smb-dialect\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"True\",\n-                                        \"value\": \"True\"\n+                                        \"displayName\": \"AUTO\",\n+                                        \"value\": \"AUTO\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"False\",\n-                                        \"value\": \"False\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"True\",\n-                                \"description\": \"Enable following HTTP redirects sent with HTTP 300 series responses as described in RFC 7231 Section 6.4.\",\n-                                \"displayName\": \"Response Redirects Enabled\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Follow Redirects\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"HTTP Method\": {\n-                                \"defaultValue\": \"GET\",\n-                                \"description\": \"HTTP request method (GET, POST, PUT, PATCH, DELETE, HEAD, OPTIONS). Arbitrary methods are also supported. Methods other than POST, PUT and PATCH will be sent without a message body.\",\n-                                \"displayName\": \"HTTP Method\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"HTTP Method\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Include Date Header\": {\n-                                \"allowableValues\": [\n+                                        \"displayName\": \"SMB 2.0.2\",\n+                                        \"value\": \"SMB_2_0_2\"\n+                                    },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"True\",\n-                                        \"value\": \"True\"\n+                                        \"displayName\": \"SMB 2.1\",\n+                                        \"value\": \"SMB_2_1\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"False\",\n-                                        \"value\": \"False\"\n+                                        \"displayName\": \"SMB 3.0\",\n+                                        \"value\": \"SMB_3_0\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"SMB 3.0.2\",\n+                                        \"value\": \"SMB_3_0_2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"SMB 3.1.1\",\n+                                        \"value\": \"SMB_3_1_1\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"True\",\n-                                \"description\": \"Enable sending HTTP Date Header on HTTP requests as described in RFC 7231 Section 7.1.1.2.\",\n-                                \"displayName\": \"Request Date Header Enabled\",\n+                                \"defaultValue\": \"AUTO\",\n+                                \"description\": \"The SMB dialect is negotiated between the client and the server by default to the highest common version supported by both end. In some rare cases, the client-server communication may fail with the automatically negotiated dialect. This property can be used to set the dialect explicitly (e.g. to downgrade to a lower version), when those situations would occur.\",\n+                                \"displayName\": \"SMB Dialect\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Include Date Header\",\n+                                \"name\": \"smb-dialect\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Max Length To Put In Attribute\": {\n-                                \"defaultValue\": \"256\",\n-                                \"dependencies\": [\n-                                    {\n-                                        \"propertyDisplayName\": \"Response Body Attribute Name\",\n-                                        \"propertyName\": \"Put Response Body In Attribute\"\n-                                    }\n-                                ],\n-                                \"description\": \"Maximum size in bytes applied when writing an HTTP response body to a FlowFile attribute. Attributes exceeding the maximum will be truncated.\",\n-                                \"displayName\": \"Response Body Attribute Size\",\n+                            \"timeout\": {\n+                                \"defaultValue\": \"5 sec\",\n+                                \"description\": \"Timeout for read and write operations.\",\n+                                \"displayName\": \"Timeout\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Max Length To Put In Attribute\",\n-                                \"required\": false,\n+                                \"name\": \"timeout\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Penalize on \\\"No Retry\\\"\": {\n+                            \"use-encryption\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"true\",\n                                         \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"false\",\n                                         \"value\": \"false\"\n                                     }\n                                 ],\n                                 \"defaultValue\": \"false\",\n-                                \"description\": \"Enable penalization of request FlowFiles when receiving HTTP response with a status code between 400 and 499.\",\n-                                \"displayName\": \"Request Failure Penalization Enabled\",\n+                                \"description\": \"Turns on/off encrypted communication between the client and the server. The property's behavior is SMB dialect dependent: SMB 2.x does not support encryption and the property has no effect. In case of SMB 3.x, it is a hint/request to the server to turn encryption on if the server also supports it.\",\n+                                \"displayName\": \"Use Encryption\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Penalize on \\\"No Retry\\\"\",\n-                                \"required\": false,\n+                                \"name\": \"use-encryption\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n+                            }\n+                        },\n+                        \"readsAttributes\": [\n+                            {\n+                                \"description\": \"The filename to use when writing the FlowFile to the network folder.\",\n+                                \"name\": \"filename\"\n+                            }\n+                        ],\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.processors.smb.FetchSmb\",\n+                            \"org.apache.nifi.processors.smb.GetSmbFile\",\n+                            \"org.apache.nifi.processors.smb.ListSmb\"\n+                        ],\n+                        \"sideEffectFree\": false,\n+                        \"supportedRelationships\": [\n+                            {\n+                                \"description\": \"Files that have been successfully written to the output network path are transferred to this relationship\",\n+                                \"name\": \"success\"\n                             },\n-                            \"Proxy Host\": {\n-                                \"description\": \"Proxy Host and dependent properties are deprecated in favor of Proxy Configuration Service. Proxy Host can be configured using an IP address or DNS address.\",\n-                                \"displayName\": \"Proxy Host\",\n-                                \"dynamic\": false,\n+                            {\n+                                \"description\": \"Files that could not be written to the output network path for some reason are transferred to this relationship\",\n+                                \"name\": \"failure\"\n+                            }\n+                        ],\n+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\"\n+                        ],\n+                        \"supportsBatching\": false,\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicRelationships\": false,\n+                        \"supportsEventDriven\": false,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"samba, smb, cifs, files, put\"\n+                        ],\n+                        \"triggerSerially\": false,\n+                        \"triggerWhenAnyDestinationAvailable\": false,\n+                        \"triggerWhenEmpty\": false,\n+                        \"type\": \"org.apache.nifi.processors.smb.PutSmbFile\",\n+                        \"typeDescription\": \"Writes the contents of a FlowFile to a samba network location. Use this processor instead of a cifs mounts if share access control is important.Configure the Hostname, Share and Directory accordingly: \\\\\\\\[Hostname]\\\\[Share]\\\\[path\\\\to\\\\Directory]\",\n+                        \"version\": \"1.27.0\"\n+                    }\n+                ],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"1.27.0\"\n+        },\n+        {\n+            \"artifact\": \"nifi-azure-services-api-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [],\n+                \"processors\": [],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"1.27.0\"\n+        },\n+        {\n+            \"artifact\": \"nifi-elasticsearch-client-service-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [\n+                    {\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-elasticsearch-client-service-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"e0c4461\"\n+                        },\n+                        \"dynamicProperties\": [\n+                            {\n+                                \"description\": \"Adds the specified property name/value as a Request Header in the Elasticsearch requests.\",\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Proxy Host\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Proxy Port\": {\n+                                \"name\": \"The name of a Request Header to add\",\n+                                \"value\": \"The value of the Header\"\n+                            }\n+                        ],\n+                        \"group\": \"org.apache.nifi\",\n+                        \"propertyDescriptors\": {\n+                            \"api-key\": {\n                                 \"dependencies\": [\n                                     {\n-                                        \"propertyDisplayName\": \"Proxy Host\",\n-                                        \"propertyName\": \"Proxy Host\"\n+                                        \"dependentValues\": [\n+                                            \"API_KEY\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Authorization Scheme\",\n+                                        \"propertyName\": \"authorization-scheme\"\n                                     }\n                                 ],\n-                                \"description\": \"Proxy Port and dependent properties are deprecated in favor of Proxy Configuration Service. Port number for the configured Proxy Host address.\",\n-                                \"displayName\": \"Proxy Port\",\n+                                \"description\": \"Encoded API key.\",\n+                                \"displayName\": \"API Key\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Proxy Port\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"api-key\",\n                                 \"required\": false,\n-                                \"sensitive\": false\n+                                \"sensitive\": true\n                             },\n-                            \"Proxy Type\": {\n-                                \"defaultValue\": \"http\",\n+                            \"api-key-id\": {\n                                 \"dependencies\": [\n                                     {\n-                                        \"propertyDisplayName\": \"Proxy Host\",\n-                                        \"propertyName\": \"Proxy Host\"\n+                                        \"dependentValues\": [\n+                                            \"API_KEY\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Authorization Scheme\",\n+                                        \"propertyName\": \"authorization-scheme\"\n                                     }\n                                 ],\n-                                \"description\": \"Proxy Type and dependent properties are deprecated in favor of Proxy Configuration Service. Proxy protocol type is not used\",\n-                                \"displayName\": \"Proxy Type\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Proxy Type\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Put Response Body In Attribute\": {\n-                                \"description\": \"FlowFile attribute name used to write an HTTP response body for FlowFiles transferred to the Original relationship.\",\n-                                \"displayName\": \"Response Body Attribute Name\",\n+                                \"description\": \"Unique identifier of the API key.\",\n+                                \"displayName\": \"API Key ID\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Put Response Body In Attribute\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"api-key-id\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Read Timeout\": {\n-                                \"defaultValue\": \"15 secs\",\n-                                \"description\": \"Maximum time to wait for receiving responses from a socket connection to the HTTP URL.\",\n-                                \"displayName\": \"Socket Read Timeout\",\n+                            \"authorization-scheme\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"No authorization scheme.\",\n+                                        \"displayName\": \"None\",\n+                                        \"value\": \"NONE\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Mutual TLS with PKI certificate authorization scheme.\",\n+                                        \"displayName\": \"PKI\",\n+                                        \"value\": \"PKI\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Basic authorization scheme.\",\n+                                        \"displayName\": \"Basic\",\n+                                        \"value\": \"BASIC\"\n+                                    },\n+                                    {\n+                                        \"description\": \"API key authorization scheme.\",\n+                                        \"displayName\": \"API Key\",\n+                                        \"value\": \"API_KEY\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"BASIC\",\n+                                \"description\": \"Authorization Scheme used for optional authentication to Elasticsearch.\",\n+                                \"displayName\": \"Authorization Scheme\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Read Timeout\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Remote URL\": {\n-                                \"description\": \"HTTP remote URL including a scheme of http or https, as well as a hostname or IP address with optional port and path elements. Any encoding of the URL must be done by the user.\",\n-                                \"displayName\": \"HTTP URL\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Remote URL\",\n+                                \"name\": \"authorization-scheme\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"SSL Context Service\": {\n-                                \"description\": \"SSL Context Service provides trusted certificates and client certificates for TLS communication.\",\n-                                \"displayName\": \"SSL Context Service\",\n+                            \"el-cs-charset\": {\n+                                \"defaultValue\": \"UTF-8\",\n+                                \"description\": \"The charset to use for interpreting the response from Elasticsearch.\",\n+                                \"displayName\": \"Charset\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"SSL Context Service\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n+                                \"name\": \"el-cs-charset\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n                             },\n-                            \"Socket Write Timeout\": {\n-                                \"defaultValue\": \"15 secs\",\n-                                \"description\": \"Maximum time to wait for write operations while sending requests from a socket connection to the HTTP URL.\",\n-                                \"displayName\": \"Socket Write Timeout\",\n+                            \"el-cs-connect-timeout\": {\n+                                \"defaultValue\": \"5000\",\n+                                \"description\": \"Controls the amount of time, in milliseconds, before a timeout occurs when trying to connect.\",\n+                                \"displayName\": \"Connect timeout\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Socket Write Timeout\",\n+                                \"name\": \"el-cs-connect-timeout\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Use Chunked Encoding\": {\n+                            \"el-cs-enable-compression\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"true\",\n                                         \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"false\",\n                                         \"value\": \"false\"\n                                     }\n                                 ],\n                                 \"defaultValue\": \"false\",\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"POST\",\n-                                            \"PATCH\",\n-                                            \"PUT\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"HTTP Method\",\n-                                        \"propertyName\": \"HTTP Method\"\n-                                    }\n-                                ],\n-                                \"description\": \"Enable sending HTTP requests with the Transfer-Encoding Header set to chunked, and disable sending the Content-Length Header. Transfer-Encoding applies to the body in HTTP/1.1 requests as described in RFC 7230 Section 3.3.1\",\n-                                \"displayName\": \"Request Chunked Transfer-Encoding Enabled\",\n+                                \"description\": \"Whether the REST client should compress requests using gzip content encoding and add the \\\"Accept-Encoding: gzip\\\" header to receive compressed responses\",\n+                                \"displayName\": \"Enable Compression\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Use Chunked Encoding\",\n+                                \"name\": \"el-cs-enable-compression\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Useragent\": {\n-                                \"description\": \"HTTP User-Agent Header applied to requests. RFC 7231 Section 5.5.3 describes recommend formatting.\",\n-                                \"displayName\": \"Request User-Agent\",\n+                            \"el-cs-http-hosts\": {\n+                                \"description\": \"A comma-separated list of HTTP hosts that host Elasticsearch query nodes. Note that the Host is included in requests as a header (typically including domain and port, e.g. elasticsearch:9200).\",\n+                                \"displayName\": \"HTTP Hosts\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Useragent\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"el-cs-http-hosts\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"cookie-strategy\": {\n+                            \"el-cs-node-selector\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"DISABLED\",\n-                                        \"value\": \"DISABLED\"\n+                                        \"description\": \"Select any Elasticsearch node to handle requests\",\n+                                        \"displayName\": \"Any\",\n+                                        \"value\": \"ANY\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"ACCEPT_ALL\",\n-                                        \"value\": \"ACCEPT_ALL\"\n+                                        \"description\": \"Skip dedicated Elasticsearch master nodes for handling request\",\n+                                        \"displayName\": \"Skip Dedicated Masters\",\n+                                        \"value\": \"SKIP_DEDICATED_MASTERS\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"DISABLED\",\n-                                \"description\": \"Strategy for accepting and persisting HTTP cookies. Accepting cookies enables persistence across multiple requests.\",\n-                                \"displayName\": \"Response Cookie Strategy\",\n+                                \"defaultValue\": \"ANY\",\n+                                \"description\": \"Selects Elasticsearch nodes that can receive requests. Used to keep requests away from dedicated Elasticsearch master nodes\",\n+                                \"displayName\": \"Node Selector\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"cookie-strategy\",\n+                                \"name\": \"el-cs-node-selector\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"disable-http2\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"True\",\n-                                        \"value\": \"True\"\n-                                    },\n+                            \"el-cs-password\": {\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"False\",\n-                                        \"value\": \"False\"\n+                                        \"dependentValues\": [\n+                                            \"BASIC\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Authorization Scheme\",\n+                                        \"propertyName\": \"authorization-scheme\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"False\",\n-                                \"description\": \"Disable negotiation of HTTP/2 protocol. HTTP/2 requires TLS. HTTP/1.1 protocol supported is required when HTTP/2 is disabled.\",\n-                                \"displayName\": \"HTTP/2 Disabled\",\n+                                \"description\": \"The password to use with XPack security.\",\n+                                \"displayName\": \"Password\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"el-cs-password\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n+                            },\n+                            \"el-cs-path-prefix\": {\n+                                \"description\": \"Sets the path's prefix for every request used by the http client. For example, if this is set to \\\"/my/path\\\", then any client request will become \\\"/my/path/\\\" + endpoint. In essence, every request's endpoint is prefixed by this pathPrefix. The path prefix is useful for when Elasticsearch is behind a proxy that provides a base path or a proxy that requires all paths to start with '/'; it is not intended for other purposes and it should not be supplied in other scenarios\",\n+                                \"displayName\": \"Path Prefix\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"disable-http2\",\n-                                \"required\": true,\n+                                \"name\": \"el-cs-path-prefix\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"etag-max-cache-size\": {\n-                                \"defaultValue\": \"10MB\",\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"true\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Response Cache Enabled\",\n-                                        \"propertyName\": \"use-etag\"\n-                                    }\n-                                ],\n-                                \"description\": \"Maximum size of HTTP response cache in bytes. Caching responses considers ETag and other headers.\",\n-                                \"displayName\": \"Response Cache Size\",\n+                            \"el-cs-retry-timeout\": {\n+                                \"defaultValue\": \"60000\",\n+                                \"description\": \"Controls the amount of time, in milliseconds, before a timeout occurs when retrying the operation.\",\n+                                \"displayName\": \"Retry timeout\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"etag-max-cache-size\",\n+                                \"name\": \"el-cs-retry-timeout\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"flow-file-naming-strategy\": {\n+                            \"el-cs-send-meta-header\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"FlowFile filename attribute will be a random value.\",\n-                                        \"displayName\": \"RANDOM\",\n-                                        \"value\": \"RANDOM\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n-                                        \"description\": \"FlowFile filename attribute will be extracted from the remote URL path. The attribute may contain URL encoded characters. If the path doesn't exist, the attribute will be a random value.\",\n-                                        \"displayName\": \"URL_PATH\",\n-                                        \"value\": \"URL_PATH\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"RANDOM\",\n-                                \"description\": \"Determines the strategy used for setting the filename attribute of FlowFiles transferred to the Response relationship.\",\n-                                \"displayName\": \"Response FlowFile Naming Strategy\",\n+                                \"defaultValue\": \"true\",\n+                                \"description\": \"Whether to send a \\\"X-Elastic-Client-Meta\\\" header that describes the runtime environment. It contains information that is similar to what could be found in User-Agent. Using a separate header allows applications to use User-Agent for their own needs, e.g. to identify application version or other environment information\",\n+                                \"displayName\": \"Send Meta Header\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"flow-file-naming-strategy\",\n+                                \"name\": \"el-cs-send-meta-header\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"form-body-form-name\": {\n-                                \"dependencies\": [\n+                            \"el-cs-sniff-cluster-nodes\": {\n+                                \"allowableValues\": [\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"true\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Request Body Enabled\",\n-                                        \"propertyName\": \"send-message-body\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"description\": \"Enable sending HTTP request body formatted using multipart/form-data and using the form name configured.\",\n-                                \"displayName\": \"Request Multipart Form-Data Name\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"form-body-form-name\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"idle-timeout\": {\n-                                \"defaultValue\": \"5 mins\",\n-                                \"description\": \"Maximum time to wait before closing idle connections to the HTTP URL.\",\n-                                \"displayName\": \"Socket Idle Timeout\",\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"Periodically sniff for nodes within the Elasticsearch cluster via the Elasticsearch Node Info API. If Elasticsearch security features are enabled (default to \\\"true\\\" for 8.x+), the Elasticsearch user must have the \\\"monitor\\\" or \\\"manage\\\" cluster privilege to use this API.Note that all HTTP Hosts (and those that may be discovered within the cluster using the Sniffer) must use the same protocol, e.g. http or https, and be contactable using the same client settings. Finally the Elasticsearch \\\"network.publish_host\\\" must match one of the \\\"network.bind_host\\\" list entries see https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-network.html for more information\",\n+                                \"displayName\": \"Sniff Cluster Nodes\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"idle-timeout\",\n+                                \"name\": \"el-cs-sniff-cluster-nodes\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"ignore-response-content\": {\n+                            \"el-cs-sniff-failure\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"true\",\n                                         \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"false\",\n                                         \"value\": \"false\"\n                                     }\n                                 ],\n                                 \"defaultValue\": \"false\",\n-                                \"description\": \"Disable writing HTTP response FlowFiles to Response relationship\",\n-                                \"displayName\": \"Response Body Ignored\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"true\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Sniff Cluster Nodes\",\n+                                        \"propertyName\": \"el-cs-sniff-cluster-nodes\"\n+                                    }\n+                                ],\n+                                \"description\": \"Enable sniffing on failure, meaning that after each failure the Elasticsearch nodes list gets updated straightaway rather than at the following ordinary sniffing round\",\n+                                \"displayName\": \"Sniff on Failure\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"ignore-response-content\",\n+                                \"name\": \"el-cs-sniff-failure\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"invokehttp-proxy-password\": {\n+                            \"el-cs-sniffer-failure-delay\": {\n+                                \"defaultValue\": \"1 min\",\n                                 \"dependencies\": [\n                                     {\n-                                        \"propertyDisplayName\": \"Proxy Host\",\n-                                        \"propertyName\": \"Proxy Host\"\n+                                        \"dependentValues\": [\n+                                            \"true\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Sniff on Failure\",\n+                                        \"propertyName\": \"el-cs-sniff-failure\"\n                                     }\n                                 ],\n-                                \"description\": \"Proxy Password and dependent properties are deprecated in favor of Proxy Configuration Service. Password to set when authenticating with a Proxy server.\",\n-                                \"displayName\": \"Proxy Password\",\n+                                \"description\": \"Delay between an Elasticsearch request failure and updating available Cluster nodes using the Sniffer\",\n+                                \"displayName\": \"Sniffer Failure Delay\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"invokehttp-proxy-password\",\n-                                \"required\": false,\n-                                \"sensitive\": true\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"el-cs-sniffer-failure-delay\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n                             },\n-                            \"invokehttp-proxy-user\": {\n+                            \"el-cs-sniffer-interval\": {\n+                                \"defaultValue\": \"5 mins\",\n                                 \"dependencies\": [\n                                     {\n-                                        \"propertyDisplayName\": \"Proxy Host\",\n-                                        \"propertyName\": \"Proxy Host\"\n+                                        \"dependentValues\": [\n+                                            \"true\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Sniff Cluster Nodes\",\n+                                        \"propertyName\": \"el-cs-sniff-cluster-nodes\"\n                                     }\n                                 ],\n-                                \"description\": \"Proxy Username and dependent properties are deprecated in favor of Proxy Configuration Service. Username to set when authenticating with a Proxy server.\",\n-                                \"displayName\": \"Proxy Username\",\n+                                \"description\": \"Interval between Cluster sniffer operations\",\n+                                \"displayName\": \"Sniffer Interval\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"invokehttp-proxy-user\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"el-cs-sniffer-interval\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"max-idle-connections\": {\n-                                \"defaultValue\": \"5\",\n-                                \"description\": \"Maximum number of idle connections to the HTTP URL.\",\n-                                \"displayName\": \"Socket Idle Connections\",\n+                            \"el-cs-sniffer-request-timeout\": {\n+                                \"defaultValue\": \"1 sec\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"true\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Sniff Cluster Nodes\",\n+                                        \"propertyName\": \"el-cs-sniff-cluster-nodes\"\n+                                    }\n+                                ],\n+                                \"description\": \"Cluster sniffer timeout for node info requests\",\n+                                \"displayName\": \"Sniffer Request Timeout\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"max-idle-connections\",\n+                                \"name\": \"el-cs-sniffer-request-timeout\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"oauth2-access-token-provider\": {\n-                                \"description\": \"Enables managed retrieval of OAuth2 Bearer Token applied to HTTP requests using the Authorization Header.\",\n-                                \"displayName\": \"Request OAuth2 Access Token Provider\",\n+                            \"el-cs-socket-timeout\": {\n+                                \"defaultValue\": \"60000\",\n+                                \"description\": \"Controls the amount of time, in milliseconds, before a timeout occurs when waiting for a response.\",\n+                                \"displayName\": \"Read timeout\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"oauth2-access-token-provider\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.oauth2.OAuth2AccessTokenProvider\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n+                                \"name\": \"el-cs-socket-timeout\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n                             },\n-                            \"proxy-configuration-service\": {\n-                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests. If set, it supersedes proxy settings configured per component. Supported proxies: SOCKS, HTTP + AuthN In case of SOCKS, it is not guaranteed that the selected SOCKS Version will be used by the processor.\",\n-                                \"displayName\": \"Proxy Configuration Service\",\n+                            \"el-cs-ssl-context-service\": {\n+                                \"description\": \"The SSL Context Service used to provide client certificate information for TLS/SSL connections. This service only applies if the Elasticsearch endpoint(s) have been secured with TLS/SSL.\",\n+                                \"displayName\": \"SSL Context Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"proxy-configuration-service\",\n+                                \"name\": \"el-cs-ssl-context-service\",\n                                 \"required\": false,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n                                     \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.proxy.ProxyConfigurationService\",\n+                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             },\n-                            \"send-message-body\": {\n+                            \"el-cs-strict-deprecation\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"true\",\n                                         \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"false\",\n                                         \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"true\",\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"POST\",\n-                                            \"PATCH\",\n-                                            \"PUT\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"HTTP Method\",\n-                                        \"propertyName\": \"HTTP Method\"\n-                                    }\n-                                ],\n-                                \"description\": \"Enable sending HTTP request body for PATCH, POST, or PUT methods.\",\n-                                \"displayName\": \"Request Body Enabled\",\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"Whether the REST client should return any response containing at least one warning header as a failure\",\n+                                \"displayName\": \"Strict Deprecation\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"send-message-body\",\n-                                \"required\": false,\n+                                \"name\": \"el-cs-strict-deprecation\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"set-form-filename\": {\n+                            \"el-cs-suppress-nulls\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"description\": \"Fields that are missing (present in the schema but not in the record), or that have a value of null/empty, will be written out as a null/empty value\",\n+                                        \"displayName\": \"Never Suppress\",\n+                                        \"value\": \"never-suppress\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"true\",\n-                                \"dependencies\": [\n-                                    {\n-                                        \"propertyDisplayName\": \"Request Multipart Form-Data Name\",\n-                                        \"propertyName\": \"form-body-form-name\"\n+                                        \"description\": \"Fields that are missing (present in the schema but not in the record), or that have a value of null/empty, will not be written out\",\n+                                        \"displayName\": \"Always Suppress\",\n+                                        \"value\": \"always-suppress\"\n                                     }\n                                 ],\n-                                \"description\": \"Enable sending the FlowFile filename attribute as the filename parameter in the Content-Disposition Header for multipart/form-data HTTP requests.\",\n-                                \"displayName\": \"Request Multipart Form-Data Filename Enabled\",\n+                                \"defaultValue\": \"always-suppress\",\n+                                \"description\": \"Specifies how the writer should handle null and empty fields (including objects and arrays)\",\n+                                \"displayName\": \"Suppress Null/Empty Values\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"set-form-filename\",\n-                                \"required\": false,\n+                                \"name\": \"el-cs-suppress-nulls\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"use-etag\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n+                            \"el-cs-username\": {\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"dependentValues\": [\n+                                            \"BASIC\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Authorization Scheme\",\n+                                        \"propertyName\": \"authorization-scheme\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"Enable HTTP response caching described in RFC 7234. Caching responses considers ETag and other headers.\",\n-                                \"displayName\": \"Response Cache Enabled\",\n+                                \"description\": \"The username to use with XPack security.\",\n+                                \"displayName\": \"Username\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"el-cs-username\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"proxy-configuration-service\": {\n+                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests. Supported proxies: HTTP\",\n+                                \"displayName\": \"Proxy Configuration Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"use-etag\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n+                                \"name\": \"proxy-configuration-service\",\n+                                \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.proxy.ProxyConfigurationService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n                             }\n                         },\n-                        \"sideEffectFree\": false,\n-                        \"supportedRelationships\": [\n-                            {\n-                                \"description\": \"Request FlowFiles transferred when receiving HTTP responses with a status code between 200 and 299.\",\n-                                \"name\": \"Original\"\n-                            },\n-                            {\n-                                \"description\": \"Request FlowFiles transferred when receiving socket communication errors.\",\n-                                \"name\": \"Failure\"\n-                            },\n-                            {\n-                                \"description\": \"Request FlowFiles transferred when receiving HTTP responses with a status code between 500 and 599.\",\n-                                \"name\": \"Retry\"\n-                            },\n-                            {\n-                                \"description\": \"Request FlowFiles transferred when receiving HTTP responses with a status code between 400 an 499.\",\n-                                \"name\": \"No Retry\"\n-                            },\n+                        \"providedApiImplementations\": [\n                             {\n-                                \"description\": \"Response FlowFiles transferred when receiving HTTP responses with a status code between 200 and 299.\",\n-                                \"name\": \"Response\"\n+                                \"artifact\": \"nifi-elasticsearch-client-service-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.elasticsearch.ElasticSearchClientService\",\n+                                \"version\": \"1.27.0\"\n                             }\n                         ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": true,\n                         \"supportsDynamicProperties\": true,\n-                        \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": false,\n-                        \"supportsSensitiveDynamicProperties\": true,\n+                        \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n                             \"client\",\n-                            \"http\",\n-                            \"https\",\n-                            \"rest\"\n+                            \"elasticsearch\",\n+                            \"elasticsearch6\",\n+                            \"elasticsearch7\",\n+                            \"elasticsearch8\"\n                         ],\n-                        \"triggerSerially\": false,\n-                        \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.standard.InvokeHTTP\",\n-                        \"typeDescription\": \"An HTTP client processor which can interact with a configurable HTTP Endpoint. The destination URL and HTTP Method are configurable. When the HTTP Method is PUT, POST or PATCH, the FlowFile contents are included as the body of the request and FlowFile attributes are converted to HTTP headers, optionally, based on configuration properties.\",\n-                        \"version\": \"1.27.0\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"The status code that is returned\",\n-                                \"name\": \"invokehttp.status.code\"\n-                            },\n-                            {\n-                                \"description\": \"The status message that is returned\",\n-                                \"name\": \"invokehttp.status.message\"\n-                            },\n-                            {\n-                                \"description\": \"In the instance where the status code received is not a success (2xx) then the response body will be put to the 'invokehttp.response.body' attribute of the request FlowFile.\",\n-                                \"name\": \"invokehttp.response.body\"\n-                            },\n-                            {\n-                                \"description\": \"The original request URL\",\n-                                \"name\": \"invokehttp.request.url\"\n-                            },\n-                            {\n-                                \"description\": \"Duration (in milliseconds) of the HTTP call to the external endpoint\",\n-                                \"name\": \"invokehttp.request.duration\"\n-                            },\n-                            {\n-                                \"description\": \"The URL that was ultimately requested after any redirects were followed\",\n-                                \"name\": \"invokehttp.response.url\"\n-                            },\n-                            {\n-                                \"description\": \"The transaction ID that is returned after reading the response\",\n-                                \"name\": \"invokehttp.tx.id\"\n-                            },\n-                            {\n-                                \"description\": \"The DN of the remote server\",\n-                                \"name\": \"invokehttp.remote.dn\"\n-                            },\n-                            {\n-                                \"description\": \"The Java exception class raised when the processor fails\",\n-                                \"name\": \"invokehttp.java.exception.class\"\n-                            },\n-                            {\n-                                \"description\": \"The Java exception message raised when the processor fails\",\n-                                \"name\": \"invokehttp.java.exception.message\"\n-                            },\n-                            {\n-                                \"description\": \"If the 'Put Response Body In Attribute' property is set then whatever it is set to will become the attribute key and the value would be the body of the HTTP response.\",\n-                                \"name\": \"user-defined\"\n-                            }\n-                        ]\n+                        \"type\": \"org.apache.nifi.elasticsearch.ElasticSearchClientServiceImpl\",\n+                        \"typeDescription\": \"A controller service for accessing an Elasticsearch client. Uses the Elasticsearch REST Client (7.13.4, the last version before client connections verifythe server is Elastic provided, this should allow for connections to compatible alternatives, e.g. AWS OpenSearch)\",\n+                        \"version\": \"1.27.0\"\n                     },\n                     {\n                         \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-standard-nar\",\n+                        \"artifact\": \"nifi-elasticsearch-client-service-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n-                        \"defaultBulletinLevel\": \"WARN\",\n-                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": 1,\n-                            \"TIMER_DRIVEN\": 1\n-                        },\n-                        \"defaultPenaltyDuration\": \"30 sec\",\n-                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"0 sec\"\n-                        },\n-                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n-                        \"defaultYieldDuration\": \"1 sec\",\n+                        \"dynamicProperties\": [\n+                            {\n+                                \"description\": \"Retrieves an object using JSONPath from the result document and places it in the return Record at the specified Record Path.\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"name\": \"A JSONPath expression\",\n+                                \"value\": \"A Record Path expression\"\n+                            }\n+                        ],\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_REQUIRED\",\n-                        \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Enrichment Record Reader\": {\n-                                \"description\": \"The Record Reader for reading the 'enrichment' FlowFile\",\n-                                \"displayName\": \"Enrichment Record Reader\",\n+                            \"el-lookup-index\": {\n+                                \"description\": \"The name of the index to read from\",\n+                                \"displayName\": \"Index\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"el-lookup-index\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"el-lookup-type\": {\n+                                \"description\": \"The type of this document (used by Elasticsearch for indexing and searching)\",\n+                                \"displayName\": \"Type\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"el-lookup-type\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"el-rest-client-service\": {\n+                                \"description\": \"An ElasticSearch client service to use for running queries.\",\n+                                \"displayName\": \"Client Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Enrichment Record Reader\",\n+                                \"name\": \"el-rest-client-service\",\n                                 \"required\": true,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"artifact\": \"nifi-elasticsearch-client-service-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n+                                    \"type\": \"org.apache.nifi.elasticsearch.ElasticSearchClientService\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             },\n-                            \"Insertion Record Path\": {\n-                                \"defaultValue\": \"/\",\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"Insert Enrichment Fields\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Join Strategy\",\n-                                        \"propertyName\": \"Join Strategy\"\n-                                    }\n-                                ],\n-                                \"description\": \"Specifies where in the 'original' Record the 'enrichment' Record's fields should be inserted. Note that if the RecordPath does not point to any existing field in the original Record, the enrichment will not be inserted.\",\n-                                \"displayName\": \"Insertion Record Path\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Insertion Record Path\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Join Strategy\": {\n+                            \"schema-access-strategy\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"The output is a Record that contains two fields: (1) 'original', containing the Record from the original FlowFile and (2) 'enrichment' containing the corresponding Record from the enrichment FlowFile. Records will be correlated based on their index in the FlowFile. If one FlowFile has more Records than the other, a null value will be used.\",\n-                                        \"displayName\": \"Wrapper\",\n-                                        \"value\": \"Wrapper\"\n+                                        \"description\": \"The name of the Schema to use is specified by the 'Schema Name' Property. The value of this property is used to lookup the Schema in the configured Schema Registry service.\",\n+                                        \"displayName\": \"Use 'Schema Name' Property\",\n+                                        \"value\": \"schema-name\"\n                                     },\n                                     {\n-                                        \"description\": \"The output is derived by evaluating a SQL SELECT statement that allows for two tables: 'original' and 'enrichment'. This allows for SQL JOIN statements to be used in order to correlate the Records of the two FlowFiles, so the index in which the Record is encountered in the FlowFile does not matter.\",\n-                                        \"displayName\": \"SQL\",\n-                                        \"value\": \"SQL\"\n+                                        \"description\": \"The text of the Schema itself is specified by the 'Schema Text' Property. The value of this property must be a valid Avro Schema. If Expression Language is used, the value of the 'Schema Text' property must be valid after substituting the expressions.\",\n+                                        \"displayName\": \"Use 'Schema Text' Property\",\n+                                        \"value\": \"schema-text-property\"\n                                     },\n                                     {\n-                                        \"description\": \"The enrichment is joined together with the original FlowFile by placing all fields of the enrichment Record into the corresponding Record from the original FlowFile. Records will be correlated based on their index in the FlowFile.\",\n-                                        \"displayName\": \"Insert Enrichment Fields\",\n-                                        \"value\": \"Insert Enrichment Fields\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"Infer from Result\",\n+                                        \"value\": \"infer\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"Wrapper\",\n-                                \"description\": \"Specifies how to join the two FlowFiles into a single FlowFile\",\n-                                \"displayName\": \"Join Strategy\",\n+                                \"defaultValue\": \"infer\",\n+                                \"description\": \"Specifies how to obtain the schema that is to be used for interpreting the data.\",\n+                                \"displayName\": \"Schema Access Strategy\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Join Strategy\",\n+                                \"name\": \"schema-access-strategy\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Maximum number of Bins\": {\n-                                \"defaultValue\": \"10000\",\n-                                \"description\": \"Specifies the maximum number of bins that can be held in memory at any one time\",\n-                                \"displayName\": \"Maximum number of Bins\",\n+                            \"schema-branch\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"schema-name\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n+                                        \"propertyName\": \"schema-access-strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"Specifies the name of the branch to use when looking up the schema in the Schema Registry property. If the chosen Schema Registry does not support branching, this value will be ignored.\",\n+                                \"displayName\": \"Schema Branch\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Maximum number of Bins\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"schema-branch\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Original Record Reader\": {\n-                                \"description\": \"The Record Reader for reading the 'original' FlowFile\",\n-                                \"displayName\": \"Original Record Reader\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Original Record Reader\",\n-                                \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            },\n-                            \"Record Writer\": {\n-                                \"description\": \"The Record Writer to use for writing the results. If the Record Writer is configured to inherit the schema from the Record, the schema that it will inherit will be the result of merging both the 'original' record schema and the 'enrichment' record schema.\",\n-                                \"displayName\": \"Record Writer\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Record Writer\",\n-                                \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            },\n-                            \"SQL\": {\n-                                \"defaultValue\": \"SELECT original.*, enrichment.* \\nFROM original \\nLEFT OUTER JOIN enrichment \\nON original.id = enrichment.id\",\n+                            \"schema-name\": {\n+                                \"defaultValue\": \"${schema.name}\",\n                                 \"dependencies\": [\n                                     {\n                                         \"dependentValues\": [\n-                                            \"SQL\"\n+                                            \"schema-name\"\n                                         ],\n-                                        \"propertyDisplayName\": \"Join Strategy\",\n-                                        \"propertyName\": \"Join Strategy\"\n+                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n+                                        \"propertyName\": \"schema-access-strategy\"\n                                     }\n                                 ],\n-                                \"description\": \"The SQL SELECT statement to evaluate. Expression Language may be provided, but doing so may result in poorer performance. Because this Processor is dealing with two FlowFiles at a time, it's also important to understand how attributes will be referenced. If both FlowFiles have an attribute with the same name but different values, the Expression Language will resolve to the value provided by the 'enrichment' FlowFile.\",\n-                                \"displayName\": \"SQL\",\n+                                \"description\": \"Specifies the name of the schema to lookup in the Schema Registry property\",\n+                                \"displayName\": \"Schema Name\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"SQL\",\n-                                \"required\": true,\n+                                \"name\": \"schema-name\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Timeout\": {\n-                                \"defaultValue\": \"10 min\",\n-                                \"description\": \"Specifies the maximum amount of time to wait for the second FlowFile once the first arrives at the processor, after which point the first FlowFile will be routed to the 'timeout' relationship.\",\n-                                \"displayName\": \"Timeout\",\n+                            \"schema-registry\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"confluent-encoded\",\n+                                            \"schema-name\",\n+                                            \"hwx-schema-ref-attributes\",\n+                                            \"hwx-content-encoded-schema\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n+                                        \"propertyName\": \"schema-access-strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"Specifies the Controller Service to use for the Schema Registry\",\n+                                \"displayName\": \"Schema Registry\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Timeout\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n+                                \"name\": \"schema-registry\",\n+                                \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.schemaregistry.services.SchemaRegistry\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n                             },\n-                            \"dbf-default-precision\": {\n-                                \"defaultValue\": \"10\",\n+                            \"schema-text\": {\n+                                \"defaultValue\": \"${avro.schema}\",\n                                 \"dependencies\": [\n                                     {\n                                         \"dependentValues\": [\n-                                            \"SQL\"\n+                                            \"schema-text-property\"\n                                         ],\n-                                        \"propertyDisplayName\": \"Join Strategy\",\n-                                        \"propertyName\": \"Join Strategy\"\n+                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n+                                        \"propertyName\": \"schema-access-strategy\"\n                                     }\n                                 ],\n-                                \"description\": \"When a DECIMAL/NUMBER value is written as a 'decimal' Avro logical type, a specific 'precision' denoting number of available digits is required. Generally, precision is defined by column data type definition or database engines default. However undefined precision (0) can be returned from some database engines. 'Default Decimal Precision' is used when writing those undefined precision numbers.\",\n-                                \"displayName\": \"Default Decimal Precision\",\n+                                \"description\": \"The text of an Avro-formatted Schema\",\n+                                \"displayName\": \"Schema Text\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"dbf-default-precision\",\n+                                \"name\": \"schema-text\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"dbf-default-scale\": {\n-                                \"defaultValue\": \"0\",\n+                            \"schema-version\": {\n                                 \"dependencies\": [\n                                     {\n                                         \"dependentValues\": [\n-                                            \"SQL\"\n+                                            \"schema-name\"\n                                         ],\n-                                        \"propertyDisplayName\": \"Join Strategy\",\n-                                        \"propertyName\": \"Join Strategy\"\n+                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n+                                        \"propertyName\": \"schema-access-strategy\"\n                                     }\n                                 ],\n-                                \"description\": \"When a DECIMAL/NUMBER value is written as a 'decimal' Avro logical type, a specific 'scale' denoting number of available decimal digits is required. Generally, scale is defined by column data type definition or database engines default. However when undefined precision (0) is returned, scale can also be uncertain with some database engines. 'Default Decimal Scale' is used when writing those undefined numbers. If a value has more decimals than specified scale, then the value will be rounded-up, e.g. 1.53 becomes 2 with scale 0, and 1.5 with scale 1.\",\n-                                \"displayName\": \"Default Decimal Scale\",\n+                                \"description\": \"Specifies the version of the schema to lookup in the Schema Registry. If not specified then the latest version of the schema will be retrieved.\",\n+                                \"displayName\": \"Schema Version\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"dbf-default-scale\",\n+                                \"name\": \"schema-version\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             }\n                         },\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.processors.standard.ForkEnrichment\"\n-                        ],\n-                        \"sideEffectFree\": true,\n-                        \"supportedRelationships\": [\n-                            {\n-                                \"description\": \"If one of the incoming FlowFiles (i.e., the 'original' FlowFile or the 'enrichment' FlowFile) arrives to this Processor but the other does not arrive within the configured Timeout period, the FlowFile that did arrive is routed to this relationship.\",\n-                                \"name\": \"timeout\"\n-                            },\n-                            {\n-                                \"description\": \"The resultant FlowFile with Records joined together from both the original and enrichment FlowFiles will be routed to this relationship\",\n-                                \"name\": \"joined\"\n-                            },\n-                            {\n-                                \"description\": \"If both the 'original' and 'enrichment' FlowFiles arrive at the processor but there was a failure in joining the records, both of those FlowFiles will be routed to this relationship.\",\n-                                \"name\": \"failure\"\n-                            },\n+                        \"providedApiImplementations\": [\n                             {\n-                                \"description\": \"Both of the incoming FlowFiles ('original' and 'enrichment') will be routed to this Relationship. I.e., this is the 'original' version of both of these FlowFiles.\",\n-                                \"name\": \"original\"\n+                                \"artifact\": \"nifi-standard-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.lookup.LookupService\",\n+                                \"version\": \"1.27.0\"\n                             }\n                         ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": false,\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": false,\n+                        \"supportsDynamicProperties\": true,\n                         \"supportsSensitiveDynamicProperties\": false,\n-                        \"systemResourceConsiderations\": [\n-                            {\n-                                \"description\": \"This Processor will load into heap all FlowFiles that are on its incoming queues. While it loads the FlowFiles themselves, and not their content, the FlowFile attributes can be very memory intensive. Additionally, if the Join Strategy is set to SQL, the SQL engine may require buffering the entire contents of the enrichment FlowFile for each concurrent task. See Processor's Additional Details for more details and for steps on how to mitigate these concerns.\",\n-                                \"resource\": \"MEMORY\"\n-                            }\n-                        ],\n                         \"tags\": [\n-                            \"combine\",\n-                            \"enrichment\",\n-                            \"fork\",\n-                            \"join\",\n-                            \"merge\",\n-                            \"record\",\n-                            \"recordpath\",\n-                            \"sql\",\n-                            \"streams\",\n-                            \"wrap\"\n+                            \"elasticsearch\",\n+                            \"enrich\",\n+                            \"lookup\",\n+                            \"record\"\n                         ],\n-                        \"triggerSerially\": false,\n-                        \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": true,\n-                        \"type\": \"org.apache.nifi.processors.standard.JoinEnrichment\",\n-                        \"typeDescription\": \"Joins together Records from two different FlowFiles where one FlowFile, the 'original' contains arbitrary records and the second FlowFile, the 'enrichment' contains additional data that should be used to enrich the first. See Additional Details for more information on how to configure this processor and the different use cases that it aims to accomplish.\",\n-                        \"version\": \"1.27.0\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"Sets the mime.type attribute to the MIME Type specified by the Record Writer\",\n-                                \"name\": \"mime.type\"\n-                            },\n-                            {\n-                                \"description\": \"The number of records in the FlowFile\",\n-                                \"name\": \"record.count\"\n-                            }\n-                        ]\n+                        \"type\": \"org.apache.nifi.elasticsearch.ElasticSearchLookupService\",\n+                        \"typeDescription\": \"Lookup a record from Elasticsearch Server associated with the specified document ID. The coordinates that are passed to the lookup must contain the key 'id'.\",\n+                        \"version\": \"1.27.0\"\n                     },\n                     {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-standard-nar\",\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-elasticsearch-client-service-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n-                        \"defaultBulletinLevel\": \"WARN\",\n-                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": 1,\n-                            \"EVENT_DRIVEN\": 0,\n-                            \"TIMER_DRIVEN\": 1\n-                        },\n-                        \"defaultPenaltyDuration\": \"30 sec\",\n-                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"0 sec\"\n-                        },\n-                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n-                        \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_REQUIRED\",\n-                        \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Max String Length\": {\n-                                \"defaultValue\": \"20 MB\",\n-                                \"description\": \"The maximum allowed length of a string value when parsing the JSON document\",\n-                                \"displayName\": \"Max String Length\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Max String Length\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Transform Cache Size\": {\n-                                \"defaultValue\": \"1\",\n-                                \"description\": \"Compiling a Jolt Transform can be fairly expensive. Ideally, this will be done only once. However, if the Expression Language is used in the transform, we may need a new Transform for each FlowFile. This value controls how many of those Transforms we cache in memory in order to avoid having to compile the Transform each time.\",\n-                                \"displayName\": \"Transform Cache Size\",\n+                            \"el-lookup-index\": {\n+                                \"description\": \"The name of the index to read from\",\n+                                \"displayName\": \"Index\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Transform Cache Size\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"el-lookup-index\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"jolt-custom-class\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"jolt-transform-custom\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Jolt Transformation DSL\",\n-                                        \"propertyName\": \"jolt-transform\"\n-                                    }\n-                                ],\n-                                \"description\": \"Fully Qualified Class Name for Custom Transformation\",\n-                                \"displayName\": \"Custom Transformation Class Name\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"jolt-custom-class\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"jolt-custom-modules\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"jolt-transform-custom\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Jolt Transformation DSL\",\n-                                        \"propertyName\": \"jolt-transform\"\n-                                    }\n-                                ],\n-                                \"description\": \"Comma-separated list of paths to files and/or directories which contain modules containing custom transformations (that are not included on NiFi's classpath).\",\n-                                \"displayName\": \"Custom Module Directory\",\n+                            \"el-lookup-type\": {\n+                                \"description\": \"The type of this document (used by Elasticsearch for indexing and searching)\",\n+                                \"displayName\": \"Type\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"jolt-custom-modules\",\n-                                \"required\": false,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"MULTIPLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\",\n-                                        \"DIRECTORY\"\n-                                    ]\n-                                },\n-                                \"sensitive\": false\n-                            },\n-                            \"jolt-spec\": {\n-                                \"description\": \"Jolt Specification for transformation of JSON data. The value for this property may be the text of a Jolt specification or the path to a file containing a Jolt specification. 'Jolt Specification' must be set, or the value is ignored if the Jolt Sort Transformation is selected.\",\n-                                \"displayName\": \"Jolt Specification\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"jolt-spec\",\n+                                \"name\": \"el-lookup-type\",\n                                 \"required\": false,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"SINGLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\",\n-                                        \"TEXT\"\n-                                    ]\n-                                },\n-                                \"sensitive\": false\n-                            },\n-                            \"jolt-transform\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"Change the cardinality of input elements to create the output JSON.\",\n-                                        \"displayName\": \"Cardinality\",\n-                                        \"value\": \"jolt-transform-card\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Execute list of Jolt transformations.\",\n-                                        \"displayName\": \"Chain\",\n-                                        \"value\": \"jolt-transform-chain\"\n-                                    },\n-                                    {\n-                                        \"description\": \" Apply default values to the output JSON.\",\n-                                        \"displayName\": \"Default\",\n-                                        \"value\": \"jolt-transform-default\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Writes when key is missing or value is null\",\n-                                        \"displayName\": \"Modify - Default\",\n-                                        \"value\": \"jolt-transform-modify-default\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Writes when key is missing\",\n-                                        \"displayName\": \"Modify - Define\",\n-                                        \"value\": \"jolt-transform-modify-define\"\n-                                    },\n-                                    {\n-                                        \"description\": \" Always overwrite value\",\n-                                        \"displayName\": \"Modify - Overwrite\",\n-                                        \"value\": \"jolt-transform-modify-overwrite\"\n-                                    },\n-                                    {\n-                                        \"description\": \" Remove values from input data to create the output JSON.\",\n-                                        \"displayName\": \"Remove\",\n-                                        \"value\": \"jolt-transform-remove\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Shift input JSON/data to create the output JSON.\",\n-                                        \"displayName\": \"Shift\",\n-                                        \"value\": \"jolt-transform-shift\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Sort input json key values alphabetically. Any specification set is ignored.\",\n-                                        \"displayName\": \"Sort\",\n-                                        \"value\": \"jolt-transform-sort\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Custom Transformation. Requires Custom Transformation Class Name\",\n-                                        \"displayName\": \"Custom\",\n-                                        \"value\": \"jolt-transform-custom\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"jolt-transform-chain\",\n-                                \"description\": \"Specifies the Jolt Transformation that should be used with the provided specification.\",\n-                                \"displayName\": \"Jolt Transformation DSL\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"jolt-transform\",\n-                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"pretty_print\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"Apply pretty print formatting to the output of the Jolt transform\",\n-                                \"displayName\": \"Pretty Print\",\n+                            \"el-rest-client-service\": {\n+                                \"description\": \"An ElasticSearch client service to use for running queries.\",\n+                                \"displayName\": \"Client Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"pretty_print\",\n+                                \"name\": \"el-rest-client-service\",\n                                 \"required\": true,\n-                                \"sensitive\": false\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-elasticsearch-client-service-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.elasticsearch.ElasticSearchClientService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n                             }\n                         },\n-                        \"sideEffectFree\": true,\n-                        \"supportedRelationships\": [\n+                        \"providedApiImplementations\": [\n                             {\n-                                \"description\": \"The FlowFile with transformed content will be routed to this relationship\",\n-                                \"name\": \"success\"\n+                                \"artifact\": \"nifi-standard-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.lookup.StringLookupService\",\n+                                \"version\": \"1.27.0\"\n                             },\n                             {\n-                                \"description\": \"If a FlowFile fails processing for any reason (for example, the FlowFile is not valid JSON), it will be routed to this relationship\",\n-                                \"name\": \"failure\"\n+                                \"artifact\": \"nifi-standard-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.lookup.LookupService\",\n+                                \"version\": \"1.27.0\"\n                             }\n                         ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\",\n-                            \"EVENT_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": true,\n                         \"supportsDynamicProperties\": false,\n-                        \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": true,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"cardinality\",\n-                            \"chainr\",\n-                            \"defaultr\",\n-                            \"jolt\",\n-                            \"json\",\n-                            \"removr\",\n-                            \"shiftr\",\n-                            \"sort\",\n-                            \"transform\"\n+                            \"elasticsearch\",\n+                            \"enrich\",\n+                            \"key\",\n+                            \"lookup\",\n+                            \"value\"\n                         ],\n-                        \"triggerSerially\": false,\n-                        \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.standard.JoltTransformJSON\",\n-                        \"typeDescription\": \"Applies a list of Jolt specifications to the flowfile JSON payload. A new FlowFile is created with transformed content and is routed to the 'success' relationship. If the JSON transform fails, the original FlowFile is routed to the 'failure' relationship.\",\n-                        \"version\": \"1.27.0\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"Always set to application/json\",\n-                                \"name\": \"mime.type\"\n-                            }\n-                        ]\n-                    },\n+                        \"type\": \"org.apache.nifi.elasticsearch.ElasticSearchStringLookupService\",\n+                        \"typeDescription\": \"Lookup a string value from Elasticsearch Server associated with the specified document ID. The coordinates that are passed to the lookup must contain the key 'id'.\",\n+                        \"version\": \"1.27.0\"\n+                    }\n+                ],\n+                \"processors\": [],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"1.27.0\"\n+        },\n+        {\n+            \"artifact\": \"nifi-dropbox-processors-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [],\n+                \"processors\": [\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-standard-nar\",\n+                        \"artifact\": \"nifi-dropbox-processors-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n                         },\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"1 min\"\n+                            \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n-                        \"primaryNodeOnly\": true,\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n+                        \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"list-db-include-count\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"Whether to include the table's row count as a flow file attribute. This affects performance as a database query will be generated for each table in the retrieved list.\",\n-                                \"displayName\": \"Include Count\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"list-db-include-count\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"list-db-refresh-interval\": {\n-                                \"defaultValue\": \"0 sec\",\n-                                \"description\": \"The amount of time to elapse before resetting the processor state, thereby causing all current tables to be listed. During this interval, the processor may continue to run, but tables that have already been listed will not be re-listed. However new/added tables will be listed as the processor runs. A value of zero means the state will never be automatically reset, the user must Clear State manually.\",\n-                                \"displayName\": \"Refresh Interval\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"list-db-refresh-interval\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"list-db-tables-catalog\": {\n-                                \"description\": \"The name of a catalog from which to list database tables. The name must match the catalog name as it is stored in the database. If the property is not set, the catalog name will not be used to narrow the search for tables. If the property is set to an empty string, tables without a catalog will be listed.\",\n-                                \"displayName\": \"Catalog\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"list-db-tables-catalog\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"list-db-tables-db-connection\": {\n-                                \"description\": \"The Controller Service that is used to obtain connection to database\",\n-                                \"displayName\": \"Database Connection Pooling Service\",\n+                            \"dropbox-credential-service\": {\n+                                \"description\": \"Controller Service used to obtain Dropbox credentials (App Key, App Secret, Access Token, Refresh Token). See controller service's Additional Details for more information.\",\n+                                \"displayName\": \"Dropbox Credential Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"list-db-tables-db-connection\",\n+                                \"name\": \"dropbox-credential-service\",\n                                 \"required\": true,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"artifact\": \"nifi-dropbox-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.dbcp.DBCPService\",\n+                                    \"type\": \"org.apache.nifi.dropbox.credentials.service.DropboxCredentialService\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             },\n-                            \"list-db-tables-name-pattern\": {\n-                                \"description\": \"A pattern for matching tables in the database. Within a pattern, \\\"%\\\" means match any substring of 0 or more characters, and \\\"_\\\" means match any one character. The pattern must match the table name as it is stored in the database. If the property is not set, all tables will be retrieved.\",\n-                                \"displayName\": \"Table Name Pattern\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"list-db-tables-name-pattern\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"list-db-tables-schema-pattern\": {\n-                                \"description\": \"A pattern for matching schemas in the database. Within a pattern, \\\"%\\\" means match any substring of 0 or more characters, and \\\"_\\\" means match any one character. The pattern must match the schema name as it is stored in the database. If the property is not set, the schema name will not be used to narrow the search for tables. If the property is set to an empty string, tables without a schema will be listed.\",\n-                                \"displayName\": \"Schema Pattern\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"list-db-tables-schema-pattern\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"list-db-tables-types\": {\n-                                \"defaultValue\": \"TABLE\",\n-                                \"description\": \"A comma-separated list of table types to include. For example, some databases support TABLE and VIEW types. If the property is not set, tables of all types will be returned.\",\n-                                \"displayName\": \"Table Types\",\n+                            \"file\": {\n+                                \"defaultValue\": \"${dropbox.id}\",\n+                                \"description\": \"The Dropbox identifier or path of the Dropbox file to fetch. The 'File' should match the following regular expression pattern: /.*|id:.* . When ListDropbox is used for input, either '${dropbox.id}' (identifying files by Dropbox id) or '${path}/${filename}' (identifying files by path) can be used as 'File' value.\",\n+                                \"displayName\": \"File\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"list-db-tables-types\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"file\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"record-writer\": {\n-                                \"description\": \"Specifies the Record Writer to use for creating the listing. If not specified, one FlowFile will be created for each entity that is listed. If the Record Writer is specified, all entities will be written to a single FlowFile instead of adding attributes to individual FlowFiles.\",\n-                                \"displayName\": \"Record Writer\",\n+                            \"proxy-configuration-service\": {\n+                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests. Supported proxies: HTTP + AuthN\",\n+                                \"displayName\": \"Proxy Configuration Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"record-writer\",\n+                                \"name\": \"proxy-configuration-service\",\n                                 \"required\": false,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n                                     \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n+                                    \"type\": \"org.apache.nifi.proxy.ProxyConfigurationService\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             }\n                         },\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.processors.dropbox.ListDropbox\",\n+                            \"org.apache.nifi.processors.dropbox.PutDropbox\"\n+                        ],\n                         \"sideEffectFree\": false,\n-                        \"stateful\": {\n-                            \"description\": \"After performing a listing of tables, the timestamp of the query is stored. This allows the Processor to not re-list tables the next time that the Processor is run. Specifying the refresh interval in the processor properties will indicate that when the processor detects the interval has elapsed, the state will be reset and tables will be re-listed as a result. This processor is meant to be run on the primary node only.\",\n-                            \"scopes\": [\n-                                \"CLUSTER\"\n-                            ]\n-                        },\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"All FlowFiles that are received are routed to success\",\n+                                \"description\": \"A FlowFile will be routed here for each successfully fetched File.\",\n                                 \"name\": \"success\"\n+                            },\n+                            {\n+                                \"description\": \"A FlowFile will be routed here for each File for which fetch was attempted but failed.\",\n+                                \"name\": \"failure\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n                         \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"database\",\n-                            \"jdbc\",\n-                            \"list\",\n-                            \"sql\",\n-                            \"table\"\n+                            \"dropbox\",\n+                            \"fetch\",\n+                            \"storage\"\n                         ],\n-                        \"triggerSerially\": true,\n+                        \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.standard.ListDatabaseTables\",\n-                        \"typeDescription\": \"Generates a set of flow files, each containing attributes corresponding to metadata about a table from a database connection. Once metadata about a table has been fetched, it will not be fetched again until the Refresh Interval (if set) has elapsed, or until state has been manually cleared.\",\n+                        \"type\": \"org.apache.nifi.processors.dropbox.FetchDropbox\",\n+                        \"typeDescription\": \"Fetches files from Dropbox. Designed to be used in tandem with ListDropbox.\",\n                         \"version\": \"1.27.0\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"Contains the name of a database table from the connection\",\n-                                \"name\": \"db.table.name\"\n+                                \"description\": \"The error message returned by Dropbox\",\n+                                \"name\": \"error.message\"\n                             },\n                             {\n-                                \"description\": \"Contains the name of the catalog to which the table belongs (may be null)\",\n-                                \"name\": \"db.table.catalog\"\n+                                \"description\": \"The Dropbox identifier of the file\",\n+                                \"name\": \"dropbox.id\"\n                             },\n                             {\n-                                \"description\": \"Contains the name of the schema to which the table belongs (may be null)\",\n-                                \"name\": \"db.table.schema\"\n+                                \"description\": \"The folder path where the file is located\",\n+                                \"name\": \"path\"\n                             },\n                             {\n-                                \"description\": \"Contains the fully-qualifed table name (possibly including catalog, schema, etc.)\",\n-                                \"name\": \"db.table.fullname\"\n+                                \"description\": \"The name of the file\",\n+                                \"name\": \"filename\"\n                             },\n                             {\n-                                \"description\": \"Contains the type of the database table from the connection. Typical types are \\\"TABLE\\\", \\\"VIEW\\\", \\\"SYSTEM TABLE\\\", \\\"GLOBAL TEMPORARY\\\", \\\"LOCAL TEMPORARY\\\", \\\"ALIAS\\\", \\\"SYNONYM\\\"\",\n-                                \"name\": \"db.table.type\"\n+                                \"description\": \"The size of the file\",\n+                                \"name\": \"dropbox.size\"\n                             },\n                             {\n-                                \"description\": \"Contains the name of a database table from the connection\",\n-                                \"name\": \"db.table.remarks\"\n+                                \"description\": \"The server modified time of the file\",\n+                                \"name\": \"dropbox.timestamp\"\n                             },\n                             {\n-                                \"description\": \"Contains the number of rows in the table\",\n-                                \"name\": \"db.table.count\"\n+                                \"description\": \"Revision of the file\",\n+                                \"name\": \"dropbox.revision\"\n                             }\n                         ]\n                     },\n                     {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-standard-nar\",\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-dropbox-processors-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -109057,330 +108781,72 @@\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_FORBIDDEN\",\n                         \"primaryNodeOnly\": true,\n                         \"propertyDescriptors\": {\n-                            \"Connection Mode\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Active\",\n-                                        \"value\": \"Active\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Passive\",\n-                                        \"value\": \"Passive\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"Passive\",\n-                                \"description\": \"The FTP Connection Mode\",\n-                                \"displayName\": \"Connection Mode\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Connection Mode\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Connection Timeout\": {\n-                                \"defaultValue\": \"30 sec\",\n-                                \"description\": \"Amount of time to wait before timing out while creating a connection\",\n-                                \"displayName\": \"Connection Timeout\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Connection Timeout\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Data Timeout\": {\n-                                \"defaultValue\": \"30 sec\",\n-                                \"description\": \"When transferring a file between the local and remote system, this value specifies how long is allowed to elapse without any data being transferred between systems\",\n-                                \"displayName\": \"Data Timeout\",\n+                            \"dropbox-credential-service\": {\n+                                \"description\": \"Controller Service used to obtain Dropbox credentials (App Key, App Secret, Access Token, Refresh Token). See controller service's Additional Details for more information.\",\n+                                \"displayName\": \"Dropbox Credential Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Data Timeout\",\n+                                \"name\": \"dropbox-credential-service\",\n                                 \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Distributed Cache Service\": {\n-                                \"description\": \"NOTE: This property is used merely for migration from old NiFi version before state management was introduced at version 0.5.0. The stored value in the cache service will be migrated into the state when this processor is started at the first time. The specified Controller Service was used to maintain state about what had been pulled from the remote server so that if a new node begins pulling data, it won't duplicate all of the work that has been done. If not specified, the information was not shared across the cluster. This property did not need to be set for standalone instances of NiFi but was supposed to be configured if NiFi had been running within a cluster.\",\n-                                \"displayName\": \"Distributed Cache Service\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Distributed Cache Service\",\n-                                \"required\": false,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"artifact\": \"nifi-dropbox-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.distributed.cache.client.DistributedMapCacheClient\",\n+                                    \"type\": \"org.apache.nifi.dropbox.credentials.service.DropboxCredentialService\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             },\n-                            \"File Filter Regex\": {\n-                                \"description\": \"Provides a Java Regular Expression for filtering Filenames; if a filter is supplied, only files whose names match that Regular Expression will be fetched\",\n-                                \"displayName\": \"File Filter Regex\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"File Filter Regex\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Hostname\": {\n-                                \"description\": \"The fully qualified hostname or IP address of the remote system\",\n-                                \"displayName\": \"Hostname\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Hostname\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Http Proxy Password\": {\n-                                \"description\": \"Http Proxy Password\",\n-                                \"displayName\": \"Http Proxy Password\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Http Proxy Password\",\n-                                \"required\": false,\n-                                \"sensitive\": true\n-                            },\n-                            \"Http Proxy Username\": {\n-                                \"description\": \"Http Proxy Username\",\n-                                \"displayName\": \"Http Proxy Username\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Http Proxy Username\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Ignore Dotted Files\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"true\",\n-                                \"description\": \"If true, files whose names begin with a dot (\\\".\\\") will be ignored\",\n-                                \"displayName\": \"Ignore Dotted Files\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Ignore Dotted Files\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Internal Buffer Size\": {\n-                                \"defaultValue\": \"16KB\",\n-                                \"description\": \"Set the internal buffer size for buffered data streams\",\n-                                \"displayName\": \"Internal Buffer Size\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Internal Buffer Size\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Password\": {\n-                                \"description\": \"Password for the user account\",\n-                                \"displayName\": \"Password\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Password\",\n-                                \"required\": false,\n-                                \"sensitive\": true\n-                            },\n-                            \"Path Filter Regex\": {\n-                                \"description\": \"When Search Recursively is true, then only subdirectories whose path matches the given Regular Expression will be scanned\",\n-                                \"displayName\": \"Path Filter Regex\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Path Filter Regex\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Port\": {\n-                                \"defaultValue\": \"21\",\n-                                \"description\": \"The port to connect to on the remote host to fetch the data from\",\n-                                \"displayName\": \"Port\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Port\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Proxy Host\": {\n-                                \"description\": \"The fully qualified hostname or IP address of the proxy server\",\n-                                \"displayName\": \"Proxy Host\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Proxy Host\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Proxy Port\": {\n-                                \"description\": \"The port of the proxy server\",\n-                                \"displayName\": \"Proxy Port\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Proxy Port\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Proxy Type\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"DIRECT\",\n-                                        \"value\": \"DIRECT\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"HTTP\",\n-                                        \"value\": \"HTTP\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"SOCKS\",\n-                                        \"value\": \"SOCKS\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"DIRECT\",\n-                                \"description\": \"Proxy type used for file transfers\",\n-                                \"displayName\": \"Proxy Type\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Proxy Type\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Remote Path\": {\n-                                \"defaultValue\": \".\",\n-                                \"description\": \"The path on the remote system from which to pull or push files\",\n-                                \"displayName\": \"Remote Path\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Remote Path\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Remote Poll Batch Size\": {\n-                                \"defaultValue\": \"5000\",\n-                                \"description\": \"The value specifies how many file paths to find in a given directory on the remote system when doing a file listing. This value in general should not need to be modified but when polling against a remote system with a tremendous number of files this value can be critical.  Setting this value too high can result very poor performance and setting it too low can cause the flow to be slower than normal.\",\n-                                \"displayName\": \"Remote Poll Batch Size\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Remote Poll Batch Size\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Search Recursively\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"If true, will pull files from arbitrarily nested subdirectories; otherwise, will not traverse subdirectories\",\n-                                \"displayName\": \"Search Recursively\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Search Recursively\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Transfer Mode\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Binary\",\n-                                        \"value\": \"Binary\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"ASCII\",\n-                                        \"value\": \"ASCII\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"Binary\",\n-                                \"description\": \"The FTP Transfer Mode\",\n-                                \"displayName\": \"Transfer Mode\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Transfer Mode\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Username\": {\n-                                \"description\": \"Username\",\n-                                \"displayName\": \"Username\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Username\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n                             \"et-initial-listing-target\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"Ignore entities having timestamp older than the specified 'Tracking Time Window' at the initial listing activity.\",\n                                         \"displayName\": \"Tracking Time Window\",\n                                         \"value\": \"window\"\n                                     },\n                                     {\n                                         \"description\": \"Regardless of entities timestamp, all existing entities will be listed at the initial listing activity.\",\n                                         \"displayName\": \"All Available\",\n                                         \"value\": \"all\"\n                                     }\n                                 ],\n                                 \"defaultValue\": \"all\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"entities\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Listing Strategy\",\n+                                        \"propertyName\": \"listing-strategy\"\n+                                    }\n+                                ],\n                                 \"description\": \"Specify how initial listing should be handled. Used by 'Tracking Entities' strategy.\",\n                                 \"displayName\": \"Entity Tracking Initial Listing Target\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n                                 \"name\": \"et-initial-listing-target\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n                             \"et-state-cache\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"entities\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Listing Strategy\",\n+                                        \"propertyName\": \"listing-strategy\"\n+                                    }\n+                                ],\n                                 \"description\": \"Listed entities are stored in the specified cache storage so that this processor can resume listing across NiFi restart or in case of primary node change. 'Tracking Entities' strategy require tracking information of all listed entities within the last 'Tracking Time Window'. To support large number of entities, the strategy uses DistributedMapCache instead of managed state. Cache key format is 'ListedEntities::{processorId}(::{nodeId})'. If it tracks per node listed entities, then the optional '::{nodeId}' part is added to manage state separately. E.g. cluster wide cache key = 'ListedEntities::8dda2321-0164-1000-50fa-3042fe7d6a7b', per node cache key = 'ListedEntities::8dda2321-0164-1000-50fa-3042fe7d6a7b::nifi-node3' The stored cache content is Gzipped JSON string. The cache key will be deleted when target listing configuration is changed. Used by 'Tracking Entities' strategy.\",\n                                 \"displayName\": \"Entity Tracking State Cache\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n                                 \"name\": \"et-state-cache\",\n                                 \"required\": false,\n@@ -109390,66 +108856,40 @@\n                                     \"group\": \"org.apache.nifi\",\n                                     \"type\": \"org.apache.nifi.distributed.cache.client.DistributedMapCacheClient\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             },\n                             \"et-time-window\": {\n                                 \"defaultValue\": \"3 hours\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"entities\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Listing Strategy\",\n+                                        \"propertyName\": \"listing-strategy\"\n+                                    }\n+                                ],\n                                 \"description\": \"Specify how long this processor should track already-listed entities. 'Tracking Entities' strategy can pick any entity whose timestamp is inside the specified time window. For example, if set to '30 minutes', any entity having timestamp in recent 30 minutes will be the listing target when this processor runs. A listed entity is considered 'new/updated' and a FlowFile is emitted if one of following condition meets: 1. does not exist in the already-listed entities, 2. has newer timestamp than the cached entity, 3. has different size than the cached entity. If a cached entity's timestamp becomes older than specified time window, that entity will be removed from the cached already-listed entities. Used by 'Tracking Entities' strategy.\",\n                                 \"displayName\": \"Entity Tracking Time Window\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n                                 \"name\": \"et-time-window\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"follow-symlink\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"If true, will pull even symbolic files and also nested symbolic subdirectories; otherwise, will not read symbolic files and will not traverse symbolic link subdirectories\",\n-                                \"displayName\": \"Follow symlink\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"follow-symlink\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"ftp-use-utf8\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"Tells the client to use UTF-8 encoding when processing files and filenames. If set to true, the server must also support UTF-8 encoding.\",\n-                                \"displayName\": \"Use UTF-8 Encoding\",\n+                            \"folder\": {\n+                                \"defaultValue\": \"/\",\n+                                \"description\": \"The Dropbox identifier or path of the folder from which to pull list of files. 'Folder' should match the following regular expression pattern: /.*|id:.* . Example for folder identifier: id:odTlUvbpIEAAAAAAAAAGGQ. Example for folder path: /Team1/Task1.\",\n+                                \"displayName\": \"Folder\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"ftp-use-utf8\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"folder\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n                             \"listing-strategy\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"This strategy tracks the latest timestamp of listed entity to determine new/updated entities. Since it only tracks few timestamps, it can manage listing state efficiently. However, any newly added, or updated entity having timestamp older than the tracked latest timestamp can not be picked by this strategy. For example, such situation can happen in a file system if a file with old timestamp is copied or moved into the target directory without its last modified timestamp being updated. Also may miss files when multiple subdirectories are being written at the same time while listing is running.\",\n@@ -109458,36 +108898,47 @@\n                                     },\n                                     {\n                                         \"description\": \"This strategy tracks information of all the listed entities within the latest 'Entity Tracking Time Window' to determine new/updated entities. This strategy can pick entities having old timestamp that can be missed with 'Tracking Timestamps'. Works even when multiple subdirectories are being written at the same time while listing is running. However additional DistributedMapCache controller service is required and more JVM heap memory is used. See the description of 'Entity Tracking Time Window' property for further details on how it works.\",\n                                         \"displayName\": \"Tracking Entities\",\n                                         \"value\": \"entities\"\n                                     },\n                                     {\n-                                        \"description\": \"This strategy lists an entity without any tracking. The same entity will be listed each time on executing this processor. It is recommended to change the default run schedule value. Any property that related to the persisting state will be disregarded.\",\n-                                        \"displayName\": \"No Tracking\",\n-                                        \"value\": \"none\"\n-                                    },\n-                                    {\n                                         \"description\": \"This strategy uses a sliding time window. The window starts where the previous window ended and ends with the 'current time'. One cycle will list files with modification time falling within the time window. Works even when multiple subdirectories are being written at the same time while listing is running. IMPORTANT: This strategy works properly only if the time on both the system hosting NiFi and the one hosting the files are accurate.\",\n                                         \"displayName\": \"Time Window\",\n                                         \"value\": \"time-window\"\n+                                    },\n+                                    {\n+                                        \"description\": \"This strategy lists an entity without any tracking. The same entity will be listed each time on executing this processor. It is recommended to change the default run schedule value. Any property that related to the persisting state will be disregarded.\",\n+                                        \"displayName\": \"No Tracking\",\n+                                        \"value\": \"none\"\n                                     }\n                                 ],\n                                 \"defaultValue\": \"timestamps\",\n                                 \"description\": \"Specify how to determine new/updated entities. See each strategy descriptions for detail.\",\n                                 \"displayName\": \"Listing Strategy\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n                                 \"name\": \"listing-strategy\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n+                            \"min-age\": {\n+                                \"defaultValue\": \"0 sec\",\n+                                \"description\": \"The minimum age a file must be in order to be considered; any files newer than this will be ignored.\",\n+                                \"displayName\": \"Minimum File Age\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"min-age\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n                             \"proxy-configuration-service\": {\n-                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests. If set, it supersedes proxy settings configured per component. Supported proxies: SOCKS + AuthN, HTTP + AuthN\",\n+                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests. Supported proxies: HTTP + AuthN\",\n                                 \"displayName\": \"Proxy Configuration Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n                                 \"name\": \"proxy-configuration-service\",\n                                 \"required\": false,\n                                 \"sensitive\": false,\n@@ -109510,56 +108961,45 @@\n                                 \"typeProvidedByValue\": {\n                                     \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n                                     \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             },\n-                            \"target-system-timestamp-precision\": {\n+                            \"recursive-search\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Automatically detect time unit deterministically based on candidate entries timestamp. Please note that this option may take longer to list entities unnecessarily, if none of entries has a precise precision timestamp. E.g. even if a target system supports millis, if all entries only have timestamps without millis, such as '2017-06-16 09:06:34.000', then its precision is determined as 'seconds'.\",\n-                                        \"displayName\": \"Auto Detect\",\n-                                        \"value\": \"auto-detect\"\n-                                    },\n-                                    {\n-                                        \"description\": \"This option provides the minimum latency for an entry from being available to being listed if target system supports millis, if not, use other options.\",\n-                                        \"displayName\": \"Milliseconds\",\n-                                        \"value\": \"millis\"\n-                                    },\n-                                    {\n-                                        \"description\": \"For a target system that does not have millis precision, but has in seconds.\",\n-                                        \"displayName\": \"Seconds\",\n-                                        \"value\": \"seconds\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n-                                        \"description\": \"For a target system that only supports precision in minutes.\",\n-                                        \"displayName\": \"Minutes\",\n-                                        \"value\": \"minutes\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"auto-detect\",\n-                                \"description\": \"Specify timestamp precision at the target system. Since this processor uses timestamp of entities to decide which should be listed, it is crucial to use the right timestamp precision.\",\n-                                \"displayName\": \"Target System Timestamp Precision\",\n+                                \"defaultValue\": \"true\",\n+                                \"description\": \"Indicates whether to list files from subfolders of the Dropbox folder.\",\n+                                \"displayName\": \"Search Recursively\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"target-system-timestamp-precision\",\n+                                \"name\": \"recursive-search\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             }\n                         },\n                         \"seeAlso\": [\n-                            \"org.apache.nifi.processors.standard.FetchFTP\",\n-                            \"org.apache.nifi.processors.standard.GetFTP\",\n-                            \"org.apache.nifi.processors.standard.PutFTP\"\n+                            \"org.apache.nifi.processors.dropbox.FetchDropbox\",\n+                            \"org.apache.nifi.processors.dropbox.PutDropbox\"\n                         ],\n                         \"sideEffectFree\": false,\n                         \"stateful\": {\n-                            \"description\": \"After performing a listing of files, the timestamp of the newest file is stored. This allows the Processor to list only files that have been added or modified after this date the next time that the Processor is run. State is stored across the cluster so that this Processor can be run on Primary Node only and if a new Primary Node is selected, the new node will not duplicate the data that was listed by the previous Primary Node.\",\n+                            \"description\": \"The processor stores necessary data to be able to keep track what files have been listed already. What exactly needs to be stored depends on the 'Listing Strategy'.\",\n                             \"scopes\": [\n                                 \"CLUSTER\"\n                             ]\n                         },\n                         \"supportedRelationships\": [\n                             {\n                                 \"description\": \"All FlowFiles that are received are routed to success\",\n@@ -109572,1371 +109012,1476 @@\n                         ],\n                         \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"files\",\n-                            \"ftp\",\n-                            \"ingest\",\n-                            \"input\",\n-                            \"list\",\n-                            \"remote\",\n-                            \"source\"\n+                            \"dropbox\",\n+                            \"storage\"\n                         ],\n                         \"triggerSerially\": true,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.standard.ListFTP\",\n-                        \"typeDescription\": \"Performs a listing of the files residing on an FTP server. For each file that is found on the remote server, a new FlowFile will be created with the filename attribute set to the name of the file on the remote server. This can then be used in conjunction with FetchFTP in order to fetch those files.\",\n+                        \"type\": \"org.apache.nifi.processors.dropbox.ListDropbox\",\n+                        \"typeDescription\": \"Retrieves a listing of files from Dropbox (shortcuts are ignored). Each listed file may result in one FlowFile, the metadata being written as FlowFile attributes. When the 'Record Writer' property is set, the entire result is written as records to a single FlowFile. This Processor is designed to run on Primary Node only in a cluster. If the primary node changes, the new Primary Node will pick up where the previous node left off without duplicating all of the data.\",\n                         \"version\": \"1.27.0\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"The hostname of the FTP Server\",\n-                                \"name\": \"ftp.remote.host\"\n+                                \"description\": \"The Dropbox identifier of the file\",\n+                                \"name\": \"dropbox.id\"\n                             },\n                             {\n-                                \"description\": \"The port that was connected to on the FTP Server\",\n-                                \"name\": \"ftp.remote.port\"\n+                                \"description\": \"The folder path where the file is located\",\n+                                \"name\": \"path\"\n                             },\n                             {\n-                                \"description\": \"The username of the user that performed the FTP Listing\",\n-                                \"name\": \"ftp.listing.user\"\n+                                \"description\": \"The name of the file\",\n+                                \"name\": \"filename\"\n                             },\n                             {\n-                                \"description\": \"The numeric owner id of the source file\",\n-                                \"name\": \"file.owner\"\n+                                \"description\": \"The size of the file\",\n+                                \"name\": \"dropbox.size\"\n                             },\n                             {\n-                                \"description\": \"The numeric group id of the source file\",\n-                                \"name\": \"file.group\"\n+                                \"description\": \"The server modified time of the file\",\n+                                \"name\": \"dropbox.timestamp\"\n                             },\n                             {\n-                                \"description\": \"The read/write/execute permissions of the source file\",\n-                                \"name\": \"file.permissions\"\n+                                \"description\": \"Revision of the file\",\n+                                \"name\": \"dropbox.revision\"\n+                            }\n+                        ]\n+                    },\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-dropbox-processors-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"e0c4461\"\n+                        },\n+                        \"defaultBulletinLevel\": \"WARN\",\n+                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": 1,\n+                            \"TIMER_DRIVEN\": 1\n+                        },\n+                        \"defaultPenaltyDuration\": \"30 sec\",\n+                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": \"* * * * * ?\",\n+                            \"TIMER_DRIVEN\": \"0 sec\"\n+                        },\n+                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n+                        \"defaultYieldDuration\": \"1 sec\",\n+                        \"group\": \"org.apache.nifi\",\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n+                        \"primaryNodeOnly\": false,\n+                        \"propertyDescriptors\": {\n+                            \"chunked-upload-size\": {\n+                                \"defaultValue\": \"8 MB\",\n+                                \"description\": \"Defines the size of a chunk. Used when a FlowFile's size exceeds 'Chunked Upload Threshold' and content is uploaded in smaller chunks. It is recommended to specify chunked upload size smaller than 'Chunked Upload Threshold' and as multiples of 4 MB. Maximum allowed value is 150 MB.\",\n+                                \"displayName\": \"Chunked Upload Size\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"chunked-upload-size\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"chunked-upload-threshold\": {\n+                                \"defaultValue\": \"150 MB\",\n+                                \"description\": \"The maximum size of the content which is uploaded at once. FlowFiles larger than this threshold are uploaded in chunks. Maximum allowed value is 150 MB.\",\n+                                \"displayName\": \"Chunked Upload Threshold\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"chunked-upload-threshold\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"conflict-resolution-strategy\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"Handle file conflict as failure.\",\n+                                        \"displayName\": \"fail\",\n+                                        \"value\": \"fail\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Ignore conflict, do not change the original file.\",\n+                                        \"displayName\": \"ignore\",\n+                                        \"value\": \"ignore\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Replace existing file in case of conflict.\",\n+                                        \"displayName\": \"replace\",\n+                                        \"value\": \"replace\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"fail\",\n+                                \"description\": \"Indicates what should happen when a file with the same name already exists in the specified Dropbox folder.\",\n+                                \"displayName\": \"Conflict Resolution Strategy\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"conflict-resolution-strategy\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"dropbox-credential-service\": {\n+                                \"description\": \"Controller Service used to obtain Dropbox credentials (App Key, App Secret, Access Token, Refresh Token). See controller service's Additional Details for more information.\",\n+                                \"displayName\": \"Dropbox Credential Service\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"dropbox-credential-service\",\n+                                \"required\": true,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-dropbox-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.dropbox.credentials.service.DropboxCredentialService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"file-name\": {\n+                                \"defaultValue\": \"${filename}\",\n+                                \"description\": \"The full name of the file to upload.\",\n+                                \"displayName\": \"Filename\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"file-name\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"folder\": {\n+                                \"defaultValue\": \"/\",\n+                                \"description\": \"The path of the Dropbox folder to upload files to. The folder will be created if it does not exist yet.\",\n+                                \"displayName\": \"Folder\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"folder\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"proxy-configuration-service\": {\n+                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests. Supported proxies: HTTP + AuthN\",\n+                                \"displayName\": \"Proxy Configuration Service\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"proxy-configuration-service\",\n+                                \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.proxy.ProxyConfigurationService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            }\n+                        },\n+                        \"readsAttributes\": [\n+                            {\n+                                \"description\": \"Uses the FlowFile's filename as the filename for the Dropbox object.\",\n+                                \"name\": \"filename\"\n+                            }\n+                        ],\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.processors.dropbox.FetchDropbox\",\n+                            \"org.apache.nifi.processors.dropbox.ListDropbox\"\n+                        ],\n+                        \"sideEffectFree\": false,\n+                        \"supportedRelationships\": [\n+                            {\n+                                \"description\": \"Files that have been successfully written to Dropbox are transferred to this relationship.\",\n+                                \"name\": \"success\"\n                             },\n                             {\n-                                \"description\": \"The number of bytes in the source file\",\n-                                \"name\": \"file.size\"\n+                                \"description\": \"Files that could not be written to Dropbox for some reason are transferred to this relationship.\",\n+                                \"name\": \"failure\"\n+                            }\n+                        ],\n+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\"\n+                        ],\n+                        \"supportsBatching\": false,\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicRelationships\": false,\n+                        \"supportsEventDriven\": false,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"dropbox\",\n+                            \"put\",\n+                            \"storage\"\n+                        ],\n+                        \"triggerSerially\": false,\n+                        \"triggerWhenAnyDestinationAvailable\": false,\n+                        \"triggerWhenEmpty\": false,\n+                        \"type\": \"org.apache.nifi.processors.dropbox.PutDropbox\",\n+                        \"typeDescription\": \"Puts content to a Dropbox folder.\",\n+                        \"version\": \"1.27.0\",\n+                        \"writesAttributes\": [\n+                            {\n+                                \"description\": \"The error message returned by Dropbox\",\n+                                \"name\": \"error.message\"\n                             },\n                             {\n-                                \"description\": \"The timestamp of when the file in the filesystem waslast modified as 'yyyy-MM-dd'T'HH:mm:ssZ'\",\n-                                \"name\": \"file.lastModifiedTime\"\n+                                \"description\": \"The Dropbox identifier of the file\",\n+                                \"name\": \"dropbox.id\"\n                             },\n                             {\n-                                \"description\": \"The name of the file on the FTP Server\",\n+                                \"description\": \"The folder path where the file is located\",\n+                                \"name\": \"path\"\n+                            },\n+                            {\n+                                \"description\": \"The name of the file\",\n                                 \"name\": \"filename\"\n                             },\n                             {\n-                                \"description\": \"The fully qualified name of the directory on the FTP Server from which the file was pulled\",\n-                                \"name\": \"path\"\n+                                \"description\": \"The size of the file\",\n+                                \"name\": \"dropbox.size\"\n+                            },\n+                            {\n+                                \"description\": \"The server modified time of the file\",\n+                                \"name\": \"dropbox.timestamp\"\n+                            },\n+                            {\n+                                \"description\": \"Revision of the file\",\n+                                \"name\": \"dropbox.revision\"\n+                            }\n+                        ]\n+                    }\n+                ],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"1.27.0\"\n+        },\n+        {\n+            \"artifact\": \"nifi-jms-processors-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [\n+                    {\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-jms-processors-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"e0c4461\"\n+                        },\n+                        \"dynamicProperties\": [\n+                            {\n+                                \"description\": \"The properties that are set following Java Beans convention where a property name is derived from the 'set*' method of the vendor specific ConnectionFactory's implementation. For example, 'com.ibm.mq.jms.MQConnectionFactory.setChannel(String)' would imply 'channel' property and 'com.ibm.mq.jms.MQConnectionFactory.setTransportType(int)' would imply 'transportType' property.\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"name\": \"The name of a Connection Factory configuration property.\",\n+                                \"value\": \"The value of a given Connection Factory configuration property.\"\n+                            }\n+                        ],\n+                        \"explicitRestrictions\": [\n+                            {\n+                                \"explanation\": \"Client Library Location can reference resources over HTTP\",\n+                                \"requiredPermission\": \"reference remote resources\"\n+                            }\n+                        ],\n+                        \"group\": \"org.apache.nifi\",\n+                        \"propertyDescriptors\": {\n+                            \"SSL Context Service\": {\n+                                \"description\": \"The SSL Context Service used to provide client certificate information for TLS/SSL connections.\",\n+                                \"displayName\": \"JMS SSL Context Service\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"SSL Context Service\",\n+                                \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"broker\": {\n+                                \"description\": \"URI pointing to the network location of the JMS Message broker. Example for ActiveMQ: 'tcp://myhost:61616'. Examples for IBM MQ: 'myhost(1414)' and 'myhost01(1414),myhost02(1414)'.\",\n+                                \"displayName\": \"JMS Broker URI\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"broker\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"cf\": {\n+                                \"description\": \"The fully qualified name of the JMS ConnectionFactory implementation class (eg. org.apache.activemq.ActiveMQConnectionFactory).\",\n+                                \"displayName\": \"JMS Connection Factory Implementation Class\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"cf\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"cflib\": {\n+                                \"description\": \"Path to the directory with additional resources (eg. JARs, configuration files etc.) to be added to the classpath (defined as a comma separated list of values). Such resources typically represent target JMS client libraries for the ConnectionFactory implementation.\",\n+                                \"displayName\": \"JMS Client Libraries\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"cflib\",\n+                                \"required\": false,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"MULTIPLE\",\n+                                    \"resourceTypes\": [\n+                                        \"DIRECTORY\",\n+                                        \"FILE\",\n+                                        \"URL\"\n+                                    ]\n+                                },\n+                                \"sensitive\": false\n+                            }\n+                        },\n+                        \"providedApiImplementations\": [\n+                            {\n+                                \"artifact\": \"nifi-jms-cf-service-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.jms.cf.JMSConnectionFactoryProviderDefinition\",\n+                                \"version\": \"1.27.0\"\n+                            }\n+                        ],\n+                        \"restricted\": true,\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.jms.processors.ConsumeJMS\",\n+                            \"org.apache.nifi.jms.processors.PublishJMS\"\n+                        ],\n+                        \"supportsDynamicProperties\": true,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"integration\",\n+                            \"jms\",\n+                            \"messaging\",\n+                            \"publish\",\n+                            \"queue\",\n+                            \"subscribe\",\n+                            \"topic\"\n+                        ],\n+                        \"type\": \"org.apache.nifi.jms.cf.JMSConnectionFactoryProvider\",\n+                        \"typeDescription\": \"Provides a generic service to create vendor specific javax.jms.ConnectionFactory implementations. The Connection Factory can be served once this service is configured successfully.\",\n+                        \"version\": \"1.27.0\"\n+                    },\n+                    {\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-jms-processors-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"e0c4461\"\n+                        },\n+                        \"dynamicProperties\": [\n+                            {\n+                                \"description\": \"In order to perform a JNDI Lookup, an Initial Context must be established. When this is done, an Environment can be established for the context. Any dynamic/user-defined property that is added to this Controller Service will be added as an Environment configuration/variable to this Context.\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"name\": \"The name of a JNDI Initial Context environment variable.\",\n+                                \"value\": \"The value of the JNDI Initial Context environment variable.\"\n+                            }\n+                        ],\n+                        \"group\": \"org.apache.nifi\",\n+                        \"propertyDescriptors\": {\n+                            \"connection.factory.name\": {\n+                                \"description\": \"The name of the JNDI Object to lookup for the Connection Factory.\",\n+                                \"displayName\": \"JNDI Name of the Connection Factory\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"connection.factory.name\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"java.naming.factory.initial\": {\n+                                \"description\": \"The fully qualified class name of the JNDI Initial Context Factory Class (java.naming.factory.initial).\",\n+                                \"displayName\": \"JNDI Initial Context Factory Class\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"java.naming.factory.initial\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"java.naming.provider.url\": {\n+                                \"description\": \"The URL of the JNDI Provider to use as the value for java.naming.provider.url. See additional details documentation for allowed URL schemes.\",\n+                                \"displayName\": \"JNDI Provider URL\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"java.naming.provider.url\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"java.naming.security.credentials\": {\n+                                \"description\": \"The Credentials to use when authenticating with JNDI (java.naming.security.credentials).\",\n+                                \"displayName\": \"JNDI Credentials\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"java.naming.security.credentials\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n+                            },\n+                            \"java.naming.security.principal\": {\n+                                \"description\": \"The Principal to use when authenticating with JNDI (java.naming.security.principal).\",\n+                                \"displayName\": \"JNDI Principal\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"java.naming.security.principal\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"naming.factory.libraries\": {\n+                                \"description\": \"Specifies jar files and/or directories to add to the ClassPath in order to load the JNDI / JMS client libraries. This should be a comma-separated list of files, directories, and/or URLs. If a directory is given, any files in that directory will be included, but subdirectories will not be included (i.e., it is not recursive).\",\n+                                \"displayName\": \"JNDI / JMS Client Libraries\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"naming.factory.libraries\",\n+                                \"required\": false,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"MULTIPLE\",\n+                                    \"resourceTypes\": [\n+                                        \"DIRECTORY\",\n+                                        \"FILE\",\n+                                        \"URL\"\n+                                    ]\n+                                },\n+                                \"sensitive\": false\n+                            }\n+                        },\n+                        \"providedApiImplementations\": [\n+                            {\n+                                \"artifact\": \"nifi-jms-cf-service-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.jms.cf.JMSConnectionFactoryProviderDefinition\",\n+                                \"version\": \"1.27.0\"\n                             }\n-                        ]\n-                    },\n+                        ],\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.jms.cf.JMSConnectionFactoryProvider\",\n+                            \"org.apache.nifi.jms.processors.ConsumeJMS\",\n+                            \"org.apache.nifi.jms.processors.PublishJMS\"\n+                        ],\n+                        \"supportsDynamicProperties\": true,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"integration\",\n+                            \"jms\",\n+                            \"jndi\",\n+                            \"messaging\",\n+                            \"publish\",\n+                            \"queue\",\n+                            \"subscribe\",\n+                            \"topic\"\n+                        ],\n+                        \"type\": \"org.apache.nifi.jms.cf.JndiJmsConnectionFactoryProvider\",\n+                        \"typeDescription\": \"Provides a service to lookup an existing JMS ConnectionFactory using the Java Naming and Directory Interface (JNDI).\",\n+                        \"version\": \"1.27.0\"\n+                    }\n+                ],\n+                \"processors\": [\n                     {\n                         \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-standard-nar\",\n+                        \"artifact\": \"nifi-jms-processors-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n                         },\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"1 min\"\n+                            \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n+                        \"dynamicProperties\": [\n+                            {\n+                                \"description\": \"Additional configuration property for the Connection Factory. It can be used when the Connection Factory is being configured via the 'JNDI *' or the 'JMS *'properties of the processor. For more information, see the Additional Details page.\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"name\": \"The name of a Connection Factory configuration property.\",\n+                                \"value\": \"The value of a given Connection Factory configuration property.\"\n+                            }\n+                        ],\n+                        \"explicitRestrictions\": [\n+                            {\n+                                \"explanation\": \"Client Library Location can reference resources over HTTP\",\n+                                \"requiredPermission\": \"reference remote resources\"\n+                            }\n+                        ],\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_FORBIDDEN\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"File Filter\": {\n-                                \"defaultValue\": \"[^\\\\.].*\",\n-                                \"description\": \"Only files whose names match the given regular expression will be picked up\",\n-                                \"displayName\": \"File Filter\",\n+                            \"Acknowledgement Mode\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"Automatically acknowledges a client's receipt of a message, regardless if NiFi session has been commited. Can result in data loss in the event where NiFi abruptly stopped before session was commited.\",\n+                                        \"displayName\": \"AUTO_ACKNOWLEDGE (1)\",\n+                                        \"value\": \"1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"(DEFAULT) Manually acknowledges a client's receipt of a message after NiFi Session was commited, thus ensuring no data loss\",\n+                                        \"displayName\": \"CLIENT_ACKNOWLEDGE (2)\",\n+                                        \"value\": \"2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"This acknowledgment mode instructs the session to lazily acknowledge the delivery of messages. May result in both data duplication and data loss while achieving the best throughput.\",\n+                                        \"displayName\": \"DUPS_OK_ACKNOWLEDGE (3)\",\n+                                        \"value\": \"3\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"2\",\n+                                \"description\": \"The JMS Acknowledgement Mode. Using Auto Acknowledge can cause messages to be lost on restart of NiFi but may provide better performance than Client Acknowledge.\",\n+                                \"displayName\": \"Acknowledgement Mode\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"File Filter\",\n+                                \"name\": \"Acknowledgement Mode\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Ignore Hidden Files\": {\n+                            \"Connection Client ID\": {\n+                                \"description\": \"The client id to be set on the connection, if set. For durable non shared consumer this is mandatory, for all others it is optional, typically with shared consumers it is undesirable to be set. Please see JMS spec for further details\",\n+                                \"displayName\": \"Connection Client ID\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Connection Client ID\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Connection Factory Service\": {\n+                                \"description\": \"The Controller Service that is used to obtain Connection Factory. Alternatively, the 'JNDI *' or the 'JMS *' properties can also be be used to configure the Connection Factory.\",\n+                                \"displayName\": \"Connection Factory Service\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Connection Factory Service\",\n+                                \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-jms-cf-service-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.jms.cf.JMSConnectionFactoryProviderDefinition\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"Destination Name\": {\n+                                \"description\": \"The name of the JMS Destination. Usually provided by the administrator (e.g., 'topic://myTopic' or 'myTopic').\",\n+                                \"displayName\": \"Destination Name\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Destination Name\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Destination Type\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"displayName\": \"QUEUE\",\n+                                        \"value\": \"QUEUE\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"displayName\": \"TOPIC\",\n+                                        \"value\": \"TOPIC\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"true\",\n-                                \"description\": \"Indicates whether or not hidden files should be ignored\",\n-                                \"displayName\": \"Ignore Hidden Files\",\n+                                \"defaultValue\": \"QUEUE\",\n+                                \"description\": \"The type of the JMS Destination. Could be one of 'QUEUE' or 'TOPIC'. Usually provided by the administrator. Defaults to 'QUEUE'\",\n+                                \"displayName\": \"Destination Type\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Ignore Hidden Files\",\n+                                \"name\": \"Destination Type\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Include File Attributes\": {\n+                            \"Durable subscription\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"true\",\n                                         \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"false\",\n                                         \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"true\",\n-                                \"description\": \"Whether or not to include information such as the file's Last Modified Time and Owner as FlowFile Attributes. Depending on the File System being used, gathering this information can be expensive and as a result should be disabled. This is especially true of remote file shares.\",\n-                                \"displayName\": \"Include File Attributes\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Include File Attributes\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Input Directory\": {\n-                                \"description\": \"The input directory from which files to pull files\",\n-                                \"displayName\": \"Input Directory\",\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"If destination is Topic if present then make it the consumer durable. @see https://docs.oracle.com/javaee/7/api/javax/jms/Session.html#createDurableConsumer-javax.jms.Topic-java.lang.String-\",\n+                                \"displayName\": \"Durable Subscription\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Input Directory\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Input Directory Location\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"Input Directory is located on a local disk. State will be stored locally on each node in the cluster.\",\n-                                        \"displayName\": \"Local\",\n-                                        \"value\": \"Local\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Input Directory is located on a remote system. State will be stored across the cluster so that the listing can be performed on Primary Node Only and another node can pick up where the last node left off, if the Primary Node changes\",\n-                                        \"displayName\": \"Remote\",\n-                                        \"value\": \"Remote\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"Local\",\n-                                \"description\": \"Specifies where the Input Directory is located. This is used to determine whether state should be stored locally or across the cluster.\",\n-                                \"displayName\": \"Input Directory Location\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Input Directory Location\",\n-                                \"required\": true,\n+                                \"name\": \"Durable subscription\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Maximum File Age\": {\n-                                \"description\": \"The maximum age that a file must be in order to be pulled; any file older than this amount of time (according to last modification date) will be ignored\",\n-                                \"displayName\": \"Maximum File Age\",\n+                            \"Error Queue Name\": {\n+                                \"description\": \"The name of a JMS Queue where - if set - unprocessed messages will be routed. Usually provided by the administrator (e.g., 'queue://myErrorQueue' or 'myErrorQueue').Only applicable if 'Destination Type' is set to 'QUEUE'\",\n+                                \"displayName\": \"Error Queue Name\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Maximum File Age\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Error Queue Name\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Maximum File Size\": {\n-                                \"description\": \"The maximum size that a file can be in order to be pulled\",\n-                                \"displayName\": \"Maximum File Size\",\n+                            \"Message Selector\": {\n+                                \"description\": \"The JMS Message Selector to filter the messages that the processor will receive\",\n+                                \"displayName\": \"Message Selector\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Maximum File Size\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Message Selector\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Minimum File Age\": {\n-                                \"defaultValue\": \"0 sec\",\n-                                \"description\": \"The minimum age that a file must be in order to be pulled; any file younger than this amount of time (according to last modification date) will be ignored\",\n-                                \"displayName\": \"Minimum File Age\",\n+                            \"Password\": {\n+                                \"description\": \"Password used for authentication and authorization.\",\n+                                \"displayName\": \"Password\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Minimum File Age\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n+                                \"name\": \"Password\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n                             },\n-                            \"Minimum File Size\": {\n-                                \"defaultValue\": \"0 B\",\n-                                \"description\": \"The minimum size that a file must be in order to be pulled\",\n-                                \"displayName\": \"Minimum File Size\",\n+                            \"SSL Context Service\": {\n+                                \"description\": \"The SSL Context Service used to provide client certificate information for TLS/SSL connections.\",\n+                                \"displayName\": \"JMS SSL Context Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Minimum File Size\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n+                                \"name\": \"SSL Context Service\",\n+                                \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n                             },\n-                            \"Path Filter\": {\n-                                \"description\": \"When Recurse Subdirectories is true, then only subdirectories whose path matches the given regular expression will be scanned\",\n-                                \"displayName\": \"Path Filter\",\n+                            \"Session Cache size\": {\n+                                \"defaultValue\": \"1\",\n+                                \"description\": \"This property is deprecated and no longer has any effect on the Processor. It will be removed in a later version.\",\n+                                \"displayName\": \"Session Cache Size\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Path Filter\",\n+                                \"name\": \"Session Cache size\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Recurse Subdirectories\": {\n+                            \"Shared subscription\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"true\",\n                                         \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"false\",\n                                         \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"true\",\n-                                \"description\": \"Indicates whether to list files from subdirectories of the directory\",\n-                                \"displayName\": \"Recurse Subdirectories\",\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"If destination is Topic if present then make it the consumer shared. @see https://docs.oracle.com/javaee/7/api/javax/jms/Session.html#createSharedConsumer-javax.jms.Topic-java.lang.String-\",\n+                                \"displayName\": \"Shared Subscription\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Recurse Subdirectories\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Shared subscription\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Subscription Name\": {\n+                                \"description\": \"The name of the subscription to use if destination is Topic and is shared or durable.\",\n+                                \"displayName\": \"Subscription Name\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Subscription Name\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Timeout\": {\n+                                \"defaultValue\": \"1 sec\",\n+                                \"description\": \"How long to wait to consume a message from the remote broker before giving up.\",\n+                                \"displayName\": \"Timeout\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Timeout\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"et-initial-listing-target\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"Ignore entities having timestamp older than the specified 'Tracking Time Window' at the initial listing activity.\",\n-                                        \"displayName\": \"Tracking Time Window\",\n-                                        \"value\": \"window\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Regardless of entities timestamp, all existing entities will be listed at the initial listing activity.\",\n-                                        \"displayName\": \"All Available\",\n-                                        \"value\": \"all\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"all\",\n-                                \"description\": \"Specify how initial listing should be handled. Used by 'Tracking Entities' strategy.\",\n-                                \"displayName\": \"Entity Tracking Initial Listing Target\",\n+                            \"User Name\": {\n+                                \"description\": \"User Name used for authentication and authorization.\",\n+                                \"displayName\": \"User Name\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"et-initial-listing-target\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"User Name\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"et-node-identifier\": {\n-                                \"defaultValue\": \"${hostname()}\",\n-                                \"description\": \"The configured value will be appended to the cache key so that listing state can be tracked per NiFi node rather than cluster wide when tracking state is scoped to LOCAL. Used by 'Tracking Entities' strategy.\",\n-                                \"displayName\": \"Entity Tracking Node Identifier\",\n+                            \"broker\": {\n+                                \"description\": \"URI pointing to the network location of the JMS Message broker. Example for ActiveMQ: 'tcp://myhost:61616'. Examples for IBM MQ: 'myhost(1414)' and 'myhost01(1414),myhost02(1414)'.\",\n+                                \"displayName\": \"JMS Broker URI\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"et-node-identifier\",\n+                                \"name\": \"broker\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"et-state-cache\": {\n-                                \"description\": \"Listed entities are stored in the specified cache storage so that this processor can resume listing across NiFi restart or in case of primary node change. 'Tracking Entities' strategy require tracking information of all listed entities within the last 'Tracking Time Window'. To support large number of entities, the strategy uses DistributedMapCache instead of managed state. Cache key format is 'ListedEntities::{processorId}(::{nodeId})'. If it tracks per node listed entities, then the optional '::{nodeId}' part is added to manage state separately. E.g. cluster wide cache key = 'ListedEntities::8dda2321-0164-1000-50fa-3042fe7d6a7b', per node cache key = 'ListedEntities::8dda2321-0164-1000-50fa-3042fe7d6a7b::nifi-node3' The stored cache content is Gzipped JSON string. The cache key will be deleted when target listing configuration is changed. Used by 'Tracking Entities' strategy.\",\n-                                \"displayName\": \"Entity Tracking State Cache\",\n+                            \"cf\": {\n+                                \"description\": \"The fully qualified name of the JMS ConnectionFactory implementation class (eg. org.apache.activemq.ActiveMQConnectionFactory).\",\n+                                \"displayName\": \"JMS Connection Factory Implementation Class\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"et-state-cache\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"cf\",\n                                 \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.distributed.cache.client.DistributedMapCacheClient\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n+                                \"sensitive\": false\n                             },\n-                            \"et-time-window\": {\n-                                \"defaultValue\": \"3 hours\",\n-                                \"description\": \"Specify how long this processor should track already-listed entities. 'Tracking Entities' strategy can pick any entity whose timestamp is inside the specified time window. For example, if set to '30 minutes', any entity having timestamp in recent 30 minutes will be the listing target when this processor runs. A listed entity is considered 'new/updated' and a FlowFile is emitted if one of following condition meets: 1. does not exist in the already-listed entities, 2. has newer timestamp than the cached entity, 3. has different size than the cached entity. If a cached entity's timestamp becomes older than specified time window, that entity will be removed from the cached already-listed entities. Used by 'Tracking Entities' strategy.\",\n-                                \"displayName\": \"Entity Tracking Time Window\",\n+                            \"cflib\": {\n+                                \"description\": \"Path to the directory with additional resources (eg. JARs, configuration files etc.) to be added to the classpath (defined as a comma separated list of values). Such resources typically represent target JMS client libraries for the ConnectionFactory implementation.\",\n+                                \"displayName\": \"JMS Client Libraries\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"et-time-window\",\n+                                \"name\": \"cflib\",\n                                 \"required\": false,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"MULTIPLE\",\n+                                    \"resourceTypes\": [\n+                                        \"DIRECTORY\",\n+                                        \"FILE\",\n+                                        \"URL\"\n+                                    ]\n+                                },\n                                 \"sensitive\": false\n                             },\n-                            \"listing-strategy\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"This strategy tracks the latest timestamp of listed entity to determine new/updated entities. Since it only tracks few timestamps, it can manage listing state efficiently. However, any newly added, or updated entity having timestamp older than the tracked latest timestamp can not be picked by this strategy. For example, such situation can happen in a file system if a file with old timestamp is copied or moved into the target directory without its last modified timestamp being updated. Also may miss files when multiple subdirectories are being written at the same time while listing is running.\",\n-                                        \"displayName\": \"Tracking Timestamps\",\n-                                        \"value\": \"timestamps\"\n-                                    },\n-                                    {\n-                                        \"description\": \"This strategy tracks information of all the listed entities within the latest 'Entity Tracking Time Window' to determine new/updated entities. This strategy can pick entities having old timestamp that can be missed with 'Tracking Timestamps'. Works even when multiple subdirectories are being written at the same time while listing is running. However additional DistributedMapCache controller service is required and more JVM heap memory is used. See the description of 'Entity Tracking Time Window' property for further details on how it works.\",\n-                                        \"displayName\": \"Tracking Entities\",\n-                                        \"value\": \"entities\"\n-                                    },\n-                                    {\n-                                        \"description\": \"This strategy lists an entity without any tracking. The same entity will be listed each time on executing this processor. It is recommended to change the default run schedule value. Any property that related to the persisting state will be disregarded.\",\n-                                        \"displayName\": \"No Tracking\",\n-                                        \"value\": \"none\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"timestamps\",\n-                                \"description\": \"Specify how to determine new/updated entities. See each strategy descriptions for detail.\",\n-                                \"displayName\": \"Listing Strategy\",\n+                            \"character-set\": {\n+                                \"defaultValue\": \"UTF-8\",\n+                                \"description\": \"The name of the character set to use to construct or interpret TextMessages\",\n+                                \"displayName\": \"Character Set\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"listing-strategy\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"character-set\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"max-listing-time\": {\n-                                \"defaultValue\": \"3 mins\",\n-                                \"description\": \"The maximum amount of time that listing any single directory is expected to take. If the listing for the directory specified by the 'Input Directory' property, or the listing of any subdirectory (if 'Recurse' is set to true) takes longer than this amount of time, a warning bulletin will be generated for each directory listing that exceeds this amount of time.\",\n-                                \"displayName\": \"Max Directory Listing Time\",\n+                            \"connection.factory.name\": {\n+                                \"description\": \"The name of the JNDI Object to lookup for the Connection Factory.\",\n+                                \"displayName\": \"JNDI Name of the Connection Factory\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"max-listing-time\",\n+                                \"name\": \"connection.factory.name\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"max-operation-time\": {\n-                                \"defaultValue\": \"10 secs\",\n-                                \"description\": \"The maximum amount of time that any single disk operation is expected to take. If any disk operation takes longer than this amount of time, a warning bulletin will be generated for each operation that exceeds this amount of time.\",\n-                                \"displayName\": \"Max Disk Operation Time\",\n+                            \"java.naming.factory.initial\": {\n+                                \"description\": \"The fully qualified class name of the JNDI Initial Context Factory Class (java.naming.factory.initial).\",\n+                                \"displayName\": \"JNDI Initial Context Factory Class\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"max-operation-time\",\n+                                \"name\": \"java.naming.factory.initial\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"max-performance-metrics\": {\n-                                \"defaultValue\": \"100000\",\n-                                \"description\": \"If the 'Track Performance' property is set to 'true', this property indicates the maximum number of files whose performance metrics should be held onto. A smaller value for this property will result in less heap utilization, while a larger value may provide more accurate insights into how the disk access operations are performing\",\n-                                \"displayName\": \"Maximum Number of Files to Track\",\n+                            \"java.naming.provider.url\": {\n+                                \"description\": \"The URL of the JNDI Provider to use as the value for java.naming.provider.url. See additional details documentation for allowed URL schemes.\",\n+                                \"displayName\": \"JNDI Provider URL\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"max-performance-metrics\",\n-                                \"required\": true,\n+                                \"name\": \"java.naming.provider.url\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"record-writer\": {\n-                                \"description\": \"Specifies the Record Writer to use for creating the listing. If not specified, one FlowFile will be created for each entity that is listed. If the Record Writer is specified, all entities will be written to a single FlowFile instead of adding attributes to individual FlowFiles.\",\n-                                \"displayName\": \"Record Writer\",\n+                            \"java.naming.security.credentials\": {\n+                                \"description\": \"The Credentials to use when authenticating with JNDI (java.naming.security.credentials).\",\n+                                \"displayName\": \"JNDI Credentials\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"record-writer\",\n+                                \"name\": \"java.naming.security.credentials\",\n                                 \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n+                                \"sensitive\": true\n                             },\n-                            \"target-system-timestamp-precision\": {\n+                            \"java.naming.security.principal\": {\n+                                \"description\": \"The Principal to use when authenticating with JNDI (java.naming.security.principal).\",\n+                                \"displayName\": \"JNDI Principal\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"java.naming.security.principal\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"naming.factory.libraries\": {\n+                                \"description\": \"Specifies jar files and/or directories to add to the ClassPath in order to load the JNDI / JMS client libraries. This should be a comma-separated list of files, directories, and/or URLs. If a directory is given, any files in that directory will be included, but subdirectories will not be included (i.e., it is not recursive).\",\n+                                \"displayName\": \"JNDI / JMS Client Libraries\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"naming.factory.libraries\",\n+                                \"required\": false,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"MULTIPLE\",\n+                                    \"resourceTypes\": [\n+                                        \"DIRECTORY\",\n+                                        \"FILE\",\n+                                        \"URL\"\n+                                    ]\n+                                },\n+                                \"sensitive\": false\n+                            },\n+                            \"output-strategy\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Automatically detect time unit deterministically based on candidate entries timestamp. Please note that this option may take longer to list entities unnecessarily, if none of entries has a precise precision timestamp. E.g. even if a target system supports millis, if all entries only have timestamps without millis, such as '2017-06-16 09:06:34.000', then its precision is determined as 'seconds'.\",\n-                                        \"displayName\": \"Auto Detect\",\n-                                        \"value\": \"auto-detect\"\n+                                        \"description\": \"Write only the message to the FlowFile record.\",\n+                                        \"displayName\": \"Use Content as Value\",\n+                                        \"value\": \"USE_VALUE\"\n                                     },\n                                     {\n-                                        \"description\": \"This option provides the minimum latency for an entry from being available to being listed if target system supports millis, if not, use other options.\",\n-                                        \"displayName\": \"Milliseconds\",\n-                                        \"value\": \"millis\"\n+                                        \"description\": \"Write the additional attributes into the FlowFile record on a separate leaf. (See processor usage for more information.)\",\n+                                        \"displayName\": \"Use Wrapper\",\n+                                        \"value\": \"USE_WRAPPER\"\n                                     },\n                                     {\n-                                        \"description\": \"For a target system that does not have millis precision, but has in seconds.\",\n-                                        \"displayName\": \"Seconds\",\n-                                        \"value\": \"seconds\"\n-                                    },\n+                                        \"description\": \"Write the additional attributes into the FlowFile record prefixed with \\\"_\\\". (See processor usage for more information.)\",\n+                                        \"displayName\": \"Use Appender\",\n+                                        \"value\": \"USE_APPENDER\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"USE_VALUE\",\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"For a target system that only supports precision in minutes.\",\n-                                        \"displayName\": \"Minutes\",\n-                                        \"value\": \"minutes\"\n+                                        \"propertyDisplayName\": \"Record Reader\",\n+                                        \"propertyName\": \"record-reader\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"auto-detect\",\n-                                \"description\": \"Specify timestamp precision at the target system. Since this processor uses timestamp of entities to decide which should be listed, it is crucial to use the right timestamp precision.\",\n-                                \"displayName\": \"Target System Timestamp Precision\",\n+                                \"description\": \"The format used to output the JMS message into a FlowFile record.\",\n+                                \"displayName\": \"Output Strategy\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"target-system-timestamp-precision\",\n+                                \"name\": \"output-strategy\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"track-performance\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n+                            \"record-reader\": {\n+                                \"description\": \"The Record Reader to use for parsing received JMS Messages into Records.\",\n+                                \"displayName\": \"Record Reader\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"record-reader\",\n+                                \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"record-writer\": {\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"propertyDisplayName\": \"Record Reader\",\n+                                        \"propertyName\": \"record-reader\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"Whether or not the Processor should track the performance of disk access operations. If true, all accesses to disk will be recorded, including the file being accessed, the information being obtained, and how long it takes. This is then logged periodically at a DEBUG level. While the amount of data will be capped, this option may still consume a significant amount of heap (controlled by the 'Maximum Number of Files to Track' property), but it can be very useful for troubleshooting purposes if performance is poor is degraded.\",\n-                                \"displayName\": \"Track Performance\",\n+                                \"description\": \"The Record Writer to use for serializing Records before writing them to a FlowFile.\",\n+                                \"displayName\": \"Record Writer\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"track-performance\",\n+                                \"name\": \"record-writer\",\n                                 \"required\": true,\n-                                \"sensitive\": false\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n                             }\n                         },\n+                        \"restricted\": true,\n                         \"seeAlso\": [\n-                            \"org.apache.nifi.processors.standard.FetchFile\",\n-                            \"org.apache.nifi.processors.standard.GetFile\",\n-                            \"org.apache.nifi.processors.standard.PutFile\"\n+                            \"org.apache.nifi.jms.cf.JMSConnectionFactoryProvider\",\n+                            \"org.apache.nifi.jms.processors.PublishJMS\"\n                         ],\n                         \"sideEffectFree\": false,\n-                        \"stateful\": {\n-                            \"description\": \"After performing a listing of files, the timestamp of the newest file is stored. This allows the Processor to list only files that have been added or modified after this date the next time that the Processor is run. Whether the state is stored with a Local or Cluster scope depends on the value of the <Input Directory Location> property.\",\n-                            \"scopes\": [\n-                                \"CLUSTER\",\n-                                \"LOCAL\"\n-                            ]\n-                        },\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"All FlowFiles that are received are routed to success\",\n+                                \"description\": \"All FlowFiles that are received from the JMS Destination are routed to this relationship\",\n                                 \"name\": \"success\"\n+                            },\n+                            {\n+                                \"description\": \"If a message cannot be parsed using the configured Record Reader, the contents of the message will be routed to this Relationship as its own individual FlowFile.\",\n+                                \"name\": \"parse.failure\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n                         \"supportsBatching\": false,\n-                        \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicProperties\": true,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"file\",\n-                            \"filesystem\",\n+                            \"consume\",\n                             \"get\",\n-                            \"ingest\",\n-                            \"list\",\n-                            \"source\"\n+                            \"jms\",\n+                            \"message\",\n+                            \"receive\"\n                         ],\n-                        \"triggerSerially\": true,\n+                        \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.standard.ListFile\",\n-                        \"typeDescription\": \"Retrieves a listing of files from the input directory. For each file listed, creates a FlowFile that represents the file so that it can be fetched in conjunction with FetchFile. This Processor is designed to run on Primary Node only in a cluster when 'Input Directory Location' is set to 'Remote'. If the primary node changes, the new Primary Node will pick up where the previous node left off without duplicating all the data. When 'Input Directory Location' is 'Local', the 'Execution' mode can be anything, and synchronization won't happen. Unlike GetFile, this Processor does not delete any data from the local filesystem.\",\n+                        \"type\": \"org.apache.nifi.jms.processors.ConsumeJMS\",\n+                        \"typeDescription\": \"Consumes JMS Message of type BytesMessage, TextMessage, ObjectMessage, MapMessage or StreamMessage transforming its content to a FlowFile and transitioning it to 'success' relationship. JMS attributes such as headers and properties will be copied as FlowFile attributes. MapMessages will be transformed into JSONs and then into byte arrays. The other types will have their raw contents as byte array transferred into the flowfile.\",\n                         \"version\": \"1.27.0\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"The name of the file that was read from filesystem.\",\n-                                \"name\": \"filename\"\n+                                \"description\": \"The JMSDeliveryMode from the message header.\",\n+                                \"name\": \"jms_deliveryMode\"\n                             },\n                             {\n-                                \"description\": \"The path is set to the relative path of the file's directory on filesystem compared to the Input Directory property. For example, if Input Directory is set to /tmp, then files picked up from /tmp will have the path attribute set to \\\"/\\\". If the Recurse Subdirectories property is set to true and a file is picked up from /tmp/abc/1/2/3, then the path attribute will be set to \\\"abc/1/2/3/\\\".\",\n-                                \"name\": \"path\"\n+                                \"description\": \"The JMSExpiration from the message header.\",\n+                                \"name\": \"jms_expiration\"\n                             },\n                             {\n-                                \"description\": \"The absolute.path is set to the absolute path of the file's directory on filesystem. For example, if the Input Directory property is set to /tmp, then files picked up from /tmp will have the path attribute set to \\\"/tmp/\\\". If the Recurse Subdirectories property is set to true and a file is picked up from /tmp/abc/1/2/3, then the path attribute will be set to \\\"/tmp/abc/1/2/3/\\\".\",\n-                                \"name\": \"absolute.path\"\n+                                \"description\": \"The JMSPriority from the message header.\",\n+                                \"name\": \"jms_priority\"\n                             },\n                             {\n-                                \"description\": \"The user that owns the file in filesystem\",\n-                                \"name\": \"file.owner\"\n+                                \"description\": \"The JMSRedelivered from the message header.\",\n+                                \"name\": \"jms_redelivered\"\n                             },\n                             {\n-                                \"description\": \"The group that owns the file in filesystem\",\n-                                \"name\": \"file.group\"\n+                                \"description\": \"The JMSTimestamp from the message header.\",\n+                                \"name\": \"jms_timestamp\"\n                             },\n                             {\n-                                \"description\": \"The number of bytes in the file in filesystem\",\n-                                \"name\": \"file.size\"\n+                                \"description\": \"The JMSCorrelationID from the message header.\",\n+                                \"name\": \"jms_correlationId\"\n                             },\n                             {\n-                                \"description\": \"The permissions for the file in filesystem. This is formatted as 3 characters for the owner, 3 for the group, and 3 for other users. For example rw-rw-r--\",\n-                                \"name\": \"file.permissions\"\n+                                \"description\": \"The JMSMessageID from the message header.\",\n+                                \"name\": \"jms_messageId\"\n                             },\n                             {\n-                                \"description\": \"The timestamp of when the file in filesystem was last modified as 'yyyy-MM-dd'T'HH:mm:ssZ'\",\n-                                \"name\": \"file.lastModifiedTime\"\n+                                \"description\": \"The JMSType from the message header.\",\n+                                \"name\": \"jms_type\"\n                             },\n                             {\n-                                \"description\": \"The timestamp of when the file in filesystem was last accessed as 'yyyy-MM-dd'T'HH:mm:ssZ'\",\n-                                \"name\": \"file.lastAccessTime\"\n+                                \"description\": \"The JMSReplyTo from the message header.\",\n+                                \"name\": \"jms_replyTo\"\n                             },\n                             {\n-                                \"description\": \"The timestamp of when the file in filesystem was created as 'yyyy-MM-dd'T'HH:mm:ssZ'\",\n-                                \"name\": \"file.creationTime\"\n+                                \"description\": \"The JMSDestination from the message header.\",\n+                                \"name\": \"jms_destination\"\n+                            },\n+                            {\n+                                \"description\": \"The JMS message type, can be TextMessage, BytesMessage, ObjectMessage, MapMessage or StreamMessage).\",\n+                                \"name\": \"jms.messagetype\"\n+                            },\n+                            {\n+                                \"description\": \"Each message property is written to an attribute.\",\n+                                \"name\": \"other attributes\"\n                             }\n                         ]\n                     },\n                     {\n                         \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-standard-nar\",\n+                        \"artifact\": \"nifi-jms-processors-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n                         },\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"1 min\"\n+                            \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n+                        \"dynamicProperties\": [\n+                            {\n+                                \"description\": \"Additional configuration property for the Connection Factory. It can be used when the Connection Factory is being configured via the 'JNDI *' or the 'JMS *'properties of the processor. For more information, see the Additional Details page.\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"name\": \"The name of a Connection Factory configuration property.\",\n+                                \"value\": \"The value of a given Connection Factory configuration property.\"\n+                            }\n+                        ],\n+                        \"explicitRestrictions\": [\n+                            {\n+                                \"explanation\": \"Client Library Location can reference resources over HTTP\",\n+                                \"requiredPermission\": \"reference remote resources\"\n+                            }\n+                        ],\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n-                        \"primaryNodeOnly\": true,\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n+                        \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Ciphers Allowed\": {\n-                                \"description\": \"A comma-separated list of Ciphers allowed for SFTP connections. Leave unset to allow all. Available options are: 3des-cbc, 3des-ctr, aes128-cbc, aes128-ctr, aes128-gcm@openssh.com, aes192-cbc, aes192-ctr, aes256-cbc, aes256-ctr, aes256-gcm@openssh.com, arcfour, arcfour128, arcfour256, blowfish-cbc, blowfish-ctr, cast128-cbc, cast128-ctr, chacha20-poly1305@openssh.com, idea-cbc, idea-ctr, serpent128-cbc, serpent128-ctr, serpent192-cbc, serpent192-ctr, serpent256-cbc, serpent256-ctr, twofish-cbc, twofish128-cbc, twofish128-ctr, twofish192-cbc, twofish192-ctr, twofish256-cbc, twofish256-ctr\",\n-                                \"displayName\": \"Ciphers Allowed\",\n+                            \"Connection Client ID\": {\n+                                \"description\": \"The client id to be set on the connection, if set. For durable non shared consumer this is mandatory, for all others it is optional, typically with shared consumers it is undesirable to be set. Please see JMS spec for further details\",\n+                                \"displayName\": \"Connection Client ID\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Ciphers Allowed\",\n+                                \"name\": \"Connection Client ID\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Connection Timeout\": {\n-                                \"defaultValue\": \"30 sec\",\n-                                \"description\": \"Amount of time to wait before timing out while creating a connection\",\n-                                \"displayName\": \"Connection Timeout\",\n+                            \"Connection Factory Service\": {\n+                                \"description\": \"The Controller Service that is used to obtain Connection Factory. Alternatively, the 'JNDI *' or the 'JMS *' properties can also be be used to configure the Connection Factory.\",\n+                                \"displayName\": \"Connection Factory Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Connection Timeout\",\n+                                \"name\": \"Connection Factory Service\",\n+                                \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-jms-cf-service-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.jms.cf.JMSConnectionFactoryProviderDefinition\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"Destination Name\": {\n+                                \"description\": \"The name of the JMS Destination. Usually provided by the administrator (e.g., 'topic://myTopic' or 'myTopic').\",\n+                                \"displayName\": \"Destination Name\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Destination Name\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Data Timeout\": {\n-                                \"defaultValue\": \"30 sec\",\n-                                \"description\": \"When transferring a file between the local and remote system, this value specifies how long is allowed to elapse without any data being transferred between systems\",\n-                                \"displayName\": \"Data Timeout\",\n+                            \"Destination Type\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"QUEUE\",\n+                                        \"value\": \"QUEUE\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"TOPIC\",\n+                                        \"value\": \"TOPIC\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"QUEUE\",\n+                                \"description\": \"The type of the JMS Destination. Could be one of 'QUEUE' or 'TOPIC'. Usually provided by the administrator. Defaults to 'QUEUE'\",\n+                                \"displayName\": \"Destination Type\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Data Timeout\",\n+                                \"name\": \"Destination Type\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Distributed Cache Service\": {\n-                                \"description\": \"NOTE: This property is used merely for migration from old NiFi version before state management was introduced at version 0.5.0. The stored value in the cache service will be migrated into the state when this processor is started at the first time. The specified Controller Service was used to maintain state about what had been pulled from the remote server so that if a new node begins pulling data, it won't duplicate all of the work that has been done. If not specified, the information was not shared across the cluster. This property did not need to be set for standalone instances of NiFi but was supposed to be configured if NiFi had been running within a cluster.\",\n-                                \"displayName\": \"Distributed Cache Service\",\n+                            \"Password\": {\n+                                \"description\": \"Password used for authentication and authorization.\",\n+                                \"displayName\": \"Password\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Distributed Cache Service\",\n+                                \"name\": \"Password\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n+                            },\n+                            \"SSL Context Service\": {\n+                                \"description\": \"The SSL Context Service used to provide client certificate information for TLS/SSL connections.\",\n+                                \"displayName\": \"JMS SSL Context Service\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"SSL Context Service\",\n                                 \"required\": false,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n                                     \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.distributed.cache.client.DistributedMapCacheClient\",\n+                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             },\n-                            \"File Filter Regex\": {\n-                                \"description\": \"Provides a Java Regular Expression for filtering Filenames; if a filter is supplied, only files whose names match that Regular Expression will be fetched\",\n-                                \"displayName\": \"File Filter Regex\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"File Filter Regex\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Host Key File\": {\n-                                \"description\": \"If supplied, the given file will be used as the Host Key; otherwise, if 'Strict Host Key Checking' property is applied (set to true) then uses the 'known_hosts' and 'known_hosts2' files from ~/.ssh directory else no host key file will be used\",\n-                                \"displayName\": \"Host Key File\",\n+                            \"Session Cache size\": {\n+                                \"defaultValue\": \"1\",\n+                                \"description\": \"This property is deprecated and no longer has any effect on the Processor. It will be removed in a later version.\",\n+                                \"displayName\": \"Session Cache Size\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Host Key File\",\n+                                \"name\": \"Session Cache size\",\n                                 \"required\": false,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"SINGLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\"\n-                                    ]\n-                                },\n-                                \"sensitive\": false\n-                            },\n-                            \"Hostname\": {\n-                                \"description\": \"The fully qualified hostname or IP address of the remote system\",\n-                                \"displayName\": \"Hostname\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Hostname\",\n-                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Http Proxy Password\": {\n-                                \"description\": \"Http Proxy Password\",\n-                                \"displayName\": \"Http Proxy Password\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Http Proxy Password\",\n-                                \"required\": false,\n-                                \"sensitive\": true\n-                            },\n-                            \"Http Proxy Username\": {\n-                                \"description\": \"Http Proxy Username\",\n-                                \"displayName\": \"Http Proxy Username\",\n+                            \"User Name\": {\n+                                \"description\": \"User Name used for authentication and authorization.\",\n+                                \"displayName\": \"User Name\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Http Proxy Username\",\n+                                \"name\": \"User Name\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Ignore Dotted Files\": {\n+                            \"allow-illegal-chars-in-jms-header-names\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"true\",\n                                         \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"false\",\n                                         \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"true\",\n-                                \"description\": \"If true, files whose names begin with a dot (\\\".\\\") will be ignored\",\n-                                \"displayName\": \"Ignore Dotted Files\",\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"Specifies whether illegal characters in header names should be sent to the JMS broker. Usually hyphens and full-stops.\",\n+                                \"displayName\": \"Allow Illegal Characters in Header Names\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Ignore Dotted Files\",\n+                                \"name\": \"allow-illegal-chars-in-jms-header-names\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Key Algorithms Allowed\": {\n-                                \"description\": \"A comma-separated list of Key Algorithms allowed for SFTP connections. Leave unset to allow all. Available options are: ecdsa-sha2-nistp256, ecdsa-sha2-nistp256-cert-v01@openssh.com, ecdsa-sha2-nistp384, ecdsa-sha2-nistp384-cert-v01@openssh.com, ecdsa-sha2-nistp521, ecdsa-sha2-nistp521-cert-v01@openssh.com, rsa-sha2-256, rsa-sha2-512, ssh-dss, ssh-dss-cert-v01@openssh.com, ssh-ed25519, ssh-ed25519-cert-v01@openssh.com, ssh-rsa, ssh-rsa-cert-v01@openssh.com\",\n-                                \"displayName\": \"Key Algorithms Allowed\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Key Algorithms Allowed\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Key Exchange Algorithms Allowed\": {\n-                                \"description\": \"A comma-separated list of Key Exchange Algorithms allowed for SFTP connections. Leave unset to allow all. Available options are: curve25519-sha256, curve25519-sha256@libssh.org, diffie-hellman-group-exchange-sha1, diffie-hellman-group-exchange-sha256, diffie-hellman-group1-sha1, diffie-hellman-group14-sha1, diffie-hellman-group14-sha256, diffie-hellman-group14-sha256@ssh.com, diffie-hellman-group15-sha256, diffie-hellman-group15-sha256@ssh.com, diffie-hellman-group15-sha384@ssh.com, diffie-hellman-group15-sha512, diffie-hellman-group16-sha256, diffie-hellman-group16-sha384@ssh.com, diffie-hellman-group16-sha512, diffie-hellman-group16-sha512@ssh.com, diffie-hellman-group17-sha512, diffie-hellman-group18-sha512, diffie-hellman-group18-sha512@ssh.com, ecdh-sha2-nistp256, ecdh-sha2-nistp384, ecdh-sha2-nistp521, ext-info-c\",\n-                                \"displayName\": \"Key Exchange Algorithms Allowed\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Key Exchange Algorithms Allowed\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Maximum File Age\": {\n-                                \"description\": \"The maximum age that a file must be in order to be pulled; any file older than this amount of time (according to last modification date) will be ignored\",\n-                                \"displayName\": \"Maximum File Age\",\n+                            \"attributes-to-send-as-jms-headers-regex\": {\n+                                \"defaultValue\": \".*\",\n+                                \"description\": \"Specifies the Regular Expression that determines the names of FlowFile attributes that should be sent as JMS Headers\",\n+                                \"displayName\": \"Attributes to Send as JMS Headers (Regex)\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Maximum File Age\",\n-                                \"required\": false,\n+                                \"name\": \"attributes-to-send-as-jms-headers-regex\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Maximum File Size\": {\n-                                \"description\": \"The maximum size that a file can be in order to be pulled\",\n-                                \"displayName\": \"Maximum File Size\",\n+                            \"broker\": {\n+                                \"description\": \"URI pointing to the network location of the JMS Message broker. Example for ActiveMQ: 'tcp://myhost:61616'. Examples for IBM MQ: 'myhost(1414)' and 'myhost01(1414),myhost02(1414)'.\",\n+                                \"displayName\": \"JMS Broker URI\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Maximum File Size\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"broker\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Message Authentication Codes Allowed\": {\n-                                \"description\": \"A comma-separated list of Message Authentication Codes allowed for SFTP connections. Leave unset to allow all. Available options are: hmac-md5, hmac-md5-96, hmac-md5-96-etm@openssh.com, hmac-md5-etm@openssh.com, hmac-ripemd160, hmac-ripemd160-96, hmac-ripemd160-etm@openssh.com, hmac-ripemd160@openssh.com, hmac-sha1, hmac-sha1-96, hmac-sha1-96@openssh.com, hmac-sha1-etm@openssh.com, hmac-sha2-256, hmac-sha2-256-etm@openssh.com, hmac-sha2-512, hmac-sha2-512-etm@openssh.com\",\n-                                \"displayName\": \"Message Authentication Codes Allowed\",\n+                            \"cf\": {\n+                                \"description\": \"The fully qualified name of the JMS ConnectionFactory implementation class (eg. org.apache.activemq.ActiveMQConnectionFactory).\",\n+                                \"displayName\": \"JMS Connection Factory Implementation Class\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Message Authentication Codes Allowed\",\n+                                \"name\": \"cf\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Minimum File Age\": {\n-                                \"defaultValue\": \"0 sec\",\n-                                \"description\": \"The minimum age that a file must be in order to be pulled; any file younger than this amount of time (according to last modification date) will be ignored\",\n-                                \"displayName\": \"Minimum File Age\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Minimum File Age\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Minimum File Size\": {\n-                                \"defaultValue\": \"0 B\",\n-                                \"description\": \"The minimum size that a file must be in order to be pulled\",\n-                                \"displayName\": \"Minimum File Size\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Minimum File Size\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Password\": {\n-                                \"description\": \"Password for the user account\",\n-                                \"displayName\": \"Password\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Password\",\n-                                \"required\": false,\n-                                \"sensitive\": true\n-                            },\n-                            \"Path Filter Regex\": {\n-                                \"description\": \"When Search Recursively is true, then only subdirectories whose path matches the given Regular Expression will be scanned\",\n-                                \"displayName\": \"Path Filter Regex\",\n+                            \"cflib\": {\n+                                \"description\": \"Path to the directory with additional resources (eg. JARs, configuration files etc.) to be added to the classpath (defined as a comma separated list of values). Such resources typically represent target JMS client libraries for the ConnectionFactory implementation.\",\n+                                \"displayName\": \"JMS Client Libraries\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Path Filter Regex\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"cflib\",\n                                 \"required\": false,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"MULTIPLE\",\n+                                    \"resourceTypes\": [\n+                                        \"DIRECTORY\",\n+                                        \"FILE\",\n+                                        \"URL\"\n+                                    ]\n+                                },\n                                 \"sensitive\": false\n                             },\n-                            \"Port\": {\n-                                \"defaultValue\": \"22\",\n-                                \"description\": \"The port that the remote system is listening on for file transfers\",\n-                                \"displayName\": \"Port\",\n+                            \"character-set\": {\n+                                \"defaultValue\": \"UTF-8\",\n+                                \"description\": \"The name of the character set to use to construct or interpret TextMessages\",\n+                                \"displayName\": \"Character Set\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Port\",\n+                                \"name\": \"character-set\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Private Key Passphrase\": {\n-                                \"description\": \"Password for the private key\",\n-                                \"displayName\": \"Private Key Passphrase\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Private Key Passphrase\",\n-                                \"required\": false,\n-                                \"sensitive\": true\n-                            },\n-                            \"Private Key Path\": {\n-                                \"description\": \"The fully qualified path to the Private Key file\",\n-                                \"displayName\": \"Private Key Path\",\n+                            \"connection.factory.name\": {\n+                                \"description\": \"The name of the JNDI Object to lookup for the Connection Factory.\",\n+                                \"displayName\": \"JNDI Name of the Connection Factory\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Private Key Path\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"connection.factory.name\",\n                                 \"required\": false,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"SINGLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\"\n-                                    ]\n-                                },\n                                 \"sensitive\": false\n                             },\n-                            \"Proxy Host\": {\n-                                \"description\": \"The fully qualified hostname or IP address of the proxy server\",\n-                                \"displayName\": \"Proxy Host\",\n+                            \"java.naming.factory.initial\": {\n+                                \"description\": \"The fully qualified class name of the JNDI Initial Context Factory Class (java.naming.factory.initial).\",\n+                                \"displayName\": \"JNDI Initial Context Factory Class\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Proxy Host\",\n+                                \"name\": \"java.naming.factory.initial\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Proxy Port\": {\n-                                \"description\": \"The port of the proxy server\",\n-                                \"displayName\": \"Proxy Port\",\n+                            \"java.naming.provider.url\": {\n+                                \"description\": \"The URL of the JNDI Provider to use as the value for java.naming.provider.url. See additional details documentation for allowed URL schemes.\",\n+                                \"displayName\": \"JNDI Provider URL\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Proxy Port\",\n+                                \"name\": \"java.naming.provider.url\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Proxy Type\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"DIRECT\",\n-                                        \"value\": \"DIRECT\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"HTTP\",\n-                                        \"value\": \"HTTP\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"SOCKS\",\n-                                        \"value\": \"SOCKS\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"DIRECT\",\n-                                \"description\": \"Proxy type used for file transfers\",\n-                                \"displayName\": \"Proxy Type\",\n+                            \"java.naming.security.credentials\": {\n+                                \"description\": \"The Credentials to use when authenticating with JNDI (java.naming.security.credentials).\",\n+                                \"displayName\": \"JNDI Credentials\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Proxy Type\",\n+                                \"name\": \"java.naming.security.credentials\",\n                                 \"required\": false,\n-                                \"sensitive\": false\n+                                \"sensitive\": true\n                             },\n-                            \"Remote Path\": {\n-                                \"defaultValue\": \".\",\n-                                \"description\": \"The path on the remote system from which to pull or push files\",\n-                                \"displayName\": \"Remote Path\",\n+                            \"java.naming.security.principal\": {\n+                                \"description\": \"The Principal to use when authenticating with JNDI (java.naming.security.principal).\",\n+                                \"displayName\": \"JNDI Principal\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Remote Path\",\n+                                \"name\": \"java.naming.security.principal\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Remote Poll Batch Size\": {\n-                                \"defaultValue\": \"5000\",\n-                                \"description\": \"The value specifies how many file paths to find in a given directory on the remote system when doing a file listing. This value in general should not need to be modified but when polling against a remote system with a tremendous number of files this value can be critical.  Setting this value too high can result very poor performance and setting it too low can cause the flow to be slower than normal.\",\n-                                \"displayName\": \"Remote Poll Batch Size\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Remote Poll Batch Size\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Search Recursively\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"If true, will pull files from arbitrarily nested subdirectories; otherwise, will not traverse subdirectories\",\n-                                \"displayName\": \"Search Recursively\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Search Recursively\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Send Keep Alive On Timeout\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"true\",\n-                                \"description\": \"Send a Keep Alive message every 5 seconds up to 5 times for an overall timeout of 25 seconds.\",\n-                                \"displayName\": \"Send Keep Alive On Timeout\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Send Keep Alive On Timeout\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Strict Host Key Checking\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"Indicates whether or not strict enforcement of hosts keys should be applied\",\n-                                \"displayName\": \"Strict Host Key Checking\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Strict Host Key Checking\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Use Compression\": {\n+                            \"message-body-type\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"displayName\": \"bytes\",\n+                                        \"value\": \"bytes\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"displayName\": \"text\",\n+                                        \"value\": \"text\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"Indicates whether or not ZLIB compression should be used when transferring files\",\n-                                \"displayName\": \"Use Compression\",\n+                                \"defaultValue\": \"bytes\",\n+                                \"description\": \"The type of JMS message body to construct.\",\n+                                \"displayName\": \"Message Body Type\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Use Compression\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Username\": {\n-                                \"description\": \"Username\",\n-                                \"displayName\": \"Username\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Username\",\n+                                \"name\": \"message-body-type\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"et-initial-listing-target\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"Ignore entities having timestamp older than the specified 'Tracking Time Window' at the initial listing activity.\",\n-                                        \"displayName\": \"Tracking Time Window\",\n-                                        \"value\": \"window\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Regardless of entities timestamp, all existing entities will be listed at the initial listing activity.\",\n-                                        \"displayName\": \"All Available\",\n-                                        \"value\": \"all\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"all\",\n-                                \"description\": \"Specify how initial listing should be handled. Used by 'Tracking Entities' strategy.\",\n-                                \"displayName\": \"Entity Tracking Initial Listing Target\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"et-initial-listing-target\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"et-state-cache\": {\n-                                \"description\": \"Listed entities are stored in the specified cache storage so that this processor can resume listing across NiFi restart or in case of primary node change. 'Tracking Entities' strategy require tracking information of all listed entities within the last 'Tracking Time Window'. To support large number of entities, the strategy uses DistributedMapCache instead of managed state. Cache key format is 'ListedEntities::{processorId}(::{nodeId})'. If it tracks per node listed entities, then the optional '::{nodeId}' part is added to manage state separately. E.g. cluster wide cache key = 'ListedEntities::8dda2321-0164-1000-50fa-3042fe7d6a7b', per node cache key = 'ListedEntities::8dda2321-0164-1000-50fa-3042fe7d6a7b::nifi-node3' The stored cache content is Gzipped JSON string. The cache key will be deleted when target listing configuration is changed. Used by 'Tracking Entities' strategy.\",\n-                                \"displayName\": \"Entity Tracking State Cache\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"et-state-cache\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.distributed.cache.client.DistributedMapCacheClient\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            },\n-                            \"et-time-window\": {\n-                                \"defaultValue\": \"3 hours\",\n-                                \"description\": \"Specify how long this processor should track already-listed entities. 'Tracking Entities' strategy can pick any entity whose timestamp is inside the specified time window. For example, if set to '30 minutes', any entity having timestamp in recent 30 minutes will be the listing target when this processor runs. A listed entity is considered 'new/updated' and a FlowFile is emitted if one of following condition meets: 1. does not exist in the already-listed entities, 2. has newer timestamp than the cached entity, 3. has different size than the cached entity. If a cached entity's timestamp becomes older than specified time window, that entity will be removed from the cached already-listed entities. Used by 'Tracking Entities' strategy.\",\n-                                \"displayName\": \"Entity Tracking Time Window\",\n+                            \"naming.factory.libraries\": {\n+                                \"description\": \"Specifies jar files and/or directories to add to the ClassPath in order to load the JNDI / JMS client libraries. This should be a comma-separated list of files, directories, and/or URLs. If a directory is given, any files in that directory will be included, but subdirectories will not be included (i.e., it is not recursive).\",\n+                                \"displayName\": \"JNDI / JMS Client Libraries\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"et-time-window\",\n+                                \"name\": \"naming.factory.libraries\",\n                                 \"required\": false,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"MULTIPLE\",\n+                                    \"resourceTypes\": [\n+                                        \"DIRECTORY\",\n+                                        \"FILE\",\n+                                        \"URL\"\n+                                    ]\n+                                },\n                                 \"sensitive\": false\n                             },\n-                            \"follow-symlink\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"If true, will pull even symbolic files and also nested symbolic subdirectories; otherwise, will not read symbolic files and will not traverse symbolic link subdirectories\",\n-                                \"displayName\": \"Follow symlink\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"follow-symlink\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"listing-strategy\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"This strategy tracks the latest timestamp of listed entity to determine new/updated entities. Since it only tracks few timestamps, it can manage listing state efficiently. However, any newly added, or updated entity having timestamp older than the tracked latest timestamp can not be picked by this strategy. For example, such situation can happen in a file system if a file with old timestamp is copied or moved into the target directory without its last modified timestamp being updated. Also may miss files when multiple subdirectories are being written at the same time while listing is running.\",\n-                                        \"displayName\": \"Tracking Timestamps\",\n-                                        \"value\": \"timestamps\"\n-                                    },\n-                                    {\n-                                        \"description\": \"This strategy tracks information of all the listed entities within the latest 'Entity Tracking Time Window' to determine new/updated entities. This strategy can pick entities having old timestamp that can be missed with 'Tracking Timestamps'. Works even when multiple subdirectories are being written at the same time while listing is running. However additional DistributedMapCache controller service is required and more JVM heap memory is used. See the description of 'Entity Tracking Time Window' property for further details on how it works.\",\n-                                        \"displayName\": \"Tracking Entities\",\n-                                        \"value\": \"entities\"\n-                                    },\n-                                    {\n-                                        \"description\": \"This strategy lists an entity without any tracking. The same entity will be listed each time on executing this processor. It is recommended to change the default run schedule value. Any property that related to the persisting state will be disregarded.\",\n-                                        \"displayName\": \"No Tracking\",\n-                                        \"value\": \"none\"\n-                                    },\n-                                    {\n-                                        \"description\": \"This strategy uses a sliding time window. The window starts where the previous window ended and ends with the 'current time'. One cycle will list files with modification time falling within the time window. Works even when multiple subdirectories are being written at the same time while listing is running. IMPORTANT: This strategy works properly only if the time on both the system hosting NiFi and the one hosting the files are accurate.\",\n-                                        \"displayName\": \"Time Window\",\n-                                        \"value\": \"time-window\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"timestamps\",\n-                                \"description\": \"Specify how to determine new/updated entities. See each strategy descriptions for detail.\",\n-                                \"displayName\": \"Listing Strategy\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"listing-strategy\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"proxy-configuration-service\": {\n-                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests. If set, it supersedes proxy settings configured per component. Supported proxies: SOCKS + AuthN, HTTP + AuthN\",\n-                                \"displayName\": \"Proxy Configuration Service\",\n+                            \"record-reader\": {\n+                                \"description\": \"The Record Reader to use for parsing the incoming FlowFile into Records.\",\n+                                \"displayName\": \"Record Reader\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"proxy-configuration-service\",\n+                                \"name\": \"record-reader\",\n                                 \"required\": false,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n                                     \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.proxy.ProxyConfigurationService\",\n+                                    \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             },\n                             \"record-writer\": {\n-                                \"description\": \"Specifies the Record Writer to use for creating the listing. If not specified, one FlowFile will be created for each entity that is listed. If the Record Writer is specified, all entities will be written to a single FlowFile instead of adding attributes to individual FlowFiles.\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"propertyDisplayName\": \"Record Reader\",\n+                                        \"propertyName\": \"record-reader\"\n+                                    }\n+                                ],\n+                                \"description\": \"The Record Writer to use for serializing Records before publishing them as an JMS Message.\",\n                                 \"displayName\": \"Record Writer\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n                                 \"name\": \"record-writer\",\n-                                \"required\": false,\n+                                \"required\": true,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n                                     \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n                                     \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n                                     \"version\": \"1.27.0\"\n                                 }\n-                            },\n-                            \"target-system-timestamp-precision\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"Automatically detect time unit deterministically based on candidate entries timestamp. Please note that this option may take longer to list entities unnecessarily, if none of entries has a precise precision timestamp. E.g. even if a target system supports millis, if all entries only have timestamps without millis, such as '2017-06-16 09:06:34.000', then its precision is determined as 'seconds'.\",\n-                                        \"displayName\": \"Auto Detect\",\n-                                        \"value\": \"auto-detect\"\n-                                    },\n-                                    {\n-                                        \"description\": \"This option provides the minimum latency for an entry from being available to being listed if target system supports millis, if not, use other options.\",\n-                                        \"displayName\": \"Milliseconds\",\n-                                        \"value\": \"millis\"\n-                                    },\n-                                    {\n-                                        \"description\": \"For a target system that does not have millis precision, but has in seconds.\",\n-                                        \"displayName\": \"Seconds\",\n-                                        \"value\": \"seconds\"\n-                                    },\n-                                    {\n-                                        \"description\": \"For a target system that only supports precision in minutes.\",\n-                                        \"displayName\": \"Minutes\",\n-                                        \"value\": \"minutes\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"auto-detect\",\n-                                \"description\": \"Specify timestamp precision at the target system. Since this processor uses timestamp of entities to decide which should be listed, it is crucial to use the right timestamp precision.\",\n-                                \"displayName\": \"Target System Timestamp Precision\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"target-system-timestamp-precision\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n                             }\n                         },\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.processors.standard.FetchSFTP\",\n-                            \"org.apache.nifi.processors.standard.GetSFTP\",\n-                            \"org.apache.nifi.processors.standard.PutSFTP\"\n-                        ],\n-                        \"sideEffectFree\": false,\n-                        \"stateful\": {\n-                            \"description\": \"After performing a listing of files, the timestamp of the newest file is stored. This allows the Processor to list only files that have been added or modified after this date the next time that the Processor is run. State is stored across the cluster so that this Processor can be run on Primary Node only and if a new Primary Node is selected, the new node will not duplicate the data that was listed by the previous Primary Node.\",\n-                            \"scopes\": [\n-                                \"CLUSTER\"\n-                            ]\n-                        },\n-                        \"supportedRelationships\": [\n-                            {\n-                                \"description\": \"All FlowFiles that are received are routed to success\",\n-                                \"name\": \"success\"\n-                            }\n-                        ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": false,\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": false,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"files\",\n-                            \"ingest\",\n-                            \"input\",\n-                            \"list\",\n-                            \"remote\",\n-                            \"sftp\",\n-                            \"source\"\n-                        ],\n-                        \"triggerSerially\": true,\n-                        \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.standard.ListSFTP\",\n-                        \"typeDescription\": \"Performs a listing of the files residing on an SFTP server. For each file that is found on the remote server, a new FlowFile will be created with the filename attribute set to the name of the file on the remote server. This can then be used in conjunction with FetchSFTP in order to fetch those files.\",\n-                        \"version\": \"1.27.0\",\n-                        \"writesAttributes\": [\n+                        \"readsAttributes\": [\n                             {\n-                                \"description\": \"The hostname of the SFTP Server\",\n-                                \"name\": \"sftp.remote.host\"\n+                                \"description\": \"This attribute becomes the JMSDeliveryMode message header. Must be an integer.\",\n+                                \"name\": \"jms_deliveryMode\"\n                             },\n                             {\n-                                \"description\": \"The port that was connected to on the SFTP Server\",\n-                                \"name\": \"sftp.remote.port\"\n+                                \"description\": \"This attribute becomes the JMSExpiration message header. Must be an integer.\",\n+                                \"name\": \"jms_expiration\"\n                             },\n                             {\n-                                \"description\": \"The username of the user that performed the SFTP Listing\",\n-                                \"name\": \"sftp.listing.user\"\n+                                \"description\": \"This attribute becomes the JMSPriority message header. Must be an integer.\",\n+                                \"name\": \"jms_priority\"\n                             },\n                             {\n-                                \"description\": \"The numeric owner id of the source file\",\n-                                \"name\": \"file.owner\"\n+                                \"description\": \"This attribute becomes the JMSRedelivered message header.\",\n+                                \"name\": \"jms_redelivered\"\n                             },\n                             {\n-                                \"description\": \"The numeric group id of the source file\",\n-                                \"name\": \"file.group\"\n+                                \"description\": \"This attribute becomes the JMSTimestamp message header. Must be a long.\",\n+                                \"name\": \"jms_timestamp\"\n                             },\n                             {\n-                                \"description\": \"The read/write/execute permissions of the source file\",\n-                                \"name\": \"file.permissions\"\n+                                \"description\": \"This attribute becomes the JMSCorrelationID message header.\",\n+                                \"name\": \"jms_correlationId\"\n                             },\n                             {\n-                                \"description\": \"The number of bytes in the source file\",\n-                                \"name\": \"file.size\"\n+                                \"description\": \"This attribute becomes the JMSType message header. Must be an integer.\",\n+                                \"name\": \"jms_type\"\n                             },\n                             {\n-                                \"description\": \"The timestamp of when the file in the filesystem waslast modified as 'yyyy-MM-dd'T'HH:mm:ssZ'\",\n-                                \"name\": \"file.lastModifiedTime\"\n+                                \"description\": \"This attribute becomes the JMSReplyTo message header. Must be an integer.\",\n+                                \"name\": \"jms_replyTo\"\n                             },\n                             {\n-                                \"description\": \"The name of the file on the SFTP Server\",\n-                                \"name\": \"filename\"\n+                                \"description\": \"This attribute becomes the JMSDestination message header. Must be an integer.\",\n+                                \"name\": \"jms_destination\"\n                             },\n                             {\n-                                \"description\": \"The fully qualified name of the directory on the SFTP Server from which the file was pulled\",\n-                                \"name\": \"path\"\n+                                \"description\": \"All other attributes that do not start with jms_ are added as message properties.\",\n+                                \"name\": \"other attributes\"\n                             },\n                             {\n-                                \"description\": \"The MIME Type that is provided by the configured Record Writer\",\n-                                \"name\": \"mime.type\"\n-                            }\n-                        ]\n-                    },\n-                    {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-standard-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"e0c4461\"\n-                        },\n-                        \"defaultBulletinLevel\": \"WARN\",\n-                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": 1,\n-                            \"TIMER_DRIVEN\": 1\n-                        },\n-                        \"defaultPenaltyDuration\": \"30 sec\",\n-                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"0 sec\"\n-                        },\n-                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n-                        \"defaultYieldDuration\": \"1 sec\",\n-                        \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n-                        \"primaryNodeOnly\": false,\n-                        \"propertyDescriptors\": {\n-                            \"bind-address\": {\n-                                \"description\": \"The address the FTP server should be bound to. If not set (or set to 0.0.0.0), the server binds to all available addresses (i.e. all network interfaces of the host machine).\",\n-                                \"displayName\": \"Bind Address\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"bind-address\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"listening-port\": {\n-                                \"defaultValue\": \"2221\",\n-                                \"description\": \"The Port to listen on for incoming connections. On Linux, root privileges are required to use port numbers below 1024.\",\n-                                \"displayName\": \"Listening Port\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"listening-port\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"password\": {\n-                                \"description\": \"If the Username is set, then a password must also be specified. The password provided by the client trying to log in to the FTP server will be checked against this password.\",\n-                                \"displayName\": \"Password\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"password\",\n-                                \"required\": false,\n-                                \"sensitive\": true\n-                            },\n-                            \"ssl-context-service\": {\n-                                \"description\": \"Specifies the SSL Context Service that can be used to create secure connections. If an SSL Context Service is selected, then a keystore file must also be specified in the SSL Context Service. Without a keystore file, the processor cannot be started successfully.Specifying a truststore file is optional. If a truststore file is specified, client authentication is required (the client needs to send a certificate to the server).Regardless of the selected TLS protocol, the highest available protocol is used for the connection. For example if NiFi is running on Java 11 and TLSv1.2 is selected in the controller service as the preferred TLS Protocol, TLSv1.3 will be used (regardless of TLSv1.2 being selected) because Java 11 supports TLSv1.3.\",\n-                                \"displayName\": \"SSL Context Service\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"ssl-context-service\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            },\n-                            \"username\": {\n-                                \"description\": \"The name of the user that is allowed to log in to the FTP server. If a username is provided, a password must also be provided. If no username is specified, anonymous connections will be permitted.\",\n-                                \"displayName\": \"Username\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"username\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n+                                \"description\": \"When an attribute will be added as a message property, a second attribute of the same name but with an extra `.type` at the end will cause the message property to be sent using that strong type. For example, attribute `delay` with value `12000` and another attribute `delay.type` with value `integer` will cause a JMS message property `delay` to be sent as an Integer rather than a String. Supported types are boolean, byte, short, integer, long, float, double, and string (which is the default).\",\n+                                \"name\": \"other attributes .type\"\n                             }\n-                        },\n+                        ],\n+                        \"restricted\": true,\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.jms.cf.JMSConnectionFactoryProvider\",\n+                            \"org.apache.nifi.jms.processors.ConsumeJMS\"\n+                        ],\n                         \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"Relationship for successfully received files.\",\n+                                \"description\": \"All FlowFiles that are sent to the JMS destination are routed to this relationship\",\n                                 \"name\": \"success\"\n+                            },\n+                            {\n+                                \"description\": \"All FlowFiles that cannot be sent to JMS destination are routed to this relationship\",\n+                                \"name\": \"failure\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n                         \"supportsBatching\": false,\n-                        \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicProperties\": true,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n+                        \"systemResourceConsiderations\": [\n+                            {\n+                                \"description\": \"An instance of this component can cause high usage of this system resource.  Multiple instances or high concurrency settings may result a degradation of performance.\",\n+                                \"resource\": \"MEMORY\"\n+                            }\n+                        ],\n                         \"tags\": [\n-                            \"FTP\",\n-                            \"FTPS\",\n-                            \"ingest\",\n-                            \"listen\"\n+                            \"jms\",\n+                            \"message\",\n+                            \"publish\",\n+                            \"put\",\n+                            \"send\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.standard.ListenFTP\",\n-                        \"typeDescription\": \"Starts an FTP server that listens on the specified port and transforms incoming files into FlowFiles. The URI of the service will be ftp://{hostname}:{port}. The default port is 2221.\",\n-                        \"version\": \"1.27.0\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"The name of the file received via the FTP/FTPS connection.\",\n-                                \"name\": \"filename\"\n-                            },\n-                            {\n-                                \"description\": \"The path pointing to the file's target directory. E.g.: file.txt is uploaded to /Folder1/SubFolder, then the value of the path attribute will be \\\"/Folder1/SubFolder/\\\" (note that it ends with a separator character).\",\n-                                \"name\": \"path\"\n-                            }\n-                        ]\n-                    },\n+                        \"type\": \"org.apache.nifi.jms.processors.PublishJMS\",\n+                        \"typeDescription\": \"Creates a JMS Message from the contents of a FlowFile and sends it to a JMS Destination (queue or topic) as JMS BytesMessage or TextMessage. FlowFile attributes will be added as JMS headers and/or properties to the outgoing JMS message.\",\n+                        \"version\": \"1.27.0\"\n+                    }\n+                ],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"1.27.0\"\n+        },\n+        {\n+            \"artifact\": \"nifi-snmp-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [],\n+                \"processors\": [\n                     {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-standard-nar\",\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-snmp-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -110945,306 +110490,421 @@\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n+                        \"inputRequirement\": \"INPUT_ALLOWED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Authorized DN Pattern\": {\n-                                \"defaultValue\": \".*\",\n-                                \"description\": \"A Regular Expression to apply against the Subject's Distinguished Name of incoming connections. If the Pattern does not match the Subject DN, the the processor will respond with a status of HTTP 403 Forbidden.\",\n-                                \"displayName\": \"Authorized Subject DN Pattern\",\n+                            \"snmp-authentication-passphrase\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"authPriv\",\n+                                            \"authNoPriv\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"SNMP Security Level\",\n+                                        \"propertyName\": \"snmp-security-level\"\n+                                    }\n+                                ],\n+                                \"description\": \"Passphrase used for SNMP authentication protocol.\",\n+                                \"displayName\": \"SNMP Authentication Passphrase\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Authorized DN Pattern\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Base Path\": {\n-                                \"defaultValue\": \"contentListener\",\n-                                \"description\": \"Base path for incoming connections\",\n-                                \"displayName\": \"Base Path\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Base Path\",\n+                                \"name\": \"snmp-authentication-passphrase\",\n                                 \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"HTTP Headers to receive as Attributes (Regex)\": {\n-                                \"description\": \"Specifies the Regular Expression that determines the names of HTTP Headers that should be passed along as FlowFile attributes\",\n-                                \"displayName\": \"HTTP Headers to receive as Attributes (Regex)\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"HTTP Headers to receive as Attributes (Regex)\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n+                                \"sensitive\": true\n                             },\n-                            \"HTTP Protocols\": {\n+                            \"snmp-authentication-protocol\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"HTTP/1.1\",\n-                                        \"displayName\": \"http/1.1\",\n-                                        \"value\": \"HTTP_1_1\"\n+                                        \"description\": \"Provides authentication based on the HMAC-MD5 algorithm.\",\n+                                        \"displayName\": \"MD5\",\n+                                        \"value\": \"MD5\"\n                                     },\n                                     {\n-                                        \"description\": \"HTTP/2 and HTTP/1.1 negotiated based on requested protocols\",\n-                                        \"displayName\": \"h2 http/1.1\",\n-                                        \"value\": \"H2_HTTP_1_1\"\n+                                        \"description\": \"Provides authentication based on the HMAC-SHA algorithm.\",\n+                                        \"displayName\": \"SHA\",\n+                                        \"value\": \"SHA\"\n                                     },\n                                     {\n-                                        \"description\": \"HTTP/2\",\n-                                        \"displayName\": \"h2\",\n-                                        \"value\": \"H2\"\n+                                        \"description\": \"Provides authentication based on the HMAC-SHA-2 algorithm.\",\n+                                        \"displayName\": \"SHA224\",\n+                                        \"value\": \"HMAC128SHA224\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Provides authentication based on the HMAC-SHA-2 algorithm.\",\n+                                        \"displayName\": \"SHA256\",\n+                                        \"value\": \"HMAC192SHA256\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Provides authentication based on the HMAC-SHA-2 algorithm.\",\n+                                        \"displayName\": \"SHA384\",\n+                                        \"value\": \"HMAC256SHA384\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Provides authentication based on the HMAC-SHA-2 algorithm.\",\n+                                        \"displayName\": \"SHA512\",\n+                                        \"value\": \"HMAC384SHA512\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"HTTP_1_1\",\n                                 \"dependencies\": [\n                                     {\n-                                        \"propertyDisplayName\": \"SSL Context Service\",\n-                                        \"propertyName\": \"SSL Context Service\"\n+                                        \"dependentValues\": [\n+                                            \"authPriv\",\n+                                            \"authNoPriv\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"SNMP Security Level\",\n+                                        \"propertyName\": \"snmp-security-level\"\n                                     }\n                                 ],\n-                                \"description\": \"HTTP Protocols supported for Application Layer Protocol Negotiation with TLS\",\n-                                \"displayName\": \"HTTP Protocols\",\n+                                \"description\": \"Hash based authentication protocol for secure authentication.\",\n+                                \"displayName\": \"SNMP Authentication Protocol\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"HTTP Protocols\",\n+                                \"name\": \"snmp-authentication-protocol\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Listening Port\": {\n-                                \"description\": \"The Port to listen on for incoming connections\",\n-                                \"displayName\": \"Listening Port\",\n+                            \"snmp-community\": {\n+                                \"defaultValue\": \"public\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"SNMPv1\",\n+                                            \"SNMPv2c\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"SNMP Version\",\n+                                        \"propertyName\": \"snmp-version\"\n+                                    }\n+                                ],\n+                                \"description\": \"SNMPv1 and SNMPv2 use communities to establish trust between managers and agents. Most agents support three community names, one each for read-only, read-write and trap. These three community strings control different types of activities. The read-only community applies to get requests. The read-write community string applies to set requests. The trap community string applies to receipt of traps.\",\n+                                \"displayName\": \"SNMP Community\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Listening Port\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"snmp-community\",\n+                                \"required\": true,\n+                                \"sensitive\": true\n+                            },\n+                            \"snmp-hostname\": {\n+                                \"defaultValue\": \"localhost\",\n+                                \"description\": \"Hostname or network address of the SNMP Agent.\",\n+                                \"displayName\": \"SNMP Agent Hostname\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"snmp-hostname\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Max Data to Receive per Second\": {\n-                                \"description\": \"The maximum amount of data to receive per second; this allows the bandwidth to be throttled to a specified data rate; if not specified, the data rate is not throttled\",\n-                                \"displayName\": \"Max Data to Receive per Second\",\n+                            \"snmp-oid\": {\n+                                \"description\": \"Each OID (object identifier) identifies a variable that can be read or set via SNMP. This value is not taken into account for an input flowfile and will be omitted. Can be set to emptystring when the OIDs are provided through flowfile.\",\n+                                \"displayName\": \"OID\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Max Data to Receive per Second\",\n+                                \"name\": \"snmp-oid\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Max Unconfirmed Flowfile Time\": {\n-                                \"defaultValue\": \"60 secs\",\n-                                \"description\": \"The maximum amount of time to wait for a FlowFile to be confirmed before it is removed from the cache\",\n-                                \"displayName\": \"Max Unconfirmed Flowfile Time\",\n+                            \"snmp-port\": {\n+                                \"defaultValue\": \"161\",\n+                                \"description\": \"Port of the SNMP Agent.\",\n+                                \"displayName\": \"SNMP Agent Port\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Max Unconfirmed Flowfile Time\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"snmp-port\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Return Code\": {\n-                                \"defaultValue\": \"200\",\n-                                \"description\": \"The HTTP return code returned after every HTTP call\",\n-                                \"displayName\": \"Return Code\",\n+                            \"snmp-private-protocol\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"Symmetric-key algorithm for the encryption of digital data. DES has been considered insecurebecause of the feasilibity of brute-force attacks. We recommend using the AES encryption protocol.\",\n+                                        \"displayName\": \"DES\",\n+                                        \"value\": \"DES\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Symmetric-key block cipher, which applies the DES cipher algorithm three times to each data block. 3DES has been considered insecure has been deprecated by NIST in 2017. We recommend using the AES encryption protocol.\",\n+                                        \"displayName\": \"3DES\",\n+                                        \"value\": \"3DES\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AES is a symmetric algorithm which uses the same 128, 192, or 256 bit key for both encryption and decryption (the security of an AES system increases exponentially with key length).\",\n+                                        \"displayName\": \"AES128\",\n+                                        \"value\": \"AES128\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AES is a symmetric algorithm which uses the same 128, 192, or 256 bit key for both encryption and decryption (the security of an AES system increases exponentially with key length).\",\n+                                        \"displayName\": \"AES192\",\n+                                        \"value\": \"AES192\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AES is a symmetric algorithm which uses the same 128, 192, or 256 bit key for both encryption and decryption (the security of an AES system increases exponentially with key length).\",\n+                                        \"displayName\": \"AES256\",\n+                                        \"value\": \"AES256\"\n+                                    }\n+                                ],\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"authPriv\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"SNMP Security Level\",\n+                                        \"propertyName\": \"snmp-security-level\"\n+                                    }\n+                                ],\n+                                \"description\": \"Privacy allows for encryption of SNMP v3 messages to ensure confidentiality of data.\",\n+                                \"displayName\": \"SNMP Privacy Protocol\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Return Code\",\n-                                \"required\": false,\n+                                \"name\": \"snmp-private-protocol\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"SSL Context Service\": {\n-                                \"description\": \"SSL Context Service enables support for HTTPS\",\n-                                \"displayName\": \"SSL Context Service\",\n+                            \"snmp-private-protocol-passphrase\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"authPriv\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"SNMP Security Level\",\n+                                        \"propertyName\": \"snmp-security-level\"\n+                                    }\n+                                ],\n+                                \"description\": \"Passphrase used for SNMP privacy protocol.\",\n+                                \"displayName\": \"SNMP Privacy Passphrase\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"SSL Context Service\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.ssl.RestrictedSSLContextService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n+                                \"name\": \"snmp-private-protocol-passphrase\",\n+                                \"required\": true,\n+                                \"sensitive\": true\n                             },\n-                            \"authorized-issuer-dn-pattern\": {\n-                                \"defaultValue\": \".*\",\n-                                \"description\": \"A Regular Expression to apply against the Issuer's Distinguished Name of incoming connections. If the Pattern does not match the Issuer DN, the processor will respond with a status of HTTP 403 Forbidden.\",\n-                                \"displayName\": \"Authorized Issuer DN Pattern\",\n+                            \"snmp-retries\": {\n+                                \"defaultValue\": \"0\",\n+                                \"description\": \"Set the number of retries when requesting the SNMP Agent.\",\n+                                \"displayName\": \"Number of Retries\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"authorized-issuer-dn-pattern\",\n+                                \"name\": \"snmp-retries\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"client-authentication\": {\n+                            \"snmp-security-level\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Inferred based on SSL Context Service properties. The presence of Trust Store properties implies REQUIRED, otherwise NONE is configured.\",\n-                                        \"displayName\": \"AUTO\",\n-                                        \"value\": \"AUTO\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Requests the client certificate on handshake and validates if present but does not require it\",\n-                                        \"displayName\": \"WANT\",\n-                                        \"value\": \"WANT\"\n+                                        \"description\": \"Communication without authentication and privacy.\",\n+                                        \"displayName\": \"noAuthNoPriv\",\n+                                        \"value\": \"noAuthNoPriv\"\n                                     },\n                                     {\n-                                        \"description\": \"Requests the client certificate on handshake and rejects the connection if it is not present and valid\",\n-                                        \"displayName\": \"REQUIRED\",\n-                                        \"value\": \"REQUIRED\"\n+                                        \"description\": \"Communication with authentication and without privacy.\",\n+                                        \"displayName\": \"authNoPriv\",\n+                                        \"value\": \"authNoPriv\"\n                                     },\n                                     {\n-                                        \"description\": \"Does not request the client certificate on handshake\",\n-                                        \"displayName\": \"NONE\",\n-                                        \"value\": \"NONE\"\n+                                        \"description\": \"Communication with authentication and privacy.\",\n+                                        \"displayName\": \"authPriv\",\n+                                        \"value\": \"authPriv\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"AUTO\",\n+                                \"defaultValue\": \"noAuthNoPriv\",\n                                 \"dependencies\": [\n                                     {\n-                                        \"propertyDisplayName\": \"SSL Context Service\",\n-                                        \"propertyName\": \"SSL Context Service\"\n+                                        \"dependentValues\": [\n+                                            \"SNMPv3\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"SNMP Version\",\n+                                        \"propertyName\": \"snmp-version\"\n                                     }\n                                 ],\n-                                \"description\": \"Client Authentication policy for TLS connections. Required when SSL Context Service configured.\",\n-                                \"displayName\": \"Client Authentication\",\n+                                \"description\": \"SNMP version 3 provides extra security with User Based Security Model (USM). The three levels of security is 1. Communication without authentication and encryption (NoAuthNoPriv). 2. Communication with authentication and without encryption (AuthNoPriv). 3. Communication with authentication and encryption (AuthPriv).\",\n+                                \"displayName\": \"SNMP Security Level\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"client-authentication\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"health-check-port\": {\n-                                \"description\": \"The port to listen on for incoming health check requests. If set, it must be different from the Listening Port. Configure this port if the processor is set to use two-way SSL and a load balancer that does not support client authentication for health check requests is used. Only /<base_path>/healthcheck service is available via this port and only GET and HEAD requests are supported. If the processor is set not to use SSL, SSL will not be used on this port, either. If the processor is set to use one-way SSL, one-way SSL will be used on this port. If the processor is set to use two-way SSL, one-way SSL will be used on this port (client authentication not required).\",\n-                                \"displayName\": \"Listening Port for Health Check Requests\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"health-check-port\",\n-                                \"required\": false,\n+                                \"name\": \"snmp-security-level\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"max-thread-pool-size\": {\n-                                \"defaultValue\": \"200\",\n-                                \"description\": \"The maximum number of threads to be used by the embedded Jetty server. The value can be set between 8 and 1000. The value of this property affects the performance of the flows and the operating system, therefore the default value should only be changed in justified cases. A value that is less than the default value may be suitable if only a small number of HTTP clients connect to the server. A greater value may be suitable if a large number of HTTP clients are expected to make requests to the server simultaneously.\",\n-                                \"displayName\": \"Maximum Thread Pool Size\",\n+                            \"snmp-security-name\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"SNMPv3\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"SNMP Version\",\n+                                        \"propertyName\": \"snmp-version\"\n+                                    }\n+                                ],\n+                                \"description\": \"User name used for SNMP v3 Authentication.\",\n+                                \"displayName\": \"SNMP Security Name\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"max-thread-pool-size\",\n+                                \"name\": \"snmp-security-name\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"multipart-read-buffer-size\": {\n-                                \"defaultValue\": \"512 KB\",\n-                                \"description\": \"The threshold size, at which the contents of an incoming file would be written to disk. Only applies for requests with Content-Type: multipart/form-data. It is used to prevent denial of service type of attacks, to prevent filling up the heap or disk space.\",\n-                                \"displayName\": \"Multipart Read Buffer Size\",\n+                            \"snmp-strategy\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"A manager-to-agent request to retrieve the value of a variable. A response with the current value returned.\",\n+                                        \"displayName\": \"GET\",\n+                                        \"value\": \"GET\"\n+                                    },\n+                                    {\n+                                        \"description\": \"A manager-to-agent request to retrieve the value of multiple variables. Snmp WALK also traverses all subnodes under the specified OID.\",\n+                                        \"displayName\": \"WALK\",\n+                                        \"value\": \"WALK\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"GET\",\n+                                \"description\": \"SNMP strategy to use (SNMP Get or SNMP Walk)\",\n+                                \"displayName\": \"SNMP Strategy\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"multipart-read-buffer-size\",\n+                                \"name\": \"snmp-strategy\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"multipart-request-max-size\": {\n-                                \"defaultValue\": \"1 MB\",\n-                                \"description\": \"The max size of the request. Only applies for requests with Content-Type: multipart/form-data, and is used to prevent denial of service type of attacks, to prevent filling up the heap or disk space\",\n-                                \"displayName\": \"Multipart Request Max Size\",\n+                            \"snmp-textual-oid\": {\n+                                \"description\": \"The textual form of the numeric OID to request. This property is user defined, not processed and appended to the outgoing flowfile.\",\n+                                \"displayName\": \"Textual OID\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"multipart-request-max-size\",\n-                                \"required\": true,\n+                                \"name\": \"snmp-textual-oid\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"record-reader\": {\n-                                \"description\": \"The Record Reader to use parsing the incoming FlowFile into Records\",\n-                                \"displayName\": \"Record Reader\",\n+                            \"snmp-timeout\": {\n+                                \"defaultValue\": \"5000\",\n+                                \"description\": \"Set the timeout in ms when requesting the SNMP Agent.\",\n+                                \"displayName\": \"Timeout (ms)\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"record-reader\",\n+                                \"name\": \"snmp-timeout\",\n                                 \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n+                                \"sensitive\": false\n                             },\n-                            \"record-writer\": {\n-                                \"dependencies\": [\n+                            \"snmp-version\": {\n+                                \"allowableValues\": [\n                                     {\n-                                        \"propertyDisplayName\": \"Record Reader\",\n-                                        \"propertyName\": \"record-reader\"\n+                                        \"description\": \"SNMP version 1\",\n+                                        \"displayName\": \"v1\",\n+                                        \"value\": \"SNMPv1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"SNMP version 2c\",\n+                                        \"displayName\": \"v2c\",\n+                                        \"value\": \"SNMPv2c\"\n+                                    },\n+                                    {\n+                                        \"description\": \"SNMP version 3 with improved security\",\n+                                        \"displayName\": \"v3\",\n+                                        \"value\": \"SNMPv3\"\n                                     }\n                                 ],\n-                                \"description\": \"The Record Writer to use for serializing Records after they have been transformed\",\n-                                \"displayName\": \"Record Writer\",\n+                                \"defaultValue\": \"SNMPv1\",\n+                                \"description\": \"Three significant versions of SNMP have been developed and deployed. SNMPv1 is the original version of the protocol. More recent versions, SNMPv2c and SNMPv3, feature improvements in performance, flexibility and security.\",\n+                                \"displayName\": \"SNMP Version\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"record-writer\",\n+                                \"name\": \"snmp-version\",\n                                 \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n+                                \"sensitive\": false\n                             }\n                         },\n                         \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"Relationship for successfully received FlowFiles\",\n+                                \"description\": \"All FlowFiles that are received from the SNMP agent are routed to this relationship.\",\n                                 \"name\": \"success\"\n+                            },\n+                            {\n+                                \"description\": \"All FlowFiles that cannot received from the SNMP agent are routed to this relationship.\",\n+                                \"name\": \"failure\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n                         \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"http\",\n-                            \"https\",\n-                            \"ingest\",\n-                            \"listen\",\n-                            \"rest\"\n+                            \"get\",\n+                            \"oid\",\n+                            \"snmp\",\n+                            \"walk\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.standard.ListenHTTP\",\n-                        \"typeDescription\": \"Starts an HTTP Server and listens on a given base path to transform incoming requests into FlowFiles. The default URI of the Service will be http://{hostname}:{port}/contentListener. Only HEAD and POST requests are supported. GET, PUT, DELETE, OPTIONS and TRACE will result in an error and the HTTP response status code 405; CONNECT will also result in an error and the HTTP response status code 400. GET is supported on <service_URI>/healthcheck. If the service is available, it returns \\\"200 OK\\\" with the content \\\"OK\\\". The health check functionality can be configured to be accessible via a different port. For details see the documentation of the \\\"Listening Port for health check requests\\\" property.A Record Reader and Record Writer property can be enabled on the processor to process incoming requests as records. Record processing is not allowed for multipart requests and request in FlowFileV3 format (minifi).\",\n-                        \"version\": \"1.27.0\"\n+                        \"type\": \"org.apache.nifi.snmp.processors.GetSNMP\",\n+                        \"typeDescription\": \"Retrieves information from SNMP Agent with SNMP Get request and outputs a FlowFile with information in attributes and without any content\",\n+                        \"version\": \"1.27.0\",\n+                        \"writesAttributes\": [\n+                            {\n+                                \"description\": \"Response variable binding: OID (e.g. 1.3.6.1.4.1.343) and its value.\",\n+                                \"name\": \"snmp$<OID>\"\n+                            },\n+                            {\n+                                \"description\": \"Denotes the variable binding in which the error occured.\",\n+                                \"name\": \"snmp$errorIndex\"\n+                            },\n+                            {\n+                                \"description\": \"The snmp4j error status of the PDU.\",\n+                                \"name\": \"snmp$errorStatus\"\n+                            },\n+                            {\n+                                \"description\": \"The description of error status.\",\n+                                \"name\": \"snmp$errorStatusText\"\n+                            },\n+                            {\n+                                \"description\": \"The number of non repeater variable bindings in a GETBULK PDU (currently not supported).\",\n+                                \"name\": \"snmp$nonRepeaters\"\n+                            },\n+                            {\n+                                \"description\": \"The request ID associated with the PDU.\",\n+                                \"name\": \"snmp$requestID\"\n+                            },\n+                            {\n+                                \"description\": \"The snmp4j numeric representation of the type of the PDU.\",\n+                                \"name\": \"snmp$type\"\n+                            },\n+                            {\n+                                \"description\": \"The name of the PDU type.\",\n+                                \"name\": \"snmp$typeString\"\n+                            },\n+                            {\n+                                \"description\": \"This attribute will exist if and only if the strategy is GET and will be equal to the value given in Textual Oid property.\",\n+                                \"name\": \"snmp$textualOid\"\n+                            }\n+                        ]\n                     },\n                     {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-standard-nar\",\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-snmp-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -111256,213 +110916,279 @@\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_FORBIDDEN\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Character Set\": {\n-                                \"defaultValue\": \"UTF-8\",\n-                                \"description\": \"Specifies the character set of the received data.\",\n-                                \"displayName\": \"Character Set\",\n+                            \"snmp-community\": {\n+                                \"defaultValue\": \"public\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"SNMPv1\",\n+                                            \"SNMPv2c\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"SNMP Version\",\n+                                        \"propertyName\": \"snmp-version\"\n+                                    }\n+                                ],\n+                                \"description\": \"SNMPv1 and SNMPv2 use communities to establish trust between managers and agents. Most agents support three community names, one each for read-only, read-write and trap. These three community strings control different types of activities. The read-only community applies to get requests. The read-write community string applies to set requests. The trap community string applies to receipt of traps.\",\n+                                \"displayName\": \"SNMP Community\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Character Set\",\n+                                \"name\": \"snmp-community\",\n+                                \"required\": true,\n+                                \"sensitive\": true\n+                            },\n+                            \"snmp-manager-port\": {\n+                                \"description\": \"The port where the SNMP Manager listens to the incoming traps.\",\n+                                \"displayName\": \"SNMP Manager Port\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"snmp-manager-port\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Client Auth\": {\n+                            \"snmp-security-level\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"WANT\",\n-                                        \"value\": \"WANT\"\n+                                        \"description\": \"Communication without authentication and privacy.\",\n+                                        \"displayName\": \"noAuthNoPriv\",\n+                                        \"value\": \"noAuthNoPriv\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"REQUIRED\",\n-                                        \"value\": \"REQUIRED\"\n+                                        \"description\": \"Communication with authentication and without privacy.\",\n+                                        \"displayName\": \"authNoPriv\",\n+                                        \"value\": \"authNoPriv\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"NONE\",\n-                                        \"value\": \"NONE\"\n+                                        \"description\": \"Communication with authentication and privacy.\",\n+                                        \"displayName\": \"authPriv\",\n+                                        \"value\": \"authPriv\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"REQUIRED\",\n-                                \"description\": \"The client authentication policy to use for the SSL Context. Only used if an SSL Context Service is provided.\",\n-                                \"displayName\": \"Client Auth\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Client Auth\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Local Network Interface\": {\n-                                \"description\": \"The name of a local network interface to be used to restrict listening to a specific LAN.\",\n-                                \"displayName\": \"Local Network Interface\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Local Network Interface\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Max Batch Size\": {\n-                                \"defaultValue\": \"1\",\n-                                \"description\": \"The maximum number of messages to add to a single FlowFile. If multiple messages are available, they will be concatenated along with the <Message Delimiter> up to this configured maximum number of messages\",\n-                                \"displayName\": \"Max Batch Size\",\n+                                \"defaultValue\": \"noAuthNoPriv\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"SNMPv3\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"SNMP Version\",\n+                                        \"propertyName\": \"snmp-version\"\n+                                    }\n+                                ],\n+                                \"description\": \"SNMP version 3 provides extra security with User Based Security Model (USM). The three levels of security is 1. Communication without authentication and encryption (NoAuthNoPriv). 2. Communication with authentication and without encryption (AuthNoPriv). 3. Communication with authentication and encryption (AuthPriv).\",\n+                                \"displayName\": \"SNMP Security Level\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Max Batch Size\",\n+                                \"name\": \"snmp-security-level\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Max Number of TCP Connections\": {\n-                                \"defaultValue\": \"2\",\n-                                \"description\": \"The maximum number of worker threads available for servicing TCP connections.\",\n-                                \"displayName\": \"Max Number of Worker Threads\",\n+                            \"snmp-usm-security-names\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"usm-security-names\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"USM Users Source\",\n+                                        \"propertyName\": \"snmp-usm-users-source\"\n+                                    },\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"noAuthNoPriv\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"SNMP Security Level\",\n+                                        \"propertyName\": \"snmp-security-level\"\n+                                    },\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"SNMPv3\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"SNMP Version\",\n+                                        \"propertyName\": \"snmp-version\"\n+                                    }\n+                                ],\n+                                \"description\": \"Security names listed separated by commas in SNMPv3. Check Usage for more details.\",\n+                                \"displayName\": \"SNMP Users Security Names\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Max Number of TCP Connections\",\n-                                \"required\": true,\n+                                \"name\": \"snmp-usm-security-names\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Max Size of Message Queue\": {\n-                                \"defaultValue\": \"10000\",\n-                                \"description\": \"The maximum size of the internal queue used to buffer messages being transferred from the underlying channel to the processor. Setting this value higher allows more messages to be buffered in memory during surges of incoming messages, but increases the total memory used by the processor during these surges.\",\n-                                \"displayName\": \"Max Size of Message Queue\",\n+                            \"snmp-usm-users-file-path\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"SNMPv3\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"SNMP Version\",\n+                                        \"propertyName\": \"snmp-version\"\n+                                    },\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"usm-json-file-path\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"USM Users Source\",\n+                                        \"propertyName\": \"snmp-usm-users-source\"\n+                                    }\n+                                ],\n+                                \"description\": \"The path of the json file containing the user credentials for SNMPv3. Check Usage for more details.\",\n+                                \"displayName\": \"USM Users JSON File Path\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Max Size of Message Queue\",\n-                                \"required\": true,\n+                                \"name\": \"snmp-usm-users-file-path\",\n+                                \"required\": false,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"SINGLE\",\n+                                    \"resourceTypes\": [\n+                                        \"FILE\"\n+                                    ]\n+                                },\n                                 \"sensitive\": false\n                             },\n-                            \"Max Size of Socket Buffer\": {\n-                                \"defaultValue\": \"1 MB\",\n-                                \"description\": \"The maximum size of the socket buffer that should be used. This is a suggestion to the Operating System to indicate how big the socket buffer should be. If this value is set too low, the buffer may fill up before the data can be read, and incoming data will be dropped.\",\n-                                \"displayName\": \"Max Size of Socket Buffer\",\n+                            \"snmp-usm-users-json-content\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"SNMPv3\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"SNMP Version\",\n+                                        \"propertyName\": \"snmp-version\"\n+                                    },\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"usm-json-content\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"USM Users Source\",\n+                                        \"propertyName\": \"snmp-usm-users-source\"\n+                                    }\n+                                ],\n+                                \"description\": \"The JSON containing the user credentials for SNMPv3. Check Usage for more details.\",\n+                                \"displayName\": \"USM Users JSON content\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Max Size of Socket Buffer\",\n-                                \"required\": true,\n+                                \"name\": \"snmp-usm-users-json-content\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Message Delimiter\": {\n-                                \"defaultValue\": \"\\\\n\",\n-                                \"description\": \"Specifies the delimiter to place between messages when multiple messages are bundled together (see <Max Batch Size> property).\",\n-                                \"displayName\": \"Batching Message Delimiter\",\n+                            \"snmp-usm-users-source\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"The JSON containing the USM users\",\n+                                        \"displayName\": \"Json Content\",\n+                                        \"value\": \"usm-json-content\"\n+                                    },\n+                                    {\n+                                        \"description\": \"The path of the JSON file containing the USM users\",\n+                                        \"displayName\": \"Json File Path\",\n+                                        \"value\": \"usm-json-file-path\"\n+                                    },\n+                                    {\n+                                        \"description\": \"In case of noAuthNoPriv security level - the list of security names separated by commas\",\n+                                        \"displayName\": \"Security Names\",\n+                                        \"value\": \"usm-security-names\"\n+                                    }\n+                                ],\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"SNMPv3\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"SNMP Version\",\n+                                        \"propertyName\": \"snmp-version\"\n+                                    }\n+                                ],\n+                                \"description\": \"The ways to provide USM User data\",\n+                                \"displayName\": \"USM Users Source\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Message Delimiter\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Port\": {\n-                                \"description\": \"The port to listen on for communication.\",\n-                                \"displayName\": \"Port\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Port\",\n+                                \"name\": \"snmp-usm-users-source\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Receive Buffer Size\": {\n-                                \"defaultValue\": \"65507 B\",\n-                                \"description\": \"The size of each buffer used to receive messages. Adjust this value appropriately based on the expected size of the incoming messages.\",\n-                                \"displayName\": \"Receive Buffer Size\",\n+                            \"snmp-version\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"SNMP version 1\",\n+                                        \"displayName\": \"v1\",\n+                                        \"value\": \"SNMPv1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"SNMP version 2c\",\n+                                        \"displayName\": \"v2c\",\n+                                        \"value\": \"SNMPv2c\"\n+                                    },\n+                                    {\n+                                        \"description\": \"SNMP version 3 with improved security\",\n+                                        \"displayName\": \"v3\",\n+                                        \"value\": \"SNMPv3\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"SNMPv1\",\n+                                \"description\": \"Three significant versions of SNMP have been developed and deployed. SNMPv1 is the original version of the protocol. More recent versions, SNMPv2c and SNMPv3, feature improvements in performance, flexibility and security.\",\n+                                \"displayName\": \"SNMP Version\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Receive Buffer Size\",\n+                                \"name\": \"snmp-version\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n-                            },\n-                            \"SSL Context Service\": {\n-                                \"description\": \"The Controller Service to use in order to obtain an SSL Context. If this property is set, messages will be received over a secure connection.\",\n-                                \"displayName\": \"SSL Context Service\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"SSL Context Service\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.ssl.RestrictedSSLContextService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n                             }\n                         },\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.processors.standard.ParseSyslog\"\n-                        ],\n                         \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"Messages received successfully will be sent out this relationship.\",\n+                                \"description\": \"All FlowFiles that are received from the SNMP agent are routed to this relationship\",\n                                 \"name\": \"success\"\n+                            },\n+                            {\n+                                \"description\": \"All FlowFiles that cannot received from the SNMP agent are routed to this relationship\",\n+                                \"name\": \"failure\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n                         \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n                             \"listen\",\n-                            \"logs\",\n-                            \"relp\",\n-                            \"tcp\"\n+                            \"snmp\",\n+                            \"trap\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.standard.ListenRELP\",\n-                        \"typeDescription\": \"Listens for RELP messages being sent to a given port over TCP. Each message will be acknowledged after successfully writing the message to a FlowFile. Each FlowFile will contain data portion of one or more RELP frames. In the case where the RELP frames contain syslog messages, the output of this processor can be sent to a ParseSyslog processor for further processing.\",\n+                        \"type\": \"org.apache.nifi.snmp.processors.ListenTrapSNMP\",\n+                        \"typeDescription\": \"Receives information from SNMP Agent and outputs a FlowFile with information in attributes and without any content\",\n                         \"version\": \"1.27.0\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"The command of the RELP frames.\",\n-                                \"name\": \"relp.command\"\n-                            },\n-                            {\n-                                \"description\": \"The sending host of the messages.\",\n-                                \"name\": \"relp.sender\"\n-                            },\n-                            {\n-                                \"description\": \"The sending port the messages were received over.\",\n-                                \"name\": \"relp.port\"\n-                            },\n-                            {\n-                                \"description\": \"The transaction number of the message. Only included if <Batch Size> is 1.\",\n-                                \"name\": \"relp.txnr\"\n-                            },\n-                            {\n-                                \"description\": \"The mime.type of the content which is text/plain\",\n-                                \"name\": \"mime.type\"\n+                                \"description\": \"Attributes retrieved from the SNMP response. It may include: snmp$errorIndex, snmp$errorStatus, snmp$errorStatusText, snmp$nonRepeaters, snmp$requestID, snmp$type, snmp$variableBindings\",\n+                                \"name\": \"snmp$*\"\n                             }\n                         ]\n                     },\n                     {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-standard-nar\",\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-snmp-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -111471,361 +111197,483 @@\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n+                        \"inputRequirement\": \"INPUT_ALLOWED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Character Set\": {\n-                                \"defaultValue\": \"UTF-8\",\n-                                \"description\": \"Specifies the character set of the Syslog messages. Note that Expression language is not evaluated per FlowFile.\",\n-                                \"displayName\": \"Character Set\",\n+                            \"snmp-authentication-passphrase\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"authPriv\",\n+                                            \"authNoPriv\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"SNMP Security Level\",\n+                                        \"propertyName\": \"snmp-security-level\"\n+                                    }\n+                                ],\n+                                \"description\": \"Passphrase used for SNMP authentication protocol.\",\n+                                \"displayName\": \"SNMP Authentication Passphrase\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Character Set\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"snmp-authentication-passphrase\",\n                                 \"required\": true,\n-                                \"sensitive\": false\n+                                \"sensitive\": true\n                             },\n-                            \"Client Auth\": {\n+                            \"snmp-authentication-protocol\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"WANT\",\n-                                        \"value\": \"WANT\"\n+                                        \"description\": \"Provides authentication based on the HMAC-MD5 algorithm.\",\n+                                        \"displayName\": \"MD5\",\n+                                        \"value\": \"MD5\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"REQUIRED\",\n-                                        \"value\": \"REQUIRED\"\n+                                        \"description\": \"Provides authentication based on the HMAC-SHA algorithm.\",\n+                                        \"displayName\": \"SHA\",\n+                                        \"value\": \"SHA\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"NONE\",\n-                                        \"value\": \"NONE\"\n+                                        \"description\": \"Provides authentication based on the HMAC-SHA-2 algorithm.\",\n+                                        \"displayName\": \"SHA224\",\n+                                        \"value\": \"HMAC128SHA224\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Provides authentication based on the HMAC-SHA-2 algorithm.\",\n+                                        \"displayName\": \"SHA256\",\n+                                        \"value\": \"HMAC192SHA256\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Provides authentication based on the HMAC-SHA-2 algorithm.\",\n+                                        \"displayName\": \"SHA384\",\n+                                        \"value\": \"HMAC256SHA384\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Provides authentication based on the HMAC-SHA-2 algorithm.\",\n+                                        \"displayName\": \"SHA512\",\n+                                        \"value\": \"HMAC384SHA512\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"REQUIRED\",\n                                 \"dependencies\": [\n                                     {\n-                                        \"propertyDisplayName\": \"SSL Context Service\",\n-                                        \"propertyName\": \"SSL Context Service\"\n+                                        \"dependentValues\": [\n+                                            \"authPriv\",\n+                                            \"authNoPriv\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"SNMP Security Level\",\n+                                        \"propertyName\": \"snmp-security-level\"\n                                     }\n                                 ],\n-                                \"description\": \"The client authentication policy to use for the SSL Context. Only used if an SSL Context Service is provided.\",\n-                                \"displayName\": \"Client Auth\",\n+                                \"description\": \"Hash based authentication protocol for secure authentication.\",\n+                                \"displayName\": \"SNMP Authentication Protocol\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Client Auth\",\n-                                \"required\": false,\n+                                \"name\": \"snmp-authentication-protocol\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Local Network Interface\": {\n-                                \"description\": \"The name of a local network interface to be used to restrict listening to a specific LAN.\",\n-                                \"displayName\": \"Local Network Interface\",\n+                            \"snmp-community\": {\n+                                \"defaultValue\": \"public\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"SNMPv1\",\n+                                            \"SNMPv2c\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"SNMP Version\",\n+                                        \"propertyName\": \"snmp-version\"\n+                                    }\n+                                ],\n+                                \"description\": \"SNMPv1 and SNMPv2 use communities to establish trust between managers and agents. Most agents support three community names, one each for read-only, read-write and trap. These three community strings control different types of activities. The read-only community applies to get requests. The read-write community string applies to set requests. The trap community string applies to receipt of traps.\",\n+                                \"displayName\": \"SNMP Community\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Local Network Interface\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"snmp-community\",\n+                                \"required\": true,\n+                                \"sensitive\": true\n                             },\n-                            \"Max Batch Size\": {\n-                                \"defaultValue\": \"1\",\n-                                \"description\": \"The maximum number of Syslog events to add to a single FlowFile. If multiple events are available, they will be concatenated along with the <Message Delimiter> up to this configured maximum number of messages\",\n-                                \"displayName\": \"Max Batch Size\",\n+                            \"snmp-private-protocol\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"Symmetric-key algorithm for the encryption of digital data. DES has been considered insecurebecause of the feasilibity of brute-force attacks. We recommend using the AES encryption protocol.\",\n+                                        \"displayName\": \"DES\",\n+                                        \"value\": \"DES\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Symmetric-key block cipher, which applies the DES cipher algorithm three times to each data block. 3DES has been considered insecure has been deprecated by NIST in 2017. We recommend using the AES encryption protocol.\",\n+                                        \"displayName\": \"3DES\",\n+                                        \"value\": \"3DES\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AES is a symmetric algorithm which uses the same 128, 192, or 256 bit key for both encryption and decryption (the security of an AES system increases exponentially with key length).\",\n+                                        \"displayName\": \"AES128\",\n+                                        \"value\": \"AES128\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AES is a symmetric algorithm which uses the same 128, 192, or 256 bit key for both encryption and decryption (the security of an AES system increases exponentially with key length).\",\n+                                        \"displayName\": \"AES192\",\n+                                        \"value\": \"AES192\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AES is a symmetric algorithm which uses the same 128, 192, or 256 bit key for both encryption and decryption (the security of an AES system increases exponentially with key length).\",\n+                                        \"displayName\": \"AES256\",\n+                                        \"value\": \"AES256\"\n+                                    }\n+                                ],\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"authPriv\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"SNMP Security Level\",\n+                                        \"propertyName\": \"snmp-security-level\"\n+                                    }\n+                                ],\n+                                \"description\": \"Privacy allows for encryption of SNMP v3 messages to ensure confidentiality of data.\",\n+                                \"displayName\": \"SNMP Privacy Protocol\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Max Batch Size\",\n+                                \"name\": \"snmp-private-protocol\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Max Number of TCP Connections\": {\n-                                \"defaultValue\": \"2\",\n+                            \"snmp-private-protocol-passphrase\": {\n                                 \"dependencies\": [\n                                     {\n                                         \"dependentValues\": [\n-                                            \"TCP\"\n+                                            \"authPriv\"\n                                         ],\n-                                        \"propertyDisplayName\": \"Protocol\",\n-                                        \"propertyName\": \"Protocol\"\n+                                        \"propertyDisplayName\": \"SNMP Security Level\",\n+                                        \"propertyName\": \"snmp-security-level\"\n                                     }\n                                 ],\n-                                \"description\": \"The maximum number of concurrent connections to accept Syslog messages in TCP mode.\",\n-                                \"displayName\": \"Max Number of TCP Connections\",\n+                                \"description\": \"Passphrase used for SNMP privacy protocol.\",\n+                                \"displayName\": \"SNMP Privacy Passphrase\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Max Number of TCP Connections\",\n+                                \"name\": \"snmp-private-protocol-passphrase\",\n                                 \"required\": true,\n+                                \"sensitive\": true\n+                            },\n+                            \"snmp-retries\": {\n+                                \"defaultValue\": \"0\",\n+                                \"description\": \"Set the number of retries when requesting the SNMP Agent.\",\n+                                \"displayName\": \"Number of Retries\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"snmp-retries\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Max Size of Message Queue\": {\n-                                \"defaultValue\": \"10000\",\n-                                \"description\": \"The maximum size of the internal queue used to buffer messages being transferred from the underlying channel to the processor. Setting this value higher allows more messages to be buffered in memory during surges of incoming messages, but increases the total memory used by the processor.\",\n-                                \"displayName\": \"Max Size of Message Queue\",\n+                            \"snmp-security-level\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"Communication without authentication and privacy.\",\n+                                        \"displayName\": \"noAuthNoPriv\",\n+                                        \"value\": \"noAuthNoPriv\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Communication with authentication and without privacy.\",\n+                                        \"displayName\": \"authNoPriv\",\n+                                        \"value\": \"authNoPriv\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Communication with authentication and privacy.\",\n+                                        \"displayName\": \"authPriv\",\n+                                        \"value\": \"authPriv\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"noAuthNoPriv\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"SNMPv3\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"SNMP Version\",\n+                                        \"propertyName\": \"snmp-version\"\n+                                    }\n+                                ],\n+                                \"description\": \"SNMP version 3 provides extra security with User Based Security Model (USM). The three levels of security is 1. Communication without authentication and encryption (NoAuthNoPriv). 2. Communication with authentication and without encryption (AuthNoPriv). 3. Communication with authentication and encryption (AuthPriv).\",\n+                                \"displayName\": \"SNMP Security Level\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Max Size of Message Queue\",\n+                                \"name\": \"snmp-security-level\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Max Size of Socket Buffer\": {\n-                                \"defaultValue\": \"1 MB\",\n+                            \"snmp-security-name\": {\n                                 \"dependencies\": [\n                                     {\n                                         \"dependentValues\": [\n-                                            \"TCP\"\n+                                            \"SNMPv3\"\n                                         ],\n-                                        \"propertyDisplayName\": \"Protocol\",\n-                                        \"propertyName\": \"Protocol\"\n+                                        \"propertyDisplayName\": \"SNMP Version\",\n+                                        \"propertyName\": \"snmp-version\"\n                                     }\n                                 ],\n-                                \"description\": \"The maximum size of the socket buffer that should be used. This is a suggestion to the Operating System to indicate how big the socket buffer should be. If this value is set too low, the buffer may fill up before the data can be read, and incoming data will be dropped.\",\n-                                \"displayName\": \"Max Size of Socket Buffer\",\n+                                \"description\": \"User name used for SNMP v3 Authentication.\",\n+                                \"displayName\": \"SNMP Security Name\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Max Size of Socket Buffer\",\n+                                \"name\": \"snmp-security-name\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Message Delimiter\": {\n-                                \"defaultValue\": \"\\\\n\",\n-                                \"description\": \"Specifies the delimiter to place between Syslog messages when multiple messages are bundled together (see <Max Batch Size> property).\",\n-                                \"displayName\": \"Message Delimiter\",\n+                            \"snmp-timeout\": {\n+                                \"defaultValue\": \"5000\",\n+                                \"description\": \"Set the timeout in ms when requesting the SNMP Agent.\",\n+                                \"displayName\": \"Timeout (ms)\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Message Delimiter\",\n-                                \"required\": true,\n+                                \"name\": \"snmp-timeout\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Parse Messages\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n+                            \"snmp-trap-agent-address\": {\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"dependentValues\": [\n+                                            \"SNMPv1\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"SNMP Version\",\n+                                        \"propertyName\": \"snmp-version\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"true\",\n-                                \"description\": \"Indicates if the processor should parse the Syslog messages. If set to false, each outgoing FlowFile will only contain the sender, protocol, and port, and no additional attributes.\",\n-                                \"displayName\": \"Parse Messages\",\n+                                \"description\": \"The address where the SNMP Manager sends the trap.\",\n+                                \"displayName\": \"SNMP Trap Agent Address\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Parse Messages\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"snmp-trap-agent-address\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Port\": {\n-                                \"description\": \"The port for Syslog communication. Note that Expression language is not evaluated per FlowFile.\",\n-                                \"displayName\": \"Port\",\n+                            \"snmp-trap-enterprise-oid\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"SNMPv1\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"SNMP Version\",\n+                                        \"propertyName\": \"snmp-version\"\n+                                    }\n+                                ],\n+                                \"description\": \"Enterprise is the vendor identification (OID) for the network management sub-system that generated the trap.\",\n+                                \"displayName\": \"Enterprise OID\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Port\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"snmp-trap-enterprise-oid\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Protocol\": {\n+                            \"snmp-trap-generic-type\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"TCP\",\n-                                        \"value\": \"TCP\"\n+                                        \"description\": \"A coldStart trap signifies that the sending protocol entity is reinitializing itself such that the agent's configuration or the protocol entity implementation may be altered\",\n+                                        \"displayName\": \"Cold Start\",\n+                                        \"value\": \"0\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"UDP\",\n-                                        \"value\": \"UDP\"\n+                                        \"description\": \"A warmStart trap signifies that the sending protocol entity is reinitializing itself such that neither the agent configuration nor the protocol entity implementation is altered.\",\n+                                        \"displayName\": \"Warm Start\",\n+                                        \"value\": \"1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"A linkDown trap signifies that the sending protocol entity recognizes a failure in one of the communication links represented in the agent's configuration.\",\n+                                        \"displayName\": \"Link Down\",\n+                                        \"value\": \"2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"A linkUp trap signifies that the sending protocol entity recognizes that one of the communication links represented in the agent's configuration has come up.\",\n+                                        \"displayName\": \"Link Up\",\n+                                        \"value\": \"3\"\n+                                    },\n+                                    {\n+                                        \"description\": \"An authenticationFailure trap signifies that the sending protocol entity is the addressee of a protocol message that is not properly authenticated. While implementations of the SNMP must be capable of generating this trap, they must also be capable of suppressing the emission of such traps via an implementation- specific mechanism.\",\n+                                        \"displayName\": \"Authentication Failure\",\n+                                        \"value\": \"4\"\n+                                    },\n+                                    {\n+                                        \"description\": \"An egpNeighborLoss trap signifies that an EGP neighbor for whom the sending protocol entity was an EGP peer has been marked down and the peer relationship no longer obtains\",\n+                                        \"displayName\": \"EGP Neighborloss\",\n+                                        \"value\": \"5\"\n+                                    },\n+                                    {\n+                                        \"description\": \"An enterpriseSpecific trap signifies that a particular enterprise-specific trap has occurred which can be defined in the Specific Trap Type field.\",\n+                                        \"displayName\": \"Enterprise Specific\",\n+                                        \"value\": \"6\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Provide the Generic Trap Type with the \\\"generic-trap-type\\\" flowfile attribute.\",\n+                                        \"displayName\": \"With \\\"generic-trap-type\\\" FlowFile Attribute\",\n+                                        \"value\": \"generic-trap-type\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"UDP\",\n-                                \"description\": \"The protocol for Syslog communication.\",\n-                                \"displayName\": \"Protocol\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"SNMPv1\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"SNMP Version\",\n+                                        \"propertyName\": \"snmp-version\"\n+                                    }\n+                                ],\n+                                \"description\": \"Generic trap type is an integer in the range of 0 to 6. See processor usage for details.\",\n+                                \"displayName\": \"Generic Trap Type\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Protocol\",\n+                                \"name\": \"snmp-trap-generic-type\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Receive Buffer Size\": {\n-                                \"defaultValue\": \"65507 B\",\n-                                \"description\": \"The size of each buffer used to receive Syslog messages. Adjust this value appropriately based on the expected size of the incoming Syslog messages. When UDP is selected each buffer will hold one Syslog message. When TCP is selected messages are read from an incoming connection until the buffer is full, or the connection is closed. \",\n-                                \"displayName\": \"Receive Buffer Size\",\n+                            \"snmp-trap-manager-host\": {\n+                                \"defaultValue\": \"localhost\",\n+                                \"description\": \"The host of the SNMP Manager where the trap is sent.\",\n+                                \"displayName\": \"SNMP Manager Host\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Receive Buffer Size\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"snmp-trap-manager-host\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"SSL Context Service\": {\n+                            \"snmp-trap-manager-port\": {\n+                                \"description\": \"The port of the SNMP Manager where the trap is sent.\",\n+                                \"displayName\": \"SNMP Manager Port\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"snmp-trap-manager-port\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"snmp-trap-oid-value\": {\n                                 \"dependencies\": [\n                                     {\n                                         \"dependentValues\": [\n-                                            \"TCP\"\n+                                            \"SNMPv3\",\n+                                            \"SNMPv2c\"\n                                         ],\n-                                        \"propertyDisplayName\": \"Protocol\",\n-                                        \"propertyName\": \"Protocol\"\n+                                        \"propertyDisplayName\": \"SNMP Version\",\n+                                        \"propertyName\": \"snmp-version\"\n                                     }\n                                 ],\n-                                \"description\": \"The Controller Service to use in order to obtain an SSL Context. If this property is set, syslog messages will be received over a secure connection.\",\n-                                \"displayName\": \"SSL Context Service\",\n+                                \"description\": \"The value of the trap OID.\",\n+                                \"displayName\": \"Trap OID Value\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"SSL Context Service\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.ssl.RestrictedSSLContextService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"snmp-trap-oid-value\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n                             },\n-                            \"socket-keep-alive\": {\n-                                \"allowableValues\": [\n+                            \"snmp-trap-specific-type\": {\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"dependentValues\": [\n+                                            \"6\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Generic Trap Type\",\n+                                        \"propertyName\": \"snmp-trap-generic-type\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"dependentValues\": [\n+                                            \"SNMPv1\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"SNMP Version\",\n+                                        \"propertyName\": \"snmp-version\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"false\",\n-                                \"dependencies\": [\n+                                \"description\": \"Specific trap type is a number that further specifies the nature of the event that generated the trap in the case of traps of generic type 6 (enterpriseSpecific). The interpretation of this code is vendor-specific.\",\n+                                \"displayName\": \"Specific Trap Type\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"snmp-trap-specific-type\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"snmp-version\": {\n+                                \"allowableValues\": [\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"TCP\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Protocol\",\n-                                        \"propertyName\": \"Protocol\"\n+                                        \"description\": \"SNMP version 1\",\n+                                        \"displayName\": \"v1\",\n+                                        \"value\": \"SNMPv1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"SNMP version 2c\",\n+                                        \"displayName\": \"v2c\",\n+                                        \"value\": \"SNMPv2c\"\n+                                    },\n+                                    {\n+                                        \"description\": \"SNMP version 3 with improved security\",\n+                                        \"displayName\": \"v3\",\n+                                        \"value\": \"SNMPv3\"\n                                     }\n                                 ],\n-                                \"description\": \"Whether or not to have TCP socket keep alive turned on. Timing details depend on operating system properties.\",\n-                                \"displayName\": \"Socket Keep Alive\",\n+                                \"defaultValue\": \"SNMPv1\",\n+                                \"description\": \"Three significant versions of SNMP have been developed and deployed. SNMPv1 is the original version of the protocol. More recent versions, SNMPv2c and SNMPv3, feature improvements in performance, flexibility and security.\",\n+                                \"displayName\": \"SNMP Version\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"socket-keep-alive\",\n+                                \"name\": \"snmp-version\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             }\n                         },\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.processors.standard.ParseSyslog\",\n-                            \"org.apache.nifi.processors.standard.PutSyslog\"\n-                        ],\n                         \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"Syslog messages that match one of the expected formats will be sent out this relationship as a FlowFile per message.\",\n+                                \"description\": \"All FlowFiles that have been successfully used to perform SNMP Set are routed to this relationship\",\n                                 \"name\": \"success\"\n                             },\n                             {\n-                                \"description\": \"Syslog messages that do not match one of the expected formats will be sent out this relationship as a FlowFile per message.\",\n-                                \"name\": \"invalid\"\n+                                \"description\": \"All FlowFiles that cannot received from the SNMP agent are routed to this relationship\",\n+                                \"name\": \"failure\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n-                        \"supportsBatching\": true,\n+                        \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"listen\",\n-                            \"logs\",\n-                            \"syslog\",\n-                            \"tcp\",\n-                            \"udp\"\n+                            \"send\",\n+                            \"snmp\",\n+                            \"trap\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.standard.ListenSyslog\",\n-                        \"typeDescription\": \"Listens for Syslog messages being sent to a given port over TCP or UDP. Incoming messages are checked against regular expressions for RFC5424 and RFC3164 formatted messages. The format of each message is: (<PRIORITY>)(VERSION )(TIMESTAMP) (HOSTNAME) (BODY) where version is optional. The timestamp can be an RFC5424 timestamp with a format of \\\"yyyy-MM-dd'T'HH:mm:ss.SZ\\\" or \\\"yyyy-MM-dd'T'HH:mm:ss.S+hh:mm\\\", or it can be an RFC3164 timestamp with a format of \\\"MMM d HH:mm:ss\\\". If an incoming messages matches one of these patterns, the message will be parsed and the individual pieces will be placed in FlowFile attributes, with the original message in the content of the FlowFile. If an incoming message does not match one of these patterns it will not be parsed and the syslog.valid attribute will be set to false with the original message in the content of the FlowFile. Valid messages will be transferred on the success relationship, and invalid messages will be transferred on the invalid relationship.\",\n-                        \"version\": \"1.27.0\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"The priority of the Syslog message.\",\n-                                \"name\": \"syslog.priority\"\n-                            },\n-                            {\n-                                \"description\": \"The severity of the Syslog message derived from the priority.\",\n-                                \"name\": \"syslog.severity\"\n-                            },\n-                            {\n-                                \"description\": \"The facility of the Syslog message derived from the priority.\",\n-                                \"name\": \"syslog.facility\"\n-                            },\n-                            {\n-                                \"description\": \"The optional version from the Syslog message.\",\n-                                \"name\": \"syslog.version\"\n-                            },\n-                            {\n-                                \"description\": \"The timestamp of the Syslog message.\",\n-                                \"name\": \"syslog.timestamp\"\n-                            },\n-                            {\n-                                \"description\": \"The hostname or IP address of the Syslog message.\",\n-                                \"name\": \"syslog.hostname\"\n-                            },\n-                            {\n-                                \"description\": \"The hostname of the Syslog server that sent the message.\",\n-                                \"name\": \"syslog.sender\"\n-                            },\n-                            {\n-                                \"description\": \"The body of the Syslog message, everything after the hostname.\",\n-                                \"name\": \"syslog.body\"\n-                            },\n-                            {\n-                                \"description\": \"An indicator of whether this message matched the expected formats. If this value is false, the other attributes will be empty and only the original message will be available in the content.\",\n-                                \"name\": \"syslog.valid\"\n-                            },\n-                            {\n-                                \"description\": \"The protocol over which the Syslog message was received.\",\n-                                \"name\": \"syslog.protocol\"\n-                            },\n-                            {\n-                                \"description\": \"The port over which the Syslog message was received.\",\n-                                \"name\": \"syslog.port\"\n-                            },\n-                            {\n-                                \"description\": \"The mime.type of the FlowFile which will be text/plain for Syslog messages.\",\n-                                \"name\": \"mime.type\"\n-                            }\n-                        ]\n+                        \"type\": \"org.apache.nifi.snmp.processors.SendTrapSNMP\",\n+                        \"typeDescription\": \"Sends information to SNMP Manager.\",\n+                        \"version\": \"1.27.0\"\n                     },\n                     {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-standard-nar\",\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-snmp-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -111834,1520 +111682,2127 @@\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Character Set\": {\n-                                \"defaultValue\": \"UTF-8\",\n-                                \"description\": \"Specifies the character set of the received data.\",\n-                                \"displayName\": \"Character Set\",\n+                            \"snmp-authentication-passphrase\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"authPriv\",\n+                                            \"authNoPriv\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"SNMP Security Level\",\n+                                        \"propertyName\": \"snmp-security-level\"\n+                                    }\n+                                ],\n+                                \"description\": \"Passphrase used for SNMP authentication protocol.\",\n+                                \"displayName\": \"SNMP Authentication Passphrase\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Character Set\",\n+                                \"name\": \"snmp-authentication-passphrase\",\n                                 \"required\": true,\n-                                \"sensitive\": false\n+                                \"sensitive\": true\n                             },\n-                            \"Client Auth\": {\n+                            \"snmp-authentication-protocol\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"WANT\",\n-                                        \"value\": \"WANT\"\n+                                        \"description\": \"Provides authentication based on the HMAC-MD5 algorithm.\",\n+                                        \"displayName\": \"MD5\",\n+                                        \"value\": \"MD5\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"REQUIRED\",\n-                                        \"value\": \"REQUIRED\"\n+                                        \"description\": \"Provides authentication based on the HMAC-SHA algorithm.\",\n+                                        \"displayName\": \"SHA\",\n+                                        \"value\": \"SHA\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"NONE\",\n-                                        \"value\": \"NONE\"\n+                                        \"description\": \"Provides authentication based on the HMAC-SHA-2 algorithm.\",\n+                                        \"displayName\": \"SHA224\",\n+                                        \"value\": \"HMAC128SHA224\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Provides authentication based on the HMAC-SHA-2 algorithm.\",\n+                                        \"displayName\": \"SHA256\",\n+                                        \"value\": \"HMAC192SHA256\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Provides authentication based on the HMAC-SHA-2 algorithm.\",\n+                                        \"displayName\": \"SHA384\",\n+                                        \"value\": \"HMAC256SHA384\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Provides authentication based on the HMAC-SHA-2 algorithm.\",\n+                                        \"displayName\": \"SHA512\",\n+                                        \"value\": \"HMAC384SHA512\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"REQUIRED\",\n-                                \"description\": \"The client authentication policy to use for the SSL Context. Only used if an SSL Context Service is provided.\",\n-                                \"displayName\": \"Client Auth\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"authPriv\",\n+                                            \"authNoPriv\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"SNMP Security Level\",\n+                                        \"propertyName\": \"snmp-security-level\"\n+                                    }\n+                                ],\n+                                \"description\": \"Hash based authentication protocol for secure authentication.\",\n+                                \"displayName\": \"SNMP Authentication Protocol\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Client Auth\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Local Network Interface\": {\n-                                \"description\": \"The name of a local network interface to be used to restrict listening to a specific LAN.\",\n-                                \"displayName\": \"Local Network Interface\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Local Network Interface\",\n-                                \"required\": false,\n+                                \"name\": \"snmp-authentication-protocol\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Max Batch Size\": {\n-                                \"defaultValue\": \"1\",\n-                                \"description\": \"The maximum number of messages to add to a single FlowFile. If multiple messages are available, they will be concatenated along with the <Message Delimiter> up to this configured maximum number of messages\",\n-                                \"displayName\": \"Max Batch Size\",\n+                            \"snmp-community\": {\n+                                \"defaultValue\": \"public\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"SNMPv1\",\n+                                            \"SNMPv2c\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"SNMP Version\",\n+                                        \"propertyName\": \"snmp-version\"\n+                                    }\n+                                ],\n+                                \"description\": \"SNMPv1 and SNMPv2 use communities to establish trust between managers and agents. Most agents support three community names, one each for read-only, read-write and trap. These three community strings control different types of activities. The read-only community applies to get requests. The read-write community string applies to set requests. The trap community string applies to receipt of traps.\",\n+                                \"displayName\": \"SNMP Community\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Max Batch Size\",\n+                                \"name\": \"snmp-community\",\n                                 \"required\": true,\n-                                \"sensitive\": false\n+                                \"sensitive\": true\n                             },\n-                            \"Max Number of TCP Connections\": {\n-                                \"defaultValue\": \"2\",\n-                                \"description\": \"The maximum number of worker threads available for servicing TCP connections.\",\n-                                \"displayName\": \"Max Number of Worker Threads\",\n+                            \"snmp-hostname\": {\n+                                \"defaultValue\": \"localhost\",\n+                                \"description\": \"Hostname or network address of the SNMP Agent.\",\n+                                \"displayName\": \"SNMP Agent Hostname\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Max Number of TCP Connections\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"snmp-hostname\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Max Size of Message Queue\": {\n-                                \"defaultValue\": \"10000\",\n-                                \"description\": \"The maximum size of the internal queue used to buffer messages being transferred from the underlying channel to the processor. Setting this value higher allows more messages to be buffered in memory during surges of incoming messages, but increases the total memory used by the processor during these surges.\",\n-                                \"displayName\": \"Max Size of Message Queue\",\n+                            \"snmp-port\": {\n+                                \"defaultValue\": \"161\",\n+                                \"description\": \"Port of the SNMP Agent.\",\n+                                \"displayName\": \"SNMP Agent Port\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Max Size of Message Queue\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"snmp-port\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Max Size of Socket Buffer\": {\n-                                \"defaultValue\": \"1 MB\",\n-                                \"description\": \"The maximum size of the socket buffer that should be used. This is a suggestion to the Operating System to indicate how big the socket buffer should be. If this value is set too low, the buffer may fill up before the data can be read, and incoming data will be dropped.\",\n-                                \"displayName\": \"Max Size of Socket Buffer\",\n+                            \"snmp-private-protocol\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"Symmetric-key algorithm for the encryption of digital data. DES has been considered insecurebecause of the feasilibity of brute-force attacks. We recommend using the AES encryption protocol.\",\n+                                        \"displayName\": \"DES\",\n+                                        \"value\": \"DES\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Symmetric-key block cipher, which applies the DES cipher algorithm three times to each data block. 3DES has been considered insecure has been deprecated by NIST in 2017. We recommend using the AES encryption protocol.\",\n+                                        \"displayName\": \"3DES\",\n+                                        \"value\": \"3DES\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AES is a symmetric algorithm which uses the same 128, 192, or 256 bit key for both encryption and decryption (the security of an AES system increases exponentially with key length).\",\n+                                        \"displayName\": \"AES128\",\n+                                        \"value\": \"AES128\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AES is a symmetric algorithm which uses the same 128, 192, or 256 bit key for both encryption and decryption (the security of an AES system increases exponentially with key length).\",\n+                                        \"displayName\": \"AES192\",\n+                                        \"value\": \"AES192\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AES is a symmetric algorithm which uses the same 128, 192, or 256 bit key for both encryption and decryption (the security of an AES system increases exponentially with key length).\",\n+                                        \"displayName\": \"AES256\",\n+                                        \"value\": \"AES256\"\n+                                    }\n+                                ],\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"authPriv\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"SNMP Security Level\",\n+                                        \"propertyName\": \"snmp-security-level\"\n+                                    }\n+                                ],\n+                                \"description\": \"Privacy allows for encryption of SNMP v3 messages to ensure confidentiality of data.\",\n+                                \"displayName\": \"SNMP Privacy Protocol\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Max Size of Socket Buffer\",\n+                                \"name\": \"snmp-private-protocol\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Message Delimiter\": {\n-                                \"defaultValue\": \"\\\\n\",\n-                                \"description\": \"Specifies the delimiter to place between messages when multiple messages are bundled together (see <Max Batch Size> property).\",\n-                                \"displayName\": \"Batching Message Delimiter\",\n+                            \"snmp-private-protocol-passphrase\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"authPriv\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"SNMP Security Level\",\n+                                        \"propertyName\": \"snmp-security-level\"\n+                                    }\n+                                ],\n+                                \"description\": \"Passphrase used for SNMP privacy protocol.\",\n+                                \"displayName\": \"SNMP Privacy Passphrase\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Message Delimiter\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Port\": {\n-                                \"description\": \"The port to listen on for communication.\",\n-                                \"displayName\": \"Port\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Port\",\n+                                \"name\": \"snmp-private-protocol-passphrase\",\n                                 \"required\": true,\n-                                \"sensitive\": false\n+                                \"sensitive\": true\n                             },\n-                            \"Receive Buffer Size\": {\n-                                \"defaultValue\": \"65507 B\",\n-                                \"description\": \"The size of each buffer used to receive messages. Adjust this value appropriately based on the expected size of the incoming messages.\",\n-                                \"displayName\": \"Receive Buffer Size\",\n+                            \"snmp-retries\": {\n+                                \"defaultValue\": \"0\",\n+                                \"description\": \"Set the number of retries when requesting the SNMP Agent.\",\n+                                \"displayName\": \"Number of Retries\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Receive Buffer Size\",\n-                                \"required\": true,\n+                                \"name\": \"snmp-retries\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"SSL Context Service\": {\n-                                \"description\": \"The Controller Service to use in order to obtain an SSL Context. If this property is set, messages will be received over a secure connection.\",\n-                                \"displayName\": \"SSL Context Service\",\n+                            \"snmp-security-level\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"Communication without authentication and privacy.\",\n+                                        \"displayName\": \"noAuthNoPriv\",\n+                                        \"value\": \"noAuthNoPriv\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Communication with authentication and without privacy.\",\n+                                        \"displayName\": \"authNoPriv\",\n+                                        \"value\": \"authNoPriv\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Communication with authentication and privacy.\",\n+                                        \"displayName\": \"authPriv\",\n+                                        \"value\": \"authPriv\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"noAuthNoPriv\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"SNMPv3\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"SNMP Version\",\n+                                        \"propertyName\": \"snmp-version\"\n+                                    }\n+                                ],\n+                                \"description\": \"SNMP version 3 provides extra security with User Based Security Model (USM). The three levels of security is 1. Communication without authentication and encryption (NoAuthNoPriv). 2. Communication with authentication and without encryption (AuthNoPriv). 3. Communication with authentication and encryption (AuthPriv).\",\n+                                \"displayName\": \"SNMP Security Level\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"SSL Context Service\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.ssl.RestrictedSSLContextService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n+                                \"name\": \"snmp-security-level\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n                             },\n-                            \"idle-timeout\": {\n-                                \"defaultValue\": \"0 seconds\",\n-                                \"description\": \"The amount of time a client's connection will remain open if no data is received. The default of 0 seconds will leave connections open until they are closed by the client.\",\n-                                \"displayName\": \"Idle Connection Timeout\",\n+                            \"snmp-security-name\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"SNMPv3\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"SNMP Version\",\n+                                        \"propertyName\": \"snmp-version\"\n+                                    }\n+                                ],\n+                                \"description\": \"User name used for SNMP v3 Authentication.\",\n+                                \"displayName\": \"SNMP Security Name\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"idle-timeout\",\n+                                \"name\": \"snmp-security-name\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"max-receiving-threads\": {\n-                                \"description\": \"This property is deprecated and no longer used.\",\n-                                \"displayName\": \"Max Number of Receiving Message Handler Threads\",\n+                            \"snmp-timeout\": {\n+                                \"defaultValue\": \"5000\",\n+                                \"description\": \"Set the timeout in ms when requesting the SNMP Agent.\",\n+                                \"displayName\": \"Timeout (ms)\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"max-receiving-threads\",\n+                                \"name\": \"snmp-timeout\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"pool-receive-buffers\": {\n+                            \"snmp-version\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"True\",\n-                                        \"value\": \"True\"\n+                                        \"description\": \"SNMP version 1\",\n+                                        \"displayName\": \"v1\",\n+                                        \"value\": \"SNMPv1\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"False\",\n-                                        \"value\": \"False\"\n+                                        \"description\": \"SNMP version 2c\",\n+                                        \"displayName\": \"v2c\",\n+                                        \"value\": \"SNMPv2c\"\n+                                    },\n+                                    {\n+                                        \"description\": \"SNMP version 3 with improved security\",\n+                                        \"displayName\": \"v3\",\n+                                        \"value\": \"SNMPv3\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"True\",\n-                                \"description\": \"Enable or disable pooling of buffers that the processor uses for handling bytes received on socket connections. The framework allocates buffers as needed during processing.\",\n-                                \"displayName\": \"Pool Receive Buffers\",\n+                                \"defaultValue\": \"SNMPv1\",\n+                                \"description\": \"Three significant versions of SNMP have been developed and deployed. SNMPv1 is the original version of the protocol. More recent versions, SNMPv2c and SNMPv3, feature improvements in performance, flexibility and security.\",\n+                                \"displayName\": \"SNMP Version\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"pool-receive-buffers\",\n+                                \"name\": \"snmp-version\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             }\n                         },\n                         \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"Messages received successfully will be sent out this relationship.\",\n+                                \"description\": \"All FlowFiles that have been successfully used to perform SNMP Set are routed to this relationship\",\n                                 \"name\": \"success\"\n+                            },\n+                            {\n+                                \"description\": \"All FlowFiles that failed during the SNMP Set care routed to this relationship\",\n+                                \"name\": \"failure\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n-                        \"supportsBatching\": true,\n+                        \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"listen\",\n-                            \"ssl\",\n-                            \"tcp\",\n-                            \"tls\"\n+                            \"oid\",\n+                            \"set\",\n+                            \"snmp\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.standard.ListenTCP\",\n-                        \"typeDescription\": \"Listens for incoming TCP connections and reads data from each connection using a line separator as the message demarcator. The default behavior is for each message to produce a single FlowFile, however this can be controlled by increasing the Batch Size to a larger value for higher throughput. The Receive Buffer Size must be set as large as the largest messages expected to be received, meaning if every 100kb there is a line separator, then the Receive Buffer Size must be greater than 100kb. The processor can be configured to use an SSL Context Service to only allow secure connections. When connected clients present certificates for mutual TLS authentication, the Distinguished Names of the client certificate's issuer and subject are added to the outgoing FlowFiles as attributes. The processor does not perform authorization based on Distinguished Name values, but since these values are attached to the outgoing FlowFiles, authorization can be implemented based on these attributes.\",\n+                        \"type\": \"org.apache.nifi.snmp.processors.SetSNMP\",\n+                        \"typeDescription\": \"Based on incoming FlowFile attributes, the processor will execute SNMP Set requests. When finding attributes with the name snmp$<OID>, the processor will attempt to set the value of the attribute to the corresponding OID given in the attribute name.\",\n                         \"version\": \"1.27.0\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"The sending host of the messages.\",\n-                                \"name\": \"tcp.sender\"\n+                                \"description\": \"Response variable binding: OID (e.g. 1.3.6.1.4.1.343) and its value.\",\n+                                \"name\": \"snmp$<OID>\"\n                             },\n                             {\n-                                \"description\": \"The sending port the messages were received.\",\n-                                \"name\": \"tcp.port\"\n+                                \"description\": \"Denotes the variable binding in which the error occured.\",\n+                                \"name\": \"snmp$errorIndex\"\n                             },\n                             {\n-                                \"description\": \"For connections using mutual TLS, the Distinguished Name of the Certificate Authority that issued the client's certificate is attached to the FlowFile.\",\n-                                \"name\": \"client.certificate.issuer.dn\"\n+                                \"description\": \"The snmp4j error status of the PDU.\",\n+                                \"name\": \"snmp$errorStatus\"\n                             },\n                             {\n-                                \"description\": \"For connections using mutual TLS, the Distinguished Name of the client certificate's owner (subject) is attached to the FlowFile.\",\n-                                \"name\": \"client.certificate.subject.dn\"\n+                                \"description\": \"The description of error status.\",\n+                                \"name\": \"snmp$errorStatusText\"\n+                            },\n+                            {\n+                                \"description\": \"The number of non repeater variable bindings in a GETBULK PDU (currently not supported).\",\n+                                \"name\": \"snmp$nonRepeaters\"\n+                            },\n+                            {\n+                                \"description\": \"The request ID associated with the PDU.\",\n+                                \"name\": \"snmp$requestID\"\n+                            },\n+                            {\n+                                \"description\": \"The snmp4j numeric representation of the type of the PDU.\",\n+                                \"name\": \"snmp$type\"\n+                            },\n+                            {\n+                                \"description\": \"The name of the PDU type.\",\n+                                \"name\": \"snmp$typeString\"\n                             }\n                         ]\n-                    },\n+                    }\n+                ],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"1.27.0\"\n+        },\n+        {\n+            \"artifact\": \"nifi-pgp-service-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-standard-nar\",\n+                        \"artifact\": \"nifi-pgp-service-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n-                        \"defaultBulletinLevel\": \"WARN\",\n-                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": 1,\n-                            \"TIMER_DRIVEN\": 1\n+                        \"group\": \"org.apache.nifi\",\n+                        \"propertyDescriptors\": {\n+                            \"key-password\": {\n+                                \"description\": \"Password used for decrypting Private Keys\",\n+                                \"displayName\": \"Key Password\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"key-password\",\n+                                \"required\": true,\n+                                \"sensitive\": true\n+                            },\n+                            \"keyring\": {\n+                                \"description\": \"PGP Keyring or Secret Key encoded in ASCII Armor\",\n+                                \"displayName\": \"Keyring\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"keyring\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n+                            },\n+                            \"keyring-file\": {\n+                                \"description\": \"File path to PGP Keyring or Secret Key encoded in binary or ASCII Armor\",\n+                                \"displayName\": \"Keyring File\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"keyring-file\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            }\n                         },\n-                        \"defaultPenaltyDuration\": \"30 sec\",\n-                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"0 sec\"\n+                        \"providedApiImplementations\": [\n+                            {\n+                                \"artifact\": \"nifi-pgp-service-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.pgp.service.api.PGPPrivateKeyService\",\n+                                \"version\": \"1.27.0\"\n+                            }\n+                        ],\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"Encryption\",\n+                            \"GPG\",\n+                            \"Key\",\n+                            \"OpenPGP\",\n+                            \"PGP\",\n+                            \"Private\",\n+                            \"RFC 4880\"\n+                        ],\n+                        \"type\": \"org.apache.nifi.pgp.service.standard.StandardPGPPrivateKeyService\",\n+                        \"typeDescription\": \"PGP Private Key Service provides Private Keys loaded from files or properties\",\n+                        \"version\": \"1.27.0\"\n+                    },\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-pgp-service-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"e0c4461\"\n                         },\n-                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n-                        \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n-                        \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Local Network Interface\": {\n-                                \"description\": \"The name of a local network interface to be used to restrict listening to a specific LAN.\",\n-                                \"displayName\": \"Local Network Interface\",\n+                            \"keyring\": {\n+                                \"description\": \"PGP Keyring or Public Key encoded in ASCII Armor\",\n+                                \"displayName\": \"Keyring\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"keyring\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"keyring-file\": {\n+                                \"description\": \"File path to PGP Keyring or Public Key encoded in binary or ASCII Armor\",\n+                                \"displayName\": \"Keyring File\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Local Network Interface\",\n+                                \"name\": \"keyring-file\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n+                            }\n+                        },\n+                        \"providedApiImplementations\": [\n+                            {\n+                                \"artifact\": \"nifi-pgp-service-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.pgp.service.api.PGPPublicKeyService\",\n+                                \"version\": \"1.27.0\"\n+                            }\n+                        ],\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"Encryption\",\n+                            \"GPG\",\n+                            \"Key\",\n+                            \"OpenPGP\",\n+                            \"PGP\",\n+                            \"Private\",\n+                            \"RFC 4880\"\n+                        ],\n+                        \"type\": \"org.apache.nifi.pgp.service.standard.StandardPGPPublicKeyService\",\n+                        \"typeDescription\": \"PGP Public Key Service providing Public Keys loaded from files\",\n+                        \"version\": \"1.27.0\"\n+                    }\n+                ],\n+                \"processors\": [],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"1.27.0\"\n+        },\n+        {\n+            \"artifact\": \"nifi-azure-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-azure-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"e0c4461\"\n+                        },\n+                        \"group\": \"org.apache.nifi\",\n+                        \"propertyDescriptors\": {\n+                            \"credential-configuration-strategy\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"Uses default credential chain. It first checks environment variables, before trying managed identity.\",\n+                                        \"displayName\": \"Default Credential\",\n+                                        \"value\": \"default-credential\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Azure Virtual Machine Managed Identity (it can only be used when NiFi is running on Azure)\",\n+                                        \"displayName\": \"Managed Identity\",\n+                                        \"value\": \"managed-identity\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"default-credential\",\n+                                \"description\": \"\",\n+                                \"displayName\": \"Credential Configuration Strategy\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"credential-configuration-strategy\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n                             },\n-                            \"client-auth\": {\n+                            \"managed-identity-client-id\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"managed-identity\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Credential Configuration Strategy\",\n+                                        \"propertyName\": \"credential-configuration-strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"Client ID of the managed identity. The property is required when User Assigned Managed Identity is used for authentication. It must be empty in case of System Assigned Managed Identity.\",\n+                                \"displayName\": \"Managed Identity Client ID\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"managed-identity-client-id\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n+                            }\n+                        },\n+                        \"providedApiImplementations\": [\n+                            {\n+                                \"artifact\": \"nifi-azure-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.services.azure.AzureCredentialsService\",\n+                                \"version\": \"1.27.0\"\n+                            }\n+                        ],\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"azure\",\n+                            \"credentials\",\n+                            \"provider\",\n+                            \"security\",\n+                            \"session\"\n+                        ],\n+                        \"type\": \"org.apache.nifi.services.azure.StandardAzureCredentialsControllerService\",\n+                        \"typeDescription\": \"Provide credentials to use with an Azure client.\",\n+                        \"version\": \"1.27.0\"\n+                    },\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-azure-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"e0c4461\"\n+                        },\n+                        \"group\": \"org.apache.nifi\",\n+                        \"propertyDescriptors\": {\n+                            \"azure-cosmos-db-consistency-level\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"WANT\",\n-                                        \"value\": \"WANT\"\n+                                        \"displayName\": \"STRONG\",\n+                                        \"value\": \"STRONG\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"REQUIRED\",\n-                                        \"value\": \"REQUIRED\"\n+                                        \"displayName\": \"BOUNDED_STALENESS\",\n+                                        \"value\": \"BOUNDED_STALENESS\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"NONE\",\n-                                        \"value\": \"NONE\"\n+                                        \"displayName\": \"SESSION\",\n+                                        \"value\": \"SESSION\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"CONSISTENT_PREFIX\",\n+                                        \"value\": \"CONSISTENT_PREFIX\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"EVENTUAL\",\n+                                        \"value\": \"EVENTUAL\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"REQUIRED\",\n-                                \"description\": \"The client authentication policy to use for the SSL Context. Only used if an SSL Context Service is provided.\",\n-                                \"displayName\": \"Client Auth\",\n+                                \"defaultValue\": \"SESSION\",\n+                                \"description\": \"Choose from five consistency levels on the consistency spectrum. Refer to Cosmos DB documentation for their differences\",\n+                                \"displayName\": \"Cosmos DB Consistency Level\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"client-auth\",\n+                                \"name\": \"azure-cosmos-db-consistency-level\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"max-number-tcp-connections\": {\n-                                \"defaultValue\": \"2\",\n-                                \"description\": \"The maximum number of concurrent TCP connections to accept. In cases where clients are keeping a connection open, the concurrent tasks for the processor should be adjusted to match the Max Number of TCP Connections allowed, so that there is a task processing each connection.\",\n-                                \"displayName\": \"Max Number of TCP Connections\",\n+                            \"azure-cosmos-db-key\": {\n+                                \"description\": \"Cosmos DB Access Key from Azure Portal (Settings->Keys). Choose a read-write key to enable database or container creation at run time\",\n+                                \"displayName\": \"Cosmos DB Access Key\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"max-number-tcp-connections\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n+                                \"name\": \"azure-cosmos-db-key\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n                             },\n-                            \"max-size-socket-buffer\": {\n-                                \"defaultValue\": \"1 MB\",\n-                                \"description\": \"The maximum size of the socket buffer that should be used. This is a suggestion to the Operating System to indicate how big the socket buffer should be. If this value is set too low, the buffer may fill up before the data can be read, and incoming data will be dropped.\",\n-                                \"displayName\": \"Max Size of Socket Buffer\",\n+                            \"azure-cosmos-db-uri\": {\n+                                \"description\": \"Cosmos DB URI, typically in the form of https://{databaseaccount}.documents.azure.com:443/ Note this host URL is for Cosmos DB with Core SQL API from Azure Portal (Overview->URI)\",\n+                                \"displayName\": \"Cosmos DB URI\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"max-size-socket-buffer\",\n+                                \"name\": \"azure-cosmos-db-uri\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n+                            }\n+                        },\n+                        \"providedApiImplementations\": [\n+                            {\n+                                \"artifact\": \"nifi-azure-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.services.azure.cosmos.AzureCosmosDBConnectionService\",\n+                                \"version\": \"1.27.0\"\n+                            }\n+                        ],\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"azure\",\n+                            \"cosmos\",\n+                            \"document\",\n+                            \"service\"\n+                        ],\n+                        \"type\": \"org.apache.nifi.services.azure.cosmos.document.AzureCosmosDBClientService\",\n+                        \"typeDescription\": \"Provides a controller service that configures a connection to Cosmos DB (Core SQL API)  and provides access to that connection to other Cosmos DB-related components.\",\n+                        \"version\": \"1.27.0\"\n+                    },\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-azure-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"e0c4461\"\n+                        },\n+                        \"group\": \"org.apache.nifi\",\n+                        \"propertyDescriptors\": {\n+                            \"Authentication Strategy\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"Azure Event Hub shared access key\",\n+                                        \"displayName\": \"Shared Access Key\",\n+                                        \"value\": \"SHARED_ACCESS_KEY\"\n+                                    },\n+                                    {\n+                                        \"description\": \"The Default Azure Credential will read credentials from standard environment variables and will also attempt to read Managed Identity credentials when running in Microsoft Azure environments\",\n+                                        \"displayName\": \"Default Azure Credential\",\n+                                        \"value\": \"DEFAULT_AZURE_CREDENTIAL\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"DEFAULT_AZURE_CREDENTIAL\",\n+                                \"description\": \"Strategy for authenticating to Azure Event Hubs\",\n+                                \"displayName\": \"Authentication Strategy\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Authentication Strategy\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"port\": {\n-                                \"description\": \"The port to listen on for communication.\",\n-                                \"displayName\": \"Port\",\n+                            \"Event Hub Name\": {\n+                                \"description\": \"Provides the Event Hub Name for connections\",\n+                                \"displayName\": \"Event Hub Name\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"port\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Event Hub Name\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"read-timeout\": {\n-                                \"defaultValue\": \"10 seconds\",\n-                                \"description\": \"The amount of time to wait before timing out when reading from a connection.\",\n-                                \"displayName\": \"Read Timeout\",\n+                            \"Event Hub Namespace\": {\n+                                \"description\": \"Provides provides the host for connecting to Azure Event Hubs\",\n+                                \"displayName\": \"Event Hub Namespace\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"read-timeout\",\n+                                \"name\": \"Event Hub Namespace\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"reader-error-handling-strategy\": {\n+                            \"Partition Key\": {\n+                                \"description\": \"A hint for Azure Event Hub message broker how to distribute messages across one or more partitions\",\n+                                \"displayName\": \"Partition Key\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Partition Key\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Service Bus Endpoint\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Transfers any records already received and closes the connection.\",\n-                                        \"displayName\": \"Transfer\",\n-                                        \"value\": \"Transfer\"\n+                                        \"description\": \"Default Service Bus Endpoint\",\n+                                        \"displayName\": \"Azure\",\n+                                        \"value\": \".servicebus.windows.net\"\n                                     },\n                                     {\n-                                        \"description\": \"Discards any records already received and closes the connection.\",\n-                                        \"displayName\": \"Discard\",\n-                                        \"value\": \"Discard\"\n+                                        \"description\": \"China Service Bus Endpoint\",\n+                                        \"displayName\": \"Azure China\",\n+                                        \"value\": \".servicebus.chinacloudapi.cn\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Germany Service Bus Endpoint\",\n+                                        \"displayName\": \"Azure Germany\",\n+                                        \"value\": \".servicebus.cloudapi.de\"\n+                                    },\n+                                    {\n+                                        \"description\": \"United States Government Endpoint\",\n+                                        \"displayName\": \"Azure US Government\",\n+                                        \"value\": \".servicebus.usgovcloudapi.net\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"Transfer\",\n-                                \"description\": \"Indicates how to deal with an error while reading the next record from a connection, when previous records have already been read from the connection.\",\n-                                \"displayName\": \"Read Error Strategy\",\n+                                \"defaultValue\": \".servicebus.windows.net\",\n+                                \"description\": \"Provides the domain for connecting to Azure Event Hubs\",\n+                                \"displayName\": \"Service Bus Endpoint\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"reader-error-handling-strategy\",\n+                                \"name\": \"Service Bus Endpoint\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"record-batch-size\": {\n-                                \"defaultValue\": \"1000\",\n-                                \"description\": \"The maximum number of records to write to a single FlowFile.\",\n-                                \"displayName\": \"Record Batch Size\",\n+                            \"Shared Access Policy\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"SHARED_ACCESS_KEY\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Authentication Strategy\",\n+                                        \"propertyName\": \"Authentication Strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"The name of the shared access policy. This policy must have Send claims\",\n+                                \"displayName\": \"Shared Access Policy\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"record-batch-size\",\n-                                \"required\": true,\n+                                \"name\": \"Shared Access Policy\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"record-reader\": {\n-                                \"description\": \"The Record Reader to use for incoming FlowFiles\",\n-                                \"displayName\": \"Record Reader\",\n+                            \"Shared Access Policy Key\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"SHARED_ACCESS_KEY\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Authentication Strategy\",\n+                                        \"propertyName\": \"Authentication Strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"The primary or secondary key of the shared access policy\",\n+                                \"displayName\": \"Shared Access Policy Key\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"record-reader\",\n+                                \"name\": \"Shared Access Policy Key\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n+                            },\n+                            \"Transport Type\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"AMQP over TCP on ports 5671 and 5672\",\n+                                        \"displayName\": \"AMQP\",\n+                                        \"value\": \"Amqp\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AMQP over HTTPS with WebSockets on port 443\",\n+                                        \"displayName\": \"AMQP_WEB_SOCKETS\",\n+                                        \"value\": \"AmqpWebSockets\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"Amqp\",\n+                                \"description\": \"Advanced Message Queuing Protocol Transport Type for communication with Azure Event Hubs\",\n+                                \"displayName\": \"Transport Type\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Transport Type\",\n                                 \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n+                                \"sensitive\": false\n                             },\n-                            \"record-writer\": {\n-                                \"description\": \"The Record Writer to use in order to serialize the data before writing to a FlowFile\",\n+                            \"record-sink-record-writer\": {\n+                                \"description\": \"Specifies the Controller Service to use for writing out the records.\",\n                                 \"displayName\": \"Record Writer\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"record-writer\",\n+                                \"name\": \"record-sink-record-writer\",\n                                 \"required\": true,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n                                     \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n                                     \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n                                     \"version\": \"1.27.0\"\n                                 }\n+                            }\n+                        },\n+                        \"providedApiImplementations\": [\n+                            {\n+                                \"artifact\": \"nifi-standard-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.record.sink.RecordSinkService\",\n+                                \"version\": \"1.27.0\"\n+                            }\n+                        ],\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"azure\",\n+                            \"record\",\n+                            \"sink\"\n+                        ],\n+                        \"type\": \"org.apache.nifi.services.azure.eventhub.AzureEventHubRecordSink\",\n+                        \"typeDescription\": \"Format and send Records to Azure Event Hubs\",\n+                        \"version\": \"1.27.0\"\n+                    },\n+                    {\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-azure-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"e0c4461\"\n+                        },\n+                        \"group\": \"org.apache.nifi\",\n+                        \"propertyDescriptors\": {\n+                            \"managed-identity-client-id\": {\n+                                \"description\": \"Client ID of the managed identity. The property is required when User Assigned Managed Identity is used for authentication. It must be empty in case of System Assigned Managed Identity.\",\n+                                \"displayName\": \"Managed Identity Client ID\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"managed-identity-client-id\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n                             },\n-                            \"ssl-context-service\": {\n-                                \"description\": \"The Controller Service to use in order to obtain an SSL Context. If this property is set, messages will be received over a secure connection.\",\n-                                \"displayName\": \"SSL Context Service\",\n+                            \"proxy-configuration-service\": {\n+                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests. Supported proxies: SOCKS, HTTP In case of SOCKS, it is not guaranteed that the selected SOCKS Version will be used by the processor.\",\n+                                \"displayName\": \"Proxy Configuration Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"ssl-context-service\",\n+                                \"name\": \"proxy-configuration-service\",\n                                 \"required\": false,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n                                     \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.ssl.RestrictedSSLContextService\",\n+                                    \"type\": \"org.apache.nifi.proxy.ProxyConfigurationService\",\n                                     \"version\": \"1.27.0\"\n                                 }\n+                            },\n+                            \"service-principal-client-id\": {\n+                                \"description\": \"Client ID (or Application ID) of the Client/Application having the Service Principal. The property is required when Service Principal authentication is used.\",\n+                                \"displayName\": \"Service Principal Client ID\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"service-principal-client-id\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n+                            },\n+                            \"service-principal-client-secret\": {\n+                                \"description\": \"Password of the Client/Application. The property is required when Service Principal authentication is used.\",\n+                                \"displayName\": \"Service Principal Client Secret\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"service-principal-client-secret\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n+                            },\n+                            \"service-principal-tenant-id\": {\n+                                \"description\": \"Tenant ID of the Azure Active Directory hosting the Service Principal. The property is required when Service Principal authentication is used.\",\n+                                \"displayName\": \"Service Principal Tenant ID\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"service-principal-tenant-id\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n+                            },\n+                            \"storage-account-key\": {\n+                                \"description\": \"The storage account key. This is an admin-like password providing access to every container in this account. It is recommended one uses Shared Access Signature (SAS) token instead for fine-grained control with policies. There are certain risks in allowing the account key to be stored as a flowfile attribute. While it does provide for a more flexible flow by allowing the account key to be fetched dynamically from a flowfile attribute, care must be taken to restrict access to the event provenance data (e.g., by strictly controlling the policies governing provenance for this processor). In addition, the provenance repositories may be put on encrypted disk partitions.\",\n+                                \"displayName\": \"Storage Account Key\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"storage-account-key\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n+                            },\n+                            \"storage-account-name\": {\n+                                \"description\": \"The storage account name. There are certain risks in allowing the account name to be stored as a flowfile attribute. While it does provide for a more flexible flow by allowing the account name to be fetched dynamically from a flowfile attribute, care must be taken to restrict access to the event provenance data (e.g., by strictly controlling the policies governing provenance for this processor). In addition, the provenance repositories may be put on encrypted disk partitions.\",\n+                                \"displayName\": \"Storage Account Name\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"storage-account-name\",\n+                                \"required\": true,\n+                                \"sensitive\": true\n+                            },\n+                            \"storage-endpoint-suffix\": {\n+                                \"defaultValue\": \"dfs.core.windows.net\",\n+                                \"description\": \"Storage accounts in public Azure always use a common FQDN suffix. Override this endpoint suffix with a different suffix in certain circumstances (like Azure Stack or non-public Azure regions).\",\n+                                \"displayName\": \"Endpoint Suffix\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"storage-endpoint-suffix\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"storage-sas-token\": {\n+                                \"description\": \"Shared Access Signature token, including the leading '?'. Specify either SAS token (recommended) or Account Key. There are certain risks in allowing the SAS token to be stored as a flowfile attribute. While it does provide for a more flexible flow by allowing the SAS token to be fetched dynamically from a flowfile attribute, care must be taken to restrict access to the event provenance data (e.g., by strictly controlling the policies governing provenance for this processor). In addition, the provenance repositories may be put on encrypted disk partitions.\",\n+                                \"displayName\": \"SAS Token\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"storage-sas-token\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n+                            },\n+                            \"storage-use-managed-identity\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"Choose whether or not to use the managed identity of Azure VM/VMSS\",\n+                                \"displayName\": \"Use Azure Managed Identity\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"storage-use-managed-identity\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n                             }\n                         },\n-                        \"sideEffectFree\": false,\n-                        \"supportedRelationships\": [\n+                        \"providedApiImplementations\": [\n                             {\n-                                \"description\": \"Messages received successfully will be sent out this relationship.\",\n-                                \"name\": \"success\"\n+                                \"artifact\": \"nifi-azure-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.services.azure.storage.ADLSCredentialsService\",\n+                                \"version\": \"1.27.0\"\n                             }\n                         ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": true,\n                         \"supportsDynamicProperties\": false,\n-                        \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"listen\",\n-                            \"record\",\n-                            \"ssl\",\n-                            \"tcp\",\n-                            \"tls\"\n+                            \"adls\",\n+                            \"azure\",\n+                            \"cloud\",\n+                            \"credentials\",\n+                            \"microsoft\",\n+                            \"storage\"\n                         ],\n-                        \"triggerSerially\": false,\n-                        \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.standard.ListenTCPRecord\",\n-                        \"typeDescription\": \"Listens for incoming TCP connections and reads data from each connection using a configured record reader, and writes the records to a flow file using a configured record writer. The type of record reader selected will determine how clients are expected to send data. For example, when using a Grok reader to read logs, a client can keep an open connection and continuously stream data, but when using an JSON reader, the client cannot send an array of JSON documents and then send another array on the same connection, as the reader would be in a bad state at that point. Records will be read from the connection in blocking mode, and will timeout according to the Read Timeout specified in the processor. If the read times out, or if any other error is encountered when reading, the connection will be closed, and any records read up to that point will be handled according to the configured Read Error Strategy (Discard or Transfer). In cases where clients are keeping a connection open, the concurrent tasks for the processor should be adjusted to match the Max Number of TCP Connections allowed, so that there is a task processing each connection. The processor can be configured to use an SSL Context Service to only allow secure connections. When connected clients present certificates for mutual TLS authentication, the Distinguished Names of the client certificate's issuer and subject are added to the outgoing FlowFiles as attributes. The processor does not perform authorization based on Distinguished Name values, but since these values are attached to the outgoing FlowFiles, authorization can be implemented based on these attributes.\",\n-                        \"version\": \"1.27.0\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"The host that sent the data.\",\n-                                \"name\": \"tcp.sender\"\n-                            },\n+                        \"type\": \"org.apache.nifi.services.azure.storage.ADLSCredentialsControllerService\",\n+                        \"typeDescription\": \"Defines credentials for ADLS processors.\",\n+                        \"version\": \"1.27.0\"\n+                    },\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-azure-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"e0c4461\"\n+                        },\n+                        \"dynamicProperties\": [\n                             {\n-                                \"description\": \"The port that the processor accepted the connection on.\",\n-                                \"name\": \"tcp.port\"\n-                            },\n+                                \"description\": \"If 'adls.credentials.name' attribute contains the name of the dynamic property, then the ADLSCredentialsService (registered in the value) will be selected.\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"name\": \"The name to register ADLSCredentialsService\",\n+                                \"value\": \"The ADLSCredentialsService\"\n+                            }\n+                        ],\n+                        \"group\": \"org.apache.nifi\",\n+                        \"providedApiImplementations\": [\n                             {\n-                                \"description\": \"The number of records written to the flow file.\",\n-                                \"name\": \"record.count\"\n+                                \"artifact\": \"nifi-azure-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.services.azure.storage.ADLSCredentialsService\",\n+                                \"version\": \"1.27.0\"\n+                            }\n+                        ],\n+                        \"supportsDynamicProperties\": true,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"adls\",\n+                            \"azure\",\n+                            \"cloud\",\n+                            \"credentials\",\n+                            \"microsoft\",\n+                            \"storage\"\n+                        ],\n+                        \"type\": \"org.apache.nifi.services.azure.storage.ADLSCredentialsControllerServiceLookup\",\n+                        \"typeDescription\": \"Provides an ADLSCredentialsService that can be used to dynamically select another ADLSCredentialsService. This service requires an attribute named 'adls.credentials.name' to be passed in, and will throw an exception if the attribute is missing. The value of 'adls.credentials.name' will be used to select the ADLSCredentialsService that has been registered with that name. This will allow multiple ADLSCredentialsServices to be defined and registered, and then selected dynamically at runtime by tagging flow files with the appropriate 'adls.credentials.name' attribute.\",\n+                        \"version\": \"1.27.0\"\n+                    },\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-azure-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"e0c4461\"\n+                        },\n+                        \"group\": \"org.apache.nifi\",\n+                        \"propertyDescriptors\": {\n+                            \"storage-account-key\": {\n+                                \"description\": \"The storage account key. This is an admin-like password providing access to every container in this account. It is recommended one uses Shared Access Signature (SAS) token instead for fine-grained control with policies. There are certain risks in allowing the account key to be stored as a flowfile attribute. While it does provide for a more flexible flow by allowing the account key to be fetched dynamically from a flowfile attribute, care must be taken to restrict access to the event provenance data (e.g., by strictly controlling the policies governing provenance for this processor). In addition, the provenance repositories may be put on encrypted disk partitions.\",\n+                                \"displayName\": \"Storage Account Key\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"storage-account-key\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n                             },\n-                            {\n-                                \"description\": \"The mime-type of the writer used to write the records to the flow file.\",\n-                                \"name\": \"mime.type\"\n+                            \"storage-account-name\": {\n+                                \"description\": \"The storage account name. There are certain risks in allowing the account name to be stored as a flowfile attribute. While it does provide for a more flexible flow by allowing the account name to be fetched dynamically from a flowfile attribute, care must be taken to restrict access to the event provenance data (e.g., by strictly controlling the policies governing provenance for this processor). In addition, the provenance repositories may be put on encrypted disk partitions.\",\n+                                \"displayName\": \"Storage Account Name\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"storage-account-name\",\n+                                \"required\": true,\n+                                \"sensitive\": true\n                             },\n-                            {\n-                                \"description\": \"For connections using mutual TLS, the Distinguished Name of the Certificate Authority that issued the client's certificate is attached to the FlowFile.\",\n-                                \"name\": \"client.certificate.issuer.dn\"\n+                            \"storage-endpoint-suffix\": {\n+                                \"description\": \"Storage accounts in public Azure always use a common FQDN suffix. Override this endpoint suffix with a different suffix in certain circumstances (like Azure Stack or non-public Azure regions). The preferred way is to configure them through a controller service specified in the Storage Credentials property. The controller service can provide a common/shared configuration for multiple/all Azure processors. Furthermore, the credentials can also be looked up dynamically with the 'Lookup' version of the service.\",\n+                                \"displayName\": \"Common Storage Account Endpoint Suffix\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"storage-endpoint-suffix\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n                             },\n+                            \"storage-sas-token\": {\n+                                \"description\": \"Shared Access Signature token, including the leading '?'. Specify either SAS token (recommended) or Account Key. There are certain risks in allowing the SAS token to be stored as a flowfile attribute. While it does provide for a more flexible flow by allowing the SAS token to be fetched dynamically from a flowfile attribute, care must be taken to restrict access to the event provenance data (e.g., by strictly controlling the policies governing provenance for this processor). In addition, the provenance repositories may be put on encrypted disk partitions.\",\n+                                \"displayName\": \"SAS Token\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"storage-sas-token\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n+                            }\n+                        },\n+                        \"providedApiImplementations\": [\n                             {\n-                                \"description\": \"For connections using mutual TLS, the Distinguished Name of the client certificate's owner (subject) is attached to the FlowFile.\",\n-                                \"name\": \"client.certificate.subject.dn\"\n+                                \"artifact\": \"nifi-azure-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.services.azure.storage.AzureStorageCredentialsService\",\n+                                \"version\": \"1.27.0\"\n                             }\n-                        ]\n+                        ],\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"azure\",\n+                            \"blob\",\n+                            \"cloud\",\n+                            \"credentials\",\n+                            \"microsoft\",\n+                            \"queue\",\n+                            \"storage\"\n+                        ],\n+                        \"type\": \"org.apache.nifi.services.azure.storage.AzureStorageCredentialsControllerService\",\n+                        \"typeDescription\": \"Defines credentials for Azure Storage processors. Uses Account Name with Account Key or Account Name with SAS Token.\",\n+                        \"version\": \"1.27.0\"\n                     },\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-standard-nar\",\n+                        \"artifact\": \"nifi-azure-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n-                        \"defaultBulletinLevel\": \"WARN\",\n-                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": 1,\n-                            \"TIMER_DRIVEN\": 1\n+                        \"dynamicProperties\": [\n+                            {\n+                                \"description\": \"If 'azure.storage.credentials.name' attribute contains the name of the dynamic property, then the AzureStorageCredentialsService (registered in the value) will be selected.\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"name\": \"The name to register AzureStorageCredentialsService\",\n+                                \"value\": \"The AzureStorageCredentialsService\"\n+                            }\n+                        ],\n+                        \"group\": \"org.apache.nifi\",\n+                        \"providedApiImplementations\": [\n+                            {\n+                                \"artifact\": \"nifi-azure-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.services.azure.storage.AzureStorageCredentialsService\",\n+                                \"version\": \"1.27.0\"\n+                            }\n+                        ],\n+                        \"supportsDynamicProperties\": true,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"azure\",\n+                            \"blob\",\n+                            \"cloud\",\n+                            \"credentials\",\n+                            \"microsoft\",\n+                            \"queue\",\n+                            \"storage\"\n+                        ],\n+                        \"type\": \"org.apache.nifi.services.azure.storage.AzureStorageCredentialsControllerServiceLookup\",\n+                        \"typeDescription\": \"Provides an AzureStorageCredentialsService that can be used to dynamically select another AzureStorageCredentialsService. This service requires an attribute named 'azure.storage.credentials.name' to be passed in, and will throw an exception if the attribute is missing. The value of 'azure.storage.credentials.name' will be used to select the AzureStorageCredentialsService that has been registered with that name. This will allow multiple AzureStorageCredentialsServices to be defined and registered, and then selected dynamically at runtime by tagging flow files with the appropriate 'azure.storage.credentials.name' attribute.\",\n+                        \"version\": \"1.27.0\"\n+                    },\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-azure-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"e0c4461\"\n                         },\n-                        \"defaultPenaltyDuration\": \"30 sec\",\n-                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"0 sec\"\n+                        \"dynamicProperties\": [\n+                            {\n+                                \"description\": \"If 'azure.storage.credentials.name' attribute contains the name of the dynamic property, then the AzureStorageCredentialsService_v12 (registered in the value) will be selected.\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"name\": \"The name to register AzureStorageCredentialsService_v12\",\n+                                \"value\": \"The AzureStorageCredentialsService_v12\"\n+                            }\n+                        ],\n+                        \"group\": \"org.apache.nifi\",\n+                        \"providedApiImplementations\": [\n+                            {\n+                                \"artifact\": \"nifi-azure-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.services.azure.storage.AzureStorageCredentialsService_v12\",\n+                                \"version\": \"1.27.0\"\n+                            }\n+                        ],\n+                        \"supportsDynamicProperties\": true,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"azure\",\n+                            \"blob\",\n+                            \"cloud\",\n+                            \"credentials\",\n+                            \"microsoft\",\n+                            \"queue\",\n+                            \"storage\"\n+                        ],\n+                        \"type\": \"org.apache.nifi.services.azure.storage.AzureStorageCredentialsControllerServiceLookup_v12\",\n+                        \"typeDescription\": \"Provides an AzureStorageCredentialsService_v12 that can be used to dynamically select another AzureStorageCredentialsService_v12. This service requires an attribute named 'azure.storage.credentials.name' to be passed in, and will throw an exception if the attribute is missing. The value of 'azure.storage.credentials.name' will be used to select the AzureStorageCredentialsService_v12 that has been registered with that name. This will allow multiple AzureStorageCredentialsServices_v12 to be defined and registered, and then selected dynamically at runtime by tagging flow files with the appropriate 'azure.storage.credentials.name' attribute.\",\n+                        \"version\": \"1.27.0\"\n+                    },\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-azure-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"e0c4461\"\n                         },\n-                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n-                        \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n-                        \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Character Set\": {\n-                                \"defaultValue\": \"UTF-8\",\n-                                \"description\": \"Specifies the character set of the received data.\",\n-                                \"displayName\": \"Character Set\",\n+                            \"credentials-type\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"The primary or secondary Account Key of the storage account that provides full access to the resources in the account\",\n+                                        \"displayName\": \"Account Key\",\n+                                        \"value\": \"ACCOUNT_KEY\"\n+                                    },\n+                                    {\n+                                        \"description\": \"SAS (Shared Access Signature) Token generated for accessing resources in the storage account\",\n+                                        \"displayName\": \"SAS Token\",\n+                                        \"value\": \"SAS_TOKEN\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Azure Virtual Machine Managed Identity (it can only be used when NiFi is running on Azure)\",\n+                                        \"displayName\": \"Managed Identity\",\n+                                        \"value\": \"MANAGED_IDENTITY\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Azure Active Directory Service Principal with Client Id / Client Secret of a registered application\",\n+                                        \"displayName\": \"Service Principal\",\n+                                        \"value\": \"SERVICE_PRINCIPAL\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"SAS_TOKEN\",\n+                                \"description\": \"Credentials type to be used for authenticating to Azure\",\n+                                \"displayName\": \"Credentials Type\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"credentials-type\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"managed-identity-client-id\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"MANAGED_IDENTITY\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Credentials Type\",\n+                                        \"propertyName\": \"credentials-type\"\n+                                    }\n+                                ],\n+                                \"description\": \"Client ID of the managed identity. The property is required when User Assigned Managed Identity is used for authentication. It must be empty in case of System Assigned Managed Identity.\",\n+                                \"displayName\": \"Managed Identity Client ID\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"managed-identity-client-id\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n+                            },\n+                            \"proxy-configuration-service\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"SERVICE_PRINCIPAL\",\n+                                            \"MANAGED_IDENTITY\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Credentials Type\",\n+                                        \"propertyName\": \"credentials-type\"\n+                                    }\n+                                ],\n+                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests. Supported proxies: SOCKS, HTTP In case of SOCKS, it is not guaranteed that the selected SOCKS Version will be used by the processor.\",\n+                                \"displayName\": \"Proxy Configuration Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Character Set\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Local Network Interface\": {\n-                                \"description\": \"The name of a local network interface to be used to restrict listening to a specific LAN.\",\n-                                \"displayName\": \"Local Network Interface\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Local Network Interface\",\n+                                \"name\": \"proxy-configuration-service\",\n                                 \"required\": false,\n-                                \"sensitive\": false\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.proxy.ProxyConfigurationService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n                             },\n-                            \"Max Batch Size\": {\n-                                \"defaultValue\": \"1\",\n-                                \"description\": \"The maximum number of messages to add to a single FlowFile. If multiple messages are available, they will be concatenated along with the <Message Delimiter> up to this configured maximum number of messages\",\n-                                \"displayName\": \"Max Batch Size\",\n+                            \"service-principal-client-id\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"SERVICE_PRINCIPAL\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Credentials Type\",\n+                                        \"propertyName\": \"credentials-type\"\n+                                    }\n+                                ],\n+                                \"description\": \"Client ID (or Application ID) of the Client/Application having the Service Principal. The property is required when Service Principal authentication is used.\",\n+                                \"displayName\": \"Service Principal Client ID\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Max Batch Size\",\n+                                \"name\": \"service-principal-client-id\",\n                                 \"required\": true,\n-                                \"sensitive\": false\n+                                \"sensitive\": true\n                             },\n-                            \"Max Size of Message Queue\": {\n-                                \"defaultValue\": \"10000\",\n-                                \"description\": \"The maximum size of the internal queue used to buffer messages being transferred from the underlying channel to the processor. Setting this value higher allows more messages to be buffered in memory during surges of incoming messages, but increases the total memory used by the processor.\",\n-                                \"displayName\": \"Max Size of Message Queue\",\n+                            \"service-principal-client-secret\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"SERVICE_PRINCIPAL\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Credentials Type\",\n+                                        \"propertyName\": \"credentials-type\"\n+                                    }\n+                                ],\n+                                \"description\": \"Password of the Client/Application. The property is required when Service Principal authentication is used.\",\n+                                \"displayName\": \"Service Principal Client Secret\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Max Size of Message Queue\",\n+                                \"name\": \"service-principal-client-secret\",\n                                 \"required\": true,\n-                                \"sensitive\": false\n+                                \"sensitive\": true\n                             },\n-                            \"Max Size of Socket Buffer\": {\n-                                \"defaultValue\": \"1 MB\",\n-                                \"description\": \"The maximum size of the socket buffer that should be used. This is a suggestion to the Operating System to indicate how big the socket buffer should be. If this value is set too low, the buffer may fill up before the data can be read, and incoming data will be dropped.\",\n-                                \"displayName\": \"Max Size of Socket Buffer\",\n+                            \"service-principal-tenant-id\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"SERVICE_PRINCIPAL\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Credentials Type\",\n+                                        \"propertyName\": \"credentials-type\"\n+                                    }\n+                                ],\n+                                \"description\": \"Tenant ID of the Azure Active Directory hosting the Service Principal. The property is required when Service Principal authentication is used.\",\n+                                \"displayName\": \"Service Principal Tenant ID\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Max Size of Socket Buffer\",\n+                                \"name\": \"service-principal-tenant-id\",\n                                 \"required\": true,\n-                                \"sensitive\": false\n+                                \"sensitive\": true\n                             },\n-                            \"Message Delimiter\": {\n-                                \"defaultValue\": \"\\\\n\",\n-                                \"description\": \"Specifies the delimiter to place between messages when multiple messages are bundled together (see <Max Batch Size> property).\",\n-                                \"displayName\": \"Batching Message Delimiter\",\n+                            \"storage-account-key\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"ACCOUNT_KEY\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Credentials Type\",\n+                                        \"propertyName\": \"credentials-type\"\n+                                    }\n+                                ],\n+                                \"description\": \"The storage account key. This is an admin-like password providing access to every container in this account. It is recommended one uses Shared Access Signature (SAS) token instead for fine-grained control with policies.\",\n+                                \"displayName\": \"Account Key\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Message Delimiter\",\n+                                \"name\": \"storage-account-key\",\n                                 \"required\": true,\n-                                \"sensitive\": false\n+                                \"sensitive\": true\n                             },\n-                            \"Port\": {\n-                                \"description\": \"The port to listen on for communication.\",\n-                                \"displayName\": \"Port\",\n+                            \"storage-account-name\": {\n+                                \"description\": \"The storage account name.\",\n+                                \"displayName\": \"Storage Account Name\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Port\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"storage-account-name\",\n                                 \"required\": true,\n-                                \"sensitive\": false\n+                                \"sensitive\": true\n                             },\n-                            \"Receive Buffer Size\": {\n-                                \"defaultValue\": \"65507 B\",\n-                                \"description\": \"The size of each buffer used to receive messages. Adjust this value appropriately based on the expected size of the incoming messages.\",\n-                                \"displayName\": \"Receive Buffer Size\",\n+                            \"storage-endpoint-suffix\": {\n+                                \"defaultValue\": \"blob.core.windows.net\",\n+                                \"description\": \"Storage accounts in public Azure always use a common FQDN suffix. Override this endpoint suffix with a different suffix in certain circumstances (like Azure Stack or non-public Azure regions).\",\n+                                \"displayName\": \"Endpoint Suffix\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Receive Buffer Size\",\n+                                \"name\": \"storage-endpoint-suffix\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Sending Host\": {\n-                                \"description\": \"IP, or name, of a remote host. Only Datagrams from the specified Sending Host Port and this host will be accepted. Improves Performance. May be a system property or an environment variable.\",\n-                                \"displayName\": \"Sending Host\",\n+                            \"storage-sas-token\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"SAS_TOKEN\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Credentials Type\",\n+                                        \"propertyName\": \"credentials-type\"\n+                                    }\n+                                ],\n+                                \"description\": \"Shared Access Signature token, including the leading '?'. Specify either SAS token (recommended) or Account Key.\",\n+                                \"displayName\": \"SAS Token\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Sending Host\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Sending Host Port\": {\n-                                \"description\": \"Port being used by remote host to send Datagrams. Only Datagrams from the specified Sending Host and this port will be accepted. Improves Performance. May be a system property or an environment variable.\",\n-                                \"displayName\": \"Sending Host Port\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"storage-sas-token\",\n+                                \"required\": true,\n+                                \"sensitive\": true\n+                            }\n+                        },\n+                        \"providedApiImplementations\": [\n+                            {\n+                                \"artifact\": \"nifi-azure-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.services.azure.storage.AzureStorageCredentialsService_v12\",\n+                                \"version\": \"1.27.0\"\n+                            }\n+                        ],\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"azure\",\n+                            \"blob\",\n+                            \"cloud\",\n+                            \"credentials\",\n+                            \"microsoft\",\n+                            \"queue\",\n+                            \"storage\"\n+                        ],\n+                        \"type\": \"org.apache.nifi.services.azure.storage.AzureStorageCredentialsControllerService_v12\",\n+                        \"typeDescription\": \"Provides credentials for Azure Storage processors using Azure Storage client library v12.\",\n+                        \"version\": \"1.27.0\"\n+                    },\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-azure-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"e0c4461\"\n+                        },\n+                        \"group\": \"org.apache.nifi\",\n+                        \"propertyDescriptors\": {\n+                            \"azurite-uri\": {\n+                                \"description\": \"URI to connect to Azure Storage Emulator (Azurite)\",\n+                                \"displayName\": \"Storage Emulator URI\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Sending Host Port\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"azurite-uri\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             }\n                         },\n-                        \"sideEffectFree\": false,\n-                        \"supportedRelationships\": [\n+                        \"providedApiImplementations\": [\n                             {\n-                                \"description\": \"Messages received successfully will be sent out this relationship.\",\n-                                \"name\": \"success\"\n+                                \"artifact\": \"nifi-azure-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.services.azure.storage.AzureStorageCredentialsService\",\n+                                \"version\": \"1.27.0\"\n                             }\n                         ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": true,\n                         \"supportsDynamicProperties\": false,\n-                        \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"ingest\",\n-                            \"listen\",\n-                            \"source\",\n-                            \"udp\"\n+                            \"azure\",\n+                            \"blob\",\n+                            \"credentials\",\n+                            \"emulator\",\n+                            \"microsoft\",\n+                            \"queue\",\n+                            \"storage\"\n                         ],\n-                        \"triggerSerially\": false,\n-                        \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.standard.ListenUDP\",\n-                        \"typeDescription\": \"Listens for Datagram Packets on a given port. The default behavior produces a FlowFile per datagram, however for higher throughput the Max Batch Size property may be increased to specify the number of datagrams to batch together in a single FlowFile. This processor can be restricted to listening for datagrams from  a specific remote host and port by specifying the Sending Host and Sending Host Port properties, otherwise it will listen for datagrams from all hosts and ports.\",\n-                        \"version\": \"1.27.0\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"The sending host of the messages.\",\n-                                \"name\": \"udp.sender\"\n-                            },\n-                            {\n-                                \"description\": \"The sending port the messages were received.\",\n-                                \"name\": \"udp.port\"\n-                            }\n-                        ]\n-                    },\n+                        \"type\": \"org.apache.nifi.services.azure.storage.AzureStorageEmulatorCredentialsControllerService\",\n+                        \"typeDescription\": \"Defines credentials for Azure Storage processors that connects to Azurite emulator.\",\n+                        \"version\": \"1.27.0\"\n+                    }\n+                ],\n+                \"processors\": [\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-standard-nar\",\n+                        \"artifact\": \"nifi-azure-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n+                            \"EVENT_DRIVEN\": 0,\n                             \"TIMER_DRIVEN\": 1\n                         },\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Character Set\": {\n-                                \"defaultValue\": \"UTF-8\",\n-                                \"description\": \"Specifies the character set of the received data.\",\n-                                \"displayName\": \"Character Set\",\n+                            \"azure-cosmos-db-conflict-handling-strategy\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"Conflicting records will not be inserted, and FlowFile will not be routed to failure\",\n+                                        \"displayName\": \"Ignore\",\n+                                        \"value\": \"IGNORE\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Conflicting records will be upserted, and FlowFile will not be routed to failure\",\n+                                        \"displayName\": \"Upsert\",\n+                                        \"value\": \"UPSERT\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"IGNORE\",\n+                                \"description\": \"Choose whether to ignore or upsert when conflict error occurs during insertion\",\n+                                \"displayName\": \"Cosmos DB Conflict Handling Strategy\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Character Set\",\n-                                \"required\": true,\n+                                \"name\": \"azure-cosmos-db-conflict-handling-strategy\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Local Network Interface\": {\n-                                \"description\": \"The name of a local network interface to be used to restrict listening to a specific LAN.\",\n-                                \"displayName\": \"Local Network Interface\",\n+                            \"azure-cosmos-db-connection-service\": {\n+                                \"description\": \"If configured, the controller service used to obtain the connection string and access key\",\n+                                \"displayName\": \"Cosmos DB Connection Service\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Local Network Interface\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"azure-cosmos-db-connection-service\",\n                                 \"required\": false,\n-                                \"sensitive\": false\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-azure-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.services.azure.cosmos.AzureCosmosDBConnectionService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n                             },\n-                            \"Max Size of Message Queue\": {\n-                                \"defaultValue\": \"10000\",\n-                                \"description\": \"The maximum size of the internal queue used to buffer messages being transferred from the underlying channel to the processor. Setting this value higher allows more messages to be buffered in memory during surges of incoming messages, but increases the total memory used by the processor.\",\n-                                \"displayName\": \"Max Size of Message Queue\",\n+                            \"azure-cosmos-db-consistency-level\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"STRONG\",\n+                                        \"value\": \"STRONG\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"BOUNDED_STALENESS\",\n+                                        \"value\": \"BOUNDED_STALENESS\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"SESSION\",\n+                                        \"value\": \"SESSION\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"CONSISTENT_PREFIX\",\n+                                        \"value\": \"CONSISTENT_PREFIX\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"EVENTUAL\",\n+                                        \"value\": \"EVENTUAL\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"SESSION\",\n+                                \"description\": \"Choose from five consistency levels on the consistency spectrum. Refer to Cosmos DB documentation for their differences\",\n+                                \"displayName\": \"Cosmos DB Consistency Level\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Max Size of Message Queue\",\n-                                \"required\": true,\n+                                \"name\": \"azure-cosmos-db-consistency-level\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Max Size of Socket Buffer\": {\n-                                \"defaultValue\": \"1 MB\",\n-                                \"description\": \"The maximum size of the socket buffer that should be used. This is a suggestion to the Operating System to indicate how big the socket buffer should be. If this value is set too low, the buffer may fill up before the data can be read, and incoming data will be dropped.\",\n-                                \"displayName\": \"Max Size of Socket Buffer\",\n+                            \"azure-cosmos-db-container-id\": {\n+                                \"description\": \"The unique identifier for the container\",\n+                                \"displayName\": \"Cosmos DB Container ID\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Max Size of Socket Buffer\",\n+                                \"name\": \"azure-cosmos-db-container-id\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Port\": {\n-                                \"description\": \"The port to listen on for communication.\",\n-                                \"displayName\": \"Port\",\n+                            \"azure-cosmos-db-key\": {\n+                                \"description\": \"Cosmos DB Access Key from Azure Portal (Settings->Keys). Choose a read-write key to enable database or container creation at run time\",\n+                                \"displayName\": \"Cosmos DB Access Key\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Port\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"azure-cosmos-db-key\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n                             },\n-                            \"Receive Buffer Size\": {\n-                                \"defaultValue\": \"65507 B\",\n-                                \"description\": \"The size of each buffer used to receive messages. Adjust this value appropriately based on the expected size of the incoming messages.\",\n-                                \"displayName\": \"Receive Buffer Size\",\n+                            \"azure-cosmos-db-name\": {\n+                                \"description\": \"The database name or id. This is used as the namespace for document collections or containers\",\n+                                \"displayName\": \"Cosmos DB Name\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Receive Buffer Size\",\n+                                \"name\": \"azure-cosmos-db-name\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"batch-size\": {\n-                                \"defaultValue\": \"1000\",\n-                                \"description\": \"The maximum number of datagrams to write as records to a single FlowFile. The Batch Size will only be reached when data is coming in more frequently than the Poll Timeout.\",\n-                                \"displayName\": \"Batch Size\",\n+                            \"azure-cosmos-db-partition-key\": {\n+                                \"description\": \"The partition key used to distribute data among servers\",\n+                                \"displayName\": \"Cosmos DB Partition Key\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"batch-size\",\n+                                \"name\": \"azure-cosmos-db-partition-key\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"poll-timeout\": {\n-                                \"defaultValue\": \"50 ms\",\n-                                \"description\": \"The amount of time to wait when polling the internal queue for more datagrams. If no datagrams are found after waiting for the configured timeout, then the processor will emit whatever records have been obtained up to that point.\",\n-                                \"displayName\": \"Poll Timeout\",\n+                            \"azure-cosmos-db-uri\": {\n+                                \"description\": \"Cosmos DB URI, typically in the form of https://{databaseaccount}.documents.azure.com:443/ Note this host URL is for Cosmos DB with Core SQL API from Azure Portal (Overview->URI)\",\n+                                \"displayName\": \"Cosmos DB URI\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"poll-timeout\",\n-                                \"required\": true,\n+                                \"name\": \"azure-cosmos-db-uri\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n+                            },\n+                            \"insert-batch-size\": {\n+                                \"defaultValue\": \"20\",\n+                                \"description\": \"The number of records to group together for one single insert operation against Cosmos DB\",\n+                                \"displayName\": \"Insert Batch Size\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"insert-batch-size\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n                             \"record-reader\": {\n-                                \"description\": \"The Record Reader to use for reading the content of incoming datagrams.\",\n+                                \"description\": \"Specifies the Controller Service to use for parsing incoming data and determining the data's schema\",\n                                 \"displayName\": \"Record Reader\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n                                 \"name\": \"record-reader\",\n                                 \"required\": true,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n                                     \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n                                     \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n                                     \"version\": \"1.27.0\"\n                                 }\n-                            },\n-                            \"record-writer\": {\n-                                \"description\": \"The Record Writer to use in order to serialize the data before writing to a flow file.\",\n-                                \"displayName\": \"Record Writer\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"record-writer\",\n-                                \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            },\n-                            \"sending-host\": {\n-                                \"description\": \"IP, or name, of a remote host. Only Datagrams from the specified Sending Host Port and this host will be accepted. Improves Performance. May be a system property or an environment variable.\",\n-                                \"displayName\": \"Sending Host\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"sending-host\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"sending-host-port\": {\n-                                \"description\": \"Port being used by remote host to send Datagrams. Only Datagrams from the specified Sending Host and this port will be accepted. Improves Performance. May be a system property or an environment variable.\",\n-                                \"displayName\": \"Sending Host Port\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"sending-host-port\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n                             }\n                         },\n                         \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"Messages received successfully will be sent out this relationship.\",\n+                                \"description\": \"All FlowFiles that are written to Cosmos DB are routed to this relationship\",\n                                 \"name\": \"success\"\n                             },\n                             {\n-                                \"description\": \"If a datagram cannot be parsed using the configured Record Reader, the contents of the message will be routed to this Relationship as its own individual FlowFile.\",\n-                                \"name\": \"parse.failure\"\n+                                \"description\": \"All FlowFiles that cannot be written to Cosmos DB are routed to this relationship\",\n+                                \"name\": \"failure\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n+                            \"CRON_DRIVEN\",\n+                            \"EVENT_DRIVEN\"\n                         ],\n-                        \"supportsBatching\": true,\n+                        \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": false,\n+                        \"supportsEventDriven\": true,\n                         \"supportsSensitiveDynamicProperties\": false,\n+                        \"systemResourceConsiderations\": [\n+                            {\n+                                \"description\": \"An instance of this component can cause high usage of this system resource.  Multiple instances or high concurrency settings may result a degradation of performance.\",\n+                                \"resource\": \"MEMORY\"\n+                            }\n+                        ],\n                         \"tags\": [\n-                            \"ingest\",\n-                            \"listen\",\n-                            \"record\",\n-                            \"source\",\n-                            \"udp\"\n+                            \"azure\",\n+                            \"cosmos\",\n+                            \"insert\",\n+                            \"put\",\n+                            \"record\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.standard.ListenUDPRecord\",\n-                        \"typeDescription\": \"Listens for Datagram Packets on a given port and reads the content of each datagram using the configured Record Reader. Each record will then be written to a flow file using the configured Record Writer. This processor can be restricted to listening for datagrams from  a specific remote host and port by specifying the Sending Host and Sending Host Port properties, otherwise it will listen for datagrams from all hosts and ports.\",\n-                        \"version\": \"1.27.0\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"The sending host of the messages.\",\n-                                \"name\": \"udp.sender\"\n-                            },\n-                            {\n-                                \"description\": \"The sending port the messages were received.\",\n-                                \"name\": \"udp.port\"\n-                            },\n-                            {\n-                                \"description\": \"The number of records written to the flow file.\",\n-                                \"name\": \"record.count\"\n-                            },\n-                            {\n-                                \"description\": \"The mime-type of the writer used to write the records to the flow file.\",\n-                                \"name\": \"mime.type\"\n-                            }\n-                        ]\n+                        \"type\": \"org.apache.nifi.processors.azure.cosmos.document.PutAzureCosmosDBRecord\",\n+                        \"typeDescription\": \"This processor is a record-aware processor for inserting data into Cosmos DB with Core SQL API. It uses a configured record reader and schema to read an incoming record set from the body of a Flowfile and then inserts those records into a configured Cosmos DB Container.\",\n+                        \"version\": \"1.27.0\"\n                     },\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-standard-nar\",\n+                        \"artifact\": \"nifi-azure-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n-                            \"EVENT_DRIVEN\": 0,\n                             \"TIMER_DRIVEN\": 1\n                         },\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_REQUIRED\",\n+                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Attributes to Ignore\": {\n-                                \"description\": \"A comma-separated list of Attributes to ignore. If not specified, no attributes will be ignored unless `Attributes to Ignore by Regular Expression` is modified. There's an OR relationship between the two properties.\",\n-                                \"displayName\": \"Attributes to Ignore\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Attributes to Ignore\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Attributes to Log\": {\n-                                \"description\": \"A comma-separated list of Attributes to Log. If not specified, all attributes will be logged unless `Attributes to Log by Regular Expression` is modified. There's an AND relationship between the two properties.\",\n-                                \"displayName\": \"Attributes to Log\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Attributes to Log\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Log FlowFile Properties\": {\n+                            \"Service Bus Endpoint\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"description\": \"Servicebus endpoint for general use\",\n+                                        \"displayName\": \"Azure\",\n+                                        \"value\": \".servicebus.windows.net\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"description\": \"Servicebus endpoint for China\",\n+                                        \"displayName\": \"Azure China\",\n+                                        \"value\": \".servicebus.chinacloudapi.cn\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Servicebus endpoint for Germany\",\n+                                        \"displayName\": \"Azure Germany\",\n+                                        \"value\": \".servicebus.cloudapi.de\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Servicebus endpoint for US Government\",\n+                                        \"displayName\": \"Azure US Government\",\n+                                        \"value\": \".servicebus.usgovcloudapi.net\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"true\",\n-                                \"description\": \"Specifies whether or not to log FlowFile \\\"properties\\\", such as Entry Date, Lineage Start Date, and content size\",\n-                                \"displayName\": \"Log FlowFile Properties\",\n+                                \"defaultValue\": \".servicebus.windows.net\",\n+                                \"description\": \"To support namespaces not in the default windows.net domain.\",\n+                                \"displayName\": \"Service Bus Endpoint\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Log FlowFile Properties\",\n+                                \"name\": \"Service Bus Endpoint\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Log Level\": {\n+                            \"Transport Type\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"trace\",\n-                                        \"value\": \"trace\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"debug\",\n-                                        \"value\": \"debug\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"info\",\n-                                        \"value\": \"info\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"warn\",\n-                                        \"value\": \"warn\"\n+                                        \"description\": \"AMQP over TCP on ports 5671 and 5672\",\n+                                        \"displayName\": \"AMQP\",\n+                                        \"value\": \"Amqp\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"error\",\n-                                        \"value\": \"error\"\n+                                        \"description\": \"AMQP over HTTPS with WebSockets on port 443\",\n+                                        \"displayName\": \"AMQP_WEB_SOCKETS\",\n+                                        \"value\": \"AmqpWebSockets\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"info\",\n-                                \"description\": \"The Log Level to use when logging the Attributes\",\n-                                \"displayName\": \"Log Level\",\n+                                \"defaultValue\": \"Amqp\",\n+                                \"description\": \"Advanced Message Queuing Protocol Transport Type for communication with Azure Event Hubs\",\n+                                \"displayName\": \"Transport Type\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Log Level\",\n+                                \"name\": \"Transport Type\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Log Payload\": {\n+                            \"checkpoint-strategy\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"description\": \"Use Azure Blob Storage to store partition ownership and checkpoint information\",\n+                                        \"displayName\": \"Azure Blob Storage\",\n+                                        \"value\": \"AZURE_BLOB_STORAGE\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"description\": \"Use component state to store partition ownership and checkpoint information\",\n+                                        \"displayName\": \"Component State\",\n+                                        \"value\": \"COMPONENT_STATE\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"If true, the FlowFile's payload will be logged, in addition to its attributes; otherwise, just the Attributes will be logged.\",\n-                                \"displayName\": \"Log Payload\",\n+                                \"defaultValue\": \"AZURE_BLOB_STORAGE\",\n+                                \"description\": \"Specifies which strategy to use for storing and retrieving partition ownership and checkpoint information for each partition.\",\n+                                \"displayName\": \"Checkpoint Strategy\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Log Payload\",\n+                                \"name\": \"checkpoint-strategy\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Log prefix\": {\n-                                \"description\": \"Log prefix appended to the log lines. It helps to distinguish the output of multiple LogAttribute processors.\",\n-                                \"displayName\": \"Log prefix\",\n+                            \"event-hub-batch-size\": {\n+                                \"defaultValue\": \"10\",\n+                                \"description\": \"The number of messages to process within a NiFi session. This parameter affects throughput and consistency. NiFi commits its session and Event Hubs checkpoints after processing this number of messages. If NiFi session is committed, but fails to create an Event Hubs checkpoint, then it is possible that the same messages will be received again. The higher number, the higher throughput, but possibly less consistent.\",\n+                                \"displayName\": \"Batch Size\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Log prefix\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"event-hub-batch-size\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"event-hub-consumer-group\": {\n+                                \"defaultValue\": \"$Default\",\n+                                \"description\": \"The name of the consumer group to use.\",\n+                                \"displayName\": \"Consumer Group\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"event-hub-consumer-group\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"event-hub-consumer-hostname\": {\n+                                \"description\": \"DEPRECATED: This property is no longer used.\",\n+                                \"displayName\": \"Consumer Hostname\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"event-hub-consumer-hostname\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Output Format\": {\n+                            \"event-hub-initial-offset\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Each FlowFile attribute will be logged using a single line for the attribute name and another line for the attribute value. This format is often most advantageous when looking at the attributes of a single FlowFile.\",\n-                                        \"displayName\": \"Line per Attribute\",\n-                                        \"value\": \"Line per Attribute\"\n+                                        \"description\": \"Read from the oldest message retained in the stream.\",\n+                                        \"displayName\": \"Start of stream\",\n+                                        \"value\": \"start-of-stream\"\n                                     },\n                                     {\n-                                        \"description\": \"All FlowFile attribute names and values will be logged on a single line. This format is often most advantageous when comparing logs from multiple FlowFiles.\",\n-                                        \"displayName\": \"Single Line\",\n-                                        \"value\": \"Single Line\"\n+                                        \"description\": \"Ignore old retained messages even if exist, start reading new ones from now.\",\n+                                        \"displayName\": \"End of stream\",\n+                                        \"value\": \"end-of-stream\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"Line per Attribute\",\n-                                \"description\": \"Specifies the format to use for logging FlowFile attributes\",\n-                                \"displayName\": \"Output Format\",\n+                                \"defaultValue\": \"end-of-stream\",\n+                                \"description\": \"Specify where to start receiving messages if offset is not yet stored in the checkpoint store.\",\n+                                \"displayName\": \"Initial Offset\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Output Format\",\n+                                \"name\": \"event-hub-initial-offset\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"attributes-to-ignore-regex\": {\n-                                \"description\": \"A regular expression indicating the Attributes to Ignore. If not specified, no attributes will be ignored unless `Attributes to Ignore` is modified. There's an OR relationship between the two properties.\",\n-                                \"displayName\": \"Attributes to Ignore by Regular Expression\",\n+                            \"event-hub-message-receive-timeout\": {\n+                                \"defaultValue\": \"1 min\",\n+                                \"description\": \"The amount of time this consumer should wait to receive the Batch Size before returning.\",\n+                                \"displayName\": \"Message Receive Timeout\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"attributes-to-ignore-regex\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"event-hub-message-receive-timeout\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"attributes-to-log-regex\": {\n-                                \"defaultValue\": \".*\",\n-                                \"description\": \"A regular expression indicating the Attributes to Log. If not specified, all attributes will be logged unless `Attributes to Log` is modified. There's an AND relationship between the two properties.\",\n-                                \"displayName\": \"Attributes to Log by Regular Expression\",\n+                            \"event-hub-name\": {\n+                                \"description\": \"The name of the event hub to pull messages from.\",\n+                                \"displayName\": \"Event Hub Name\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"attributes-to-log-regex\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"event-hub-name\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"character-set\": {\n-                                \"defaultValue\": \"UTF-8\",\n-                                \"description\": \"The name of the CharacterSet to use\",\n-                                \"displayName\": \"Character Set\",\n+                            \"event-hub-namespace\": {\n+                                \"description\": \"The namespace that the Azure Event Hubs is assigned to. This is generally equal to <Event Hub Names>-ns.\",\n+                                \"displayName\": \"Event Hub Namespace\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"character-set\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"event-hub-namespace\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n-                            }\n-                        },\n-                        \"sideEffectFree\": true,\n-                        \"supportedRelationships\": [\n-                            {\n-                                \"description\": \"All FlowFiles are routed to this relationship\",\n-                                \"name\": \"success\"\n-                            }\n-                        ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\",\n-                            \"EVENT_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": true,\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": true,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"attributes\",\n-                            \"logging\"\n-                        ],\n-                        \"triggerSerially\": false,\n-                        \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.standard.LogAttribute\",\n-                        \"typeDescription\": \"Emits attributes of the FlowFile at the specified log level\",\n-                        \"version\": \"1.27.0\"\n-                    },\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-standard-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"e0c4461\"\n-                        },\n-                        \"defaultBulletinLevel\": \"WARN\",\n-                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": 1,\n-                            \"EVENT_DRIVEN\": 0,\n-                            \"TIMER_DRIVEN\": 1\n-                        },\n-                        \"defaultPenaltyDuration\": \"30 sec\",\n-                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"0 sec\"\n-                        },\n-                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n-                        \"defaultYieldDuration\": \"1 sec\",\n-                        \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_REQUIRED\",\n-                        \"primaryNodeOnly\": false,\n-                        \"propertyDescriptors\": {\n-                            \"log-level\": {\n-                                \"defaultValue\": \"info\",\n-                                \"description\": \"The Log Level to use when logging the message: [trace, debug, info, warn, error]\",\n-                                \"displayName\": \"Log Level\",\n+                            },\n+                            \"event-hub-prefetch-count\": {\n+                                \"defaultValue\": \"300\",\n+                                \"description\": \"\",\n+                                \"displayName\": \"Prefetch Count\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"log-level\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"event-hub-prefetch-count\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"log-message\": {\n-                                \"description\": \"The log message to emit\",\n-                                \"displayName\": \"Log message\",\n+                            \"event-hub-shared-access-policy-name\": {\n+                                \"description\": \"The name of the shared access policy. This policy must have Listen claims.\",\n+                                \"displayName\": \"Shared Access Policy Name\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"log-message\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"event-hub-shared-access-policy-name\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"log-prefix\": {\n-                                \"description\": \"Log prefix appended to the log lines. It helps to distinguish the output of multiple LogMessage processors.\",\n-                                \"displayName\": \"Log prefix\",\n+                            \"event-hub-shared-access-policy-primary-key\": {\n+                                \"description\": \"The key of the shared access policy. Either the primary or the secondary key can be used.\",\n+                                \"displayName\": \"Shared Access Policy Key\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"log-prefix\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"event-hub-shared-access-policy-primary-key\",\n                                 \"required\": false,\n-                                \"sensitive\": false\n-                            }\n-                        },\n-                        \"sideEffectFree\": true,\n-                        \"supportedRelationships\": [\n-                            {\n-                                \"description\": \"All FlowFiles are routed to this relationship\",\n-                                \"name\": \"success\"\n-                            }\n-                        ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\",\n-                            \"EVENT_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": true,\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": true,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"attributes\",\n-                            \"logging\"\n-                        ],\n-                        \"triggerSerially\": false,\n-                        \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.standard.LogMessage\",\n-                        \"typeDescription\": \"Emits a log message at the specified log level\",\n-                        \"version\": \"1.27.0\"\n-                    },\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-standard-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"e0c4461\"\n-                        },\n-                        \"defaultBulletinLevel\": \"WARN\",\n-                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": 1,\n-                            \"EVENT_DRIVEN\": 0,\n-                            \"TIMER_DRIVEN\": 1\n-                        },\n-                        \"defaultPenaltyDuration\": \"30 sec\",\n-                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"0 sec\"\n-                        },\n-                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n-                        \"defaultYieldDuration\": \"1 sec\",\n-                        \"dynamicProperties\": [\n-                            {\n-                                \"description\": \"Adds a FlowFile attribute specified by the dynamic property's key with the value found in the lookup service using the the dynamic property's value\",\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"name\": \"The name of the attribute to add to the FlowFile\",\n-                                \"value\": \"The name of the key or property to retrieve from the lookup service\"\n-                            }\n-                        ],\n-                        \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_REQUIRED\",\n-                        \"primaryNodeOnly\": false,\n-                        \"propertyDescriptors\": {\n-                            \"include-empty-values\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n+                                \"sensitive\": true\n+                            },\n+                            \"proxy-configuration-service\": {\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"dependentValues\": [\n+                                            \"AmqpWebSockets\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Transport Type\",\n+                                        \"propertyName\": \"Transport Type\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"true\",\n-                                \"description\": \"Include null or blank values for keys that are null or blank\",\n-                                \"displayName\": \"Include Empty Values\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"include-empty-values\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"lookup-service\": {\n-                                \"description\": \"The lookup service to use for attribute lookups\",\n-                                \"displayName\": \"Lookup Service\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"lookup-service\",\n-                                \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.lookup.StringLookupService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            }\n-                        },\n-                        \"sideEffectFree\": true,\n-                        \"supportedRelationships\": [\n-                            {\n-                                \"description\": \"FlowFiles with failing lookups are routed to this relationship\",\n-                                \"name\": \"failure\"\n-                            },\n-                            {\n-                                \"description\": \"FlowFiles with missing lookups are routed to this relationship\",\n-                                \"name\": \"unmatched\"\n-                            },\n-                            {\n-                                \"description\": \"FlowFiles with matching lookups are routed to this relationship\",\n-                                \"name\": \"matched\"\n-                            }\n-                        ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\",\n-                            \"EVENT_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": true,\n-                        \"supportsDynamicProperties\": true,\n-                        \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": true,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"Attribute Expression Language\",\n-                            \"attributes\",\n-                            \"cache\",\n-                            \"enrich\",\n-                            \"join\",\n-                            \"lookup\"\n-                        ],\n-                        \"triggerSerially\": false,\n-                        \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.standard.LookupAttribute\",\n-                        \"typeDescription\": \"Lookup attributes from a lookup service\",\n-                        \"version\": \"1.27.0\"\n-                    },\n-                    {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-standard-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"e0c4461\"\n-                        },\n-                        \"defaultBulletinLevel\": \"WARN\",\n-                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": 1,\n-                            \"EVENT_DRIVEN\": 0,\n-                            \"TIMER_DRIVEN\": 1\n-                        },\n-                        \"defaultPenaltyDuration\": \"30 sec\",\n-                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"0 sec\"\n-                        },\n-                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n-                        \"defaultYieldDuration\": \"1 sec\",\n-                        \"dynamicProperties\": [\n-                            {\n-                                \"description\": \"A RecordPath that points to the field whose value will be looked up in the configured Lookup Service\",\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"name\": \"Value To Lookup\",\n-                                \"value\": \"Valid Record Path\"\n-                            }\n-                        ],\n-                        \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_REQUIRED\",\n-                        \"primaryNodeOnly\": false,\n-                        \"propertyDescriptors\": {\n-                            \"lookup-service\": {\n-                                \"description\": \"The Lookup Service to use in order to lookup a value in each Record\",\n-                                \"displayName\": \"Lookup Service\",\n+                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests. Supported proxies: HTTP + AuthN\",\n+                                \"displayName\": \"Proxy Configuration Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"lookup-service\",\n-                                \"required\": true,\n+                                \"name\": \"proxy-configuration-service\",\n+                                \"required\": false,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n                                     \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.lookup.LookupService\",\n+                                    \"type\": \"org.apache.nifi.proxy.ProxyConfigurationService\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             },\n-                            \"record-path-lookup-miss-result-cache-size\": {\n-                                \"defaultValue\": \"0\",\n-                                \"description\": \"Specifies how many lookup values/records should be cached.Setting this property to zero means no caching will be done and the table will be queried for each lookup value in each record. If the lookup table changes often or the most recent data must be retrieved, do not use the cache.\",\n-                                \"displayName\": \"Cache Size\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"record-path-lookup-miss-result-cache-size\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n                             \"record-reader\": {\n-                                \"description\": \"Specifies the Controller Service to use for reading incoming data\",\n+                                \"description\": \"The Record Reader to use for reading received messages. The event hub name can be referred by Expression Language '${eventhub.name}' to access a schema.\",\n                                 \"displayName\": \"Record Reader\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n                                 \"name\": \"record-reader\",\n-                                \"required\": true,\n+                                \"required\": false,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n                                     \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n                                     \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             },\n-                            \"record-update-strategy\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"The \\\"Result RecordPath\\\" property will be ignored and the lookup service must be a single simple key lookup service. Every dynamic property value should be a record path. For each dynamic property, the value contained in the field corresponding to the record path will be used as the key in the Lookup Service and the value returned by the Lookup Service will be used to replace the existing value. It is possible to configure multiple dynamic properties to replace multiple values in one execution. This strategy only supports simple types replacements (strings, integers, etc).\",\n-                                        \"displayName\": \"Replace Existing Values\",\n-                                        \"value\": \"replace-existing-values\"\n-                                    },\n-                                    {\n-                                        \"description\": \"The \\\"Result RecordPath\\\" property will be used to determine which part of the record should be updated with the value returned by the Lookup Service\",\n-                                        \"displayName\": \"Use Property\",\n-                                        \"value\": \"use-property\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"use-property\",\n-                                \"description\": \"This property defines the strategy to use when updating the record with the value returned by the Lookup Service.\",\n-                                \"displayName\": \"Record Update Strategy\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"record-update-strategy\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n                             \"record-writer\": {\n-                                \"description\": \"Specifies the Controller Service to use for writing out the records\",\n+                                \"description\": \"The Record Writer to use for serializing Records to an output FlowFile. The event hub name can be referred by Expression Language '${eventhub.name}' to access a schema. If not specified, each message will create a FlowFile.\",\n                                 \"displayName\": \"Record Writer\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n                                 \"name\": \"record-writer\",\n-                                \"required\": true,\n+                                \"required\": false,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n                                     \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n                                     \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             },\n-                            \"result-contents\": {\n-                                \"allowableValues\": [\n+                            \"storage-account-key\": {\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"The entire Record that is retrieved from the Lookup Service will be inserted into the destination path.\",\n-                                        \"displayName\": \"Insert Entire Record\",\n-                                        \"value\": \"insert-entire-record\"\n-                                    },\n+                                        \"dependentValues\": [\n+                                            \"AZURE_BLOB_STORAGE\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Checkpoint Strategy\",\n+                                        \"propertyName\": \"checkpoint-strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"The Azure Storage account key to store event hub consumer group state.\",\n+                                \"displayName\": \"Storage Account Key\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"storage-account-key\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n+                            },\n+                            \"storage-account-name\": {\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"All of the fields in the Record that is retrieved from the Lookup Service will be inserted into the destination path.\",\n-                                        \"displayName\": \"Insert Record Fields\",\n-                                        \"value\": \"record-fields\"\n+                                        \"dependentValues\": [\n+                                            \"AZURE_BLOB_STORAGE\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Checkpoint Strategy\",\n+                                        \"propertyName\": \"checkpoint-strategy\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"insert-entire-record\",\n-                                \"description\": \"When a result is obtained that contains a Record, this property determines whether the Record itself is inserted at the configured path or if the contents of the Record (i.e., the sub-fields) will be inserted at the configured path.\",\n-                                \"displayName\": \"Record Result Contents\",\n+                                \"description\": \"Name of the Azure Storage account to store event hub consumer group state.\",\n+                                \"displayName\": \"Storage Account Name\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"result-contents\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"storage-account-name\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"result-record-path\": {\n-                                \"description\": \"A RecordPath that points to the field whose value should be updated with whatever value is returned from the Lookup Service. If not specified, the value that is returned from the Lookup Service will be ignored, except for determining whether the FlowFile should be routed to the 'matched' or 'unmatched' Relationship.\",\n-                                \"displayName\": \"Result RecordPath\",\n+                            \"storage-container-name\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"AZURE_BLOB_STORAGE\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Checkpoint Strategy\",\n+                                        \"propertyName\": \"checkpoint-strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"Name of the Azure Storage container to store the event hub consumer group state. If not specified, event hub name is used.\",\n+                                \"displayName\": \"Storage Container Name\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"result-record-path\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"storage-container-name\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"routing-strategy\": {\n+                            \"storage-sas-token\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"AZURE_BLOB_STORAGE\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Checkpoint Strategy\",\n+                                        \"propertyName\": \"checkpoint-strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"The Azure Storage SAS token to store Event Hub consumer group state. Always starts with a ? character.\",\n+                                \"displayName\": \"Storage SAS Token\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"storage-sas-token\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n+                            },\n+                            \"use-managed-identity\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Records will be routed to a 'success' Relationship regardless of whether or not there is a match in the configured Lookup Service\",\n-                                        \"displayName\": \"Route to 'success'\",\n-                                        \"value\": \"route-to-success\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n-                                        \"description\": \"Records will be routed to either a 'matched' or an 'unmatched' Relationship depending on whether or not there was a match in the configured Lookup Service. A single input FlowFile may result in two different output FlowFiles.\",\n-                                        \"displayName\": \"Route to 'matched' or 'unmatched'\",\n-                                        \"value\": \"route-to-matched-unmatched\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"route-to-success\",\n-                                \"description\": \"Specifies how to route records after a Lookup has completed\",\n-                                \"displayName\": \"Routing Strategy\",\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"Choose whether or not to use the managed identity of Azure VM/VMSS\",\n+                                \"displayName\": \"Use Azure Managed Identity\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"routing-strategy\",\n-                                \"required\": true,\n+                                \"name\": \"use-managed-identity\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             }\n                         },\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.lookup.SimpleKeyValueLookupService\",\n-                            \"org.apache.nifi.lookup.db.DatabaseRecordLookupService\",\n-                            \"org.apache.nifi.lookup.maxmind.IPLookupService\",\n-                            \"org.apache.nifi.processors.standard.ConvertRecord\",\n-                            \"org.apache.nifi.processors.standard.SplitRecord\"\n-                        ],\n-                        \"sideEffectFree\": true,\n+                        \"sideEffectFree\": false,\n+                        \"stateful\": {\n+                            \"description\": \"Local state is used to store the client id. Cluster state is used to store partition ownership and checkpoint information when component state is configured as the checkpointing strategy.\",\n+                            \"scopes\": [\n+                                \"CLUSTER\",\n+                                \"LOCAL\"\n+                            ]\n+                        },\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"All records will be sent to this Relationship if configured to do so, unless a failure occurs\",\n+                                \"description\": \"FlowFiles received from Event Hub.\",\n                                 \"name\": \"success\"\n                             },\n                             {\n-                                \"description\": \"If a FlowFile cannot be enriched, the unchanged FlowFile will be routed to this relationship\",\n-                                \"name\": \"failure\"\n+                                \"description\": \"If a message from event hub cannot be parsed using the configured Record Reader or failed to be written by the configured Record Writer, the contents of the message will be routed to this Relationship as its own individual FlowFile.\",\n+                                \"name\": \"parse.failure\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\",\n-                            \"EVENT_DRIVEN\"\n+                            \"CRON_DRIVEN\"\n                         ],\n-                        \"supportsBatching\": true,\n-                        \"supportsDynamicProperties\": true,\n+                        \"supportsBatching\": false,\n+                        \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": true,\n+                        \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"avro\",\n-                            \"convert\",\n-                            \"csv\",\n-                            \"database\",\n-                            \"db\",\n-                            \"enrichment\",\n-                            \"filter\",\n-                            \"json\",\n-                            \"logs\",\n-                            \"lookup\",\n-                            \"record\",\n-                            \"route\"\n+                            \"azure\",\n+                            \"cloud\",\n+                            \"eventhub\",\n+                            \"events\",\n+                            \"microsoft\",\n+                            \"streaming\",\n+                            \"streams\"\n                         ],\n-                        \"triggerSerially\": false,\n+                        \"triggerSerially\": true,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.standard.LookupRecord\",\n-                        \"typeDescription\": \"Extracts one or more fields from a Record and looks up a value for those fields in a LookupService. If a result is returned by the LookupService, that result is optionally added to the Record. In this case, the processor functions as an Enrichment processor. Regardless, the Record is then routed to either the 'matched' relationship or 'unmatched' relationship (if the 'Routing Strategy' property is configured to do so), indicating whether or not a result was returned by the LookupService, allowing the processor to also function as a Routing processor. The \\\"coordinates\\\" to use for looking up a value in the Lookup Service are defined by adding a user-defined property. Each property that is added will have an entry added to a Map, where the name of the property becomes the Map Key and the value returned by the RecordPath becomes the value for that key. If multiple values are returned by the RecordPath, then the Record will be routed to the 'unmatched' relationship (or 'success', depending on the 'Routing Strategy' property's configuration). If one or more fields match the Result RecordPath, all fields that match will be updated. If there is no match in the configured LookupService, then no fields will be updated. I.e., it will not overwrite an existing value in the Record with a null value. Please note, however, that if the results returned by the LookupService are not accounted for in your schema (specifically, the schema that is configured for your Record Writer) then the fields will not be written out to the FlowFile.\",\n+                        \"type\": \"org.apache.nifi.processors.azure.eventhub.ConsumeAzureEventHub\",\n+                        \"typeDescription\": \"Receives messages from Microsoft Azure Event Hubs with checkpointing to ensure consistent event processing. Checkpoint tracking avoids consuming a message multiple times and enables reliable resumption of processing in the event of intermittent network failures. Checkpoint tracking requires external storage and provides the preferred approach to consuming messages from Azure Event Hubs. In clustered environment, ConsumeAzureEventHub processor instances form a consumer group and the messages are distributed among the cluster nodes (each message is processed on one cluster node only).\",\n                         \"version\": \"1.27.0\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"Sets the mime.type attribute to the MIME Type specified by the Record Writer\",\n-                                \"name\": \"mime.type\"\n+                                \"description\": \"The time (in milliseconds since epoch, UTC) at which the message was enqueued in the event hub\",\n+                                \"name\": \"eventhub.enqueued.timestamp\"\n                             },\n                             {\n-                                \"description\": \"The number of records in the FlowFile\",\n-                                \"name\": \"record.count\"\n+                                \"description\": \"The offset into the partition at which the message was stored\",\n+                                \"name\": \"eventhub.offset\"\n+                            },\n+                            {\n+                                \"description\": \"The sequence number associated with the message\",\n+                                \"name\": \"eventhub.sequence\"\n+                            },\n+                            {\n+                                \"description\": \"The name of the event hub from which the message was pulled\",\n+                                \"name\": \"eventhub.name\"\n+                            },\n+                            {\n+                                \"description\": \"The name of the partition from which the message was pulled\",\n+                                \"name\": \"eventhub.partition\"\n+                            },\n+                            {\n+                                \"description\": \"The application properties of this message. IE: 'application' would be 'eventhub.property.application'\",\n+                                \"name\": \"eventhub.property.*\"\n                             }\n                         ]\n                     },\n                     {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-standard-nar\",\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-azure-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -113356,637 +113811,277 @@\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_REQUIRED\",\n+                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Attribute Strategy\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"Any attribute that is not the same on all FlowFiles in a bin will be dropped. Those that are the same across all FlowFiles will be retained.\",\n-                                        \"displayName\": \"Keep Only Common Attributes\",\n-                                        \"value\": \"Keep Only Common Attributes\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Any attribute that has the same value for all FlowFiles in a bin, or has no value for a FlowFile, will be kept. For example, if a bin consists of 3 FlowFiles and 2 of them have a value of 'hello' for the 'greeting' attribute and the third FlowFile has no 'greeting' attribute then the outbound FlowFile will get a 'greeting' attribute with the value 'hello'.\",\n-                                        \"displayName\": \"Keep All Unique Attributes\",\n-                                        \"value\": \"Keep All Unique Attributes\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"Keep Only Common Attributes\",\n-                                \"description\": \"Determines which FlowFile attributes should be added to the bundle. If 'Keep All Unique Attributes' is selected, any attribute on any FlowFile that gets bundled will be kept unless its value conflicts with the value from another FlowFile. If 'Keep Only Common Attributes' is selected, only the attributes that exist on all FlowFiles in the bundle, with the same value, will be preserved.\",\n-                                \"displayName\": \"Attribute Strategy\",\n+                            \"Event Hub Consumer Group\": {\n+                                \"defaultValue\": \"$Default\",\n+                                \"description\": \"The name of the consumer group to use when pulling events\",\n+                                \"displayName\": \"Consumer Group\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Attribute Strategy\",\n+                                \"name\": \"Event Hub Consumer Group\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Compression Level\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"0\",\n-                                        \"value\": \"0\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"1\",\n-                                        \"value\": \"1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"2\",\n-                                        \"value\": \"2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"3\",\n-                                        \"value\": \"3\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"4\",\n-                                        \"value\": \"4\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"5\",\n-                                        \"value\": \"5\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"6\",\n-                                        \"value\": \"6\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"7\",\n-                                        \"value\": \"7\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"8\",\n-                                        \"value\": \"8\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"9\",\n-                                        \"value\": \"9\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"1\",\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"ZIP\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Merge Format\",\n-                                        \"propertyName\": \"Merge Format\"\n-                                    }\n-                                ],\n-                                \"description\": \"Specifies the compression level to use when using the Zip Merge Format; if not using the Zip Merge Format, this value is ignored\",\n-                                \"displayName\": \"Compression Level\",\n+                            \"Event Hub Message Enqueue Time\": {\n+                                \"description\": \"A timestamp (ISO-8601 Instant) formatted as YYYY-MM-DDThhmmss.sssZ (2016-01-01T01:01:01.000Z) from which messages should have been enqueued in the Event Hub to start reading from\",\n+                                \"displayName\": \"Message Enqueue Time\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Compression Level\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Correlation Attribute Name\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"Bin-Packing Algorithm\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Merge Strategy\",\n-                                        \"propertyName\": \"Merge Strategy\"\n-                                    }\n-                                ],\n-                                \"description\": \"If specified, like FlowFiles will be binned together, where 'like FlowFiles' means FlowFiles that have the same value for this Attribute. If not specified, FlowFiles are bundled by the order in which they are pulled from the queue.\",\n-                                \"displayName\": \"Correlation Attribute Name\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Correlation Attribute Name\",\n+                                \"name\": \"Event Hub Message Enqueue Time\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Delimiter Strategy\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"No Header, Footer, or Demarcator will be used\",\n-                                        \"displayName\": \"Do Not Use Delimiters\",\n-                                        \"value\": \"Do Not Use Delimiters\"\n-                                    },\n-                                    {\n-                                        \"description\": \"The values of Header, Footer, and Demarcator will be retrieved from the contents of a file\",\n-                                        \"displayName\": \"Filename\",\n-                                        \"value\": \"Filename\"\n-                                    },\n-                                    {\n-                                        \"description\": \"The values of Header, Footer, and Demarcator will be specified as property values\",\n-                                        \"displayName\": \"Text\",\n-                                        \"value\": \"Text\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"Do Not Use Delimiters\",\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"Binary Concatenation\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Merge Format\",\n-                                        \"propertyName\": \"Merge Format\"\n-                                    }\n-                                ],\n-                                \"description\": \"Determines if Header, Footer, and Demarcator should point to files containing the respective content, or if the values of the properties should be used as the content.\",\n-                                \"displayName\": \"Delimiter Strategy\",\n+                            \"Event Hub Name\": {\n+                                \"description\": \"Name of Azure Event Hubs source\",\n+                                \"displayName\": \"Event Hub Name\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Delimiter Strategy\",\n+                                \"name\": \"Event Hub Name\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Demarcator File\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"Filename\",\n-                                            \"Text\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Delimiter Strategy\",\n-                                        \"propertyName\": \"Delimiter Strategy\"\n-                                    },\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"Binary Concatenation\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Merge Format\",\n-                                        \"propertyName\": \"Merge Format\"\n-                                    }\n-                                ],\n-                                \"description\": \"Filename or text specifying the demarcator to use. If not specified, no demarcator is supplied.\",\n-                                \"displayName\": \"Demarcator\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Demarcator File\",\n-                                \"required\": false,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"SINGLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\",\n-                                        \"TEXT\"\n-                                    ]\n-                                },\n-                                \"sensitive\": false\n-                            },\n-                            \"Footer File\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"Filename\",\n-                                            \"Text\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Delimiter Strategy\",\n-                                        \"propertyName\": \"Delimiter Strategy\"\n-                                    },\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"Binary Concatenation\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Merge Format\",\n-                                        \"propertyName\": \"Merge Format\"\n-                                    }\n-                                ],\n-                                \"description\": \"Filename or text specifying the footer to use. If not specified, no footer is supplied.\",\n-                                \"displayName\": \"Footer\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Footer File\",\n-                                \"required\": false,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"SINGLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\",\n-                                        \"TEXT\"\n-                                    ]\n-                                },\n-                                \"sensitive\": false\n-                            },\n-                            \"Header File\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"Filename\",\n-                                            \"Text\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Delimiter Strategy\",\n-                                        \"propertyName\": \"Delimiter Strategy\"\n-                                    },\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"Binary Concatenation\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Merge Format\",\n-                                        \"propertyName\": \"Merge Format\"\n-                                    }\n-                                ],\n-                                \"description\": \"Filename or text specifying the header to use. If not specified, no header is supplied.\",\n-                                \"displayName\": \"Header\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Header File\",\n-                                \"required\": false,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"SINGLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\",\n-                                        \"TEXT\"\n-                                    ]\n-                                },\n-                                \"sensitive\": false\n-                            },\n-                            \"Keep Path\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"false\",\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"ZIP\",\n-                                            \"TAR\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Merge Format\",\n-                                        \"propertyName\": \"Merge Format\"\n-                                    }\n-                                ],\n-                                \"description\": \"If using the Zip or Tar Merge Format, specifies whether or not the FlowFiles' paths should be included in their entry names.\",\n-                                \"displayName\": \"Keep Path\",\n+                            \"Event Hub Namespace\": {\n+                                \"description\": \"Namespace of Azure Event Hubs prefixed to Service Bus Endpoint domain\",\n+                                \"displayName\": \"Event Hub Namespace\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Keep Path\",\n+                                \"name\": \"Event Hub Namespace\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Max Bin Age\": {\n-                                \"description\": \"The maximum age of a Bin that will trigger a Bin to be complete. Expected format is <duration> <time unit> where <duration> is a positive integer and time unit is one of seconds, minutes, hours\",\n-                                \"displayName\": \"Max Bin Age\",\n+                            \"Number of Event Hub Partitions\": {\n+                                \"description\": \"This property is deprecated and no longer used.\",\n+                                \"displayName\": \"Number of Event Hub Partitions\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Max Bin Age\",\n+                                \"name\": \"Number of Event Hub Partitions\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Maximum Group Size\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"Bin-Packing Algorithm\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Merge Strategy\",\n-                                        \"propertyName\": \"Merge Strategy\"\n-                                    }\n-                                ],\n-                                \"description\": \"The maximum size for the bundle. If not specified, there is no maximum.\",\n-                                \"displayName\": \"Maximum Group Size\",\n+                            \"Partition Receiver Timeout (millseconds)\": {\n+                                \"description\": \"The amount of time in milliseconds a Partition Receiver should wait to receive the Fetch Size before returning. The default is 60000\",\n+                                \"displayName\": \"Partition Receiver Timeout\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Maximum Group Size\",\n+                                \"name\": \"Partition Receiver Timeout (millseconds)\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Maximum Number of Entries\": {\n-                                \"defaultValue\": \"1000\",\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"Bin-Packing Algorithm\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Merge Strategy\",\n-                                        \"propertyName\": \"Merge Strategy\"\n-                                    }\n-                                ],\n-                                \"description\": \"The maximum number of files to include in a bundle\",\n-                                \"displayName\": \"Maximum Number of Entries\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Maximum Number of Entries\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Maximum number of Bins\": {\n-                                \"defaultValue\": \"5\",\n-                                \"description\": \"Specifies the maximum number of bins that can be held in memory at any one time\",\n-                                \"displayName\": \"Maximum number of Bins\",\n+                            \"Partition Recivier Fetch Size\": {\n+                                \"description\": \"The number of events that a receiver should fetch from an Event Hubs partition before returning. The default is 100\",\n+                                \"displayName\": \"Partition Receiver Fetch Size\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Maximum number of Bins\",\n-                                \"required\": true,\n+                                \"name\": \"Partition Recivier Fetch Size\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Merge Format\": {\n+                            \"Service Bus Endpoint\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"A bin of FlowFiles will be combined into a single TAR file. The FlowFiles' <path> attribute will be used to create a directory in the TAR file if the <Keep Paths> property is set to true; otherwise, all FlowFiles will be added at the root of the TAR file. If a FlowFile has an attribute named <tar.permissions> that is 3 characters, each between 0-7, that attribute will be used as the TAR entry's 'mode'.\",\n-                                        \"displayName\": \"TAR\",\n-                                        \"value\": \"TAR\"\n-                                    },\n-                                    {\n-                                        \"description\": \"A bin of FlowFiles will be combined into a single ZIP file. The FlowFiles' <path> attribute will be used to create a directory in the ZIP file if the <Keep Paths> property is set to true; otherwise, all FlowFiles will be added at the root of the ZIP file. The <Compression Level> property indicates the ZIP compression to use.\",\n-                                        \"displayName\": \"ZIP\",\n-                                        \"value\": \"ZIP\"\n-                                    },\n-                                    {\n-                                        \"description\": \"A bin of FlowFiles will be combined into a single Version 3 FlowFile Stream\",\n-                                        \"displayName\": \"FlowFile Stream, v3\",\n-                                        \"value\": \"FlowFile Stream, v3\"\n-                                    },\n-                                    {\n-                                        \"description\": \"A bin of FlowFiles will be combined into a single Version 2 FlowFile Stream\",\n-                                        \"displayName\": \"FlowFile Stream, v2\",\n-                                        \"value\": \"FlowFile Stream, v2\"\n+                                        \"description\": \"Servicebus endpoint for general use\",\n+                                        \"displayName\": \"Azure\",\n+                                        \"value\": \".servicebus.windows.net\"\n                                     },\n                                     {\n-                                        \"description\": \"A bin of FlowFiles will be combined into a single Version 1 FlowFile Package\",\n-                                        \"displayName\": \"FlowFile Tar, v1\",\n-                                        \"value\": \"FlowFile Tar, v1\"\n+                                        \"description\": \"Servicebus endpoint for China\",\n+                                        \"displayName\": \"Azure China\",\n+                                        \"value\": \".servicebus.chinacloudapi.cn\"\n                                     },\n                                     {\n-                                        \"description\": \"The contents of all FlowFiles will be concatenated together into a single FlowFile\",\n-                                        \"displayName\": \"Binary Concatenation\",\n-                                        \"value\": \"Binary Concatenation\"\n+                                        \"description\": \"Servicebus endpoint for Germany\",\n+                                        \"displayName\": \"Azure Germany\",\n+                                        \"value\": \".servicebus.cloudapi.de\"\n                                     },\n                                     {\n-                                        \"description\": \"The Avro contents of all FlowFiles will be concatenated together into a single FlowFile\",\n-                                        \"displayName\": \"Avro\",\n-                                        \"value\": \"Avro\"\n+                                        \"description\": \"Servicebus endpoint for US Government\",\n+                                        \"displayName\": \"Azure US Government\",\n+                                        \"value\": \".servicebus.usgovcloudapi.net\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"Binary Concatenation\",\n-                                \"description\": \"Determines the format that will be used to merge the content.\",\n-                                \"displayName\": \"Merge Format\",\n+                                \"defaultValue\": \".servicebus.windows.net\",\n+                                \"description\": \"To support namespaces not in the default windows.net domain.\",\n+                                \"displayName\": \"Service Bus Endpoint\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Merge Format\",\n+                                \"name\": \"Service Bus Endpoint\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Merge Strategy\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"Generates 'bins' of FlowFiles and fills each bin as full as possible. FlowFiles are placed into a bin based on their size and optionally their attributes (if the <Correlation Attribute> property is set)\",\n-                                        \"displayName\": \"Bin-Packing Algorithm\",\n-                                        \"value\": \"Bin-Packing Algorithm\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Combines fragments that are associated by attributes back into a single cohesive FlowFile. If using this strategy, all FlowFiles must have the attributes <fragment.identifier>, <fragment.count>, and <fragment.index> or alternatively (for backward compatibility purposes) <segment.identifier>, <segment.count>, and <segment.index>. All FlowFiles with the same value for \\\"fragment.identifier\\\" will be grouped together. All FlowFiles in this group must have the same value for the \\\"fragment.count\\\" attribute. All FlowFiles in this group must have a unique value for the \\\"fragment.index\\\" attribute between 0 and the value of the \\\"fragment.count\\\" attribute.\",\n-                                        \"displayName\": \"Defragment\",\n-                                        \"value\": \"Defragment\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"Bin-Packing Algorithm\",\n-                                \"description\": \"Specifies the algorithm used to merge content. The 'Defragment' algorithm combines fragments that are associated by attributes back into a single cohesive FlowFile. The 'Bin-Packing Algorithm' generates a FlowFile populated by arbitrarily chosen FlowFiles\",\n-                                \"displayName\": \"Merge Strategy\",\n+                            \"Shared Access Policy Name\": {\n+                                \"description\": \"The name of the shared access policy. This policy must have Listen claims.\",\n+                                \"displayName\": \"Shared Access Policy Name\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Merge Strategy\",\n-                                \"required\": true,\n+                                \"name\": \"Shared Access Policy Name\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Minimum Group Size\": {\n-                                \"defaultValue\": \"0 B\",\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"Bin-Packing Algorithm\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Merge Strategy\",\n-                                        \"propertyName\": \"Merge Strategy\"\n-                                    }\n-                                ],\n-                                \"description\": \"The minimum size for the bundle\",\n-                                \"displayName\": \"Minimum Group Size\",\n+                            \"Shared Access Policy Primary Key\": {\n+                                \"description\": \"The key of the shared access policy. Either the primary or the secondary key can be used.\",\n+                                \"displayName\": \"Shared Access Policy Key\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Minimum Group Size\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n+                                \"name\": \"Shared Access Policy Primary Key\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n                             },\n-                            \"Minimum Number of Entries\": {\n-                                \"defaultValue\": \"1\",\n-                                \"dependencies\": [\n+                            \"Transport Type\": {\n+                                \"allowableValues\": [\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"Bin-Packing Algorithm\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Merge Strategy\",\n-                                        \"propertyName\": \"Merge Strategy\"\n+                                        \"description\": \"AMQP over TCP on ports 5671 and 5672\",\n+                                        \"displayName\": \"AMQP\",\n+                                        \"value\": \"Amqp\"\n+                                    },\n+                                    {\n+                                        \"description\": \"AMQP over HTTPS with WebSockets on port 443\",\n+                                        \"displayName\": \"AMQP_WEB_SOCKETS\",\n+                                        \"value\": \"AmqpWebSockets\"\n                                     }\n                                 ],\n-                                \"description\": \"The minimum number of files to include in a bundle\",\n-                                \"displayName\": \"Minimum Number of Entries\",\n+                                \"defaultValue\": \"Amqp\",\n+                                \"description\": \"Advanced Message Queuing Protocol Transport Type for communication with Azure Event Hubs\",\n+                                \"displayName\": \"Transport Type\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Minimum Number of Entries\",\n+                                \"name\": \"Transport Type\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Tar Modified Time\": {\n-                                \"defaultValue\": \"${file.lastModifiedTime}\",\n+                            \"proxy-configuration-service\": {\n                                 \"dependencies\": [\n                                     {\n                                         \"dependentValues\": [\n-                                            \"TAR\"\n+                                            \"AmqpWebSockets\"\n                                         ],\n-                                        \"propertyDisplayName\": \"Merge Format\",\n-                                        \"propertyName\": \"Merge Format\"\n+                                        \"propertyDisplayName\": \"Transport Type\",\n+                                        \"propertyName\": \"Transport Type\"\n                                     }\n                                 ],\n-                                \"description\": \"If using the Tar Merge Format, specifies if the Tar entry should store the modified timestamp either by expression (e.g. ${file.lastModifiedTime} or static value, both of which must match the ISO8601 format 'yyyy-MM-dd'T'HH:mm:ssZ'.\",\n-                                \"displayName\": \"Tar Modified Time\",\n+                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests. Supported proxies: HTTP + AuthN\",\n+                                \"displayName\": \"Proxy Configuration Service\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Tar Modified Time\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"proxy-configuration-service\",\n                                 \"required\": false,\n-                                \"sensitive\": false\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.proxy.ProxyConfigurationService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n                             },\n-                            \"mergecontent-metadata-strategy\": {\n+                            \"use-managed-identity\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"For any input format that supports metadata (Avro, e.g.), the metadata for the first FlowFile in the bin will be set on the output FlowFile.\",\n-                                        \"displayName\": \"Use First Metadata\",\n-                                        \"value\": \"Use First Metadata\"\n-                                    },\n-                                    {\n-                                        \"description\": \"For any input format that supports metadata (Avro, e.g.), any FlowFile whose metadata values match those of the first FlowFile, any additional metadata will be dropped but the FlowFile will be merged. Any FlowFile whose metadata values do not match those of the first FlowFile in the bin will not be merged.\",\n-                                        \"displayName\": \"Keep Only Common Metadata\",\n-                                        \"value\": \"Keep Only Common Metadata\"\n-                                    },\n-                                    {\n-                                        \"description\": \"For any input format that supports metadata (Avro, e.g.), any FlowFile whose metadata values do not match those of the first FlowFile in the bin will not be merged.\",\n-                                        \"displayName\": \"Do Not Merge Uncommon Metadata\",\n-                                        \"value\": \"Do Not Merge Uncommon Metadata\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n-                                        \"description\": \"Ignores (does not transfer, compare, etc.) any metadata from a FlowFile whose content supports embedded metadata.\",\n-                                        \"displayName\": \"Ignore Metadata\",\n-                                        \"value\": \"Ignore Metadata\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"Do Not Merge Uncommon Metadata\",\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"Avro\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Merge Format\",\n-                                        \"propertyName\": \"Merge Format\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"description\": \"For FlowFiles whose input format supports metadata (Avro, e.g.), this property determines which metadata should be added to the bundle. If 'Use First Metadata' is selected, the metadata keys/values from the first FlowFile to be bundled will be used. If 'Keep Only Common Metadata' is selected, only the metadata that exists on all FlowFiles in the bundle, with the same value, will be preserved. If 'Ignore Metadata' is selected, no metadata is transferred to the outgoing bundled FlowFile. If 'Do Not Merge Uncommon Metadata' is selected, any FlowFile whose metadata values do not match those of the first bundled FlowFile will not be merged.\",\n-                                \"displayName\": \"Metadata Strategy\",\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"Choose whether or not to use the managed identity of Azure VM/VMSS\",\n+                                \"displayName\": \"Use Azure Managed Identity\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"mergecontent-metadata-strategy\",\n-                                \"required\": true,\n+                                \"name\": \"use-managed-identity\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             }\n                         },\n-                        \"readsAttributes\": [\n-                            {\n-                                \"description\": \"Applicable only if the <Merge Strategy> property is set to Defragment. All FlowFiles with the same value for this attribute will be bundled together.\",\n-                                \"name\": \"fragment.identifier\"\n-                            },\n-                            {\n-                                \"description\": \"Applicable only if the <Merge Strategy> property is set to Defragment. This attribute indicates the order in which the fragments should be assembled. This attribute must be present on all FlowFiles when using the Defragment Merge Strategy and must be a unique (i.e., unique across all FlowFiles that have the same value for the \\\"fragment.identifier\\\" attribute) integer between 0 and the value of the fragment.count attribute. If two or more FlowFiles have the same value for the \\\"fragment.identifier\\\" attribute and the same value for the \\\"fragment.index\\\" attribute, the first FlowFile processed will be accepted and subsequent FlowFiles will not be accepted into the Bin.\",\n-                                \"name\": \"fragment.index\"\n-                            },\n-                            {\n-                                \"description\": \"Applicable only if the <Merge Strategy> property is set to Defragment. This attribute indicates how many FlowFiles should be expected in the given bundle. At least one FlowFile must have this attribute in the bundle. If multiple FlowFiles contain the \\\"fragment.count\\\" attribute in a given bundle, all must have the same value.\",\n-                                \"name\": \"fragment.count\"\n-                            },\n-                            {\n-                                \"description\": \"Applicable only if the <Merge Strategy> property is set to Defragment. This attribute must be present on all FlowFiles with the same value for the fragment.identifier attribute. All FlowFiles in the same bundle must have the same value for this attribute. The value of this attribute will be used for the filename of the completed merged FlowFile.\",\n-                                \"name\": \"segment.original.filename\"\n-                            },\n-                            {\n-                                \"description\": \"Applicable only if the <Merge Format> property is set to TAR. The value of this attribute must be 3 characters; each character must be in the range 0 to 7 (inclusive) and indicates the file permissions that should be used for the FlowFile's TAR entry. If this attribute is missing or has an invalid value, the default value of 644 will be used\",\n-                                \"name\": \"tar.permissions\"\n-                            }\n-                        ],\n                         \"seeAlso\": [\n-                            \"org.apache.nifi.processors.standard.MergeRecord\",\n-                            \"org.apache.nifi.processors.standard.SegmentContent\"\n+                            \"org.apache.nifi.processors.azure.eventhub.ConsumeAzureEventHub\"\n                         ],\n-                        \"sideEffectFree\": true,\n+                        \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"If the bundle cannot be created, all FlowFiles that would have been used to created the bundle will be transferred to failure\",\n-                                \"name\": \"failure\"\n-                            },\n-                            {\n-                                \"description\": \"The FlowFiles that were used to create the bundle\",\n-                                \"name\": \"original\"\n-                            },\n-                            {\n-                                \"description\": \"The FlowFile containing the merged content\",\n-                                \"name\": \"merged\"\n+                                \"description\": \"Any FlowFile that is successfully received from the event hub will be transferred to this Relationship.\",\n+                                \"name\": \"success\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n                         \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n-                        \"systemResourceConsiderations\": [\n-                            {\n-                                \"description\": \"While content is not stored in memory, the FlowFiles' attributes are. The configuration of MergeContent (maximum bin size, maximum group size, maximum bin age, max number of entries) will influence how much memory is used. If merging together many small FlowFiles, a two-stage approach may be necessary in order to avoid excessive use of memory.\",\n-                                \"resource\": \"MEMORY\"\n-                            }\n-                        ],\n                         \"tags\": [\n-                            \"archive\",\n-                            \"concatenation\",\n-                            \"content\",\n-                            \"correlation\",\n-                            \"flowfile-stream\",\n-                            \"flowfile-stream-v3\",\n-                            \"merge\",\n-                            \"stream\",\n-                            \"tar\",\n-                            \"zip\"\n+                            \"azure\",\n+                            \"cloud\",\n+                            \"eventhub\",\n+                            \"events\",\n+                            \"microsoft\",\n+                            \"streaming\",\n+                            \"streams\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": true,\n-                        \"type\": \"org.apache.nifi.processors.standard.MergeContent\",\n-                        \"typeDescription\": \"Merges a Group of FlowFiles together based on a user-defined strategy and packages them into a single FlowFile. It is recommended that the Processor be configured with only a single incoming connection, as Group of FlowFiles will not be created from FlowFiles in different connections. This processor updates the mime.type attribute as appropriate. NOTE: this processor should NOT be configured with Cron Driven for the Scheduling Strategy.\",\n+                        \"triggerWhenEmpty\": false,\n+                        \"type\": \"org.apache.nifi.processors.azure.eventhub.GetAzureEventHub\",\n+                        \"typeDescription\": \"Receives messages from Microsoft Azure Event Hubs without reliable checkpoint tracking. In clustered environment, GetAzureEventHub processor instances work independently and all cluster nodes process all messages (unless running the processor in Primary Only mode). ConsumeAzureEventHub offers the recommended approach to receiving messages from Azure Event Hubs. This processor creates a thread pool for connections to Azure Event Hubs.\",\n                         \"version\": \"1.27.0\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"When more than 1 file is merged, the filename comes from the segment.original.filename attribute. If that attribute does not exist in the source FlowFiles, then the filename is set to the number of nanoseconds matching system time. Then a filename extension may be applied:if Merge Format is TAR, then the filename will be appended with .tar, if Merge Format is ZIP, then the filename will be appended with .zip, if Merge Format is FlowFileStream, then the filename will be appended with .pkg\",\n-                                \"name\": \"filename\"\n+                                \"description\": \"The time (in milliseconds since epoch, UTC) at which the message was enqueued in the event hub\",\n+                                \"name\": \"eventhub.enqueued.timestamp\"\n                             },\n                             {\n-                                \"description\": \"The number of FlowFiles that were merged into this bundle\",\n-                                \"name\": \"merge.count\"\n+                                \"description\": \"The offset into the partition at which the message was stored\",\n+                                \"name\": \"eventhub.offset\"\n                             },\n                             {\n-                                \"description\": \"The age of the bin, in milliseconds, when it was merged and output. Effectively this is the greatest amount of time that any FlowFile in this bundle remained waiting in this processor before it was output\",\n-                                \"name\": \"merge.bin.age\"\n+                                \"description\": \"The Azure sequence number associated with the message\",\n+                                \"name\": \"eventhub.sequence\"\n                             },\n                             {\n-                                \"description\": \"UUID of the merged flow file that will be added to the original flow files attributes.\",\n-                                \"name\": \"merge.uuid\"\n+                                \"description\": \"The name of the event hub from which the message was pulled\",\n+                                \"name\": \"eventhub.name\"\n                             },\n                             {\n-                                \"description\": \"This processor allows for several thresholds to be configured for merging FlowFiles. This attribute indicates which of the Thresholds resulted in the FlowFiles being merged. For an explanation of each of the possible values and their meanings, see the Processor's Usage / documentation and see the 'Additional Details' page.\",\n-                                \"name\": \"merge.reason\"\n+                                \"description\": \"The name of the event hub partition from which the message was pulled\",\n+                                \"name\": \"eventhub.partition\"\n+                            },\n+                            {\n+                                \"description\": \"The application properties of this message. IE: 'application' would be 'eventhub.property.application'\",\n+                                \"name\": \"eventhub.property.*\"\n                             }\n                         ]\n                     },\n                     {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-standard-nar\",\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-azure-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -113998,348 +114093,413 @@\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Attribute Strategy\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"Any attribute that is not the same on all FlowFiles in a bin will be dropped. Those that are the same across all FlowFiles will be retained.\",\n-                                        \"displayName\": \"Keep Only Common Attributes\",\n-                                        \"value\": \"Keep Only Common Attributes\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Any attribute that has the same value for all FlowFiles in a bin, or has no value for a FlowFile, will be kept. For example, if a bin consists of 3 FlowFiles and 2 of them have a value of 'hello' for the 'greeting' attribute and the third FlowFile has no 'greeting' attribute then the outbound FlowFile will get a 'greeting' attribute with the value 'hello'.\",\n-                                        \"displayName\": \"Keep All Unique Attributes\",\n-                                        \"value\": \"Keep All Unique Attributes\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"Keep Only Common Attributes\",\n-                                \"description\": \"Determines which FlowFile attributes should be added to the bundle. If 'Keep All Unique Attributes' is selected, any attribute on any FlowFile that gets bundled will be kept unless its value conflicts with the value from another FlowFile. If 'Keep Only Common Attributes' is selected, only the attributes that exist on all FlowFiles in the bundle, with the same value, will be preserved.\",\n-                                \"displayName\": \"Attribute Strategy\",\n+                            \"Event Hub Name\": {\n+                                \"description\": \"Name of Azure Event Hubs destination\",\n+                                \"displayName\": \"Event Hub Name\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Attribute Strategy\",\n+                                \"name\": \"Event Hub Name\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"correlation-attribute-name\": {\n-                                \"description\": \"If specified, two FlowFiles will be binned together only if they have the same value for this Attribute. If not specified, FlowFiles are bundled by the order in which they are pulled from the queue.\",\n-                                \"displayName\": \"Correlation Attribute Name\",\n+                            \"Event Hub Namespace\": {\n+                                \"description\": \"Namespace of Azure Event Hubs prefixed to Service Bus Endpoint domain\",\n+                                \"displayName\": \"Event Hub Namespace\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"correlation-attribute-name\",\n-                                \"required\": false,\n+                                \"name\": \"Event Hub Namespace\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"max-bin-age\": {\n-                                \"description\": \"The maximum age of a Bin that will trigger a Bin to be complete. Expected format is <duration> <time unit> where <duration> is a positive integer and time unit is one of seconds, minutes, hours\",\n-                                \"displayName\": \"Max Bin Age\",\n+                            \"Service Bus Endpoint\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"Servicebus endpoint for general use\",\n+                                        \"displayName\": \"Azure\",\n+                                        \"value\": \".servicebus.windows.net\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Servicebus endpoint for China\",\n+                                        \"displayName\": \"Azure China\",\n+                                        \"value\": \".servicebus.chinacloudapi.cn\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Servicebus endpoint for Germany\",\n+                                        \"displayName\": \"Azure Germany\",\n+                                        \"value\": \".servicebus.cloudapi.de\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Servicebus endpoint for US Government\",\n+                                        \"displayName\": \"Azure US Government\",\n+                                        \"value\": \".servicebus.usgovcloudapi.net\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \".servicebus.windows.net\",\n+                                \"description\": \"To support namespaces not in the default windows.net domain.\",\n+                                \"displayName\": \"Service Bus Endpoint\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"max-bin-age\",\n-                                \"required\": false,\n+                                \"name\": \"Service Bus Endpoint\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"max-bin-size\": {\n-                                \"description\": \"The maximum size for the bundle. If not specified, there is no maximum. This is a 'soft limit' in that if a FlowFile is added to a bin, all records in that FlowFile will be added, so this limit may be exceeded by up to the number of bytes in last input FlowFile.\",\n-                                \"displayName\": \"Maximum Bin Size\",\n+                            \"Shared Access Policy Name\": {\n+                                \"description\": \"The name of the shared access policy. This policy must have Send claims.\",\n+                                \"displayName\": \"Shared Access Policy Name\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"max-bin-size\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"max-records\": {\n-                                \"defaultValue\": \"1000\",\n-                                \"description\": \"The maximum number of Records to include in a bin. This is a 'soft limit' in that if a FlowFIle is added to a bin, all records in that FlowFile will be added, so this limit may be exceeded by up to the number of records in the last input FlowFile.\",\n-                                \"displayName\": \"Maximum Number of Records\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"max-records\",\n+                                \"name\": \"Shared Access Policy Name\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"max.bin.count\": {\n-                                \"defaultValue\": \"10\",\n-                                \"description\": \"Specifies the maximum number of bins that can be held in memory at any one time. This number should not be smaller than the maximum number of concurrent threads for this Processor, or the bins that are created will often consist only of a single incoming FlowFile.\",\n-                                \"displayName\": \"Maximum Number of Bins\",\n+                            \"Shared Access Policy Primary Key\": {\n+                                \"description\": \"The key of the shared access policy. Either the primary or the secondary key can be used.\",\n+                                \"displayName\": \"Shared Access Policy Key\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"max.bin.count\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n+                                \"name\": \"Shared Access Policy Primary Key\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n                             },\n-                            \"merge-strategy\": {\n+                            \"Transport Type\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Generates 'bins' of FlowFiles and fills each bin as full as possible. FlowFiles are placed into a bin based on their size and optionally their attributes (if the <Correlation Attribute> property is set)\",\n-                                        \"displayName\": \"Bin-Packing Algorithm\",\n-                                        \"value\": \"Bin-Packing Algorithm\"\n+                                        \"description\": \"AMQP over TCP on ports 5671 and 5672\",\n+                                        \"displayName\": \"AMQP\",\n+                                        \"value\": \"Amqp\"\n                                     },\n                                     {\n-                                        \"description\": \"Combines fragments that are associated by attributes back into a single cohesive FlowFile. If using this strategy, all FlowFiles must have the attributes <fragment.identifier> and <fragment.count>. All FlowFiles with the same value for \\\"fragment.identifier\\\" will be grouped together. All FlowFiles in this group must have the same value for the \\\"fragment.count\\\" attribute. The ordering of the Records that are output is not guaranteed.\",\n-                                        \"displayName\": \"Defragment\",\n-                                        \"value\": \"Defragment\"\n+                                        \"description\": \"AMQP over HTTPS with WebSockets on port 443\",\n+                                        \"displayName\": \"AMQP_WEB_SOCKETS\",\n+                                        \"value\": \"AmqpWebSockets\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"Bin-Packing Algorithm\",\n-                                \"description\": \"Specifies the algorithm used to merge records. The 'Defragment' algorithm combines fragments that are associated by attributes back into a single cohesive FlowFile. The 'Bin-Packing Algorithm' generates a FlowFile populated by arbitrarily chosen FlowFiles\",\n-                                \"displayName\": \"Merge Strategy\",\n+                                \"defaultValue\": \"Amqp\",\n+                                \"description\": \"Advanced Message Queuing Protocol Transport Type for communication with Azure Event Hubs\",\n+                                \"displayName\": \"Transport Type\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"merge-strategy\",\n+                                \"name\": \"Transport Type\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"min-bin-size\": {\n-                                \"defaultValue\": \"0 B\",\n-                                \"description\": \"The minimum size of for the bin\",\n-                                \"displayName\": \"Minimum Bin Size\",\n+                            \"max-batch-size\": {\n+                                \"defaultValue\": \"100\",\n+                                \"description\": \"Maximum number of FlowFiles processed for each Processor invocation\",\n+                                \"displayName\": \"Maximum Batch Size\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"min-bin-size\",\n+                                \"name\": \"max-batch-size\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"min-records\": {\n-                                \"defaultValue\": \"1\",\n-                                \"description\": \"The minimum number of records to include in a bin\",\n-                                \"displayName\": \"Minimum Number of Records\",\n+                            \"partitioning-key-attribute-name\": {\n+                                \"description\": \"If specified, the value from argument named by this field will be used as a partitioning key to be used by event hub.\",\n+                                \"displayName\": \"Partitioning Key Attribute Name\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"min-records\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"partitioning-key-attribute-name\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"record-reader\": {\n-                                \"description\": \"Specifies the Controller Service to use for reading incoming data\",\n-                                \"displayName\": \"Record Reader\",\n+                            \"proxy-configuration-service\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"AmqpWebSockets\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Transport Type\",\n+                                        \"propertyName\": \"Transport Type\"\n+                                    }\n+                                ],\n+                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests. Supported proxies: HTTP + AuthN\",\n+                                \"displayName\": \"Proxy Configuration Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"record-reader\",\n-                                \"required\": true,\n+                                \"name\": \"proxy-configuration-service\",\n+                                \"required\": false,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n                                     \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n+                                    \"type\": \"org.apache.nifi.proxy.ProxyConfigurationService\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             },\n-                            \"record-writer\": {\n-                                \"description\": \"Specifies the Controller Service to use for writing out the records\",\n-                                \"displayName\": \"Record Writer\",\n+                            \"use-managed-identity\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"Choose whether or not to use the managed identity of Azure VM/VMSS\",\n+                                \"displayName\": \"Use Azure Managed Identity\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"record-writer\",\n-                                \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n+                                \"name\": \"use-managed-identity\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n                             }\n                         },\n-                        \"readsAttributes\": [\n-                            {\n-                                \"description\": \"Applicable only if the <Merge Strategy> property is set to Defragment. All FlowFiles with the same value for this attribute will be bundled together.\",\n-                                \"name\": \"fragment.identifier\"\n-                            },\n-                            {\n-                                \"description\": \"Applicable only if the <Merge Strategy> property is set to Defragment. This attribute must be present on all FlowFiles with the same value for the fragment.identifier attribute. All FlowFiles in the same bundle must have the same value for this attribute. The value of this attribute indicates how many FlowFiles should be expected in the given bundle.\",\n-                                \"name\": \"fragment.count\"\n-                            }\n-                        ],\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.processors.standard.MergeContent\",\n-                            \"org.apache.nifi.processors.standard.PartitionRecord\",\n-                            \"org.apache.nifi.processors.standard.SplitRecord\"\n-                        ],\n-                        \"sideEffectFree\": true,\n+                        \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"If the bundle cannot be created, all FlowFiles that would have been used to created the bundle will be transferred to failure\",\n-                                \"name\": \"failure\"\n-                            },\n-                            {\n-                                \"description\": \"The FlowFiles that were used to create the bundle\",\n-                                \"name\": \"original\"\n+                                \"description\": \"Any FlowFile that is successfully sent to the event hubs will be transferred to this Relationship.\",\n+                                \"name\": \"success\"\n                             },\n                             {\n-                                \"description\": \"The FlowFile containing the merged records\",\n-                                \"name\": \"merged\"\n+                                \"description\": \"Any FlowFile that could not be sent to the event hub will be transferred to this Relationship.\",\n+                                \"name\": \"failure\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n-                        \"supportsBatching\": false,\n+                        \"supportsBatching\": true,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n+                        \"systemResourceConsiderations\": [\n+                            {\n+                                \"description\": \"The Processor buffers FlowFile contents in memory before sending\",\n+                                \"resource\": \"MEMORY\"\n+                            }\n+                        ],\n                         \"tags\": [\n-                            \"content\",\n-                            \"correlation\",\n-                            \"event\",\n-                            \"merge\",\n-                            \"record\",\n-                            \"stream\"\n+                            \"azure\",\n+                            \"cloud\",\n+                            \"eventhub\",\n+                            \"events\",\n+                            \"microsoft\",\n+                            \"streaming\",\n+                            \"streams\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": true,\n-                        \"type\": \"org.apache.nifi.processors.standard.MergeRecord\",\n-                        \"typeDescription\": \"This Processor merges together multiple record-oriented FlowFiles into a single FlowFile that contains all of the Records of the input FlowFiles. This Processor works by creating 'bins' and then adding FlowFiles to these bins until they are full. Once a bin is full, all of the FlowFiles will be combined into a single output FlowFile, and that FlowFile will be routed to the 'merged' Relationship. A bin will consist of potentially many 'like FlowFiles'. In order for two FlowFiles to be considered 'like FlowFiles', they must have the same Schema (as identified by the Record Reader) and, if the <Correlation Attribute Name> property is set, the same value for the specified attribute. See Processor Usage and Additional Details for more information. NOTE: this processor should NOT be configured with Cron Driven for the Scheduling Strategy.\",\n-                        \"version\": \"1.27.0\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"The merged FlowFile will have a 'record.count' attribute indicating the number of records that were written to the FlowFile.\",\n-                                \"name\": \"record.count\"\n-                            },\n-                            {\n-                                \"description\": \"The MIME Type indicated by the Record Writer\",\n-                                \"name\": \"mime.type\"\n-                            },\n-                            {\n-                                \"description\": \"The number of FlowFiles that were merged into this bundle\",\n-                                \"name\": \"merge.count\"\n-                            },\n-                            {\n-                                \"description\": \"The age of the bin, in milliseconds, when it was merged and output. Effectively this is the greatest amount of time that any FlowFile in this bundle remained waiting in this processor before it was output\",\n-                                \"name\": \"merge.bin.age\"\n-                            },\n-                            {\n-                                \"description\": \"UUID of the merged FlowFile that will be added to the original FlowFiles attributes\",\n-                                \"name\": \"merge.uuid\"\n-                            },\n-                            {\n-                                \"description\": \"Any Attribute that the configured Record Writer returns will be added to the FlowFile.\",\n-                                \"name\": \"<Attributes from Record Writer>\"\n-                            }\n-                        ]\n+                        \"triggerWhenEmpty\": false,\n+                        \"type\": \"org.apache.nifi.processors.azure.eventhub.PutAzureEventHub\",\n+                        \"typeDescription\": \"Send FlowFile contents to Azure Event Hubs\",\n+                        \"version\": \"1.27.0\"\n                     },\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-standard-nar\",\n+                        \"artifact\": \"nifi-azure-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n-                            \"EVENT_DRIVEN\": 0,\n                             \"TIMER_DRIVEN\": 1\n                         },\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n+                        \"deprecated\": true,\n+                        \"deprecationAlternatives\": [\n+                            \"org.apache.nifi.processors.azure.storage.DeleteAzureBlobStorage_v12\"\n+                        ],\n+                        \"deprecationReason\": \"Processor depends on legacy Microsoft Azure SDK\",\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"End Offset\": {\n-                                \"defaultValue\": \"0 B\",\n-                                \"description\": \"Number of bytes removed at the end of the file.\",\n-                                \"displayName\": \"End Offset\",\n+                            \"blob\": {\n+                                \"defaultValue\": \"${azure.blobname}\",\n+                                \"description\": \"The filename of the blob\",\n+                                \"displayName\": \"Blob\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"End Offset\",\n+                                \"name\": \"blob\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Remove All Content\": {\n+                            \"container-name\": {\n+                                \"description\": \"Name of the Azure storage container. In case of PutAzureBlobStorage processor, container can be created if it does not exist.\",\n+                                \"displayName\": \"Container Name\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"container-name\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"delete-snapshots-option\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"description\": \"Delete the blob only.\",\n+                                        \"displayName\": \"None\",\n+                                        \"value\": \"NONE\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"description\": \"Delete the blob and its snapshots.\",\n+                                        \"displayName\": \"Include Snapshots\",\n+                                        \"value\": \"INCLUDE_SNAPSHOTS\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Delete only the blob's snapshots.\",\n+                                        \"displayName\": \"Delete Snapshots Only\",\n+                                        \"value\": \"DELETE_SNAPSHOTS_ONLY\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"Remove all content from the FlowFile superseding Start Offset and End Offset properties.\",\n-                                \"displayName\": \"Remove All Content\",\n+                                \"defaultValue\": \"NONE\",\n+                                \"description\": \"Specifies the snapshot deletion options to be used when deleting a blob.\",\n+                                \"displayName\": \"Delete Snapshots Option\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Remove All Content\",\n+                                \"name\": \"delete-snapshots-option\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Start Offset\": {\n-                                \"defaultValue\": \"0 B\",\n-                                \"description\": \"Number of bytes removed at the beginning of the file.\",\n-                                \"displayName\": \"Start Offset\",\n+                            \"proxy-configuration-service\": {\n+                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests. Supported proxies: SOCKS, HTTP In case of SOCKS, it is not guaranteed that the selected SOCKS Version will be used by the processor.\",\n+                                \"displayName\": \"Proxy Configuration Service\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"proxy-configuration-service\",\n+                                \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.proxy.ProxyConfigurationService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"storage-account-key\": {\n+                                \"description\": \"The storage account key. This is an admin-like password providing access to every container in this account. It is recommended one uses Shared Access Signature (SAS) token instead for fine-grained control with policies. There are certain risks in allowing the account key to be stored as a flowfile attribute. While it does provide for a more flexible flow by allowing the account key to be fetched dynamically from a flowfile attribute, care must be taken to restrict access to the event provenance data (e.g., by strictly controlling the policies governing provenance for this processor). In addition, the provenance repositories may be put on encrypted disk partitions.\",\n+                                \"displayName\": \"Storage Account Key\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Start Offset\",\n-                                \"required\": true,\n+                                \"name\": \"storage-account-key\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n+                            },\n+                            \"storage-account-name\": {\n+                                \"description\": \"The storage account name. There are certain risks in allowing the account name to be stored as a flowfile attribute. While it does provide for a more flexible flow by allowing the account name to be fetched dynamically from a flowfile attribute, care must be taken to restrict access to the event provenance data (e.g., by strictly controlling the policies governing provenance for this processor). In addition, the provenance repositories may be put on encrypted disk partitions. Instead of defining the Storage Account Name, Storage Account Key and SAS Token properties directly on the processor, the preferred way is to configure them through a controller service specified in the Storage Credentials property. The controller service can provide a common/shared configuration for multiple/all Azure processors. Furthermore, the credentials can also be looked up dynamically with the 'Lookup' version of the service.\",\n+                                \"displayName\": \"Storage Account Name\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"storage-account-name\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n+                            },\n+                            \"storage-credentials-service\": {\n+                                \"description\": \"The Controller Service used to obtain Azure Storage Credentials. Instead of the processor level properties, the credentials can be configured here through a common/shared controller service, which is the preferred way. The 'Lookup' version of the service can also be used to select the credentials dynamically at runtime based on a FlowFile attribute (if the processor has FlowFile input).\",\n+                                \"displayName\": \"Storage Credentials\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"storage-credentials-service\",\n+                                \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-azure-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.services.azure.storage.AzureStorageCredentialsService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"storage-endpoint-suffix\": {\n+                                \"description\": \"Storage accounts in public Azure always use a common FQDN suffix. Override this endpoint suffix with a different suffix in certain circumstances (like Azure Stack or non-public Azure regions). The preferred way is to configure them through a controller service specified in the Storage Credentials property. The controller service can provide a common/shared configuration for multiple/all Azure processors. Furthermore, the credentials can also be looked up dynamically with the 'Lookup' version of the service.\",\n+                                \"displayName\": \"Common Storage Account Endpoint Suffix\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"storage-endpoint-suffix\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n+                            },\n+                            \"storage-sas-token\": {\n+                                \"description\": \"Shared Access Signature token, including the leading '?'. Specify either SAS token (recommended) or Account Key. There are certain risks in allowing the SAS token to be stored as a flowfile attribute. While it does provide for a more flexible flow by allowing the SAS token to be fetched dynamically from a flowfile attribute, care must be taken to restrict access to the event provenance data (e.g., by strictly controlling the policies governing provenance for this processor). In addition, the provenance repositories may be put on encrypted disk partitions.\",\n+                                \"displayName\": \"SAS Token\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"storage-sas-token\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n                             }\n                         },\n-                        \"sideEffectFree\": true,\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.processors.azure.storage.FetchAzureBlobStorage\",\n+                            \"org.apache.nifi.processors.azure.storage.ListAzureBlobStorage\",\n+                            \"org.apache.nifi.processors.azure.storage.PutAzureBlobStorage\"\n+                        ],\n+                        \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"Processed flowfiles.\",\n+                                \"description\": \"All successfully processed FlowFiles are routed to this relationship\",\n                                 \"name\": \"success\"\n+                            },\n+                            {\n+                                \"description\": \"Unsuccessful operations will be transferred to the failure relationship.\",\n+                                \"name\": \"failure\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\",\n-                            \"EVENT_DRIVEN\"\n+                            \"CRON_DRIVEN\"\n                         ],\n-                        \"supportsBatching\": true,\n+                        \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": true,\n+                        \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"binary\",\n-                            \"discard\",\n-                            \"keep\"\n+                            \"azure\",\n+                            \"blob\",\n+                            \"cloud\",\n+                            \"microsoft\",\n+                            \"storage\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.standard.ModifyBytes\",\n-                        \"typeDescription\": \"Discard byte range at the start and end or all content of a binary file.\",\n+                        \"type\": \"org.apache.nifi.processors.azure.storage.DeleteAzureBlobStorage\",\n+                        \"typeDescription\": \"Deletes the provided blob from Azure Storage\",\n                         \"version\": \"1.27.0\"\n                     },\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-standard-nar\",\n+                        \"artifact\": \"nifi-azure-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -114351,394 +114511,297 @@\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Activity Restored Message\": {\n-                                \"defaultValue\": \"Activity restored at time: ${now():format('yyyy/MM/dd HH:mm:ss')} after being inactive for ${inactivityDurationMillis:toNumber():divide(60000)} minutes\",\n-                                \"description\": \"The message that will be the content of FlowFiles that are sent to 'activity.restored' relationship\",\n-                                \"displayName\": \"Activity Restored Message\",\n+                            \"blob-name\": {\n+                                \"defaultValue\": \"${azure.blobname}\",\n+                                \"description\": \"The full name of the blob\",\n+                                \"displayName\": \"Blob Name\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Activity Restored Message\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Continually Send Messages\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"If true, will send inactivity indicator continually every Threshold Duration amount of time until activity is restored; if false, will send an indicator only when the flow first becomes inactive\",\n-                                \"displayName\": \"Continually Send Messages\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Continually Send Messages\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Copy Attributes\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"If true, will copy all flow file attributes from the flow file that resumed activity to the newly created indicator flow file\",\n-                                \"displayName\": \"Copy Attributes\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Copy Attributes\",\n+                                \"name\": \"blob-name\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Inactivity Message\": {\n-                                \"defaultValue\": \"Lacking activity as of time: ${now():format('yyyy/MM/dd HH:mm:ss')}; flow has been inactive for ${inactivityDurationMillis:toNumber():divide(60000)} minutes\",\n-                                \"description\": \"The message that will be the content of FlowFiles that are sent to the 'inactive' relationship\",\n-                                \"displayName\": \"Inactivity Message\",\n+                            \"container-name\": {\n+                                \"defaultValue\": \"${azure.container}\",\n+                                \"description\": \"Name of the Azure storage container. In case of PutAzureBlobStorage processor, container can be created if it does not exist.\",\n+                                \"displayName\": \"Container Name\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Inactivity Message\",\n+                                \"name\": \"container-name\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Monitoring Scope\": {\n+                            \"delete-snapshots-option\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"node\",\n-                                        \"value\": \"node\"\n+                                        \"description\": \"Delete the blob only.\",\n+                                        \"displayName\": \"None\",\n+                                        \"value\": \"NONE\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"cluster\",\n-                                        \"value\": \"cluster\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"node\",\n-                                \"description\": \"Specify how to determine activeness of the flow. 'node' means that activeness is examined at individual node separately. It can be useful if DFM expects each node should receive flow files in a distributed manner. With 'cluster', it defines the flow is active while at least one node receives flow files actively. If NiFi is running as standalone mode, this should be set as 'node', if it's 'cluster', NiFi logs a warning message and act as 'node' scope.\",\n-                                \"displayName\": \"Monitoring Scope\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Monitoring Scope\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Reporting Node\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"all\",\n-                                        \"value\": \"all\"\n+                                        \"description\": \"Delete the blob and its snapshots.\",\n+                                        \"displayName\": \"Include Snapshots\",\n+                                        \"value\": \"INCLUDE\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"primary\",\n-                                        \"value\": \"primary\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"all\",\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"cluster\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Monitoring Scope\",\n-                                        \"propertyName\": \"Monitoring Scope\"\n+                                        \"description\": \"Delete only the blob's snapshots.\",\n+                                        \"displayName\": \"Delete Snapshots Only\",\n+                                        \"value\": \"ONLY\"\n                                     }\n                                 ],\n-                                \"description\": \"Specify which node should send notification flow-files to inactive and activity.restored relationships. With 'all', every node in this cluster send notification flow-files. 'primary' means flow-files will be sent only from a primary node. If NiFi is running as standalone mode, this should be set as 'all', even if it's 'primary', NiFi act as 'all'.\",\n-                                \"displayName\": \"Reporting Node\",\n+                                \"defaultValue\": \"NONE\",\n+                                \"description\": \"Specifies the snapshot deletion options to be used when deleting a blob.\",\n+                                \"displayName\": \"Delete Snapshots Option\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Reporting Node\",\n+                                \"name\": \"delete-snapshots-option\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Reset State on Restart\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"true\",\n-                                \"description\": \"When the processor gets started or restarted, if set to true, the initial state will always be active. Otherwise, the last reported flow state will be preserved.\",\n-                                \"displayName\": \"Reset State on Restart\",\n+                            \"proxy-configuration-service\": {\n+                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests. Supported proxies: SOCKS, HTTP In case of SOCKS, it is not guaranteed that the selected SOCKS Version will be used by the processor.\",\n+                                \"displayName\": \"Proxy Configuration Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Reset State on Restart\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Threshold Duration\": {\n-                                \"defaultValue\": \"5 min\",\n-                                \"description\": \"Determines how much time must elapse before considering the flow to be inactive\",\n-                                \"displayName\": \"Threshold Duration\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Threshold Duration\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n+                                \"name\": \"proxy-configuration-service\",\n+                                \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.proxy.ProxyConfigurationService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n                             },\n-                            \"Wait for Activity\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"When the processor gets started or restarted, if set to true, only send an inactive indicator if there had been activity beforehand. Otherwise send an inactive indicator even if there had not been activity beforehand.\",\n-                                \"displayName\": \"Wait for Activity\",\n+                            \"storage-credentials-service\": {\n+                                \"description\": \"Controller Service used to obtain Azure Blob Storage Credentials.\",\n+                                \"displayName\": \"Storage Credentials\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Wait for Activity\",\n+                                \"name\": \"storage-credentials-service\",\n                                 \"required\": true,\n-                                \"sensitive\": false\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-azure-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.services.azure.storage.AzureStorageCredentialsService_v12\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n                             }\n                         },\n-                        \"sideEffectFree\": true,\n-                        \"stateful\": {\n-                            \"description\": \"MonitorActivity stores the last timestamp at each node as state, so that it can examine activity at cluster wide. If 'Copy Attribute' is set to true, then flow file attributes are also persisted. In local scope, it stores last known activity timestamp if the flow is inactive.\",\n-                            \"scopes\": [\n-                                \"CLUSTER\",\n-                                \"LOCAL\"\n-                            ]\n-                        },\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.processors.azure.storage.FetchAzureBlobStorage_v12\",\n+                            \"org.apache.nifi.processors.azure.storage.ListAzureBlobStorage_v12\",\n+                            \"org.apache.nifi.processors.azure.storage.PutAzureBlobStorage_v12\"\n+                        ],\n+                        \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"This relationship is used to transfer an Inactivity indicator when no FlowFiles are routed to 'success' for Threshold Duration amount of time\",\n-                                \"name\": \"inactive\"\n-                            },\n-                            {\n-                                \"description\": \"All incoming FlowFiles are routed to success\",\n+                                \"description\": \"All successfully processed FlowFiles are routed to this relationship\",\n                                 \"name\": \"success\"\n                             },\n                             {\n-                                \"description\": \"This relationship is used to transfer an Activity Restored indicator when FlowFiles are routing to 'success' following a period of inactivity\",\n-                                \"name\": \"activity.restored\"\n+                                \"description\": \"Unsuccessful operations will be transferred to the failure relationship.\",\n+                                \"name\": \"failure\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n                         \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"active\",\n-                            \"activity\",\n-                            \"detection\",\n-                            \"flow\",\n-                            \"inactive\",\n-                            \"monitor\"\n+                            \"azure\",\n+                            \"blob\",\n+                            \"cloud\",\n+                            \"microsoft\",\n+                            \"storage\"\n                         ],\n-                        \"triggerSerially\": true,\n+                        \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": true,\n-                        \"type\": \"org.apache.nifi.processors.standard.MonitorActivity\",\n-                        \"typeDescription\": \"Monitors the flow for activity and sends out an indicator when the flow has not had any data for some specified amount of time and again when the flow's activity is restored\",\n-                        \"version\": \"1.27.0\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"The time at which Inactivity began, in the form of milliseconds since Epoch\",\n-                                \"name\": \"inactivityStartMillis\"\n-                            },\n-                            {\n-                                \"description\": \"The number of milliseconds that the inactivity has spanned\",\n-                                \"name\": \"inactivityDurationMillis\"\n-                            }\n-                        ]\n+                        \"triggerWhenEmpty\": false,\n+                        \"type\": \"org.apache.nifi.processors.azure.storage.DeleteAzureBlobStorage_v12\",\n+                        \"typeDescription\": \"Deletes the specified blob from Azure Blob Storage. The processor uses Azure Blob Storage client library v12.\",\n+                        \"version\": \"1.27.0\"\n                     },\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-standard-nar\",\n+                        \"artifact\": \"nifi-azure-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n-                            \"EVENT_DRIVEN\": 0,\n                             \"TIMER_DRIVEN\": 1\n                         },\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"attribute-cache-regex\": {\n-                                \"description\": \"Any attributes whose names match this regex will be stored in the distributed cache to be copied to any FlowFiles released from a corresponding Wait processor.  Note that the uuid attribute will not be cached regardless of this value.  If blank, no attributes will be cached.\",\n-                                \"displayName\": \"Attribute Cache Regex\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"attribute-cache-regex\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"distributed-cache-service\": {\n-                                \"description\": \"The Controller Service that is used to cache release signals in order to release files queued at a corresponding Wait processor\",\n-                                \"displayName\": \"Distributed Cache Service\",\n+                            \"adls-credentials-service\": {\n+                                \"description\": \"Controller Service used to obtain Azure Credentials.\",\n+                                \"displayName\": \"ADLS Credentials\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"distributed-cache-service\",\n+                                \"name\": \"adls-credentials-service\",\n                                 \"required\": true,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"artifact\": \"nifi-azure-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.distributed.cache.client.AtomicDistributedMapCacheClient\",\n+                                    \"type\": \"org.apache.nifi.services.azure.storage.ADLSCredentialsService\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             },\n-                            \"release-signal-id\": {\n-                                \"description\": \"A value, or the results of an Attribute Expression Language statement, which will be evaluated against a FlowFile in order to determine the release signal cache key\",\n-                                \"displayName\": \"Release Signal Identifier\",\n+                            \"directory-name\": {\n+                                \"description\": \"Name of the Azure Storage Directory. The Directory Name cannot contain a leading '/'. The root directory can be designated by the empty string value. In case of the PutAzureDataLakeStorage processor, the directory will be created if not already existing.\",\n+                                \"displayName\": \"Directory Name\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"release-signal-id\",\n+                                \"name\": \"directory-name\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"signal-buffer-count\": {\n-                                \"defaultValue\": \"1\",\n-                                \"description\": \"Specify the maximum number of incoming flow files that can be buffered until signals are notified to cache service. The more buffer can provide the better performance, as it reduces the number of interactions with cache service by grouping signals by signal identifier when multiple incoming flow files share the same signal identifier.\",\n-                                \"displayName\": \"Signal Buffer Count\",\n+                            \"file-name\": {\n+                                \"defaultValue\": \"${azure.filename}\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"file\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Filesystem Object Type\",\n+                                        \"propertyName\": \"filesystem-object-type\"\n+                                    }\n+                                ],\n+                                \"description\": \"The filename\",\n+                                \"displayName\": \"File Name\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"signal-buffer-count\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"file-name\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"signal-counter-delta\": {\n-                                \"defaultValue\": \"1\",\n-                                \"description\": \"A value, or the results of an Attribute Expression Language statement, which will be evaluated against a FlowFile in order to determine the signal counter delta. Specify how much the counter should increase. For example, if multiple signal events are processed at upstream flow in batch oriented way, the number of events processed can be notified with this property at once. Zero (0) has a special meaning, it clears target count back to 0, which is especially useful when used with Wait Releasable FlowFile Count = Zero (0) mode, to provide 'open-close-gate' type of flow control. One (1) can open a corresponding Wait processor, and Zero (0) can negate it as if closing a gate.\",\n-                                \"displayName\": \"Signal Counter Delta\",\n+                            \"filesystem-name\": {\n+                                \"description\": \"Name of the Azure Storage File System (also called Container). It is assumed to be already existing.\",\n+                                \"displayName\": \"Filesystem Name\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"signal-counter-delta\",\n+                                \"name\": \"filesystem-name\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"signal-counter-name\": {\n-                                \"defaultValue\": \"default\",\n-                                \"description\": \"A value, or the results of an Attribute Expression Language statement, which will be evaluated against a FlowFile in order to determine the signal counter name. Signal counter name is useful when a corresponding Wait processor needs to know the number of occurrences of different types of events, such as success or failure, or destination data source names, etc.\",\n-                                \"displayName\": \"Signal Counter Name\",\n+                            \"filesystem-object-type\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"The object to be deleted is a file.\",\n+                                        \"displayName\": \"File\",\n+                                        \"value\": \"file\"\n+                                    },\n+                                    {\n+                                        \"description\": \"The object to be deleted is a directory.\",\n+                                        \"displayName\": \"Directory\",\n+                                        \"value\": \"directory\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"file\",\n+                                \"description\": \"They type of the file system object to be deleted. It can be either folder or file.\",\n+                                \"displayName\": \"Filesystem Object Type\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"signal-counter-name\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"filesystem-object-type\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n+                            },\n+                            \"proxy-configuration-service\": {\n+                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests. Supported proxies: SOCKS, HTTP In case of SOCKS, it is not guaranteed that the selected SOCKS Version will be used by the processor.\",\n+                                \"displayName\": \"Proxy Configuration Service\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"proxy-configuration-service\",\n+                                \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.proxy.ProxyConfigurationService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n                             }\n                         },\n                         \"seeAlso\": [\n-                            \"org.apache.nifi.distributed.cache.client.DistributedMapCacheClientService\",\n-                            \"org.apache.nifi.distributed.cache.server.map.DistributedMapCacheServer\",\n-                            \"org.apache.nifi.processors.standard.Wait\"\n+                            \"org.apache.nifi.processors.azure.storage.FetchAzureDataLakeStorage\",\n+                            \"org.apache.nifi.processors.azure.storage.ListAzureDataLakeStorage\",\n+                            \"org.apache.nifi.processors.azure.storage.PutAzureDataLakeStorage\"\n                         ],\n                         \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"All FlowFiles where the release signal has been successfully entered in the cache will be routed to this relationship\",\n+                                \"description\": \"Files that have been successfully written to Azure storage are transferred to this relationship\",\n                                 \"name\": \"success\"\n                             },\n                             {\n-                                \"description\": \"When the cache cannot be reached, or if the Release Signal Identifier evaluates to null or empty, FlowFiles will be routed to this relationship\",\n+                                \"description\": \"Files that could not be written to Azure storage for some reason are transferred to this relationship\",\n                                 \"name\": \"failure\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\",\n-                            \"EVENT_DRIVEN\"\n+                            \"CRON_DRIVEN\"\n                         ],\n-                        \"supportsBatching\": true,\n+                        \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": true,\n+                        \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"cache\",\n-                            \"distributed\",\n-                            \"map\",\n-                            \"notify\",\n-                            \"release\",\n-                            \"signal\"\n+                            \"adlsgen2\",\n+                            \"azure\",\n+                            \"cloud\",\n+                            \"datalake\",\n+                            \"microsoft\",\n+                            \"storage\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.standard.Notify\",\n-                        \"typeDescription\": \"Caches a release signal identifier in the distributed cache, optionally along with the FlowFile's attributes.  Any flow files held at a corresponding Wait processor will be released once this signal in the cache is discovered.\",\n-                        \"version\": \"1.27.0\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"All FlowFiles will have an attribute 'notified'. The value of this attribute is true, is the FlowFile is notified, otherwise false.\",\n-                                \"name\": \"notified\"\n-                            }\n-                        ]\n+                        \"type\": \"org.apache.nifi.processors.azure.storage.DeleteAzureDataLakeStorage\",\n+                        \"typeDescription\": \"Deletes the provided file from Azure Data Lake Storage\",\n+                        \"version\": \"1.27.0\"\n                     },\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-standard-nar\",\n+                        \"artifact\": \"nifi-azure-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -114746,1717 +114809,1863 @@\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n+                        \"deprecated\": true,\n+                        \"deprecationAlternatives\": [\n+                            \"org.apache.nifi.processors.azure.storage.FetchAzureBlobStorage_v12\"\n+                        ],\n+                        \"deprecationReason\": \"Processor depends on legacy Microsoft Azure SDK\",\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"max-batch-size\": {\n-                                \"defaultValue\": \"1\",\n-                                \"description\": \"Maximum number of FlowFiles to package into one output FlowFile using a best effort, non guaranteed approach. Multiple input queues can produce unexpected batching behavior.\",\n-                                \"displayName\": \"Maximum Batch Size\",\n+                            \"blob\": {\n+                                \"defaultValue\": \"${azure.blobname}\",\n+                                \"description\": \"The filename of the blob\",\n+                                \"displayName\": \"Blob\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"blob\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"container-name\": {\n+                                \"description\": \"Name of the Azure storage container. In case of PutAzureBlobStorage processor, container can be created if it does not exist.\",\n+                                \"displayName\": \"Container Name\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"container-name\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"cse-key-id\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"SYMMETRIC\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Client-Side Encryption Key Type\",\n+                                        \"propertyName\": \"cse-key-type\"\n+                                    }\n+                                ],\n+                                \"description\": \"Specifies the ID of the key to use for client-side encryption.\",\n+                                \"displayName\": \"Client-Side Encryption Key ID\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"cse-key-id\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"cse-key-type\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"The blobs sent to Azure are not encrypted.\",\n+                                        \"displayName\": \"NONE\",\n+                                        \"value\": \"NONE\"\n+                                    },\n+                                    {\n+                                        \"description\": \"The blobs sent to Azure are encrypted using a symmetric algorithm.\",\n+                                        \"displayName\": \"SYMMETRIC\",\n+                                        \"value\": \"SYMMETRIC\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"NONE\",\n+                                \"description\": \"Specifies the key type to use for client-side encryption.\",\n+                                \"displayName\": \"Client-Side Encryption Key Type\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"max-batch-size\",\n+                                \"name\": \"cse-key-type\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n+                            },\n+                            \"cse-symmetric-key-hex\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"SYMMETRIC\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Client-Side Encryption Key Type\",\n+                                        \"propertyName\": \"cse-key-type\"\n+                                    }\n+                                ],\n+                                \"description\": \"When using symmetric client-side encryption, this is the raw key, encoded in hexadecimal\",\n+                                \"displayName\": \"Symmetric Key\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"cse-symmetric-key-hex\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n+                            },\n+                            \"proxy-configuration-service\": {\n+                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests. Supported proxies: SOCKS, HTTP In case of SOCKS, it is not guaranteed that the selected SOCKS Version will be used by the processor.\",\n+                                \"displayName\": \"Proxy Configuration Service\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"proxy-configuration-service\",\n+                                \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.proxy.ProxyConfigurationService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"range-length\": {\n+                                \"description\": \"The number of bytes to download from the blob, starting from the Range Start. An empty value or a value that extends beyond the end of the blob will read to the end of the blob.\",\n+                                \"displayName\": \"Range Length\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"range-length\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"range-start\": {\n+                                \"description\": \"The byte position at which to start reading from the blob. An empty value or a value of zero will start reading at the beginning of the blob.\",\n+                                \"displayName\": \"Range Start\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"range-start\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"storage-account-key\": {\n+                                \"description\": \"The storage account key. This is an admin-like password providing access to every container in this account. It is recommended one uses Shared Access Signature (SAS) token instead for fine-grained control with policies. There are certain risks in allowing the account key to be stored as a flowfile attribute. While it does provide for a more flexible flow by allowing the account key to be fetched dynamically from a flowfile attribute, care must be taken to restrict access to the event provenance data (e.g., by strictly controlling the policies governing provenance for this processor). In addition, the provenance repositories may be put on encrypted disk partitions.\",\n+                                \"displayName\": \"Storage Account Key\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"storage-account-key\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n+                            },\n+                            \"storage-account-name\": {\n+                                \"description\": \"The storage account name. There are certain risks in allowing the account name to be stored as a flowfile attribute. While it does provide for a more flexible flow by allowing the account name to be fetched dynamically from a flowfile attribute, care must be taken to restrict access to the event provenance data (e.g., by strictly controlling the policies governing provenance for this processor). In addition, the provenance repositories may be put on encrypted disk partitions. Instead of defining the Storage Account Name, Storage Account Key and SAS Token properties directly on the processor, the preferred way is to configure them through a controller service specified in the Storage Credentials property. The controller service can provide a common/shared configuration for multiple/all Azure processors. Furthermore, the credentials can also be looked up dynamically with the 'Lookup' version of the service.\",\n+                                \"displayName\": \"Storage Account Name\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"storage-account-name\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n+                            },\n+                            \"storage-credentials-service\": {\n+                                \"description\": \"The Controller Service used to obtain Azure Storage Credentials. Instead of the processor level properties, the credentials can be configured here through a common/shared controller service, which is the preferred way. The 'Lookup' version of the service can also be used to select the credentials dynamically at runtime based on a FlowFile attribute (if the processor has FlowFile input).\",\n+                                \"displayName\": \"Storage Credentials\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"storage-credentials-service\",\n+                                \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-azure-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.services.azure.storage.AzureStorageCredentialsService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"storage-endpoint-suffix\": {\n+                                \"description\": \"Storage accounts in public Azure always use a common FQDN suffix. Override this endpoint suffix with a different suffix in certain circumstances (like Azure Stack or non-public Azure regions). The preferred way is to configure them through a controller service specified in the Storage Credentials property. The controller service can provide a common/shared configuration for multiple/all Azure processors. Furthermore, the credentials can also be looked up dynamically with the 'Lookup' version of the service.\",\n+                                \"displayName\": \"Common Storage Account Endpoint Suffix\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"storage-endpoint-suffix\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"storage-sas-token\": {\n+                                \"description\": \"Shared Access Signature token, including the leading '?'. Specify either SAS token (recommended) or Account Key. There are certain risks in allowing the SAS token to be stored as a flowfile attribute. While it does provide for a more flexible flow by allowing the SAS token to be fetched dynamically from a flowfile attribute, care must be taken to restrict access to the event provenance data (e.g., by strictly controlling the policies governing provenance for this processor). In addition, the provenance repositories may be put on encrypted disk partitions.\",\n+                                \"displayName\": \"SAS Token\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"storage-sas-token\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n                             }\n                         },\n                         \"seeAlso\": [\n-                            \"org.apache.nifi.processors.standard.MergeContent\",\n-                            \"org.apache.nifi.processors.standard.UnpackContent\"\n+                            \"org.apache.nifi.processors.azure.storage.DeleteAzureBlobStorage\",\n+                            \"org.apache.nifi.processors.azure.storage.ListAzureBlobStorage\",\n+                            \"org.apache.nifi.processors.azure.storage.PutAzureBlobStorage\"\n                         ],\n-                        \"sideEffectFree\": true,\n+                        \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"The packaged FlowFile is sent to this relationship\",\n+                                \"description\": \"All successfully processed FlowFiles are routed to this relationship\",\n                                 \"name\": \"success\"\n                             },\n                             {\n-                                \"description\": \"The FlowFiles that were used to create the package are sent to this relationship\",\n-                                \"name\": \"original\"\n+                                \"description\": \"Unsuccessful operations will be transferred to the failure relationship.\",\n+                                \"name\": \"failure\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n-                        \"supportsBatching\": true,\n+                        \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"attributes\",\n-                            \"flowfile\",\n-                            \"flowfile-stream\",\n-                            \"flowfile-stream-v3\",\n-                            \"package\"\n+                            \"azure\",\n+                            \"blob\",\n+                            \"cloud\",\n+                            \"microsoft\",\n+                            \"storage\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.standard.PackageFlowFile\",\n-                        \"typeDescription\": \"This processor will package FlowFile attributes and content into an output FlowFile that can be exported from NiFi and imported back into NiFi, preserving the original attributes and content.\",\n+                        \"type\": \"org.apache.nifi.processors.azure.storage.FetchAzureBlobStorage\",\n+                        \"typeDescription\": \"Retrieves contents of an Azure Storage Blob, writing the contents to the content of the FlowFile\",\n                         \"version\": \"1.27.0\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"The mime.type will be changed to application/flowfile-v3\",\n-                                \"name\": \"mime.type\"\n+                                \"description\": \"The length of the blob fetched\",\n+                                \"name\": \"azure.length\"\n                             }\n                         ]\n                     },\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-standard-nar\",\n+                        \"artifact\": \"nifi-azure-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n-                            \"EVENT_DRIVEN\": 0,\n                             \"TIMER_DRIVEN\": 1\n                         },\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"ACCEPT_EMPTY_EXTENSIONS\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n+                            \"Client-Side Encryption Key ID\": {\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"dependentValues\": [\n+                                            \"LOCAL\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Client-Side Encryption Key Type\",\n+                                        \"propertyName\": \"Client-Side Encryption Key Type\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"If set to true, empty extensions will be accepted and will be associated to a null value.\",\n-                                \"displayName\": \"Accept empty extensions\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"ACCEPT_EMPTY_EXTENSIONS\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"APPEND_RAW_MESSAGE_TO_JSON\": {\n-                                \"defaultValue\": \"true\",\n-                                \"description\": \"When using flowfile-content (i.e. JSON output), add the original CEF message to the resulting JSON object. The original message is added as a string to _raw.\",\n-                                \"displayName\": \"Append raw message to JSON\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"APPEND_RAW_MESSAGE_TO_JSON\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"DATETIME_REPRESENTATION\": {\n-                                \"defaultValue\": \"en-US\",\n-                                \"description\": \"The IETF BCP 47 representation of the Locale to be used when parsing date fields with long or short month names (e.g. may <en-US> vs. mai. <fr-FR>. The defaultvalue is generally safe. Only change if having issues parsing CEF messages\",\n-                                \"displayName\": \"DateTime Locale\",\n+                                \"description\": \"Specifies the ID of the key to use for client-side encryption.\",\n+                                \"displayName\": \"Client-Side Encryption Key ID\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"DATETIME_REPRESENTATION\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Client-Side Encryption Key ID\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"FIELDS_DESTINATION\": {\n+                            \"Client-Side Encryption Key Type\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"flowfile-content\",\n-                                        \"value\": \"flowfile-content\"\n+                                        \"description\": \"Client-Side Encryption disabled\",\n+                                        \"displayName\": \"NONE\",\n+                                        \"value\": \"NONE\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"flowfile-attribute\",\n-                                        \"value\": \"flowfile-attribute\"\n+                                        \"description\": \"Client-Side Encryption enabled using local key\",\n+                                        \"displayName\": \"LOCAL\",\n+                                        \"value\": \"LOCAL\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"flowfile-content\",\n-                                \"description\": \"Indicates whether the results of the CEF parser are written to the FlowFile content or a FlowFile attribute; if using flowfile-attributeattribute, fields will be populated as attributes. If set to flowfile-content, the CEF extension field will be converted into a flat JSON object.\",\n-                                \"displayName\": \"Parsed fields destination\",\n+                                \"defaultValue\": \"NONE\",\n+                                \"description\": \"Specifies the key type to use for client-side encryption.\",\n+                                \"displayName\": \"Client-Side Encryption Key Type\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"FIELDS_DESTINATION\",\n+                                \"name\": \"Client-Side Encryption Key Type\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"INCLUDE_CUSTOM_EXTENSIONS\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n+                            \"Client-Side Encryption Local Key\": {\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"dependentValues\": [\n+                                            \"LOCAL\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Client-Side Encryption Key Type\",\n+                                        \"propertyName\": \"Client-Side Encryption Key Type\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"If set to true, custom extensions (not specified in the CEF specifications) will be included in the generated data/attributes.\",\n-                                \"displayName\": \"Include custom extensions\",\n+                                \"description\": \"When using local client-side encryption, this is the raw key, encoded in hexadecimal\",\n+                                \"displayName\": \"Client-Side Encryption Local Key\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"INCLUDE_CUSTOM_EXTENSIONS\",\n+                                \"name\": \"Client-Side Encryption Local Key\",\n+                                \"required\": true,\n+                                \"sensitive\": true\n+                            },\n+                            \"blob-name\": {\n+                                \"defaultValue\": \"${azure.blobname}\",\n+                                \"description\": \"The full name of the blob\",\n+                                \"displayName\": \"Blob Name\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"blob-name\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"TIME_REPRESENTATION\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"UTC\",\n-                                        \"value\": \"UTC\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Local Timezone (system Default)\",\n-                                        \"value\": \"Local Timezone (system Default)\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"Local Timezone (system Default)\",\n-                                \"description\": \"Timezone to be used when representing date fields. UTC will convert all dates to UTC, while Local Timezone will convert them to the timezone used by NiFi.\",\n-                                \"displayName\": \"Timezone\",\n+                            \"container-name\": {\n+                                \"defaultValue\": \"${azure.container}\",\n+                                \"description\": \"Name of the Azure storage container. In case of PutAzureBlobStorage processor, container can be created if it does not exist.\",\n+                                \"displayName\": \"Container Name\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"container-name\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"proxy-configuration-service\": {\n+                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests. Supported proxies: SOCKS, HTTP In case of SOCKS, it is not guaranteed that the selected SOCKS Version will be used by the processor.\",\n+                                \"displayName\": \"Proxy Configuration Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"TIME_REPRESENTATION\",\n-                                \"required\": true,\n+                                \"name\": \"proxy-configuration-service\",\n+                                \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.proxy.ProxyConfigurationService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"range-length\": {\n+                                \"description\": \"The number of bytes to download from the blob, starting from the Range Start. An empty value or a value that extends beyond the end of the blob will read to the end of the blob.\",\n+                                \"displayName\": \"Range Length\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"range-length\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"VALIDATE_DATA\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"true\",\n-                                \"description\": \"If set to true, the event will be validated against the CEF standard (revision 23). If the event is invalid, the FlowFile will be routed to the failure relationship. If this property is set to false, the event will be processed without validating the data.\",\n-                                \"displayName\": \"Validate the CEF event\",\n+                            \"range-start\": {\n+                                \"description\": \"The byte position at which to start reading from the blob. An empty value or a value of zero will start reading at the beginning of the blob.\",\n+                                \"displayName\": \"Range Start\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"range-start\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"storage-credentials-service\": {\n+                                \"description\": \"Controller Service used to obtain Azure Blob Storage Credentials.\",\n+                                \"displayName\": \"Storage Credentials\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"VALIDATE_DATA\",\n+                                \"name\": \"storage-credentials-service\",\n                                 \"required\": true,\n-                                \"sensitive\": false\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-azure-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.services.azure.storage.AzureStorageCredentialsService_v12\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n                             }\n                         },\n                         \"seeAlso\": [\n-                            \"org.apache.nifi.processors.standard.ParseSyslog\"\n+                            \"org.apache.nifi.processors.azure.storage.DeleteAzureBlobStorage_v12\",\n+                            \"org.apache.nifi.processors.azure.storage.ListAzureBlobStorage_v12\",\n+                            \"org.apache.nifi.processors.azure.storage.PutAzureBlobStorage_v12\"\n                         ],\n-                        \"sideEffectFree\": true,\n+                        \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"Any FlowFile that is successfully parsed as a CEF message will be transferred to this Relationship.\",\n+                                \"description\": \"All successfully processed FlowFiles are routed to this relationship\",\n                                 \"name\": \"success\"\n                             },\n                             {\n-                                \"description\": \"Any FlowFile that could not be parsed as a CEF message will be transferred to this Relationship without any attributes being added\",\n+                                \"description\": \"Unsuccessful operations will be transferred to the failure relationship.\",\n                                 \"name\": \"failure\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\",\n-                            \"EVENT_DRIVEN\"\n+                            \"CRON_DRIVEN\"\n                         ],\n-                        \"supportsBatching\": true,\n+                        \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": true,\n+                        \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"attributes\",\n-                            \"cef\",\n-                            \"event\",\n-                            \"logs\",\n-                            \"message\",\n-                            \"system\"\n+                            \"azure\",\n+                            \"blob\",\n+                            \"cloud\",\n+                            \"microsoft\",\n+                            \"storage\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.standard.ParseCEF\",\n-                        \"typeDescription\": \"Parses the contents of a CEF formatted message and adds attributes to the FlowFile for headers and extensions of the parts of the CEF message.\\nNote: This Processor expects CEF messages WITHOUT the syslog headers (i.e. starting at \\\"CEF:0\\\"\",\n+                        \"type\": \"org.apache.nifi.processors.azure.storage.FetchAzureBlobStorage_v12\",\n+                        \"typeDescription\": \"Retrieves the specified blob from Azure Blob Storage and writes its content to the content of the FlowFile. The processor uses Azure Blob Storage client library v12.\",\n                         \"version\": \"1.27.0\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"The version of the CEF message.\",\n-                                \"name\": \"cef.header.version\"\n+                                \"description\": \"The name of the Azure Blob Storage container\",\n+                                \"name\": \"azure.container\"\n                             },\n                             {\n-                                \"description\": \"The Device Vendor of the CEF message.\",\n-                                \"name\": \"cef.header.deviceVendor\"\n+                                \"description\": \"The name of the blob on Azure Blob Storage\",\n+                                \"name\": \"azure.blobname\"\n                             },\n                             {\n-                                \"description\": \"The Device Product of the CEF message.\",\n-                                \"name\": \"cef.header.deviceProduct\"\n+                                \"description\": \"Primary location of the blob\",\n+                                \"name\": \"azure.primaryUri\"\n                             },\n                             {\n-                                \"description\": \"The Device Version of the CEF message.\",\n-                                \"name\": \"cef.header.deviceVersion\"\n+                                \"description\": \"ETag of the blob\",\n+                                \"name\": \"azure.etag\"\n                             },\n                             {\n-                                \"description\": \"The Device Event Class ID of the CEF message.\",\n-                                \"name\": \"cef.header.deviceEventClassId\"\n+                                \"description\": \"Type of the blob (either BlockBlob, PageBlob or AppendBlob)\",\n+                                \"name\": \"azure.blobtype\"\n                             },\n                             {\n-                                \"description\": \"The name of the CEF message.\",\n-                                \"name\": \"cef.header.name\"\n+                                \"description\": \"MIME Type of the content\",\n+                                \"name\": \"mime.type\"\n                             },\n                             {\n-                                \"description\": \"The severity of the CEF message.\",\n-                                \"name\": \"cef.header.severity\"\n+                                \"description\": \"Language code for the content\",\n+                                \"name\": \"lang\"\n                             },\n                             {\n-                                \"description\": \"The key and value generated by the parsing of the message.\",\n-                                \"name\": \"cef.extension.*\"\n+                                \"description\": \"Timestamp of the blob\",\n+                                \"name\": \"azure.timestamp\"\n+                            },\n+                            {\n+                                \"description\": \"Length of the blob\",\n+                                \"name\": \"azure.length\"\n                             }\n                         ]\n                     },\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-standard-nar\",\n+                        \"artifact\": \"nifi-azure-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n-                            \"EVENT_DRIVEN\": 0,\n                             \"TIMER_DRIVEN\": 1\n                         },\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Character Set\": {\n-                                \"defaultValue\": \"UTF-8\",\n-                                \"description\": \"Specifies which character set of the Syslog messages\",\n-                                \"displayName\": \"Character Set\",\n+                            \"adls-credentials-service\": {\n+                                \"description\": \"Controller Service used to obtain Azure Credentials.\",\n+                                \"displayName\": \"ADLS Credentials\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Character Set\",\n+                                \"name\": \"adls-credentials-service\",\n+                                \"required\": true,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-azure-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.services.azure.storage.ADLSCredentialsService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"directory-name\": {\n+                                \"description\": \"Name of the Azure Storage Directory. The Directory Name cannot contain a leading '/'. The root directory can be designated by the empty string value. In case of the PutAzureDataLakeStorage processor, the directory will be created if not already existing.\",\n+                                \"displayName\": \"Directory Name\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"directory-name\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"file-name\": {\n+                                \"defaultValue\": \"${azure.filename}\",\n+                                \"description\": \"The filename\",\n+                                \"displayName\": \"File Name\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"file-name\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"filesystem-name\": {\n+                                \"description\": \"Name of the Azure Storage File System (also called Container). It is assumed to be already existing.\",\n+                                \"displayName\": \"Filesystem Name\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"filesystem-name\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n+                            },\n+                            \"number-of-retries\": {\n+                                \"defaultValue\": \"0\",\n+                                \"description\": \"The number of automatic retries to perform if the download fails.\",\n+                                \"displayName\": \"Number of Retries\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"number-of-retries\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"proxy-configuration-service\": {\n+                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests. Supported proxies: SOCKS, HTTP In case of SOCKS, it is not guaranteed that the selected SOCKS Version will be used by the processor.\",\n+                                \"displayName\": \"Proxy Configuration Service\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"proxy-configuration-service\",\n+                                \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.proxy.ProxyConfigurationService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"range-length\": {\n+                                \"description\": \"The number of bytes to download from the object, starting from the Range Start. An empty value or a value that extends beyond the end of the object will read to the end of the object.\",\n+                                \"displayName\": \"Range Length\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"range-length\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"range-start\": {\n+                                \"description\": \"The byte position at which to start reading from the object. An empty value or a value of zero will start reading at the beginning of the object.\",\n+                                \"displayName\": \"Range Start\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"range-start\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n                             }\n                         },\n                         \"seeAlso\": [\n-                            \"org.apache.nifi.processors.standard.ListenSyslog\",\n-                            \"org.apache.nifi.processors.standard.PutSyslog\"\n+                            \"org.apache.nifi.processors.azure.storage.DeleteAzureDataLakeStorage\",\n+                            \"org.apache.nifi.processors.azure.storage.ListAzureDataLakeStorage\",\n+                            \"org.apache.nifi.processors.azure.storage.PutAzureDataLakeStorage\"\n                         ],\n-                        \"sideEffectFree\": true,\n+                        \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"Any FlowFile that is successfully parsed as a Syslog message will be to this Relationship.\",\n+                                \"description\": \"Files that have been successfully written to Azure storage are transferred to this relationship\",\n                                 \"name\": \"success\"\n                             },\n                             {\n-                                \"description\": \"Any FlowFile that could not be parsed as a Syslog message will be transferred to this Relationship without any attributes being added\",\n+                                \"description\": \"Files that could not be written to Azure storage for some reason are transferred to this relationship\",\n                                 \"name\": \"failure\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\",\n-                            \"EVENT_DRIVEN\"\n+                            \"CRON_DRIVEN\"\n                         ],\n-                        \"supportsBatching\": true,\n+                        \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": true,\n+                        \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"attributes\",\n-                            \"event\",\n-                            \"logs\",\n-                            \"message\",\n-                            \"syslog\",\n-                            \"system\"\n+                            \"adlsgen2\",\n+                            \"azure\",\n+                            \"cloud\",\n+                            \"datalake\",\n+                            \"microsoft\",\n+                            \"storage\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.standard.ParseSyslog\",\n-                        \"typeDescription\": \"Attempts to parses the contents of a Syslog message in accordance to RFC5424 and RFC3164 formats and adds attributes to the FlowFile for each of the parts of the Syslog message.Note: Be mindfull that RFC3164 is informational and a wide range of different implementations are present in the wild. If messages fail parsing, considering using RFC5424 or using a generic parsing processors such as ExtractGrok.\",\n+                        \"type\": \"org.apache.nifi.processors.azure.storage.FetchAzureDataLakeStorage\",\n+                        \"typeDescription\": \"Fetch the provided file from Azure Data Lake Storage\",\n                         \"version\": \"1.27.0\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"The priority of the Syslog message.\",\n-                                \"name\": \"syslog.priority\"\n-                            },\n-                            {\n-                                \"description\": \"The severity of the Syslog message derived from the priority.\",\n-                                \"name\": \"syslog.severity\"\n-                            },\n-                            {\n-                                \"description\": \"The facility of the Syslog message derived from the priority.\",\n-                                \"name\": \"syslog.facility\"\n-                            },\n-                            {\n-                                \"description\": \"The optional version from the Syslog message.\",\n-                                \"name\": \"syslog.version\"\n-                            },\n-                            {\n-                                \"description\": \"The timestamp of the Syslog message.\",\n-                                \"name\": \"syslog.timestamp\"\n-                            },\n-                            {\n-                                \"description\": \"The hostname or IP address of the Syslog message.\",\n-                                \"name\": \"syslog.hostname\"\n+                                \"description\": \"The HTTP error code (if available) from the failed operation\",\n+                                \"name\": \"azure.datalake.storage.statusCode\"\n                             },\n                             {\n-                                \"description\": \"The hostname of the Syslog server that sent the message.\",\n-                                \"name\": \"syslog.sender\"\n+                                \"description\": \"The Azure Data Lake Storage moniker of the failed operation\",\n+                                \"name\": \"azure.datalake.storage.errorCode\"\n                             },\n                             {\n-                                \"description\": \"The body of the Syslog message, everything after the hostname.\",\n-                                \"name\": \"syslog.body\"\n+                                \"description\": \"The Azure Data Lake Storage error message from the failed operation\",\n+                                \"name\": \"azure.datalake.storage.errorMessage\"\n                             }\n                         ]\n                     },\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-standard-nar\",\n+                        \"artifact\": \"nifi-azure-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n-                            \"EVENT_DRIVEN\": 0,\n                             \"TIMER_DRIVEN\": 1\n                         },\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"0 sec\"\n+                            \"TIMER_DRIVEN\": \"1 min\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n+                        \"deprecated\": true,\n+                        \"deprecationAlternatives\": [\n+                            \"org.apache.nifi.processors.azure.storage.ListAzureBlobStorage_v12\"\n+                        ],\n+                        \"deprecationReason\": \"Processor depends on legacy Microsoft Azure SDK\",\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_REQUIRED\",\n-                        \"primaryNodeOnly\": false,\n+                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n+                        \"primaryNodeOnly\": true,\n                         \"propertyDescriptors\": {\n-                            \"Character Set\": {\n-                                \"defaultValue\": \"UTF-8\",\n-                                \"description\": \"Specifies which character set of the Syslog messages\",\n-                                \"displayName\": \"Character Set\",\n+                            \"Maximum File Age\": {\n+                                \"description\": \"The maximum age that a file must be in order to be pulled; any file older than this amount of time (according to last modification date) will be ignored\",\n+                                \"displayName\": \"Maximum File Age\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Character Set\",\n+                                \"name\": \"Maximum File Age\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Maximum File Size\": {\n+                                \"description\": \"The maximum size that a file can be in order to be pulled\",\n+                                \"displayName\": \"Maximum File Size\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Maximum File Size\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Minimum File Age\": {\n+                                \"defaultValue\": \"0 sec\",\n+                                \"description\": \"The minimum age that a file must be in order to be pulled; any file younger than this amount of time (according to last modification date) will be ignored\",\n+                                \"displayName\": \"Minimum File Age\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Minimum File Age\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"include_policy\": {\n+                            \"Minimum File Size\": {\n+                                \"defaultValue\": \"0 B\",\n+                                \"description\": \"The minimum size that a file must be in order to be pulled\",\n+                                \"displayName\": \"Minimum File Size\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Minimum File Size\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"container-name\": {\n+                                \"description\": \"Name of the Azure storage container. In case of PutAzureBlobStorage processor, container can be created if it does not exist.\",\n+                                \"displayName\": \"Container Name\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"container-name\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"et-initial-listing-target\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"description\": \"Ignore entities having timestamp older than the specified 'Tracking Time Window' at the initial listing activity.\",\n+                                        \"displayName\": \"Tracking Time Window\",\n+                                        \"value\": \"window\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"description\": \"Regardless of entities timestamp, all existing entities will be listed at the initial listing activity.\",\n+                                        \"displayName\": \"All Available\",\n+                                        \"value\": \"all\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"true\",\n-                                \"description\": \"If true, then the Syslog Message body will be included in the attributes.\",\n-                                \"displayName\": \"Include Message Body in Attributes\",\n+                                \"defaultValue\": \"all\",\n+                                \"description\": \"Specify how initial listing should be handled. Used by 'Tracking Entities' strategy.\",\n+                                \"displayName\": \"Entity Tracking Initial Listing Target\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"include_policy\",\n+                                \"name\": \"et-initial-listing-target\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"nil_policy\": {\n+                            \"et-state-cache\": {\n+                                \"description\": \"Listed entities are stored in the specified cache storage so that this processor can resume listing across NiFi restart or in case of primary node change. 'Tracking Entities' strategy require tracking information of all listed entities within the last 'Tracking Time Window'. To support large number of entities, the strategy uses DistributedMapCache instead of managed state. Cache key format is 'ListedEntities::{processorId}(::{nodeId})'. If it tracks per node listed entities, then the optional '::{nodeId}' part is added to manage state separately. E.g. cluster wide cache key = 'ListedEntities::8dda2321-0164-1000-50fa-3042fe7d6a7b', per node cache key = 'ListedEntities::8dda2321-0164-1000-50fa-3042fe7d6a7b::nifi-node3' The stored cache content is Gzipped JSON string. The cache key will be deleted when target listing configuration is changed. Used by 'Tracking Entities' strategy.\",\n+                                \"displayName\": \"Entity Tracking State Cache\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"et-state-cache\",\n+                                \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.distributed.cache.client.DistributedMapCacheClient\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"et-time-window\": {\n+                                \"defaultValue\": \"3 hours\",\n+                                \"description\": \"Specify how long this processor should track already-listed entities. 'Tracking Entities' strategy can pick any entity whose timestamp is inside the specified time window. For example, if set to '30 minutes', any entity having timestamp in recent 30 minutes will be the listing target when this processor runs. A listed entity is considered 'new/updated' and a FlowFile is emitted if one of following condition meets: 1. does not exist in the already-listed entities, 2. has newer timestamp than the cached entity, 3. has different size than the cached entity. If a cached entity's timestamp becomes older than specified time window, that entity will be removed from the cached already-listed entities. Used by 'Tracking Entities' strategy.\",\n+                                \"displayName\": \"Entity Tracking Time Window\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"et-time-window\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"listing-strategy\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"The missing field will not have an attribute added.\",\n-                                        \"displayName\": \"OMIT\",\n-                                        \"value\": \"OMIT\"\n+                                        \"description\": \"This strategy tracks the latest timestamp of listed entity to determine new/updated entities. Since it only tracks few timestamps, it can manage listing state efficiently. However, any newly added, or updated entity having timestamp older than the tracked latest timestamp can not be picked by this strategy. For example, such situation can happen in a file system if a file with old timestamp is copied or moved into the target directory without its last modified timestamp being updated. Also may miss files when multiple subdirectories are being written at the same time while listing is running.\",\n+                                        \"displayName\": \"Tracking Timestamps\",\n+                                        \"value\": \"timestamps\"\n                                     },\n                                     {\n-                                        \"description\": \"The missing field will have an empty attribute added.\",\n-                                        \"displayName\": \"NULL\",\n-                                        \"value\": \"NULL\"\n+                                        \"description\": \"This strategy tracks information of all the listed entities within the latest 'Entity Tracking Time Window' to determine new/updated entities. This strategy can pick entities having old timestamp that can be missed with 'Tracking Timestamps'. Works even when multiple subdirectories are being written at the same time while listing is running. However additional DistributedMapCache controller service is required and more JVM heap memory is used. See the description of 'Entity Tracking Time Window' property for further details on how it works.\",\n+                                        \"displayName\": \"Tracking Entities\",\n+                                        \"value\": \"entities\"\n                                     },\n                                     {\n-                                        \"description\": \"The missing field will have an attribute added with the value of '-'.\",\n-                                        \"displayName\": \"DASH\",\n-                                        \"value\": \"DASH\"\n+                                        \"description\": \"This strategy lists an entity without any tracking. The same entity will be listed each time on executing this processor. It is recommended to change the default run schedule value. Any property that related to the persisting state will be disregarded.\",\n+                                        \"displayName\": \"No Tracking\",\n+                                        \"value\": \"none\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"NULL\",\n-                                \"description\": \"Defines how NIL values are handled for header fields.\",\n-                                \"displayName\": \"NIL Policy\",\n+                                \"defaultValue\": \"timestamps\",\n+                                \"description\": \"Specify how to determine new/updated entities. See each strategy descriptions for detail.\",\n+                                \"displayName\": \"Listing Strategy\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"nil_policy\",\n+                                \"name\": \"listing-strategy\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n-                            }\n-                        },\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.processors.standard.ListenSyslog\",\n-                            \"org.apache.nifi.processors.standard.ParseSyslog\",\n-                            \"org.apache.nifi.processors.standard.PutSyslog\"\n-                        ],\n-                        \"sideEffectFree\": true,\n-                        \"supportedRelationships\": [\n-                            {\n-                                \"description\": \"Any FlowFile that is successfully parsed as a Syslog message will be to this Relationship.\",\n-                                \"name\": \"success\"\n-                            },\n-                            {\n-                                \"description\": \"Any FlowFile that could not be parsed as a Syslog message will be transferred to this Relationship without any attributes being added\",\n-                                \"name\": \"failure\"\n-                            }\n-                        ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\",\n-                            \"EVENT_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": true,\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": true,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"attributes\",\n-                            \"event\",\n-                            \"logs\",\n-                            \"message\",\n-                            \"syslog\",\n-                            \"syslog5424\",\n-                            \"system\"\n-                        ],\n-                        \"triggerSerially\": false,\n-                        \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.standard.ParseSyslog5424\",\n-                        \"typeDescription\": \"Attempts to parse the contents of a well formed Syslog message in accordance to RFC5424 format and adds attributes to the FlowFile for each of the parts of the Syslog message, including Structured Data.Structured Data will be written to attributes as one attribute per item id + parameter see https://tools.ietf.org/html/rfc5424.Note: ParseSyslog5424 follows the specification more closely than ParseSyslog.  If your Syslog producer does not follow the spec closely, with regards to using '-' for missing header entries for example, those logs will fail with this parser, where they would not fail with ParseSyslog.\",\n-                        \"version\": \"1.27.0\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"The priority of the Syslog message.\",\n-                                \"name\": \"syslog.priority\"\n-                            },\n-                            {\n-                                \"description\": \"The severity of the Syslog message derived from the priority.\",\n-                                \"name\": \"syslog.severity\"\n-                            },\n-                            {\n-                                \"description\": \"The facility of the Syslog message derived from the priority.\",\n-                                \"name\": \"syslog.facility\"\n-                            },\n-                            {\n-                                \"description\": \"The optional version from the Syslog message.\",\n-                                \"name\": \"syslog.version\"\n-                            },\n-                            {\n-                                \"description\": \"The timestamp of the Syslog message.\",\n-                                \"name\": \"syslog.timestamp\"\n-                            },\n-                            {\n-                                \"description\": \"The hostname or IP address of the Syslog message.\",\n-                                \"name\": \"syslog.hostname\"\n-                            },\n-                            {\n-                                \"description\": \"The appname of the Syslog message.\",\n-                                \"name\": \"syslog.appname\"\n-                            },\n-                            {\n-                                \"description\": \"The procid of the Syslog message.\",\n-                                \"name\": \"syslog.procid\"\n-                            },\n-                            {\n-                                \"description\": \"The messageid the Syslog message.\",\n-                                \"name\": \"syslog.messageid\"\n-                            },\n-                            {\n-                                \"description\": \"Multiple entries per structuredData of the Syslog message.\",\n-                                \"name\": \"syslog.structuredData\"\n                             },\n-                            {\n-                                \"description\": \"The hostname of the Syslog server that sent the message.\",\n-                                \"name\": \"syslog.sender\"\n+                            \"prefix\": {\n+                                \"description\": \"Search prefix for listing\",\n+                                \"displayName\": \"Prefix\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"prefix\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n                             },\n-                            {\n-                                \"description\": \"The body of the Syslog message, everything after the hostname.\",\n-                                \"name\": \"syslog.body\"\n-                            }\n-                        ]\n-                    },\n-                    {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-standard-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"e0c4461\"\n-                        },\n-                        \"defaultBulletinLevel\": \"WARN\",\n-                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": 1,\n-                            \"EVENT_DRIVEN\": 0,\n-                            \"TIMER_DRIVEN\": 1\n-                        },\n-                        \"defaultPenaltyDuration\": \"30 sec\",\n-                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"0 sec\"\n-                        },\n-                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n-                        \"defaultYieldDuration\": \"1 sec\",\n-                        \"dynamicProperties\": [\n-                            {\n-                                \"description\": \"Each dynamic property represents a RecordPath that will be evaluated against each record in an incoming FlowFile. When the value of the RecordPath is determined for a Record, an attribute is added to the outgoing FlowFile. The name of the attribute is the same as the name of this property. The value of the attribute is the same as the value of the field in the Record that the RecordPath points to. Note that no attribute will be added if the value returned for the RecordPath is null or is not a scalar value (i.e., the value is an Array, Map, or Record).\",\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"name\": \"The name given to the dynamic property is the name of the attribute that will be used to denote the value of the associated RecordPath.\",\n-                                \"value\": \"A RecordPath that points to a field in the Record.\"\n-                            }\n-                        ],\n-                        \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_REQUIRED\",\n-                        \"primaryNodeOnly\": false,\n-                        \"propertyDescriptors\": {\n-                            \"record-reader\": {\n-                                \"description\": \"Specifies the Controller Service to use for reading incoming data\",\n-                                \"displayName\": \"Record Reader\",\n+                            \"proxy-configuration-service\": {\n+                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests. Supported proxies: SOCKS, HTTP In case of SOCKS, it is not guaranteed that the selected SOCKS Version will be used by the processor.\",\n+                                \"displayName\": \"Proxy Configuration Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"record-reader\",\n-                                \"required\": true,\n+                                \"name\": \"proxy-configuration-service\",\n+                                \"required\": false,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n                                     \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n+                                    \"type\": \"org.apache.nifi.proxy.ProxyConfigurationService\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             },\n                             \"record-writer\": {\n-                                \"description\": \"Specifies the Controller Service to use for writing out the records\",\n+                                \"description\": \"Specifies the Record Writer to use for creating the listing. If not specified, one FlowFile will be created for each entity that is listed. If the Record Writer is specified, all entities will be written to a single FlowFile instead of adding attributes to individual FlowFiles.\",\n                                 \"displayName\": \"Record Writer\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n                                 \"name\": \"record-writer\",\n-                                \"required\": true,\n+                                \"required\": false,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n                                     \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n                                     \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n                                     \"version\": \"1.27.0\"\n                                 }\n+                            },\n+                            \"storage-account-key\": {\n+                                \"description\": \"The storage account key. This is an admin-like password providing access to every container in this account. It is recommended one uses Shared Access Signature (SAS) token instead for fine-grained control with policies. There are certain risks in allowing the account key to be stored as a flowfile attribute. While it does provide for a more flexible flow by allowing the account key to be fetched dynamically from a flowfile attribute, care must be taken to restrict access to the event provenance data (e.g., by strictly controlling the policies governing provenance for this processor). In addition, the provenance repositories may be put on encrypted disk partitions.\",\n+                                \"displayName\": \"Storage Account Key\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"storage-account-key\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n+                            },\n+                            \"storage-account-name\": {\n+                                \"description\": \"The storage account name. There are certain risks in allowing the account name to be stored as a flowfile attribute. While it does provide for a more flexible flow by allowing the account name to be fetched dynamically from a flowfile attribute, care must be taken to restrict access to the event provenance data (e.g., by strictly controlling the policies governing provenance for this processor). In addition, the provenance repositories may be put on encrypted disk partitions. Instead of defining the Storage Account Name, Storage Account Key and SAS Token properties directly on the processor, the preferred way is to configure them through a controller service specified in the Storage Credentials property. The controller service can provide a common/shared configuration for multiple/all Azure processors. Furthermore, the credentials can also be looked up dynamically with the 'Lookup' version of the service.\",\n+                                \"displayName\": \"Storage Account Name\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"storage-account-name\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n+                            },\n+                            \"storage-credentials-service\": {\n+                                \"description\": \"The Controller Service used to obtain Azure Storage Credentials. Instead of the processor level properties, the credentials can be configured here through a common/shared controller service, which is the preferred way. The 'Lookup' version of the service can also be used to select the credentials dynamically at runtime based on a FlowFile attribute (if the processor has FlowFile input).\",\n+                                \"displayName\": \"Storage Credentials\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"storage-credentials-service\",\n+                                \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-azure-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.services.azure.storage.AzureStorageCredentialsService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"storage-endpoint-suffix\": {\n+                                \"description\": \"Storage accounts in public Azure always use a common FQDN suffix. Override this endpoint suffix with a different suffix in certain circumstances (like Azure Stack or non-public Azure regions). The preferred way is to configure them through a controller service specified in the Storage Credentials property. The controller service can provide a common/shared configuration for multiple/all Azure processors. Furthermore, the credentials can also be looked up dynamically with the 'Lookup' version of the service.\",\n+                                \"displayName\": \"Common Storage Account Endpoint Suffix\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"storage-endpoint-suffix\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"storage-sas-token\": {\n+                                \"description\": \"Shared Access Signature token, including the leading '?'. Specify either SAS token (recommended) or Account Key. There are certain risks in allowing the SAS token to be stored as a flowfile attribute. While it does provide for a more flexible flow by allowing the SAS token to be fetched dynamically from a flowfile attribute, care must be taken to restrict access to the event provenance data (e.g., by strictly controlling the policies governing provenance for this processor). In addition, the provenance repositories may be put on encrypted disk partitions.\",\n+                                \"displayName\": \"SAS Token\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"storage-sas-token\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n                             }\n                         },\n                         \"seeAlso\": [\n-                            \"org.apache.nifi.processors.standard.ConvertRecord\",\n-                            \"org.apache.nifi.processors.standard.QueryRecord\",\n-                            \"org.apache.nifi.processors.standard.SplitRecord\",\n-                            \"org.apache.nifi.processors.standard.UpdateRecord\"\n+                            \"org.apache.nifi.processors.azure.storage.DeleteAzureBlobStorage\",\n+                            \"org.apache.nifi.processors.azure.storage.FetchAzureBlobStorage\",\n+                            \"org.apache.nifi.processors.azure.storage.PutAzureBlobStorage\"\n                         ],\n                         \"sideEffectFree\": false,\n+                        \"stateful\": {\n+                            \"description\": \"After performing a listing of blobs, the timestamp of the newest blob is stored. This allows the Processor to list only blobs that have been added or modified after this date the next time that the Processor is run.  State is stored across the cluster so that this Processor can be run on Primary Node only and if a new Primary Node is selected, the new node can pick up where the previous node left off, without duplicating the data.\",\n+                            \"scopes\": [\n+                                \"CLUSTER\"\n+                            ]\n+                        },\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"FlowFiles that are successfully partitioned will be routed to this relationship\",\n+                                \"description\": \"All FlowFiles that are received are routed to success\",\n                                 \"name\": \"success\"\n-                            },\n-                            {\n-                                \"description\": \"If a FlowFile cannot be partitioned from the configured input format to the configured output format, the unchanged FlowFile will be routed to this relationship\",\n-                                \"name\": \"failure\"\n-                            },\n-                            {\n-                                \"description\": \"Once all records in an incoming FlowFile have been partitioned, the original FlowFile is routed to this relationship.\",\n-                                \"name\": \"original\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\",\n-                            \"EVENT_DRIVEN\"\n+                            \"CRON_DRIVEN\"\n                         ],\n-                        \"supportsBatching\": true,\n-                        \"supportsDynamicProperties\": true,\n+                        \"supportsBatching\": false,\n+                        \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": true,\n+                        \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"bin\",\n-                            \"group\",\n-                            \"organize\",\n-                            \"partition\",\n-                            \"record\",\n-                            \"recordpath\",\n-                            \"rpath\",\n-                            \"segment\",\n-                            \"split\"\n+                            \"azure\",\n+                            \"blob\",\n+                            \"cloud\",\n+                            \"microsoft\",\n+                            \"storage\"\n                         ],\n-                        \"triggerSerially\": false,\n+                        \"triggerSerially\": true,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.standard.PartitionRecord\",\n-                        \"typeDescription\": \"Splits, or partitions, record-oriented data based on the configured fields in the data. One or more properties must be added. The name of the property is the name of an attribute to add. The value of the property is a RecordPath to evaluate against each Record. Two records will go to the same outbound FlowFile only if they have the same value for each of the given RecordPaths. Because we know that all records in a given output FlowFile have the same value for the fields that are specified by the RecordPath, an attribute is added for each field. See Additional Details on the Usage page for more information and examples.\",\n+                        \"type\": \"org.apache.nifi.processors.azure.storage.ListAzureBlobStorage\",\n+                        \"typeDescription\": \"Lists blobs in an Azure Storage container. Listing details are attached to an empty FlowFile for use with FetchAzureBlobStorage.  This Processor is designed to run on Primary Node only in a cluster. If the primary node changes, the new Primary Node will pick up where the previous node left off without duplicating all of the data.\",\n                         \"version\": \"1.27.0\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"The number of records in an outgoing FlowFile\",\n-                                \"name\": \"record.count\"\n+                                \"description\": \"The name of the Azure container\",\n+                                \"name\": \"azure.container\"\n                             },\n                             {\n-                                \"description\": \"The MIME Type that the configured Record Writer indicates is appropriate\",\n-                                \"name\": \"mime.type\"\n+                                \"description\": \"The name of the Azure blob\",\n+                                \"name\": \"azure.blobname\"\n                             },\n                             {\n-                                \"description\": \"All partitioned FlowFiles produced from the same parent FlowFile will have the same randomly generated UUID added for this attribute\",\n-                                \"name\": \"fragment.identifier\"\n+                                \"description\": \"Primary location for blob content\",\n+                                \"name\": \"azure.primaryUri\"\n                             },\n                             {\n-                                \"description\": \"A one-up number that indicates the ordering of the partitioned FlowFiles that were created from a single parent FlowFile\",\n-                                \"name\": \"fragment.index\"\n+                                \"description\": \"Secondary location for blob content\",\n+                                \"name\": \"azure.secondaryUri\"\n                             },\n                             {\n-                                \"description\": \"The number of partitioned FlowFiles generated from the parent FlowFile\",\n-                                \"name\": \"fragment.count\"\n+                                \"description\": \"Etag for the Azure blob\",\n+                                \"name\": \"azure.etag\"\n                             },\n                             {\n-                                \"description\": \"The filename of the parent FlowFile\",\n-                                \"name\": \"segment.original.filename \"\n+                                \"description\": \"Length of the blob\",\n+                                \"name\": \"azure.length\"\n                             },\n                             {\n-                                \"description\": \"For each dynamic property that is added, an attribute may be added to the FlowFile. See the description for Dynamic Properties for more information.\",\n-                                \"name\": \"<dynamic property name>\"\n+                                \"description\": \"The timestamp in Azure for the blob\",\n+                                \"name\": \"azure.timestamp\"\n+                            },\n+                            {\n+                                \"description\": \"MimeType of the content\",\n+                                \"name\": \"mime.type\"\n+                            },\n+                            {\n+                                \"description\": \"Language code for the content\",\n+                                \"name\": \"lang\"\n+                            },\n+                            {\n+                                \"description\": \"This is the type of blob and can be either page or block type\",\n+                                \"name\": \"azure.blobtype\"\n                             }\n                         ]\n                     },\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-standard-nar\",\n+                        \"artifact\": \"nifi-azure-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n                         },\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"0 sec\"\n+                            \"TIMER_DRIVEN\": \"1 min\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n-                        \"deprecated\": true,\n-                        \"deprecationAlternatives\": [\n-                            \"org.apache.nifi.processors.standard.InvokeHTTP\"\n-                        ],\n-                        \"deprecationReason\": \"This processor is deprecated and may be removed in future releases.\",\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_REQUIRED\",\n-                        \"primaryNodeOnly\": false,\n+                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n+                        \"primaryNodeOnly\": true,\n                         \"propertyDescriptors\": {\n-                            \"Attributes to Send as HTTP Headers (Regex)\": {\n-                                \"description\": \"Specifies the Regular Expression that determines the names of FlowFile attributes that should be sent as HTTP Headers\",\n-                                \"displayName\": \"Attributes to Send as HTTP Headers (Regex)\",\n+                            \"Maximum File Age\": {\n+                                \"description\": \"The maximum age that a file must be in order to be pulled; any file older than this amount of time (according to last modification date) will be ignored\",\n+                                \"displayName\": \"Maximum File Age\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Attributes to Send as HTTP Headers (Regex)\",\n+                                \"name\": \"Maximum File Age\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Compression Level\": {\n-                                \"defaultValue\": \"0\",\n-                                \"description\": \"Determines the GZIP Compression Level to use when sending the file; the value must be in the range of 0-9. A value of 0 indicates that the file will not be GZIP'ed\",\n-                                \"displayName\": \"Compression Level\",\n+                            \"Maximum File Size\": {\n+                                \"description\": \"The maximum size that a file can be in order to be pulled\",\n+                                \"displayName\": \"Maximum File Size\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Compression Level\",\n-                                \"required\": true,\n+                                \"name\": \"Maximum File Size\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Connection Timeout\": {\n-                                \"defaultValue\": \"30 sec\",\n-                                \"description\": \"How long to wait when attempting to connect to the remote server before giving up\",\n-                                \"displayName\": \"Connection Timeout\",\n+                            \"Minimum File Age\": {\n+                                \"defaultValue\": \"0 sec\",\n+                                \"description\": \"The minimum age that a file must be in order to be pulled; any file younger than this amount of time (according to last modification date) will be ignored\",\n+                                \"displayName\": \"Minimum File Age\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Connection Timeout\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Content-Type\": {\n-                                \"defaultValue\": \"${mime.type}\",\n-                                \"description\": \"The Content-Type to specify for the content of the FlowFile being POSTed if Send as FlowFile is false. In the case of an empty value after evaluating an expression language expression, Content-Type defaults to application/octet-stream\",\n-                                \"displayName\": \"Content-Type\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Content-Type\",\n+                                \"name\": \"Minimum File Age\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Data Timeout\": {\n-                                \"defaultValue\": \"30 sec\",\n-                                \"description\": \"How long to wait between receiving segments of data from the remote server before giving up and discarding the partial file\",\n-                                \"displayName\": \"Data Timeout\",\n+                            \"Minimum File Size\": {\n+                                \"defaultValue\": \"0 B\",\n+                                \"description\": \"The minimum size that a file must be in order to be pulled\",\n+                                \"displayName\": \"Minimum File Size\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Data Timeout\",\n+                                \"name\": \"Minimum File Size\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Max Batch Size\": {\n-                                \"defaultValue\": \"100 MB\",\n-                                \"description\": \"If the Send as FlowFile property is true, specifies the max data size for a batch of FlowFiles to send in a single HTTP POST. If not specified, each FlowFile will be sent separately. If the Send as FlowFile property is false, this property is ignored\",\n-                                \"displayName\": \"Max Batch Size\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Max Batch Size\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Max Data to Post per Second\": {\n-                                \"description\": \"The maximum amount of data to send per second; this allows the bandwidth to be throttled to a specified data rate; if not specified, the data rate is not throttled\",\n-                                \"displayName\": \"Max Data to Post per Second\",\n+                            \"blob-name-prefix\": {\n+                                \"description\": \"Search prefix for listing\",\n+                                \"displayName\": \"Blob Name Prefix\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Max Data to Post per Second\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"blob-name-prefix\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Password\": {\n-                                \"description\": \"Password required to access the URL\",\n-                                \"displayName\": \"Password\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Password\",\n-                                \"required\": false,\n-                                \"sensitive\": true\n-                            },\n-                            \"Proxy Host\": {\n-                                \"description\": \"The fully qualified hostname or IP address of the proxy server\",\n-                                \"displayName\": \"Proxy Host\",\n+                            \"container-name\": {\n+                                \"description\": \"Name of the Azure storage container. In case of PutAzureBlobStorage processor, container can be created if it does not exist.\",\n+                                \"displayName\": \"Container Name\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Proxy Host\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"container-name\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Proxy Port\": {\n-                                \"description\": \"The port of the proxy server\",\n-                                \"displayName\": \"Proxy Port\",\n+                            \"et-initial-listing-target\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"Ignore entities having timestamp older than the specified 'Tracking Time Window' at the initial listing activity.\",\n+                                        \"displayName\": \"Tracking Time Window\",\n+                                        \"value\": \"window\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Regardless of entities timestamp, all existing entities will be listed at the initial listing activity.\",\n+                                        \"displayName\": \"All Available\",\n+                                        \"value\": \"all\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"all\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"entities\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Listing Strategy\",\n+                                        \"propertyName\": \"listing-strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"Specify how initial listing should be handled. Used by 'Tracking Entities' strategy.\",\n+                                \"displayName\": \"Entity Tracking Initial Listing Target\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Proxy Port\",\n+                                \"name\": \"et-initial-listing-target\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"SSL Context Service\": {\n-                                \"description\": \"The Controller Service to use in order to obtain an SSL Context\",\n-                                \"displayName\": \"SSL Context Service\",\n+                            \"et-state-cache\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"entities\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Listing Strategy\",\n+                                        \"propertyName\": \"listing-strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"Listed entities are stored in the specified cache storage so that this processor can resume listing across NiFi restart or in case of primary node change. 'Tracking Entities' strategy require tracking information of all listed entities within the last 'Tracking Time Window'. To support large number of entities, the strategy uses DistributedMapCache instead of managed state. Cache key format is 'ListedEntities::{processorId}(::{nodeId})'. If it tracks per node listed entities, then the optional '::{nodeId}' part is added to manage state separately. E.g. cluster wide cache key = 'ListedEntities::8dda2321-0164-1000-50fa-3042fe7d6a7b', per node cache key = 'ListedEntities::8dda2321-0164-1000-50fa-3042fe7d6a7b::nifi-node3' The stored cache content is Gzipped JSON string. The cache key will be deleted when target listing configuration is changed. Used by 'Tracking Entities' strategy.\",\n+                                \"displayName\": \"Entity Tracking State Cache\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"SSL Context Service\",\n+                                \"name\": \"et-state-cache\",\n                                 \"required\": false,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n                                     \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n+                                    \"type\": \"org.apache.nifi.distributed.cache.client.DistributedMapCacheClient\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             },\n-                            \"Send as FlowFile\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n+                            \"et-time-window\": {\n+                                \"defaultValue\": \"3 hours\",\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"dependentValues\": [\n+                                            \"entities\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Listing Strategy\",\n+                                        \"propertyName\": \"listing-strategy\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"If true, will package the FlowFile's contents and attributes together and send the FlowFile Package; otherwise, will send only the FlowFile's content\",\n-                                \"displayName\": \"Send as FlowFile\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Send as FlowFile\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"URL\": {\n-                                \"description\": \"The URL to POST to. The URL may be defined using the Attribute Expression Language. A separate connection pool will be created for each unique host:port combination.\",\n-                                \"displayName\": \"URL\",\n+                                \"description\": \"Specify how long this processor should track already-listed entities. 'Tracking Entities' strategy can pick any entity whose timestamp is inside the specified time window. For example, if set to '30 minutes', any entity having timestamp in recent 30 minutes will be the listing target when this processor runs. A listed entity is considered 'new/updated' and a FlowFile is emitted if one of following condition meets: 1. does not exist in the already-listed entities, 2. has newer timestamp than the cached entity, 3. has different size than the cached entity. If a cached entity's timestamp becomes older than specified time window, that entity will be removed from the cached already-listed entities. Used by 'Tracking Entities' strategy.\",\n+                                \"displayName\": \"Entity Tracking Time Window\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"URL\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"et-time-window\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Use Chunked Encoding\": {\n+                            \"listing-strategy\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"description\": \"This strategy tracks the latest timestamp of listed entity to determine new/updated entities. Since it only tracks few timestamps, it can manage listing state efficiently. However, any newly added, or updated entity having timestamp older than the tracked latest timestamp can not be picked by this strategy. For example, such situation can happen in a file system if a file with old timestamp is copied or moved into the target directory without its last modified timestamp being updated. Also may miss files when multiple subdirectories are being written at the same time while listing is running.\",\n+                                        \"displayName\": \"Tracking Timestamps\",\n+                                        \"value\": \"timestamps\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"description\": \"This strategy tracks information of all the listed entities within the latest 'Entity Tracking Time Window' to determine new/updated entities. This strategy can pick entities having old timestamp that can be missed with 'Tracking Timestamps'. Works even when multiple subdirectories are being written at the same time while listing is running. However additional DistributedMapCache controller service is required and more JVM heap memory is used. See the description of 'Entity Tracking Time Window' property for further details on how it works.\",\n+                                        \"displayName\": \"Tracking Entities\",\n+                                        \"value\": \"entities\"\n+                                    },\n+                                    {\n+                                        \"description\": \"This strategy lists an entity without any tracking. The same entity will be listed each time on executing this processor. It is recommended to change the default run schedule value. Any property that related to the persisting state will be disregarded.\",\n+                                        \"displayName\": \"No Tracking\",\n+                                        \"value\": \"none\"\n                                     }\n                                 ],\n-                                \"description\": \"Specifies whether or not to use Chunked Encoding to send the data. This property is ignored in the event the contents are compressed or sent as FlowFiles.\",\n-                                \"displayName\": \"Use Chunked Encoding\",\n+                                \"defaultValue\": \"timestamps\",\n+                                \"description\": \"Specify how to determine new/updated entities. See each strategy descriptions for detail.\",\n+                                \"displayName\": \"Listing Strategy\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Use Chunked Encoding\",\n-                                \"required\": false,\n+                                \"name\": \"listing-strategy\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"User Agent\": {\n-                                \"defaultValue\": \"Apache-HttpClient/4.5.14 (Java/1.8.0_302)\",\n-                                \"description\": \"What to report as the User Agent when we connect to the remote server\",\n-                                \"displayName\": \"User Agent\",\n+                            \"proxy-configuration-service\": {\n+                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests. Supported proxies: SOCKS, HTTP In case of SOCKS, it is not guaranteed that the selected SOCKS Version will be used by the processor.\",\n+                                \"displayName\": \"Proxy Configuration Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"User Agent\",\n+                                \"name\": \"proxy-configuration-service\",\n                                 \"required\": false,\n-                                \"sensitive\": false\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.proxy.ProxyConfigurationService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n                             },\n-                            \"Username\": {\n-                                \"description\": \"Username required to access the URL\",\n-                                \"displayName\": \"Username\",\n+                            \"record-writer\": {\n+                                \"description\": \"Specifies the Record Writer to use for creating the listing. If not specified, one FlowFile will be created for each entity that is listed. If the Record Writer is specified, all entities will be written to a single FlowFile instead of adding attributes to individual FlowFiles.\",\n+                                \"displayName\": \"Record Writer\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Username\",\n+                                \"name\": \"record-writer\",\n                                 \"required\": false,\n-                                \"sensitive\": false\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n                             },\n-                            \"proxy-configuration-service\": {\n-                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests. If set, it supersedes proxy settings configured per component. Supported proxies: HTTP + AuthN\",\n-                                \"displayName\": \"Proxy Configuration Service\",\n+                            \"storage-credentials-service\": {\n+                                \"description\": \"Controller Service used to obtain Azure Blob Storage Credentials.\",\n+                                \"displayName\": \"Storage Credentials\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"proxy-configuration-service\",\n-                                \"required\": false,\n+                                \"name\": \"storage-credentials-service\",\n+                                \"required\": true,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"artifact\": \"nifi-azure-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.proxy.ProxyConfigurationService\",\n+                                    \"type\": \"org.apache.nifi.services.azure.storage.AzureStorageCredentialsService_v12\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             }\n                         },\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.processors.azure.storage.DeleteAzureBlobStorage_v12\",\n+                            \"org.apache.nifi.processors.azure.storage.FetchAzureBlobStorage_v12\",\n+                            \"org.apache.nifi.processors.azure.storage.PutAzureBlobStorage_v12\"\n+                        ],\n                         \"sideEffectFree\": false,\n+                        \"stateful\": {\n+                            \"description\": \"After performing a listing of blobs, the timestamp of the newest blob is stored if 'Tracking Timestamps' Listing Strategy is in use (by default). This allows the Processor to list only blobs that have been added or modified after this date the next time that the Processor is run. State is stored across the cluster so that this Processor can be run on Primary Node only and if a new Primary Node is selected, the new node can pick up where the previous node left off, without duplicating the data.\",\n+                            \"scopes\": [\n+                                \"CLUSTER\"\n+                            ]\n+                        },\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"Files that are successfully send will be transferred to success\",\n-                                \"name\": \"success\"\n+                                \"description\": \"All FlowFiles that are received are routed to success\",\n+                                \"name\": \"success\"\n+                            }\n+                        ],\n+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\"\n+                        ],\n+                        \"supportsBatching\": false,\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicRelationships\": false,\n+                        \"supportsEventDriven\": false,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"azure\",\n+                            \"blob\",\n+                            \"cloud\",\n+                            \"microsoft\",\n+                            \"storage\"\n+                        ],\n+                        \"triggerSerially\": true,\n+                        \"triggerWhenAnyDestinationAvailable\": false,\n+                        \"triggerWhenEmpty\": false,\n+                        \"type\": \"org.apache.nifi.processors.azure.storage.ListAzureBlobStorage_v12\",\n+                        \"typeDescription\": \"Lists blobs in an Azure Blob Storage container. Listing details are attached to an empty FlowFile for use with FetchAzureBlobStorage. This Processor is designed to run on Primary Node only in a cluster. If the primary node changes, the new Primary Node will pick up where the previous node left off without duplicating all of the data. The processor uses Azure Blob Storage client library v12.\",\n+                        \"version\": \"1.27.0\",\n+                        \"writesAttributes\": [\n+                            {\n+                                \"description\": \"The name of the Azure Blob Storage container\",\n+                                \"name\": \"azure.container\"\n+                            },\n+                            {\n+                                \"description\": \"The name of the blob on Azure Blob Storage\",\n+                                \"name\": \"azure.blobname\"\n+                            },\n+                            {\n+                                \"description\": \"Primary location of the blob\",\n+                                \"name\": \"azure.primaryUri\"\n+                            },\n+                            {\n+                                \"description\": \"ETag of the blob\",\n+                                \"name\": \"azure.etag\"\n+                            },\n+                            {\n+                                \"description\": \"Type of the blob (either BlockBlob, PageBlob or AppendBlob)\",\n+                                \"name\": \"azure.blobtype\"\n+                            },\n+                            {\n+                                \"description\": \"MIME Type of the content\",\n+                                \"name\": \"mime.type\"\n                             },\n                             {\n-                                \"description\": \"Files that fail to send will transferred to failure\",\n-                                \"name\": \"failure\"\n+                                \"description\": \"Language code for the content\",\n+                                \"name\": \"lang\"\n+                            },\n+                            {\n+                                \"description\": \"Timestamp of the blob\",\n+                                \"name\": \"azure.timestamp\"\n+                            },\n+                            {\n+                                \"description\": \"Length of the blob\",\n+                                \"name\": \"azure.length\"\n                             }\n-                        ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": true,\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": false,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"archive\",\n-                            \"copy\",\n-                            \"http\",\n-                            \"https\",\n-                            \"remote\"\n-                        ],\n-                        \"triggerSerially\": false,\n-                        \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.standard.PostHTTP\",\n-                        \"typeDescription\": \"Please be aware this processor is deprecated and may be removed in the near future. Use InvokeHTTP instead. Performs an HTTP Post with the content of the FlowFile. Uses a connection pool with max number of connections equal to the number of possible endpoints multiplied by the Concurrent Tasks configuration.\",\n-                        \"version\": \"1.27.0\"\n+                        ]\n                     },\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-standard-nar\",\n+                        \"artifact\": \"nifi-azure-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n-                            \"EVENT_DRIVEN\": 0,\n                             \"TIMER_DRIVEN\": 1\n                         },\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"0 sec\"\n+                            \"TIMER_DRIVEN\": \"1 min\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_REQUIRED\",\n-                        \"primaryNodeOnly\": false,\n+                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n+                        \"primaryNodeOnly\": true,\n                         \"propertyDescriptors\": {\n-                            \"Data Record Path\": {\n-                                \"description\": \"If specified, this property denotes a RecordPath that will be evaluated against each incoming Record and the Record that results from evaluating the RecordPath will be sent to the database instead of sending the entire incoming Record. If not specified, the entire incoming Record will be published to the database.\",\n-                                \"displayName\": \"Data Record Path\",\n+                            \"Maximum File Age\": {\n+                                \"description\": \"The maximum age that a file must be in order to be pulled; any file older than this amount of time (according to last modification date) will be ignored\",\n+                                \"displayName\": \"Maximum File Age\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Data Record Path\",\n+                                \"name\": \"Maximum File Age\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Statement Type Record Path\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"Use Record Path\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Statement Type\",\n-                                        \"propertyName\": \"put-db-record-statement-type\"\n-                                    }\n-                                ],\n-                                \"description\": \"Specifies a RecordPath to evaluate against each Record in order to determine the Statement Type. The RecordPath should equate to either INSERT, UPDATE, UPSERT, or DELETE.\",\n-                                \"displayName\": \"Statement Type Record Path\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Statement Type Record Path\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"database-session-autocommit\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"The autocommit mode to set on the database connection being used. If set to false, the operation(s) will be explicitly committed or rolled back (based on success or failure respectively). If set to true, the driver/database automatically handles the commit/rollback. Setting this property to 'No value' will leave the database connection's autocommit mode unmodified.\",\n-                                \"displayName\": \"Database Session AutoCommit\",\n+                            \"Maximum File Size\": {\n+                                \"description\": \"The maximum size that a file can be in order to be pulled\",\n+                                \"displayName\": \"Maximum File Size\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"database-session-autocommit\",\n+                                \"name\": \"Maximum File Size\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"db-type\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"Generates ANSI SQL\",\n-                                        \"displayName\": \"Generic\",\n-                                        \"value\": \"Generic\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Generates Oracle compliant SQL\",\n-                                        \"displayName\": \"Oracle\",\n-                                        \"value\": \"Oracle\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Generates Oracle compliant SQL for version 12 or greater\",\n-                                        \"displayName\": \"Oracle 12+\",\n-                                        \"value\": \"Oracle 12+\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Generates MS SQL Compatible SQL, for version 2012 or greater\",\n-                                        \"displayName\": \"MS SQL 2012+\",\n-                                        \"value\": \"MS SQL 2012+\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Generates MS SQL Compatible SQL for version 2008\",\n-                                        \"displayName\": \"MS SQL 2008\",\n-                                        \"value\": \"MS SQL 2008\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Generates MySQL compatible SQL\",\n-                                        \"displayName\": \"MySQL\",\n-                                        \"value\": \"MySQL\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Generates PostgreSQL compatible SQL\",\n-                                        \"displayName\": \"PostgreSQL\",\n-                                        \"value\": \"PostgreSQL\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Generates Phoenix compliant SQL\",\n-                                        \"displayName\": \"Phoenix\",\n-                                        \"value\": \"Phoenix\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"Generic\",\n-                                \"description\": \"The type/flavor of database, used for generating database-specific code. In many cases the Generic type should suffice, but some databases (such as Oracle) require custom SQL clauses. \",\n-                                \"displayName\": \"Database Type\",\n+                            \"Minimum File Age\": {\n+                                \"defaultValue\": \"0 sec\",\n+                                \"description\": \"The minimum age that a file must be in order to be pulled; any file younger than this amount of time (according to last modification date) will be ignored\",\n+                                \"displayName\": \"Minimum File Age\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"db-type\",\n-                                \"required\": false,\n+                                \"name\": \"Minimum File Age\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"put-db-record-allow-multiple-statements\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"false\",\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"Use statement.type Attribute\",\n-                                            \"Use Record Path\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Statement Type\",\n-                                        \"propertyName\": \"put-db-record-statement-type\"\n-                                    }\n-                                ],\n-                                \"description\": \"If the Statement Type is 'SQL' (as set in the statement.type attribute), this field indicates whether to split the field value by a semicolon and execute each statement separately. If any statement causes an error, the entire set of statements will be rolled back. If the Statement Type is not 'SQL', this field is ignored.\",\n-                                \"displayName\": \"Allow Multiple SQL Statements\",\n+                            \"Minimum File Size\": {\n+                                \"defaultValue\": \"0 B\",\n+                                \"description\": \"The minimum size that a file must be in order to be pulled\",\n+                                \"displayName\": \"Minimum File Size\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"put-db-record-allow-multiple-statements\",\n+                                \"name\": \"Minimum File Size\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"put-db-record-binary-format\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"String values for binary columns contain the original value as text via UTF-8 character encoding\",\n-                                        \"displayName\": \"UTF-8\",\n-                                        \"value\": \"UTF-8\"\n-                                    },\n-                                    {\n-                                        \"description\": \"String values for binary columns contain the original value in hexadecimal format\",\n-                                        \"displayName\": \"Hexadecimal\",\n-                                        \"value\": \"Hexadecimal\"\n-                                    },\n-                                    {\n-                                        \"description\": \"String values for binary columns contain the original value in Base64 encoded format\",\n-                                        \"displayName\": \"Base64\",\n-                                        \"value\": \"Base64\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"UTF-8\",\n-                                \"description\": \"The format to be applied when decoding string values to binary.\",\n-                                \"displayName\": \"Binary String Format\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"put-db-record-binary-format\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"put-db-record-catalog-name\": {\n-                                \"description\": \"The name of the catalog that the statement should update. This may not apply for the database that you are updating. In this case, leave the field empty. Note that if the property is set and the database is case-sensitive, the catalog name must match the database's catalog name exactly.\",\n-                                \"displayName\": \"Catalog Name\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"put-db-record-catalog-name\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"put-db-record-dcbp-service\": {\n-                                \"description\": \"The Controller Service that is used to obtain a connection to the database for sending records.\",\n-                                \"displayName\": \"Database Connection Pooling Service\",\n+                            \"adls-credentials-service\": {\n+                                \"description\": \"Controller Service used to obtain Azure Credentials.\",\n+                                \"displayName\": \"ADLS Credentials\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"put-db-record-dcbp-service\",\n+                                \"name\": \"adls-credentials-service\",\n                                 \"required\": true,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"artifact\": \"nifi-azure-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.dbcp.DBCPService\",\n+                                    \"type\": \"org.apache.nifi.services.azure.storage.ADLSCredentialsService\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             },\n-                            \"put-db-record-field-containing-sql\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"Use statement.type Attribute\",\n-                                            \"Use Record Path\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Statement Type\",\n-                                        \"propertyName\": \"put-db-record-statement-type\"\n-                                    }\n-                                ],\n-                                \"description\": \"If the Statement Type is 'SQL' (as set in the statement.type attribute), this field indicates which field in the record(s) contains the SQL statement to execute. The value of the field must be a single SQL statement. If the Statement Type is not 'SQL', this field is ignored.\",\n-                                \"displayName\": \"Field Containing SQL\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"put-db-record-field-containing-sql\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"put-db-record-max-batch-size\": {\n-                                \"defaultValue\": \"1000\",\n-                                \"description\": \"Specifies maximum number of sql statements to be included in each batch sent to the database. Zero means the batch size is not limited, and all statements are put into a single batch which can cause high memory usage issues for a very large number of statements.\",\n-                                \"displayName\": \"Maximum Batch Size\",\n+                            \"directory-name\": {\n+                                \"description\": \"Name of the Azure Storage Directory. The Directory Name cannot contain a leading '/'. The root directory can be designated by the empty string value. In case of the PutAzureDataLakeStorage processor, the directory will be created if not already existing.\",\n+                                \"displayName\": \"Directory Name\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"put-db-record-max-batch-size\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"put-db-record-query-timeout\": {\n-                                \"defaultValue\": \"0 seconds\",\n-                                \"description\": \"The maximum amount of time allowed for a running SQL statement , zero means there is no limit. Max time less than 1 second will be equal to zero.\",\n-                                \"displayName\": \"Max Wait Time\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"put-db-record-query-timeout\",\n+                                \"name\": \"directory-name\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"put-db-record-quoted-identifiers\": {\n+                            \"et-initial-listing-target\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"description\": \"Ignore entities having timestamp older than the specified 'Tracking Time Window' at the initial listing activity.\",\n+                                        \"displayName\": \"Tracking Time Window\",\n+                                        \"value\": \"window\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"description\": \"Regardless of entities timestamp, all existing entities will be listed at the initial listing activity.\",\n+                                        \"displayName\": \"All Available\",\n+                                        \"value\": \"all\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"Enabling this option will cause all column names to be quoted, allowing you to use reserved words as column names in your tables.\",\n-                                \"displayName\": \"Quote Column Identifiers\",\n+                                \"defaultValue\": \"all\",\n+                                \"description\": \"Specify how initial listing should be handled. Used by 'Tracking Entities' strategy.\",\n+                                \"displayName\": \"Entity Tracking Initial Listing Target\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"put-db-record-quoted-identifiers\",\n+                                \"name\": \"et-initial-listing-target\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"put-db-record-quoted-table-identifiers\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"Enabling this option will cause the table name to be quoted to support the use of special characters in the table name.\",\n-                                \"displayName\": \"Quote Table Identifiers\",\n+                            \"et-state-cache\": {\n+                                \"description\": \"Listed entities are stored in the specified cache storage so that this processor can resume listing across NiFi restart or in case of primary node change. 'Tracking Entities' strategy require tracking information of all listed entities within the last 'Tracking Time Window'. To support large number of entities, the strategy uses DistributedMapCache instead of managed state. Cache key format is 'ListedEntities::{processorId}(::{nodeId})'. If it tracks per node listed entities, then the optional '::{nodeId}' part is added to manage state separately. E.g. cluster wide cache key = 'ListedEntities::8dda2321-0164-1000-50fa-3042fe7d6a7b', per node cache key = 'ListedEntities::8dda2321-0164-1000-50fa-3042fe7d6a7b::nifi-node3' The stored cache content is Gzipped JSON string. The cache key will be deleted when target listing configuration is changed. Used by 'Tracking Entities' strategy.\",\n+                                \"displayName\": \"Entity Tracking State Cache\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"put-db-record-quoted-table-identifiers\",\n+                                \"name\": \"et-state-cache\",\n                                 \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"put-db-record-record-reader\": {\n-                                \"description\": \"Specifies the Controller Service to use for parsing incoming data and determining the data's schema.\",\n-                                \"displayName\": \"Record Reader\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"put-db-record-record-reader\",\n-                                \"required\": true,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n                                     \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n+                                    \"type\": \"org.apache.nifi.distributed.cache.client.DistributedMapCacheClient\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             },\n-                            \"put-db-record-schema-name\": {\n-                                \"description\": \"The name of the schema that the table belongs to. This may not apply for the database that you are updating. In this case, leave the field empty. Note that if the property is set and the database is case-sensitive, the schema name must match the database's schema name exactly.\",\n-                                \"displayName\": \"Schema Name\",\n+                            \"et-time-window\": {\n+                                \"defaultValue\": \"3 hours\",\n+                                \"description\": \"Specify how long this processor should track already-listed entities. 'Tracking Entities' strategy can pick any entity whose timestamp is inside the specified time window. For example, if set to '30 minutes', any entity having timestamp in recent 30 minutes will be the listing target when this processor runs. A listed entity is considered 'new/updated' and a FlowFile is emitted if one of following condition meets: 1. does not exist in the already-listed entities, 2. has newer timestamp than the cached entity, 3. has different size than the cached entity. If a cached entity's timestamp becomes older than specified time window, that entity will be removed from the cached already-listed entities. Used by 'Tracking Entities' strategy.\",\n+                                \"displayName\": \"Entity Tracking Time Window\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"put-db-record-schema-name\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"et-time-window\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"put-db-record-statement-type\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"UPDATE\",\n-                                        \"value\": \"UPDATE\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"INSERT\",\n-                                        \"value\": \"INSERT\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"UPSERT\",\n-                                        \"value\": \"UPSERT\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"INSERT_IGNORE\",\n-                                        \"value\": \"INSERT_IGNORE\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"DELETE\",\n-                                        \"value\": \"DELETE\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Use statement.type Attribute\",\n-                                        \"value\": \"Use statement.type Attribute\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Use Record Path\",\n-                                        \"value\": \"Use Record Path\"\n-                                    }\n-                                ],\n-                                \"description\": \"Specifies the type of SQL Statement to generate. Please refer to the database documentation for a description of the behavior of each operation. Please note that some Database Types may not support certain Statement Types. If 'Use statement.type Attribute' is chosen, then the value is taken from the statement.type attribute in the FlowFile. The 'Use statement.type Attribute' option is the only one that allows the 'SQL' statement type. If 'SQL' is specified, the value of the field specified by the 'Field Containing SQL' property is expected to be a valid SQL statement on the target database, and will be executed as-is.\",\n-                                \"displayName\": \"Statement Type\",\n+                            \"file-filter\": {\n+                                \"description\": \"Only files whose names match the given regular expression will be listed\",\n+                                \"displayName\": \"File Filter\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"put-db-record-statement-type\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"file-filter\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"put-db-record-table-name\": {\n-                                \"description\": \"The name of the table that the statement should affect. Note that if the database is case-sensitive, the table name must match the database's table name exactly.\",\n-                                \"displayName\": \"Table Name\",\n+                            \"filesystem-name\": {\n+                                \"description\": \"Name of the Azure Storage File System (also called Container). It is assumed to be already existing.\",\n+                                \"displayName\": \"Filesystem Name\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"put-db-record-table-name\",\n+                                \"name\": \"filesystem-name\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"put-db-record-translate-field-names\": {\n+                            \"include-temporary-files\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"true\",\n                                         \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"false\",\n                                         \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"true\",\n-                                \"description\": \"If true, the Processor will attempt to translate field names into the appropriate column names for the table specified. If false, the field names must match the column names exactly, or the column will not be updated\",\n-                                \"displayName\": \"Translate Field Names\",\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"Whether to include temporary files when listing the contents of configured directory paths.\",\n+                                \"displayName\": \"Include Temporary Files\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"put-db-record-translate-field-names\",\n-                                \"required\": false,\n+                                \"name\": \"include-temporary-files\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"put-db-record-unmatched-column-behavior\": {\n+                            \"listing-strategy\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Any column in the database that does not have a field in the document will be assumed to not be required.  No notification will be logged\",\n-                                        \"displayName\": \"Ignore Unmatched Columns\",\n-                                        \"value\": \"Ignore Unmatched Columns\"\n+                                        \"description\": \"This strategy tracks the latest timestamp of listed entity to determine new/updated entities. Since it only tracks few timestamps, it can manage listing state efficiently. However, any newly added, or updated entity having timestamp older than the tracked latest timestamp can not be picked by this strategy. For example, such situation can happen in a file system if a file with old timestamp is copied or moved into the target directory without its last modified timestamp being updated. Also may miss files when multiple subdirectories are being written at the same time while listing is running.\",\n+                                        \"displayName\": \"Tracking Timestamps\",\n+                                        \"value\": \"timestamps\"\n                                     },\n                                     {\n-                                        \"description\": \"Any column in the database that does not have a field in the document will be assumed to not be required.  A warning will be logged\",\n-                                        \"displayName\": \"Warn on Unmatched Columns\",\n-                                        \"value\": \"Warn on Unmatched Columns\"\n+                                        \"description\": \"This strategy tracks information of all the listed entities within the latest 'Entity Tracking Time Window' to determine new/updated entities. This strategy can pick entities having old timestamp that can be missed with 'Tracking Timestamps'. Works even when multiple subdirectories are being written at the same time while listing is running. However additional DistributedMapCache controller service is required and more JVM heap memory is used. See the description of 'Entity Tracking Time Window' property for further details on how it works.\",\n+                                        \"displayName\": \"Tracking Entities\",\n+                                        \"value\": \"entities\"\n                                     },\n                                     {\n-                                        \"description\": \"A flow will fail if any column in the database that does not have a field in the document.  An error will be logged\",\n-                                        \"displayName\": \"Fail on Unmatched Columns\",\n-                                        \"value\": \"Fail on Unmatched Columns\"\n+                                        \"description\": \"This strategy lists an entity without any tracking. The same entity will be listed each time on executing this processor. It is recommended to change the default run schedule value. Any property that related to the persisting state will be disregarded.\",\n+                                        \"displayName\": \"No Tracking\",\n+                                        \"value\": \"none\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"Fail on Unmatched Columns\",\n-                                \"description\": \"If an incoming record does not have a field mapping for all of the database table's columns, this property specifies how to handle the situation\",\n-                                \"displayName\": \"Unmatched Column Behavior\",\n+                                \"defaultValue\": \"timestamps\",\n+                                \"description\": \"Specify how to determine new/updated entities. See each strategy descriptions for detail.\",\n+                                \"displayName\": \"Listing Strategy\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"put-db-record-unmatched-column-behavior\",\n+                                \"name\": \"listing-strategy\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"path-filter\": {\n+                                \"description\": \"When 'Recurse Subdirectories' is true, then only subdirectories whose paths match the given regular expression will be scanned\",\n+                                \"displayName\": \"Path Filter\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"path-filter\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"put-db-record-unmatched-field-behavior\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"Any field in the document that cannot be mapped to a column in the database is ignored\",\n-                                        \"displayName\": \"Ignore Unmatched Fields\",\n-                                        \"value\": \"Ignore Unmatched Fields\"\n-                                    },\n-                                    {\n-                                        \"description\": \"If the document has any field that cannot be mapped to a column in the database, the FlowFile will be routed to the failure relationship\",\n-                                        \"displayName\": \"Fail on Unmatched Fields\",\n-                                        \"value\": \"Fail on Unmatched Fields\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"Ignore Unmatched Fields\",\n-                                \"description\": \"If an incoming record has a field that does not map to any of the database table's columns, this property specifies how to handle the situation\",\n-                                \"displayName\": \"Unmatched Field Behavior\",\n+                            \"proxy-configuration-service\": {\n+                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests. Supported proxies: SOCKS, HTTP In case of SOCKS, it is not guaranteed that the selected SOCKS Version will be used by the processor.\",\n+                                \"displayName\": \"Proxy Configuration Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"put-db-record-unmatched-field-behavior\",\n+                                \"name\": \"proxy-configuration-service\",\n                                 \"required\": false,\n-                                \"sensitive\": false\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.proxy.ProxyConfigurationService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n                             },\n-                            \"put-db-record-update-keys\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"Use statement.type Attribute\",\n-                                            \"Use Record Path\",\n-                                            \"UPSERT\",\n-                                            \"UPDATE\",\n-                                            \"SQL\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Statement Type\",\n-                                        \"propertyName\": \"put-db-record-statement-type\"\n-                                    }\n-                                ],\n-                                \"description\": \"A comma-separated list of column names that uniquely identifies a row in the database for UPDATE statements. If the Statement Type is UPDATE and this property is not set, the table's Primary Keys are used. In this case, if no Primary Key exists, the conversion to SQL will fail if Unmatched Column Behaviour is set to FAIL. This property is ignored if the Statement Type is INSERT\",\n-                                \"displayName\": \"Update Keys\",\n+                            \"record-writer\": {\n+                                \"description\": \"Specifies the Record Writer to use for creating the listing. If not specified, one FlowFile will be created for each entity that is listed. If the Record Writer is specified, all entities will be written to a single FlowFile instead of adding attributes to individual FlowFiles.\",\n+                                \"displayName\": \"Record Writer\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"put-db-record-update-keys\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"record-writer\",\n                                 \"required\": false,\n-                                \"sensitive\": false\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n                             },\n-                            \"rollback-on-failure\": {\n+                            \"recurse-subdirectories\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"true\",\n                                         \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"false\",\n                                         \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"Specify how to handle error. By default (false), if an error occurs while processing a FlowFile, the FlowFile will be routed to 'failure' or 'retry' relationship based on error type, and processor can continue with next FlowFile. Instead, you may want to rollback currently processed FlowFiles and stop further processing immediately. In that case, you can do so by enabling this 'Rollback On Failure' property.  If enabled, failed FlowFiles will stay in the input relationship without penalizing it and being processed repeatedly until it gets processed successfully or removed by other means. It is important to set adequate 'Yield Duration' to avoid retrying too frequently.\",\n-                                \"displayName\": \"Rollback On Failure\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"rollback-on-failure\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"table-schema-cache-size\": {\n-                                \"defaultValue\": \"100\",\n-                                \"description\": \"Specifies how many Table Schemas should be cached\",\n-                                \"displayName\": \"Table Schema Cache Size\",\n+                                \"defaultValue\": \"true\",\n+                                \"description\": \"Indicates whether to list files from subdirectories of the directory\",\n+                                \"displayName\": \"Recurse Subdirectories\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"table-schema-cache-size\",\n+                                \"name\": \"recurse-subdirectories\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             }\n                         },\n-                        \"readsAttributes\": [\n-                            {\n-                                \"description\": \"If 'Use statement.type Attribute' is selected for the Statement Type property, the value of this attribute will be used to determine the type of statement (INSERT, UPDATE, DELETE, SQL, etc.) to generate and execute.\",\n-                                \"name\": \"statement.type\"\n-                            }\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.processors.azure.storage.DeleteAzureDataLakeStorage\",\n+                            \"org.apache.nifi.processors.azure.storage.FetchAzureDataLakeStorage\",\n+                            \"org.apache.nifi.processors.azure.storage.PutAzureDataLakeStorage\"\n                         ],\n                         \"sideEffectFree\": false,\n+                        \"stateful\": {\n+                            \"description\": \"After performing a listing of files, the timestamp of the newest file is stored. This allows the Processor to list only files that have been added or modified after this date the next time that the Processor is run. State is stored across the cluster so that this Processor can be run on Primary Node only and if a new Primary Node is selected, the new node can pick up where the previous node left off, without duplicating the data.\",\n+                            \"scopes\": [\n+                                \"CLUSTER\"\n+                            ]\n+                        },\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"A FlowFile is routed to this relationship if the database cannot be updated but attempting the operation again may succeed\",\n-                                \"name\": \"retry\"\n-                            },\n-                            {\n-                                \"description\": \"Successfully created FlowFile from SQL query result set.\",\n+                                \"description\": \"All FlowFiles that are received are routed to success\",\n                                 \"name\": \"success\"\n-                            },\n-                            {\n-                                \"description\": \"A FlowFile is routed to this relationship if the database cannot be updated and retrying the operation will also fail, such as an invalid query or an integrity constraint violation\",\n-                                \"name\": \"failure\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\",\n-                            \"EVENT_DRIVEN\"\n+                            \"CRON_DRIVEN\"\n                         ],\n                         \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": true,\n+                        \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"database\",\n-                            \"delete\",\n-                            \"insert\",\n-                            \"jdbc\",\n-                            \"put\",\n-                            \"record\",\n-                            \"sql\",\n-                            \"update\"\n+                            \"adlsgen2\",\n+                            \"azure\",\n+                            \"cloud\",\n+                            \"datalake\",\n+                            \"microsoft\",\n+                            \"storage\"\n                         ],\n-                        \"triggerSerially\": false,\n+                        \"triggerSerially\": true,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.standard.PutDatabaseRecord\",\n-                        \"typeDescription\": \"The PutDatabaseRecord processor uses a specified RecordReader to input (possibly multiple) records from an incoming flow file. These records are translated to SQL statements and executed as a single transaction. If any errors occur, the flow file is routed to failure or retry, and if the records are transmitted successfully, the incoming flow file is routed to success.  The type of statement executed by the processor is specified via the Statement Type property, which accepts some hard-coded values such as INSERT, UPDATE, and DELETE, as well as 'Use statement.type Attribute', which causes the processor to get the statement type from a flow file attribute.  IMPORTANT: If the Statement Type is UPDATE, then the incoming records must not alter the value(s) of the primary keys (or user-specified Update Keys). If such records are encountered, the UPDATE statement issued to the database may do nothing (if no existing records with the new primary key values are found), or could inadvertently corrupt the existing data (by changing records for which the new values of the primary keys exist).\",\n+                        \"type\": \"org.apache.nifi.processors.azure.storage.ListAzureDataLakeStorage\",\n+                        \"typeDescription\": \"Lists directory in an Azure Data Lake Storage Gen 2 filesystem\",\n                         \"version\": \"1.27.0\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"If an error occurs during processing, the flow file will be routed to failure or retry, and this attribute will be populated with the cause of the error.\",\n-                                \"name\": \"putdatabaserecord.error\"\n+                                \"description\": \"The name of the Azure File System\",\n+                                \"name\": \"azure.filesystem\"\n+                            },\n+                            {\n+                                \"description\": \"The full path of the Azure File\",\n+                                \"name\": \"azure.filePath\"\n+                            },\n+                            {\n+                                \"description\": \"The name of the Azure Directory\",\n+                                \"name\": \"azure.directory\"\n+                            },\n+                            {\n+                                \"description\": \"The name of the Azure File\",\n+                                \"name\": \"azure.filename\"\n+                            },\n+                            {\n+                                \"description\": \"The length of the Azure File\",\n+                                \"name\": \"azure.length\"\n+                            },\n+                            {\n+                                \"description\": \"The last modification time of the Azure File\",\n+                                \"name\": \"azure.lastModified\"\n+                            },\n+                            {\n+                                \"description\": \"The ETag of the Azure File\",\n+                                \"name\": \"azure.etag\"\n                             }\n                         ]\n                     },\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-standard-nar\",\n+                        \"artifact\": \"nifi-azure-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n-                            \"EVENT_DRIVEN\": 0,\n                             \"TIMER_DRIVEN\": 1\n                         },\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Cache Entry Identifier\": {\n-                                \"description\": \"A FlowFile attribute, or the results of an Attribute Expression Language statement, which will be evaluated against a FlowFile in order to determine the cache key\",\n-                                \"displayName\": \"Cache Entry Identifier\",\n+                            \"adls-credentials-service\": {\n+                                \"description\": \"Controller Service used to obtain Azure Credentials.\",\n+                                \"displayName\": \"ADLS Credentials\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Cache Entry Identifier\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"adls-credentials-service\",\n                                 \"required\": true,\n-                                \"sensitive\": false\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-azure-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.services.azure.storage.ADLSCredentialsService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n                             },\n-                            \"Cache update strategy\": {\n+                            \"conflict-resolution-strategy\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Adds the specified entry to the cache, replacing any value that is currently set.\",\n-                                        \"displayName\": \"Replace if present\",\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"fail\",\n+                                        \"value\": \"fail\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"replace\",\n                                         \"value\": \"replace\"\n                                     },\n                                     {\n-                                        \"description\": \"Adds the specified entry to the cache, if the key does not exist.\",\n-                                        \"displayName\": \"Keep original\",\n-                                        \"value\": \"keeporiginal\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"ignore\",\n+                                        \"value\": \"ignore\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"replace\",\n-                                \"description\": \"Determines how the cache is updated if the cache already contains the entry\",\n-                                \"displayName\": \"Cache update strategy\",\n+                                \"defaultValue\": \"fail\",\n+                                \"description\": \"Indicates what should happen when a file with the same name already exists in the output directory\",\n+                                \"displayName\": \"Conflict Resolution Strategy\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Cache update strategy\",\n+                                \"name\": \"conflict-resolution-strategy\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Distributed Cache Service\": {\n-                                \"description\": \"The Controller Service that is used to cache flow files\",\n-                                \"displayName\": \"Distributed Cache Service\",\n+                            \"directory-name\": {\n+                                \"description\": \"Name of the Azure Storage Directory where the files will be moved. The Directory Name cannot contain a leading '/'. The root directory can be designated by the empty string value. Non-existing directories will be created. If the original directory structure should be kept, the full directory path needs to be provided after the destination directory. e.g.: destdir/${azure.directory}\",\n+                                \"displayName\": \"Destination Directory\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"directory-name\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"file-name\": {\n+                                \"defaultValue\": \"${azure.filename}\",\n+                                \"description\": \"The filename\",\n+                                \"displayName\": \"File Name\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"file-name\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"filesystem-name\": {\n+                                \"description\": \"Name of the Azure Storage File System where the files will be moved.\",\n+                                \"displayName\": \"Destination Filesystem\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"filesystem-name\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"proxy-configuration-service\": {\n+                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests. Supported proxies: SOCKS, HTTP In case of SOCKS, it is not guaranteed that the selected SOCKS Version will be used by the processor.\",\n+                                \"displayName\": \"Proxy Configuration Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Distributed Cache Service\",\n-                                \"required\": true,\n+                                \"name\": \"proxy-configuration-service\",\n+                                \"required\": false,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n                                     \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.distributed.cache.client.DistributedMapCacheClient\",\n+                                    \"type\": \"org.apache.nifi.proxy.ProxyConfigurationService\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             },\n-                            \"Max cache entry size\": {\n-                                \"defaultValue\": \"1 MB\",\n-                                \"description\": \"The maximum amount of data to put into cache\",\n-                                \"displayName\": \"Max cache entry size\",\n+                            \"source-directory-name\": {\n+                                \"defaultValue\": \"${azure.directory}\",\n+                                \"description\": \"Name of the Azure Storage Directory from where the move should happen. The Directory Name cannot contain a leading '/'. The root directory can be designated by the empty string value.\",\n+                                \"displayName\": \"Source Directory\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Max cache entry size\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"source-directory-name\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"source-filesystem-name\": {\n+                                \"defaultValue\": \"${azure.filesystem}\",\n+                                \"description\": \"Name of the Azure Storage File System from where the move should happen.\",\n+                                \"displayName\": \"Source Filesystem\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"source-filesystem-name\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             }\n                         },\n                         \"seeAlso\": [\n-                            \"org.apache.nifi.distributed.cache.client.DistributedMapCacheClientService\",\n-                            \"org.apache.nifi.distributed.cache.server.map.DistributedMapCacheServer\",\n-                            \"org.apache.nifi.processors.standard.FetchDistributedMapCache\"\n+                            \"org.apache.nifi.processors.azure.storage.DeleteAzureDataLakeStorage\",\n+                            \"org.apache.nifi.processors.azure.storage.FetchAzureDataLakeStorage\",\n+                            \"org.apache.nifi.processors.azure.storage.ListAzureDataLakeStorage\"\n                         ],\n                         \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"Any FlowFile that is successfully inserted into cache will be routed to this relationship\",\n+                                \"description\": \"Files that have been successfully written to Azure storage are transferred to this relationship\",\n                                 \"name\": \"success\"\n                             },\n                             {\n-                                \"description\": \"Any FlowFile that cannot be inserted into the cache will be routed to this relationship\",\n+                                \"description\": \"Files that could not be written to Azure storage for some reason are transferred to this relationship\",\n                                 \"name\": \"failure\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\",\n-                            \"EVENT_DRIVEN\"\n+                            \"CRON_DRIVEN\"\n                         ],\n-                        \"supportsBatching\": true,\n+                        \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": true,\n+                        \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"cache\",\n-                            \"distributed\",\n-                            \"map\",\n-                            \"put\"\n+                            \"adlsgen2\",\n+                            \"azure\",\n+                            \"cloud\",\n+                            \"datalake\",\n+                            \"microsoft\",\n+                            \"storage\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.standard.PutDistributedMapCache\",\n-                        \"typeDescription\": \"Gets the content of a FlowFile and puts it to a distributed map cache, using a cache key computed from FlowFile attributes. If the cache already contains the entry and the cache update strategy is 'keep original' the entry is not replaced.'\",\n+                        \"type\": \"org.apache.nifi.processors.azure.storage.MoveAzureDataLakeStorage\",\n+                        \"typeDescription\": \"Moves content within an Azure Data Lake Storage Gen 2. After the move, files will be no longer available on source location.\",\n                         \"version\": \"1.27.0\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"All FlowFiles will have an attribute 'cached'. The value of this attribute is true, is the FlowFile is cached, otherwise false.\",\n-                                \"name\": \"cached\"\n+                                \"description\": \"The name of the source Azure File System\",\n+                                \"name\": \"azure.source.filesystem\"\n+                            },\n+                            {\n+                                \"description\": \"The name of the source Azure Directory\",\n+                                \"name\": \"azure.source.directory\"\n+                            },\n+                            {\n+                                \"description\": \"The name of the Azure File System\",\n+                                \"name\": \"azure.filesystem\"\n+                            },\n+                            {\n+                                \"description\": \"The name of the Azure Directory\",\n+                                \"name\": \"azure.directory\"\n+                            },\n+                            {\n+                                \"description\": \"The name of the Azure File\",\n+                                \"name\": \"azure.filename\"\n+                            },\n+                            {\n+                                \"description\": \"Primary location for file content\",\n+                                \"name\": \"azure.primaryUri\"\n+                            },\n+                            {\n+                                \"description\": \"The length of the Azure File\",\n+                                \"name\": \"azure.length\"\n                             }\n                         ]\n                     },\n                     {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-standard-nar\",\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-azure-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -116464,361 +116673,268 @@\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n-                        \"dynamicProperties\": [\n-                            {\n-                                \"description\": \"Dynamic property names that will be passed to the Mail session. Possible properties can be found in: https://javaee.github.io/javamail/docs/api/com/sun/mail/smtp/package-summary.html.\",\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"name\": \"mail.propertyName\",\n-                                \"value\": \"Value for a specific property to be set in the JavaMail Session object\"\n-                            }\n+                        \"deprecated\": true,\n+                        \"deprecationAlternatives\": [\n+                            \"org.apache.nifi.processors.azure.storage.PutAzureBlobStorage_v12\"\n                         ],\n+                        \"deprecationReason\": \"Processor depends on legacy Microsoft Azure SDK\",\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Attach File\": {\n+                            \"azure-create-container\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"true\",\n                                         \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"false\",\n                                         \"value\": \"false\"\n                                     }\n                                 ],\n                                 \"defaultValue\": \"false\",\n-                                \"description\": \"Specifies whether or not the FlowFile content should be attached to the email\",\n-                                \"displayName\": \"Attach File\",\n+                                \"description\": \"Specifies whether to check if the container exists and to automatically create it if it does not. Permission to list containers is required. If false, this check is not made, but the Put operation will fail if the container does not exist.\",\n+                                \"displayName\": \"Create Container\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Attach File\",\n+                                \"name\": \"azure-create-container\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"BCC\": {\n-                                \"description\": \"The recipients to include in the BCC-Line of the email. Comma separated sequence of addresses following RFC822 syntax.\",\n-                                \"displayName\": \"BCC\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"BCC\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"CC\": {\n-                                \"description\": \"The recipients to include in the CC-Line of the email. Comma separated sequence of addresses following RFC822 syntax.\",\n-                                \"displayName\": \"CC\",\n+                            \"blob\": {\n+                                \"description\": \"The filename of the blob\",\n+                                \"displayName\": \"Blob\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"CC\",\n-                                \"required\": false,\n+                                \"name\": \"blob\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Content Type\": {\n-                                \"defaultValue\": \"text/plain\",\n-                                \"description\": \"Mime Type used to interpret the contents of the email, such as text/plain or text/html\",\n-                                \"displayName\": \"Content Type\",\n+                            \"container-name\": {\n+                                \"description\": \"Name of the Azure storage container. In case of PutAzureBlobStorage processor, container can be created if it does not exist.\",\n+                                \"displayName\": \"Container Name\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Content Type\",\n+                                \"name\": \"container-name\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"From\": {\n-                                \"description\": \"Specifies the Email address to use as the sender. Comma separated sequence of addresses following RFC822 syntax.\",\n-                                \"displayName\": \"From\",\n+                            \"cse-key-id\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"SYMMETRIC\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Client-Side Encryption Key Type\",\n+                                        \"propertyName\": \"cse-key-type\"\n+                                    }\n+                                ],\n+                                \"description\": \"Specifies the ID of the key to use for client-side encryption.\",\n+                                \"displayName\": \"Client-Side Encryption Key ID\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"From\",\n-                                \"required\": true,\n+                                \"name\": \"cse-key-id\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Include All Attributes In Message\": {\n+                            \"cse-key-type\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"description\": \"The blobs sent to Azure are not encrypted.\",\n+                                        \"displayName\": \"NONE\",\n+                                        \"value\": \"NONE\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"description\": \"The blobs sent to Azure are encrypted using a symmetric algorithm.\",\n+                                        \"displayName\": \"SYMMETRIC\",\n+                                        \"value\": \"SYMMETRIC\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"Specifies whether or not all FlowFile attributes should be recorded in the body of the email message\",\n-                                \"displayName\": \"Include All Attributes In Message\",\n+                                \"defaultValue\": \"NONE\",\n+                                \"description\": \"Specifies the key type to use for client-side encryption.\",\n+                                \"displayName\": \"Client-Side Encryption Key Type\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Include All Attributes In Message\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Message\": {\n-                                \"description\": \"The body of the email message\",\n-                                \"displayName\": \"Message\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Message\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"SMTP Auth\": {\n-                                \"defaultValue\": \"true\",\n-                                \"description\": \"Flag indicating whether authentication should be used\",\n-                                \"displayName\": \"SMTP Auth\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"SMTP Auth\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"SMTP Hostname\": {\n-                                \"description\": \"The hostname of the SMTP host\",\n-                                \"displayName\": \"SMTP Hostname\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"SMTP Hostname\",\n+                                \"name\": \"cse-key-type\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"SMTP Password\": {\n+                            \"cse-symmetric-key-hex\": {\n                                 \"dependencies\": [\n                                     {\n                                         \"dependentValues\": [\n-                                            \"password-based-authorization-mode\"\n+                                            \"SYMMETRIC\"\n                                         ],\n-                                        \"propertyDisplayName\": \"Authorization Mode\",\n-                                        \"propertyName\": \"authorization-mode\"\n+                                        \"propertyDisplayName\": \"Client-Side Encryption Key Type\",\n+                                        \"propertyName\": \"cse-key-type\"\n                                     }\n                                 ],\n-                                \"description\": \"Password for the SMTP account\",\n-                                \"displayName\": \"SMTP Password\",\n+                                \"description\": \"When using symmetric client-side encryption, this is the raw key, encoded in hexadecimal\",\n+                                \"displayName\": \"Symmetric Key\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"SMTP Password\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"cse-symmetric-key-hex\",\n                                 \"required\": false,\n                                 \"sensitive\": true\n                             },\n-                            \"SMTP Port\": {\n-                                \"defaultValue\": \"25\",\n-                                \"description\": \"The Port used for SMTP communications\",\n-                                \"displayName\": \"SMTP Port\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"SMTP Port\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"SMTP Socket Factory\": {\n-                                \"defaultValue\": \"javax.net.ssl.SSLSocketFactory\",\n-                                \"description\": \"Socket Factory to use for SMTP Connection\",\n-                                \"displayName\": \"SMTP Socket Factory\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"SMTP Socket Factory\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"SMTP TLS\": {\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"Flag indicating whether Opportunistic TLS should be enabled using STARTTLS command\",\n-                                \"displayName\": \"SMTP STARTTLS\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"SMTP TLS\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"SMTP Username\": {\n-                                \"description\": \"Username for the SMTP account\",\n-                                \"displayName\": \"SMTP Username\",\n+                            \"proxy-configuration-service\": {\n+                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests. Supported proxies: SOCKS, HTTP In case of SOCKS, it is not guaranteed that the selected SOCKS Version will be used by the processor.\",\n+                                \"displayName\": \"Proxy Configuration Service\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"SMTP Username\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"proxy-configuration-service\",\n                                 \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"SMTP X-Mailer Header\": {\n-                                \"defaultValue\": \"NiFi\",\n-                                \"description\": \"X-Mailer used in the header of the outgoing email\",\n-                                \"displayName\": \"SMTP X-Mailer Header\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"SMTP X-Mailer Header\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.proxy.ProxyConfigurationService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n                             },\n-                            \"Subject\": {\n-                                \"defaultValue\": \"Message from NiFi\",\n-                                \"description\": \"The email subject\",\n-                                \"displayName\": \"Subject\",\n+                            \"storage-account-key\": {\n+                                \"description\": \"The storage account key. This is an admin-like password providing access to every container in this account. It is recommended one uses Shared Access Signature (SAS) token instead for fine-grained control with policies. There are certain risks in allowing the account key to be stored as a flowfile attribute. While it does provide for a more flexible flow by allowing the account key to be fetched dynamically from a flowfile attribute, care must be taken to restrict access to the event provenance data (e.g., by strictly controlling the policies governing provenance for this processor). In addition, the provenance repositories may be put on encrypted disk partitions.\",\n+                                \"displayName\": \"Storage Account Key\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Subject\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n+                                \"name\": \"storage-account-key\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n                             },\n-                            \"To\": {\n-                                \"description\": \"The recipients to include in the To-Line of the email. Comma separated sequence of addresses following RFC822 syntax.\",\n-                                \"displayName\": \"To\",\n+                            \"storage-account-name\": {\n+                                \"description\": \"The storage account name. There are certain risks in allowing the account name to be stored as a flowfile attribute. While it does provide for a more flexible flow by allowing the account name to be fetched dynamically from a flowfile attribute, care must be taken to restrict access to the event provenance data (e.g., by strictly controlling the policies governing provenance for this processor). In addition, the provenance repositories may be put on encrypted disk partitions. Instead of defining the Storage Account Name, Storage Account Key and SAS Token properties directly on the processor, the preferred way is to configure them through a controller service specified in the Storage Credentials property. The controller service can provide a common/shared configuration for multiple/all Azure processors. Furthermore, the credentials can also be looked up dynamically with the 'Lookup' version of the service.\",\n+                                \"displayName\": \"Storage Account Name\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"To\",\n+                                \"name\": \"storage-account-name\",\n                                 \"required\": false,\n-                                \"sensitive\": false\n+                                \"sensitive\": true\n                             },\n-                            \"attribute-name-regex\": {\n-                                \"description\": \"A Regular Expression that is matched against all FlowFile attribute names. Any attribute whose name matches the regex will be added to the Email messages as a Header. If not specified, no FlowFile attributes will be added as headers.\",\n-                                \"displayName\": \"Attributes to Send as Headers (Regex)\",\n+                            \"storage-credentials-service\": {\n+                                \"description\": \"The Controller Service used to obtain Azure Storage Credentials. Instead of the processor level properties, the credentials can be configured here through a common/shared controller service, which is the preferred way. The 'Lookup' version of the service can also be used to select the credentials dynamically at runtime based on a FlowFile attribute (if the processor has FlowFile input).\",\n+                                \"displayName\": \"Storage Credentials\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"attribute-name-regex\",\n+                                \"name\": \"storage-credentials-service\",\n                                 \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"authorization-mode\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"Use password\",\n-                                        \"displayName\": \"Use Password\",\n-                                        \"value\": \"password-based-authorization-mode\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Use OAuth2 to acquire access token\",\n-                                        \"displayName\": \"Use OAuth2\",\n-                                        \"value\": \"oauth-based-authorization-mode\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"password-based-authorization-mode\",\n-                                \"description\": \"How to authorize sending email on the user's behalf.\",\n-                                \"displayName\": \"Authorization Mode\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"authorization-mode\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-azure-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.services.azure.storage.AzureStorageCredentialsService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n                             },\n-                            \"email-ff-content-as-message\": {\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"Specifies whether or not the FlowFile content should be the message of the email. If true, the 'Message' property is ignored.\",\n-                                \"displayName\": \"Flow file content as message\",\n+                            \"storage-endpoint-suffix\": {\n+                                \"description\": \"Storage accounts in public Azure always use a common FQDN suffix. Override this endpoint suffix with a different suffix in certain circumstances (like Azure Stack or non-public Azure regions). The preferred way is to configure them through a controller service specified in the Storage Credentials property. The controller service can provide a common/shared configuration for multiple/all Azure processors. Furthermore, the credentials can also be looked up dynamically with the 'Lookup' version of the service.\",\n+                                \"displayName\": \"Common Storage Account Endpoint Suffix\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"email-ff-content-as-message\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"input-character-set\": {\n-                                \"defaultValue\": \"UTF-8\",\n-                                \"description\": \"Specifies the character set of the FlowFile contents for reading input FlowFile contents to generate the message body or as an attachment to the message. If not set, UTF-8 will be the default value.\",\n-                                \"displayName\": \"Input Character Set\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"input-character-set\",\n-                                \"required\": true,\n+                                \"name\": \"storage-endpoint-suffix\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"oauth2-access-token-provider\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"oauth-based-authorization-mode\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Authorization Mode\",\n-                                        \"propertyName\": \"authorization-mode\"\n-                                    }\n-                                ],\n-                                \"description\": \"OAuth2 service that can provide access tokens.\",\n-                                \"displayName\": \"OAuth2 Access Token Provider\",\n+                            \"storage-sas-token\": {\n+                                \"description\": \"Shared Access Signature token, including the leading '?'. Specify either SAS token (recommended) or Account Key. There are certain risks in allowing the SAS token to be stored as a flowfile attribute. While it does provide for a more flexible flow by allowing the SAS token to be fetched dynamically from a flowfile attribute, care must be taken to restrict access to the event provenance data (e.g., by strictly controlling the policies governing provenance for this processor). In addition, the provenance repositories may be put on encrypted disk partitions.\",\n+                                \"displayName\": \"SAS Token\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"oauth2-access-token-provider\",\n-                                \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.oauth2.OAuth2AccessTokenProvider\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"storage-sas-token\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n                             }\n                         },\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.processors.azure.storage.DeleteAzureBlobStorage\",\n+                            \"org.apache.nifi.processors.azure.storage.FetchAzureBlobStorage\",\n+                            \"org.apache.nifi.processors.azure.storage.ListAzureBlobStorage\"\n+                        ],\n                         \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"FlowFiles that are successfully sent will be routed to this relationship\",\n+                                \"description\": \"All successfully processed FlowFiles are routed to this relationship\",\n                                 \"name\": \"success\"\n                             },\n                             {\n-                                \"description\": \"FlowFiles that fail to send will be routed to this relationship\",\n+                                \"description\": \"Unsuccessful operations will be transferred to the failure relationship.\",\n                                 \"name\": \"failure\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n-                        \"supportsBatching\": true,\n-                        \"supportsDynamicProperties\": true,\n+                        \"supportsBatching\": false,\n+                        \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsEventDriven\": false,\n-                        \"supportsSensitiveDynamicProperties\": true,\n-                        \"systemResourceConsiderations\": [\n-                            {\n-                                \"description\": \"The entirety of the FlowFile's content (as a String object) will be read into memory in case the property to use the flow file content as the email body is set to true.\",\n-                                \"resource\": \"MEMORY\"\n-                            }\n-                        ],\n+                        \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"email\",\n-                            \"notify\",\n-                            \"put\",\n-                            \"smtp\"\n+                            \"azure\",\n+                            \"blob\",\n+                            \"cloud\",\n+                            \"microsoft\",\n+                            \"storage\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.standard.PutEmail\",\n-                        \"typeDescription\": \"Sends an e-mail to configured recipients for each incoming FlowFile\",\n-                        \"version\": \"1.27.0\"\n+                        \"type\": \"org.apache.nifi.processors.azure.storage.PutAzureBlobStorage\",\n+                        \"typeDescription\": \"Puts content into an Azure Storage Blob\",\n+                        \"version\": \"1.27.0\",\n+                        \"writesAttributes\": [\n+                            {\n+                                \"description\": \"The name of the Azure container\",\n+                                \"name\": \"azure.container\"\n+                            },\n+                            {\n+                                \"description\": \"The name of the Azure blob\",\n+                                \"name\": \"azure.blobname\"\n+                            },\n+                            {\n+                                \"description\": \"Primary location for blob content\",\n+                                \"name\": \"azure.primaryUri\"\n+                            },\n+                            {\n+                                \"description\": \"Etag for the Azure blob\",\n+                                \"name\": \"azure.etag\"\n+                            },\n+                            {\n+                                \"description\": \"Length of the blob\",\n+                                \"name\": \"azure.length\"\n+                            },\n+                            {\n+                                \"description\": \"The timestamp in Azure for the blob\",\n+                                \"name\": \"azure.timestamp\"\n+                            }\n+                        ]\n                     },\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-standard-nar\",\n+                        \"artifact\": \"nifi-azure-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -116826,680 +116942,797 @@\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n-                        \"dynamicProperties\": [\n-                            {\n-                                \"description\": \"The command specified in the key will be executed before doing a put.  You may add these optional properties  to send any commands to the FTP server before the file is actually transferred (before the put command). This option is only available for the PutFTP processor, as only FTP has this functionality. This is essentially the same as sending quote commands to an FTP server from the command line.  While this is the same as sending a quote command, it is very important that you leave off the .\",\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"name\": \"pre.cmd._____\",\n-                                \"value\": \"Not used\"\n-                            },\n-                            {\n-                                \"description\": \"The command specified in the key will be executed after doing a put.  You may add these optional properties  to send any commands to the FTP server before the file is actually transferred (before the put command). This option is only available for the PutFTP processor, as only FTP has this functionality. This is essentially the same as sending quote commands to an FTP server from the command line.  While this is the same as sending a quote command, it is very important that you leave off the .\",\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"name\": \"post.cmd._____\",\n-                                \"value\": \"Not used\"\n-                            }\n-                        ],\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Batch Size\": {\n-                                \"defaultValue\": \"500\",\n-                                \"description\": \"The maximum number of FlowFiles to send in a single connection\",\n-                                \"displayName\": \"Batch Size\",\n+                            \"Client-Side Encryption Key ID\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"LOCAL\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Client-Side Encryption Key Type\",\n+                                        \"propertyName\": \"Client-Side Encryption Key Type\"\n+                                    }\n+                                ],\n+                                \"description\": \"Specifies the ID of the key to use for client-side encryption.\",\n+                                \"displayName\": \"Client-Side Encryption Key ID\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Batch Size\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Client-Side Encryption Key ID\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Conflict Resolution\": {\n+                            \"Client-Side Encryption Key Type\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"REPLACE\",\n-                                        \"value\": \"REPLACE\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"IGNORE\",\n-                                        \"value\": \"IGNORE\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"RENAME\",\n-                                        \"value\": \"RENAME\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"REJECT\",\n-                                        \"value\": \"REJECT\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"FAIL\",\n-                                        \"value\": \"FAIL\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n+                                        \"description\": \"Client-Side Encryption disabled\",\n                                         \"displayName\": \"NONE\",\n                                         \"value\": \"NONE\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Client-Side Encryption enabled using local key\",\n+                                        \"displayName\": \"LOCAL\",\n+                                        \"value\": \"LOCAL\"\n                                     }\n                                 ],\n                                 \"defaultValue\": \"NONE\",\n-                                \"description\": \"Determines how to handle the problem of filename collisions\",\n-                                \"displayName\": \"Conflict Resolution\",\n+                                \"description\": \"Specifies the key type to use for client-side encryption.\",\n+                                \"displayName\": \"Client-Side Encryption Key Type\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Conflict Resolution\",\n+                                \"name\": \"Client-Side Encryption Key Type\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Connection Mode\": {\n+                            \"Client-Side Encryption Local Key\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"LOCAL\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Client-Side Encryption Key Type\",\n+                                        \"propertyName\": \"Client-Side Encryption Key Type\"\n+                                    }\n+                                ],\n+                                \"description\": \"When using local client-side encryption, this is the raw key, encoded in hexadecimal\",\n+                                \"displayName\": \"Client-Side Encryption Local Key\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Client-Side Encryption Local Key\",\n+                                \"required\": true,\n+                                \"sensitive\": true\n+                            },\n+                            \"File Resource Service\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"FILE_RESOURCE_SERVICE\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Resource Transfer Source\",\n+                                        \"propertyName\": \"Resource Transfer Source\"\n+                                    }\n+                                ],\n+                                \"description\": \"File Resource Service providing access to the local resource to be transferred\",\n+                                \"displayName\": \"File Resource Service\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"File Resource Service\",\n+                                \"required\": true,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.fileresource.service.api.FileResourceService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"Resource Transfer Source\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Active\",\n-                                        \"value\": \"Active\"\n+                                        \"description\": \"The content of the incoming FlowFile provides the source for transfer\",\n+                                        \"displayName\": \"FlowFile Content\",\n+                                        \"value\": \"FLOWFILE_CONTENT\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Passive\",\n-                                        \"value\": \"Passive\"\n+                                        \"description\": \"The File Resource Service provides the source for transfer\",\n+                                        \"displayName\": \"File Resource Service\",\n+                                        \"value\": \"FILE_RESOURCE_SERVICE\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"Passive\",\n-                                \"description\": \"The FTP Connection Mode\",\n-                                \"displayName\": \"Connection Mode\",\n+                                \"defaultValue\": \"FLOWFILE_CONTENT\",\n+                                \"description\": \"The source of the content to be transferred\",\n+                                \"displayName\": \"Resource Transfer Source\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Connection Mode\",\n-                                \"required\": false,\n+                                \"name\": \"Resource Transfer Source\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Connection Timeout\": {\n-                                \"defaultValue\": \"30 sec\",\n-                                \"description\": \"Amount of time to wait before timing out while creating a connection\",\n-                                \"displayName\": \"Connection Timeout\",\n+                            \"blob-name\": {\n+                                \"description\": \"The full name of the blob\",\n+                                \"displayName\": \"Blob Name\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Connection Timeout\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"blob-name\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Create Directory\": {\n+                            \"conflict-resolution-strategy\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"description\": \"Fail if the blob already exists\",\n+                                        \"displayName\": \"fail\",\n+                                        \"value\": \"FAIL_RESOLUTION\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"description\": \"Ignore if the blob already exists; the 'azure.error' attribute will be set to the value 'BLOB_ALREADY_EXISTS'\",\n+                                        \"displayName\": \"ignore\",\n+                                        \"value\": \"IGNORE_RESOLUTION\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Replace blob contents if the blob already exist\",\n+                                        \"displayName\": \"replace\",\n+                                        \"value\": \"REPLACE_RESOLUTION\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"Specifies whether or not the remote directory should be created if it does not exist.\",\n-                                \"displayName\": \"Create Directory\",\n+                                \"defaultValue\": \"FAIL_RESOLUTION\",\n+                                \"description\": \"Specifies whether an existing blob will have its contents replaced upon conflict.\",\n+                                \"displayName\": \"Conflict Resolution Strategy\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Create Directory\",\n+                                \"name\": \"conflict-resolution-strategy\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Data Timeout\": {\n-                                \"defaultValue\": \"30 sec\",\n-                                \"description\": \"When transferring a file between the local and remote system, this value specifies how long is allowed to elapse without any data being transferred between systems\",\n-                                \"displayName\": \"Data Timeout\",\n+                            \"container-name\": {\n+                                \"description\": \"Name of the Azure storage container. In case of PutAzureBlobStorage processor, container can be created if it does not exist.\",\n+                                \"displayName\": \"Container Name\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Data Timeout\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"container-name\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Dot Rename\": {\n+                            \"create-container\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"true\",\n                                         \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"false\",\n                                         \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"true\",\n-                                \"description\": \"If true, then the filename of the sent file is prepended with a \\\".\\\" and then renamed back to the original once the file is completely sent. Otherwise, there is no rename. This property is ignored if the Temporary Filename property is set.\",\n-                                \"displayName\": \"Dot Rename\",\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"Specifies whether to check if the container exists and to automatically create it if it does not. Permission to list containers is required. If false, this check is not made, but the Put operation will fail if the container does not exist.\",\n+                                \"displayName\": \"Create Container\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Dot Rename\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Hostname\": {\n-                                \"description\": \"The fully qualified hostname or IP address of the remote system\",\n-                                \"displayName\": \"Hostname\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Hostname\",\n+                                \"name\": \"create-container\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Http Proxy Password\": {\n-                                \"description\": \"Http Proxy Password\",\n-                                \"displayName\": \"Http Proxy Password\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Http Proxy Password\",\n-                                \"required\": false,\n-                                \"sensitive\": true\n-                            },\n-                            \"Http Proxy Username\": {\n-                                \"description\": \"Http Proxy Username\",\n-                                \"displayName\": \"Http Proxy Username\",\n+                            \"proxy-configuration-service\": {\n+                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests. Supported proxies: SOCKS, HTTP In case of SOCKS, it is not guaranteed that the selected SOCKS Version will be used by the processor.\",\n+                                \"displayName\": \"Proxy Configuration Service\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Http Proxy Username\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"proxy-configuration-service\",\n                                 \"required\": false,\n-                                \"sensitive\": false\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.proxy.ProxyConfigurationService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n                             },\n-                            \"Internal Buffer Size\": {\n-                                \"defaultValue\": \"16KB\",\n-                                \"description\": \"Set the internal buffer size for buffered data streams\",\n-                                \"displayName\": \"Internal Buffer Size\",\n+                            \"storage-credentials-service\": {\n+                                \"description\": \"Controller Service used to obtain Azure Blob Storage Credentials.\",\n+                                \"displayName\": \"Storage Credentials\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Internal Buffer Size\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n+                                \"name\": \"storage-credentials-service\",\n+                                \"required\": true,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-azure-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.services.azure.storage.AzureStorageCredentialsService_v12\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            }\n+                        },\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.processors.azure.storage.DeleteAzureBlobStorage_v12\",\n+                            \"org.apache.nifi.processors.azure.storage.FetchAzureBlobStorage_v12\",\n+                            \"org.apache.nifi.processors.azure.storage.ListAzureBlobStorage_v12\"\n+                        ],\n+                        \"sideEffectFree\": false,\n+                        \"supportedRelationships\": [\n+                            {\n+                                \"description\": \"All successfully processed FlowFiles are routed to this relationship\",\n+                                \"name\": \"success\"\n                             },\n-                            \"Last Modified Time\": {\n-                                \"description\": \"The lastModifiedTime to assign to the file after transferring it. If not set, the lastModifiedTime will not be changed. Format must be yyyy-MM-dd'T'HH:mm:ssZ. You may also use expression language such as ${file.lastModifiedTime}. If the value is invalid, the processor will not be invalid but will fail to change lastModifiedTime of the file.\",\n-                                \"displayName\": \"Last Modified Time\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Last Modified Time\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n+                            {\n+                                \"description\": \"Unsuccessful operations will be transferred to the failure relationship.\",\n+                                \"name\": \"failure\"\n+                            }\n+                        ],\n+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\"\n+                        ],\n+                        \"supportsBatching\": false,\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicRelationships\": false,\n+                        \"supportsEventDriven\": false,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"azure\",\n+                            \"blob\",\n+                            \"cloud\",\n+                            \"microsoft\",\n+                            \"storage\"\n+                        ],\n+                        \"triggerSerially\": false,\n+                        \"triggerWhenAnyDestinationAvailable\": false,\n+                        \"triggerWhenEmpty\": false,\n+                        \"type\": \"org.apache.nifi.processors.azure.storage.PutAzureBlobStorage_v12\",\n+                        \"typeDescription\": \"Puts content into a blob on Azure Blob Storage. The processor uses Azure Blob Storage client library v12.\",\n+                        \"version\": \"1.27.0\",\n+                        \"writesAttributes\": [\n+                            {\n+                                \"description\": \"The name of the Azure Blob Storage container\",\n+                                \"name\": \"azure.container\"\n                             },\n-                            \"Password\": {\n-                                \"description\": \"Password for the user account\",\n-                                \"displayName\": \"Password\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Password\",\n-                                \"required\": false,\n-                                \"sensitive\": true\n+                            {\n+                                \"description\": \"The name of the blob on Azure Blob Storage\",\n+                                \"name\": \"azure.blobname\"\n                             },\n-                            \"Permissions\": {\n-                                \"description\": \"The permissions to assign to the file after transferring it. Format must be either UNIX rwxrwxrwx with a - in place of denied permissions (e.g. rw-r--r--) or an octal number (e.g. 644). If not set, the permissions will not be changed. You may also use expression language such as ${file.permissions}. If the value is invalid, the processor will not be invalid but will fail to change permissions of the file.\",\n-                                \"displayName\": \"Permissions\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Permissions\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n+                            {\n+                                \"description\": \"Primary location of the blob\",\n+                                \"name\": \"azure.primaryUri\"\n                             },\n-                            \"Port\": {\n-                                \"defaultValue\": \"21\",\n-                                \"description\": \"The port that the remote system is listening on for file transfers\",\n-                                \"displayName\": \"Port\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Port\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n+                            {\n+                                \"description\": \"ETag of the blob\",\n+                                \"name\": \"azure.etag\"\n                             },\n-                            \"Proxy Host\": {\n-                                \"description\": \"The fully qualified hostname or IP address of the proxy server\",\n-                                \"displayName\": \"Proxy Host\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Proxy Host\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n+                            {\n+                                \"description\": \"Type of the blob (either BlockBlob, PageBlob or AppendBlob)\",\n+                                \"name\": \"azure.blobtype\"\n                             },\n-                            \"Proxy Port\": {\n-                                \"description\": \"The port of the proxy server\",\n-                                \"displayName\": \"Proxy Port\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Proxy Port\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n+                            {\n+                                \"description\": \"MIME Type of the content\",\n+                                \"name\": \"mime.type\"\n                             },\n-                            \"Proxy Type\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"DIRECT\",\n-                                        \"value\": \"DIRECT\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"HTTP\",\n-                                        \"value\": \"HTTP\"\n-                                    },\n+                            {\n+                                \"description\": \"Language code for the content\",\n+                                \"name\": \"lang\"\n+                            },\n+                            {\n+                                \"description\": \"Timestamp of the blob\",\n+                                \"name\": \"azure.timestamp\"\n+                            },\n+                            {\n+                                \"description\": \"Length of the blob\",\n+                                \"name\": \"azure.length\"\n+                            },\n+                            {\n+                                \"description\": \"Error code reported during blob operation\",\n+                                \"name\": \"azure.error.code\"\n+                            },\n+                            {\n+                                \"description\": \"When Conflict Resolution Strategy is 'ignore', this property will be true/false depending on whether the blob was ignored.\",\n+                                \"name\": \"azure.ignored\"\n+                            }\n+                        ]\n+                    },\n+                    {\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-azure-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"e0c4461\"\n+                        },\n+                        \"defaultBulletinLevel\": \"WARN\",\n+                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": 1,\n+                            \"TIMER_DRIVEN\": 1\n+                        },\n+                        \"defaultPenaltyDuration\": \"30 sec\",\n+                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": \"* * * * * ?\",\n+                            \"TIMER_DRIVEN\": \"0 sec\"\n+                        },\n+                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n+                        \"defaultYieldDuration\": \"1 sec\",\n+                        \"group\": \"org.apache.nifi\",\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n+                        \"primaryNodeOnly\": false,\n+                        \"propertyDescriptors\": {\n+                            \"File Resource Service\": {\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"SOCKS\",\n-                                        \"value\": \"SOCKS\"\n+                                        \"dependentValues\": [\n+                                            \"FILE_RESOURCE_SERVICE\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Resource Transfer Source\",\n+                                        \"propertyName\": \"Resource Transfer Source\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"DIRECT\",\n-                                \"description\": \"Proxy type used for file transfers\",\n-                                \"displayName\": \"Proxy Type\",\n+                                \"description\": \"File Resource Service providing access to the local resource to be transferred\",\n+                                \"displayName\": \"File Resource Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Proxy Type\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n+                                \"name\": \"File Resource Service\",\n+                                \"required\": true,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.fileresource.service.api.FileResourceService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n                             },\n-                            \"Reject Zero-Byte Files\": {\n+                            \"Resource Transfer Source\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"description\": \"The content of the incoming FlowFile provides the source for transfer\",\n+                                        \"displayName\": \"FlowFile Content\",\n+                                        \"value\": \"FLOWFILE_CONTENT\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"description\": \"The File Resource Service provides the source for transfer\",\n+                                        \"displayName\": \"File Resource Service\",\n+                                        \"value\": \"FILE_RESOURCE_SERVICE\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"true\",\n-                                \"description\": \"Determines whether or not Zero-byte files should be rejected without attempting to transfer\",\n-                                \"displayName\": \"Reject Zero-Byte Files\",\n+                                \"defaultValue\": \"FLOWFILE_CONTENT\",\n+                                \"description\": \"The source of the content to be transferred\",\n+                                \"displayName\": \"Resource Transfer Source\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Reject Zero-Byte Files\",\n-                                \"required\": false,\n+                                \"name\": \"Resource Transfer Source\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Remote Path\": {\n-                                \"description\": \"The path on the remote system from which to pull or push files\",\n-                                \"displayName\": \"Remote Path\",\n+                            \"adls-credentials-service\": {\n+                                \"description\": \"Controller Service used to obtain Azure Credentials.\",\n+                                \"displayName\": \"ADLS Credentials\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Remote Path\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"adls-credentials-service\",\n+                                \"required\": true,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-azure-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.services.azure.storage.ADLSCredentialsService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n                             },\n-                            \"Temporary Filename\": {\n-                                \"description\": \"If set, the filename of the sent file will be equal to the value specified during the transfer and after successful completion will be renamed to the original filename. If this value is set, the Dot Rename property is ignored.\",\n-                                \"displayName\": \"Temporary Filename\",\n+                            \"base-temporary-path\": {\n+                                \"defaultValue\": \"\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"WRITE_AND_RENAME\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Writing Strategy\",\n+                                        \"propertyName\": \"writing-strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"The Path where the temporary directory will be created. The Path name cannot contain a leading '/'. The root directory can be designated by the empty string value. Non-existing directories will be created.The Temporary File Directory name is _nifitempdirectory\",\n+                                \"displayName\": \"Base Temporary Path\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Temporary Filename\",\n+                                \"name\": \"base-temporary-path\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Transfer Mode\": {\n+                            \"conflict-resolution-strategy\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"Binary\",\n-                                        \"value\": \"Binary\"\n+                                        \"displayName\": \"fail\",\n+                                        \"value\": \"fail\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"ASCII\",\n-                                        \"value\": \"ASCII\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"Binary\",\n-                                \"description\": \"The FTP Transfer Mode\",\n-                                \"displayName\": \"Transfer Mode\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Transfer Mode\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Use Compression\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"displayName\": \"replace\",\n+                                        \"value\": \"replace\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"displayName\": \"ignore\",\n+                                        \"value\": \"ignore\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"Indicates whether or not ZLIB compression should be used when transferring files\",\n-                                \"displayName\": \"Use Compression\",\n+                                \"defaultValue\": \"fail\",\n+                                \"description\": \"Indicates what should happen when a file with the same name already exists in the output directory\",\n+                                \"displayName\": \"Conflict Resolution Strategy\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Use Compression\",\n+                                \"name\": \"conflict-resolution-strategy\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Username\": {\n-                                \"description\": \"Username\",\n-                                \"displayName\": \"Username\",\n+                            \"directory-name\": {\n+                                \"description\": \"Name of the Azure Storage Directory. The Directory Name cannot contain a leading '/'. The root directory can be designated by the empty string value. In case of the PutAzureDataLakeStorage processor, the directory will be created if not already existing.\",\n+                                \"displayName\": \"Directory Name\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Username\",\n+                                \"name\": \"directory-name\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"ftp-use-utf8\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"Tells the client to use UTF-8 encoding when processing files and filenames. If set to true, the server must also support UTF-8 encoding.\",\n-                                \"displayName\": \"Use UTF-8 Encoding\",\n+                            \"file-name\": {\n+                                \"defaultValue\": \"${azure.filename}\",\n+                                \"description\": \"The filename\",\n+                                \"displayName\": \"File Name\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"ftp-use-utf8\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"file-name\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"filesystem-name\": {\n+                                \"description\": \"Name of the Azure Storage File System (also called Container). It is assumed to be already existing.\",\n+                                \"displayName\": \"Filesystem Name\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"filesystem-name\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n                             \"proxy-configuration-service\": {\n-                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests. If set, it supersedes proxy settings configured per component. Supported proxies: SOCKS + AuthN, HTTP + AuthN\",\n+                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests. Supported proxies: SOCKS, HTTP In case of SOCKS, it is not guaranteed that the selected SOCKS Version will be used by the processor.\",\n                                 \"displayName\": \"Proxy Configuration Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n                                 \"name\": \"proxy-configuration-service\",\n                                 \"required\": false,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n                                     \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n                                     \"type\": \"org.apache.nifi.proxy.ProxyConfigurationService\",\n                                     \"version\": \"1.27.0\"\n                                 }\n+                            },\n+                            \"writing-strategy\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"The processor writes the Azure file into a temporary directory and then renames/moves it to the final destination. This prevents other processes from reading partially written files.\",\n+                                        \"displayName\": \"Write and Rename\",\n+                                        \"value\": \"WRITE_AND_RENAME\"\n+                                    },\n+                                    {\n+                                        \"description\": \"The processor writes the Azure file directly to the destination. This might result in the reading of partially written files.\",\n+                                        \"displayName\": \"Simple Write\",\n+                                        \"value\": \"SIMPLE_WRITE\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"WRITE_AND_RENAME\",\n+                                \"description\": \"Defines the approach for writing the Azure file.\",\n+                                \"displayName\": \"Writing Strategy\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"writing-strategy\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n                             }\n                         },\n                         \"seeAlso\": [\n-                            \"org.apache.nifi.processors.standard.GetFTP\"\n+                            \"org.apache.nifi.processors.azure.storage.DeleteAzureDataLakeStorage\",\n+                            \"org.apache.nifi.processors.azure.storage.FetchAzureDataLakeStorage\",\n+                            \"org.apache.nifi.processors.azure.storage.ListAzureDataLakeStorage\"\n                         ],\n                         \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"FlowFiles that are successfully sent will be routed to success\",\n+                                \"description\": \"Files that have been successfully written to Azure storage are transferred to this relationship\",\n                                 \"name\": \"success\"\n                             },\n                             {\n-                                \"description\": \"FlowFiles that were rejected by the destination system\",\n-                                \"name\": \"reject\"\n-                            },\n-                            {\n-                                \"description\": \"FlowFiles that failed to send to the remote system; failure is usually looped back to this processor\",\n+                                \"description\": \"Files that could not be written to Azure storage for some reason are transferred to this relationship\",\n                                 \"name\": \"failure\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n-                        \"supportsBatching\": true,\n-                        \"supportsDynamicProperties\": true,\n+                        \"supportsBatching\": false,\n+                        \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"archive\",\n-                            \"copy\",\n-                            \"egress\",\n-                            \"files\",\n-                            \"ftp\",\n-                            \"put\",\n-                            \"remote\"\n+                            \"adlsgen2\",\n+                            \"azure\",\n+                            \"cloud\",\n+                            \"datalake\",\n+                            \"microsoft\",\n+                            \"storage\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.standard.PutFTP\",\n-                        \"typeDescription\": \"Sends FlowFiles to an FTP Server\",\n-                        \"version\": \"1.27.0\"\n+                        \"type\": \"org.apache.nifi.processors.azure.storage.PutAzureDataLakeStorage\",\n+                        \"typeDescription\": \"Writes the contents of a FlowFile as a file on Azure Data Lake Storage Gen 2\",\n+                        \"version\": \"1.27.0\",\n+                        \"writesAttributes\": [\n+                            {\n+                                \"description\": \"The name of the Azure File System\",\n+                                \"name\": \"azure.filesystem\"\n+                            },\n+                            {\n+                                \"description\": \"The name of the Azure Directory\",\n+                                \"name\": \"azure.directory\"\n+                            },\n+                            {\n+                                \"description\": \"The name of the Azure File\",\n+                                \"name\": \"azure.filename\"\n+                            },\n+                            {\n+                                \"description\": \"Primary location for file content\",\n+                                \"name\": \"azure.primaryUri\"\n+                            },\n+                            {\n+                                \"description\": \"The length of the Azure File\",\n+                                \"name\": \"azure.length\"\n+                            }\n+                        ]\n                     },\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-standard-nar\",\n+                        \"artifact\": \"nifi-azure-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n-                            \"EVENT_DRIVEN\": 0,\n                             \"TIMER_DRIVEN\": 1\n                         },\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n-                        \"explicitRestrictions\": [\n-                            {\n-                                \"explanation\": \"Provides operator the ability to write to any file that NiFi has access to.\",\n-                                \"requiredPermission\": \"write filesystem\"\n-                            }\n+                        \"deprecated\": true,\n+                        \"deprecationAlternatives\": [\n+                            \"org.apache.nifi.processors.azure.storage.queue.GetAzureQueueStorage_v12\"\n                         ],\n+                        \"deprecationReason\": \"\",\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_REQUIRED\",\n+                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Conflict Resolution Strategy\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"replace\",\n-                                        \"value\": \"replace\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"ignore\",\n-                                        \"value\": \"ignore\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"fail\",\n-                                        \"value\": \"fail\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"fail\",\n-                                \"description\": \"Indicates what should happen when a file with the same name already exists in the output directory\",\n-                                \"displayName\": \"Conflict Resolution Strategy\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Conflict Resolution Strategy\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Create Missing Directories\": {\n+                            \"auto-delete-messages\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"true\",\n                                         \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"false\",\n                                         \"value\": \"false\"\n                                     }\n                                 ],\n                                 \"defaultValue\": \"true\",\n-                                \"description\": \"If true, then missing destination directories will be created. If false, flowfiles are penalized and sent to failure.\",\n-                                \"displayName\": \"Create Missing Directories\",\n+                                \"description\": \"Specifies whether the received message is to be automatically deleted from the queue.\",\n+                                \"displayName\": \"Auto Delete Messages\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Create Missing Directories\",\n+                                \"name\": \"auto-delete-messages\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Directory\": {\n-                                \"description\": \"The directory to which files should be written. You may use expression language such as /aa/bb/${path}\",\n-                                \"displayName\": \"Directory\",\n+                            \"batch-size\": {\n+                                \"defaultValue\": \"32\",\n+                                \"description\": \"The number of messages to be retrieved from the queue.\",\n+                                \"displayName\": \"Batch Size\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Directory\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"batch-size\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Group\": {\n-                                \"description\": \"Sets the group on the output file to the value of this attribute.  You may also use expression language such as ${file.group}.\",\n-                                \"displayName\": \"Group\",\n+                            \"proxy-configuration-service\": {\n+                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests. Supported proxies: SOCKS, HTTP In case of SOCKS, it is not guaranteed that the selected SOCKS Version will be used by the processor.\",\n+                                \"displayName\": \"Proxy Configuration Service\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"proxy-configuration-service\",\n+                                \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.proxy.ProxyConfigurationService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"storage-account-key\": {\n+                                \"description\": \"The storage account key. This is an admin-like password providing access to every container in this account. It is recommended one uses Shared Access Signature (SAS) token instead for fine-grained control with policies. There are certain risks in allowing the account key to be stored as a flowfile attribute. While it does provide for a more flexible flow by allowing the account key to be fetched dynamically from a flowfile attribute, care must be taken to restrict access to the event provenance data (e.g., by strictly controlling the policies governing provenance for this processor). In addition, the provenance repositories may be put on encrypted disk partitions.\",\n+                                \"displayName\": \"Storage Account Key\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Group\",\n+                                \"name\": \"storage-account-key\",\n                                 \"required\": false,\n-                                \"sensitive\": false\n+                                \"sensitive\": true\n                             },\n-                            \"Last Modified Time\": {\n-                                \"description\": \"Sets the lastModifiedTime on the output file to the value of this attribute.  Format must be yyyy-MM-dd'T'HH:mm:ssZ.  You may also use expression language such as ${file.lastModifiedTime}.\",\n-                                \"displayName\": \"Last Modified Time\",\n+                            \"storage-account-name\": {\n+                                \"description\": \"The storage account name. There are certain risks in allowing the account name to be stored as a flowfile attribute. While it does provide for a more flexible flow by allowing the account name to be fetched dynamically from a flowfile attribute, care must be taken to restrict access to the event provenance data (e.g., by strictly controlling the policies governing provenance for this processor). In addition, the provenance repositories may be put on encrypted disk partitions. Instead of defining the Storage Account Name, Storage Account Key and SAS Token properties directly on the processor, the preferred way is to configure them through a controller service specified in the Storage Credentials property. The controller service can provide a common/shared configuration for multiple/all Azure processors. Furthermore, the credentials can also be looked up dynamically with the 'Lookup' version of the service.\",\n+                                \"displayName\": \"Storage Account Name\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Last Modified Time\",\n+                                \"name\": \"storage-account-name\",\n                                 \"required\": false,\n-                                \"sensitive\": false\n+                                \"sensitive\": true\n                             },\n-                            \"Maximum File Count\": {\n-                                \"description\": \"Specifies the maximum number of files that can exist in the output directory\",\n-                                \"displayName\": \"Maximum File Count\",\n+                            \"storage-credentials-service\": {\n+                                \"description\": \"The Controller Service used to obtain Azure Storage Credentials. Instead of the processor level properties, the credentials can be configured here through a common/shared controller service, which is the preferred way. The 'Lookup' version of the service can also be used to select the credentials dynamically at runtime based on a FlowFile attribute (if the processor has FlowFile input).\",\n+                                \"displayName\": \"Storage Credentials\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Maximum File Count\",\n+                                \"name\": \"storage-credentials-service\",\n                                 \"required\": false,\n-                                \"sensitive\": false\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-azure-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.services.azure.storage.AzureStorageCredentialsService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n                             },\n-                            \"Owner\": {\n-                                \"description\": \"Sets the owner on the output file to the value of this attribute.  You may also use expression language such as ${file.owner}. Note on many operating systems Nifi must be running as a super-user to have the permissions to set the file owner.\",\n-                                \"displayName\": \"Owner\",\n+                            \"storage-endpoint-suffix\": {\n+                                \"description\": \"Storage accounts in public Azure always use a common FQDN suffix. Override this endpoint suffix with a different suffix in certain circumstances (like Azure Stack or non-public Azure regions). The preferred way is to configure them through a controller service specified in the Storage Credentials property. The controller service can provide a common/shared configuration for multiple/all Azure processors. Furthermore, the credentials can also be looked up dynamically with the 'Lookup' version of the service.\",\n+                                \"displayName\": \"Common Storage Account Endpoint Suffix\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Owner\",\n+                                \"name\": \"storage-endpoint-suffix\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Permissions\": {\n-                                \"description\": \"Sets the permissions on the output file to the value of this attribute.  Format must be either UNIX rwxrwxrwx with a - in place of denied permissions (e.g. rw-r--r--) or an octal number (e.g. 644).  You may also use expression language such as ${file.permissions}.\",\n-                                \"displayName\": \"Permissions\",\n+                            \"storage-queue-name\": {\n+                                \"description\": \"Name of the Azure Storage Queue\",\n+                                \"displayName\": \"Queue Name\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Permissions\",\n+                                \"name\": \"storage-queue-name\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"storage-sas-token\": {\n+                                \"description\": \"Shared Access Signature token, including the leading '?'. Specify either SAS token (recommended) or Account Key. There are certain risks in allowing the SAS token to be stored as a flowfile attribute. While it does provide for a more flexible flow by allowing the SAS token to be fetched dynamically from a flowfile attribute, care must be taken to restrict access to the event provenance data (e.g., by strictly controlling the policies governing provenance for this processor). In addition, the provenance repositories may be put on encrypted disk partitions.\",\n+                                \"displayName\": \"SAS Token\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"storage-sas-token\",\n                                 \"required\": false,\n+                                \"sensitive\": true\n+                            },\n+                            \"visibility-timeout\": {\n+                                \"defaultValue\": \"30 secs\",\n+                                \"description\": \"The duration during which the retrieved message should be invisible to other consumers.\",\n+                                \"displayName\": \"Visibility Timeout\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"visibility-timeout\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             }\n                         },\n-                        \"readsAttributes\": [\n-                            {\n-                                \"description\": \"The filename to use when writing the FlowFile to disk.\",\n-                                \"name\": \"filename\"\n-                            }\n-                        ],\n-                        \"restricted\": true,\n                         \"seeAlso\": [\n-                            \"org.apache.nifi.processors.standard.FetchFile\",\n-                            \"org.apache.nifi.processors.standard.GetFile\"\n+                            \"org.apache.nifi.processors.azure.storage.queue.PutAzureQueueStorage\"\n                         ],\n                         \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"Files that have been successfully written to the output directory are transferred to this relationship\",\n+                                \"description\": \"All successfully processed FlowFiles are routed to this relationship\",\n                                 \"name\": \"success\"\n-                            },\n-                            {\n-                                \"description\": \"Files that could not be written to the output directory for some reason are transferred to this relationship\",\n-                                \"name\": \"failure\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\",\n-                            \"EVENT_DRIVEN\"\n+                            \"CRON_DRIVEN\"\n                         ],\n-                        \"supportsBatching\": true,\n+                        \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": true,\n+                        \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"archive\",\n-                            \"copy\",\n-                            \"files\",\n-                            \"filesystem\",\n-                            \"local\",\n-                            \"put\"\n+                            \"azure\",\n+                            \"cloud\",\n+                            \"dequeue\",\n+                            \"microsoft\",\n+                            \"queue\",\n+                            \"storage\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.standard.PutFile\",\n-                        \"typeDescription\": \"Writes the contents of a FlowFile to the local file system\",\n-                        \"version\": \"1.27.0\"\n+                        \"type\": \"org.apache.nifi.processors.azure.storage.queue.GetAzureQueueStorage\",\n+                        \"typeDescription\": \"Retrieves the messages from an Azure Queue Storage. The retrieved messages will be deleted from the queue by default. If the requirement is to consume messages without deleting them, set 'Auto Delete Messages' to 'false'. Note: There might be chances of receiving duplicates in situations like when a message is received but was unable to be deleted from the queue due to some unexpected situations.\",\n+                        \"version\": \"1.27.0\",\n+                        \"writesAttributes\": [\n+                            {\n+                                \"description\": \"The absolute URI of the configured Azure Queue Storage\",\n+                                \"name\": \"azure.queue.uri\"\n+                            },\n+                            {\n+                                \"description\": \"The time when the message was inserted into the queue storage\",\n+                                \"name\": \"azure.queue.insertionTime\"\n+                            },\n+                            {\n+                                \"description\": \"The time when the message will expire from the queue storage\",\n+                                \"name\": \"azure.queue.expirationTime\"\n+                            },\n+                            {\n+                                \"description\": \"The ID of the retrieved message\",\n+                                \"name\": \"azure.queue.messageId\"\n+                            },\n+                            {\n+                                \"description\": \"The pop receipt of the retrieved message\",\n+                                \"name\": \"azure.queue.popReceipt\"\n+                            }\n+                        ]\n                     },\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-standard-nar\",\n+                        \"artifact\": \"nifi-azure-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -117507,980 +117740,1169 @@\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n-                        \"deprecated\": true,\n-                        \"deprecationAlternatives\": [\n-                            \"org.apache.nifi.jms.processors.PublishJMS\"\n-                        ],\n-                        \"deprecationReason\": \"This processor is deprecated and may be removed in future releases.\",\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_REQUIRED\",\n+                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Client ID Prefix\": {\n-                                \"description\": \"A human-readable ID that can be used to associate connections with yourself so that the maintainers of the JMS Server know who to contact if problems arise\",\n-                                \"displayName\": \"Client ID Prefix\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Client ID Prefix\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Communications Timeout\": {\n-                                \"defaultValue\": \"30 sec\",\n-                                \"description\": \"The amount of time to wait when attempting to receive a message before giving up and assuming failure\",\n-                                \"displayName\": \"Communications Timeout\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Communications Timeout\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Copy Attributes to JMS Properties\": {\n+                            \"Auto Delete Messages\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"true\",\n                                         \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"false\",\n                                         \"value\": \"false\"\n                                     }\n                                 ],\n                                 \"defaultValue\": \"true\",\n-                                \"description\": \"Whether or not FlowFile Attributes should be translated into JMS Message Properties. If true, all attributes starting with 'jms.' will be set as Properties on the JMS Message (without the 'jms.' prefix). If an attribute exists that starts with the same value but ends in '.type', that attribute will be used to determine the JMS Message Property type.\",\n-                                \"displayName\": \"Copy Attributes to JMS Properties\",\n+                                \"description\": \"Specifies whether the received message is to be automatically deleted from the queue.\",\n+                                \"displayName\": \"Auto Delete Messages\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Copy Attributes to JMS Properties\",\n+                                \"name\": \"Auto Delete Messages\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Destination Name\": {\n-                                \"description\": \"The name of the JMS Topic or queue to use\",\n-                                \"displayName\": \"Destination Name\",\n+                            \"Credentials Service\": {\n+                                \"description\": \"Controller Service used to obtain Azure Storage Credentials.\",\n+                                \"displayName\": \"Credentials Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Destination Name\",\n+                                \"name\": \"Credentials Service\",\n                                 \"required\": true,\n-                                \"sensitive\": false\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-azure-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.services.azure.storage.AzureStorageCredentialsService_v12\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n                             },\n-                            \"Destination Type\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Queue\",\n-                                        \"value\": \"Queue\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Topic\",\n-                                        \"value\": \"Topic\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"Queue\",\n-                                \"description\": \"The type of the JMS Destination to use\",\n-                                \"displayName\": \"Destination Type\",\n+                            \"Message Batch Size\": {\n+                                \"defaultValue\": \"32\",\n+                                \"description\": \"The number of messages to be retrieved from the queue.\",\n+                                \"displayName\": \"Message Batch Size\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Destination Type\",\n+                                \"name\": \"Message Batch Size\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"JMS Provider\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"ActiveMQ\",\n-                                        \"value\": \"ActiveMQ\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"ActiveMQ\",\n-                                \"description\": \"The Provider used for the JMS Server\",\n-                                \"displayName\": \"JMS Provider\",\n+                            \"Queue Name\": {\n+                                \"description\": \"Name of the Azure Storage Queue\",\n+                                \"displayName\": \"Queue Name\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"JMS Provider\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Queue Name\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Max Buffer Size\": {\n-                                \"defaultValue\": \"1 MB\",\n-                                \"description\": \"The maximum amount of data that can be buffered for a JMS Message. If a FlowFile's size exceeds this value, the FlowFile will be routed to failure.\",\n-                                \"displayName\": \"Max Buffer Size\",\n+                            \"Request Timeout\": {\n+                                \"defaultValue\": \"10 secs\",\n+                                \"description\": \"The timeout for read or write requests to Azure Queue Storage. Defaults to 1 second.\",\n+                                \"displayName\": \"Request Timeout\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Max Buffer Size\",\n+                                \"name\": \"Request Timeout\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Message Batch Size\": {\n-                                \"defaultValue\": \"10\",\n-                                \"description\": \"The number of messages to pull/push in a single iteration of the processor\",\n-                                \"displayName\": \"Message Batch Size\",\n+                            \"Visibility Timeout\": {\n+                                \"defaultValue\": \"30 secs\",\n+                                \"description\": \"The duration during which the retrieved message should be invisible to other consumers.\",\n+                                \"displayName\": \"Visibility Timeout\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Message Batch Size\",\n+                                \"name\": \"Visibility Timeout\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Message Priority\": {\n-                                \"description\": \"The Priority of the Message\",\n-                                \"displayName\": \"Message Priority\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Message Priority\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Message Time to Live\": {\n-                                \"description\": \"The amount of time that the message should live on the destination before being removed; if not specified, the message will never expire.\",\n-                                \"displayName\": \"Message Time to Live\",\n+                            \"proxy-configuration-service\": {\n+                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests. Supported proxies: SOCKS, HTTP In case of SOCKS, it is not guaranteed that the selected SOCKS Version will be used by the processor.\",\n+                                \"displayName\": \"Proxy Configuration Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Message Time to Live\",\n+                                \"name\": \"proxy-configuration-service\",\n                                 \"required\": false,\n-                                \"sensitive\": false\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.proxy.ProxyConfigurationService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n                             },\n-                            \"Message Type\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"byte\",\n-                                        \"value\": \"byte\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"stream\",\n-                                        \"value\": \"stream\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"text\",\n-                                        \"value\": \"text\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"map\",\n-                                        \"value\": \"map\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"empty\",\n-                                        \"value\": \"empty\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"byte\",\n-                                \"description\": \"The Type of JMS Message to Construct\",\n-                                \"displayName\": \"Message Type\",\n+                            \"storage-endpoint-suffix\": {\n+                                \"defaultValue\": \"queue.core.windows.net\",\n+                                \"description\": \"Storage accounts in public Azure always use a common FQDN suffix. Override this endpoint suffix with a different suffix in certain circumstances (like Azure Stack or non-public Azure regions).\",\n+                                \"displayName\": \"Endpoint Suffix\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Message Type\",\n+                                \"name\": \"storage-endpoint-suffix\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n+                            }\n+                        },\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.processors.azure.storage.queue.PutAzureQueueStorage\"\n+                        ],\n+                        \"sideEffectFree\": false,\n+                        \"supportedRelationships\": [\n+                            {\n+                                \"description\": \"All successfully processed FlowFiles are routed to this relationship\",\n+                                \"name\": \"success\"\n+                            }\n+                        ],\n+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\"\n+                        ],\n+                        \"supportsBatching\": false,\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicRelationships\": false,\n+                        \"supportsEventDriven\": false,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"azure\",\n+                            \"cloud\",\n+                            \"dequeue\",\n+                            \"microsoft\",\n+                            \"queue\",\n+                            \"storage\"\n+                        ],\n+                        \"triggerSerially\": false,\n+                        \"triggerWhenAnyDestinationAvailable\": false,\n+                        \"triggerWhenEmpty\": false,\n+                        \"type\": \"org.apache.nifi.processors.azure.storage.queue.GetAzureQueueStorage_v12\",\n+                        \"typeDescription\": \"Retrieves the messages from an Azure Queue Storage. The retrieved messages will be deleted from the queue by default. If the requirement is to consume messages without deleting them, set 'Auto Delete Messages' to 'false'. Note: There might be chances of receiving duplicates in situations like when a message is received but was unable to be deleted from the queue due to some unexpected situations.\",\n+                        \"version\": \"1.27.0\",\n+                        \"writesAttributes\": [\n+                            {\n+                                \"description\": \"The absolute URI of the configured Azure Queue Storage\",\n+                                \"name\": \"azure.queue.uri\"\n                             },\n-                            \"Password\": {\n-                                \"description\": \"Password used for authentication and authorization\",\n-                                \"displayName\": \"Password\",\n+                            {\n+                                \"description\": \"The time when the message was inserted into the queue storage\",\n+                                \"name\": \"azure.queue.insertionTime\"\n+                            },\n+                            {\n+                                \"description\": \"The time when the message will expire from the queue storage\",\n+                                \"name\": \"azure.queue.expirationTime\"\n+                            },\n+                            {\n+                                \"description\": \"The ID of the retrieved message\",\n+                                \"name\": \"azure.queue.messageId\"\n+                            },\n+                            {\n+                                \"description\": \"The pop receipt of the retrieved message\",\n+                                \"name\": \"azure.queue.popReceipt\"\n+                            }\n+                        ]\n+                    },\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-azure-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"e0c4461\"\n+                        },\n+                        \"defaultBulletinLevel\": \"WARN\",\n+                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": 1,\n+                            \"TIMER_DRIVEN\": 1\n+                        },\n+                        \"defaultPenaltyDuration\": \"30 sec\",\n+                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": \"* * * * * ?\",\n+                            \"TIMER_DRIVEN\": \"0 sec\"\n+                        },\n+                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n+                        \"defaultYieldDuration\": \"1 sec\",\n+                        \"deprecated\": true,\n+                        \"deprecationAlternatives\": [\n+                            \"org.apache.nifi.processors.azure.storage.queue.PutAzureQueueStorage_v12\"\n+                        ],\n+                        \"deprecationReason\": \"\",\n+                        \"group\": \"org.apache.nifi\",\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n+                        \"primaryNodeOnly\": false,\n+                        \"propertyDescriptors\": {\n+                            \"proxy-configuration-service\": {\n+                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests. Supported proxies: SOCKS, HTTP In case of SOCKS, it is not guaranteed that the selected SOCKS Version will be used by the processor.\",\n+                                \"displayName\": \"Proxy Configuration Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Password\",\n+                                \"name\": \"proxy-configuration-service\",\n+                                \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.proxy.ProxyConfigurationService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"storage-account-key\": {\n+                                \"description\": \"The storage account key. This is an admin-like password providing access to every container in this account. It is recommended one uses Shared Access Signature (SAS) token instead for fine-grained control with policies. There are certain risks in allowing the account key to be stored as a flowfile attribute. While it does provide for a more flexible flow by allowing the account key to be fetched dynamically from a flowfile attribute, care must be taken to restrict access to the event provenance data (e.g., by strictly controlling the policies governing provenance for this processor). In addition, the provenance repositories may be put on encrypted disk partitions.\",\n+                                \"displayName\": \"Storage Account Key\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"storage-account-key\",\n                                 \"required\": false,\n                                 \"sensitive\": true\n                             },\n-                            \"Reply-To Queue\": {\n-                                \"description\": \"The name of the queue to which a reply to should be added\",\n-                                \"displayName\": \"Reply-To Queue\",\n+                            \"storage-account-name\": {\n+                                \"description\": \"The storage account name. There are certain risks in allowing the account name to be stored as a flowfile attribute. While it does provide for a more flexible flow by allowing the account name to be fetched dynamically from a flowfile attribute, care must be taken to restrict access to the event provenance data (e.g., by strictly controlling the policies governing provenance for this processor). In addition, the provenance repositories may be put on encrypted disk partitions. Instead of defining the Storage Account Name, Storage Account Key and SAS Token properties directly on the processor, the preferred way is to configure them through a controller service specified in the Storage Credentials property. The controller service can provide a common/shared configuration for multiple/all Azure processors. Furthermore, the credentials can also be looked up dynamically with the 'Lookup' version of the service.\",\n+                                \"displayName\": \"Storage Account Name\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Reply-To Queue\",\n+                                \"name\": \"storage-account-name\",\n                                 \"required\": false,\n-                                \"sensitive\": false\n+                                \"sensitive\": true\n                             },\n-                            \"SSL Context Service\": {\n-                                \"description\": \"The Controller Service to use in order to obtain an SSL Context.\",\n-                                \"displayName\": \"SSL Context Service\",\n+                            \"storage-credentials-service\": {\n+                                \"description\": \"The Controller Service used to obtain Azure Storage Credentials. Instead of the processor level properties, the credentials can be configured here through a common/shared controller service, which is the preferred way. The 'Lookup' version of the service can also be used to select the credentials dynamically at runtime based on a FlowFile attribute (if the processor has FlowFile input).\",\n+                                \"displayName\": \"Storage Credentials\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"SSL Context Service\",\n+                                \"name\": \"storage-credentials-service\",\n                                 \"required\": false,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"artifact\": \"nifi-azure-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n+                                    \"type\": \"org.apache.nifi.services.azure.storage.AzureStorageCredentialsService\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             },\n-                            \"URL\": {\n-                                \"description\": \"The URL of the JMS Server\",\n-                                \"displayName\": \"URL\",\n+                            \"storage-endpoint-suffix\": {\n+                                \"description\": \"Storage accounts in public Azure always use a common FQDN suffix. Override this endpoint suffix with a different suffix in certain circumstances (like Azure Stack or non-public Azure regions). The preferred way is to configure them through a controller service specified in the Storage Credentials property. The controller service can provide a common/shared configuration for multiple/all Azure processors. Furthermore, the credentials can also be looked up dynamically with the 'Lookup' version of the service.\",\n+                                \"displayName\": \"Common Storage Account Endpoint Suffix\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"storage-endpoint-suffix\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"storage-queue-name\": {\n+                                \"description\": \"Name of the Azure Storage Queue\",\n+                                \"displayName\": \"Queue Name\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"storage-queue-name\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"storage-sas-token\": {\n+                                \"description\": \"Shared Access Signature token, including the leading '?'. Specify either SAS token (recommended) or Account Key. There are certain risks in allowing the SAS token to be stored as a flowfile attribute. While it does provide for a more flexible flow by allowing the SAS token to be fetched dynamically from a flowfile attribute, care must be taken to restrict access to the event provenance data (e.g., by strictly controlling the policies governing provenance for this processor). In addition, the provenance repositories may be put on encrypted disk partitions.\",\n+                                \"displayName\": \"SAS Token\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"storage-sas-token\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n+                            },\n+                            \"time-to-live\": {\n+                                \"defaultValue\": \"7 days\",\n+                                \"description\": \"Maximum time to allow the message to be in the queue. If left empty, the default value of 7 days will be used.\",\n+                                \"displayName\": \"TTL\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"URL\",\n-                                \"required\": true,\n+                                \"name\": \"time-to-live\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Username\": {\n-                                \"description\": \"Username used for authentication and authorization\",\n-                                \"displayName\": \"Username\",\n+                            \"visibility-delay\": {\n+                                \"defaultValue\": \"0 secs\",\n+                                \"description\": \"The length of time during which the message will be invisible, starting when it is added to the queue. This value must be greater than or equal to 0 and less than the TTL value.\",\n+                                \"displayName\": \"Visibility Delay\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Username\",\n+                                \"name\": \"visibility-delay\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             }\n                         },\n                         \"seeAlso\": [\n-                            \"org.apache.nifi.processors.standard.GetJMSQueue\",\n-                            \"org.apache.nifi.processors.standard.GetJMSTopic\"\n+                            \"org.apache.nifi.processors.azure.storage.queue.GetAzureQueueStorage\"\n                         ],\n                         \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"All FlowFiles that are sent to the JMS destination are routed to this relationship\",\n+                                \"description\": \"All successfully processed FlowFiles are routed to this relationship\",\n                                 \"name\": \"success\"\n                             },\n                             {\n-                                \"description\": \"All FlowFiles that cannot be routed to the JMS destination are routed to this relationship\",\n+                                \"description\": \"Unsuccessful operations will be transferred to the failure relationship.\",\n                                 \"name\": \"failure\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n                         \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"jms\",\n-                            \"put\",\n-                            \"send\"\n+                            \"azure\",\n+                            \"cloud\",\n+                            \"enqueue\",\n+                            \"microsoft\",\n+                            \"queue\",\n+                            \"storage\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.standard.PutJMS\",\n-                        \"typeDescription\": \"Creates a JMS Message from the contents of a FlowFile and sends the message to a ActiveMQ JMS Server.\",\n+                        \"type\": \"org.apache.nifi.processors.azure.storage.queue.PutAzureQueueStorage\",\n+                        \"typeDescription\": \"Writes the content of the incoming FlowFiles to the configured Azure Queue Storage.\",\n                         \"version\": \"1.27.0\"\n                     },\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-standard-nar\",\n+                        \"artifact\": \"nifi-azure-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n-                            \"EVENT_DRIVEN\": 0,\n                             \"TIMER_DRIVEN\": 1\n                         },\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"put-record-include-zero-record-results\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"If no records are read from the incoming FlowFile, this property specifies whether or not an empty record set will be transmitted. The original FlowFile will still be routed to success, but if no transmission occurs, no provenance SEND event will be generated.\",\n-                                \"displayName\": \"Include Zero Record Results\",\n+                            \"Credentials Service\": {\n+                                \"description\": \"Controller Service used to obtain Azure Storage Credentials.\",\n+                                \"displayName\": \"Credentials Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"put-record-include-zero-record-results\",\n+                                \"name\": \"Credentials Service\",\n+                                \"required\": true,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-azure-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.services.azure.storage.AzureStorageCredentialsService_v12\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"Message Time To Live\": {\n+                                \"defaultValue\": \"7 days\",\n+                                \"description\": \"Maximum time to allow the message to be in the queue\",\n+                                \"displayName\": \"Message Time To Live\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Message Time To Live\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"put-record-reader\": {\n-                                \"description\": \"Specifies the Controller Service to use for reading incoming data\",\n-                                \"displayName\": \"Record Reader\",\n+                            \"Queue Name\": {\n+                                \"description\": \"Name of the Azure Storage Queue\",\n+                                \"displayName\": \"Queue Name\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Queue Name\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Request Timeout\": {\n+                                \"defaultValue\": \"10 secs\",\n+                                \"description\": \"The timeout for read or write requests to Azure Queue Storage. Defaults to 1 second.\",\n+                                \"displayName\": \"Request Timeout\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"put-record-reader\",\n+                                \"name\": \"Request Timeout\",\n                                 \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n+                                \"sensitive\": false\n                             },\n-                            \"put-record-sink\": {\n-                                \"description\": \"Specifies the Controller Service to use for writing out the query result records to some destination.\",\n-                                \"displayName\": \"Record Destination Service\",\n+                            \"Visibility Timeout\": {\n+                                \"defaultValue\": \"30 secs\",\n+                                \"description\": \"The length of time during which the message will be invisible after it is read. If the processing unit fails to delete the message after it is read, then the message will reappear in the queue.\",\n+                                \"displayName\": \"Visibility Timeout\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"put-record-sink\",\n+                                \"name\": \"Visibility Timeout\",\n                                 \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"proxy-configuration-service\": {\n+                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests. Supported proxies: SOCKS, HTTP In case of SOCKS, it is not guaranteed that the selected SOCKS Version will be used by the processor.\",\n+                                \"displayName\": \"Proxy Configuration Service\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"proxy-configuration-service\",\n+                                \"required\": false,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n                                     \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.record.sink.RecordSinkService\",\n+                                    \"type\": \"org.apache.nifi.proxy.ProxyConfigurationService\",\n                                     \"version\": \"1.27.0\"\n                                 }\n+                            },\n+                            \"storage-endpoint-suffix\": {\n+                                \"defaultValue\": \"queue.core.windows.net\",\n+                                \"description\": \"Storage accounts in public Azure always use a common FQDN suffix. Override this endpoint suffix with a different suffix in certain circumstances (like Azure Stack or non-public Azure regions).\",\n+                                \"displayName\": \"Endpoint Suffix\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"storage-endpoint-suffix\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n                             }\n                         },\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.processors.azure.storage.queue.GetAzureQueueStorage_v12\"\n+                        ],\n                         \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"The original FlowFile is routed to this relationship if the records could not be transmitted but attempting the operation again may succeed\",\n-                                \"name\": \"retry\"\n-                            },\n-                            {\n-                                \"description\": \"The original FlowFile will be routed to this relationship if the records were transmitted successfully\",\n+                                \"description\": \"All successfully processed FlowFiles are routed to this relationship\",\n                                 \"name\": \"success\"\n                             },\n                             {\n-                                \"description\": \"A FlowFile is routed to this relationship if the records could not be transmitted and retrying the operation will also fail\",\n+                                \"description\": \"Unsuccessful operations will be transferred to the failure relationship.\",\n                                 \"name\": \"failure\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\",\n-                            \"EVENT_DRIVEN\"\n+                            \"CRON_DRIVEN\"\n                         ],\n                         \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": true,\n+                        \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"put\",\n-                            \"record\",\n-                            \"sink\"\n+                            \"azure\",\n+                            \"cloud\",\n+                            \"enqueue\",\n+                            \"microsoft\",\n+                            \"queue\",\n+                            \"storage\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.standard.PutRecord\",\n-                        \"typeDescription\": \"The PutRecord processor uses a specified RecordReader to input (possibly multiple) records from an incoming flow file, and sends them to a destination specified by a Record Destination Service (i.e. record sink).\",\n+                        \"type\": \"org.apache.nifi.processors.azure.storage.queue.PutAzureQueueStorage_v12\",\n+                        \"typeDescription\": \"Writes the content of the incoming FlowFiles to the configured Azure Queue Storage.\",\n                         \"version\": \"1.27.0\"\n-                    },\n+                    }\n+                ],\n+                \"reportingTasks\": [\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-standard-nar\",\n+                        \"artifact\": \"nifi-azure-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n-                        \"defaultBulletinLevel\": \"WARN\",\n-                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": 1,\n-                            \"TIMER_DRIVEN\": 1\n-                        },\n-                        \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n-                        \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_REQUIRED\",\n-                        \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n+                            \"Application ID\": {\n+                                \"defaultValue\": \"nifi\",\n+                                \"description\": \"The Application ID to be included in the metrics sent to Azure Log Analytics WS\",\n+                                \"displayName\": \"Application ID\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Application ID\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n                             \"Batch Size\": {\n-                                \"defaultValue\": \"500\",\n-                                \"description\": \"The maximum number of FlowFiles to send in a single connection\",\n+                                \"defaultValue\": \"1000\",\n+                                \"description\": \"Specifies how many records to send in a single batch, at most.\",\n                                 \"displayName\": \"Batch Size\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n                                 \"name\": \"Batch Size\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Ciphers Allowed\": {\n-                                \"description\": \"A comma-separated list of Ciphers allowed for SFTP connections. Leave unset to allow all. Available options are: 3des-cbc, 3des-ctr, aes128-cbc, aes128-ctr, aes128-gcm@openssh.com, aes192-cbc, aes192-ctr, aes256-cbc, aes256-ctr, aes256-gcm@openssh.com, arcfour, arcfour128, arcfour256, blowfish-cbc, blowfish-ctr, cast128-cbc, cast128-ctr, chacha20-poly1305@openssh.com, idea-cbc, idea-ctr, serpent128-cbc, serpent128-ctr, serpent192-cbc, serpent192-ctr, serpent256-cbc, serpent256-ctr, twofish-cbc, twofish128-cbc, twofish128-ctr, twofish192-cbc, twofish192-ctr, twofish256-cbc, twofish256-ctr\",\n-                                \"displayName\": \"Ciphers Allowed\",\n+                            \"Instance ID\": {\n+                                \"defaultValue\": \"${hostname(true)}\",\n+                                \"description\": \"Id of this NiFi instance to be included in the metrics sent to Azure Log Analytics WS\",\n+                                \"displayName\": \"Instance ID\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Ciphers Allowed\",\n-                                \"required\": false,\n+                                \"name\": \"Instance ID\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Conflict Resolution\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"REPLACE\",\n-                                        \"value\": \"REPLACE\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"IGNORE\",\n-                                        \"value\": \"IGNORE\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"RENAME\",\n-                                        \"value\": \"RENAME\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"REJECT\",\n-                                        \"value\": \"REJECT\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"FAIL\",\n-                                        \"value\": \"FAIL\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"NONE\",\n-                                        \"value\": \"NONE\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"NONE\",\n-                                \"description\": \"Determines how to handle the problem of filename collisions\",\n-                                \"displayName\": \"Conflict Resolution\",\n+                            \"Instance URL\": {\n+                                \"defaultValue\": \"http://${hostname(true)}:8080/nifi\",\n+                                \"description\": \"The URL of this instance to use in the Content URI of each event.\",\n+                                \"displayName\": \"Instance URL\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Conflict Resolution\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Instance URL\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Connection Timeout\": {\n-                                \"defaultValue\": \"30 sec\",\n-                                \"description\": \"Amount of time to wait before timing out while creating a connection\",\n-                                \"displayName\": \"Connection Timeout\",\n+                            \"Job Name\": {\n+                                \"defaultValue\": \"nifi_reporting_job\",\n+                                \"description\": \"The name of the exporting job\",\n+                                \"displayName\": \"Job Name\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Connection Timeout\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Job Name\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Create Directory\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"Specifies whether or not the remote directory should be created if it does not exist.\",\n-                                \"displayName\": \"Create Directory\",\n+                            \"Log Analytics Custom Log Name\": {\n+                                \"defaultValue\": \"nifiprovenance\",\n+                                \"description\": \"Log Analytics Custom Log Name\",\n+                                \"displayName\": \"Log Analytics Custom Log Name\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Create Directory\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Log Analytics Custom Log Name\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Data Timeout\": {\n-                                \"defaultValue\": \"30 sec\",\n-                                \"description\": \"When transferring a file between the local and remote system, this value specifies how long is allowed to elapse without any data being transferred between systems\",\n-                                \"displayName\": \"Data Timeout\",\n+                            \"Log Analytics URL Endpoint Format\": {\n+                                \"defaultValue\": \"https://{0}.ods.opinsights.azure.com/api/logs?api-version=2016-04-01\",\n+                                \"description\": \"Log Analytics URL Endpoint Format\",\n+                                \"displayName\": \"Log Analytics URL Endpoint Format\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Data Timeout\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Log Analytics URL Endpoint Format\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Disable Directory Listing\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"If set to 'true', directory listing is not performed prior to create missing directories. By default, this processor executes a directory listing command to see target directory existence before creating missing directories. However, there are situations that you might need to disable the directory listing such as the following. Directory listing might fail with some permission setups (e.g. chmod 100) on a directory. Also, if any other SFTP client created the directory after this processor performed a listing and before a directory creation request by this processor is finished, then an error is returned because the directory already exists.\",\n-                                \"displayName\": \"Disable Directory Listing\",\n+                            \"Log Analytics Workspace Id\": {\n+                                \"description\": \"Log Analytics Workspace Id\",\n+                                \"displayName\": \"Log Analytics Workspace Id\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Disable Directory Listing\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Log Analytics Workspace Id\",\n+                                \"required\": true,\n+                                \"sensitive\": true\n+                            },\n+                            \"Log Analytics Workspace Key\": {\n+                                \"description\": \"Azure Log Analytic Worskspace Key\",\n+                                \"displayName\": \"Log Analytics Workspace Key\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Log Analytics Workspace Key\",\n+                                \"required\": true,\n+                                \"sensitive\": true\n+                            },\n+                            \"Platform\": {\n+                                \"defaultValue\": \"nifi\",\n+                                \"description\": \"The value to use for the platform field in each event.\",\n+                                \"displayName\": \"Platform\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Platform\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Dot Rename\": {\n+                            \"include-null-values\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"true\",\n                                         \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"false\",\n                                         \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"true\",\n-                                \"description\": \"If true, then the filename of the sent file is prepended with a \\\".\\\" and then renamed back to the original once the file is completely sent. Otherwise, there is no rename. This property is ignored if the Temporary Filename property is set.\",\n-                                \"displayName\": \"Dot Rename\",\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"Indicate if null values should be included in records. Default will be false\",\n+                                \"displayName\": \"Include Null Values\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Dot Rename\",\n-                                \"required\": false,\n+                                \"name\": \"include-null-values\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Host Key File\": {\n-                                \"description\": \"If supplied, the given file will be used as the Host Key; otherwise, if 'Strict Host Key Checking' property is applied (set to true) then uses the 'known_hosts' and 'known_hosts2' files from ~/.ssh directory else no host key file will be used\",\n-                                \"displayName\": \"Host Key File\",\n+                            \"s2s-prov-task-event-filter\": {\n+                                \"description\": \"Comma-separated list of event types that will be used to filter the provenance events sent by the reporting task. Available event types are [CREATE, RECEIVE, FETCH, SEND, REMOTE_INVOCATION, DOWNLOAD, DROP, EXPIRE, FORK, JOIN, CLONE, CONTENT_MODIFIED, ATTRIBUTES_MODIFIED, ROUTE, ADDINFO, REPLAY, UNKNOWN]. If no filter is set, all the events are sent. If multiple filters are set, the filters are cumulative.\",\n+                                \"displayName\": \"Event Type to Include\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Host Key File\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"s2s-prov-task-event-filter\",\n                                 \"required\": false,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"SINGLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\"\n-                                    ]\n-                                },\n                                 \"sensitive\": false\n                             },\n-                            \"Hostname\": {\n-                                \"description\": \"The fully qualified hostname or IP address of the remote system\",\n-                                \"displayName\": \"Hostname\",\n+                            \"s2s-prov-task-event-filter-exclude\": {\n+                                \"description\": \"Comma-separated list of event types that will be used to exclude the provenance events sent by the reporting task. Available event types are [CREATE, RECEIVE, FETCH, SEND, REMOTE_INVOCATION, DOWNLOAD, DROP, EXPIRE, FORK, JOIN, CLONE, CONTENT_MODIFIED, ATTRIBUTES_MODIFIED, ROUTE, ADDINFO, REPLAY, UNKNOWN]. If no filter is set, all the events are sent. If multiple filters are set, the filters are cumulative. If an event type is included in Event Type to Include and excluded here, then the exclusion takes precedence and the event will not be sent.\",\n+                                \"displayName\": \"Event Type to Exclude\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Hostname\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"s2s-prov-task-event-filter-exclude\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Http Proxy Password\": {\n-                                \"description\": \"Http Proxy Password\",\n-                                \"displayName\": \"Http Proxy Password\",\n+                            \"s2s-prov-task-id-filter\": {\n+                                \"description\": \"Comma-separated list of component UUID that will be used to filter the provenance events sent by the reporting task. If no filter is set, all the events are sent. If multiple filters are set, the filters are cumulative.\",\n+                                \"displayName\": \"Component ID to Include\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Http Proxy Password\",\n+                                \"name\": \"s2s-prov-task-id-filter\",\n                                 \"required\": false,\n-                                \"sensitive\": true\n+                                \"sensitive\": false\n                             },\n-                            \"Http Proxy Username\": {\n-                                \"description\": \"Http Proxy Username\",\n-                                \"displayName\": \"Http Proxy Username\",\n+                            \"s2s-prov-task-id-filter-exclude\": {\n+                                \"description\": \"Comma-separated list of component UUID that will be used to exclude the provenance events sent by the reporting task. If no filter is set, all the events are sent. If multiple filters are set, the filters are cumulative. If a component UUID is included in Component ID to Include and excluded here, then the exclusion takes precedence and the event will not be sent.\",\n+                                \"displayName\": \"Component ID to Exclude\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Http Proxy Username\",\n+                                \"name\": \"s2s-prov-task-id-filter-exclude\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Key Algorithms Allowed\": {\n-                                \"description\": \"A comma-separated list of Key Algorithms allowed for SFTP connections. Leave unset to allow all. Available options are: ecdsa-sha2-nistp256, ecdsa-sha2-nistp256-cert-v01@openssh.com, ecdsa-sha2-nistp384, ecdsa-sha2-nistp384-cert-v01@openssh.com, ecdsa-sha2-nistp521, ecdsa-sha2-nistp521-cert-v01@openssh.com, rsa-sha2-256, rsa-sha2-512, ssh-dss, ssh-dss-cert-v01@openssh.com, ssh-ed25519, ssh-ed25519-cert-v01@openssh.com, ssh-rsa, ssh-rsa-cert-v01@openssh.com\",\n-                                \"displayName\": \"Key Algorithms Allowed\",\n+                            \"s2s-prov-task-name-filter\": {\n+                                \"description\": \"Regular expression to filter the provenance events based on the component name. Only the events matching the regular expression will be sent. If no filter is set, all the events are sent. If multiple filters are set, the filters are cumulative.\",\n+                                \"displayName\": \"Component Name to Include\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Key Algorithms Allowed\",\n+                                \"name\": \"s2s-prov-task-name-filter\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Key Exchange Algorithms Allowed\": {\n-                                \"description\": \"A comma-separated list of Key Exchange Algorithms allowed for SFTP connections. Leave unset to allow all. Available options are: curve25519-sha256, curve25519-sha256@libssh.org, diffie-hellman-group-exchange-sha1, diffie-hellman-group-exchange-sha256, diffie-hellman-group1-sha1, diffie-hellman-group14-sha1, diffie-hellman-group14-sha256, diffie-hellman-group14-sha256@ssh.com, diffie-hellman-group15-sha256, diffie-hellman-group15-sha256@ssh.com, diffie-hellman-group15-sha384@ssh.com, diffie-hellman-group15-sha512, diffie-hellman-group16-sha256, diffie-hellman-group16-sha384@ssh.com, diffie-hellman-group16-sha512, diffie-hellman-group16-sha512@ssh.com, diffie-hellman-group17-sha512, diffie-hellman-group18-sha512, diffie-hellman-group18-sha512@ssh.com, ecdh-sha2-nistp256, ecdh-sha2-nistp384, ecdh-sha2-nistp521, ext-info-c\",\n-                                \"displayName\": \"Key Exchange Algorithms Allowed\",\n+                            \"s2s-prov-task-name-filter-exclude\": {\n+                                \"description\": \"Regular expression to exclude the provenance events based on the component name. The events matching the regular expression will not be sent. If no filter is set, all the events are sent. If multiple filters are set, the filters are cumulative. If a component name is included in Component Name to Include and excluded here, then the exclusion takes precedence and the event will not be sent.\",\n+                                \"displayName\": \"Component Name to Exclude\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Key Exchange Algorithms Allowed\",\n+                                \"name\": \"s2s-prov-task-name-filter-exclude\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Last Modified Time\": {\n-                                \"description\": \"The lastModifiedTime to assign to the file after transferring it. If not set, the lastModifiedTime will not be changed. Format must be yyyy-MM-dd'T'HH:mm:ssZ. You may also use expression language such as ${file.lastModifiedTime}. If the value is invalid, the processor will not be invalid but will fail to change lastModifiedTime of the file.\",\n-                                \"displayName\": \"Last Modified Time\",\n+                            \"s2s-prov-task-type-filter\": {\n+                                \"description\": \"Regular expression to filter the provenance events based on the component type. Only the events matching the regular expression will be sent. If no filter is set, all the events are sent. If multiple filters are set, the filters are cumulative.\",\n+                                \"displayName\": \"Component Type to Include\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Last Modified Time\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"s2s-prov-task-type-filter\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Message Authentication Codes Allowed\": {\n-                                \"description\": \"A comma-separated list of Message Authentication Codes allowed for SFTP connections. Leave unset to allow all. Available options are: hmac-md5, hmac-md5-96, hmac-md5-96-etm@openssh.com, hmac-md5-etm@openssh.com, hmac-ripemd160, hmac-ripemd160-96, hmac-ripemd160-etm@openssh.com, hmac-ripemd160@openssh.com, hmac-sha1, hmac-sha1-96, hmac-sha1-96@openssh.com, hmac-sha1-etm@openssh.com, hmac-sha2-256, hmac-sha2-256-etm@openssh.com, hmac-sha2-512, hmac-sha2-512-etm@openssh.com\",\n-                                \"displayName\": \"Message Authentication Codes Allowed\",\n+                            \"s2s-prov-task-type-filter-exclude\": {\n+                                \"description\": \"Regular expression to exclude the provenance events based on the component type. The events matching the regular expression will not be sent. If no filter is set, all the events are sent. If multiple filters are set, the filters are cumulative. If a component type is included in Component Type to Include and excluded here, then the exclusion takes precedence and the event will not be sent.\",\n+                                \"displayName\": \"Component Type to Exclude\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Message Authentication Codes Allowed\",\n+                                \"name\": \"s2s-prov-task-type-filter-exclude\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Password\": {\n-                                \"description\": \"Password for the user account\",\n-                                \"displayName\": \"Password\",\n+                            \"start-position\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"Start reading provenance Events from the beginning of the stream (the oldest event first)\",\n+                                        \"displayName\": \"Beginning of Stream\",\n+                                        \"value\": \"beginning-of-stream\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Start reading provenance Events from the end of the stream, ignoring old events\",\n+                                        \"displayName\": \"End of Stream\",\n+                                        \"value\": \"end-of-stream\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"beginning-of-stream\",\n+                                \"description\": \"If the Reporting Task has never been run, or if its state has been reset by a user, specifies where in the stream of Provenance Events the Reporting Task should start\",\n+                                \"displayName\": \"Start Position\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Password\",\n-                                \"required\": false,\n-                                \"sensitive\": true\n-                            },\n-                            \"Permissions\": {\n-                                \"description\": \"The permissions to assign to the file after transferring it. Format must be either UNIX rwxrwxrwx with a - in place of denied permissions (e.g. rw-r--r--) or an octal number (e.g. 644). If not set, the permissions will not be changed. You may also use expression language such as ${file.permissions}. If the value is invalid, the processor will not be invalid but will fail to change permissions of the file.\",\n-                                \"displayName\": \"Permissions\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"start-position\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            }\n+                        },\n+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\"\n+                        ],\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"azure\",\n+                            \"log analytics\",\n+                            \"provenace\",\n+                            \"reporting\"\n+                        ],\n+                        \"type\": \"org.apache.nifi.reporting.azure.loganalytics.AzureLogAnalyticsProvenanceReportingTask\",\n+                        \"typeDescription\": \"Publishes Provenance events to to a Azure Log Analytics workspace.\",\n+                        \"version\": \"1.27.0\"\n+                    },\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-azure-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"e0c4461\"\n+                        },\n+                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": \"* * * * * ?\",\n+                            \"TIMER_DRIVEN\": \"1 min\"\n+                        },\n+                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n+                        \"group\": \"org.apache.nifi\",\n+                        \"propertyDescriptors\": {\n+                            \"Application ID\": {\n+                                \"defaultValue\": \"nifi\",\n+                                \"description\": \"The Application ID to be included in the metrics sent to Azure Log Analytics WS\",\n+                                \"displayName\": \"Application ID\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Permissions\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Application ID\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Port\": {\n-                                \"defaultValue\": \"22\",\n-                                \"description\": \"The port that the remote system is listening on for file transfers\",\n-                                \"displayName\": \"Port\",\n+                            \"Instance ID\": {\n+                                \"defaultValue\": \"${hostname(true)}\",\n+                                \"description\": \"Id of this NiFi instance to be included in the metrics sent to Azure Log Analytics WS\",\n+                                \"displayName\": \"Instance ID\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Port\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Instance ID\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Private Key Passphrase\": {\n-                                \"description\": \"Password for the private key\",\n-                                \"displayName\": \"Private Key Passphrase\",\n+                            \"Job Name\": {\n+                                \"defaultValue\": \"nifi_reporting_job\",\n+                                \"description\": \"The name of the exporting job\",\n+                                \"displayName\": \"Job Name\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Private Key Passphrase\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Job Name\",\n                                 \"required\": false,\n-                                \"sensitive\": true\n+                                \"sensitive\": false\n                             },\n-                            \"Private Key Path\": {\n-                                \"description\": \"The fully qualified path to the Private Key file\",\n-                                \"displayName\": \"Private Key Path\",\n+                            \"Log Analytics Custom Log Name\": {\n+                                \"defaultValue\": \"nifimetrics\",\n+                                \"description\": \"Log Analytics Custom Log Name\",\n+                                \"displayName\": \"Log Analytics Custom Log Name\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Private Key Path\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Log Analytics Custom Log Name\",\n                                 \"required\": false,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"SINGLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\"\n-                                    ]\n-                                },\n                                 \"sensitive\": false\n                             },\n-                            \"Proxy Host\": {\n-                                \"description\": \"The fully qualified hostname or IP address of the proxy server\",\n-                                \"displayName\": \"Proxy Host\",\n+                            \"Log Analytics URL Endpoint Format\": {\n+                                \"defaultValue\": \"https://{0}.ods.opinsights.azure.com/api/logs?api-version=2016-04-01\",\n+                                \"description\": \"Log Analytics URL Endpoint Format\",\n+                                \"displayName\": \"Log Analytics URL Endpoint Format\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Proxy Host\",\n+                                \"name\": \"Log Analytics URL Endpoint Format\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Proxy Port\": {\n-                                \"description\": \"The port of the proxy server\",\n-                                \"displayName\": \"Proxy Port\",\n+                            \"Log Analytics Workspace Id\": {\n+                                \"description\": \"Log Analytics Workspace Id\",\n+                                \"displayName\": \"Log Analytics Workspace Id\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Proxy Port\",\n+                                \"name\": \"Log Analytics Workspace Id\",\n+                                \"required\": true,\n+                                \"sensitive\": true\n+                            },\n+                            \"Log Analytics Workspace Key\": {\n+                                \"description\": \"Azure Log Analytic Worskspace Key\",\n+                                \"displayName\": \"Log Analytics Workspace Key\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Log Analytics Workspace Key\",\n+                                \"required\": true,\n+                                \"sensitive\": true\n+                            },\n+                            \"Process group ID(s)\": {\n+                                \"description\": \"If specified, the reporting task will send metrics the configured ProcessGroup(s) only. Multiple IDs should be separated by a comma. If none of the group-IDs could be found or no IDs are defined, the Root Process Group is used and global metrics are sent.\",\n+                                \"displayName\": \"Process group ID(s)\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Process group ID(s)\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Proxy Type\": {\n+                            \"Send JVM Metrics\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"DIRECT\",\n-                                        \"value\": \"DIRECT\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"HTTP\",\n-                                        \"value\": \"HTTP\"\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"SOCKS\",\n-                                        \"value\": \"SOCKS\"\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"DIRECT\",\n-                                \"description\": \"Proxy type used for file transfers\",\n-                                \"displayName\": \"Proxy Type\",\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"Send JVM Metrics in addition to the NiFi-metrics\",\n+                                \"displayName\": \"Send JVM Metrics\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Proxy Type\",\n+                                \"name\": \"Send JVM Metrics\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            }\n+                        },\n+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\"\n+                        ],\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"azure\",\n+                            \"log analytics\",\n+                            \"metrics\",\n+                            \"reporting\"\n+                        ],\n+                        \"type\": \"org.apache.nifi.reporting.azure.loganalytics.AzureLogAnalyticsReportingTask\",\n+                        \"typeDescription\": \"Sends JVM-metrics as well as Apache NiFi-metrics to a Azure Log Analytics workspace.Apache NiFi-metrics can be either configured global or on process-group level.\",\n+                        \"version\": \"1.27.0\"\n+                    }\n+                ]\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"1.27.0\"\n+        },\n+        {\n+            \"artifact\": \"nifi-hadoop-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [],\n+                \"processors\": [\n+                    {\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-hadoop-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"e0c4461\"\n+                        },\n+                        \"defaultBulletinLevel\": \"WARN\",\n+                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": 1,\n+                            \"TIMER_DRIVEN\": 1\n+                        },\n+                        \"defaultPenaltyDuration\": \"30 sec\",\n+                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": \"* * * * * ?\",\n+                            \"TIMER_DRIVEN\": \"0 sec\"\n+                        },\n+                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n+                        \"defaultYieldDuration\": \"1 sec\",\n+                        \"group\": \"org.apache.nifi\",\n+                        \"inputRequirement\": \"INPUT_REQUIRED\",\n+                        \"primaryNodeOnly\": false,\n+                        \"propertyDescriptors\": {\n+                            \"Additional Classpath Resources\": {\n+                                \"description\": \"A comma-separated list of paths to files and/or directories that will be added to the classpath and used for loading native libraries. When specifying a directory, all files with in the directory will be added to the classpath, but further sub-directories will not be included.\",\n+                                \"displayName\": \"Additional Classpath Resources\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Additional Classpath Resources\",\n                                 \"required\": false,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"MULTIPLE\",\n+                                    \"resourceTypes\": [\n+                                        \"DIRECTORY\",\n+                                        \"FILE\"\n+                                    ]\n+                                },\n                                 \"sensitive\": false\n                             },\n-                            \"Reject Zero-Byte Files\": {\n+                            \"Compression codec\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"description\": \"No compression\",\n+                                        \"displayName\": \"NONE\",\n+                                        \"value\": \"NONE\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"description\": \"Default ZLIB compression\",\n+                                        \"displayName\": \"DEFAULT\",\n+                                        \"value\": \"DEFAULT\"\n+                                    },\n+                                    {\n+                                        \"description\": \"BZIP compression\",\n+                                        \"displayName\": \"BZIP\",\n+                                        \"value\": \"BZIP\"\n+                                    },\n+                                    {\n+                                        \"description\": \"GZIP compression\",\n+                                        \"displayName\": \"GZIP\",\n+                                        \"value\": \"GZIP\"\n+                                    },\n+                                    {\n+                                        \"description\": \"LZ4 compression\",\n+                                        \"displayName\": \"LZ4\",\n+                                        \"value\": \"LZ4\"\n+                                    },\n+                                    {\n+                                        \"description\": \"LZO compression - it assumes LD_LIBRARY_PATH has been set and jar is available\",\n+                                        \"displayName\": \"LZO\",\n+                                        \"value\": \"LZO\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Snappy compression\",\n+                                        \"displayName\": \"SNAPPY\",\n+                                        \"value\": \"SNAPPY\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Will attempt to automatically detect the compression codec.\",\n+                                        \"displayName\": \"AUTOMATIC\",\n+                                        \"value\": \"AUTOMATIC\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"true\",\n-                                \"description\": \"Determines whether or not Zero-byte files should be rejected without attempting to transfer\",\n-                                \"displayName\": \"Reject Zero-Byte Files\",\n+                                \"defaultValue\": \"NONE\",\n+                                \"description\": \"\",\n+                                \"displayName\": \"Compression codec\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Reject Zero-Byte Files\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Remote Group\": {\n-                                \"description\": \"Integer value representing the Group ID to set on the file after transferring it. If not set, the group will not be set. You may also use expression language such as ${file.group}. If the value is invalid, the processor will not be invalid but will fail to change the group of the file.\",\n-                                \"displayName\": \"Remote Group\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Remote Group\",\n-                                \"required\": false,\n+                                \"name\": \"Compression codec\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Remote Owner\": {\n-                                \"description\": \"Integer value representing the User ID to set on the file after transferring it. If not set, the owner will not be set. You may also use expression language such as ${file.owner}. If the value is invalid, the processor will not be invalid but will fail to change the owner of the file.\",\n-                                \"displayName\": \"Remote Owner\",\n+                            \"Hadoop Configuration Resources\": {\n+                                \"description\": \"A file or comma separated list of files which contains the Hadoop file system configuration. Without this, Hadoop will search the classpath for a 'core-site.xml' and 'hdfs-site.xml' file or will revert to a default configuration. To use swebhdfs, see 'Additional Details' section of PutHDFS's documentation.\",\n+                                \"displayName\": \"Hadoop Configuration Resources\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Remote Owner\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Hadoop Configuration Resources\",\n                                 \"required\": false,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"MULTIPLE\",\n+                                    \"resourceTypes\": [\n+                                        \"FILE\"\n+                                    ]\n+                                },\n                                 \"sensitive\": false\n                             },\n-                            \"Remote Path\": {\n-                                \"description\": \"The path on the remote system from which to pull or push files\",\n-                                \"displayName\": \"Remote Path\",\n+                            \"Kerberos Keytab\": {\n+                                \"description\": \"Kerberos keytab associated with the principal. Requires nifi.kerberos.krb5.file to be set in your nifi.properties\",\n+                                \"displayName\": \"Kerberos Keytab\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Remote Path\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Kerberos Keytab\",\n                                 \"required\": false,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"SINGLE\",\n+                                    \"resourceTypes\": [\n+                                        \"FILE\"\n+                                    ]\n+                                },\n                                 \"sensitive\": false\n                             },\n-                            \"Send Keep Alive On Timeout\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"true\",\n-                                \"description\": \"Send a Keep Alive message every 5 seconds up to 5 times for an overall timeout of 25 seconds.\",\n-                                \"displayName\": \"Send Keep Alive On Timeout\",\n+                            \"Kerberos Password\": {\n+                                \"description\": \"Kerberos password associated with the principal.\",\n+                                \"displayName\": \"Kerberos Password\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Send Keep Alive On Timeout\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n+                                \"name\": \"Kerberos Password\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n                             },\n-                            \"Strict Host Key Checking\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"Indicates whether or not strict enforcement of hosts keys should be applied\",\n-                                \"displayName\": \"Strict Host Key Checking\",\n+                            \"Kerberos Principal\": {\n+                                \"description\": \"Kerberos principal to authenticate as. Requires nifi.kerberos.krb5.file to be set in your nifi.properties\",\n+                                \"displayName\": \"Kerberos Principal\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Strict Host Key Checking\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Kerberos Principal\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Temporary Filename\": {\n-                                \"description\": \"If set, the filename of the sent file will be equal to the value specified during the transfer and after successful completion will be renamed to the original filename. If this value is set, the Dot Rename property is ignored.\",\n-                                \"displayName\": \"Temporary Filename\",\n+                            \"Kerberos Relogin Period\": {\n+                                \"defaultValue\": \"4 hours\",\n+                                \"description\": \"Period of time which should pass before attempting a kerberos relogin.\\n\\nThis property has been deprecated, and has no effect on processing. Relogins now occur automatically.\",\n+                                \"displayName\": \"Kerberos Relogin Period\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Temporary Filename\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Kerberos Relogin Period\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Use Compression\": {\n+                            \"compression type\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"displayName\": \"NONE\",\n+                                        \"value\": \"NONE\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"displayName\": \"RECORD\",\n+                                        \"value\": \"RECORD\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"BLOCK\",\n+                                        \"value\": \"BLOCK\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"Indicates whether or not ZLIB compression should be used when transferring files\",\n-                                \"displayName\": \"Use Compression\",\n+                                \"description\": \"Type of compression to use when creating Sequence File\",\n+                                \"displayName\": \"Compression type\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Use Compression\",\n-                                \"required\": true,\n+                                \"name\": \"compression type\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Username\": {\n-                                \"description\": \"Username\",\n-                                \"displayName\": \"Username\",\n+                            \"kerberos-credentials-service\": {\n+                                \"description\": \"Specifies the Kerberos Credentials Controller Service that should be used for authenticating with Kerberos\",\n+                                \"displayName\": \"Kerberos Credentials Service\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Username\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"kerberos-credentials-service\",\n+                                \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.kerberos.KerberosCredentialsService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n                             },\n-                            \"proxy-configuration-service\": {\n-                                \"description\": \"Specifies the Proxy Configuration Controller Service to proxy network requests. If set, it supersedes proxy settings configured per component. Supported proxies: SOCKS + AuthN, HTTP + AuthN\",\n-                                \"displayName\": \"Proxy Configuration Service\",\n+                            \"kerberos-user-service\": {\n+                                \"description\": \"Specifies the Kerberos User Controller Service that should be used for authenticating with Kerberos\",\n+                                \"displayName\": \"Kerberos User Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"proxy-configuration-service\",\n+                                \"name\": \"kerberos-user-service\",\n                                 \"required\": false,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n                                     \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.proxy.ProxyConfigurationService\",\n+                                    \"type\": \"org.apache.nifi.kerberos.KerberosUserService\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             }\n                         },\n                         \"seeAlso\": [\n-                            \"org.apache.nifi.processors.standard.GetSFTP\"\n+                            \"org.apache.nifi.processors.hadoop.PutHDFS\"\n                         ],\n-                        \"sideEffectFree\": false,\n+                        \"sideEffectFree\": true,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"FlowFiles that are successfully sent will be routed to success\",\n+                                \"description\": \"Generated Sequence Files are sent to this relationship\",\n                                 \"name\": \"success\"\n                             },\n                             {\n-                                \"description\": \"FlowFiles that were rejected by the destination system\",\n-                                \"name\": \"reject\"\n-                            },\n-                            {\n-                                \"description\": \"FlowFiles that failed to send to the remote system; failure is usually looped back to this processor\",\n+                                \"description\": \"Incoming files that failed to generate a Sequence File are sent to this relationship\",\n                                 \"name\": \"failure\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n-                        \"supportsBatching\": true,\n+                        \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"archive\",\n-                            \"copy\",\n-                            \"egress\",\n-                            \"files\",\n-                            \"put\",\n-                            \"remote\",\n-                            \"sftp\"\n+                            \"create\",\n+                            \"hadoop\",\n+                            \"sequence file\",\n+                            \"sequencefile\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.standard.PutSFTP\",\n-                        \"typeDescription\": \"Sends FlowFiles to an SFTP Server\",\n+                        \"type\": \"org.apache.nifi.processors.hadoop.CreateHadoopSequenceFile\",\n+                        \"typeDescription\": \"Creates Hadoop Sequence Files from incoming flow files\",\n                         \"version\": \"1.27.0\"\n                     },\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-standard-nar\",\n+                        \"artifact\": \"nifi-hadoop-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -118488,236 +118910,231 @@\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n+                        \"explicitRestrictions\": [\n+                            {\n+                                \"explanation\": \"Provides operator the ability to delete any file that NiFi has access to in HDFS or the local filesystem.\",\n+                                \"requiredPermission\": \"write distributed filesystem\"\n+                            }\n+                        ],\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_REQUIRED\",\n+                        \"inputRequirement\": \"INPUT_ALLOWED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Batch Size\": {\n-                                \"defaultValue\": \"100\",\n-                                \"description\": \"The preferred number of FlowFiles to put to the database in a single transaction\",\n-                                \"displayName\": \"Batch Size\",\n+                            \"Additional Classpath Resources\": {\n+                                \"description\": \"A comma-separated list of paths to files and/or directories that will be added to the classpath and used for loading native libraries. When specifying a directory, all files with in the directory will be added to the classpath, but further sub-directories will not be included.\",\n+                                \"displayName\": \"Additional Classpath Resources\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Batch Size\",\n-                                \"required\": true,\n+                                \"name\": \"Additional Classpath Resources\",\n+                                \"required\": false,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"MULTIPLE\",\n+                                    \"resourceTypes\": [\n+                                        \"DIRECTORY\",\n+                                        \"FILE\"\n+                                    ]\n+                                },\n                                 \"sensitive\": false\n                             },\n-                            \"JDBC Connection Pool\": {\n-                                \"description\": \"Specifies the JDBC Connection Pool to use in order to convert the JSON message to a SQL statement. The Connection Pool is necessary in order to determine the appropriate database column types.\",\n-                                \"displayName\": \"JDBC Connection Pool\",\n+                            \"Hadoop Configuration Resources\": {\n+                                \"description\": \"A file or comma separated list of files which contains the Hadoop file system configuration. Without this, Hadoop will search the classpath for a 'core-site.xml' and 'hdfs-site.xml' file or will revert to a default configuration. To use swebhdfs, see 'Additional Details' section of PutHDFS's documentation.\",\n+                                \"displayName\": \"Hadoop Configuration Resources\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"JDBC Connection Pool\",\n-                                \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.dbcp.DBCPService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Hadoop Configuration Resources\",\n+                                \"required\": false,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"MULTIPLE\",\n+                                    \"resourceTypes\": [\n+                                        \"FILE\"\n+                                    ]\n+                                },\n+                                \"sensitive\": false\n                             },\n-                            \"Obtain Generated Keys\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"If true, any key that is automatically generated by the database will be added to the FlowFile that generated it using the sql.generate.key attribute. This may result in slightly slower performance and is not supported by all databases.\",\n-                                \"displayName\": \"Obtain Generated Keys\",\n+                            \"Kerberos Keytab\": {\n+                                \"description\": \"Kerberos keytab associated with the principal. Requires nifi.kerberos.krb5.file to be set in your nifi.properties\",\n+                                \"displayName\": \"Kerberos Keytab\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Obtain Generated Keys\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Kerberos Keytab\",\n                                 \"required\": false,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"SINGLE\",\n+                                    \"resourceTypes\": [\n+                                        \"FILE\"\n+                                    ]\n+                                },\n                                 \"sensitive\": false\n                             },\n-                            \"Support Fragmented Transactions\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"true\",\n-                                \"description\": \"If true, when a FlowFile is consumed by this Processor, the Processor will first check the fragment.identifier and fragment.count attributes of that FlowFile. If the fragment.count value is greater than 1, the Processor will not process any FlowFile with that fragment.identifier until all are available; at that point, it will process all FlowFiles with that fragment.identifier as a single transaction, in the order specified by the FlowFiles' fragment.index attributes. This Provides atomicity of those SQL statements. Once any statement of this transaction throws exception when executing, this transaction will be rolled back. When transaction rollback happened, none of these FlowFiles would be routed to 'success'. If the <Rollback On Failure> is set true, these FlowFiles will stay in the input relationship. When the <Rollback On Failure> is set false,, if any of these FlowFiles will be routed to 'retry', all of these FlowFiles will be routed to 'retry'.Otherwise, they will be routed to 'failure'. If this value is false, these attributes will be ignored and the updates will occur independent of one another.\",\n-                                \"displayName\": \"Support Fragmented Transactions\",\n+                            \"Kerberos Password\": {\n+                                \"description\": \"Kerberos password associated with the principal.\",\n+                                \"displayName\": \"Kerberos Password\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Support Fragmented Transactions\",\n+                                \"name\": \"Kerberos Password\",\n                                 \"required\": false,\n-                                \"sensitive\": false\n+                                \"sensitive\": true\n                             },\n-                            \"Transaction Timeout\": {\n-                                \"description\": \"If the <Support Fragmented Transactions> property is set to true, specifies how long to wait for all FlowFiles for a particular fragment.identifier attribute to arrive before just transferring all of the FlowFiles with that identifier to the 'failure' relationship\",\n-                                \"displayName\": \"Transaction Timeout\",\n+                            \"Kerberos Principal\": {\n+                                \"description\": \"Kerberos principal to authenticate as. Requires nifi.kerberos.krb5.file to be set in your nifi.properties\",\n+                                \"displayName\": \"Kerberos Principal\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Transaction Timeout\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Kerberos Principal\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"database-session-autocommit\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"The autocommit mode to set on the database connection being used. If set to false, the operation(s) will be explicitly committed or rolled back (based on success or failure respectively), if set to true the driver/database handles the commit/rollback.\",\n-                                \"displayName\": \"Database Session AutoCommit\",\n+                            \"Kerberos Relogin Period\": {\n+                                \"defaultValue\": \"4 hours\",\n+                                \"description\": \"Period of time which should pass before attempting a kerberos relogin.\\n\\nThis property has been deprecated, and has no effect on processing. Relogins now occur automatically.\",\n+                                \"displayName\": \"Kerberos Relogin Period\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"database-session-autocommit\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Kerberos Relogin Period\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"putsql-sql-statement\": {\n-                                \"description\": \"The SQL statement to execute. The statement can be empty, a constant value, or built from attributes using Expression Language. If this property is specified, it will be used regardless of the content of incoming FlowFiles. If this property is empty, the content of the incoming FlowFile is expected to contain a valid SQL statement, to be issued by the processor to the database.\",\n-                                \"displayName\": \"SQL Statement\",\n+                            \"file_or_directory\": {\n+                                \"description\": \"The HDFS file or directory to delete. A wildcard expression may be used to only delete certain files\",\n+                                \"displayName\": \"Path\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"putsql-sql-statement\",\n-                                \"required\": false,\n+                                \"name\": \"file_or_directory\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"rollback-on-failure\": {\n+                            \"kerberos-credentials-service\": {\n+                                \"description\": \"Specifies the Kerberos Credentials Controller Service that should be used for authenticating with Kerberos\",\n+                                \"displayName\": \"Kerberos Credentials Service\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"kerberos-credentials-service\",\n+                                \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.kerberos.KerberosCredentialsService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"kerberos-user-service\": {\n+                                \"description\": \"Specifies the Kerberos User Controller Service that should be used for authenticating with Kerberos\",\n+                                \"displayName\": \"Kerberos User Service\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"kerberos-user-service\",\n+                                \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.kerberos.KerberosUserService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"recursive\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"true\",\n                                         \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"false\",\n                                         \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"Specify how to handle error. By default (false), if an error occurs while processing a FlowFile, the FlowFile will be routed to 'failure' or 'retry' relationship based on error type, and processor can continue with next FlowFile. Instead, you may want to rollback currently processed FlowFiles and stop further processing immediately. In that case, you can do so by enabling this 'Rollback On Failure' property.  If enabled, failed FlowFiles will stay in the input relationship without penalizing it and being processed repeatedly until it gets processed successfully or removed by other means. It is important to set adequate 'Yield Duration' to avoid retrying too frequently.\",\n-                                \"displayName\": \"Rollback On Failure\",\n+                                \"defaultValue\": \"true\",\n+                                \"description\": \"Remove contents of a non-empty directory recursively\",\n+                                \"displayName\": \"Recursive\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"rollback-on-failure\",\n+                                \"name\": \"recursive\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             }\n                         },\n-                        \"readsAttributes\": [\n-                            {\n-                                \"description\": \"If the <Support Fragment Transactions> property is true, this attribute is used to determine whether or not two FlowFiles belong to the same transaction.\",\n-                                \"name\": \"fragment.identifier\"\n-                            },\n-                            {\n-                                \"description\": \"If the <Support Fragment Transactions> property is true, this attribute is used to determine how many FlowFiles are needed to complete the transaction.\",\n-                                \"name\": \"fragment.count\"\n-                            },\n-                            {\n-                                \"description\": \"If the <Support Fragment Transactions> property is true, this attribute is used to determine the order that the FlowFiles in a transaction should be evaluated.\",\n-                                \"name\": \"fragment.index\"\n-                            },\n-                            {\n-                                \"description\": \"Incoming FlowFiles are expected to be parametrized SQL statements. The type of each Parameter is specified as an integer that represents the JDBC Type of the parameter.\",\n-                                \"name\": \"sql.args.N.type\"\n-                            },\n-                            {\n-                                \"description\": \"Incoming FlowFiles are expected to be parametrized SQL statements. The value of the Parameters are specified as sql.args.1.value, sql.args.2.value, sql.args.3.value, and so on. The type of the sql.args.1.value Parameter is specified by the sql.args.1.type attribute.\",\n-                                \"name\": \"sql.args.N.value\"\n-                            },\n-                            {\n-                                \"description\": \"This attribute is always optional, but default options may not always work for your data. Incoming FlowFiles are expected to be parametrized SQL statements. In some cases a format option needs to be specified, currently this is only applicable for binary data types, dates, times and timestamps. Binary Data Types (defaults to 'ascii') - ascii: each string character in your attribute value represents a single byte. This is the format provided by Avro Processors. base64: the string is a Base64 encoded string that can be decoded to bytes. hex: the string is hex encoded with all letters in upper case and no '0x' at the beginning. Dates/Times/Timestamps - Date, Time and Timestamp formats all support both custom formats or named format ('yyyy-MM-dd','ISO_OFFSET_DATE_TIME') as specified according to java.time.format.DateTimeFormatter. If not specified, a long value input is expected to be an unix epoch (milli seconds from 1970/1/1), or a string value in 'yyyy-MM-dd' format for Date, 'HH:mm:ss.SSS' for Time (some database engines e.g. Derby or MySQL do not support milliseconds and will truncate milliseconds), 'yyyy-MM-dd HH:mm:ss.SSS' for Timestamp is used.\",\n-                                \"name\": \"sql.args.N.format\"\n-                            }\n-                        ],\n+                        \"restricted\": true,\n                         \"seeAlso\": [\n-                            \"org.apache.nifi.processors.standard.ConvertJSONToSQL\"\n+                            \"org.apache.nifi.processors.hadoop.ListHDFS\",\n+                            \"org.apache.nifi.processors.hadoop.PutHDFS\"\n                         ],\n                         \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"A FlowFile is routed to this relationship if the database cannot be updated but attempting the operation again may succeed\",\n-                                \"name\": \"retry\"\n-                            },\n-                            {\n-                                \"description\": \"A FlowFile is routed to this relationship after the database is successfully updated\",\n+                                \"description\": \"When an incoming flowfile is used then if there are no errors invoking delete the flowfile will route here.\",\n                                 \"name\": \"success\"\n                             },\n                             {\n-                                \"description\": \"A FlowFile is routed to this relationship if the database cannot be updated and retrying the operation will also fail, such as an invalid query or an integrity constraint violation\",\n+                                \"description\": \"When an incoming flowfile is used and there is a failure while deleting then the flowfile will route here.\",\n                                 \"name\": \"failure\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n-                        \"supportsBatching\": true,\n+                        \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"database\",\n-                            \"insert\",\n-                            \"put\",\n-                            \"rdbms\",\n-                            \"relational\",\n-                            \"sql\",\n-                            \"update\"\n+                            \"HCFS\",\n+                            \"HDFS\",\n+                            \"delete\",\n+                            \"filesystem\",\n+                            \"hadoop\",\n+                            \"remove\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.standard.PutSQL\",\n-                        \"typeDescription\": \"Executes a SQL UPDATE or INSERT command. The content of an incoming FlowFile is expected to be the SQL command to execute. The SQL command may use the ? to escape parameters. In this case, the parameters to use must exist as FlowFile attributes with the naming convention sql.args.N.type and sql.args.N.value, where N is a positive integer. The sql.args.N.type is expected to be a number indicating the JDBC Type. The content of the FlowFile is expected to be in UTF-8 format.\",\n+                        \"type\": \"org.apache.nifi.processors.hadoop.DeleteHDFS\",\n+                        \"typeDescription\": \"Deletes one or more files or directories from HDFS. The path can be provided as an attribute from an incoming FlowFile, or a statically set path that is periodically removed. If this processor has an incoming connection, itwill ignore running on a periodic basis and instead rely on incoming FlowFiles to trigger a delete. Note that you may use a wildcard character to match multiple files or directories. If there are no incoming connections no flowfiles will be transfered to any output relationships.  If there is an incoming flowfile then provided there are no detected failures it will be transferred to success otherwise it will be sent to false. If knowledge of globbed files deleted is necessary use ListHDFS first to produce a specific list of files to delete. \",\n                         \"version\": \"1.27.0\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"If the database generated a key for an INSERT statement and the Obtain Generated Keys property is set to true, this attribute will be added to indicate the generated key, if possible. This feature is not supported by all database vendors.\",\n-                                \"name\": \"sql.generated.key\"\n+                                \"description\": \"HDFS file to be deleted. If multiple files are deleted, then only the last filename is set.\",\n+                                \"name\": \"hdfs.filename\"\n+                            },\n+                            {\n+                                \"description\": \"HDFS Path specified in the delete request. If multiple paths are deleted, then only the last path is set.\",\n+                                \"name\": \"hdfs.path\"\n+                            },\n+                            {\n+                                \"description\": \"The hadoop url for the file to be deleted.\",\n+                                \"name\": \"hadoop.file.url\"\n+                            },\n+                            {\n+                                \"description\": \"HDFS error message related to the hdfs.error.code\",\n+                                \"name\": \"hdfs.error.message\"\n                             }\n                         ]\n                     },\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-standard-nar\",\n+                        \"artifact\": \"nifi-hadoop-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -118725,511 +119142,671 @@\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n+                        \"explicitRestrictions\": [\n+                            {\n+                                \"explanation\": \"Provides operator the ability to retrieve any file that NiFi has access to in HDFS or the local filesystem.\",\n+                                \"requiredPermission\": \"read distributed filesystem\"\n+                            }\n+                        ],\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Batch Size\": {\n-                                \"defaultValue\": \"25\",\n-                                \"description\": \"The number of incoming FlowFiles to process in a single execution of this processor.\",\n-                                \"displayName\": \"Batch Size\",\n+                            \"Additional Classpath Resources\": {\n+                                \"description\": \"A comma-separated list of paths to files and/or directories that will be added to the classpath and used for loading native libraries. When specifying a directory, all files with in the directory will be added to the classpath, but further sub-directories will not be included.\",\n+                                \"displayName\": \"Additional Classpath Resources\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Batch Size\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Additional Classpath Resources\",\n+                                \"required\": false,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"MULTIPLE\",\n+                                    \"resourceTypes\": [\n+                                        \"DIRECTORY\",\n+                                        \"FILE\"\n+                                    ]\n+                                },\n+                                \"sensitive\": false\n+                            },\n+                            \"Compression codec\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"No compression\",\n+                                        \"displayName\": \"NONE\",\n+                                        \"value\": \"NONE\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Default ZLIB compression\",\n+                                        \"displayName\": \"DEFAULT\",\n+                                        \"value\": \"DEFAULT\"\n+                                    },\n+                                    {\n+                                        \"description\": \"BZIP compression\",\n+                                        \"displayName\": \"BZIP\",\n+                                        \"value\": \"BZIP\"\n+                                    },\n+                                    {\n+                                        \"description\": \"GZIP compression\",\n+                                        \"displayName\": \"GZIP\",\n+                                        \"value\": \"GZIP\"\n+                                    },\n+                                    {\n+                                        \"description\": \"LZ4 compression\",\n+                                        \"displayName\": \"LZ4\",\n+                                        \"value\": \"LZ4\"\n+                                    },\n+                                    {\n+                                        \"description\": \"LZO compression - it assumes LD_LIBRARY_PATH has been set and jar is available\",\n+                                        \"displayName\": \"LZO\",\n+                                        \"value\": \"LZO\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Snappy compression\",\n+                                        \"displayName\": \"SNAPPY\",\n+                                        \"value\": \"SNAPPY\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Will attempt to automatically detect the compression codec.\",\n+                                        \"displayName\": \"AUTOMATIC\",\n+                                        \"value\": \"AUTOMATIC\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"NONE\",\n+                                \"description\": \"\",\n+                                \"displayName\": \"Compression codec\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Compression codec\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Character Set\": {\n-                                \"defaultValue\": \"UTF-8\",\n-                                \"description\": \"Specifies the character set of the Syslog messages. Note that Expression language is not evaluated per FlowFile.\",\n-                                \"displayName\": \"Character Set\",\n+                            \"HDFS Filename\": {\n+                                \"defaultValue\": \"${path}/${filename}\",\n+                                \"description\": \"The name of the HDFS file to retrieve\",\n+                                \"displayName\": \"HDFS Filename\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Character Set\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"HDFS Filename\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Hostname\": {\n-                                \"defaultValue\": \"localhost\",\n-                                \"description\": \"The IP address or hostname of the Syslog server.\",\n-                                \"displayName\": \"Hostname\",\n+                            \"Hadoop Configuration Resources\": {\n+                                \"description\": \"A file or comma separated list of files which contains the Hadoop file system configuration. Without this, Hadoop will search the classpath for a 'core-site.xml' and 'hdfs-site.xml' file or will revert to a default configuration. To use swebhdfs, see 'Additional Details' section of PutHDFS's documentation.\",\n+                                \"displayName\": \"Hadoop Configuration Resources\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Hostname\",\n-                                \"required\": true,\n+                                \"name\": \"Hadoop Configuration Resources\",\n+                                \"required\": false,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"MULTIPLE\",\n+                                    \"resourceTypes\": [\n+                                        \"FILE\"\n+                                    ]\n+                                },\n                                 \"sensitive\": false\n                             },\n-                            \"Idle Connection Expiration\": {\n-                                \"defaultValue\": \"5 seconds\",\n-                                \"description\": \"The amount of time a connection should be held open without being used before closing the connection.\",\n-                                \"displayName\": \"Idle Connection Expiration\",\n+                            \"Kerberos Keytab\": {\n+                                \"description\": \"Kerberos keytab associated with the principal. Requires nifi.kerberos.krb5.file to be set in your nifi.properties\",\n+                                \"displayName\": \"Kerberos Keytab\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Idle Connection Expiration\",\n-                                \"required\": true,\n+                                \"name\": \"Kerberos Keytab\",\n+                                \"required\": false,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"SINGLE\",\n+                                    \"resourceTypes\": [\n+                                        \"FILE\"\n+                                    ]\n+                                },\n                                 \"sensitive\": false\n                             },\n-                            \"Max Size of Socket Send Buffer\": {\n-                                \"defaultValue\": \"1 MB\",\n-                                \"description\": \"The maximum size of the socket send buffer that should be used. This is a suggestion to the Operating System to indicate how big the socket buffer should be. If this value is set too low, the buffer may fill up before the data can be read, and incoming data will be dropped.\",\n-                                \"displayName\": \"Max Size of Socket Send Buffer\",\n+                            \"Kerberos Password\": {\n+                                \"description\": \"Kerberos password associated with the principal.\",\n+                                \"displayName\": \"Kerberos Password\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Kerberos Password\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n+                            },\n+                            \"Kerberos Principal\": {\n+                                \"description\": \"Kerberos principal to authenticate as. Requires nifi.kerberos.krb5.file to be set in your nifi.properties\",\n+                                \"displayName\": \"Kerberos Principal\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Max Size of Socket Send Buffer\",\n-                                \"required\": true,\n+                                \"name\": \"Kerberos Principal\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Message Body\": {\n-                                \"description\": \"The body for the Syslog messages.\",\n-                                \"displayName\": \"Message Body\",\n+                            \"Kerberos Relogin Period\": {\n+                                \"defaultValue\": \"4 hours\",\n+                                \"description\": \"Period of time which should pass before attempting a kerberos relogin.\\n\\nThis property has been deprecated, and has no effect on processing. Relogins now occur automatically.\",\n+                                \"displayName\": \"Kerberos Relogin Period\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Message Body\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Kerberos Relogin Period\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Message Hostname\": {\n-                                \"defaultValue\": \"${hostname(true)}\",\n-                                \"description\": \"The hostname for the Syslog messages.\",\n-                                \"displayName\": \"Message Hostname\",\n+                            \"kerberos-credentials-service\": {\n+                                \"description\": \"Specifies the Kerberos Credentials Controller Service that should be used for authenticating with Kerberos\",\n+                                \"displayName\": \"Kerberos Credentials Service\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Message Hostname\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"kerberos-credentials-service\",\n+                                \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.kerberos.KerberosCredentialsService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"kerberos-user-service\": {\n+                                \"description\": \"Specifies the Kerberos User Controller Service that should be used for authenticating with Kerberos\",\n+                                \"displayName\": \"Kerberos User Service\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"kerberos-user-service\",\n+                                \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.kerberos.KerberosUserService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            }\n+                        },\n+                        \"restricted\": true,\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.processors.hadoop.GetHDFS\",\n+                            \"org.apache.nifi.processors.hadoop.ListHDFS\",\n+                            \"org.apache.nifi.processors.hadoop.PutHDFS\"\n+                        ],\n+                        \"sideEffectFree\": false,\n+                        \"supportedRelationships\": [\n+                            {\n+                                \"description\": \"FlowFiles will be routed to this relationship once they have been updated with the content of the HDFS file\",\n+                                \"name\": \"success\"\n+                            },\n+                            {\n+                                \"description\": \"FlowFiles will be routed to this relationship if the content of the HDFS file cannot be retrieve due to a communications failure. This generally indicates that the Fetch should be tried again.\",\n+                                \"name\": \"comms.failure\"\n+                            },\n+                            {\n+                                \"description\": \"FlowFiles will be routed to this relationship if the content of the HDFS file cannot be retrieved and trying again will likely not be helpful. This would occur, for instance, if the file is not found or if there is a permissions issue\",\n+                                \"name\": \"failure\"\n+                            }\n+                        ],\n+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\"\n+                        ],\n+                        \"supportsBatching\": true,\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicRelationships\": false,\n+                        \"supportsEventDriven\": false,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"fetch\",\n+                            \"get\",\n+                            \"hadoop\",\n+                            \"hcfs\",\n+                            \"hdfs\",\n+                            \"ingest\",\n+                            \"source\"\n+                        ],\n+                        \"triggerSerially\": false,\n+                        \"triggerWhenAnyDestinationAvailable\": false,\n+                        \"triggerWhenEmpty\": false,\n+                        \"type\": \"org.apache.nifi.processors.hadoop.FetchHDFS\",\n+                        \"typeDescription\": \"Retrieves a file from HDFS. The content of the incoming FlowFile is replaced by the content of the file in HDFS. The file in HDFS is left intact without any changes being made to it.\",\n+                        \"version\": \"1.27.0\",\n+                        \"writesAttributes\": [\n+                            {\n+                                \"description\": \"When a FlowFile is routed to 'failure', this attribute is added indicating why the file could not be fetched from HDFS\",\n+                                \"name\": \"hdfs.failure.reason\"\n+                            },\n+                            {\n+                                \"description\": \"The hadoop url for the file is stored in this attribute.\",\n+                                \"name\": \"hadoop.file.url\"\n+                            }\n+                        ]\n+                    },\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-hadoop-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"e0c4461\"\n+                        },\n+                        \"defaultBulletinLevel\": \"WARN\",\n+                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": 1,\n+                            \"TIMER_DRIVEN\": 1\n+                        },\n+                        \"defaultPenaltyDuration\": \"30 sec\",\n+                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": \"* * * * * ?\",\n+                            \"TIMER_DRIVEN\": \"0 sec\"\n+                        },\n+                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n+                        \"defaultYieldDuration\": \"1 sec\",\n+                        \"explicitRestrictions\": [\n+                            {\n+                                \"explanation\": \"Provides operator the ability to retrieve any file that NiFi has access to in HDFS or the local filesystem.\",\n+                                \"requiredPermission\": \"read distributed filesystem\"\n+                            },\n+                            {\n+                                \"explanation\": \"Provides operator the ability to delete any file that NiFi has access to in HDFS or the local filesystem.\",\n+                                \"requiredPermission\": \"write distributed filesystem\"\n+                            }\n+                        ],\n+                        \"group\": \"org.apache.nifi\",\n+                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n+                        \"primaryNodeOnly\": false,\n+                        \"propertyDescriptors\": {\n+                            \"Additional Classpath Resources\": {\n+                                \"description\": \"A comma-separated list of paths to files and/or directories that will be added to the classpath and used for loading native libraries. When specifying a directory, all files with in the directory will be added to the classpath, but further sub-directories will not be included.\",\n+                                \"displayName\": \"Additional Classpath Resources\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Additional Classpath Resources\",\n+                                \"required\": false,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"MULTIPLE\",\n+                                    \"resourceTypes\": [\n+                                        \"DIRECTORY\",\n+                                        \"FILE\"\n+                                    ]\n+                                },\n                                 \"sensitive\": false\n                             },\n-                            \"Message Priority\": {\n-                                \"description\": \"The priority for the Syslog messages, excluding < >.\",\n-                                \"displayName\": \"Message Priority\",\n+                            \"Batch Size\": {\n+                                \"defaultValue\": \"100\",\n+                                \"description\": \"The maximum number of files to pull in each iteration, based on run schedule.\",\n+                                \"displayName\": \"Batch Size\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Message Priority\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Batch Size\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Message Timestamp\": {\n-                                \"defaultValue\": \"${now():format('MMM d HH:mm:ss')}\",\n-                                \"description\": \"The timestamp for the Syslog messages. The timestamp can be an RFC5424 timestamp with a format of \\\"yyyy-MM-dd'T'HH:mm:ss.SZ\\\" or \\\"yyyy-MM-dd'T'HH:mm:ss.S+hh:mm\\\", \\\" or it can be an RFC3164 timestamp with a format of \\\"MMM d HH:mm:ss\\\".\",\n-                                \"displayName\": \"Message Timestamp\",\n+                            \"Compression codec\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"No compression\",\n+                                        \"displayName\": \"NONE\",\n+                                        \"value\": \"NONE\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Default ZLIB compression\",\n+                                        \"displayName\": \"DEFAULT\",\n+                                        \"value\": \"DEFAULT\"\n+                                    },\n+                                    {\n+                                        \"description\": \"BZIP compression\",\n+                                        \"displayName\": \"BZIP\",\n+                                        \"value\": \"BZIP\"\n+                                    },\n+                                    {\n+                                        \"description\": \"GZIP compression\",\n+                                        \"displayName\": \"GZIP\",\n+                                        \"value\": \"GZIP\"\n+                                    },\n+                                    {\n+                                        \"description\": \"LZ4 compression\",\n+                                        \"displayName\": \"LZ4\",\n+                                        \"value\": \"LZ4\"\n+                                    },\n+                                    {\n+                                        \"description\": \"LZO compression - it assumes LD_LIBRARY_PATH has been set and jar is available\",\n+                                        \"displayName\": \"LZO\",\n+                                        \"value\": \"LZO\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Snappy compression\",\n+                                        \"displayName\": \"SNAPPY\",\n+                                        \"value\": \"SNAPPY\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Will attempt to automatically detect the compression codec.\",\n+                                        \"displayName\": \"AUTOMATIC\",\n+                                        \"value\": \"AUTOMATIC\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"NONE\",\n+                                \"description\": \"\",\n+                                \"displayName\": \"Compression codec\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Message Timestamp\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Compression codec\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Message Version\": {\n-                                \"description\": \"The version for the Syslog messages.\",\n-                                \"displayName\": \"Message Version\",\n+                            \"Directory\": {\n+                                \"description\": \"The HDFS directory from which files should be read\",\n+                                \"displayName\": \"Directory\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Message Version\",\n-                                \"required\": false,\n+                                \"name\": \"Directory\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Port\": {\n-                                \"description\": \"The port for Syslog communication. Note that Expression language is not evaluated per FlowFile.\",\n-                                \"displayName\": \"Port\",\n+                            \"File Filter Regex\": {\n+                                \"description\": \"A Java Regular Expression for filtering Filenames; if a filter is supplied then only files whose names match that Regular Expression will be fetched, otherwise all files will be fetched\",\n+                                \"displayName\": \"File Filter Regex\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Port\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"File Filter Regex\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Protocol\": {\n+                            \"Filter Match Name Only\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"TCP\",\n-                                        \"value\": \"TCP\"\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"UDP\",\n-                                        \"value\": \"UDP\"\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"UDP\",\n-                                \"description\": \"The protocol for Syslog communication.\",\n-                                \"displayName\": \"Protocol\",\n+                                \"defaultValue\": \"true\",\n+                                \"description\": \"If true then File Filter Regex will match on just the filename, otherwise subdirectory names will be included with filename in the regex comparison\",\n+                                \"displayName\": \"Filter Match Name Only\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Protocol\",\n+                                \"name\": \"Filter Match Name Only\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"SSL Context Service\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"TCP\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Protocol\",\n-                                        \"propertyName\": \"Protocol\"\n-                                    }\n-                                ],\n-                                \"description\": \"The Controller Service to use in order to obtain an SSL Context. If this property is set, syslog messages will be sent over a secure connection.\",\n-                                \"displayName\": \"SSL Context Service\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"SSL Context Service\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            },\n-                            \"Timeout\": {\n-                                \"defaultValue\": \"10 seconds\",\n-                                \"description\": \"The timeout for connecting to and communicating with the syslog server. Does not apply to UDP. Note that Expression language is not evaluated per FlowFile.\",\n-                                \"displayName\": \"Timeout\",\n+                            \"Hadoop Configuration Resources\": {\n+                                \"description\": \"A file or comma separated list of files which contains the Hadoop file system configuration. Without this, Hadoop will search the classpath for a 'core-site.xml' and 'hdfs-site.xml' file or will revert to a default configuration. To use swebhdfs, see 'Additional Details' section of PutHDFS's documentation.\",\n+                                \"displayName\": \"Hadoop Configuration Resources\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Timeout\",\n+                                \"name\": \"Hadoop Configuration Resources\",\n                                 \"required\": false,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"MULTIPLE\",\n+                                    \"resourceTypes\": [\n+                                        \"FILE\"\n+                                    ]\n+                                },\n                                 \"sensitive\": false\n-                            }\n-                        },\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.processors.standard.ListenSyslog\",\n-                            \"org.apache.nifi.processors.standard.ParseSyslog\"\n-                        ],\n-                        \"sideEffectFree\": false,\n-                        \"supportedRelationships\": [\n-                            {\n-                                \"description\": \"FlowFiles that are sent successfully to Syslog are sent out this relationship.\",\n-                                \"name\": \"success\"\n                             },\n-                            {\n-                                \"description\": \"FlowFiles that failed to send to Syslog are sent out this relationship.\",\n-                                \"name\": \"failure\"\n+                            \"IO Buffer Size\": {\n+                                \"description\": \"Amount of memory to use to buffer file contents during IO. This overrides the Hadoop Configuration\",\n+                                \"displayName\": \"IO Buffer Size\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"IO Buffer Size\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n                             },\n-                            {\n-                                \"description\": \"FlowFiles that do not form a valid Syslog message are sent out this relationship.\",\n-                                \"name\": \"invalid\"\n-                            }\n-                        ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": false,\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": false,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"logs\",\n-                            \"put\",\n-                            \"syslog\",\n-                            \"tcp\",\n-                            \"udp\"\n-                        ],\n-                        \"triggerSerially\": false,\n-                        \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": true,\n-                        \"type\": \"org.apache.nifi.processors.standard.PutSyslog\",\n-                        \"typeDescription\": \"Sends Syslog messages to a given host and port over TCP or UDP. Messages are constructed from the \\\"Message ___\\\" properties of the processor which can use expression language to generate messages from incoming FlowFiles. The properties are used to construct messages of the form: (<PRIORITY>)(VERSION )(TIMESTAMP) (HOSTNAME) (BODY) where version is optional.  The constructed messages are checked against regular expressions for RFC5424 and RFC3164 formatted messages. The timestamp can be an RFC5424 timestamp with a format of \\\"yyyy-MM-dd'T'HH:mm:ss.SZ\\\" or \\\"yyyy-MM-dd'T'HH:mm:ss.S+hh:mm\\\", or it can be an RFC3164 timestamp with a format of \\\"MMM d HH:mm:ss\\\". If a message is constructed that does not form a valid Syslog message according to the above description, then it is routed to the invalid relationship. Valid messages are sent to the Syslog server and successes are routed to the success relationship, failures routed to the failure relationship.\",\n-                        \"version\": \"1.27.0\"\n-                    },\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-standard-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"e0c4461\"\n-                        },\n-                        \"defaultBulletinLevel\": \"WARN\",\n-                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": 1,\n-                            \"TIMER_DRIVEN\": 1\n-                        },\n-                        \"defaultPenaltyDuration\": \"30 sec\",\n-                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"0 sec\"\n-                        },\n-                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n-                        \"defaultYieldDuration\": \"1 sec\",\n-                        \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_REQUIRED\",\n-                        \"primaryNodeOnly\": false,\n-                        \"propertyDescriptors\": {\n-                            \"Character Set\": {\n-                                \"defaultValue\": \"UTF-8\",\n-                                \"dependencies\": [\n+                            \"Ignore Dotted Files\": {\n+                                \"allowableValues\": [\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"FLOWFILE_ORIENTED\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Transmission Strategy\",\n-                                        \"propertyName\": \"Transmission Strategy\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"description\": \"Specifies the character set of the data being sent.\",\n-                                \"displayName\": \"Character Set\",\n+                                \"defaultValue\": \"true\",\n+                                \"description\": \"If true, files whose names begin with a dot (\\\".\\\") will be ignored\",\n+                                \"displayName\": \"Ignore Dotted Files\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Character Set\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Ignore Dotted Files\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Connection Per FlowFile\": {\n+                            \"Keep Source File\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"true\",\n                                         \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"false\",\n                                         \"value\": \"false\"\n                                     }\n                                 ],\n                                 \"defaultValue\": \"false\",\n-                                \"description\": \"Specifies whether to send each FlowFile's content on an individual connection.\",\n-                                \"displayName\": \"Connection Per FlowFile\",\n+                                \"description\": \"Determines whether to delete the file from HDFS after it has been successfully transferred. If true, the file will be fetched repeatedly. This is intended for testing only.\",\n+                                \"displayName\": \"Keep Source File\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Connection Per FlowFile\",\n+                                \"name\": \"Keep Source File\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Hostname\": {\n-                                \"defaultValue\": \"localhost\",\n-                                \"description\": \"Destination hostname or IP address\",\n-                                \"displayName\": \"Hostname\",\n+                            \"Kerberos Keytab\": {\n+                                \"description\": \"Kerberos keytab associated with the principal. Requires nifi.kerberos.krb5.file to be set in your nifi.properties\",\n+                                \"displayName\": \"Kerberos Keytab\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Hostname\",\n-                                \"required\": true,\n+                                \"name\": \"Kerberos Keytab\",\n+                                \"required\": false,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"SINGLE\",\n+                                    \"resourceTypes\": [\n+                                        \"FILE\"\n+                                    ]\n+                                },\n                                 \"sensitive\": false\n                             },\n-                            \"Idle Connection Expiration\": {\n-                                \"defaultValue\": \"15 seconds\",\n-                                \"description\": \"The amount of time a connection should be held open without being used before closing the connection. A value of 0 seconds will disable this feature.\",\n-                                \"displayName\": \"Idle Connection Expiration\",\n+                            \"Kerberos Password\": {\n+                                \"description\": \"Kerberos password associated with the principal.\",\n+                                \"displayName\": \"Kerberos Password\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Kerberos Password\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n+                            },\n+                            \"Kerberos Principal\": {\n+                                \"description\": \"Kerberos principal to authenticate as. Requires nifi.kerberos.krb5.file to be set in your nifi.properties\",\n+                                \"displayName\": \"Kerberos Principal\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Idle Connection Expiration\",\n-                                \"required\": true,\n+                                \"name\": \"Kerberos Principal\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Max Size of Socket Send Buffer\": {\n-                                \"defaultValue\": \"1 MB\",\n-                                \"description\": \"The maximum size of the socket send buffer that should be used. This is a suggestion to the Operating System to indicate how big the socket buffer should be. If this value is set too low, the buffer may fill up before the data can be read, and incoming data will be dropped.\",\n-                                \"displayName\": \"Max Size of Socket Send Buffer\",\n+                            \"Kerberos Relogin Period\": {\n+                                \"defaultValue\": \"4 hours\",\n+                                \"description\": \"Period of time which should pass before attempting a kerberos relogin.\\n\\nThis property has been deprecated, and has no effect on processing. Relogins now occur automatically.\",\n+                                \"displayName\": \"Kerberos Relogin Period\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Max Size of Socket Send Buffer\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Kerberos Relogin Period\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Outgoing Message Delimiter\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"FLOWFILE_ORIENTED\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Transmission Strategy\",\n-                                        \"propertyName\": \"Transmission Strategy\"\n-                                    }\n-                                ],\n-                                \"description\": \"Specifies the delimiter to use when sending messages out over the same TCP stream. The delimiter is appended to each FlowFile message that is transmitted over the stream so that the receiver can determine when one message ends and the next message begins. Users should ensure that the FlowFile content does not contain the delimiter character to avoid errors. In order to use a new line character you can enter '\\\\n'. For a tab character use '\\\\t'. Finally for a carriage return use '\\\\r'.\",\n-                                \"displayName\": \"Outgoing Message Delimiter\",\n+                            \"Maximum File Age\": {\n+                                \"description\": \"The maximum age that a file must be in order to be pulled; any file older than this amount of time (based on last modification date) will be ignored\",\n+                                \"displayName\": \"Maximum File Age\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Outgoing Message Delimiter\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Maximum File Age\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Port\": {\n-                                \"description\": \"Destination port number\",\n-                                \"displayName\": \"Port\",\n+                            \"Minimum File Age\": {\n+                                \"defaultValue\": \"0 sec\",\n+                                \"description\": \"The minimum age that a file must be in order to be pulled; any file younger than this amount of time (based on last modification date) will be ignored\",\n+                                \"displayName\": \"Minimum File Age\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Port\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Minimum File Age\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Record Reader\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"RECORD_ORIENTED\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Transmission Strategy\",\n-                                        \"propertyName\": \"Transmission Strategy\"\n-                                    }\n-                                ],\n-                                \"description\": \"Specifies the Controller Service to use for reading Records from input FlowFiles\",\n-                                \"displayName\": \"Record Reader\",\n+                            \"Polling Interval\": {\n+                                \"defaultValue\": \"0 sec\",\n+                                \"description\": \"Indicates how long to wait between performing directory listings\",\n+                                \"displayName\": \"Polling Interval\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Record Reader\",\n+                                \"name\": \"Polling Interval\",\n                                 \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n+                                \"sensitive\": false\n                             },\n-                            \"Record Writer\": {\n-                                \"dependencies\": [\n+                            \"Recurse Subdirectories\": {\n+                                \"allowableValues\": [\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"RECORD_ORIENTED\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Transmission Strategy\",\n-                                        \"propertyName\": \"Transmission Strategy\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"description\": \"Specifies the Controller Service to use for writing Records to the configured socket address\",\n-                                \"displayName\": \"Record Writer\",\n+                                \"defaultValue\": \"true\",\n+                                \"description\": \"Indicates whether to pull files from subdirectories of the HDFS directory\",\n+                                \"displayName\": \"Recurse Subdirectories\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Record Writer\",\n+                                \"name\": \"Recurse Subdirectories\",\n                                 \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"kerberos-credentials-service\": {\n+                                \"description\": \"Specifies the Kerberos Credentials Controller Service that should be used for authenticating with Kerberos\",\n+                                \"displayName\": \"Kerberos Credentials Service\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"kerberos-credentials-service\",\n+                                \"required\": false,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n                                     \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n+                                    \"type\": \"org.apache.nifi.kerberos.KerberosCredentialsService\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             },\n-                            \"SSL Context Service\": {\n-                                \"description\": \"Specifies the SSL Context Service to enable TLS socket communication\",\n-                                \"displayName\": \"SSL Context Service\",\n+                            \"kerberos-user-service\": {\n+                                \"description\": \"Specifies the Kerberos User Controller Service that should be used for authenticating with Kerberos\",\n+                                \"displayName\": \"Kerberos User Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"SSL Context Service\",\n+                                \"name\": \"kerberos-user-service\",\n                                 \"required\": false,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n                                     \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n+                                    \"type\": \"org.apache.nifi.kerberos.KerberosUserService\",\n                                     \"version\": \"1.27.0\"\n                                 }\n-                            },\n-                            \"Timeout\": {\n-                                \"defaultValue\": \"10 seconds\",\n-                                \"description\": \"The timeout for connecting to and communicating with the destination. Does not apply to UDP\",\n-                                \"displayName\": \"Timeout\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Timeout\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Transmission Strategy\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"Send FlowFile content as a single stream\",\n-                                        \"displayName\": \"FlowFile-oriented\",\n-                                        \"value\": \"FLOWFILE_ORIENTED\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Read Records from input FlowFiles and send serialized Records as individual messages\",\n-                                        \"displayName\": \"Record-oriented\",\n-                                        \"value\": \"RECORD_ORIENTED\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"FLOWFILE_ORIENTED\",\n-                                \"description\": \"Specifies the strategy used for reading input FlowFiles and transmitting messages to the destination socket address\",\n-                                \"displayName\": \"Transmission Strategy\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Transmission Strategy\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n                             }\n                         },\n+                        \"restricted\": true,\n                         \"seeAlso\": [\n-                            \"org.apache.nifi.processors.standard.ListenTCP\",\n-                            \"org.apache.nifi.processors.standard.PutUDP\"\n+                            \"org.apache.nifi.processors.hadoop.ListHDFS\",\n+                            \"org.apache.nifi.processors.hadoop.PutHDFS\"\n                         ],\n                         \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"FlowFiles that are sent successfully to the destination are sent out this relationship.\",\n+                                \"description\": \"All files retrieved from HDFS are transferred to this relationship\",\n                                 \"name\": \"success\"\n-                            },\n-                            {\n-                                \"description\": \"FlowFiles that failed to send to the destination are sent out this relationship.\",\n-                                \"name\": \"failure\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n-                        \"supportsBatching\": true,\n+                        \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"egress\",\n-                            \"put\",\n-                            \"remote\",\n-                            \"tcp\"\n+                            \"HCFS\",\n+                            \"HDFS\",\n+                            \"fetch\",\n+                            \"filesystem\",\n+                            \"get\",\n+                            \"hadoop\",\n+                            \"ingest\",\n+                            \"source\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.standard.PutTCP\",\n-                        \"typeDescription\": \"Sends serialized FlowFiles or Records over TCP to a configurable destination with optional support for TLS\",\n+                        \"triggerWhenEmpty\": true,\n+                        \"type\": \"org.apache.nifi.processors.hadoop.GetHDFS\",\n+                        \"typeDescription\": \"Fetch files from Hadoop Distributed File System (HDFS) into FlowFiles. This Processor will delete the file from HDFS after fetching it.\",\n                         \"version\": \"1.27.0\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"Count of records transmitted to configured destination address\",\n-                                \"name\": \"record.count.transmitted\"\n+                                \"description\": \"The name of the file that was read from HDFS.\",\n+                                \"name\": \"filename\"\n+                            },\n+                            {\n+                                \"description\": \"The path is set to the relative path of the file's directory on HDFS. For example, if the Directory property is set to /tmp, then files picked up from /tmp will have the path attribute set to \\\"./\\\". If the Recurse Subdirectories property is set to true and a file is picked up from /tmp/abc/1/2/3, then the path attribute will be set to \\\"abc/1/2/3\\\".\",\n+                                \"name\": \"path\"\n                             }\n                         ]\n                     },\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-standard-nar\",\n+                        \"artifact\": \"nifi-hadoop-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -119238,4314 +119815,4280 @@\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_REQUIRED\",\n+                        \"inputRequirement\": \"INPUT_ALLOWED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Hostname\": {\n-                                \"defaultValue\": \"localhost\",\n-                                \"description\": \"Destination hostname or IP address\",\n-                                \"displayName\": \"Hostname\",\n+                            \"Additional Classpath Resources\": {\n+                                \"description\": \"A comma-separated list of paths to files and/or directories that will be added to the classpath and used for loading native libraries. When specifying a directory, all files with in the directory will be added to the classpath, but further sub-directories will not be included.\",\n+                                \"displayName\": \"Additional Classpath Resources\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Additional Classpath Resources\",\n+                                \"required\": false,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"MULTIPLE\",\n+                                    \"resourceTypes\": [\n+                                        \"DIRECTORY\",\n+                                        \"FILE\"\n+                                    ]\n+                                },\n+                                \"sensitive\": false\n+                            },\n+                            \"Hadoop Configuration Resources\": {\n+                                \"description\": \"A file or comma separated list of files which contains the Hadoop file system configuration. Without this, Hadoop will search the classpath for a 'core-site.xml' and 'hdfs-site.xml' file or will revert to a default configuration. To use swebhdfs, see 'Additional Details' section of PutHDFS's documentation.\",\n+                                \"displayName\": \"Hadoop Configuration Resources\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Hostname\",\n-                                \"required\": true,\n+                                \"name\": \"Hadoop Configuration Resources\",\n+                                \"required\": false,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"MULTIPLE\",\n+                                    \"resourceTypes\": [\n+                                        \"FILE\"\n+                                    ]\n+                                },\n                                 \"sensitive\": false\n                             },\n-                            \"Idle Connection Expiration\": {\n-                                \"defaultValue\": \"15 seconds\",\n-                                \"description\": \"The amount of time a connection should be held open without being used before closing the connection. A value of 0 seconds will disable this feature.\",\n-                                \"displayName\": \"Idle Connection Expiration\",\n+                            \"Kerberos Keytab\": {\n+                                \"description\": \"Kerberos keytab associated with the principal. Requires nifi.kerberos.krb5.file to be set in your nifi.properties\",\n+                                \"displayName\": \"Kerberos Keytab\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Idle Connection Expiration\",\n-                                \"required\": true,\n+                                \"name\": \"Kerberos Keytab\",\n+                                \"required\": false,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"SINGLE\",\n+                                    \"resourceTypes\": [\n+                                        \"FILE\"\n+                                    ]\n+                                },\n                                 \"sensitive\": false\n                             },\n-                            \"Max Size of Socket Send Buffer\": {\n-                                \"defaultValue\": \"1 MB\",\n-                                \"description\": \"The maximum size of the socket send buffer that should be used. This is a suggestion to the Operating System to indicate how big the socket buffer should be. If this value is set too low, the buffer may fill up before the data can be read, and incoming data will be dropped.\",\n-                                \"displayName\": \"Max Size of Socket Send Buffer\",\n+                            \"Kerberos Password\": {\n+                                \"description\": \"Kerberos password associated with the principal.\",\n+                                \"displayName\": \"Kerberos Password\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Max Size of Socket Send Buffer\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n+                                \"name\": \"Kerberos Password\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n                             },\n-                            \"Port\": {\n-                                \"description\": \"Destination port number\",\n-                                \"displayName\": \"Port\",\n+                            \"Kerberos Principal\": {\n+                                \"description\": \"Kerberos principal to authenticate as. Requires nifi.kerberos.krb5.file to be set in your nifi.properties\",\n+                                \"displayName\": \"Kerberos Principal\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Port\",\n-                                \"required\": true,\n+                                \"name\": \"Kerberos Principal\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Timeout\": {\n-                                \"defaultValue\": \"10 seconds\",\n-                                \"description\": \"The timeout for connecting to and communicating with the destination. Does not apply to UDP\",\n-                                \"displayName\": \"Timeout\",\n+                            \"Kerberos Relogin Period\": {\n+                                \"defaultValue\": \"4 hours\",\n+                                \"description\": \"Period of time which should pass before attempting a kerberos relogin.\\n\\nThis property has been deprecated, and has no effect on processing. Relogins now occur automatically.\",\n+                                \"displayName\": \"Kerberos Relogin Period\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Timeout\",\n+                                \"name\": \"Kerberos Relogin Period\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n-                            }\n-                        },\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.processors.standard.ListenUDP\",\n-                            \"org.apache.nifi.processors.standard.PutTCP\"\n-                        ],\n-                        \"sideEffectFree\": false,\n-                        \"supportedRelationships\": [\n-                            {\n-                                \"description\": \"FlowFiles that are sent successfully to the destination are sent out this relationship.\",\n-                                \"name\": \"success\"\n                             },\n-                            {\n-                                \"description\": \"FlowFiles that failed to send to the destination are sent out this relationship.\",\n-                                \"name\": \"failure\"\n-                            }\n-                        ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": true,\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": false,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"egress\",\n-                            \"put\",\n-                            \"remote\",\n-                            \"udp\"\n-                        ],\n-                        \"triggerSerially\": false,\n-                        \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.standard.PutUDP\",\n-                        \"typeDescription\": \"The PutUDP processor receives a FlowFile and packages the FlowFile content into a single UDP datagram packet which is then transmitted to the configured UDP server. The user must ensure that the FlowFile content being fed to this processor is not larger than the maximum size for the underlying UDP transport. The maximum transport size will vary based on the platform setup but is generally just under 64KB. FlowFiles will be marked as failed if their content is larger than the maximum transport size.\",\n-                        \"version\": \"1.27.0\"\n-                    },\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-standard-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"e0c4461\"\n-                        },\n-                        \"defaultBulletinLevel\": \"WARN\",\n-                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": 1,\n-                            \"TIMER_DRIVEN\": 1\n-                        },\n-                        \"defaultPenaltyDuration\": \"30 sec\",\n-                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"1 min\"\n-                        },\n-                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n-                        \"defaultYieldDuration\": \"1 sec\",\n-                        \"dynamicProperties\": [\n-                            {\n-                                \"description\": \"Specifies an initial max value for max value column(s). Properties should be added in the format `initial.maxvalue.<max_value_column>`. This value is only used the first time the table is accessed (when a Maximum Value Column is specified).\",\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"name\": \"initial.maxvalue.<max_value_column>\",\n-                                \"value\": \"Initial maximum value for the specified column\"\n-                            }\n-                        ],\n-                        \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n-                        \"primaryNodeOnly\": true,\n-                        \"propertyDescriptors\": {\n-                            \"Columns to Return\": {\n-                                \"description\": \"A comma-separated list of column names to be used in the query. If your database requires special treatment of the names (quoting, e.g.), each name should include such treatment. If no column names are supplied, all columns in the specified table will be returned. NOTE: It is important to use consistent column names for a given table for incremental fetch to work properly.\",\n-                                \"displayName\": \"Columns to Return\",\n+                            \"gethdfsfileinfo-batch-size\": {\n+                                \"description\": \"Number of records to put into an output flowfile when 'Destination' is set to 'Content' and 'Group Results' is set to 'None'\",\n+                                \"displayName\": \"Batch Size\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Columns to Return\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"gethdfsfileinfo-batch-size\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Database Connection Pooling Service\": {\n-                                \"description\": \"The Controller Service that is used to obtain a connection to the database.\",\n-                                \"displayName\": \"Database Connection Pooling Service\",\n+                            \"gethdfsfileinfo-destination\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"Details of given HDFS object will be stored in attributes of flowfile. WARNING: In case when scan finds thousands or millions of objects, having huge values in attribute could impact flow file repo and GC/heap usage. Use content destination for such cases.\",\n+                                        \"displayName\": \"Attributes\",\n+                                        \"value\": \"gethdfsfileinfo-dest-attr\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Details of given HDFS object will be stored in a content in JSON format\",\n+                                        \"displayName\": \"Content\",\n+                                        \"value\": \"gethdfsfileinfo-dest-content\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"gethdfsfileinfo-dest-content\",\n+                                \"description\": \"Sets the destination for the resutls. When set to 'Content', attributes of flowfile won't be used for storing results. \",\n+                                \"displayName\": \"Destination\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Database Connection Pooling Service\",\n-                                \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.dbcp.DBCPService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            },\n-                            \"Fetch Size\": {\n-                                \"defaultValue\": \"0\",\n-                                \"description\": \"The number of result rows to be fetched from the result set at a time. This is a hint to the database driver and may not be honored and/or exact. If the value specified is zero, then the hint is ignored. If using PostgreSQL, then 'Set Auto Commit' must be equal to 'false' to cause 'Fetch Size' to take effect.\",\n-                                \"displayName\": \"Fetch Size\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Fetch Size\",\n+                                \"name\": \"gethdfsfileinfo-destination\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Max Wait Time\": {\n-                                \"defaultValue\": \"0 seconds\",\n-                                \"description\": \"The maximum amount of time allowed for a running SQL select query , zero means there is no limit. Max time less than 1 second will be equal to zero.\",\n-                                \"displayName\": \"Max Wait Time\",\n+                            \"gethdfsfileinfo-dir-filter\": {\n+                                \"description\": \"Regex. Only directories whose names match the given regular expression will be picked up. If not provided, any filter would be apply (performance considerations).\",\n+                                \"displayName\": \"Directory Filter\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Max Wait Time\",\n-                                \"required\": true,\n+                                \"name\": \"gethdfsfileinfo-dir-filter\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Maximum-value Columns\": {\n-                                \"description\": \"A comma-separated list of column names. The processor will keep track of the maximum value for each column that has been returned since the processor started running. Using multiple columns implies an order to the column list, and each column's values are expected to increase more slowly than the previous columns' values. Thus, using multiple columns implies a hierarchical structure of columns, which is usually used for partitioning tables. This processor can be used to retrieve only those rows that have been added/updated since the last retrieval. Note that some JDBC types such as bit/boolean are not conducive to maintaining maximum value, so columns of these types should not be listed in this property, and will result in error(s) during processing. If no columns are provided, all rows from the table will be considered, which could have a performance impact. NOTE: It is important to use consistent max-value column names for a given table for incremental fetch to work properly.\",\n-                                \"displayName\": \"Maximum-value Columns\",\n+                            \"gethdfsfileinfo-file-exclude-filter\": {\n+                                \"description\": \"Regex. Files whose names match the given regular expression will not be picked up. If not provided, any filter won't be apply (performance considerations).\",\n+                                \"displayName\": \"Exclude Files\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Maximum-value Columns\",\n+                                \"name\": \"gethdfsfileinfo-file-exclude-filter\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Set Auto Commit\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"description\": \"Allows enabling or disabling the auto commit functionality of the DB connection. Default value is 'No value set'. 'No value set' will leave the db connection's auto commit mode unchanged. For some JDBC drivers such as PostgreSQL driver, it is required to disable the auto commit functionality to get the 'Fetch Size' setting to take effect. When auto commit is enabled, PostgreSQL driver ignores 'Fetch Size' setting and loads all rows of the result set to memory at once. This could lead for a large amount of memory usage when executing queries which fetch large data sets. More Details of this behaviour in PostgreSQL driver can be found in https://jdbc.postgresql.org//documentation/head/query.html.\",\n-                                \"displayName\": \"Set Auto Commit\",\n+                            \"gethdfsfileinfo-file-filter\": {\n+                                \"description\": \"Regex. Only files whose names match the given regular expression will be picked up. If not provided, any filter would be apply (performance considerations).\",\n+                                \"displayName\": \"File Filter\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Set Auto Commit\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"gethdfsfileinfo-file-filter\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Table Name\": {\n-                                \"description\": \"The name of the database table to be queried. When a custom query is used, this property is used to alias the query and appears as an attribute on the FlowFile.\",\n-                                \"displayName\": \"Table Name\",\n+                            \"gethdfsfileinfo-full-path\": {\n+                                \"defaultValue\": \"\",\n+                                \"description\": \"A directory to start listing from, or a file's full path.\",\n+                                \"displayName\": \"Full path\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Table Name\",\n+                                \"name\": \"gethdfsfileinfo-full-path\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"db-fetch-db-type\": {\n+                            \"gethdfsfileinfo-group\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Generates ANSI SQL\",\n-                                        \"displayName\": \"Generic\",\n-                                        \"value\": \"Generic\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Generates Oracle compliant SQL\",\n-                                        \"displayName\": \"Oracle\",\n-                                        \"value\": \"Oracle\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Generates Oracle compliant SQL for version 12 or greater\",\n-                                        \"displayName\": \"Oracle 12+\",\n-                                        \"value\": \"Oracle 12+\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Generates MS SQL Compatible SQL, for version 2012 or greater\",\n-                                        \"displayName\": \"MS SQL 2012+\",\n-                                        \"value\": \"MS SQL 2012+\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Generates MS SQL Compatible SQL for version 2008\",\n-                                        \"displayName\": \"MS SQL 2008\",\n-                                        \"value\": \"MS SQL 2008\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Generates MySQL compatible SQL\",\n-                                        \"displayName\": \"MySQL\",\n-                                        \"value\": \"MySQL\"\n+                                        \"description\": \"Group all results into a single flowfile.\",\n+                                        \"displayName\": \"All\",\n+                                        \"value\": \"gethdfsfileinfo-group-all\"\n                                     },\n                                     {\n-                                        \"description\": \"Generates PostgreSQL compatible SQL\",\n-                                        \"displayName\": \"PostgreSQL\",\n-                                        \"value\": \"PostgreSQL\"\n+                                        \"description\": \"Group HDFS objects by their parent directories only. Processor will generate flowfile for each directory (if recursive). If 'Recurse Subdirectories' property set to 'false', then will have the same effect as 'All'\",\n+                                        \"displayName\": \"Parent Directory\",\n+                                        \"value\": \"gethdfsfileinfo-group-parent-dir\"\n                                     },\n                                     {\n-                                        \"description\": \"Generates Phoenix compliant SQL\",\n-                                        \"displayName\": \"Phoenix\",\n-                                        \"value\": \"Phoenix\"\n+                                        \"description\": \"Don't group results. Generate flowfile per each HDFS object.\",\n+                                        \"displayName\": \"None\",\n+                                        \"value\": \"gethdfsfileinfo-group-none\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"Generic\",\n-                                \"description\": \"The type/flavor of database, used for generating database-specific code. In many cases the Generic type should suffice, but some databases (such as Oracle) require custom SQL clauses. \",\n-                                \"displayName\": \"Database Type\",\n+                                \"defaultValue\": \"gethdfsfileinfo-group-all\",\n+                                \"description\": \"Groups HDFS objects\",\n+                                \"displayName\": \"Group Results\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"db-fetch-db-type\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"db-fetch-sql-query\": {\n-                                \"description\": \"A custom SQL query used to retrieve data. Instead of building a SQL query from other properties, this query will be wrapped as a sub-query. Query must have no ORDER BY statement.\",\n-                                \"displayName\": \"Custom Query\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"db-fetch-sql-query\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"db-fetch-where-clause\": {\n-                                \"description\": \"A custom clause to be added in the WHERE condition when building SQL queries.\",\n-                                \"displayName\": \"Additional WHERE clause\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"db-fetch-where-clause\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"dbf-default-precision\": {\n-                                \"defaultValue\": \"10\",\n-                                \"description\": \"When a DECIMAL/NUMBER value is written as a 'decimal' Avro logical type, a specific 'precision' denoting number of available digits is required. Generally, precision is defined by column data type definition or database engines default. However undefined precision (0) can be returned from some database engines. 'Default Decimal Precision' is used when writing those undefined precision numbers.\",\n-                                \"displayName\": \"Default Decimal Precision\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"dbf-default-precision\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"dbf-default-scale\": {\n-                                \"defaultValue\": \"0\",\n-                                \"description\": \"When a DECIMAL/NUMBER value is written as a 'decimal' Avro logical type, a specific 'scale' denoting number of available decimal digits is required. Generally, scale is defined by column data type definition or database engines default. However when undefined precision (0) is returned, scale can also be uncertain with some database engines. 'Default Decimal Scale' is used when writing those undefined numbers. If a value has more decimals than specified scale, then the value will be rounded-up, e.g. 1.53 becomes 2 with scale 0, and 1.5 with scale 1.\",\n-                                \"displayName\": \"Default Decimal Scale\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"dbf-default-scale\",\n+                                \"name\": \"gethdfsfileinfo-group\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"dbf-normalize\": {\n+                            \"gethdfsfileinfo-ignore-dotted-dirs\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"true\",\n                                         \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"false\",\n                                         \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"Whether to change non-Avro-compatible characters in column names to Avro-compatible characters. For example, colons and periods will be changed to underscores in order to build a valid Avro record.\",\n-                                \"displayName\": \"Normalize Table/Column Names\",\n+                                \"defaultValue\": \"true\",\n+                                \"description\": \"If true, directories whose names begin with a dot (\\\".\\\") will be ignored\",\n+                                \"displayName\": \"Ignore Dotted Directories\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"dbf-normalize\",\n+                                \"name\": \"gethdfsfileinfo-ignore-dotted-dirs\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"dbf-user-logical-types\": {\n+                            \"gethdfsfileinfo-ignore-dotted-files\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"true\",\n                                         \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"false\",\n                                         \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"Whether to use Avro Logical Types for DECIMAL/NUMBER, DATE, TIME and TIMESTAMP columns. If disabled, written as string. If enabled, Logical types are used and written as its underlying type, specifically, DECIMAL/NUMBER as logical 'decimal': written as bytes with additional precision and scale meta data, DATE as logical 'date-millis': written as int denoting days since Unix epoch (1970-01-01), TIME as logical 'time-millis': written as int denoting milliseconds since Unix epoch, and TIMESTAMP as logical 'timestamp-millis': written as long denoting milliseconds since Unix epoch. If a reader of written Avro records also knows these logical types, then these values can be deserialized with more context depending on reader implementation.\",\n-                                \"displayName\": \"Use Avro Logical Types\",\n+                                \"defaultValue\": \"true\",\n+                                \"description\": \"If true, files whose names begin with a dot (\\\".\\\") will be ignored\",\n+                                \"displayName\": \"Ignore Dotted Files\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"dbf-user-logical-types\",\n+                                \"name\": \"gethdfsfileinfo-ignore-dotted-files\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"initial-load-strategy\": {\n+                            \"gethdfsfileinfo-recurse-subdirs\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Loads all existing rows from the database table.\",\n-                                        \"displayName\": \"Start at Beginning\",\n-                                        \"value\": \"Start at Beginning\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n-                                        \"description\": \"Loads only the newly inserted or updated rows based on the maximum value(s) of the column(s) configured in the 'Maximum-value Columns' property.\",\n-                                        \"displayName\": \"Start at Current Maximum Values\",\n-                                        \"value\": \"Start at Current Maximum Values\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"Start at Beginning\",\n-                                \"description\": \"How to handle existing rows in the database table when the processor is started for the first time (or its state has been cleared). The property will be ignored, if any 'initial.maxvalue.*' dynamic property has also been configured.\",\n-                                \"displayName\": \"Initial Load Strategy\",\n+                                \"defaultValue\": \"true\",\n+                                \"description\": \"Indicates whether to list files from subdirectories of the HDFS directory\",\n+                                \"displayName\": \"Recurse Subdirectories\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"initial-load-strategy\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"qdbt-max-frags\": {\n-                                \"defaultValue\": \"0\",\n-                                \"description\": \"The maximum number of fragments. If the value specified is zero, then all fragments are returned. This prevents OutOfMemoryError when this processor ingests huge table. NOTE: Setting this property can result in data loss, as the incoming results are not ordered, and fragments may end at arbitrary boundaries where rows are not included in the result set.\",\n-                                \"displayName\": \"Maximum Number of Fragments\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"qdbt-max-frags\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"qdbt-max-rows\": {\n-                                \"defaultValue\": \"0\",\n-                                \"description\": \"The maximum number of result rows that will be included in a single FlowFile. This will allow you to break up very large result sets into multiple FlowFiles. If the value specified is zero, then all rows are returned in a single FlowFile.\",\n-                                \"displayName\": \"Max Rows Per Flow File\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"qdbt-max-rows\",\n+                                \"name\": \"gethdfsfileinfo-recurse-subdirs\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"qdbt-output-batch-size\": {\n-                                \"defaultValue\": \"0\",\n-                                \"description\": \"The number of output FlowFiles to queue before committing the process session. When set to zero, the session will be committed when all result set rows have been processed and the output FlowFiles are ready for transfer to the downstream relationship. For large result sets, this can cause a large burst of FlowFiles to be transferred at the end of processor execution. If this property is set, then when the specified number of FlowFiles are ready for transfer, then the session will be committed, thus releasing the FlowFiles to the downstream relationship. NOTE: The maxvalue.* and fragment.count attributes will not be set on FlowFiles when this property is set.\",\n-                                \"displayName\": \"Output Batch Size\",\n+                            \"kerberos-credentials-service\": {\n+                                \"description\": \"Specifies the Kerberos Credentials Controller Service that should be used for authenticating with Kerberos\",\n+                                \"displayName\": \"Kerberos Credentials Service\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"qdbt-output-batch-size\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"kerberos-credentials-service\",\n+                                \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.kerberos.KerberosCredentialsService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n                             },\n-                            \"transaction-isolation-level\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"TRANSACTION_NONE\",\n-                                        \"value\": \"0\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"TRANSACTION_READ_COMMITTED\",\n-                                        \"value\": \"2\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"TRANSACTION_READ_UNCOMMITTED\",\n-                                        \"value\": \"1\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"TRANSACTION_REPEATABLE_READ\",\n-                                        \"value\": \"4\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"TRANSACTION_SERIALIZABLE\",\n-                                        \"value\": \"8\"\n-                                    }\n-                                ],\n-                                \"description\": \"This setting will set the transaction isolation level for the database connection for drivers that support this setting\",\n-                                \"displayName\": \"Transaction Isolation Level\",\n+                            \"kerberos-user-service\": {\n+                                \"description\": \"Specifies the Kerberos User Controller Service that should be used for authenticating with Kerberos\",\n+                                \"displayName\": \"Kerberos User Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"transaction-isolation-level\",\n+                                \"name\": \"kerberos-user-service\",\n                                 \"required\": false,\n-                                \"sensitive\": false\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.kerberos.KerberosUserService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n                             }\n                         },\n                         \"seeAlso\": [\n-                            \"org.apache.nifi.processors.standard.ExecuteSQL\",\n-                            \"org.apache.nifi.processors.standard.GenerateTableFetch\"\n+                            \"org.apache.nifi.processors.hadoop.FetchHDFS\",\n+                            \"org.apache.nifi.processors.hadoop.GetHDFS\",\n+                            \"org.apache.nifi.processors.hadoop.ListHDFS\",\n+                            \"org.apache.nifi.processors.hadoop.PutHDFS\"\n                         ],\n                         \"sideEffectFree\": false,\n-                        \"stateful\": {\n-                            \"description\": \"After performing a query on the specified table, the maximum values for the specified column(s) will be retained for use in future executions of the query. This allows the Processor to fetch only those records that have max values greater than the retained values. This can be used for incremental fetching, fetching of newly added rows, etc. To clear the maximum values, clear the state of the processor per the State Management documentation\",\n-                            \"scopes\": [\n-                                \"CLUSTER\"\n-                            ]\n-                        },\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"Successfully created FlowFile from SQL query result set.\",\n+                                \"description\": \"All successfully generated FlowFiles are transferred to this relationship\",\n                                 \"name\": \"success\"\n+                            },\n+                            {\n+                                \"description\": \"If no objects are found, original FlowFile are transferred to this relationship\",\n+                                \"name\": \"not found\"\n+                            },\n+                            {\n+                                \"description\": \"All failed attempts to access HDFS will be routed to this relationship\",\n+                                \"name\": \"failure\"\n+                            },\n+                            {\n+                                \"description\": \"Original FlowFiles are transferred to this relationship\",\n+                                \"name\": \"original\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n                         \"supportsBatching\": false,\n-                        \"supportsDynamicProperties\": true,\n+                        \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"database\",\n-                            \"jdbc\",\n-                            \"query\",\n-                            \"select\",\n-                            \"sql\"\n+                            \"HCFS\",\n+                            \"HDFS\",\n+                            \"filesystem\",\n+                            \"get\",\n+                            \"hadoop\",\n+                            \"ingest\",\n+                            \"list\",\n+                            \"source\"\n                         ],\n-                        \"triggerSerially\": true,\n+                        \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.standard.QueryDatabaseTable\",\n-                        \"typeDescription\": \"Generates a SQL select query, or uses a provided statement, and executes it to fetch all rows whose values in the specified Maximum Value column(s) are larger than the previously-seen maxima. Query result will be converted to Avro format. Expression Language is supported for several properties, but no incoming connections are permitted. The Variable Registry may be used to provide values for any property containing Expression Language. If it is desired to leverage flow file attributes to perform these queries, the GenerateTableFetch and/or ExecuteSQL processors can be used for this purpose. Streaming is used so arbitrarily large result sets are supported. This processor can be scheduled to run on a timer or cron expression, using the standard scheduling methods. This processor is intended to be run on the Primary Node only. FlowFile attribute 'querydbtable.row.count' indicates how many rows were selected.\",\n+                        \"type\": \"org.apache.nifi.processors.hadoop.GetHDFSFileInfo\",\n+                        \"typeDescription\": \"Retrieves a listing of files and directories from HDFS. This processor creates a FlowFile(s) that represents the HDFS file/dir with relevant information. Main purpose of this processor to provide functionality similar to HDFS Client, i.e. count, du, ls, test, etc. Unlike ListHDFS, this processor is stateless, supports incoming connections and provides information on a dir level. \",\n                         \"version\": \"1.27.0\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"Name of the table being queried\",\n-                                \"name\": \"tablename\"\n+                                \"description\": \"The name of the file/dir found on HDFS.\",\n+                                \"name\": \"hdfs.objectName\"\n                             },\n                             {\n-                                \"description\": \"The number of rows selected by the query\",\n-                                \"name\": \"querydbtable.row.count\"\n+                                \"description\": \"The path is set to the absolute path of the object's parent directory on HDFS. For example, if an object is a directory 'foo', under directory '/bar' then 'hdfs.objectName' will have value 'foo', and 'hdfs.path' will be '/bar'\",\n+                                \"name\": \"hdfs.path\"\n                             },\n                             {\n-                                \"description\": \"If 'Max Rows Per Flow File' is set then all FlowFiles from the same query result set will have the same value for the fragment.identifier attribute. This can then be used to correlate the results.\",\n-                                \"name\": \"fragment.identifier\"\n+                                \"description\": \"The type of an object. Possible values: directory, file, link\",\n+                                \"name\": \"hdfs.type\"\n                             },\n                             {\n-                                \"description\": \"If 'Max Rows Per Flow File' is set then this is the total number of  FlowFiles produced by a single ResultSet. This can be used in conjunction with the fragment.identifier attribute in order to know how many FlowFiles belonged to the same incoming ResultSet. If Output Batch Size is set, then this attribute will not be populated.\",\n-                                \"name\": \"fragment.count\"\n+                                \"description\": \"The user that owns the object in HDFS\",\n+                                \"name\": \"hdfs.owner\"\n                             },\n                             {\n-                                \"description\": \"If 'Max Rows Per Flow File' is set then the position of this FlowFile in the list of outgoing FlowFiles that were all derived from the same result set FlowFile. This can be used in conjunction with the fragment.identifier attribute to know which FlowFiles originated from the same query result set and in what order  FlowFiles were produced\",\n-                                \"name\": \"fragment.index\"\n+                                \"description\": \"The group that owns the object in HDFS\",\n+                                \"name\": \"hdfs.group\"\n                             },\n                             {\n-                                \"description\": \"Each attribute contains the observed maximum value of a specified 'Maximum-value Column'. The suffix of the attribute is the name of the column. If Output Batch Size is set, then this attribute will not be populated.\",\n-                                \"name\": \"maxvalue.*\"\n+                                \"description\": \"The timestamp of when the object in HDFS was last modified, as milliseconds since midnight Jan 1, 1970 UTC\",\n+                                \"name\": \"hdfs.lastModified\"\n+                            },\n+                            {\n+                                \"description\": \"In case of files: The number of bytes in the file in HDFS.  In case of dirs: Retuns storage space consumed by directory. \",\n+                                \"name\": \"hdfs.length\"\n+                            },\n+                            {\n+                                \"description\": \"In case of type='directory' will represent total count of files under this dir. Won't be populated to other types of HDFS objects. \",\n+                                \"name\": \"hdfs.count.files\"\n+                            },\n+                            {\n+                                \"description\": \"In case of type='directory' will represent total count of directories under this dir (including itself). Won't be populated to other types of HDFS objects. \",\n+                                \"name\": \"hdfs.count.dirs\"\n+                            },\n+                            {\n+                                \"description\": \"The number of HDFS replicas for the file\",\n+                                \"name\": \"hdfs.replication\"\n+                            },\n+                            {\n+                                \"description\": \"The permissions for the object in HDFS. This is formatted as 3 characters for the owner, 3 for the group, and 3 for other users. For example rw-rw-r--\",\n+                                \"name\": \"hdfs.permissions\"\n+                            },\n+                            {\n+                                \"description\": \"The status contains comma separated list of file/dir paths, which couldn't be listed/accessed. Status won't be set if no errors occured.\",\n+                                \"name\": \"hdfs.status\"\n+                            },\n+                            {\n+                                \"description\": \"When destination is 'attribute', will be populated with full tree of HDFS directory in JSON format.WARNING: In case when scan finds thousands or millions of objects, having huge values in attribute could impact flow file repo and GC/heap usage. Use content destination for such cases\",\n+                                \"name\": \"hdfs.full.tree\"\n                             }\n                         ]\n                     },\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-standard-nar\",\n+                        \"artifact\": \"nifi-hadoop-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n                         },\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"1 min\"\n+                            \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n-                        \"dynamicProperties\": [\n+                        \"explicitRestrictions\": [\n                             {\n-                                \"description\": \"Specifies an initial max value for max value column(s). Properties should be added in the format `initial.maxvalue.<max_value_column>`. This value is only used the first time the table is accessed (when a Maximum Value Column is specified).\",\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"name\": \"initial.maxvalue.<max_value_column>\",\n-                                \"value\": \"Initial maximum value for the specified column\"\n+                                \"explanation\": \"Provides operator the ability to retrieve any file that NiFi has access to in HDFS or the local filesystem.\",\n+                                \"requiredPermission\": \"read distributed filesystem\"\n+                            },\n+                            {\n+                                \"explanation\": \"Provides operator the ability to delete any file that NiFi has access to in HDFS or the local filesystem.\",\n+                                \"requiredPermission\": \"write distributed filesystem\"\n                             }\n                         ],\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_FORBIDDEN\",\n-                        \"primaryNodeOnly\": true,\n+                        \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Columns to Return\": {\n-                                \"description\": \"A comma-separated list of column names to be used in the query. If your database requires special treatment of the names (quoting, e.g.), each name should include such treatment. If no column names are supplied, all columns in the specified table will be returned. NOTE: It is important to use consistent column names for a given table for incremental fetch to work properly.\",\n-                                \"displayName\": \"Columns to Return\",\n+                            \"Additional Classpath Resources\": {\n+                                \"description\": \"A comma-separated list of paths to files and/or directories that will be added to the classpath and used for loading native libraries. When specifying a directory, all files with in the directory will be added to the classpath, but further sub-directories will not be included.\",\n+                                \"displayName\": \"Additional Classpath Resources\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Columns to Return\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Additional Classpath Resources\",\n                                 \"required\": false,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"MULTIPLE\",\n+                                    \"resourceTypes\": [\n+                                        \"DIRECTORY\",\n+                                        \"FILE\"\n+                                    ]\n+                                },\n                                 \"sensitive\": false\n                             },\n-                            \"Database Connection Pooling Service\": {\n-                                \"description\": \"The Controller Service that is used to obtain a connection to the database.\",\n-                                \"displayName\": \"Database Connection Pooling Service\",\n+                            \"Batch Size\": {\n+                                \"defaultValue\": \"100\",\n+                                \"description\": \"The maximum number of files to pull in each iteration, based on run schedule.\",\n+                                \"displayName\": \"Batch Size\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Database Connection Pooling Service\",\n+                                \"name\": \"Batch Size\",\n                                 \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.dbcp.DBCPService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n+                                \"sensitive\": false\n                             },\n-                            \"Fetch Size\": {\n-                                \"defaultValue\": \"0\",\n-                                \"description\": \"The number of result rows to be fetched from the result set at a time. This is a hint to the database driver and may not be honored and/or exact. If the value specified is zero, then the hint is ignored. If using PostgreSQL, then 'Set Auto Commit' must be equal to 'false' to cause 'Fetch Size' to take effect.\",\n-                                \"displayName\": \"Fetch Size\",\n+                            \"Compression codec\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"No compression\",\n+                                        \"displayName\": \"NONE\",\n+                                        \"value\": \"NONE\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Default ZLIB compression\",\n+                                        \"displayName\": \"DEFAULT\",\n+                                        \"value\": \"DEFAULT\"\n+                                    },\n+                                    {\n+                                        \"description\": \"BZIP compression\",\n+                                        \"displayName\": \"BZIP\",\n+                                        \"value\": \"BZIP\"\n+                                    },\n+                                    {\n+                                        \"description\": \"GZIP compression\",\n+                                        \"displayName\": \"GZIP\",\n+                                        \"value\": \"GZIP\"\n+                                    },\n+                                    {\n+                                        \"description\": \"LZ4 compression\",\n+                                        \"displayName\": \"LZ4\",\n+                                        \"value\": \"LZ4\"\n+                                    },\n+                                    {\n+                                        \"description\": \"LZO compression - it assumes LD_LIBRARY_PATH has been set and jar is available\",\n+                                        \"displayName\": \"LZO\",\n+                                        \"value\": \"LZO\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Snappy compression\",\n+                                        \"displayName\": \"SNAPPY\",\n+                                        \"value\": \"SNAPPY\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Will attempt to automatically detect the compression codec.\",\n+                                        \"displayName\": \"AUTOMATIC\",\n+                                        \"value\": \"AUTOMATIC\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"NONE\",\n+                                \"description\": \"\",\n+                                \"displayName\": \"Compression codec\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Fetch Size\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Compression codec\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Max Wait Time\": {\n-                                \"defaultValue\": \"0 seconds\",\n-                                \"description\": \"The maximum amount of time allowed for a running SQL select query , zero means there is no limit. Max time less than 1 second will be equal to zero.\",\n-                                \"displayName\": \"Max Wait Time\",\n+                            \"Directory\": {\n+                                \"description\": \"The HDFS directory from which files should be read\",\n+                                \"displayName\": \"Directory\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Max Wait Time\",\n+                                \"name\": \"Directory\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Maximum-value Columns\": {\n-                                \"description\": \"A comma-separated list of column names. The processor will keep track of the maximum value for each column that has been returned since the processor started running. Using multiple columns implies an order to the column list, and each column's values are expected to increase more slowly than the previous columns' values. Thus, using multiple columns implies a hierarchical structure of columns, which is usually used for partitioning tables. This processor can be used to retrieve only those rows that have been added/updated since the last retrieval. Note that some JDBC types such as bit/boolean are not conducive to maintaining maximum value, so columns of these types should not be listed in this property, and will result in error(s) during processing. If no columns are provided, all rows from the table will be considered, which could have a performance impact. NOTE: It is important to use consistent max-value column names for a given table for incremental fetch to work properly.\",\n-                                \"displayName\": \"Maximum-value Columns\",\n+                            \"File Filter Regex\": {\n+                                \"description\": \"A Java Regular Expression for filtering Filenames; if a filter is supplied then only files whose names match that Regular Expression will be fetched, otherwise all files will be fetched\",\n+                                \"displayName\": \"File Filter Regex\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Maximum-value Columns\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"File Filter Regex\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Set Auto Commit\": {\n+                            \"Filter Match Name Only\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"true\",\n                                         \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"false\",\n                                         \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"description\": \"Allows enabling or disabling the auto commit functionality of the DB connection. Default value is 'No value set'. 'No value set' will leave the db connection's auto commit mode unchanged. For some JDBC drivers such as PostgreSQL driver, it is required to disable the auto commit functionality to get the 'Fetch Size' setting to take effect. When auto commit is enabled, PostgreSQL driver ignores 'Fetch Size' setting and loads all rows of the result set to memory at once. This could lead for a large amount of memory usage when executing queries which fetch large data sets. More Details of this behaviour in PostgreSQL driver can be found in https://jdbc.postgresql.org//documentation/head/query.html.\",\n-                                \"displayName\": \"Set Auto Commit\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Set Auto Commit\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Table Name\": {\n-                                \"description\": \"The name of the database table to be queried. When a custom query is used, this property is used to alias the query and appears as an attribute on the FlowFile.\",\n-                                \"displayName\": \"Table Name\",\n+                                \"defaultValue\": \"true\",\n+                                \"description\": \"If true then File Filter Regex will match on just the filename, otherwise subdirectory names will be included with filename in the regex comparison\",\n+                                \"displayName\": \"Filter Match Name Only\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Table Name\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Filter Match Name Only\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"db-fetch-db-type\": {\n+                            \"FlowFile Content\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Generates ANSI SQL\",\n-                                        \"displayName\": \"Generic\",\n-                                        \"value\": \"Generic\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Generates Oracle compliant SQL\",\n-                                        \"displayName\": \"Oracle\",\n-                                        \"value\": \"Oracle\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Generates Oracle compliant SQL for version 12 or greater\",\n-                                        \"displayName\": \"Oracle 12+\",\n-                                        \"value\": \"Oracle 12+\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Generates MS SQL Compatible SQL, for version 2012 or greater\",\n-                                        \"displayName\": \"MS SQL 2012+\",\n-                                        \"value\": \"MS SQL 2012+\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Generates MS SQL Compatible SQL for version 2008\",\n-                                        \"displayName\": \"MS SQL 2008\",\n-                                        \"value\": \"MS SQL 2008\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Generates MySQL compatible SQL\",\n-                                        \"displayName\": \"MySQL\",\n-                                        \"value\": \"MySQL\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Generates PostgreSQL compatible SQL\",\n-                                        \"displayName\": \"PostgreSQL\",\n-                                        \"value\": \"PostgreSQL\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"VALUE ONLY\",\n+                                        \"value\": \"VALUE ONLY\"\n                                     },\n                                     {\n-                                        \"description\": \"Generates Phoenix compliant SQL\",\n-                                        \"displayName\": \"Phoenix\",\n-                                        \"value\": \"Phoenix\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"KEY VALUE PAIR\",\n+                                        \"value\": \"KEY VALUE PAIR\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"Generic\",\n-                                \"description\": \"The type/flavor of database, used for generating database-specific code. In many cases the Generic type should suffice, but some databases (such as Oracle) require custom SQL clauses. \",\n-                                \"displayName\": \"Database Type\",\n+                                \"defaultValue\": \"VALUE ONLY\",\n+                                \"description\": \"Indicate if the content is to be both the key and value of the Sequence File, or just the value.\",\n+                                \"displayName\": \"FlowFile Content\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"db-fetch-db-type\",\n+                                \"name\": \"FlowFile Content\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"db-fetch-sql-query\": {\n-                                \"description\": \"A custom SQL query used to retrieve data. Instead of building a SQL query from other properties, this query will be wrapped as a sub-query. Query must have no ORDER BY statement.\",\n-                                \"displayName\": \"Custom Query\",\n+                            \"Hadoop Configuration Resources\": {\n+                                \"description\": \"A file or comma separated list of files which contains the Hadoop file system configuration. Without this, Hadoop will search the classpath for a 'core-site.xml' and 'hdfs-site.xml' file or will revert to a default configuration. To use swebhdfs, see 'Additional Details' section of PutHDFS's documentation.\",\n+                                \"displayName\": \"Hadoop Configuration Resources\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"db-fetch-sql-query\",\n+                                \"name\": \"Hadoop Configuration Resources\",\n                                 \"required\": false,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"MULTIPLE\",\n+                                    \"resourceTypes\": [\n+                                        \"FILE\"\n+                                    ]\n+                                },\n                                 \"sensitive\": false\n                             },\n-                            \"db-fetch-where-clause\": {\n-                                \"description\": \"A custom clause to be added in the WHERE condition when building SQL queries.\",\n-                                \"displayName\": \"Additional WHERE clause\",\n+                            \"IO Buffer Size\": {\n+                                \"description\": \"Amount of memory to use to buffer file contents during IO. This overrides the Hadoop Configuration\",\n+                                \"displayName\": \"IO Buffer Size\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"db-fetch-where-clause\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"IO Buffer Size\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"dbf-default-precision\": {\n-                                \"defaultValue\": \"10\",\n-                                \"description\": \"When a DECIMAL/NUMBER value is written as a 'decimal' Avro logical type, a specific 'precision' denoting number of available digits is required. Generally, precision is defined by column data type definition or database engines default. However undefined precision (0) can be returned from some database engines. 'Default Decimal Precision' is used when writing those undefined precision numbers.\",\n-                                \"displayName\": \"Default Decimal Precision\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"dbf-default-precision\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"dbf-default-scale\": {\n-                                \"defaultValue\": \"0\",\n-                                \"description\": \"When a DECIMAL/NUMBER value is written as a 'decimal' Avro logical type, a specific 'scale' denoting number of available decimal digits is required. Generally, scale is defined by column data type definition or database engines default. However when undefined precision (0) is returned, scale can also be uncertain with some database engines. 'Default Decimal Scale' is used when writing those undefined numbers. If a value has more decimals than specified scale, then the value will be rounded-up, e.g. 1.53 becomes 2 with scale 0, and 1.5 with scale 1.\",\n-                                \"displayName\": \"Default Decimal Scale\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"dbf-default-scale\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"dbf-user-logical-types\": {\n+                            \"Ignore Dotted Files\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"true\",\n                                         \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"false\",\n                                         \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"Whether to use Avro Logical Types for DECIMAL/NUMBER, DATE, TIME and TIMESTAMP columns. If disabled, written as string. If enabled, Logical types are used and written as its underlying type, specifically, DECIMAL/NUMBER as logical 'decimal': written as bytes with additional precision and scale meta data, DATE as logical 'date-millis': written as int denoting days since Unix epoch (1970-01-01), TIME as logical 'time-millis': written as int denoting milliseconds since Unix epoch, and TIMESTAMP as logical 'timestamp-millis': written as long denoting milliseconds since Unix epoch. If a reader of written Avro records also knows these logical types, then these values can be deserialized with more context depending on reader implementation.\",\n-                                \"displayName\": \"Use Avro Logical Types\",\n+                                \"defaultValue\": \"true\",\n+                                \"description\": \"If true, files whose names begin with a dot (\\\".\\\") will be ignored\",\n+                                \"displayName\": \"Ignore Dotted Files\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"dbf-user-logical-types\",\n+                                \"name\": \"Ignore Dotted Files\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"initial-load-strategy\": {\n+                            \"Keep Source File\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Loads all existing rows from the database table.\",\n-                                        \"displayName\": \"Start at Beginning\",\n-                                        \"value\": \"Start at Beginning\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n-                                        \"description\": \"Loads only the newly inserted or updated rows based on the maximum value(s) of the column(s) configured in the 'Maximum-value Columns' property.\",\n-                                        \"displayName\": \"Start at Current Maximum Values\",\n-                                        \"value\": \"Start at Current Maximum Values\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"Start at Beginning\",\n-                                \"description\": \"How to handle existing rows in the database table when the processor is started for the first time (or its state has been cleared). The property will be ignored, if any 'initial.maxvalue.*' dynamic property has also been configured.\",\n-                                \"displayName\": \"Initial Load Strategy\",\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"Determines whether to delete the file from HDFS after it has been successfully transferred. If true, the file will be fetched repeatedly. This is intended for testing only.\",\n+                                \"displayName\": \"Keep Source File\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"initial-load-strategy\",\n+                                \"name\": \"Keep Source File\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"qdbt-max-frags\": {\n-                                \"defaultValue\": \"0\",\n-                                \"description\": \"The maximum number of fragments. If the value specified is zero, then all fragments are returned. This prevents OutOfMemoryError when this processor ingests huge table. NOTE: Setting this property can result in data loss, as the incoming results are not ordered, and fragments may end at arbitrary boundaries where rows are not included in the result set.\",\n-                                \"displayName\": \"Maximum Number of Fragments\",\n+                            \"Kerberos Keytab\": {\n+                                \"description\": \"Kerberos keytab associated with the principal. Requires nifi.kerberos.krb5.file to be set in your nifi.properties\",\n+                                \"displayName\": \"Kerberos Keytab\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"qdbt-max-frags\",\n-                                \"required\": true,\n+                                \"name\": \"Kerberos Keytab\",\n+                                \"required\": false,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"SINGLE\",\n+                                    \"resourceTypes\": [\n+                                        \"FILE\"\n+                                    ]\n+                                },\n                                 \"sensitive\": false\n                             },\n-                            \"qdbt-max-rows\": {\n-                                \"defaultValue\": \"0\",\n-                                \"description\": \"The maximum number of result rows that will be included in a single FlowFile. This will allow you to break up very large result sets into multiple FlowFiles. If the value specified is zero, then all rows are returned in a single FlowFile.\",\n-                                \"displayName\": \"Max Rows Per Flow File\",\n+                            \"Kerberos Password\": {\n+                                \"description\": \"Kerberos password associated with the principal.\",\n+                                \"displayName\": \"Kerberos Password\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Kerberos Password\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n+                            },\n+                            \"Kerberos Principal\": {\n+                                \"description\": \"Kerberos principal to authenticate as. Requires nifi.kerberos.krb5.file to be set in your nifi.properties\",\n+                                \"displayName\": \"Kerberos Principal\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"qdbt-max-rows\",\n-                                \"required\": true,\n+                                \"name\": \"Kerberos Principal\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"qdbt-output-batch-size\": {\n-                                \"defaultValue\": \"0\",\n-                                \"description\": \"The number of output FlowFiles to queue before committing the process session. When set to zero, the session will be committed when all result set rows have been processed and the output FlowFiles are ready for transfer to the downstream relationship. For large result sets, this can cause a large burst of FlowFiles to be transferred at the end of processor execution. If this property is set, then when the specified number of FlowFiles are ready for transfer, then the session will be committed, thus releasing the FlowFiles to the downstream relationship. NOTE: The maxvalue.* and fragment.count attributes will not be set on FlowFiles when this property is set.\",\n-                                \"displayName\": \"Output Batch Size\",\n+                            \"Kerberos Relogin Period\": {\n+                                \"defaultValue\": \"4 hours\",\n+                                \"description\": \"Period of time which should pass before attempting a kerberos relogin.\\n\\nThis property has been deprecated, and has no effect on processing. Relogins now occur automatically.\",\n+                                \"displayName\": \"Kerberos Relogin Period\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"qdbt-output-batch-size\",\n+                                \"name\": \"Kerberos Relogin Period\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Maximum File Age\": {\n+                                \"description\": \"The maximum age that a file must be in order to be pulled; any file older than this amount of time (based on last modification date) will be ignored\",\n+                                \"displayName\": \"Maximum File Age\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Maximum File Age\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Minimum File Age\": {\n+                                \"defaultValue\": \"0 sec\",\n+                                \"description\": \"The minimum age that a file must be in order to be pulled; any file younger than this amount of time (based on last modification date) will be ignored\",\n+                                \"displayName\": \"Minimum File Age\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Minimum File Age\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"qdbtr-normalize\": {\n+                            \"Polling Interval\": {\n+                                \"defaultValue\": \"0 sec\",\n+                                \"description\": \"Indicates how long to wait between performing directory listings\",\n+                                \"displayName\": \"Polling Interval\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Polling Interval\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Recurse Subdirectories\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"true\",\n                                         \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"false\",\n                                         \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"Whether to change characters in column names when creating the output schema. For example, colons and periods will be changed to underscores.\",\n-                                \"displayName\": \"Normalize Table/Column Names\",\n+                                \"defaultValue\": \"true\",\n+                                \"description\": \"Indicates whether to pull files from subdirectories of the HDFS directory\",\n+                                \"displayName\": \"Recurse Subdirectories\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"qdbtr-normalize\",\n+                                \"name\": \"Recurse Subdirectories\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"qdbtr-record-writer\": {\n-                                \"description\": \"Specifies the Controller Service to use for writing results to a FlowFile. The Record Writer may use Inherit Schema to emulate the inferred schema behavior, i.e. an explicit schema need not be defined in the writer, and will be supplied by the same logic used to infer the schema from the column types.\",\n-                                \"displayName\": \"Record Writer\",\n+                            \"kerberos-credentials-service\": {\n+                                \"description\": \"Specifies the Kerberos Credentials Controller Service that should be used for authenticating with Kerberos\",\n+                                \"displayName\": \"Kerberos Credentials Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"qdbtr-record-writer\",\n-                                \"required\": true,\n+                                \"name\": \"kerberos-credentials-service\",\n+                                \"required\": false,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n                                     \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n+                                    \"type\": \"org.apache.nifi.kerberos.KerberosCredentialsService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"kerberos-user-service\": {\n+                                \"description\": \"Specifies the Kerberos User Controller Service that should be used for authenticating with Kerberos\",\n+                                \"displayName\": \"Kerberos User Service\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"kerberos-user-service\",\n+                                \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.kerberos.KerberosUserService\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             }\n                         },\n+                        \"restricted\": true,\n                         \"seeAlso\": [\n-                            \"org.apache.nifi.processors.standard.ExecuteSQL\",\n-                            \"org.apache.nifi.processors.standard.GenerateTableFetch\"\n+                            \"org.apache.nifi.processors.hadoop.PutHDFS\"\n                         ],\n                         \"sideEffectFree\": false,\n-                        \"stateful\": {\n-                            \"description\": \"After performing a query on the specified table, the maximum values for the specified column(s) will be retained for use in future executions of the query. This allows the Processor to fetch only those records that have max values greater than the retained values. This can be used for incremental fetching, fetching of newly added rows, etc. To clear the maximum values, clear the state of the processor per the State Management documentation\",\n-                            \"scopes\": [\n-                                \"CLUSTER\"\n-                            ]\n-                        },\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"Successfully created FlowFile from SQL query result set.\",\n+                                \"description\": \"All files retrieved from HDFS are transferred to this relationship\",\n                                 \"name\": \"success\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n                         \"supportsBatching\": false,\n-                        \"supportsDynamicProperties\": true,\n+                        \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"database\",\n-                            \"jdbc\",\n-                            \"query\",\n-                            \"record\",\n-                            \"select\",\n-                            \"sql\"\n+                            \"HCFS\",\n+                            \"HDFS\",\n+                            \"fetch\",\n+                            \"get\",\n+                            \"hadoop\",\n+                            \"ingest\",\n+                            \"sequence file\",\n+                            \"source\"\n                         ],\n-                        \"triggerSerially\": true,\n+                        \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.standard.QueryDatabaseTableRecord\",\n-                        \"typeDescription\": \"Generates a SQL select query, or uses a provided statement, and executes it to fetch all rows whose values in the specified Maximum Value column(s) are larger than the previously-seen maxima. Query result will be converted to the format specified by the record writer. Expression Language is supported for several properties, but no incoming connections are permitted. The Variable Registry may be used to provide values for any property containing Expression Language. If it is desired to leverage flow file attributes to perform these queries, the GenerateTableFetch and/or ExecuteSQL processors can be used for this purpose. Streaming is used so arbitrarily large result sets are supported. This processor can be scheduled to run on a timer or cron expression, using the standard scheduling methods. This processor is intended to be run on the Primary Node only. FlowFile attribute 'querydbtable.row.count' indicates how many rows were selected.\",\n+                        \"triggerWhenEmpty\": true,\n+                        \"type\": \"org.apache.nifi.processors.hadoop.GetHDFSSequenceFile\",\n+                        \"typeDescription\": \"Fetch sequence files from Hadoop Distributed File System (HDFS) into FlowFiles\",\n                         \"version\": \"1.27.0\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"Name of the table being queried\",\n-                                \"name\": \"tablename\"\n-                            },\n-                            {\n-                                \"description\": \"The number of rows selected by the query\",\n-                                \"name\": \"querydbtable.row.count\"\n-                            },\n-                            {\n-                                \"description\": \"If 'Max Rows Per Flow File' is set then all FlowFiles from the same query result set will have the same value for the fragment.identifier attribute. This can then be used to correlate the results.\",\n-                                \"name\": \"fragment.identifier\"\n-                            },\n-                            {\n-                                \"description\": \"If 'Max Rows Per Flow File' is set then this is the total number of  FlowFiles produced by a single ResultSet. This can be used in conjunction with the fragment.identifier attribute in order to know how many FlowFiles belonged to the same incoming ResultSet. If Output Batch Size is set, then this attribute will not be populated.\",\n-                                \"name\": \"fragment.count\"\n-                            },\n-                            {\n-                                \"description\": \"If 'Max Rows Per Flow File' is set then the position of this FlowFile in the list of outgoing FlowFiles that were all derived from the same result set FlowFile. This can be used in conjunction with the fragment.identifier attribute to know which FlowFiles originated from the same query result set and in what order  FlowFiles were produced\",\n-                                \"name\": \"fragment.index\"\n-                            },\n-                            {\n-                                \"description\": \"Each attribute contains the observed maximum value of a specified 'Maximum-value Column'. The suffix of the attribute is the name of the column. If Output Batch Size is set, then this attribute will not be populated.\",\n-                                \"name\": \"maxvalue.*\"\n-                            },\n-                            {\n-                                \"description\": \"Sets the mime.type attribute to the MIME Type specified by the Record Writer.\",\n-                                \"name\": \"mime.type\"\n+                                \"description\": \"The name of the file that was read from HDFS.\",\n+                                \"name\": \"filename\"\n                             },\n                             {\n-                                \"description\": \"The number of records output by the Record Writer.\",\n-                                \"name\": \"record.count\"\n+                                \"description\": \"The path is set to the relative path of the file's directory on HDFS. For example, if the Directory property is set to /tmp, then files picked up from /tmp will have the path attribute set to \\\"./\\\". If the Recurse Subdirectories property is set to true and a file is picked up from /tmp/abc/1/2/3, then the path attribute will be set to \\\"abc/1/2/3\\\".\",\n+                                \"name\": \"path\"\n                             }\n                         ]\n                     },\n                     {\n                         \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-standard-nar\",\n+                        \"artifact\": \"nifi-hadoop-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n-                            \"EVENT_DRIVEN\": 0,\n                             \"TIMER_DRIVEN\": 1\n                         },\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"0 sec\"\n+                            \"TIMER_DRIVEN\": \"1 min\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n-                        \"dynamicProperties\": [\n-                            {\n-                                \"description\": \"Each user-defined property specifies a SQL SELECT statement to run over the data, with the data that is selected being routed to the relationship whose name is the property name\",\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"name\": \"The name of the relationship to route data to\",\n-                                \"value\": \"A SQL SELECT statement that is used to determine what data should be routed to this relationship.\"\n-                            }\n-                        ],\n-                        \"dynamicRelationship\": {\n-                            \"description\": \"Each user-defined property defines a new Relationship for this Processor.\",\n-                            \"name\": \"<Property Name>\"\n-                        },\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_REQUIRED\",\n-                        \"primaryNodeOnly\": false,\n+                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n+                        \"primaryNodeOnly\": true,\n                         \"propertyDescriptors\": {\n-                            \"cache-schema\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"true\",\n-                                \"description\": \"This property is no longer used. It remains solely for backward compatibility in order to avoid making existing Processors invalid upon upgrade. This property will be removed in future versions. Now, instead of forcing the user to understand the semantics of schema caching, the Processor caches up to 25 schemas and automatically rolls off the old schemas. This provides the same performance when caching was enabled previously and in some cases very significant performance improvements if caching was previously disabled.\",\n-                                \"displayName\": \"Cache Schema\",\n+                            \"Additional Classpath Resources\": {\n+                                \"description\": \"A comma-separated list of paths to files and/or directories that will be added to the classpath and used for loading native libraries. When specifying a directory, all files with in the directory will be added to the classpath, but further sub-directories will not be included.\",\n+                                \"displayName\": \"Additional Classpath Resources\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"cache-schema\",\n-                                \"required\": true,\n+                                \"name\": \"Additional Classpath Resources\",\n+                                \"required\": false,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"MULTIPLE\",\n+                                    \"resourceTypes\": [\n+                                        \"DIRECTORY\",\n+                                        \"FILE\"\n+                                    ]\n+                                },\n                                 \"sensitive\": false\n                             },\n-                            \"dbf-default-precision\": {\n-                                \"defaultValue\": \"10\",\n-                                \"description\": \"When a DECIMAL/NUMBER value is written as a 'decimal' Avro logical type, a specific 'precision' denoting number of available digits is required. Generally, precision is defined by column data type definition or database engines default. However undefined precision (0) can be returned from some database engines. 'Default Decimal Precision' is used when writing those undefined precision numbers.\",\n-                                \"displayName\": \"Default Decimal Precision\",\n+                            \"Directory\": {\n+                                \"description\": \"The HDFS directory from which files should be read\",\n+                                \"displayName\": \"Directory\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"dbf-default-precision\",\n+                                \"name\": \"Directory\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"dbf-default-scale\": {\n-                                \"defaultValue\": \"0\",\n-                                \"description\": \"When a DECIMAL/NUMBER value is written as a 'decimal' Avro logical type, a specific 'scale' denoting number of available decimal digits is required. Generally, scale is defined by column data type definition or database engines default. However when undefined precision (0) is returned, scale can also be uncertain with some database engines. 'Default Decimal Scale' is used when writing those undefined numbers. If a value has more decimals than specified scale, then the value will be rounded-up, e.g. 1.53 becomes 2 with scale 0, and 1.5 with scale 1.\",\n-                                \"displayName\": \"Default Decimal Scale\",\n+                            \"File Filter\": {\n+                                \"defaultValue\": \"[^\\\\.].*\",\n+                                \"description\": \"Only files whose names match the given regular expression will be picked up\",\n+                                \"displayName\": \"File Filter\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"dbf-default-scale\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"File Filter\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"include-zero-record-flowfiles\": {\n+                            \"Hadoop Configuration Resources\": {\n+                                \"description\": \"A file or comma separated list of files which contains the Hadoop file system configuration. Without this, Hadoop will search the classpath for a 'core-site.xml' and 'hdfs-site.xml' file or will revert to a default configuration. To use swebhdfs, see 'Additional Details' section of PutHDFS's documentation.\",\n+                                \"displayName\": \"Hadoop Configuration Resources\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Hadoop Configuration Resources\",\n+                                \"required\": false,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"MULTIPLE\",\n+                                    \"resourceTypes\": [\n+                                        \"FILE\"\n+                                    ]\n+                                },\n+                                \"sensitive\": false\n+                            },\n+                            \"Kerberos Keytab\": {\n+                                \"description\": \"Kerberos keytab associated with the principal. Requires nifi.kerberos.krb5.file to be set in your nifi.properties\",\n+                                \"displayName\": \"Kerberos Keytab\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Kerberos Keytab\",\n+                                \"required\": false,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"SINGLE\",\n+                                    \"resourceTypes\": [\n+                                        \"FILE\"\n+                                    ]\n+                                },\n+                                \"sensitive\": false\n+                            },\n+                            \"Kerberos Password\": {\n+                                \"description\": \"Kerberos password associated with the principal.\",\n+                                \"displayName\": \"Kerberos Password\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Kerberos Password\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n+                            },\n+                            \"Kerberos Principal\": {\n+                                \"description\": \"Kerberos principal to authenticate as. Requires nifi.kerberos.krb5.file to be set in your nifi.properties\",\n+                                \"displayName\": \"Kerberos Principal\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Kerberos Principal\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Kerberos Relogin Period\": {\n+                                \"defaultValue\": \"4 hours\",\n+                                \"description\": \"Period of time which should pass before attempting a kerberos relogin.\\n\\nThis property has been deprecated, and has no effect on processing. Relogins now occur automatically.\",\n+                                \"displayName\": \"Kerberos Relogin Period\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Kerberos Relogin Period\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Recurse Subdirectories\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"true\",\n                                         \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"false\",\n                                         \"value\": \"false\"\n                                     }\n                                 ],\n                                 \"defaultValue\": \"true\",\n-                                \"description\": \"When running the SQL statement against an incoming FlowFile, if the result has no data, this property specifies whether or not a FlowFile will be sent to the corresponding relationship\",\n-                                \"displayName\": \"Include Zero Record FlowFiles\",\n+                                \"description\": \"Indicates whether to list files from subdirectories of the HDFS directory\",\n+                                \"displayName\": \"Recurse Subdirectories\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"include-zero-record-flowfiles\",\n+                                \"name\": \"Recurse Subdirectories\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"record-reader\": {\n-                                \"description\": \"Specifies the Controller Service to use for parsing incoming data and determining the data's schema\",\n-                                \"displayName\": \"Record Reader\",\n+                            \"file-filter-mode\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"Filtering will be applied to the names of directories and files.  If Recurse Subdirectories is set to true, only subdirectories with a matching name will be searched for files that match the regular expression defined in File Filter.\",\n+                                        \"displayName\": \"Directories and Files\",\n+                                        \"value\": \"filter-mode-directories-and-files\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Filtering will only be applied to the names of files.  If Recurse Subdirectories is set to true, the entire subdirectory tree will be searched for files that match the regular expression defined in File Filter.\",\n+                                        \"displayName\": \"Files Only\",\n+                                        \"value\": \"filter-mode-files-only\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Filtering will be applied by evaluating the regular expression defined in File Filter against the full path of files with and without the scheme and authority.  If Recurse Subdirectories is set to true, the entire subdirectory tree will be searched for files in which the full path of the file matches the regular expression defined in File Filter.  See 'Additional Details' for more information.\",\n+                                        \"displayName\": \"Full Path\",\n+                                        \"value\": \"filter-mode-full-path\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"filter-mode-directories-and-files\",\n+                                \"description\": \"Determines how the regular expression in  File Filter will be used when retrieving listings.\",\n+                                \"displayName\": \"File Filter Mode\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"record-reader\",\n+                                \"name\": \"file-filter-mode\",\n                                 \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"kerberos-credentials-service\": {\n+                                \"description\": \"Specifies the Kerberos Credentials Controller Service that should be used for authenticating with Kerberos\",\n+                                \"displayName\": \"Kerberos Credentials Service\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"kerberos-credentials-service\",\n+                                \"required\": false,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n                                     \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n+                                    \"type\": \"org.apache.nifi.kerberos.KerberosCredentialsService\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             },\n-                            \"record-writer\": {\n-                                \"description\": \"Specifies the Controller Service to use for writing results to a FlowFile\",\n-                                \"displayName\": \"Record Writer\",\n+                            \"kerberos-user-service\": {\n+                                \"description\": \"Specifies the Kerberos User Controller Service that should be used for authenticating with Kerberos\",\n+                                \"displayName\": \"Kerberos User Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"record-writer\",\n-                                \"required\": true,\n+                                \"name\": \"kerberos-user-service\",\n+                                \"required\": false,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n                                     \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n+                                    \"type\": \"org.apache.nifi.kerberos.KerberosUserService\",\n                                     \"version\": \"1.27.0\"\n                                 }\n-                            }\n-                        },\n-                        \"sideEffectFree\": true,\n-                        \"supportedRelationships\": [\n-                            {\n-                                \"description\": \"If a FlowFile fails processing for any reason (for example, the SQL statement contains columns not present in input data), the original FlowFile it will be routed to this relationship\",\n-                                \"name\": \"failure\"\n-                            },\n-                            {\n-                                \"description\": \"The original FlowFile is routed to this relationship\",\n-                                \"name\": \"original\"\n-                            }\n-                        ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\",\n-                            \"EVENT_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": true,\n-                        \"supportsDynamicProperties\": true,\n-                        \"supportsDynamicRelationships\": true,\n-                        \"supportsEventDriven\": true,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"aggregate\",\n-                            \"avro\",\n-                            \"calcite\",\n-                            \"csv\",\n-                            \"etl\",\n-                            \"filter\",\n-                            \"json\",\n-                            \"logs\",\n-                            \"modify\",\n-                            \"query\",\n-                            \"record\",\n-                            \"route\",\n-                            \"select\",\n-                            \"sql\",\n-                            \"text\",\n-                            \"transform\",\n-                            \"update\"\n-                        ],\n-                        \"triggerSerially\": false,\n-                        \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.standard.QueryRecord\",\n-                        \"typeDescription\": \"Evaluates one or more SQL queries against the contents of a FlowFile. The result of the SQL query then becomes the content of the output FlowFile. This can be used, for example, for field-specific filtering, transformation, and row-level filtering. Columns can be renamed, simple calculations and aggregations performed, etc. The Processor is configured with a Record Reader Controller Service and a Record Writer service so as to allow flexibility in incoming and outgoing data formats. The Processor must be configured with at least one user-defined property. The name of the Property is the Relationship to route data to, and the value of the Property is a SQL SELECT statement that is used to specify how input data should be transformed/filtered. The SQL statement must be valid ANSI SQL and is powered by Apache Calcite. If the transformation fails, the original FlowFile is routed to the 'failure' relationship. Otherwise, the data selected will be routed to the associated relationship. If the Record Writer chooses to inherit the schema from the Record, it is important to note that the schema that is inherited will be from the ResultSet, rather than the input Record. This allows a single instance of the QueryRecord processor to have multiple queries, each of which returns a different set of columns and aggregations. As a result, though, the schema that is derived will have no schema name, so it is important that the configured Record Writer not attempt to write the Schema Name as an attribute if inheriting the Schema from the Record. See the Processor Usage documentation for more information.\",\n-                        \"version\": \"1.27.0\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"Sets the mime.type attribute to the MIME Type specified by the Record Writer\",\n-                                \"name\": \"mime.type\"\n                             },\n-                            {\n-                                \"description\": \"The number of records selected by the query\",\n-                                \"name\": \"record.count\"\n+                            \"maximum-file-age\": {\n+                                \"description\": \"The maximum age that a file must be in order to be pulled; any file older than this amount of time (based on last modification date) will be ignored. Minimum value is 100ms.\",\n+                                \"displayName\": \"Maximum File Age\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"maximum-file-age\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n                             },\n-                            {\n-                                \"description\": \"The relation to which the FlowFile was routed\",\n-                                \"name\": \"QueryRecord.Route\"\n-                            }\n-                        ]\n-                    },\n-                    {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-standard-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"e0c4461\"\n-                        },\n-                        \"defaultBulletinLevel\": \"WARN\",\n-                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": 1,\n-                            \"TIMER_DRIVEN\": 1\n-                        },\n-                        \"defaultPenaltyDuration\": \"30 sec\",\n-                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"0 sec\"\n-                        },\n-                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n-                        \"defaultYieldDuration\": \"1 sec\",\n-                        \"dynamicProperties\": [\n-                            {\n-                                \"description\": \"Allows users to specify fields to remove that match the RecordPath.\",\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"name\": \"(Ignored)\",\n-                                \"value\": \"A RecordPath to the field to be removed.\"\n-                            }\n-                        ],\n-                        \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_REQUIRED\",\n-                        \"primaryNodeOnly\": false,\n-                        \"propertyDescriptors\": {\n-                            \"record-reader\": {\n-                                \"description\": \"Specifies the Controller Service to use for reading incoming data\",\n-                                \"displayName\": \"Record Reader\",\n+                            \"minimum-file-age\": {\n+                                \"description\": \"The minimum age that a file must be in order to be pulled; any file younger than this amount of time (based on last modification date) will be ignored\",\n+                                \"displayName\": \"Minimum File Age\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"record-reader\",\n-                                \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n+                                \"name\": \"minimum-file-age\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n                             },\n                             \"record-writer\": {\n-                                \"description\": \"Specifies the Controller Service to use for writing out the records\",\n+                                \"description\": \"Specifies the Record Writer to use for creating the listing. If not specified, one FlowFile will be created for each entity that is listed. If the Record Writer is specified, all entities will be written to a single FlowFile.\",\n                                 \"displayName\": \"Record Writer\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n                                 \"name\": \"record-writer\",\n-                                \"required\": true,\n+                                \"required\": false,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n                                     \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n                                     \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             }\n                         },\n                         \"seeAlso\": [\n-                            \"org.apache.nifi.processors.standard.UpdateRecord\"\n+                            \"org.apache.nifi.processors.hadoop.FetchHDFS\",\n+                            \"org.apache.nifi.processors.hadoop.GetHDFS\",\n+                            \"org.apache.nifi.processors.hadoop.PutHDFS\"\n                         ],\n-                        \"sideEffectFree\": true,\n+                        \"sideEffectFree\": false,\n+                        \"stateful\": {\n+                            \"description\": \"After performing a listing of HDFS files, the latest timestamp of all the files listed is stored. This allows the Processor to list only files that have been added or modified after this date the next time that the Processor is run, without having to store all of the actual filenames/paths which could lead to performance problems. State is stored across the cluster so that this Processor can be run on Primary Node only and if a new Primary Node is selected, the new node can pick up where the previous node left off, without duplicating the data.\",\n+                            \"scopes\": [\n+                                \"CLUSTER\"\n+                            ]\n+                        },\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"FlowFiles that are successfully transformed will be routed to this relationship\",\n+                                \"description\": \"All FlowFiles are transferred to this relationship\",\n                                 \"name\": \"success\"\n-                            },\n-                            {\n-                                \"description\": \"If a FlowFile cannot be transformed from the configured input format to the configured output format, the unchanged FlowFile will be routed to this relationship\",\n-                                \"name\": \"failure\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n-                        \"supportsBatching\": true,\n-                        \"supportsDynamicProperties\": true,\n+                        \"supportsBatching\": false,\n+                        \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"avro\",\n-                            \"csv\",\n-                            \"delete\",\n-                            \"freeform\",\n-                            \"generic\",\n-                            \"json\",\n-                            \"record\",\n-                            \"remove\",\n-                            \"schema\",\n-                            \"text\",\n-                            \"update\"\n+                            \"HCFS\",\n+                            \"HDFS\",\n+                            \"filesystem\",\n+                            \"get\",\n+                            \"hadoop\",\n+                            \"ingest\",\n+                            \"list\",\n+                            \"source\"\n                         ],\n-                        \"triggerSerially\": false,\n+                        \"triggerSerially\": true,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.standard.RemoveRecordField\",\n-                        \"typeDescription\": \"Modifies the contents of a FlowFile that contains Record-oriented data (i.e. data that can be read via a RecordReader and written by a RecordWriter) by removing selected fields. This Processor requires that at least one user-defined Property be added. The name of the property is ignored by the processor, but could be a meaningful identifier for the user. The value of the property should indicate a RecordPath that determines the field to be removed. The processor executes the removal in the order in which these properties are added to the processor. Set the \\\"Record Writer\\\" to \\\"Inherit Record Schema\\\" in order to use the updated Record Schema modified when removing Fields.\",\n+                        \"triggerWhenEmpty\": true,\n+                        \"type\": \"org.apache.nifi.processors.hadoop.ListHDFS\",\n+                        \"typeDescription\": \"Retrieves a listing of files from HDFS. For each file that is listed in HDFS, this processor creates a FlowFile that represents the HDFS file to be fetched in conjunction with FetchHDFS. This Processor is designed to run on Primary Node only in a cluster. If the primary node changes, the new Primary Node will pick up where the previous node left off without duplicating all of the data. Unlike GetHDFS, this Processor does not delete any data from HDFS.\",\n                         \"version\": \"1.27.0\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"This attribute provides on failure the error message encountered by the Reader or Writer.\",\n-                                \"name\": \"record.error.message\"\n+                                \"description\": \"The name of the file that was read from HDFS.\",\n+                                \"name\": \"filename\"\n+                            },\n+                            {\n+                                \"description\": \"The path is set to the absolute path of the file's directory on HDFS. For example, if the Directory property is set to /tmp, then files picked up from /tmp will have the path attribute set to \\\"./\\\". If the Recurse Subdirectories property is set to true and a file is picked up from /tmp/abc/1/2/3, then the path attribute will be set to \\\"/tmp/abc/1/2/3\\\".\",\n+                                \"name\": \"path\"\n+                            },\n+                            {\n+                                \"description\": \"The user that owns the file in HDFS\",\n+                                \"name\": \"hdfs.owner\"\n+                            },\n+                            {\n+                                \"description\": \"The group that owns the file in HDFS\",\n+                                \"name\": \"hdfs.group\"\n+                            },\n+                            {\n+                                \"description\": \"The timestamp of when the file in HDFS was last modified, as milliseconds since midnight Jan 1, 1970 UTC\",\n+                                \"name\": \"hdfs.lastModified\"\n+                            },\n+                            {\n+                                \"description\": \"The number of bytes in the file in HDFS\",\n+                                \"name\": \"hdfs.length\"\n+                            },\n+                            {\n+                                \"description\": \"The number of HDFS replicas for hte file\",\n+                                \"name\": \"hdfs.replication\"\n+                            },\n+                            {\n+                                \"description\": \"The permissions for the file in HDFS. This is formatted as 3 characters for the owner, 3 for the group, and 3 for other users. For example rw-rw-r--\",\n+                                \"name\": \"hdfs.permissions\"\n                             }\n                         ]\n                     },\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-standard-nar\",\n+                        \"artifact\": \"nifi-hadoop-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n-                            \"EVENT_DRIVEN\": 0,\n                             \"TIMER_DRIVEN\": 1\n                         },\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n+                        \"explicitRestrictions\": [\n+                            {\n+                                \"explanation\": \"Provides operator the ability to retrieve any file that NiFi has access to in HDFS or the local filesystem.\",\n+                                \"requiredPermission\": \"read distributed filesystem\"\n+                            },\n+                            {\n+                                \"explanation\": \"Provides operator the ability to delete any file that NiFi has access to in HDFS or the local filesystem.\",\n+                                \"requiredPermission\": \"write distributed filesystem\"\n+                            }\n+                        ],\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_REQUIRED\",\n+                        \"inputRequirement\": \"INPUT_ALLOWED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Character Set\": {\n-                                \"defaultValue\": \"UTF-8\",\n-                                \"description\": \"The Character Set in which the file is encoded\",\n-                                \"displayName\": \"Character Set\",\n+                            \"Additional Classpath Resources\": {\n+                                \"description\": \"A comma-separated list of paths to files and/or directories that will be added to the classpath and used for loading native libraries. When specifying a directory, all files with in the directory will be added to the classpath, but further sub-directories will not be included.\",\n+                                \"displayName\": \"Additional Classpath Resources\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Character Set\",\n-                                \"required\": true,\n+                                \"name\": \"Additional Classpath Resources\",\n+                                \"required\": false,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"MULTIPLE\",\n+                                    \"resourceTypes\": [\n+                                        \"DIRECTORY\",\n+                                        \"FILE\"\n+                                    ]\n+                                },\n                                 \"sensitive\": false\n                             },\n-                            \"Evaluation Mode\": {\n+                            \"Conflict Resolution Strategy\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Line-by-Line\",\n-                                        \"value\": \"Line-by-Line\"\n+                                        \"description\": \"Replaces the existing file if any.\",\n+                                        \"displayName\": \"replace\",\n+                                        \"value\": \"replace\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Entire text\",\n-                                        \"value\": \"Entire text\"\n+                                        \"description\": \"Failed rename operation stops processing and routes to success.\",\n+                                        \"displayName\": \"ignore\",\n+                                        \"value\": \"ignore\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Failing to rename a file routes to failure.\",\n+                                        \"displayName\": \"fail\",\n+                                        \"value\": \"fail\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"Line-by-Line\",\n-                                \"description\": \"Run the 'Replacement Strategy' against each line separately (Line-by-Line) or buffer the entire file into memory (Entire Text) and run against that.\",\n-                                \"displayName\": \"Evaluation Mode\",\n+                                \"defaultValue\": \"fail\",\n+                                \"description\": \"Indicates what should happen when a file with the same name already exists in the output directory\",\n+                                \"displayName\": \"Conflict Resolution Strategy\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Evaluation Mode\",\n+                                \"name\": \"Conflict Resolution Strategy\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Line-by-Line Evaluation Mode\": {\n+                            \"File Filter Regex\": {\n+                                \"description\": \"A Java Regular Expression for filtering Filenames; if a filter is supplied then only files whose names match that Regular Expression will be fetched, otherwise all files will be fetched\",\n+                                \"displayName\": \"File Filter Regex\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"File Filter Regex\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"HDFS Operation\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"All\",\n-                                        \"value\": \"All\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"First-Line\",\n-                                        \"value\": \"First-Line\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Last-Line\",\n-                                        \"value\": \"Last-Line\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"Except-First-Line\",\n-                                        \"value\": \"Except-First-Line\"\n+                                        \"displayName\": \"move\",\n+                                        \"value\": \"move\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"Except-Last-Line\",\n-                                        \"value\": \"Except-Last-Line\"\n+                                        \"displayName\": \"copy\",\n+                                        \"value\": \"copy\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"All\",\n-                                \"description\": \"Run the 'Replacement Strategy' against each line separately (Line-by-Line) for all lines in the FlowFile, First Line (Header) alone, Last Line (Footer) alone, Except the First Line (Header) or Except the Last Line (Footer).\",\n-                                \"displayName\": \"Line-by-Line Evaluation Mode\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Line-by-Line Evaluation Mode\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Maximum Buffer Size\": {\n-                                \"defaultValue\": \"1 MB\",\n-                                \"description\": \"Specifies the maximum amount of data to buffer (per file or per line, depending on the Evaluation Mode) in order to apply the replacement. If 'Entire Text' (in Evaluation Mode) is selected and the FlowFile is larger than this value, the FlowFile will be routed to 'failure'. In 'Line-by-Line' Mode, if a single line is larger than this value, the FlowFile will be routed to 'failure'. A default value of 1 MB is provided, primarily for 'Entire Text' mode. In 'Line-by-Line' Mode, a value such as 8 KB or 16 KB is suggested. This value is ignored if the <Replacement Strategy> property is set to one of: Append, Prepend, Always Replace\",\n-                                \"displayName\": \"Maximum Buffer Size\",\n+                                \"defaultValue\": \"move\",\n+                                \"description\": \"The operation that will be performed on the source file\",\n+                                \"displayName\": \"HDFS Operation\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Maximum Buffer Size\",\n+                                \"name\": \"HDFS Operation\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Regular Expression\": {\n-                                \"defaultValue\": \"(?s)(^.*$)\",\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"Regex Replace\",\n-                                            \"Literal Replace\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Replacement Strategy\",\n-                                        \"propertyName\": \"Replacement Strategy\"\n-                                    }\n-                                ],\n-                                \"description\": \"The Search Value to search for in the FlowFile content. Only used for 'Literal Replace' and 'Regex Replace' matching strategies\",\n-                                \"displayName\": \"Search Value\",\n+                            \"Hadoop Configuration Resources\": {\n+                                \"description\": \"A file or comma separated list of files which contains the Hadoop file system configuration. Without this, Hadoop will search the classpath for a 'core-site.xml' and 'hdfs-site.xml' file or will revert to a default configuration. To use swebhdfs, see 'Additional Details' section of PutHDFS's documentation.\",\n+                                \"displayName\": \"Hadoop Configuration Resources\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Regular Expression\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Hadoop Configuration Resources\",\n+                                \"required\": false,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"MULTIPLE\",\n+                                    \"resourceTypes\": [\n+                                        \"FILE\"\n+                                    ]\n+                                },\n                                 \"sensitive\": false\n                             },\n-                            \"Replacement Strategy\": {\n+                            \"Ignore Dotted Files\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Insert the Replacement Value at the beginning of the FlowFile or the beginning of each line (depending on the Evaluation Mode). For \\\"Line-by-Line\\\" Evaluation Mode, the value will be prepended to each line. Similarly, for \\\"First-Line\\\", \\\"Last-Line\\\", \\\"Except-Last-Line\\\" and \\\"Except-First-Line\\\" Evaluation Modes,the value will be prepended to header alone, footer alone, all lines except header and all lines except footer respectively. For \\\"Entire Text\\\" evaluation mode,the value will be prepended to the entire text.\",\n-                                        \"displayName\": \"Prepend\",\n-                                        \"value\": \"Prepend\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Insert the Replacement Value at the end of the FlowFile or the end of each line (depending on the Evaluation Mode). For \\\"Line-by-Line\\\" Evaluation Mode, the value will be appended to each line. Similarly, for \\\"First-Line\\\", \\\"Last-Line\\\", \\\"Except-Last-Line\\\" and \\\"Except-First-Line\\\" Evaluation Modes,the value will be appended to header alone, footer alone, all lines except header and all lines except footer respectively. For \\\"Entire Text\\\" evaluation mode,the value will be appended to the entire text.\",\n-                                        \"displayName\": \"Append\",\n-                                        \"value\": \"Append\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Prepends text before the start of the FlowFile (or the start of each line, depending on the configuration of the Evaluation Mode property) as well as appending text to the end of the FlowFile (or the end of each line, depending on the configuration of the Evaluation Mode property)\",\n-                                        \"displayName\": \"Surround\",\n-                                        \"value\": \"Surround\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Interpret the Search Value as a Regular Expression and replace all matches with the Replacement Value. The Replacement Value may reference Capturing Groups used in the Search Value by using a dollar-sign followed by the Capturing Group number, such as $1 or $2. If the Search Value is set to .* then everything is replaced without even evaluating the Regular Expression.\",\n-                                        \"displayName\": \"Regex Replace\",\n-                                        \"value\": \"Regex Replace\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Search for all instances of the Search Value and replace the matches with the Replacement Value.\",\n-                                        \"displayName\": \"Literal Replace\",\n-                                        \"value\": \"Literal Replace\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Always replaces the entire line or the entire contents of the FlowFile (depending on the value of the <Evaluation Mode> property) and does not bother searching for any value. When this strategy is chosen, the <Search Value> property is ignored.\",\n-                                        \"displayName\": \"Always Replace\",\n-                                        \"value\": \"Always Replace\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n-                                        \"description\": \"Substitute variable references (specified in ${var} form) using FlowFile attributes for looking up the replacement value by variable name. When this strategy is chosen, both the <Search Value> and <Replacement Value> properties are ignored.\",\n-                                        \"displayName\": \"Substitute Variables\",\n-                                        \"value\": \"Substitute Variables\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"Regex Replace\",\n-                                \"description\": \"The strategy for how and what to replace within the FlowFile's text content.\",\n-                                \"displayName\": \"Replacement Strategy\",\n+                                \"defaultValue\": \"true\",\n+                                \"description\": \"If true, files whose names begin with a dot (\\\".\\\") will be ignored\",\n+                                \"displayName\": \"Ignore Dotted Files\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Replacement Strategy\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Replacement Value\": {\n-                                \"defaultValue\": \"$1\",\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"Prepend\",\n-                                            \"Regex Replace\",\n-                                            \"Always Replace\",\n-                                            \"Append\",\n-                                            \"Literal Replace\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Replacement Strategy\",\n-                                        \"propertyName\": \"Replacement Strategy\"\n-                                    }\n-                                ],\n-                                \"description\": \"The value to insert using the 'Replacement Strategy'. Using \\\"Regex Replace\\\" back-references to Regular Expression capturing groups are supported, but back-references that reference capturing groups that do not exist in the regular expression will be treated as literal value. Back References may also be referenced using the Expression Language, as '$1', '$2', etc. The single-tick marks MUST be included, as these variables are not \\\"Standard\\\" attribute names (attribute names must be quoted unless they contain only numbers, letters, and _).\",\n-                                \"displayName\": \"Replacement Value\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Replacement Value\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Text to Append\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"Surround\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Replacement Strategy\",\n-                                        \"propertyName\": \"Replacement Strategy\"\n-                                    }\n-                                ],\n-                                \"description\": \"The text to append to the end of the FlowFile, or each line, depending on teh configured value of the Evaluation Mode property\",\n-                                \"displayName\": \"Text to Append\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Text to Append\",\n+                                \"name\": \"Ignore Dotted Files\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Text to Prepend\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"Surround\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Replacement Strategy\",\n-                                        \"propertyName\": \"Replacement Strategy\"\n-                                    }\n-                                ],\n-                                \"description\": \"The text to prepend to the start of the FlowFile, or each line, depending on teh configured value of the Evaluation Mode property\",\n-                                \"displayName\": \"Text to Prepend\",\n+                            \"Input Directory or File\": {\n+                                \"defaultValue\": \"${path}\",\n+                                \"description\": \"The HDFS directory from which files should be read, or a single file to read.\",\n+                                \"displayName\": \"Input Directory or File\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Text to Prepend\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            }\n-                        },\n-                        \"sideEffectFree\": true,\n-                        \"supportedRelationships\": [\n-                            {\n-                                \"description\": \"FlowFiles that have been successfully processed are routed to this relationship. This includes both FlowFiles that had text replaced and those that did not.\",\n-                                \"name\": \"success\"\n-                            },\n-                            {\n-                                \"description\": \"FlowFiles that could not be updated are routed to this relationship\",\n-                                \"name\": \"failure\"\n-                            }\n-                        ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\",\n-                            \"EVENT_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": true,\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": true,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"systemResourceConsiderations\": [\n-                            {\n-                                \"description\": \"An instance of this component can cause high usage of this system resource.  Multiple instances or high concurrency settings may result a degradation of performance.\",\n-                                \"resource\": \"MEMORY\"\n-                            }\n-                        ],\n-                        \"tags\": [\n-                            \"Change\",\n-                            \"Modify\",\n-                            \"Regex\",\n-                            \"Regular Expression\",\n-                            \"Replace\",\n-                            \"Text\",\n-                            \"Update\"\n-                        ],\n-                        \"triggerSerially\": false,\n-                        \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.standard.ReplaceText\",\n-                        \"typeDescription\": \"Updates the content of a FlowFile by searching for some textual value in the FlowFile content (via Regular Expression/regex, or literal value) and replacing the section of the content that matches with some alternate value. It can also be used to append or prepend text to the contents of a FlowFile.\",\n-                        \"version\": \"1.27.0\"\n-                    },\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-standard-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"e0c4461\"\n-                        },\n-                        \"defaultBulletinLevel\": \"WARN\",\n-                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": 1,\n-                            \"EVENT_DRIVEN\": 0,\n-                            \"TIMER_DRIVEN\": 1\n-                        },\n-                        \"defaultPenaltyDuration\": \"30 sec\",\n-                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"0 sec\"\n-                        },\n-                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n-                        \"defaultYieldDuration\": \"1 sec\",\n-                        \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_REQUIRED\",\n-                        \"primaryNodeOnly\": false,\n-                        \"propertyDescriptors\": {\n-                            \"Character Set\": {\n-                                \"defaultValue\": \"UTF-8\",\n-                                \"description\": \"The Character Set in which the file is encoded\",\n-                                \"displayName\": \"Character Set\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Character Set\",\n+                                \"name\": \"Input Directory or File\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Mapping File\": {\n-                                \"description\": \"The name of the file (including the full path) containing the Mappings.\",\n-                                \"displayName\": \"Mapping File\",\n+                            \"Kerberos Keytab\": {\n+                                \"description\": \"Kerberos keytab associated with the principal. Requires nifi.kerberos.krb5.file to be set in your nifi.properties\",\n+                                \"displayName\": \"Kerberos Keytab\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Mapping File\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Kerberos Keytab\",\n+                                \"required\": false,\n                                 \"resourceDefinition\": {\n                                     \"cardinality\": \"SINGLE\",\n                                     \"resourceTypes\": [\n                                         \"FILE\"\n                                     ]\n                                 },\n                                 \"sensitive\": false\n                             },\n-                            \"Mapping File Refresh Interval\": {\n-                                \"defaultValue\": \"60s\",\n-                                \"description\": \"The polling interval to check for updates to the mapping file. The default is 60s.\",\n-                                \"displayName\": \"Mapping File Refresh Interval\",\n+                            \"Kerberos Password\": {\n+                                \"description\": \"Kerberos password associated with the principal.\",\n+                                \"displayName\": \"Kerberos Password\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Mapping File Refresh Interval\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n+                                \"name\": \"Kerberos Password\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n                             },\n-                            \"Matching Group\": {\n-                                \"defaultValue\": \"0\",\n-                                \"description\": \"The number of the matching group of the provided regex to replace with the corresponding value from the mapping file (if it exists).\",\n-                                \"displayName\": \"Matching Group\",\n+                            \"Kerberos Principal\": {\n+                                \"description\": \"Kerberos principal to authenticate as. Requires nifi.kerberos.krb5.file to be set in your nifi.properties\",\n+                                \"displayName\": \"Kerberos Principal\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Matching Group\",\n-                                \"required\": true,\n+                                \"name\": \"Kerberos Principal\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Maximum Buffer Size\": {\n-                                \"defaultValue\": \"1 MB\",\n-                                \"description\": \"Specifies the maximum amount of data to buffer (per file) in order to apply the regular expressions. If a FlowFile is larger than this value, the FlowFile will be routed to 'failure'\",\n-                                \"displayName\": \"Maximum Buffer Size\",\n+                            \"Kerberos Relogin Period\": {\n+                                \"defaultValue\": \"4 hours\",\n+                                \"description\": \"Period of time which should pass before attempting a kerberos relogin.\\n\\nThis property has been deprecated, and has no effect on processing. Relogins now occur automatically.\",\n+                                \"displayName\": \"Kerberos Relogin Period\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Maximum Buffer Size\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Kerberos Relogin Period\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Regular Expression\": {\n-                                \"defaultValue\": \"\\\\S+\",\n-                                \"description\": \"The Regular Expression to search for in the FlowFile content\",\n-                                \"displayName\": \"Regular Expression\",\n+                            \"Output Directory\": {\n+                                \"description\": \"The HDFS directory where the files will be moved to\",\n+                                \"displayName\": \"Output Directory\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Regular Expression\",\n+                                \"name\": \"Output Directory\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n-                            }\n-                        },\n-                        \"sideEffectFree\": true,\n-                        \"supportedRelationships\": [\n-                            {\n-                                \"description\": \"FlowFiles that have been successfully updated are routed to this relationship, as well as FlowFiles whose content does not match the given Regular Expression\",\n-                                \"name\": \"success\"\n                             },\n-                            {\n-                                \"description\": \"FlowFiles that could not be updated are routed to this relationship\",\n-                                \"name\": \"failure\"\n-                            }\n-                        ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\",\n-                            \"EVENT_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": true,\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": true,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"Change\",\n-                            \"Mapping\",\n-                            \"Modify\",\n-                            \"Regex\",\n-                            \"Regular Expression\",\n-                            \"Replace\",\n-                            \"Text\",\n-                            \"Update\"\n-                        ],\n-                        \"triggerSerially\": false,\n-                        \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.standard.ReplaceTextWithMapping\",\n-                        \"typeDescription\": \"Updates the content of a FlowFile by evaluating a Regular Expression against it and replacing the section of the content that matches the Regular Expression with some alternate value provided in a mapping file.\",\n-                        \"version\": \"1.27.0\"\n-                    },\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-standard-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"e0c4461\"\n-                        },\n-                        \"defaultBulletinLevel\": \"WARN\",\n-                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": 1,\n-                            \"TIMER_DRIVEN\": 1\n-                        },\n-                        \"defaultPenaltyDuration\": \"30 sec\",\n-                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"0 sec\"\n-                        },\n-                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n-                        \"defaultYieldDuration\": \"1 sec\",\n-                        \"dynamicProperties\": [\n-                            {\n-                                \"description\": \"One or more dynamic properties can be used to add attributes to FlowFiles passed to the 'retries_exceeded' relationship\",\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"name\": \"Exceeded FlowFile Attribute Key\",\n-                                \"value\": \"The value of the attribute added to the FlowFile\"\n-                            }\n-                        ],\n-                        \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_REQUIRED\",\n-                        \"primaryNodeOnly\": false,\n-                        \"propertyDescriptors\": {\n-                            \"Fail on Non-numerical Overwrite\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"If the FlowFile already has the attribute defined in 'Retry Attribute' that is *not* a number, fail the FlowFile instead of resetting that value to '1'\",\n-                                \"displayName\": \"Fail on Non-numerical Overwrite\",\n+                            \"Remote Group\": {\n+                                \"description\": \"Changes the group of the HDFS file to this value after it is written. This only works if NiFi is running as a user that has HDFS super user privilege to change group\",\n+                                \"displayName\": \"Remote Group\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Fail on Non-numerical Overwrite\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"maximum-retries\": {\n-                                \"defaultValue\": \"3\",\n-                                \"description\": \"The maximum number of times a FlowFile can be retried before being passed to the 'retries_exceeded' relationship\",\n-                                \"displayName\": \"Maximum Retries\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"maximum-retries\",\n-                                \"required\": true,\n+                                \"name\": \"Remote Group\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"penalize-retries\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"true\",\n-                                \"description\": \"If set to 'true', this Processor will penalize input FlowFiles before passing them to the 'retry' relationship. This does not apply to the 'retries_exceeded' relationship.\",\n-                                \"displayName\": \"Penalize Retries\",\n+                            \"Remote Owner\": {\n+                                \"description\": \"Changes the owner of the HDFS file to this value after it is written. This only works if NiFi is running as a user that has HDFS super user privilege to change owner\",\n+                                \"displayName\": \"Remote Owner\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"penalize-retries\",\n-                                \"required\": true,\n+                                \"name\": \"Remote Owner\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"retry-attribute\": {\n-                                \"defaultValue\": \"flowfile.retries\",\n-                                \"description\": \"The name of the attribute that contains the current retry count for the FlowFile. WARNING: If the name matches an attribute already on the FlowFile that does not contain a numerical value, the processor will either overwrite that attribute with '1' or fail based on configuration.\",\n-                                \"displayName\": \"Retry Attribute\",\n+                            \"kerberos-credentials-service\": {\n+                                \"description\": \"Specifies the Kerberos Credentials Controller Service that should be used for authenticating with Kerberos\",\n+                                \"displayName\": \"Kerberos Credentials Service\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"retry-attribute\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"kerberos-credentials-service\",\n+                                \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.kerberos.KerberosCredentialsService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n                             },\n-                            \"reuse-mode\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"If the RetryFlowFile's UUID does not match the FlowFile's retry UUID, fail the FlowFile regardless of current retry count\",\n-                                        \"displayName\": \"Fail on Reuse\",\n-                                        \"value\": \"fail\"\n-                                    },\n-                                    {\n-                                        \"description\": \"If the RetryFlowFile's UUID does not match the FlowFile's retry UUID, log a warning message before resetting the retry attribute and UUID for this instance\",\n-                                        \"displayName\": \"Warn on Reuse\",\n-                                        \"value\": \"warn\"\n-                                    },\n-                                    {\n-                                        \"description\": \"If the RetryFlowFile's UUID does not match the FlowFile's retry UUID, log a debug message before resetting the retry attribute and UUID for this instance\",\n-                                        \"displayName\": \"Reset Reuse\",\n-                                        \"value\": \"reset\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"fail\",\n-                                \"description\": \"Defines how the Processor behaves if the retry FlowFile has a different retry UUID than the instance that received the FlowFile. This generally means that the attribute was not reset after being successfully retried by a previous instance of this processor.\",\n-                                \"displayName\": \"Reuse Mode\",\n+                            \"kerberos-user-service\": {\n+                                \"description\": \"Specifies the Kerberos User Controller Service that should be used for authenticating with Kerberos\",\n+                                \"displayName\": \"Kerberos User Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"reuse-mode\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n+                                \"name\": \"kerberos-user-service\",\n+                                \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.kerberos.KerberosUserService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n                             }\n                         },\n                         \"readsAttributes\": [\n                             {\n-                                \"description\": \"Will read the attribute or attribute expression language result as defined in 'Retry Attribute'\",\n-                                \"name\": \"Retry Attribute\"\n+                                \"description\": \"The name of the file written to HDFS comes from the value of this attribute.\",\n+                                \"name\": \"filename\"\n                             }\n                         ],\n-                        \"sideEffectFree\": true,\n+                        \"restricted\": true,\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.processors.hadoop.GetHDFS\",\n+                            \"org.apache.nifi.processors.hadoop.PutHDFS\"\n+                        ],\n+                        \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"Input FlowFile has exceeded the configured maximum retry count, do not pass this relationship back to the input Processor to terminate the limited feedback loop.\",\n-                                \"name\": \"retries_exceeded\"\n-                            },\n-                            {\n-                                \"description\": \"Input FlowFile has not exceeded the configured maximum retry count, pass this relationship back to the input Processor to create a limited feedback loop.\",\n-                                \"name\": \"retry\"\n+                                \"description\": \"Files that have been successfully renamed on HDFS are transferred to this relationship\",\n+                                \"name\": \"success\"\n                             },\n                             {\n-                                \"description\": \"The processor is configured such that a non-numerical value on 'Retry Attribute' results in a failure instead of resetting that value to '1'. This will immediately terminate the limited feedback loop. Might also include when 'Maximum Retries' contains attribute expression language that does not resolve to an Integer.\",\n+                                \"description\": \"Files that could not be renamed on HDFS are transferred to this relationship\",\n                                 \"name\": \"failure\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n-                        \"supportsBatching\": true,\n-                        \"supportsDynamicProperties\": true,\n+                        \"supportsBatching\": false,\n+                        \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"FlowFile\",\n-                            \"Retry\"\n+                            \"HCFS\",\n+                            \"HDFS\",\n+                            \"filesystem\",\n+                            \"hadoop\",\n+                            \"move\",\n+                            \"moveHDFS\",\n+                            \"put\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.standard.RetryFlowFile\",\n-                        \"typeDescription\": \"FlowFiles passed to this Processor have a 'Retry Attribute' value checked against a configured 'Maximum Retries' value. If the current attribute value is below the configured maximum, the FlowFile is passed to a retry relationship. The FlowFile may or may not be penalized in that condition. If the FlowFile's attribute value exceeds the configured maximum, the FlowFile will be passed to a 'retries_exceeded' relationship. WARNING: If the incoming FlowFile has a non-numeric value in the configured 'Retry Attribute' attribute, it will be reset to '1'. You may choose to fail the FlowFile instead of performing the reset. Additional dynamic properties can be defined for any attributes you wish to add to the FlowFiles transferred to 'retries_exceeded'. These attributes support attribute expression language.\",\n+                        \"type\": \"org.apache.nifi.processors.hadoop.MoveHDFS\",\n+                        \"typeDescription\": \"Rename existing files or a directory of files (non-recursive) on Hadoop Distributed File System (HDFS).\",\n                         \"version\": \"1.27.0\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"User defined retry attribute is updated with the current retry count\",\n-                                \"name\": \"Retry Attribute\"\n+                                \"description\": \"The name of the file written to HDFS is stored in this attribute.\",\n+                                \"name\": \"filename\"\n                             },\n                             {\n-                                \"description\": \"User defined retry attribute with .uuid that determines what processor retried the FlowFile last\",\n-                                \"name\": \"Retry Attribute .uuid\"\n+                                \"description\": \"The absolute path to the file on HDFS is stored in this attribute.\",\n+                                \"name\": \"absolute.hdfs.path\"\n+                            },\n+                            {\n+                                \"description\": \"The hadoop url for the file is stored in this attribute.\",\n+                                \"name\": \"hadoop.file.url\"\n                             }\n                         ]\n                     },\n                     {\n                         \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-standard-nar\",\n+                        \"artifact\": \"nifi-hadoop-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n-                            \"EVENT_DRIVEN\": 0,\n                             \"TIMER_DRIVEN\": 1\n                         },\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n-                        \"dynamicProperties\": [\n+                        \"explicitRestrictions\": [\n                             {\n-                                \"description\": \"Routes FlowFiles whose attributes match the Attribute Expression Language specified in the Dynamic Property Value to the Relationship specified in the Dynamic Property Key\",\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"name\": \"Relationship Name\",\n-                                \"value\": \"Attribute Expression Language\"\n+                                \"explanation\": \"Provides operator the ability to delete any file that NiFi has access to in HDFS or the local filesystem.\",\n+                                \"requiredPermission\": \"write distributed filesystem\"\n                             }\n                         ],\n-                        \"dynamicRelationship\": {\n-                            \"description\": \"FlowFiles that match the Dynamic Property's Attribute Expression Language\",\n-                            \"name\": \"Name from Dynamic Property\"\n-                        },\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Routing Strategy\": {\n+                            \"Additional Classpath Resources\": {\n+                                \"description\": \"A comma-separated list of paths to files and/or directories that will be added to the classpath and used for loading native libraries. When specifying a directory, all files with in the directory will be added to the classpath, but further sub-directories will not be included.\",\n+                                \"displayName\": \"Additional Classpath Resources\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Additional Classpath Resources\",\n+                                \"required\": false,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"MULTIPLE\",\n+                                    \"resourceTypes\": [\n+                                        \"DIRECTORY\",\n+                                        \"FILE\"\n+                                    ]\n+                                },\n+                                \"sensitive\": false\n+                            },\n+                            \"Append Mode\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"A copy of the FlowFile will be routed to each relationship whose corresponding expression evaluates to 'true'\",\n-                                        \"displayName\": \"Route to Property name\",\n-                                        \"value\": \"Route to Property name\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"DEFAULT\",\n+                                        \"value\": \"DEFAULT\"\n                                     },\n                                     {\n-                                        \"description\": \"Requires that all user-defined expressions evaluate to 'true' for the FlowFile to be considered a match\",\n-                                        \"displayName\": \"Route to 'matched' if all match\",\n-                                        \"value\": \"Route to 'match' if all match\"\n-                                    },\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"AVRO\",\n+                                        \"value\": \"AVRO\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"DEFAULT\",\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"Requires that at least one user-defined expression evaluate to 'true' for the FlowFile to be considered a match\",\n-                                        \"displayName\": \"Route to 'matched' if any matches\",\n-                                        \"value\": \"Route to 'match' if any matches\"\n+                                        \"dependentValues\": [\n+                                            \"append\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Conflict Resolution Strategy\",\n+                                        \"propertyName\": \"Conflict Resolution Strategy\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"Route to Property name\",\n-                                \"description\": \"Specifies how to determine which relationship to use when evaluating the Expression Language\",\n-                                \"displayName\": \"Routing Strategy\",\n+                                \"description\": \"Defines the append strategy to use when the Conflict Resolution Strategy is set to 'append'.\",\n+                                \"displayName\": \"Append Mode\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Routing Strategy\",\n+                                \"name\": \"Append Mode\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n-                            }\n-                        },\n-                        \"sideEffectFree\": true,\n-                        \"supportedRelationships\": [\n-                            {\n-                                \"description\": \"FlowFiles that do not match any user-define expression will be routed here\",\n-                                \"name\": \"unmatched\"\n-                            }\n-                        ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\",\n-                            \"EVENT_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": true,\n-                        \"supportsDynamicProperties\": true,\n-                        \"supportsDynamicRelationships\": true,\n-                        \"supportsEventDriven\": true,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"Attribute Expression Language\",\n-                            \"Expression Language\",\n-                            \"Regular Expression\",\n-                            \"attributes\",\n-                            \"detect\",\n-                            \"filter\",\n-                            \"find\",\n-                            \"regex\",\n-                            \"regexp\",\n-                            \"routing\",\n-                            \"search\",\n-                            \"string\",\n-                            \"text\"\n-                        ],\n-                        \"triggerSerially\": false,\n-                        \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.standard.RouteOnAttribute\",\n-                        \"typeDescription\": \"Routes FlowFiles based on their Attributes using the Attribute Expression Language\",\n-                        \"version\": \"1.27.0\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"The relation to which the FlowFile was routed\",\n-                                \"name\": \"RouteOnAttribute.Route\"\n-                            }\n-                        ]\n-                    },\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-standard-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"e0c4461\"\n-                        },\n-                        \"defaultBulletinLevel\": \"WARN\",\n-                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": 1,\n-                            \"EVENT_DRIVEN\": 0,\n-                            \"TIMER_DRIVEN\": 1\n-                        },\n-                        \"defaultPenaltyDuration\": \"30 sec\",\n-                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"0 sec\"\n-                        },\n-                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n-                        \"defaultYieldDuration\": \"1 sec\",\n-                        \"dynamicProperties\": [\n-                            {\n-                                \"description\": \"Routes FlowFiles whose content matches the regular expression defined by Dynamic Property's value to the Relationship defined by the Dynamic Property's key\",\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"name\": \"Relationship Name\",\n-                                \"value\": \"A Regular Expression\"\n-                            }\n-                        ],\n-                        \"dynamicRelationship\": {\n-                            \"description\": \"FlowFiles that match the Dynamic Property's Regular Expression\",\n-                            \"name\": \"Name from Dynamic Property\"\n-                        },\n-                        \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_REQUIRED\",\n-                        \"primaryNodeOnly\": false,\n-                        \"propertyDescriptors\": {\n-                            \"Character Set\": {\n-                                \"defaultValue\": \"UTF-8\",\n-                                \"description\": \"The Character Set in which the file is encoded\",\n-                                \"displayName\": \"Character Set\",\n+                            },\n+                            \"Block Size\": {\n+                                \"description\": \"Size of each block as written to HDFS. This overrides the Hadoop Configuration\",\n+                                \"displayName\": \"Block Size\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Character Set\",\n-                                \"required\": true,\n+                                \"name\": \"Block Size\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Content Buffer Size\": {\n-                                \"defaultValue\": \"1 MB\",\n-                                \"description\": \"Specifies the maximum amount of data to buffer in order to apply the regular expressions. If the size of the FlowFile exceeds this value, any amount of this value will be ignored\",\n-                                \"displayName\": \"Content Buffer Size\",\n+                            \"Compression codec\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"No compression\",\n+                                        \"displayName\": \"NONE\",\n+                                        \"value\": \"NONE\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Default ZLIB compression\",\n+                                        \"displayName\": \"DEFAULT\",\n+                                        \"value\": \"DEFAULT\"\n+                                    },\n+                                    {\n+                                        \"description\": \"BZIP compression\",\n+                                        \"displayName\": \"BZIP\",\n+                                        \"value\": \"BZIP\"\n+                                    },\n+                                    {\n+                                        \"description\": \"GZIP compression\",\n+                                        \"displayName\": \"GZIP\",\n+                                        \"value\": \"GZIP\"\n+                                    },\n+                                    {\n+                                        \"description\": \"LZ4 compression\",\n+                                        \"displayName\": \"LZ4\",\n+                                        \"value\": \"LZ4\"\n+                                    },\n+                                    {\n+                                        \"description\": \"LZO compression - it assumes LD_LIBRARY_PATH has been set and jar is available\",\n+                                        \"displayName\": \"LZO\",\n+                                        \"value\": \"LZO\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Snappy compression\",\n+                                        \"displayName\": \"SNAPPY\",\n+                                        \"value\": \"SNAPPY\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Will attempt to automatically detect the compression codec.\",\n+                                        \"displayName\": \"AUTOMATIC\",\n+                                        \"value\": \"AUTOMATIC\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"NONE\",\n+                                \"description\": \"\",\n+                                \"displayName\": \"Compression codec\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Content Buffer Size\",\n+                                \"name\": \"Compression codec\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Match Requirement\": {\n+                            \"Conflict Resolution Strategy\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"content must match exactly\",\n-                                        \"value\": \"content must match exactly\"\n+                                        \"description\": \"Replaces the existing file if any.\",\n+                                        \"displayName\": \"replace\",\n+                                        \"value\": \"replace\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"content must contain match\",\n-                                        \"value\": \"content must contain match\"\n+                                        \"description\": \"Ignores the flow file and routes it to success.\",\n+                                        \"displayName\": \"ignore\",\n+                                        \"value\": \"ignore\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Penalizes the flow file and routes it to failure.\",\n+                                        \"displayName\": \"fail\",\n+                                        \"value\": \"fail\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Appends to the existing file if any, creates a new file otherwise.\",\n+                                        \"displayName\": \"append\",\n+                                        \"value\": \"append\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"content must match exactly\",\n-                                \"description\": \"Specifies whether the entire content of the file must match the regular expression exactly, or if any part of the file (up to Content Buffer Size) can contain the regular expression in order to be considered a match\",\n-                                \"displayName\": \"Match Requirement\",\n+                                \"defaultValue\": \"fail\",\n+                                \"description\": \"Indicates what should happen when a file with the same name already exists in the output directory\",\n+                                \"displayName\": \"Conflict Resolution Strategy\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Match Requirement\",\n+                                \"name\": \"Conflict Resolution Strategy\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n-                            }\n-                        },\n-                        \"sideEffectFree\": true,\n-                        \"supportedRelationships\": [\n-                            {\n-                                \"description\": \"FlowFiles that do not match any of the user-supplied regular expressions will be routed to this relationship\",\n-                                \"name\": \"unmatched\"\n-                            }\n-                        ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\",\n-                            \"EVENT_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": true,\n-                        \"supportsDynamicProperties\": true,\n-                        \"supportsDynamicRelationships\": true,\n-                        \"supportsEventDriven\": true,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"content\",\n-                            \"detect\",\n-                            \"filter\",\n-                            \"find\",\n-                            \"regex\",\n-                            \"regexp\",\n-                            \"regular expression\",\n-                            \"route\",\n-                            \"search\",\n-                            \"string\",\n-                            \"text\"\n-                        ],\n-                        \"triggerSerially\": false,\n-                        \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.standard.RouteOnContent\",\n-                        \"typeDescription\": \"Applies Regular Expressions to the content of a FlowFile and routes a copy of the FlowFile to each destination whose Regular Expression matches. Regular Expressions are added as User-Defined Properties where the name of the property is the name of the relationship and the value is a Regular Expression to match against the FlowFile content. User-Defined properties do support the Attribute Expression Language, but the results are interpreted as literal values, not Regular Expressions\",\n-                        \"version\": \"1.27.0\"\n-                    },\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-standard-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"e0c4461\"\n-                        },\n-                        \"defaultBulletinLevel\": \"WARN\",\n-                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": 1,\n-                            \"EVENT_DRIVEN\": 0,\n-                            \"TIMER_DRIVEN\": 1\n-                        },\n-                        \"defaultPenaltyDuration\": \"30 sec\",\n-                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"0 sec\"\n-                        },\n-                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n-                        \"defaultYieldDuration\": \"1 sec\",\n-                        \"dynamicProperties\": [\n-                            {\n-                                \"description\": \"Routes data that matches the value specified in the Dynamic Property Value to the Relationship specified in the Dynamic Property Key.\",\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"name\": \"Relationship Name\",\n-                                \"value\": \"value to match against\"\n-                            }\n-                        ],\n-                        \"dynamicRelationship\": {\n-                            \"description\": \"FlowFiles that match the Dynamic Property's value\",\n-                            \"name\": \"Name from Dynamic Property\"\n-                        },\n-                        \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_REQUIRED\",\n-                        \"primaryNodeOnly\": false,\n-                        \"propertyDescriptors\": {\n-                            \"Character Set\": {\n-                                \"defaultValue\": \"UTF-8\",\n-                                \"description\": \"The Character Set in which the incoming text is encoded\",\n-                                \"displayName\": \"Character Set\",\n+                            },\n+                            \"Directory\": {\n+                                \"description\": \"The parent HDFS directory to which files should be written. The directory will be created if it doesn't exist.\",\n+                                \"displayName\": \"Directory\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Character Set\",\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Directory\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Grouping Regular Expression\": {\n-                                \"description\": \"Specifies a Regular Expression to evaluate against each line to determine which Group the line should be placed in. The Regular Expression must have at least one Capturing Group that defines the line's Group. If multiple Capturing Groups exist in the Regular Expression, the values from all Capturing Groups will be concatenated together. Two lines will not be placed into the same FlowFile unless they both have the same value for the Group (or neither line matches the Regular Expression). For example, to group together all lines in a CSV File by the first column, we can set this value to \\\"(.*?),.*\\\". Two lines that have the same Group but different Relationships will never be placed into the same FlowFile.\",\n-                                \"displayName\": \"Grouping Regular Expression\",\n+                            \"Hadoop Configuration Resources\": {\n+                                \"description\": \"A file or comma separated list of files which contains the Hadoop file system configuration. Without this, Hadoop will search the classpath for a 'core-site.xml' and 'hdfs-site.xml' file or will revert to a default configuration. To use swebhdfs, see 'Additional Details' section of PutHDFS's documentation.\",\n+                                \"displayName\": \"Hadoop Configuration Resources\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Hadoop Configuration Resources\",\n+                                \"required\": false,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"MULTIPLE\",\n+                                    \"resourceTypes\": [\n+                                        \"FILE\"\n+                                    ]\n+                                },\n+                                \"sensitive\": false\n+                            },\n+                            \"IO Buffer Size\": {\n+                                \"description\": \"Amount of memory to use to buffer file contents during IO. This overrides the Hadoop Configuration\",\n+                                \"displayName\": \"IO Buffer Size\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Grouping Regular Expression\",\n+                                \"name\": \"IO Buffer Size\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Ignore Case\": {\n+                            \"Ignore Locality\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"true\",\n                                         \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"false\",\n                                         \"value\": \"false\"\n                                     }\n                                 ],\n                                 \"defaultValue\": \"false\",\n-                                \"description\": \"If true, capitalization will not be taken into account when comparing values. E.g., matching against 'HELLO' or 'hello' will have the same result. This property is ignored if the 'Matching Strategy' is set to 'Satisfies Expression'.\",\n-                                \"displayName\": \"Ignore Case\",\n+                                \"description\": \"Directs the HDFS system to ignore locality rules so that data is distributed randomly throughout the cluster\",\n+                                \"displayName\": \"Ignore Locality\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Ignore Case\",\n-                                \"required\": true,\n+                                \"name\": \"Ignore Locality\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Ignore Leading/Trailing Whitespace\": {\n-                                \"defaultValue\": \"true\",\n-                                \"description\": \"Indicates whether or not the whitespace at the beginning and end of the lines should be ignored when evaluating the line.\",\n-                                \"displayName\": \"Ignore Leading/Trailing Whitespace\",\n+                            \"Kerberos Keytab\": {\n+                                \"description\": \"Kerberos keytab associated with the principal. Requires nifi.kerberos.krb5.file to be set in your nifi.properties\",\n+                                \"displayName\": \"Kerberos Keytab\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Kerberos Keytab\",\n+                                \"required\": false,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"SINGLE\",\n+                                    \"resourceTypes\": [\n+                                        \"FILE\"\n+                                    ]\n+                                },\n+                                \"sensitive\": false\n+                            },\n+                            \"Kerberos Password\": {\n+                                \"description\": \"Kerberos password associated with the principal.\",\n+                                \"displayName\": \"Kerberos Password\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Ignore Leading/Trailing Whitespace\",\n-                                \"required\": true,\n+                                \"name\": \"Kerberos Password\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n+                            },\n+                            \"Kerberos Principal\": {\n+                                \"description\": \"Kerberos principal to authenticate as. Requires nifi.kerberos.krb5.file to be set in your nifi.properties\",\n+                                \"displayName\": \"Kerberos Principal\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Kerberos Principal\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Matching Strategy\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"Match lines based on whether or not the the text satisfies the given Expression Language expression. I.e., the line will match if the property value, evaluated as an Expression, returns true. The expression is able to reference FlowFile Attributes, as well as the variables 'line' (which is the text of the line to evaluate) and 'lineNo' (which is the line number being evaluated. This will be 1 for the first line, 2 for the second and so on).\",\n-                                        \"displayName\": \"Satisfies Expression\",\n-                                        \"value\": \"Satisfies Expression\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Match lines based on whether the line starts with the property value\",\n-                                        \"displayName\": \"Starts With\",\n-                                        \"value\": \"Starts With\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Match lines based on whether the line ends with the property value\",\n-                                        \"displayName\": \"Ends With\",\n-                                        \"value\": \"Ends With\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Match lines based on whether the line contains the property value\",\n-                                        \"displayName\": \"Contains\",\n-                                        \"value\": \"Contains\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Match lines based on whether the line equals the property value\",\n-                                        \"displayName\": \"Equals\",\n-                                        \"value\": \"Equals\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Match lines based on whether the line exactly matches the Regular Expression that is provided as the Property value\",\n-                                        \"displayName\": \"Matches Regular Expression\",\n-                                        \"value\": \"Matches Regular Expression\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Match lines based on whether the line contains some text that matches the Regular Expression that is provided as the Property value\",\n-                                        \"displayName\": \"Contains Regular Expression\",\n-                                        \"value\": \"Contains Regular Expression\"\n-                                    }\n-                                ],\n-                                \"description\": \"Specifies how to evaluate each line of incoming text against the user-defined properties.\",\n-                                \"displayName\": \"Matching Strategy\",\n+                            \"Kerberos Relogin Period\": {\n+                                \"defaultValue\": \"4 hours\",\n+                                \"description\": \"Period of time which should pass before attempting a kerberos relogin.\\n\\nThis property has been deprecated, and has no effect on processing. Relogins now occur automatically.\",\n+                                \"displayName\": \"Kerberos Relogin Period\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Kerberos Relogin Period\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Permissions umask\": {\n+                                \"description\": \"A umask represented as an octal number which determines the permissions of files written to HDFS. This overrides the Hadoop property \\\"fs.permissions.umask-mode\\\".  If this property and \\\"fs.permissions.umask-mode\\\" are undefined, the Hadoop default \\\"022\\\" will be used.  If the PutHDFS target folder has a default ACL defined, the umask property is ignored by HDFS.\",\n+                                \"displayName\": \"Permissions umask\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Matching Strategy\",\n-                                \"required\": true,\n+                                \"name\": \"Permissions umask\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Routing Strategy\": {\n+                            \"Remote Group\": {\n+                                \"description\": \"Changes the group of the HDFS file to this value after it is written. This only works if NiFi is running as a user that has HDFS super user privilege to change group\",\n+                                \"displayName\": \"Remote Group\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Remote Group\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Remote Owner\": {\n+                                \"description\": \"Changes the owner of the HDFS file to this value after it is written. This only works if NiFi is running as a user that has HDFS super user privilege to change owner\",\n+                                \"displayName\": \"Remote Owner\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Remote Owner\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Replication\": {\n+                                \"description\": \"Number of times that HDFS will replicate each file. This overrides the Hadoop Configuration\",\n+                                \"displayName\": \"Replication\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Replication\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"kerberos-credentials-service\": {\n+                                \"description\": \"Specifies the Kerberos Credentials Controller Service that should be used for authenticating with Kerberos\",\n+                                \"displayName\": \"Kerberos Credentials Service\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"kerberos-credentials-service\",\n+                                \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.kerberos.KerberosCredentialsService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"kerberos-user-service\": {\n+                                \"description\": \"Specifies the Kerberos User Controller Service that should be used for authenticating with Kerberos\",\n+                                \"displayName\": \"Kerberos User Service\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"kerberos-user-service\",\n+                                \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.kerberos.KerberosUserService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"writing-strategy\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Lines will be routed to each relationship whose corresponding expression evaluates to 'true'\",\n-                                        \"displayName\": \"Route to each matching Property Name\",\n-                                        \"value\": \"Route to each matching Property Name\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Requires that all user-defined expressions evaluate to 'true' for the line to be considered a match\",\n-                                        \"displayName\": \"Route to 'matched' if line matches all conditions\",\n-                                        \"value\": \"Route to 'matched' if line matches all conditions\"\n+                                        \"description\": \"The processor writes FlowFile data into a temporary file and renames it after completion. This prevents other processes from reading partially written files.\",\n+                                        \"displayName\": \"Write and rename\",\n+                                        \"value\": \"writeAndRename\"\n                                     },\n                                     {\n-                                        \"description\": \"Requires that at least one user-defined expression evaluate to 'true' for the line to be considered a match\",\n-                                        \"displayName\": \"Route to 'matched' if lines matches any condition\",\n-                                        \"value\": \"Route to 'matched' if lines matches any condition\"\n+                                        \"description\": \"The processor writes FlowFile data directly to the destination file. In some cases this might cause reading partially written files.\",\n+                                        \"displayName\": \"Simple write\",\n+                                        \"value\": \"simpleWrite\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"Route to each matching Property Name\",\n-                                \"description\": \"Specifies how to determine which Relationship(s) to use when evaluating the lines of incoming text against the 'Matching Strategy' and user-defined properties.\",\n-                                \"displayName\": \"Routing Strategy\",\n+                                \"defaultValue\": \"writeAndRename\",\n+                                \"description\": \"Defines the approach for writing the FlowFile data.\",\n+                                \"displayName\": \"Writing Strategy\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Routing Strategy\",\n+                                \"name\": \"writing-strategy\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             }\n                         },\n-                        \"sideEffectFree\": true,\n+                        \"readsAttributes\": [\n+                            {\n+                                \"description\": \"The name of the file written to HDFS comes from the value of this attribute.\",\n+                                \"name\": \"filename\"\n+                            }\n+                        ],\n+                        \"restricted\": true,\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.processors.hadoop.GetHDFS\"\n+                        ],\n+                        \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"The original input file will be routed to this destination when the lines have been successfully routed to 1 or more relationships\",\n-                                \"name\": \"original\"\n+                                \"description\": \"Files that have been successfully written to HDFS are transferred to this relationship\",\n+                                \"name\": \"success\"\n                             },\n                             {\n-                                \"description\": \"Data that does not satisfy the required user-defined rules will be routed to this Relationship\",\n-                                \"name\": \"unmatched\"\n+                                \"description\": \"Files that could not be written to HDFS for some reason are transferred to this relationship\",\n+                                \"name\": \"failure\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\",\n-                            \"EVENT_DRIVEN\"\n+                            \"CRON_DRIVEN\"\n                         ],\n-                        \"supportsBatching\": true,\n-                        \"supportsDynamicProperties\": true,\n-                        \"supportsDynamicRelationships\": true,\n-                        \"supportsEventDriven\": true,\n+                        \"supportsBatching\": false,\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicRelationships\": false,\n+                        \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"Expression Language\",\n-                            \"Regular Expression\",\n-                            \"attributes\",\n-                            \"csv\",\n-                            \"delimited\",\n-                            \"detect\",\n-                            \"filter\",\n-                            \"find\",\n-                            \"logs\",\n-                            \"regex\",\n-                            \"regexp\",\n-                            \"routing\",\n-                            \"search\",\n-                            \"string\",\n-                            \"text\"\n+                            \"HCFS\",\n+                            \"HDFS\",\n+                            \"copy\",\n+                            \"filesystem\",\n+                            \"hadoop\",\n+                            \"put\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.standard.RouteText\",\n-                        \"typeDescription\": \"Routes textual data based on a set of user-defined rules. Each line in an incoming FlowFile is compared against the values specified by user-defined Properties. The mechanism by which the text is compared to these user-defined properties is defined by the 'Matching Strategy'. The data is then routed according to these rules, routing each line of the text individually.\",\n+                        \"type\": \"org.apache.nifi.processors.hadoop.PutHDFS\",\n+                        \"typeDescription\": \"Write FlowFile data to Hadoop Distributed File System (HDFS)\",\n                         \"version\": \"1.27.0\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"The name of the relationship to which the FlowFile was routed.\",\n-                                \"name\": \"RouteText.Route\"\n+                                \"description\": \"The name of the file written to HDFS is stored in this attribute.\",\n+                                \"name\": \"filename\"\n                             },\n                             {\n-                                \"description\": \"The value captured by all capturing groups in the 'Grouping Regular Expression' property. If this property is not set or contains no capturing groups, this attribute will not be added.\",\n-                                \"name\": \"RouteText.Group\"\n+                                \"description\": \"The absolute path to the file on HDFS is stored in this attribute.\",\n+                                \"name\": \"absolute.hdfs.path\"\n+                            },\n+                            {\n+                                \"description\": \"The hadoop url for the file is stored in this attribute.\",\n+                                \"name\": \"hadoop.file.url\"\n+                            },\n+                            {\n+                                \"description\": \"The result(true/false) indicates if the folder is created by the processor.\",\n+                                \"name\": \"target.dir.created\"\n                             }\n                         ]\n                     },\n                     {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-standard-nar\",\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-hadoop-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n-                            \"EVENT_DRIVEN\": 0,\n                             \"TIMER_DRIVEN\": 1\n                         },\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_REQUIRED\",\n+                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"record-reader\": {\n-                                \"description\": \"Specifies the Controller Service to use for parsing incoming data and determining the data's schema\",\n-                                \"displayName\": \"Record Reader\",\n+                            \"Additional Classpath Resources\": {\n+                                \"description\": \"A comma-separated list of paths to files and/or directories that will be added to the classpath and used for loading native libraries. When specifying a directory, all files with in the directory will be added to the classpath, but further sub-directories will not be included.\",\n+                                \"displayName\": \"Additional Classpath Resources\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"record-reader\",\n-                                \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n+                                \"name\": \"Additional Classpath Resources\",\n+                                \"required\": false,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"MULTIPLE\",\n+                                    \"resourceTypes\": [\n+                                        \"DIRECTORY\",\n+                                        \"FILE\"\n+                                    ]\n+                                },\n+                                \"sensitive\": false\n                             },\n-                            \"record-writer\": {\n-                                \"description\": \"Specifies the Controller Service to use for writing results to a FlowFile\",\n-                                \"displayName\": \"Record Writer\",\n+                            \"Event Types to Filter On\": {\n+                                \"defaultValue\": \"append, close, create, metadata, rename, unlink\",\n+                                \"description\": \"A comma-separated list of event types to process. Valid event types are: append, close, create, metadata, rename, and unlink. Case does not matter.\",\n+                                \"displayName\": \"Event Types to Filter On\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"record-writer\",\n+                                \"name\": \"Event Types to Filter On\",\n                                 \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n+                                \"sensitive\": false\n                             },\n-                            \"sample-record-interval\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"interval\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Sampling Strategy\",\n-                                        \"propertyName\": \"sample-record-sampling-strategy\"\n-                                    }\n-                                ],\n-                                \"description\": \"Specifies the number of records to skip before writing a record to the outgoing FlowFile. This property is only used if Sampling Strategy is set to Interval Sampling. A value of zero (0) will cause no records to be included in theoutgoing FlowFile, a value of one (1) will cause all records to be included, and a value of two (2) will cause half the records to be included, and so on.\",\n-                                \"displayName\": \"Sampling Interval\",\n+                            \"HDFS Path to Watch\": {\n+                                \"description\": \"The HDFS path to get event notifications for. This property accepts both expression language and regular expressions. This will be evaluated during the OnScheduled phase.\",\n+                                \"displayName\": \"HDFS Path to Watch\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"sample-record-interval\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"HDFS Path to Watch\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"sample-record-probability\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"probabilistic\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Sampling Strategy\",\n-                                        \"propertyName\": \"sample-record-sampling-strategy\"\n-                                    }\n-                                ],\n-                                \"description\": \"Specifies the probability (as a percent from 0-100) of a record being included in the outgoing FlowFile. This property is only used if Sampling Strategy is set to Probabilistic Sampling. A value of zero (0) will cause no records to be included in theoutgoing FlowFile, and a value of 100 will cause all records to be included in the outgoing FlowFile..\",\n-                                \"displayName\": \"Sampling Probability\",\n+                            \"Hadoop Configuration Resources\": {\n+                                \"description\": \"A file or comma separated list of files which contains the Hadoop file system configuration. Without this, Hadoop will search the classpath for a 'core-site.xml' and 'hdfs-site.xml' file or will revert to a default configuration. To use swebhdfs, see 'Additional Details' section of PutHDFS's documentation.\",\n+                                \"displayName\": \"Hadoop Configuration Resources\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"sample-record-probability\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Hadoop Configuration Resources\",\n+                                \"required\": false,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"MULTIPLE\",\n+                                    \"resourceTypes\": [\n+                                        \"FILE\"\n+                                    ]\n+                                },\n+                                \"sensitive\": false\n+                            },\n+                            \"IOException Retries During Event Polling\": {\n+                                \"defaultValue\": \"3\",\n+                                \"description\": \"According to the HDFS admin API for event polling it is good to retry at least a few times. This number defines how many times the poll will be retried if it throws an IOException.\",\n+                                \"displayName\": \"IOException Retries During Event Polling\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"IOException Retries During Event Polling\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"sample-record-random-seed\": {\n-                                \"dependencies\": [\n+                            \"Ignore Hidden Files\": {\n+                                \"allowableValues\": [\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"probabilistic\",\n-                                            \"reservoir\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Sampling Strategy\",\n-                                        \"propertyName\": \"sample-record-sampling-strategy\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"description\": \"Specifies a particular number to use as the seed for the random number generator (used by probabilistic strategies). Setting this property will ensure the same records are selected even when using probabilistic strategies.\",\n-                                \"displayName\": \"Random Seed\",\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"If true and the final component of the path associated with a given event starts with a '.' then that event will not be processed.\",\n+                                \"displayName\": \"Ignore Hidden Files\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"sample-record-random-seed\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Ignore Hidden Files\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Kerberos Keytab\": {\n+                                \"description\": \"Kerberos keytab associated with the principal. Requires nifi.kerberos.krb5.file to be set in your nifi.properties\",\n+                                \"displayName\": \"Kerberos Keytab\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Kerberos Keytab\",\n                                 \"required\": false,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"SINGLE\",\n+                                    \"resourceTypes\": [\n+                                        \"FILE\"\n+                                    ]\n+                                },\n                                 \"sensitive\": false\n                             },\n-                            \"sample-record-range\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"range\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Sampling Strategy\",\n-                                        \"propertyName\": \"sample-record-sampling-strategy\"\n-                                    }\n-                                ],\n-                                \"description\": \"Specifies the range of records to include in the sample, from 1 to the total number of records. An example is '3,6-8,20-' which includes the third record, the sixth, seventh and eighth records, and all records from the twentieth record on. Commas separate intervals that don't overlap, and an interval can be between two numbers (i.e. 6-8) or up to a given number (i.e. -5), or from a number to the number of the last record (i.e. 20-). If this property is unset, all records will be included.\",\n-                                \"displayName\": \"Sampling Range\",\n+                            \"Kerberos Password\": {\n+                                \"description\": \"Kerberos password associated with the principal.\",\n+                                \"displayName\": \"Kerberos Password\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"sample-record-range\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Kerberos Password\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n+                            },\n+                            \"Kerberos Principal\": {\n+                                \"description\": \"Kerberos principal to authenticate as. Requires nifi.kerberos.krb5.file to be set in your nifi.properties\",\n+                                \"displayName\": \"Kerberos Principal\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Kerberos Principal\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"sample-record-reservoir\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"reservoir\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Sampling Strategy\",\n-                                        \"propertyName\": \"sample-record-sampling-strategy\"\n-                                    }\n-                                ],\n-                                \"description\": \"Specifies the number of records to write to the outgoing FlowFile. This property is only used if Sampling Strategy is set to reservoir-based strategies such as Reservoir Sampling.\",\n-                                \"displayName\": \"Reservoir Size\",\n+                            \"Kerberos Relogin Period\": {\n+                                \"defaultValue\": \"4 hours\",\n+                                \"description\": \"Period of time which should pass before attempting a kerberos relogin.\\n\\nThis property has been deprecated, and has no effect on processing. Relogins now occur automatically.\",\n+                                \"displayName\": \"Kerberos Relogin Period\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"sample-record-reservoir\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Kerberos Relogin Period\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"sample-record-sampling-strategy\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"Selects every Nth record where N is the value of the 'Interval Value' property\",\n-                                        \"displayName\": \"Interval Sampling\",\n-                                        \"value\": \"interval\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Creates a sample of records based on the index (i.e. record number) of the records using the specified range. An example is '3,6-8,20-' which includes the third record, the sixth, seventh and eighth record, and all records from the twentieth record on. Commas separate intervals that don't overlap, and an interval can be between two numbers (i.e. 6-8) or up to a given number (i.e. -5), or from a number to the number of the last record (i.e. 20-).\",\n-                                        \"displayName\": \"Range Sampling\",\n-                                        \"value\": \"range\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Selects each record with probability P where P is the value of the 'Selection Probability' property\",\n-                                        \"displayName\": \"Probabilistic Sampling\",\n-                                        \"value\": \"probabilistic\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Creates a sample of K records where each record has equal probability of being included, where K is the value of the 'Reservoir Size' property. Note that if the value is very large it may cause memory issues as the reservoir is kept in-memory.\",\n-                                        \"displayName\": \"Reservoir Sampling\",\n-                                        \"value\": \"reservoir\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"reservoir\",\n-                                \"description\": \"Specifies which method to use for sampling records from the incoming FlowFile\",\n-                                \"displayName\": \"Sampling Strategy\",\n+                            \"Poll Duration\": {\n+                                \"defaultValue\": \"1 second\",\n+                                \"description\": \"The time before the polling method returns with the next batch of events if they exist. It may exceed this amount of time by up to the time required for an RPC to the NameNode.\",\n+                                \"displayName\": \"Poll Duration\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"sample-record-sampling-strategy\",\n+                                \"name\": \"Poll Duration\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n+                            },\n+                            \"kerberos-credentials-service\": {\n+                                \"description\": \"Specifies the Kerberos Credentials Controller Service that should be used for authenticating with Kerberos\",\n+                                \"displayName\": \"Kerberos Credentials Service\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"kerberos-credentials-service\",\n+                                \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.kerberos.KerberosCredentialsService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"kerberos-user-service\": {\n+                                \"description\": \"Specifies the Kerberos User Controller Service that should be used for authenticating with Kerberos\",\n+                                \"displayName\": \"Kerberos User Service\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"kerberos-user-service\",\n+                                \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.kerberos.KerberosUserService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n                             }\n                         },\n-                        \"sideEffectFree\": true,\n+                        \"seeAlso\": [\n+                            \"org.apache.nifi.processors.hadoop.FetchHDFS\",\n+                            \"org.apache.nifi.processors.hadoop.GetHDFS\",\n+                            \"org.apache.nifi.processors.hadoop.ListHDFS\",\n+                            \"org.apache.nifi.processors.hadoop.PutHDFS\"\n+                        ],\n+                        \"sideEffectFree\": false,\n+                        \"stateful\": {\n+                            \"description\": \"The last used transaction id is stored. This is used \",\n+                            \"scopes\": [\n+                                \"CLUSTER\"\n+                            ]\n+                        },\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"The FlowFile is routed to this relationship if the sampling completed successfully\",\n+                                \"description\": \"A flow file with updated information about a specific event will be sent to this relationship.\",\n                                 \"name\": \"success\"\n-                            },\n-                            {\n-                                \"description\": \"If a FlowFile fails processing for any reason (for example, any record is not valid), the original FlowFile will be routed to this relationship\",\n-                                \"name\": \"failure\"\n-                            },\n-                            {\n-                                \"description\": \"The original FlowFile is routed to this relationship if sampling is successful\",\n-                                \"name\": \"original\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\",\n-                            \"EVENT_DRIVEN\"\n+                            \"CRON_DRIVEN\"\n                         ],\n-                        \"supportsBatching\": true,\n+                        \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": true,\n+                        \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n-                        \"systemResourceConsiderations\": [\n-                            {\n-                                \"description\": \"An instance of this component can cause high usage of this system resource.  Multiple instances or high concurrency settings may result a degradation of performance.\",\n-                                \"resource\": \"MEMORY\"\n-                            }\n-                        ],\n                         \"tags\": [\n-                            \"interval\",\n-                            \"range\",\n-                            \"record\",\n-                            \"reservoir\",\n-                            \"sample\"\n+                            \"events\",\n+                            \"filesystem\",\n+                            \"hadoop\",\n+                            \"inotify\",\n+                            \"notifications\"\n                         ],\n-                        \"triggerSerially\": false,\n+                        \"triggerSerially\": true,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.standard.SampleRecord\",\n-                        \"typeDescription\": \"Samples the records of a FlowFile based on a specified sampling strategy (such as Reservoir Sampling). The resulting FlowFile may be of a fixed number of records (in the case of reservoir-based algorithms) or some subset of the total number of records (in the case of probabilistic sampling), or a deterministic number of records (in the case of interval sampling).\",\n+                        \"triggerWhenEmpty\": true,\n+                        \"type\": \"org.apache.nifi.processors.hadoop.inotify.GetHDFSEvents\",\n+                        \"typeDescription\": \"This processor polls the notification events provided by the HdfsAdmin API. Since this uses the HdfsAdmin APIs it is required to run as an HDFS super user. Currently there are six types of events (append, close, create, metadata, rename, and unlink). Please see org.apache.hadoop.hdfs.inotify.Event documentation for full explanations of each event. This processor will poll for new events based on a defined duration. For each event received a new flow file will be created with the expected attributes and the event itself serialized to JSON and written to the flow file's content. For example, if event.type is APPEND then the content of the flow file will contain a JSON file containing the information about the append event. If successful the flow files are sent to the 'success' relationship. Be careful of where the generated flow files are stored. If the flow files are stored in one of processor's watch directories there will be a never ending flow of events. It is also important to be aware that this processor must consume all events. The filtering must happen within the processor. This is because the HDFS admin's event notifications API does not have filtering.\",\n                         \"version\": \"1.27.0\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"The MIME type indicated by the record writer\",\n+                                \"description\": \"This is always application/json.\",\n                                 \"name\": \"mime.type\"\n                             },\n                             {\n-                                \"description\": \"The number of records in the resulting flow file\",\n-                                \"name\": \"record.count\"\n+                                \"description\": \"This will specify the specific HDFS notification event type. Currently there are six types of events (append, close, create, metadata, rename, and unlink).\",\n+                                \"name\": \"hdfs.inotify.event.type\"\n+                            },\n+                            {\n+                                \"description\": \"The specific path that the event is tied to.\",\n+                                \"name\": \"hdfs.inotify.event.path\"\n                             }\n                         ]\n-                    },\n+                    }\n+                ],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"1.27.0\"\n+        },\n+        {\n+            \"artifact\": \"nifi-dbcp-service-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-standard-nar\",\n+                        \"artifact\": \"nifi-dbcp-service-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n-                        \"defaultBulletinLevel\": \"WARN\",\n-                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": 1,\n-                            \"EVENT_DRIVEN\": 0,\n-                            \"TIMER_DRIVEN\": 1\n-                        },\n-                        \"defaultPenaltyDuration\": \"30 sec\",\n-                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"0 sec\"\n-                        },\n-                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n-                        \"defaultYieldDuration\": \"1 sec\",\n+                        \"dynamicProperties\": [\n+                            {\n+                                \"description\": \"JDBC driver property name and value applied to JDBC connections.\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"name\": \"JDBC property name\",\n+                                \"value\": \"JDBC property value\"\n+                            },\n+                            {\n+                                \"description\": \"JDBC driver property name prefixed with 'SENSITIVE.' handled as a sensitive property.\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"name\": \"SENSITIVE.JDBC property name\",\n+                                \"value\": \"JDBC property value\"\n+                            }\n+                        ],\n+                        \"explicitRestrictions\": [\n+                            {\n+                                \"explanation\": \"Database Driver Location can reference resources over HTTP\",\n+                                \"requiredPermission\": \"reference remote resources\"\n+                            }\n+                        ],\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_REQUIRED\",\n-                        \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Attribute Pattern\": {\n-                                \"defaultValue\": \".*\",\n-                                \"description\": \"Regular Expression that specifies the names of attributes whose values will be matched against the terms in the dictionary\",\n-                                \"displayName\": \"Attribute Pattern\",\n+                            \"Database Connection URL\": {\n+                                \"description\": \"A database connection URL used to connect to a database. May contain database system name, host, port, database name and some parameters. The exact syntax of a database connection URL is specified by your DBMS.\",\n+                                \"displayName\": \"Database Connection URL\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Attribute Pattern\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Database Connection URL\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Dictionary File\": {\n-                                \"description\": \"A new-line-delimited text file that includes the terms that should trigger a match. Empty lines are ignored.  The contents of the text file are loaded into memory when the processor is scheduled and reloaded when the contents are modified.\",\n-                                \"displayName\": \"Dictionary File\",\n+                            \"Database Driver Class Name\": {\n+                                \"description\": \"Database driver class name\",\n+                                \"displayName\": \"Database Driver Class Name\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Dictionary File\",\n+                                \"name\": \"Database Driver Class Name\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Database User\": {\n+                                \"description\": \"Database user name\",\n+                                \"displayName\": \"Database User\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Database User\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"Max Total Connections\": {\n+                                \"defaultValue\": \"8\",\n+                                \"description\": \"The maximum number of active connections that can be allocated from this pool at the same time,  or negative for no limit.\",\n+                                \"displayName\": \"Max Total Connections\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Max Total Connections\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Max Wait Time\": {\n+                                \"defaultValue\": \"500 millis\",\n+                                \"description\": \"The maximum amount of time that the pool will wait (when there are no available connections)  for a connection to be returned before failing, or -1 to wait indefinitely. \",\n+                                \"displayName\": \"Max Wait Time\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Max Wait Time\",\n                                 \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Password\": {\n+                                \"description\": \"The password for the database user\",\n+                                \"displayName\": \"Password\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Password\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n+                            },\n+                            \"Validation-query\": {\n+                                \"description\": \"Validation query used to validate connections before returning them. When connection is invalid, it gets dropped and new valid connection will be returned. Note!! Using validation might have some performance penalty.\",\n+                                \"displayName\": \"Validation query\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Validation-query\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"database-driver-locations\": {\n+                                \"description\": \"Comma-separated list of files/folders and/or URLs containing the driver JAR and its dependencies (if any). For example '/var/tmp/mariadb-java-client-1.1.7.jar'\",\n+                                \"displayName\": \"Database Driver Location(s)\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"database-driver-locations\",\n+                                \"required\": false,\n                                 \"resourceDefinition\": {\n-                                    \"cardinality\": \"SINGLE\",\n+                                    \"cardinality\": \"MULTIPLE\",\n                                     \"resourceTypes\": [\n-                                        \"FILE\"\n+                                        \"DIRECTORY\",\n+                                        \"FILE\",\n+                                        \"URL\"\n                                     ]\n                                 },\n                                 \"sensitive\": false\n                             },\n-                            \"Dictionary Filter Pattern\": {\n-                                \"description\": \"A Regular Expression that will be applied to each line in the dictionary file. If the regular expression does not match the line, the line will not be included in the list of terms to search for. If a Matching Group is specified, only the portion of the term that matches that Matching Group will be used instead of the entire term. If not specified, all terms in the dictionary will be used and each term will consist of the text of the entire line in the file\",\n-                                \"displayName\": \"Dictionary Filter Pattern\",\n+                            \"dbcp-max-conn-lifetime\": {\n+                                \"defaultValue\": \"-1\",\n+                                \"description\": \"The maximum lifetime of a connection. After this time is exceeded the connection will fail the next activation, passivation or validation test. A value of zero or less means the connection has an infinite lifetime.\",\n+                                \"displayName\": \"Max Connection Lifetime\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"dbcp-max-conn-lifetime\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"dbcp-max-idle-conns\": {\n+                                \"defaultValue\": \"8\",\n+                                \"description\": \"The maximum number of connections that can remain idle in the pool without extra ones being released. Set to any negative value to allow unlimited idle connections.\",\n+                                \"displayName\": \"Max Idle Connections\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"dbcp-max-idle-conns\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"dbcp-min-evictable-idle-time\": {\n+                                \"defaultValue\": \"30 mins\",\n+                                \"description\": \"The minimum amount of time a connection may sit idle in the pool before it is eligible for eviction.\",\n+                                \"displayName\": \"Minimum Evictable Idle Time\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"dbcp-min-evictable-idle-time\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"dbcp-min-idle-conns\": {\n+                                \"defaultValue\": \"0\",\n+                                \"description\": \"The minimum number of connections that can remain idle in the pool without extra ones being created. Set to or zero to allow no idle connections.\",\n+                                \"displayName\": \"Minimum Idle Connections\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"dbcp-min-idle-conns\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"dbcp-soft-min-evictable-idle-time\": {\n+                                \"defaultValue\": \"-1\",\n+                                \"description\": \"The minimum amount of time a connection may sit idle in the pool before it is eligible for eviction by the idle connection evictor, with the extra condition that at least a minimum number of idle connections remain in the pool. When the not-soft version of this option is set to a positive value, it is examined first by the idle connection evictor: when idle connections are visited by the evictor, idle time is first compared against it (without considering the number of idle connections in the pool) and then against this soft option, including the minimum idle connections constraint.\",\n+                                \"displayName\": \"Soft Minimum Evictable Idle Time\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"dbcp-soft-min-evictable-idle-time\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"dbcp-time-between-eviction-runs\": {\n+                                \"defaultValue\": \"-1\",\n+                                \"description\": \"The time period to sleep between runs of the idle connection evictor thread. When non-positive, no idle connection evictor thread will be run.\",\n+                                \"displayName\": \"Time Between Eviction Runs\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"dbcp-time-between-eviction-runs\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"kerberos-credentials-service\": {\n+                                \"description\": \"Specifies the Kerberos Credentials Controller Service that should be used for authenticating with Kerberos\",\n+                                \"displayName\": \"Kerberos Credentials Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Dictionary Filter Pattern\",\n+                                \"name\": \"kerberos-credentials-service\",\n                                 \"required\": false,\n-                                \"sensitive\": false\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.kerberos.KerberosCredentialsService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n                             },\n-                            \"Match Criteria\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"At Least 1 Must Match\",\n-                                        \"value\": \"At Least 1 Must Match\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"All Must Match\",\n-                                        \"value\": \"All Must Match\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"At Least 1 Must Match\",\n-                                \"description\": \"If set to All Must Match, then FlowFiles will be routed to 'matched' only if all specified attributes' values are found in the dictionary. If set to At Least 1 Must Match, FlowFiles will be routed to 'matched' if any attribute specified is found in the dictionary\",\n-                                \"displayName\": \"Match Criteria\",\n+                            \"kerberos-password\": {\n+                                \"description\": \"The password to use when specifying the principal and password directly in the processor for authenticating via Kerberos.\",\n+                                \"displayName\": \"Kerberos Password\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Match Criteria\",\n-                                \"required\": true,\n+                                \"name\": \"kerberos-password\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n+                            },\n+                            \"kerberos-principal\": {\n+                                \"description\": \"The principal to use when specifying the principal and password directly in the processor for authenticating via Kerberos.\",\n+                                \"displayName\": \"Kerberos Principal\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"kerberos-principal\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n+                            },\n+                            \"kerberos-user-service\": {\n+                                \"description\": \"Specifies the Kerberos User Controller Service that should be used for authenticating with Kerberos\",\n+                                \"displayName\": \"Kerberos User Service\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"kerberos-user-service\",\n+                                \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.kerberos.KerberosUserService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n                             }\n                         },\n-                        \"sideEffectFree\": true,\n-                        \"supportedRelationships\": [\n-                            {\n-                                \"description\": \"FlowFiles whose attributes are not found in the dictionary will be routed to this relationship\",\n-                                \"name\": \"unmatched\"\n-                            },\n+                        \"providedApiImplementations\": [\n                             {\n-                                \"description\": \"FlowFiles whose attributes are found in the dictionary will be routed to this relationship\",\n-                                \"name\": \"matched\"\n+                                \"artifact\": \"nifi-standard-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.dbcp.DBCPService\",\n+                                \"version\": \"1.27.0\"\n                             }\n                         ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\",\n-                            \"EVENT_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": true,\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": true,\n-                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"restricted\": true,\n+                        \"supportsDynamicProperties\": true,\n+                        \"supportsSensitiveDynamicProperties\": true,\n                         \"tags\": [\n-                            \"attributes\",\n-                            \"find\",\n-                            \"lookup\",\n-                            \"scan\",\n-                            \"search\",\n-                            \"text\"\n+                            \"connection\",\n+                            \"database\",\n+                            \"dbcp\",\n+                            \"jdbc\",\n+                            \"pooling\",\n+                            \"store\"\n                         ],\n-                        \"triggerSerially\": false,\n-                        \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.standard.ScanAttribute\",\n-                        \"typeDescription\": \"Scans the specified attributes of FlowFiles, checking to see if any of their values are present within the specified dictionary of terms\",\n+                        \"type\": \"org.apache.nifi.dbcp.DBCPConnectionPool\",\n+                        \"typeDescription\": \"Provides Database Connection Pooling Service. Connections can be asked from pool and returned after usage.\",\n                         \"version\": \"1.27.0\"\n                     },\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-standard-nar\",\n+                        \"artifact\": \"nifi-dbcp-service-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n-                        \"defaultBulletinLevel\": \"WARN\",\n-                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": 1,\n-                            \"EVENT_DRIVEN\": 0,\n-                            \"TIMER_DRIVEN\": 1\n-                        },\n-                        \"defaultPenaltyDuration\": \"30 sec\",\n-                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"0 sec\"\n-                        },\n-                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n-                        \"defaultYieldDuration\": \"1 sec\",\n-                        \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_REQUIRED\",\n-                        \"primaryNodeOnly\": false,\n-                        \"propertyDescriptors\": {\n-                            \"Dictionary Encoding\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"text\",\n-                                        \"value\": \"text\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"binary\",\n-                                        \"value\": \"binary\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"text\",\n-                                \"description\": \"Indicates how the dictionary is encoded. If 'text', dictionary terms are new-line delimited and UTF-8 encoded; if 'binary', dictionary terms are denoted by a 4-byte integer indicating the term length followed by the term itself\",\n-                                \"displayName\": \"Dictionary Encoding\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Dictionary Encoding\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Dictionary File\": {\n-                                \"description\": \"The filename of the terms dictionary\",\n-                                \"displayName\": \"Dictionary File\",\n-                                \"dynamic\": false,\n+                        \"dynamicProperties\": [\n+                            {\n+                                \"description\": \"If 'database.name' attribute contains the name of the dynamic property, then the DBCPService (registered in the value) will be selected.\",\n                                 \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Dictionary File\",\n-                                \"required\": true,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"SINGLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\"\n-                                    ]\n-                                },\n-                                \"sensitive\": false\n+                                \"name\": \"The name to register DBCPService\",\n+                                \"value\": \"The DBCPService\"\n                             }\n-                        },\n-                        \"sideEffectFree\": true,\n-                        \"supportedRelationships\": [\n-                            {\n-                                \"description\": \"FlowFiles that do not match any term in the dictionary are routed to this relationship\",\n-                                \"name\": \"unmatched\"\n-                            },\n+                        ],\n+                        \"group\": \"org.apache.nifi\",\n+                        \"providedApiImplementations\": [\n                             {\n-                                \"description\": \"FlowFiles that match at least one term in the dictionary are routed to this relationship\",\n-                                \"name\": \"matched\"\n+                                \"artifact\": \"nifi-standard-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.dbcp.DBCPService\",\n+                                \"version\": \"1.27.0\"\n                             }\n                         ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\",\n-                            \"EVENT_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": true,\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": true,\n+                        \"supportsDynamicProperties\": true,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"aho-corasick\",\n-                            \"byte sequence\",\n-                            \"content\",\n-                            \"dictionary\",\n-                            \"find\",\n-                            \"scan\",\n-                            \"search\"\n+                            \"connection\",\n+                            \"database\",\n+                            \"dbcp\",\n+                            \"jdbc\",\n+                            \"pooling\",\n+                            \"store\"\n                         ],\n-                        \"triggerSerially\": false,\n-                        \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.standard.ScanContent\",\n-                        \"typeDescription\": \"Scans the content of FlowFiles for terms that are found in a user-supplied dictionary. If a term is matched, the UTF-8 encoded version of the term will be added to the FlowFile using the 'matching.term' attribute\",\n-                        \"version\": \"1.27.0\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"The term that caused the Processor to route the FlowFile to the 'matched' relationship; if FlowFile is routed to the 'unmatched' relationship, this attribute is not added\",\n-                                \"name\": \"matching.term\"\n-                            }\n-                        ]\n+                        \"type\": \"org.apache.nifi.dbcp.DBCPConnectionPoolLookup\",\n+                        \"typeDescription\": \"Provides a DBCPService that can be used to dynamically select another DBCPService. This service requires an attribute named 'database.name' to be passed in when asking for a connection, and will throw an exception if the attribute is missing. The value of 'database.name' will be used to select the DBCPService that has been registered with that name. This will allow multiple DBCPServices to be defined and registered, and then selected dynamically at runtime by tagging flow files with the appropriate 'database.name' attribute.\",\n+                        \"version\": \"1.27.0\"\n                     },\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-standard-nar\",\n+                        \"artifact\": \"nifi-dbcp-service-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n-                        \"defaultBulletinLevel\": \"WARN\",\n-                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": 1,\n-                            \"EVENT_DRIVEN\": 0,\n-                            \"TIMER_DRIVEN\": 1\n-                        },\n-                        \"defaultPenaltyDuration\": \"30 sec\",\n-                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"0 sec\"\n-                        },\n-                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n-                        \"defaultYieldDuration\": \"1 sec\",\n+                        \"dynamicProperties\": [\n+                            {\n+                                \"description\": \"Specifies a property name and value to be set on the JDBC connection(s). If Expression Language is used, evaluation will be performed upon the controller service being enabled. Note that no flow file input (attributes, e.g.) is available for use in Expression Language constructs for these properties.\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"name\": \"JDBC property name\",\n+                                \"value\": \"JDBC property value\"\n+                            }\n+                        ],\n+                        \"explicitRestrictions\": [\n+                            {\n+                                \"explanation\": \"Database Driver Location can reference resources over HTTP\",\n+                                \"requiredPermission\": \"reference remote resources\"\n+                            }\n+                        ],\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_REQUIRED\",\n-                        \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Segment Size\": {\n-                                \"description\": \"The maximum data size in bytes for each segment\",\n-                                \"displayName\": \"Segment Size\",\n+                            \"hikaricp-connection-url\": {\n+                                \"description\": \"A database connection URL used to connect to a database. May contain database system name, host, port, database name and some parameters. The exact syntax of a database connection URL is specified by your DBMS.\",\n+                                \"displayName\": \"Database Connection URL\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Segment Size\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"hikaricp-connection-url\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n-                            }\n-                        },\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.processors.standard.MergeContent\"\n-                        ],\n-                        \"sideEffectFree\": true,\n-                        \"supportedRelationships\": [\n-                            {\n-                                \"description\": \"All segments will be sent to this relationship. If the file was small enough that it was not segmented, a copy of the original is sent to this relationship as well as original\",\n-                                \"name\": \"segments\"\n                             },\n-                            {\n-                                \"description\": \"The original FlowFile will be sent to this relationship\",\n-                                \"name\": \"original\"\n-                            }\n-                        ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\",\n-                            \"EVENT_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": true,\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": true,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"segment\",\n-                            \"split\"\n-                        ],\n-                        \"triggerSerially\": false,\n-                        \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.standard.SegmentContent\",\n-                        \"typeDescription\": \"Segments a FlowFile into multiple smaller segments on byte boundaries. Each segment is given the following attributes: fragment.identifier, fragment.index, fragment.count, segment.original.filename; these attributes can then be used by the MergeContent processor in order to reconstitute the original FlowFile\",\n-                        \"version\": \"1.27.0\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"All segments produced from the same parent FlowFile will have the same randomly generated UUID added for this attribute. This attribute is added to maintain backward compatibility, but the fragment.identifier is preferred, as it is designed to work in conjunction with the MergeContent Processor\",\n-                                \"name\": \"segment.identifier\"\n+                            \"hikaricp-driver-classname\": {\n+                                \"description\": \"The fully-qualified class name of the JDBC driver. Example: com.mysql.jdbc.Driver\",\n+                                \"displayName\": \"Database Driver Class Name\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"hikaricp-driver-classname\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n                             },\n-                            {\n-                                \"description\": \"A one-up number that indicates the ordering of the segments that were created from a single parent FlowFile. This attribute is added to maintain backward compatibility, but the fragment.index is preferred, as it is designed to work in conjunction with the MergeContent Processor\",\n-                                \"name\": \"segment.index\"\n+                            \"hikaricp-driver-locations\": {\n+                                \"description\": \"Comma-separated list of files/folders and/or URLs containing the driver JAR and its dependencies (if any). For example '/var/tmp/mariadb-java-client-1.1.7.jar'\",\n+                                \"displayName\": \"Database Driver Location(s)\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"hikaricp-driver-locations\",\n+                                \"required\": false,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"MULTIPLE\",\n+                                    \"resourceTypes\": [\n+                                        \"DIRECTORY\",\n+                                        \"FILE\",\n+                                        \"URL\"\n+                                    ]\n+                                },\n+                                \"sensitive\": false\n                             },\n-                            {\n-                                \"description\": \"The number of segments generated from the parent FlowFile. This attribute is added to maintain backward compatibility, but the fragment.count is preferred, as it is designed to work in conjunction with the MergeContent Processor\",\n-                                \"name\": \"segment.count\"\n+                            \"hikaricp-kerberos-user-service\": {\n+                                \"description\": \"Specifies the Kerberos User Controller Service that should be used for authenticating with Kerberos\",\n+                                \"displayName\": \"Kerberos User Service\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"hikaricp-kerberos-user-service\",\n+                                \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.kerberos.KerberosUserService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n                             },\n-                            {\n-                                \"description\": \"All segments produced from the same parent FlowFile will have the same randomly generated UUID added for this attribute\",\n-                                \"name\": \"fragment.identifier\"\n+                            \"hikaricp-max-conn-lifetime\": {\n+                                \"defaultValue\": \"-1\",\n+                                \"description\": \"The maximum lifetime of a connection. After this time is exceeded the connection will fail the next activation, passivation or validation test. A value of zero or less means the connection has an infinite lifetime.\",\n+                                \"displayName\": \"Max Connection Lifetime\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"hikaricp-max-conn-lifetime\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n                             },\n-                            {\n-                                \"description\": \"A one-up number that indicates the ordering of the segments that were created from a single parent FlowFile\",\n-                                \"name\": \"fragment.index\"\n+                            \"hikaricp-max-total-conns\": {\n+                                \"defaultValue\": \"10\",\n+                                \"description\": \"This property controls the maximum size that the pool is allowed to reach, including both idle and in-use connections. Basically this value will determine the maximum number of actual connections to the database backend. A reasonable value for this is best determined by your execution environment. When the pool reaches this size, and no idle connections are available, the service will block for up to connectionTimeout milliseconds before timing out.\",\n+                                \"displayName\": \"Max Total Connections\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"hikaricp-max-total-conns\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n                             },\n-                            {\n-                                \"description\": \"The number of segments generated from the parent FlowFile\",\n-                                \"name\": \"fragment.count\"\n+                            \"hikaricp-max-wait-time\": {\n+                                \"defaultValue\": \"500 millis\",\n+                                \"description\": \"The maximum amount of time that the pool will wait (when there are no available connections)  for a connection to be returned before failing, or 0 <time units> to wait indefinitely. \",\n+                                \"displayName\": \"Max Wait Time\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"hikaricp-max-wait-time\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n                             },\n-                            {\n-                                \"description\": \"The filename of the parent FlowFile\",\n-                                \"name\": \"segment.original.filename \"\n+                            \"hikaricp-min-idle-conns\": {\n+                                \"defaultValue\": \"10\",\n+                                \"description\": \"This property controls the minimum number of idle connections that HikariCP tries to maintain in the pool. If the idle connections dip below this value and total connections in the pool are less than 'Max Total Connections', HikariCP will make a best effort to add additional connections quickly and efficiently. It is recommended that this property to be set equal to 'Max Total Connections'.\",\n+                                \"displayName\": \"Minimum Idle Connections\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"hikaricp-min-idle-conns\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"hikaricp-password\": {\n+                                \"description\": \"The password for the database user\",\n+                                \"displayName\": \"Password\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"hikaricp-password\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n+                            },\n+                            \"hikaricp-username\": {\n+                                \"description\": \"Database user name\",\n+                                \"displayName\": \"Database User\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"hikaricp-username\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n                             },\n+                            \"hikaricp-validation-query\": {\n+                                \"description\": \"Validation Query used to validate connections before returning them. When connection is invalid, it gets dropped and new valid connection will be returned. NOTE: Using validation might have some performance penalty.\",\n+                                \"displayName\": \"Validation Query\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"hikaricp-validation-query\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            }\n+                        },\n+                        \"providedApiImplementations\": [\n                             {\n-                                \"description\": \"The filename will be updated to include the parent's filename, the segment index, and the segment count\",\n-                                \"name\": \"segment.original.filename \"\n+                                \"artifact\": \"nifi-standard-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.dbcp.DBCPService\",\n+                                \"version\": \"1.27.0\"\n                             }\n-                        ]\n+                        ],\n+                        \"restricted\": true,\n+                        \"supportsDynamicProperties\": true,\n+                        \"supportsSensitiveDynamicProperties\": true,\n+                        \"tags\": [\n+                            \"connection\",\n+                            \"database\",\n+                            \"dbcp\",\n+                            \"hikari\",\n+                            \"jdbc\",\n+                            \"pooling\",\n+                            \"store\"\n+                        ],\n+                        \"type\": \"org.apache.nifi.dbcp.HikariCPConnectionPool\",\n+                        \"typeDescription\": \"Provides Database Connection Pooling Service based on HikariCP. Connections can be asked from pool and returned after usage.\",\n+                        \"version\": \"1.27.0\"\n                     },\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-standard-nar\",\n+                        \"artifact\": \"nifi-dbcp-service-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n-                        \"defaultBulletinLevel\": \"WARN\",\n-                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": 1,\n-                            \"EVENT_DRIVEN\": 0,\n-                            \"TIMER_DRIVEN\": 1\n-                        },\n-                        \"defaultPenaltyDuration\": \"30 sec\",\n-                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"0 sec\"\n-                        },\n-                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n-                        \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_REQUIRED\",\n-                        \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Byte Sequence\": {\n-                                \"description\": \"A representation of bytes to look for and upon which to split the source file into separate files\",\n-                                \"displayName\": \"Byte Sequence\",\n+                            \"db-record-sink-catalog-name\": {\n+                                \"description\": \"The name of the catalog that the statement should update. This may not apply for the database that you are updating. In this case, leave the field empty\",\n+                                \"displayName\": \"Catalog Name\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"db-record-sink-catalog-name\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"db-record-sink-dcbp-service\": {\n+                                \"description\": \"The Controller Service that is used to obtain a connection to the database for sending records.\",\n+                                \"displayName\": \"Database Connection Pooling Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Byte Sequence\",\n+                                \"name\": \"db-record-sink-dcbp-service\",\n+                                \"required\": true,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.dbcp.DBCPService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"db-record-sink-query-timeout\": {\n+                                \"defaultValue\": \"0 seconds\",\n+                                \"description\": \"The maximum amount of time allowed for a running SQL statement , zero means there is no limit. Max time less than 1 second will be equal to zero.\",\n+                                \"displayName\": \"Max Wait Time\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"db-record-sink-query-timeout\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Byte Sequence Format\": {\n+                            \"db-record-sink-quoted-identifiers\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"The Byte Sequence will be interpreted as a hexadecimal representation of bytes\",\n-                                        \"displayName\": \"Hexadecimal\",\n-                                        \"value\": \"Hexadecimal\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n-                                        \"description\": \"The Byte Sequence will be interpreted as UTF-8 Encoded text\",\n-                                        \"displayName\": \"Text\",\n-                                        \"value\": \"Text\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"Hexadecimal\",\n-                                \"description\": \"Specifies how the <Byte Sequence> property should be interpreted\",\n-                                \"displayName\": \"Byte Sequence Format\",\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"Enabling this option will cause all column names to be quoted, allowing you to use reserved words as column names in your tables.\",\n+                                \"displayName\": \"Quote Column Identifiers\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Byte Sequence Format\",\n-                                \"required\": true,\n+                                \"name\": \"db-record-sink-quoted-identifiers\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Byte Sequence Location\": {\n+                            \"db-record-sink-quoted-table-identifiers\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Keep the Byte Sequence at the end of the first split if <Keep Byte Sequence> is true\",\n-                                        \"displayName\": \"Trailing\",\n-                                        \"value\": \"Trailing\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n-                                        \"description\": \"Keep the Byte Sequence at the beginning of the second split if <Keep Byte Sequence> is true\",\n-                                        \"displayName\": \"Leading\",\n-                                        \"value\": \"Leading\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"Trailing\",\n-                                \"description\": \"If <Keep Byte Sequence> is set to true, specifies whether the byte sequence should be added to the end of the first split or the beginning of the second; if <Keep Byte Sequence> is false, this property is ignored.\",\n-                                \"displayName\": \"Byte Sequence Location\",\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"Enabling this option will cause the table name to be quoted to support the use of special characters in the table name.\",\n+                                \"displayName\": \"Quote Table Identifiers\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Byte Sequence Location\",\n+                                \"name\": \"db-record-sink-quoted-table-identifiers\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"db-record-sink-schema-name\": {\n+                                \"description\": \"The name of the schema that the table belongs to. This may not apply for the database that you are updating. In this case, leave the field empty\",\n+                                \"displayName\": \"Schema Name\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"db-record-sink-schema-name\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"db-record-sink-table-name\": {\n+                                \"description\": \"The name of the table that the statement should affect.\",\n+                                \"displayName\": \"Table Name\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"db-record-sink-table-name\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Keep Byte Sequence\": {\n+                            \"db-record-sink-translate-field-names\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"true\",\n                                         \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"false\",\n                                         \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"Determines whether or not the Byte Sequence should be included with each Split\",\n-                                \"displayName\": \"Keep Byte Sequence\",\n+                                \"defaultValue\": \"true\",\n+                                \"description\": \"If true, the Processor will attempt to translate field names into the appropriate column names for the table specified. If false, the field names must match the column names exactly, or the column will not be updated\",\n+                                \"displayName\": \"Translate Field Names\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Keep Byte Sequence\",\n-                                \"required\": true,\n+                                \"name\": \"db-record-sink-translate-field-names\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"db-record-sink-unmatched-column-behavior\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"Any column in the database that does not have a field in the document will be assumed to not be required.  No notification will be logged\",\n+                                        \"displayName\": \"Ignore Unmatched Columns\",\n+                                        \"value\": \"Ignore Unmatched Columns\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Any column in the database that does not have a field in the document will be assumed to not be required.  A warning will be logged\",\n+                                        \"displayName\": \"Warn on Unmatched Columns\",\n+                                        \"value\": \"Warn on Unmatched Columns\"\n+                                    },\n+                                    {\n+                                        \"description\": \"A flow will fail if any column in the database that does not have a field in the document.  An error will be logged\",\n+                                        \"displayName\": \"Fail on Unmatched Columns\",\n+                                        \"value\": \"Fail on Unmatched Columns\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"Fail on Unmatched Columns\",\n+                                \"description\": \"If an incoming record does not have a field mapping for all of the database table's columns, this property specifies how to handle the situation\",\n+                                \"displayName\": \"Unmatched Column Behavior\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"db-record-sink-unmatched-column-behavior\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"db-record-sink-unmatched-field-behavior\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"Any field in the document that cannot be mapped to a column in the database is ignored\",\n+                                        \"displayName\": \"Ignore Unmatched Fields\",\n+                                        \"value\": \"Ignore Unmatched Fields\"\n+                                    },\n+                                    {\n+                                        \"description\": \"If the document has any field that cannot be mapped to a column in the database, the FlowFile will be routed to the failure relationship\",\n+                                        \"displayName\": \"Fail on Unmatched Fields\",\n+                                        \"value\": \"Fail on Unmatched Fields\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"Ignore Unmatched Fields\",\n+                                \"description\": \"If an incoming record has a field that does not map to any of the database table's columns, this property specifies how to handle the situation\",\n+                                \"displayName\": \"Unmatched Field Behavior\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"db-record-sink-unmatched-field-behavior\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             }\n                         },\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.processors.standard.MergeContent\"\n-                        ],\n-                        \"sideEffectFree\": true,\n-                        \"supportedRelationships\": [\n-                            {\n-                                \"description\": \"All Splits will be routed to the splits relationship\",\n-                                \"name\": \"splits\"\n-                            },\n+                        \"providedApiImplementations\": [\n                             {\n-                                \"description\": \"The original file\",\n-                                \"name\": \"original\"\n+                                \"artifact\": \"nifi-standard-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.record.sink.RecordSinkService\",\n+                                \"version\": \"1.27.0\"\n                             }\n                         ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\",\n-                            \"EVENT_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": true,\n                         \"supportsDynamicProperties\": false,\n-                        \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": true,\n                         \"supportsSensitiveDynamicProperties\": false,\n-                        \"systemResourceConsiderations\": [\n-                            {\n-                                \"description\": \"The FlowFile with its attributes is stored in memory, not the content of the FlowFile. If many splits are generated due to the size of the content, or how the content is configured to be split, a two-phase approach may be necessary to avoid excessive use of memory.\",\n-                                \"resource\": \"MEMORY\"\n-                            }\n-                        ],\n                         \"tags\": [\n-                            \"binary\",\n-                            \"content\",\n-                            \"split\"\n+                            \"connection\",\n+                            \"database\",\n+                            \"db\",\n+                            \"jdbc\",\n+                            \"record\"\n                         ],\n-                        \"triggerSerially\": false,\n-                        \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.standard.SplitContent\",\n-                        \"typeDescription\": \"Splits incoming FlowFiles by a specified byte sequence\",\n-                        \"version\": \"1.27.0\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"All split FlowFiles produced from the same parent FlowFile will have the same randomly generated UUID added for this attribute\",\n-                                \"name\": \"fragment.identifier\"\n-                            },\n-                            {\n-                                \"description\": \"A one-up number that indicates the ordering of the split FlowFiles that were created from a single parent FlowFile\",\n-                                \"name\": \"fragment.index\"\n-                            },\n-                            {\n-                                \"description\": \"The number of split FlowFiles generated from the parent FlowFile\",\n-                                \"name\": \"fragment.count\"\n-                            },\n-                            {\n-                                \"description\": \"The filename of the parent FlowFile\",\n-                                \"name\": \"segment.original.filename \"\n-                            }\n-                        ]\n-                    },\n+                        \"type\": \"org.apache.nifi.record.sink.db.DatabaseRecordSink\",\n+                        \"typeDescription\": \"Provides a service to write records using a configured database connection.\",\n+                        \"version\": \"1.27.0\"\n+                    }\n+                ],\n+                \"processors\": [],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"1.27.0\"\n+        },\n+        {\n+            \"artifact\": \"nifi-hashicorp-vault-client-service-api-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [],\n+                \"processors\": [],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"1.27.0\"\n+        },\n+        {\n+            \"artifact\": \"nifi-dropbox-services-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [\n                     {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-standard-nar\",\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-dropbox-services-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n-                        \"defaultBulletinLevel\": \"WARN\",\n-                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": 1,\n-                            \"EVENT_DRIVEN\": 0,\n-                            \"TIMER_DRIVEN\": 1\n-                        },\n-                        \"defaultPenaltyDuration\": \"30 sec\",\n-                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"0 sec\"\n-                        },\n-                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n-                        \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_REQUIRED\",\n-                        \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"JsonPath Expression\": {\n-                                \"description\": \"A JsonPath expression that indicates the array element to split into JSON/scalar fragments.\",\n-                                \"displayName\": \"JsonPath Expression\",\n+                            \"access-token\": {\n+                                \"description\": \"Access Token of the user's Dropbox app. See Additional Details for more information about Access Token generation.\",\n+                                \"displayName\": \"Access Token\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"JsonPath Expression\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"access-token\",\n                                 \"required\": true,\n-                                \"sensitive\": false\n+                                \"sensitive\": true\n                             },\n-                            \"Max String Length\": {\n-                                \"defaultValue\": \"20 MB\",\n-                                \"description\": \"The maximum allowed length of a string value when parsing the JSON document\",\n-                                \"displayName\": \"Max String Length\",\n+                            \"app-key\": {\n+                                \"description\": \"App Key of the user's Dropbox app. See Additional Details for more information.\",\n+                                \"displayName\": \"App Key\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Max String Length\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"app-key\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Null Value Representation\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"empty string\",\n-                                        \"value\": \"empty string\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"the string 'null'\",\n-                                        \"value\": \"the string 'null'\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"empty string\",\n-                                \"description\": \"Indicates the desired representation of JSON Path expressions resulting in a null value.\",\n-                                \"displayName\": \"Null Value Representation\",\n+                            \"app-secret\": {\n+                                \"description\": \"App Secret of the user's Dropbox app. See Additional Details for more information.\",\n+                                \"displayName\": \"App Secret\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Null Value Representation\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"app-secret\",\n                                 \"required\": true,\n-                                \"sensitive\": false\n+                                \"sensitive\": true\n+                            },\n+                            \"refresh-token\": {\n+                                \"description\": \"Refresh Token of the user's Dropbox app. See Additional Details for more information about Refresh Token generation.\",\n+                                \"displayName\": \"Refresh Token\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"refresh-token\",\n+                                \"required\": true,\n+                                \"sensitive\": true\n                             }\n                         },\n-                        \"sideEffectFree\": true,\n-                        \"supportedRelationships\": [\n-                            {\n-                                \"description\": \"If a FlowFile fails processing for any reason (for example, the FlowFile is not valid JSON or the specified path does not exist), it will be routed to this relationship\",\n-                                \"name\": \"failure\"\n-                            },\n-                            {\n-                                \"description\": \"The original FlowFile that was split into segments. If the FlowFile fails processing, nothing will be sent to this relationship\",\n-                                \"name\": \"original\"\n-                            },\n+                        \"providedApiImplementations\": [\n                             {\n-                                \"description\": \"All segments of the original FlowFile will be routed to this relationship\",\n-                                \"name\": \"split\"\n+                                \"artifact\": \"nifi-dropbox-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.dropbox.credentials.service.DropboxCredentialService\",\n+                                \"version\": \"1.27.0\"\n                             }\n                         ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\",\n-                            \"EVENT_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": true,\n                         \"supportsDynamicProperties\": false,\n-                        \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": true,\n                         \"supportsSensitiveDynamicProperties\": false,\n-                        \"systemResourceConsiderations\": [\n-                            {\n-                                \"description\": \"The entirety of the FlowFile's content (as a JsonNode object) is read into memory, in addition to all of the generated FlowFiles representing the split JSON. If many splits are generated due to the size of the JSON, or how the JSON is configured to be split, a two-phase approach may be necessary to avoid excessive use of memory.\",\n-                                \"resource\": \"MEMORY\"\n-                            }\n-                        ],\n                         \"tags\": [\n-                            \"json\",\n-                            \"jsonpath\",\n-                            \"split\"\n+                            \"credentials\",\n+                            \"dropbox\",\n+                            \"provider\"\n                         ],\n-                        \"triggerSerially\": false,\n-                        \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.standard.SplitJson\",\n-                        \"typeDescription\": \"Splits a JSON File into multiple, separate FlowFiles for an array element specified by a JsonPath expression. Each generated FlowFile is comprised of an element of the specified array and transferred to relationship 'split,' with the original file transferred to the 'original' relationship. If the specified JsonPath is not found or does not evaluate to an array element, the original file is routed to 'failure' and no files are generated.\",\n-                        \"version\": \"1.27.0\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"All split FlowFiles produced from the same parent FlowFile will have the same randomly generated UUID added for this attribute\",\n-                                \"name\": \"fragment.identifier\"\n-                            },\n-                            {\n-                                \"description\": \"A one-up number that indicates the ordering of the split FlowFiles that were created from a single parent FlowFile\",\n-                                \"name\": \"fragment.index\"\n-                            },\n-                            {\n-                                \"description\": \"The number of split FlowFiles generated from the parent FlowFile\",\n-                                \"name\": \"fragment.count\"\n-                            },\n-                            {\n-                                \"description\": \"The filename of the parent FlowFile\",\n-                                \"name\": \"segment.original.filename \"\n-                            }\n-                        ]\n-                    },\n+                        \"type\": \"org.apache.nifi.services.dropbox.StandardDropboxCredentialService\",\n+                        \"typeDescription\": \"Defines credentials for Dropbox processors.\",\n+                        \"version\": \"1.27.0\"\n+                    }\n+                ],\n+                \"processors\": [],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"1.27.0\"\n+        },\n+        {\n+            \"artifact\": \"nifi-workday-processors-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [],\n+                \"processors\": [\n                     {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-standard-nar\",\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-workday-processors-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n-                            \"EVENT_DRIVEN\": 0,\n                             \"TIMER_DRIVEN\": 1\n                         },\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_REQUIRED\",\n+                        \"inputRequirement\": \"INPUT_ALLOWED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Record Reader\": {\n-                                \"description\": \"Specifies the Controller Service to use for reading incoming data\",\n-                                \"displayName\": \"Record Reader\",\n+                            \"Web Client Service Provider\": {\n+                                \"description\": \"Web client which is used to communicate with the Workday API.\",\n+                                \"displayName\": \"Web Client Service Provider\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Record Reader\",\n+                                \"name\": \"Web Client Service Provider\",\n+                                \"required\": true,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.web.client.provider.api.WebClientServiceProvider\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"Workday Password\": {\n+                                \"description\": \"The password provided for authentication of Workday requests. Encoded using Base64 for HTTP Basic Authentication as described in RFC 7617.\",\n+                                \"displayName\": \"Workday Password\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Workday Password\",\n+                                \"required\": true,\n+                                \"sensitive\": true\n+                            },\n+                            \"Workday Report URL\": {\n+                                \"description\": \"HTTP remote URL of Workday report including a scheme of http or https, as well as a hostname or IP address with optional port and path elements.\",\n+                                \"displayName\": \"Workday Report URL\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Workday Report URL\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Workday Username\": {\n+                                \"description\": \"The username provided for authentication of Workday requests. Encoded using Base64 for HTTP Basic Authentication as described in RFC 7617.\",\n+                                \"displayName\": \"Workday Username\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"Workday Username\",\n                                 \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"record-reader\": {\n+                                \"description\": \"Specifies the Controller Service to use for parsing incoming data and determining the data's schema.\",\n+                                \"displayName\": \"Record Reader\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"record-reader\",\n+                                \"required\": false,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n                                     \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n                                     \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             },\n-                            \"Record Writer\": {\n-                                \"description\": \"Specifies the Controller Service to use for writing out the records\",\n+                            \"record-writer\": {\n+                                \"dependencies\": [\n+                                    {\n+                                        \"propertyDisplayName\": \"Record Reader\",\n+                                        \"propertyName\": \"record-reader\"\n+                                    }\n+                                ],\n+                                \"description\": \"The Record Writer to use for serializing Records to an output FlowFile.\",\n                                 \"displayName\": \"Record Writer\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Record Writer\",\n+                                \"name\": \"record-writer\",\n                                 \"required\": true,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n                                     \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n                                     \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n                                     \"version\": \"1.27.0\"\n                                 }\n-                            },\n-                            \"Records Per Split\": {\n-                                \"description\": \"Specifies how many records should be written to each 'split' or 'segment' FlowFile\",\n-                                \"displayName\": \"Records Per Split\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Records Per Split\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n                             }\n                         },\n                         \"sideEffectFree\": true,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"If a FlowFile cannot be transformed from the configured input format to the configured output format, the unchanged FlowFile will be routed to this relationship.\",\n-                                \"name\": \"failure\"\n+                                \"description\": \"Response FlowFiles transferred when receiving HTTP responses with a status code between 200 and 299.\",\n+                                \"name\": \"success\"\n                             },\n                             {\n-                                \"description\": \"The individual 'segments' of the original FlowFile will be routed to this relationship.\",\n-                                \"name\": \"splits\"\n+                                \"description\": \"Request FlowFiles transferred when receiving socket communication errors.\",\n+                                \"name\": \"failure\"\n                             },\n                             {\n-                                \"description\": \"Upon successfully splitting an input FlowFile, the original FlowFile will be sent to this relationship.\",\n+                                \"description\": \"Request FlowFiles transferred when receiving HTTP responses with a status code between 200 and 299.\",\n                                 \"name\": \"original\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\",\n-                            \"EVENT_DRIVEN\"\n+                            \"CRON_DRIVEN\"\n                         ],\n                         \"supportsBatching\": true,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": true,\n+                        \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"avro\",\n-                            \"csv\",\n-                            \"freeform\",\n-                            \"generic\",\n-                            \"json\",\n-                            \"log\",\n-                            \"logs\",\n-                            \"schema\",\n-                            \"split\",\n-                            \"text\"\n+                            \"Workday\",\n+                            \"report\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.standard.SplitRecord\",\n-                        \"typeDescription\": \"Splits up an input FlowFile that is in a record-oriented data format into multiple smaller FlowFiles\",\n+                        \"type\": \"org.apache.nifi.processors.workday.GetWorkdayReport\",\n+                        \"typeDescription\": \"A processor which can interact with a configurable Workday Report. The processor can forward the content without modification, or you can transform it by providing the specific Record Reader and Record Writer services based on your needs. You can also remove fields by defining schema in the Record Writer. Supported Workday report formats are: csv, simplexml, json\",\n                         \"version\": \"1.27.0\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"Sets the mime.type attribute to the MIME Type specified by the Record Writer for the FlowFiles routed to the 'splits' Relationship.\",\n-                                \"name\": \"mime.type\"\n-                            },\n-                            {\n-                                \"description\": \"The number of records in the FlowFile. This is added to FlowFiles that are routed to the 'splits' Relationship.\",\n-                                \"name\": \"record.count\"\n-                            },\n-                            {\n-                                \"description\": \"All split FlowFiles produced from the same parent FlowFile will have the same randomly generated UUID added for this attribute\",\n-                                \"name\": \"fragment.identifier\"\n+                                \"description\": \"The Java exception class raised when the processor fails\",\n+                                \"name\": \"getworkdayreport.java.exception.class\"\n                             },\n                             {\n-                                \"description\": \"A one-up number that indicates the ordering of the split FlowFiles that were created from a single parent FlowFile\",\n-                                \"name\": \"fragment.index\"\n+                                \"description\": \"The Java exception message raised when the processor fails\",\n+                                \"name\": \"getworkdayreport.java.exception.message\"\n                             },\n                             {\n-                                \"description\": \"The number of split FlowFiles generated from the parent FlowFile\",\n-                                \"name\": \"fragment.count\"\n+                                \"description\": \"Sets the mime.type attribute to the MIME Type specified by the Source / Record Writer\",\n+                                \"name\": \"mime.type\"\n                             },\n                             {\n-                                \"description\": \"The filename of the parent FlowFile\",\n-                                \"name\": \"segment.original.filename \"\n+                                \"description\": \"The number of records in an outgoing FlowFile. This is only populated on the 'success' relationship when Record Reader and Writer is set.\",\n+                                \"name\": \"record.count\"\n                             }\n                         ]\n-                    },\n+                    }\n+                ],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"1.27.0\"\n+        },\n+        {\n+            \"artifact\": \"nifi-aws-service-api-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [],\n+                \"processors\": [],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"1.27.0\"\n+        },\n+        {\n+            \"artifact\": \"nifi-proxy-configuration-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-standard-nar\",\n+                        \"artifact\": \"nifi-proxy-configuration-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n-                        \"defaultBulletinLevel\": \"WARN\",\n-                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": 1,\n-                            \"EVENT_DRIVEN\": 0,\n-                            \"TIMER_DRIVEN\": 1\n-                        },\n-                        \"defaultPenaltyDuration\": \"30 sec\",\n-                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"0 sec\"\n-                        },\n-                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n-                        \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_REQUIRED\",\n-                        \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Header Line Count\": {\n-                                \"defaultValue\": \"0\",\n-                                \"description\": \"The number of lines that should be considered part of the header; the header lines will be duplicated to all split files\",\n-                                \"displayName\": \"Header Line Count\",\n+                            \"proxy-server-host\": {\n+                                \"description\": \"Proxy server hostname or ip-address.\",\n+                                \"displayName\": \"Proxy Server Host\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Header Line Count\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"proxy-server-host\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Header Line Marker Characters\": {\n-                                \"description\": \"The first character(s) on the line of the datafile which signifies a header line. This value is ignored when Header Line Count is non-zero. The first line not containing the Header Line Marker Characters and all subsequent lines are considered non-header\",\n-                                \"displayName\": \"Header Line Marker Characters\",\n+                            \"proxy-server-port\": {\n+                                \"description\": \"Proxy server port number.\",\n+                                \"displayName\": \"Proxy Server Port\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Header Line Marker Characters\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"proxy-server-port\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Line Split Count\": {\n-                                \"description\": \"The number of lines that will be added to each split file, excluding header lines. A value of zero requires Maximum Fragment Size to be set, and line count will not be considered in determining splits.\",\n-                                \"displayName\": \"Line Split Count\",\n+                            \"proxy-type\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"DIRECT\",\n+                                        \"value\": \"DIRECT\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"HTTP\",\n+                                        \"value\": \"HTTP\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"SOCKS\",\n+                                        \"value\": \"SOCKS\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"DIRECT\",\n+                                \"description\": \"Proxy type.\",\n+                                \"displayName\": \"Proxy Type\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Line Split Count\",\n+                                \"name\": \"proxy-type\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Maximum Fragment Size\": {\n-                                \"description\": \"The maximum size of each split file, including header lines. NOTE: in the case where a single line exceeds this property (including headers, if applicable), that line will be output in a split of its own which exceeds this Maximum Fragment Size setting.\",\n-                                \"displayName\": \"Maximum Fragment Size\",\n+                            \"proxy-user-name\": {\n+                                \"description\": \"The name of the proxy client for user authentication.\",\n+                                \"displayName\": \"Proxy User Name\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Maximum Fragment Size\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"proxy-user-name\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Remove Trailing Newlines\": {\n+                            \"proxy-user-password\": {\n+                                \"description\": \"The password of the proxy client for user authentication.\",\n+                                \"displayName\": \"Proxy User Password\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"proxy-user-password\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n+                            },\n+                            \"socks-version\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"displayName\": \"SOCKS4\",\n+                                        \"value\": \"SOCKS4\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"displayName\": \"SOCKS5\",\n+                                        \"value\": \"SOCKS5\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"true\",\n-                                \"description\": \"Whether to remove newlines at the end of each split file. This should be false if you intend to merge the split files later. If this is set to 'true' and a FlowFile is generated that contains only 'empty lines' (i.e., consists only of \\\\r and \\\\n characters), the FlowFile will not be emitted. Note, however, that if header lines are specified, the resultant FlowFile will never be empty as it will consist of the header lines, so a FlowFile may be emitted that contains only the header lines.\",\n-                                \"displayName\": \"Remove Trailing Newlines\",\n+                                \"defaultValue\": \"SOCKS5\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"SOCKS\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Proxy Type\",\n+                                        \"propertyName\": \"proxy-type\"\n+                                    }\n+                                ],\n+                                \"description\": \"SOCKS Protocol Version\",\n+                                \"displayName\": \"SOCKS Version\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Remove Trailing Newlines\",\n+                                \"name\": \"socks-version\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             }\n                         },\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.processors.standard.MergeContent\"\n-                        ],\n-                        \"sideEffectFree\": true,\n-                        \"supportedRelationships\": [\n-                            {\n-                                \"description\": \"If a file cannot be split for some reason, the original file will be routed to this destination and nothing will be routed elsewhere\",\n-                                \"name\": \"failure\"\n-                            },\n-                            {\n-                                \"description\": \"The original input file will be routed to this destination when it has been successfully split into 1 or more files\",\n-                                \"name\": \"original\"\n-                            },\n+                        \"providedApiImplementations\": [\n                             {\n-                                \"description\": \"The split files will be routed to this destination when an input file is successfully split into 1 or more split files\",\n-                                \"name\": \"splits\"\n+                                \"artifact\": \"nifi-standard-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.proxy.ProxyConfigurationService\",\n+                                \"version\": \"1.27.0\"\n                             }\n                         ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\",\n-                            \"EVENT_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": true,\n                         \"supportsDynamicProperties\": false,\n-                        \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": true,\n                         \"supportsSensitiveDynamicProperties\": false,\n-                        \"systemResourceConsiderations\": [\n-                            {\n-                                \"description\": \"The FlowFile with its attributes is stored in memory, not the content of the FlowFile. If many splits are generated due to the size of the content, or how the content is configured to be split, a two-phase approach may be necessary to avoid excessive use of memory.\",\n-                                \"resource\": \"MEMORY\"\n-                            }\n-                        ],\n                         \"tags\": [\n-                            \"split\",\n-                            \"text\"\n+                            \"Proxy\"\n                         ],\n-                        \"triggerSerially\": false,\n-                        \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.standard.SplitText\",\n-                        \"typeDescription\": \"Splits a text file into multiple smaller text files on line boundaries limited by maximum number of lines or total size of fragment. Each output split file will contain no more than the configured number of lines or bytes. If both Line Split Count and Maximum Fragment Size are specified, the split occurs at whichever limit is reached first. If the first line of a fragment exceeds the Maximum Fragment Size, that line will be output in a single split file which exceeds the configured maximum size limit. This component also allows one to specify that each split should include a header lines. Header lines can be computed by either specifying the amount of lines that should constitute a header or by using header marker to match against the read lines. If such match happens then the corresponding line will be treated as header. Keep in mind that upon the first failure of header marker match, no more matches will be performed and the rest of the data will be parsed as regular lines for a given split. If after computation of the header there are no more data, the resulting split will consists of only header lines.\",\n-                        \"version\": \"1.27.0\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"The number of lines of text from the original FlowFile that were copied to this FlowFile\",\n-                                \"name\": \"text.line.count\"\n-                            },\n-                            {\n-                                \"description\": \"The number of bytes from the original FlowFile that were copied to this FlowFile, including header, if applicable, which is duplicated in each split FlowFile\",\n-                                \"name\": \"fragment.size\"\n-                            },\n-                            {\n-                                \"description\": \"All split FlowFiles produced from the same parent FlowFile will have the same randomly generated UUID added for this attribute\",\n-                                \"name\": \"fragment.identifier\"\n-                            },\n-                            {\n-                                \"description\": \"A one-up number that indicates the ordering of the split FlowFiles that were created from a single parent FlowFile\",\n-                                \"name\": \"fragment.index\"\n-                            },\n-                            {\n-                                \"description\": \"The number of split FlowFiles generated from the parent FlowFile\",\n-                                \"name\": \"fragment.count\"\n-                            },\n-                            {\n-                                \"description\": \"The filename of the parent FlowFile\",\n-                                \"name\": \"segment.original.filename \"\n-                            }\n-                        ]\n-                    },\n+                        \"type\": \"org.apache.nifi.proxy.StandardProxyConfigurationService\",\n+                        \"typeDescription\": \"Provides a set of configurations for different NiFi components to use a proxy server.\",\n+                        \"version\": \"1.27.0\"\n+                    }\n+                ],\n+                \"processors\": [],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"1.27.0\"\n+        },\n+        {\n+            \"artifact\": \"nifi-registry-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-standard-nar\",\n+                        \"artifact\": \"nifi-registry-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n-                        \"defaultBulletinLevel\": \"WARN\",\n-                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": 1,\n-                            \"EVENT_DRIVEN\": 0,\n-                            \"TIMER_DRIVEN\": 1\n-                        },\n-                        \"defaultPenaltyDuration\": \"30 sec\",\n-                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"0 sec\"\n-                        },\n-                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n-                        \"defaultYieldDuration\": \"1 sec\",\n+                        \"dynamicProperties\": [\n+                            {\n+                                \"description\": \"Adds a named schema using the JSON string representation of an Avro schema\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"name\": \"Schema name\",\n+                                \"value\": \"Schema Content\"\n+                            }\n+                        ],\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_REQUIRED\",\n-                        \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Split Depth\": {\n-                                \"defaultValue\": \"1\",\n-                                \"description\": \"Indicates the XML-nesting depth to start splitting XML fragments. A depth of 1 means split the root's children, whereas a depth of 2 means split the root's children's children and so forth.\",\n-                                \"displayName\": \"Split Depth\",\n+                            \"avro-reg-validated-field-names\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"true\",\n+                                \"description\": \"Whether or not to validate the field names in the Avro schema based on Avro naming rules. If set to true, all field names must be valid Avro names, which must begin with [A-Za-z_], and subsequently contain only [A-Za-z0-9_]. If set to false, no validation will be performed on the field names.\",\n+                                \"displayName\": \"Validate Field Names\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Split Depth\",\n+                                \"name\": \"avro-reg-validated-field-names\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             }\n                         },\n-                        \"sideEffectFree\": true,\n-                        \"supportedRelationships\": [\n-                            {\n-                                \"description\": \"If a FlowFile fails processing for any reason (for example, the FlowFile is not valid XML), it will be routed to this relationship\",\n-                                \"name\": \"failure\"\n-                            },\n-                            {\n-                                \"description\": \"The original FlowFile that was split into segments. If the FlowFile fails processing, nothing will be sent to this relationship\",\n-                                \"name\": \"original\"\n-                            },\n+                        \"providedApiImplementations\": [\n                             {\n-                                \"description\": \"All segments of the original FlowFile will be routed to this relationship\",\n-                                \"name\": \"split\"\n+                                \"artifact\": \"nifi-standard-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.schemaregistry.services.SchemaRegistry\",\n+                                \"version\": \"1.27.0\"\n                             }\n                         ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\",\n-                            \"EVENT_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": true,\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": true,\n+                        \"supportsDynamicProperties\": true,\n                         \"supportsSensitiveDynamicProperties\": false,\n-                        \"systemResourceConsiderations\": [\n-                            {\n-                                \"description\": \"The entirety of the FlowFile's content (as a Document object) is read into memory, in addition to all of the generated FlowFiles representing the split XML. A Document object can take approximately 10 times as much memory as the size of the XML. For example, a 1 MB XML document may use 10 MB of memory. If many splits are generated due to the size of the XML, a two-phase approach may be necessary to avoid excessive use of memory.\",\n-                                \"resource\": \"MEMORY\"\n-                            }\n-                        ],\n                         \"tags\": [\n-                            \"split\",\n-                            \"xml\"\n+                            \"avro\",\n+                            \"csv\",\n+                            \"json\",\n+                            \"registry\",\n+                            \"schema\"\n                         ],\n-                        \"triggerSerially\": false,\n-                        \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.standard.SplitXml\",\n-                        \"typeDescription\": \"Splits an XML File into multiple separate FlowFiles, each comprising a child or descendant of the original root element\",\n-                        \"version\": \"1.27.0\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"All split FlowFiles produced from the same parent FlowFile will have the same randomly generated UUID added for this attribute\",\n-                                \"name\": \"fragment.identifier\"\n-                            },\n-                            {\n-                                \"description\": \"A one-up number that indicates the ordering of the split FlowFiles that were created from a single parent FlowFile\",\n-                                \"name\": \"fragment.index\"\n-                            },\n-                            {\n-                                \"description\": \"The number of split FlowFiles generated from the parent FlowFile\",\n-                                \"name\": \"fragment.count\"\n-                            },\n-                            {\n-                                \"description\": \"The filename of the parent FlowFile\",\n-                                \"name\": \"segment.original.filename \"\n-                            }\n-                        ]\n+                        \"type\": \"org.apache.nifi.schemaregistry.services.AvroSchemaRegistry\",\n+                        \"typeDescription\": \"Provides a service for registering and accessing schemas. You can register a schema as a dynamic property where 'name' represents the schema name and 'value' represents the textual representation of the actual schema following the syntax and semantics of Avro's Schema format.\",\n+                        \"version\": \"1.27.0\"\n                     },\n                     {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-standard-nar\",\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-registry-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n-                        \"defaultBulletinLevel\": \"WARN\",\n-                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": 1,\n-                            \"TIMER_DRIVEN\": 1\n-                        },\n-                        \"defaultPenaltyDuration\": \"30 sec\",\n-                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"30 sec\"\n-                        },\n-                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n-                        \"defaultYieldDuration\": \"1 sec\",\n-                        \"explicitRestrictions\": [\n+                        \"dynamicProperties\": [\n                             {\n-                                \"explanation\": \"Provides operator the ability to read from any file that NiFi has access to.\",\n-                                \"requiredPermission\": \"read filesystem\"\n+                                \"description\": \"Adds a named schema using the JSON string representation of a JSON schema\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"name\": \"Schema Name\",\n+                                \"value\": \"Schema Content\"\n                             }\n                         ],\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n-                        \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"File Location\": {\n+                            \"JSON Schema Version\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"State is stored locally. Each node in a cluster will tail a different file.\",\n-                                        \"displayName\": \"Local\",\n-                                        \"value\": \"Local\"\n+                                        \"description\": \"Draft Version 4\",\n+                                        \"displayName\": \"Draft 4\",\n+                                        \"value\": \"DRAFT_4\"\n                                     },\n                                     {\n-                                        \"description\": \"State is located on a remote resource. This Processor will store state across the cluster so that it can be run on Primary Node Only and a new Primary Node can pick up where the last one left off.\",\n-                                        \"displayName\": \"Remote\",\n-                                        \"value\": \"Remote\"\n+                                        \"description\": \"Draft Version 6\",\n+                                        \"displayName\": \"Draft 6\",\n+                                        \"value\": \"DRAFT_6\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Draft Version 7\",\n+                                        \"displayName\": \"Draft 7\",\n+                                        \"value\": \"DRAFT_7\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Draft Version 2019-09\",\n+                                        \"displayName\": \"Draft 2019-09\",\n+                                        \"value\": \"DRAFT_2019_09\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Draft Version 2020-12\",\n+                                        \"displayName\": \"Draft 2020-12\",\n+                                        \"value\": \"DRAFT_2020_12\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"Local\",\n-                                \"description\": \"Specifies where the state is located either local or cluster so that state can be stored appropriately in order to ensure that all data is consumed without duplicating data upon restart of NiFi\",\n-                                \"displayName\": \"State Location\",\n+                                \"defaultValue\": \"DRAFT_2020_12\",\n+                                \"description\": \"The JSON schema specification\",\n+                                \"displayName\": \"JSON Schema Version\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"File Location\",\n+                                \"name\": \"JSON Schema Version\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n-                            },\n-                            \"File to Tail\": {\n-                                \"description\": \"Path of the file to tail in case of single file mode. If using multifile mode, regular expression to find files to tail in the base directory. In case recursivity is set to true, the regular expression will be used to match the path starting from the base directory (see additional details for examples).\",\n-                                \"displayName\": \"File(s) to Tail\",\n+                            }\n+                        },\n+                        \"providedApiImplementations\": [\n+                            {\n+                                \"artifact\": \"nifi-standard-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.schemaregistry.services.JsonSchemaRegistry\",\n+                                \"version\": \"1.27.0\"\n+                            }\n+                        ],\n+                        \"supportsDynamicProperties\": true,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"json\",\n+                            \"registry\",\n+                            \"schema\"\n+                        ],\n+                        \"type\": \"org.apache.nifi.schemaregistry.services.StandardJsonSchemaRegistry\",\n+                        \"typeDescription\": \"Provides a service for registering and accessing JSON schemas. One can register a schema as a dynamic property where 'name' represents the schema name and 'value' represents the textual representation of the actual schema following the syntax and semantics of the JSON Schema format. Empty schemas and schemas only consisting of whitespace are not acceptable schemas.The registry is heterogeneous registry as it can store schemas of different schema draft versions. By default the registry is configured to store schemas of Draft 2020-12. When a schema is added, the version which is currently is set, is what the schema is saved as.\",\n+                        \"version\": \"1.27.0\"\n+                    }\n+                ],\n+                \"processors\": [],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"1.27.0\"\n+        },\n+        {\n+            \"artifact\": \"nifi-ambari-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [],\n+                \"processors\": [],\n+                \"reportingTasks\": [\n+                    {\n+                        \"additionalDetails\": true,\n+                        \"artifact\": \"nifi-ambari-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"e0c4461\"\n+                        },\n+                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n+                            \"CRON_DRIVEN\": \"* * * * * ?\",\n+                            \"TIMER_DRIVEN\": \"1 min\"\n+                        },\n+                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n+                        \"deprecated\": true,\n+                        \"deprecationReason\": \"This reporting task is deprecated and will be removed in NiFi 2.x.\",\n+                        \"group\": \"org.apache.nifi\",\n+                        \"propertyDescriptors\": {\n+                            \"Application ID\": {\n+                                \"defaultValue\": \"nifi\",\n+                                \"description\": \"The Application ID to be included in the metrics sent to Ambari\",\n+                                \"displayName\": \"Application ID\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n                                 \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"File to Tail\",\n+                                \"name\": \"Application ID\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Initial Start Position\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"Start with the oldest data that matches the Rolling Filename Pattern and then begin reading from the File to Tail\",\n-                                        \"displayName\": \"Beginning of Time\",\n-                                        \"value\": \"Beginning of Time\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Start with the beginning of the File to Tail. Do not ingest any data that has already been rolled over\",\n-                                        \"displayName\": \"Beginning of File\",\n-                                        \"value\": \"Beginning of File\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Start with the data at the end of the File to Tail. Do not ingest any data thas has already been rolled over or any data in the File to Tail that has already been written.\",\n-                                        \"displayName\": \"Current Time\",\n-                                        \"value\": \"Current Time\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"Beginning of File\",\n-                                \"description\": \"When the Processor first begins to tail data, this property specifies where the Processor should begin reading data. Once data has been ingested from a file, the Processor will continue from the last point from which it has received data.\",\n-                                \"displayName\": \"Initial Start Position\",\n+                            \"Hostname\": {\n+                                \"defaultValue\": \"${hostname(true)}\",\n+                                \"description\": \"The Hostname of this NiFi instance to be included in the metrics sent to Ambari\",\n+                                \"displayName\": \"Hostname\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Initial Start Position\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Hostname\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Line Start Pattern\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"Single file\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Tailing mode\",\n-                                        \"propertyName\": \"tail-mode\"\n-                                    }\n-                                ],\n-                                \"description\": \"A Regular Expression to match against the start of a log line. If specified, any line that matches the expression, and any following lines, will be buffered until another line matches the Expression. In doing this, we can avoid splitting apart multi-line messages in the file. This assumes that the data is in UTF-8 format.\",\n-                                \"displayName\": \"Line Start Pattern\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Line Start Pattern\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"Max Buffer Size\": {\n-                                \"defaultValue\": \"64 KB\",\n-                                \"dependencies\": [\n-                                    {\n-                                        \"propertyDisplayName\": \"Line Start Pattern\",\n-                                        \"propertyName\": \"Line Start Pattern\"\n-                                    }\n-                                ],\n-                                \"description\": \"When using the Line Start Pattern, there may be situations in which the data in the file being tailed never matches the Regular Expression. This would result in the processor buffering all data from the tailed file, which can quickly exhaust the heap. To avoid this, the Processor will buffer only up to this amount of data before flushing the buffer, even if it means ingesting partial data from the file.\",\n-                                \"displayName\": \"Max Buffer Size\",\n+                            \"Metrics Collector URL\": {\n+                                \"defaultValue\": \"http://localhost:6188/ws/v1/timeline/metrics\",\n+                                \"description\": \"The URL of the Ambari Metrics Collector Service\",\n+                                \"displayName\": \"Metrics Collector URL\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Max Buffer Size\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Metrics Collector URL\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Post-Rollover Tail Period\": {\n-                                \"defaultValue\": \"0 sec\",\n-                                \"description\": \"When a file is rolled over, the processor will continue tailing the rolled over file until it has not been modified for this amount of time. This allows for another process to rollover a file, and then flush out any buffered data. Note that when this value is set, and the tailed file rolls over, the new file will not be tailed until the old file has not been modified for the configured amount of time. Additionally, when using this capability, in order to avoid data duplication, this period must be set longer than the Processor's Run Schedule, and the Processor must not be stopped after the file being tailed has been rolled over and before the data has been fully consumed. Otherwise, the data may be duplicated, as the entire file may be written out as the contents of a single FlowFile.\",\n-                                \"displayName\": \"Post-Rollover Tail Period\",\n+                            \"Process Group ID\": {\n+                                \"description\": \"If specified, the reporting task will send metrics about this process group only. If not, the root process group is used and global metrics are sent.\",\n+                                \"displayName\": \"Process Group ID\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Post-Rollover Tail Period\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Process Group ID\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n-                            },\n-                            \"Rolling Filename Pattern\": {\n-                                \"description\": \"If the file to tail \\\"rolls over\\\" as would be the case with log files, this filename pattern will be used to identify files that have rolled over so that if NiFi is restarted, and the file has rolled over, it will be able to pick up where it left off. This pattern supports wildcard characters * and ?, it also supports the notation ${filename} to specify a pattern based on the name of the file (without extension), and will assume that the files that have rolled over live in the same directory as the file being tailed. The same glob pattern will be used for all files.\",\n-                                \"displayName\": \"Rolling Filename Pattern\",\n+                            }\n+                        },\n+                        \"supportedSchedulingStrategies\": [\n+                            \"TIMER_DRIVEN\",\n+                            \"CRON_DRIVEN\"\n+                        ],\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsSensitiveDynamicProperties\": false,\n+                        \"tags\": [\n+                            \"ambari\",\n+                            \"metrics\",\n+                            \"reporting\"\n+                        ],\n+                        \"type\": \"org.apache.nifi.reporting.ambari.AmbariReportingTask\",\n+                        \"typeDescription\": \"Publishes metrics from NiFi to Ambari Metrics Service (AMS). Due to how the Ambari Metrics Service works, this reporting task should be scheduled to run every 60 seconds. Each iteration it will send the metrics from the previous iteration, and calculate the current metrics to be sent on next iteration. Scheduling this reporting task at a frequency other than 60 seconds may produce unexpected results.\",\n+                        \"version\": \"1.27.0\"\n+                    }\n+                ]\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"1.27.0\"\n+        },\n+        {\n+            \"artifact\": \"nifi-ssl-context-service-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-ssl-context-service-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"e0c4461\"\n+                        },\n+                        \"group\": \"org.apache.nifi\",\n+                        \"propertyDescriptors\": {\n+                            \"Keystore Filename\": {\n+                                \"description\": \"The fully-qualified filename of the Keystore\",\n+                                \"displayName\": \"Keystore Filename\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Rolling Filename Pattern\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Keystore Filename\",\n                                 \"required\": false,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"SINGLE\",\n+                                    \"resourceTypes\": [\n+                                        \"FILE\"\n+                                    ]\n+                                },\n                                 \"sensitive\": false\n                             },\n-                            \"pre-allocated-buffer-size\": {\n-                                \"defaultValue\": \"65536 B\",\n-                                \"description\": \"Sets the amount of memory that is pre-allocated for each tailed file.\",\n-                                \"displayName\": \"Pre-Allocated Buffer Size\",\n+                            \"Keystore Password\": {\n+                                \"description\": \"The password for the Keystore\",\n+                                \"displayName\": \"Keystore Password\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"pre-allocated-buffer-size\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n+                                \"name\": \"Keystore Password\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n                             },\n-                            \"reread-on-nul\": {\n+                            \"Keystore Type\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"displayName\": \"BCFKS\",\n+                                        \"value\": \"BCFKS\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"displayName\": \"PKCS12\",\n+                                        \"value\": \"PKCS12\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"JKS\",\n+                                        \"value\": \"JKS\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"If this option is set to 'true', when a NUL character is read, the processor will yield and try to read the same part again later. (Note: Yielding may delay the processing of other files tailed by this processor, not just the one with the NUL character.) The purpose of this flag is to allow users to handle cases where reading a file may return temporary NUL values. NFS for example may send file contents out of order. In this case the missing parts are temporarily replaced by NUL values. CAUTION! If the file contains legitimate NUL values, setting this flag causes this processor to get stuck indefinitely. For this reason users should refrain from using this feature if they can help it and try to avoid having the target file on a file system where reads are unreliable.\",\n-                                \"displayName\": \"Reread when NUL encountered\",\n+                                \"description\": \"The Type of the Keystore\",\n+                                \"displayName\": \"Keystore Type\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"reread-on-nul\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"tail-base-directory\": {\n-                                \"description\": \"Base directory used to look for files to tail. This property is required when using Multifile mode.\",\n-                                \"displayName\": \"Base directory\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"tail-base-directory\",\n+                                \"name\": \"Keystore Type\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"tail-mode\": {\n+                            \"SSL Protocol\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"In this mode, only the one file indicated in the 'Files to tail' property will be watched by the processor. In this mode, the file may not exist when starting the processor.\",\n-                                        \"displayName\": \"Single file\",\n-                                        \"value\": \"Single file\"\n+                                        \"description\": \"Negotiate latest protocol version based on platform supported versions\",\n+                                        \"displayName\": \"TLS\",\n+                                        \"value\": \"TLS\"\n                                     },\n                                     {\n-                                        \"description\": \"In this mode, the 'Files to tail' property accepts a regular expression and the processor will look for files in 'Base directory' to list the files to tail by the processor.\",\n-                                        \"displayName\": \"Multiple files\",\n-                                        \"value\": \"Multiple files\"\n+                                        \"description\": \"Require TLSv1.3 protocol version\",\n+                                        \"displayName\": \"TLSv1.3\",\n+                                        \"value\": \"TLSv1.3\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Require TLSv1.2 protocol version\",\n+                                        \"displayName\": \"TLSv1.2\",\n+                                        \"value\": \"TLSv1.2\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"Single file\",\n-                                \"description\": \"Mode to use: single file will tail only one file, multiple file will look for a list of file. In Multiple mode the Base directory is required.\",\n-                                \"displayName\": \"Tailing mode\",\n+                                \"defaultValue\": \"TLS\",\n+                                \"description\": \"TLS Protocol Version for encrypted connections. Supported versions depend on the specific version of Java used.\",\n+                                \"displayName\": \"TLS Protocol\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"tail-mode\",\n-                                \"required\": true,\n+                                \"name\": \"SSL Protocol\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"tailfile-lookup-frequency\": {\n-                                \"defaultValue\": \"10 minutes\",\n-                                \"description\": \"Only used in Multiple files mode. It specifies the minimum duration the processor will wait before listing again the files to tail.\",\n-                                \"displayName\": \"Lookup frequency\",\n+                            \"Truststore Filename\": {\n+                                \"description\": \"The fully-qualified filename of the Truststore\",\n+                                \"displayName\": \"Truststore Filename\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"tailfile-lookup-frequency\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Truststore Filename\",\n                                 \"required\": false,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"SINGLE\",\n+                                    \"resourceTypes\": [\n+                                        \"FILE\"\n+                                    ]\n+                                },\n                                 \"sensitive\": false\n                             },\n-                            \"tailfile-maximum-age\": {\n-                                \"defaultValue\": \"24 hours\",\n-                                \"description\": \"Only used in Multiple files mode. It specifies the necessary minimum duration to consider that no new messages will be appended in a file regarding its last modification date. This should not be set too low to avoid duplication of data in case new messages are appended at a lower frequency.\",\n-                                \"displayName\": \"Maximum age\",\n+                            \"Truststore Password\": {\n+                                \"description\": \"The password for the Truststore\",\n+                                \"displayName\": \"Truststore Password\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"tailfile-maximum-age\",\n+                                \"name\": \"Truststore Password\",\n                                 \"required\": false,\n-                                \"sensitive\": false\n+                                \"sensitive\": true\n                             },\n-                            \"tailfile-recursive-lookup\": {\n+                            \"Truststore Type\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"displayName\": \"BCFKS\",\n+                                        \"value\": \"BCFKS\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"displayName\": \"PKCS12\",\n+                                        \"value\": \"PKCS12\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"JKS\",\n+                                        \"value\": \"JKS\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"When using Multiple files mode, this property defines if files must be listed recursively or not in the base directory.\",\n-                                \"displayName\": \"Recursive lookup\",\n+                                \"description\": \"The Type of the Truststore\",\n+                                \"displayName\": \"Truststore Type\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"tailfile-recursive-lookup\",\n-                                \"required\": true,\n+                                \"name\": \"Truststore Type\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n+                            },\n+                            \"key-password\": {\n+                                \"description\": \"The password for the key. If this is not specified, but the Keystore Filename, Password, and Type are specified, then the Keystore Password will be assumed to be the same as the Key Password.\",\n+                                \"displayName\": \"Key Password\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"key-password\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n                             }\n                         },\n-                        \"restricted\": true,\n-                        \"sideEffectFree\": false,\n-                        \"stateful\": {\n-                            \"description\": \"Stores state about where in the Tailed File it left off so that on restart it does not have to duplicate data. State is stored either local or clustered depend on the <File Location> property.\",\n-                            \"scopes\": [\n-                                \"CLUSTER\",\n-                                \"LOCAL\"\n-                            ]\n-                        },\n-                        \"supportedRelationships\": [\n+                        \"providedApiImplementations\": [\n                             {\n-                                \"description\": \"All FlowFiles are routed to this Relationship.\",\n-                                \"name\": \"success\"\n+                                \"artifact\": \"nifi-standard-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n+                                \"version\": \"1.27.0\"\n+                            },\n+                            {\n+                                \"artifact\": \"nifi-standard-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.ssl.RestrictedSSLContextService\",\n+                                \"version\": \"1.27.0\"\n                             }\n                         ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n-                        \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"file\",\n-                            \"log\",\n-                            \"source\",\n-                            \"tail\",\n-                            \"text\"\n+                            \"certificate\",\n+                            \"jks\",\n+                            \"keystore\",\n+                            \"p12\",\n+                            \"pkcs\",\n+                            \"pkcs12\",\n+                            \"secure\",\n+                            \"ssl\",\n+                            \"tls\",\n+                            \"truststore\"\n                         ],\n-                        \"triggerSerially\": true,\n-                        \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.standard.TailFile\",\n-                        \"typeDescription\": \"\\\"Tails\\\" a file, or a list of files, ingesting data from the file as it is written to the file. The file is expected to be textual. Data is ingested only when a new line is encountered (carriage return or new-line character or combination). If the file to tail is periodically \\\"rolled over\\\", as is generally the case with log files, an optional Rolling Filename Pattern can be used to retrieve data from files that have rolled over, even if the rollover occurred while NiFi was not running (provided that the data still exists upon restart of NiFi). It is generally advisable to set the Run Schedule to a few seconds, rather than running with the default value of 0 secs, as this Processor will consume a lot of resources if scheduled very aggressively. At this time, this Processor does not support ingesting files that have been compressed when 'rolled over'.\",\n-                        \"version\": \"1.27.0\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"Path of the original file the flow file comes from.\",\n-                                \"name\": \"tailfile.original.path\"\n-                            }\n-                        ]\n+                        \"type\": \"org.apache.nifi.ssl.StandardRestrictedSSLContextService\",\n+                        \"typeDescription\": \"Restricted implementation of the SSLContextService. Provides the ability to configure keystore and/or truststore properties once and reuse that configuration throughout the application, but only allows a restricted set of TLS/SSL protocols to be chosen (no SSL protocols are supported). The set of protocols selectable will evolve over time as new protocols emerge and older protocols are deprecated. This service is recommended over StandardSSLContextService if a component doesn't expect to communicate with legacy systems since it is unlikely that legacy systems will support these protocols.\",\n+                        \"version\": \"1.27.0\"\n                     },\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-standard-nar\",\n+                        \"artifact\": \"nifi-ssl-context-service-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n-                        \"defaultBulletinLevel\": \"WARN\",\n-                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": 1,\n-                            \"EVENT_DRIVEN\": 0,\n-                            \"TIMER_DRIVEN\": 1\n-                        },\n-                        \"defaultPenaltyDuration\": \"30 sec\",\n-                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"0 sec\"\n-                        },\n-                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n-                        \"defaultYieldDuration\": \"1 sec\",\n-                        \"dynamicProperties\": [\n-                            {\n-                                \"description\": \"These XSLT parameters are passed to the transformer\",\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"name\": \"An XSLT transform parameter name\",\n-                                \"value\": \"An XSLT transform parameter value\"\n-                            }\n-                        ],\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_REQUIRED\",\n-                        \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"XSLT file name\": {\n-                                \"description\": \"Provides the name (including full path) of the XSLT file to apply to the FlowFile XML content.One of the 'XSLT file name' and 'XSLT Lookup' properties must be defined.\",\n-                                \"displayName\": \"XSLT file name\",\n+                            \"Keystore Filename\": {\n+                                \"description\": \"The fully-qualified filename of the Keystore\",\n+                                \"displayName\": \"Keystore Filename\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"XSLT file name\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Keystore Filename\",\n                                 \"required\": false,\n                                 \"resourceDefinition\": {\n                                     \"cardinality\": \"SINGLE\",\n                                     \"resourceTypes\": [\n                                         \"FILE\"\n                                     ]\n                                 },\n                                 \"sensitive\": false\n                             },\n-                            \"cache-size\": {\n-                                \"defaultValue\": \"10\",\n-                                \"description\": \"Maximum number of stylesheets to cache. Zero disables the cache.\",\n-                                \"displayName\": \"Cache size\",\n+                            \"Keystore Password\": {\n+                                \"description\": \"The password for the Keystore\",\n+                                \"displayName\": \"Keystore Password\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"cache-size\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n+                                \"name\": \"Keystore Password\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n                             },\n-                            \"cache-ttl-after-last-access\": {\n-                                \"defaultValue\": \"60 secs\",\n-                                \"description\": \"The cache TTL (time-to-live) or how long to keep stylesheets in the cache after last access.\",\n-                                \"displayName\": \"Cache TTL after last access\",\n+                            \"Keystore Type\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"BCFKS\",\n+                                        \"value\": \"BCFKS\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"PKCS12\",\n+                                        \"value\": \"PKCS12\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"JKS\",\n+                                        \"value\": \"JKS\"\n+                                    }\n+                                ],\n+                                \"description\": \"The Type of the Keystore\",\n+                                \"displayName\": \"Keystore Type\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"cache-ttl-after-last-access\",\n-                                \"required\": true,\n+                                \"name\": \"Keystore Type\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"indent-output\": {\n+                            \"SSL Protocol\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"description\": \"Negotiate latest SSL or TLS protocol version based on platform supported versions\",\n+                                        \"displayName\": \"SSL\",\n+                                        \"value\": \"SSL\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"description\": \"Negotiate latest TLS protocol version based on platform supported versions\",\n+                                        \"displayName\": \"TLS\",\n+                                        \"value\": \"TLS\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Require TLSv1.3 protocol version\",\n+                                        \"displayName\": \"TLSv1.3\",\n+                                        \"value\": \"TLSv1.3\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Require TLSv1.2 protocol version\",\n+                                        \"displayName\": \"TLSv1.2\",\n+                                        \"value\": \"TLSv1.2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Require TLSv1.1 protocol version\",\n+                                        \"displayName\": \"TLSv1.1\",\n+                                        \"value\": \"TLSv1.1\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Require TLSv1 protocol version\",\n+                                        \"displayName\": \"TLSv1\",\n+                                        \"value\": \"TLSv1\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"true\",\n-                                \"description\": \"Whether or not to indent the output.\",\n-                                \"displayName\": \"Indent\",\n+                                \"defaultValue\": \"TLS\",\n+                                \"description\": \"SSL or TLS Protocol Version for encrypted connections. Supported versions include insecure legacy options and depend on the specific version of Java used.\",\n+                                \"displayName\": \"TLS Protocol\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"indent-output\",\n-                                \"required\": true,\n+                                \"name\": \"SSL Protocol\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"secure-processing\": {\n+                            \"Truststore Filename\": {\n+                                \"description\": \"The fully-qualified filename of the Truststore\",\n+                                \"displayName\": \"Truststore Filename\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Truststore Filename\",\n+                                \"required\": false,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"SINGLE\",\n+                                    \"resourceTypes\": [\n+                                        \"FILE\"\n+                                    ]\n+                                },\n+                                \"sensitive\": false\n+                            },\n+                            \"Truststore Password\": {\n+                                \"description\": \"The password for the Truststore\",\n+                                \"displayName\": \"Truststore Password\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Truststore Password\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n+                            },\n+                            \"Truststore Type\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"displayName\": \"BCFKS\",\n+                                        \"value\": \"BCFKS\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"displayName\": \"PKCS12\",\n+                                        \"value\": \"PKCS12\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"JKS\",\n+                                        \"value\": \"JKS\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"true\",\n-                                \"description\": \"Whether or not to mitigate various XML-related attacks like XXE (XML External Entity) attacks.\",\n-                                \"displayName\": \"Secure processing\",\n+                                \"description\": \"The Type of the Truststore\",\n+                                \"displayName\": \"Truststore Type\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"secure-processing\",\n-                                \"required\": true,\n+                                \"name\": \"Truststore Type\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"xslt-controller\": {\n-                                \"description\": \"Controller lookup used to store XSLT definitions. One of the 'XSLT file name' and 'XSLT Lookup' properties must be defined. WARNING: note that the lookup controller service should not be used to store large XSLT files.\",\n-                                \"displayName\": \"XSLT Lookup\",\n+                            \"key-password\": {\n+                                \"description\": \"The password for the key. If this is not specified, but the Keystore Filename, Password, and Type are specified, then the Keystore Password will be assumed to be the same as the Key Password.\",\n+                                \"displayName\": \"Key Password\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"xslt-controller\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.lookup.StringLookupService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            },\n-                            \"xslt-controller-key\": {\n-                                \"description\": \"Key used to retrieve the XSLT definition from the XSLT lookup controller. This property must be set when using the XSLT controller property.\",\n-                                \"displayName\": \"XSLT Lookup key\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"xslt-controller-key\",\n+                                \"name\": \"key-password\",\n                                 \"required\": false,\n-                                \"sensitive\": false\n+                                \"sensitive\": true\n                             }\n                         },\n-                        \"sideEffectFree\": true,\n-                        \"supportedRelationships\": [\n-                            {\n-                                \"description\": \"The FlowFile with transformed content will be routed to this relationship\",\n-                                \"name\": \"success\"\n-                            },\n+                        \"providedApiImplementations\": [\n                             {\n-                                \"description\": \"If a FlowFile fails processing for any reason (for example, the FlowFile is not valid XML), it will be routed to this relationship\",\n-                                \"name\": \"failure\"\n+                                \"artifact\": \"nifi-standard-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n+                                \"version\": \"1.27.0\"\n                             }\n                         ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\",\n-                            \"EVENT_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": true,\n-                        \"supportsDynamicProperties\": true,\n-                        \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": true,\n+                        \"supportsDynamicProperties\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"transform\",\n-                            \"xml\",\n-                            \"xslt\"\n+                            \"certificate\",\n+                            \"jks\",\n+                            \"keystore\",\n+                            \"p12\",\n+                            \"pkcs\",\n+                            \"pkcs12\",\n+                            \"secure\",\n+                            \"ssl\",\n+                            \"tls\",\n+                            \"truststore\"\n                         ],\n-                        \"triggerSerially\": false,\n-                        \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.standard.TransformXml\",\n-                        \"typeDescription\": \"Applies the provided XSLT file to the FlowFile XML payload. A new FlowFile is created with transformed content and is routed to the 'success' relationship. If the XSL transform fails, the original FlowFile is routed to the 'failure' relationship\",\n+                        \"type\": \"org.apache.nifi.ssl.StandardSSLContextService\",\n+                        \"typeDescription\": \"Standard implementation of the SSLContextService. Provides the ability to configure keystore and/or truststore properties once and reuse that configuration throughout the application. This service can be used to communicate with both legacy and modern systems. If you only need to communicate with non-legacy systems, then the StandardRestrictedSSLContextService is recommended as it only allows a specific set of SSL protocols to be chosen.\",\n                         \"version\": \"1.27.0\"\n-                    },\n+                    }\n+                ],\n+                \"processors\": [],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"1.27.0\"\n+        },\n+        {\n+            \"artifact\": \"nifi-standard-shared-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [],\n+                \"processors\": [],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"1.27.0\"\n+        },\n+        {\n+            \"artifact\": \"nifi-jslt-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [],\n+                \"processors\": [\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-standard-nar\",\n+                        \"artifact\": \"nifi-jslt-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n-                            \"EVENT_DRIVEN\": 0,\n                             \"TIMER_DRIVEN\": 1\n                         },\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"File Filter\": {\n-                                \"defaultValue\": \".*\",\n-                                \"description\": \"Only files contained in the archive whose names match the given regular expression will be extracted (tar/zip only)\",\n-                                \"displayName\": \"File Filter\",\n+                            \"jslt-transform-cache-size\": {\n+                                \"defaultValue\": \"1\",\n+                                \"description\": \"Compiling a JSLT Transform can be fairly expensive. Ideally, this will be done only once. However, if the Expression Language is used in the transform, we may need a new Transform for each FlowFile. This value controls how many of those Transforms we cache in memory in order to avoid having to compile the Transform each time.\",\n+                                \"displayName\": \"Transform Cache Size\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"File Filter\",\n+                                \"name\": \"jslt-transform-cache-size\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Packaging Format\": {\n+                            \"jslt-transform-pretty_print\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"use mime.type attribute\",\n-                                        \"value\": \"use mime.type attribute\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"tar\",\n-                                        \"value\": \"tar\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"zip\",\n-                                        \"value\": \"zip\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"flowfile-stream-v3\",\n-                                        \"value\": \"flowfile-stream-v3\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"flowfile-stream-v2\",\n-                                        \"value\": \"flowfile-stream-v2\"\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"flowfile-tar-v1\",\n-                                        \"value\": \"flowfile-tar-v1\"\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"use mime.type attribute\",\n-                                \"description\": \"The Packaging Format used to create the file\",\n-                                \"displayName\": \"Packaging Format\",\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"Apply pretty-print formatting to the output of the JSLT transform\",\n+                                \"displayName\": \"Pretty Print\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Packaging Format\",\n+                                \"name\": \"jslt-transform-pretty_print\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Password\": {\n-                                \"description\": \"Password used for decrypting Zip archives encrypted with ZipCrypto or AES. Configuring a password disables support for alternative Zip compression algorithms.\",\n-                                \"displayName\": \"Password\",\n+                            \"jslt-transform-result-filter\": {\n+                                \"defaultValue\": \". != null and . != {} and . != []\",\n+                                \"description\": \"A filter for output JSON results using a JSLT expression. This property supports changing the default filter, which removes JSON objects with null values, empty objects and empty arrays from the output JSON. This JSLT must return true for each JSON object to be included and false for each object to be removed. Using a filter value of \\\"true\\\" to disables filtering.\",\n+                                \"displayName\": \"Transform Result Filter\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Password\",\n-                                \"required\": false,\n-                                \"sensitive\": true\n+                                \"name\": \"jslt-transform-result-filter\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n                             },\n-                            \"allow-stored-entries-wdd\": {\n+                            \"jslt-transform-transformation\": {\n+                                \"description\": \"JSLT Transformation for transform of JSON data. Any NiFi Expression Language present will be evaluated first to get the final transform to be applied. The JSLT Tutorial provides an overview of supported expressions: https://github.com/schibsted/jslt/blob/master/tutorial.md\",\n+                                \"displayName\": \"JSLT Transformation\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n+                                \"name\": \"jslt-transform-transformation\",\n+                                \"required\": true,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"SINGLE\",\n+                                    \"resourceTypes\": [\n+                                        \"FILE\",\n+                                        \"TEXT\"\n+                                    ]\n+                                },\n+                                \"sensitive\": false\n+                            },\n+                            \"jslt-transform-transformation-strategy\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"description\": \"Apply transformation to entire FlowFile content JSON\",\n+                                        \"displayName\": \"Entire FlowFile\",\n+                                        \"value\": \"ENTIRE_FLOWFILE\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"false\",\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"zip\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Packaging Format\",\n-                                        \"propertyName\": \"Packaging Format\"\n+                                        \"description\": \"Apply transformation each JSON Object in an array\",\n+                                        \"displayName\": \"Each JSON Object\",\n+                                        \"value\": \"EACH_OBJECT\"\n                                     }\n                                 ],\n-                                \"description\": \"Some zip archives contain stored entries with data descriptors which by spec should not happen.  If this property is true they will be read anyway.  If false and such an entry is discovered the zip will fail to process.\",\n-                                \"displayName\": \"Allow Stored Entries With Data Descriptor\",\n+                                \"defaultValue\": \"ENTIRE_FLOWFILE\",\n+                                \"description\": \"Whether to apply the JSLT transformation to the entire FlowFile contents or each JSON object in the root-level array\",\n+                                \"displayName\": \"Transformation Strategy\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"allow-stored-entries-wdd\",\n+                                \"name\": \"jslt-transform-transformation-strategy\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             }\n                         },\n-                        \"readsAttributes\": [\n-                            {\n-                                \"description\": \"If the <Packaging Format> property is set to use mime.type attribute, this attribute is used to determine the FlowFile's MIME Type. In this case, if the attribute is set to application/tar, the TAR Packaging Format will be used. If the attribute is set to application/zip, the ZIP Packaging Format will be used. If the attribute is set to application/flowfile-v3 or application/flowfile-v2 or application/flowfile-v1, the appropriate FlowFile Packaging Format will be used. If this attribute is missing, the FlowFile will be routed to 'failure'. Otherwise, if the attribute's value is not one of those mentioned above, the FlowFile will be routed to 'success' without being unpacked. Use the File Filter property only extract files matching a specific regular expression.\",\n-                                \"name\": \"mime.type\"\n-                            }\n-                        ],\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.processors.standard.MergeContent\"\n-                        ],\n                         \"sideEffectFree\": true,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"Unpacked FlowFiles are sent to this relationship\",\n+                                \"description\": \"The FlowFile with transformed content will be routed to this relationship\",\n                                 \"name\": \"success\"\n                             },\n                             {\n-                                \"description\": \"The original FlowFile is sent to this relationship when it cannot be unpacked for some reason\",\n+                                \"description\": \"If a FlowFile fails processing for any reason (for example, the FlowFile is not valid JSON), it will be routed to this relationship\",\n                                 \"name\": \"failure\"\n-                            },\n-                            {\n-                                \"description\": \"The original FlowFile is sent to this relationship after it has been successfully unpacked\",\n-                                \"name\": \"original\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\",\n-                            \"EVENT_DRIVEN\"\n+                            \"CRON_DRIVEN\"\n                         ],\n                         \"supportsBatching\": true,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": true,\n+                        \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n+                        \"systemResourceConsiderations\": [\n+                            {\n+                                \"description\": \"An instance of this component can cause high usage of this system resource.  Multiple instances or high concurrency settings may result a degradation of performance.\",\n+                                \"resource\": \"MEMORY\"\n+                            }\n+                        ],\n                         \"tags\": [\n-                            \"Unpack\",\n-                            \"archive\",\n-                            \"flowfile-stream\",\n-                            \"flowfile-stream-v3\",\n-                            \"tar\",\n-                            \"un-merge\",\n-                            \"zip\"\n+                            \"jslt\",\n+                            \"json\",\n+                            \"transform\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.standard.UnpackContent\",\n-                        \"typeDescription\": \"Unpacks the content of FlowFiles that have been packaged with one of several different Packaging Formats, emitting one to many FlowFiles for each input FlowFile. Supported formats are TAR, ZIP, and FlowFile Stream packages.\",\n+                        \"type\": \"org.apache.nifi.processors.jslt.JSLTTransformJSON\",\n+                        \"typeDescription\": \"Applies a JSLT transformation to the FlowFile JSON payload. A new FlowFile is created with transformed content and is routed to the 'success' relationship. If the JSLT transform fails, the original FlowFile is routed to the 'failure' relationship.\",\n                         \"version\": \"1.27.0\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"If the FlowFile is successfully unpacked, its MIME Type is no longer known, so the mime.type attribute is set to application/octet-stream.\",\n+                                \"description\": \"Always set to application/json\",\n                                 \"name\": \"mime.type\"\n-                            },\n-                            {\n-                                \"description\": \"All unpacked FlowFiles produced from the same parent FlowFile will have the same randomly generated UUID added for this attribute\",\n-                                \"name\": \"fragment.identifier\"\n-                            },\n-                            {\n-                                \"description\": \"A one-up number that indicates the ordering of the unpacked FlowFiles that were created from a single parent FlowFile\",\n-                                \"name\": \"fragment.index\"\n-                            },\n-                            {\n-                                \"description\": \"The number of unpacked FlowFiles generated from the parent FlowFile\",\n-                                \"name\": \"fragment.count\"\n-                            },\n-                            {\n-                                \"description\": \"The filename of the parent FlowFile. Extensions of .tar, .zip or .pkg are removed because the MergeContent processor automatically adds those extensions if it is used to rebuild the original FlowFile\",\n-                                \"name\": \"segment.original.filename \"\n-                            },\n-                            {\n-                                \"description\": \"The date and time that the unpacked file was last modified (tar only).\",\n-                                \"name\": \"file.lastModifiedTime\"\n-                            },\n-                            {\n-                                \"description\": \"The date and time that the file was created. This attribute holds always the same value as file.lastModifiedTime (tar only).\",\n-                                \"name\": \"file.creationTime\"\n-                            },\n-                            {\n-                                \"description\": \"The owner of the unpacked file (tar only)\",\n-                                \"name\": \"file.owner\"\n-                            },\n-                            {\n-                                \"description\": \"The group owner of the unpacked file (tar only)\",\n-                                \"name\": \"file.group\"\n-                            },\n-                            {\n-                                \"description\": \"The read/write/execute permissions of the unpacked file (tar only)\",\n-                                \"name\": \"file.permissions\"\n-                            },\n-                            {\n-                                \"description\": \"The encryption method for entries in Zip archives\",\n-                                \"name\": \"file.encryptionMethod\"\n                             }\n                         ]\n-                    },\n+                    }\n+                ],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"1.27.0\"\n+        },\n+        {\n+            \"artifact\": \"nifi-opentelemetry-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [],\n+                \"processors\": [\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-standard-nar\",\n+                        \"artifact\": \"nifi-opentelemetry-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n                         },\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"0 sec\"\n+                            \"TIMER_DRIVEN\": \"25 ms\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_REQUIRED\",\n+                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"counter-name\": {\n-                                \"description\": \"The name of the counter you want to set the value of - supports expression language like ${counterName}\",\n-                                \"displayName\": \"Counter Name\",\n+                            \"Address\": {\n+                                \"defaultValue\": \"0.0.0.0\",\n+                                \"description\": \"Internet Protocol Address on which to listen for OTLP Export Service Requests. The default value enables listening on all addresses.\",\n+                                \"displayName\": \"Address\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"counter-name\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Address\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"delta\": {\n-                                \"defaultValue\": \"1\",\n-                                \"description\": \"Adjusts the counter by the specified delta for each flow file received. May be a positive or negative integer.\",\n-                                \"displayName\": \"Delta\",\n+                            \"Batch Size\": {\n+                                \"defaultValue\": \"100\",\n+                                \"description\": \"Maximum number of OTLP request resource elements included in each FlowFile produced\",\n+                                \"displayName\": \"Batch Size\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"delta\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Batch Size\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Client Authentication\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"WANT\",\n+                                        \"value\": \"WANT\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"REQUIRED\",\n+                                        \"value\": \"REQUIRED\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"NONE\",\n+                                        \"value\": \"NONE\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"WANT\",\n+                                \"description\": \"Client authentication policy for TLS communication with HTTPS\",\n+                                \"displayName\": \"Client Authentication\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Client Authentication\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Port\": {\n+                                \"defaultValue\": \"4317\",\n+                                \"description\": \"TCP port number on which to listen for OTLP Export Service Requests over HTTP and gRPC\",\n+                                \"displayName\": \"Port\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Port\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"Queue Capacity\": {\n+                                \"defaultValue\": \"1000\",\n+                                \"description\": \"Maximum number of OTLP request resource elements that can be received and queued\",\n+                                \"displayName\": \"Queue Capacity\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Queue Capacity\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"SSL Context Service\": {\n+                                \"description\": \"SSL Context Service enables TLS communication for HTTPS\",\n+                                \"displayName\": \"SSL Context Service\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"SSL Context Service\",\n+                                \"required\": true,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            },\n+                            \"Worker Threads\": {\n+                                \"defaultValue\": \"2\",\n+                                \"description\": \"Number of threads responsible for decoding and queuing incoming OTLP Export Service Requests\",\n+                                \"displayName\": \"Worker Threads\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Worker Threads\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             }\n                         },\n-                        \"readsAttributes\": [\n-                            {\n-                                \"description\": \"The name of the counter to update/get.\",\n-                                \"name\": \"counterName\"\n-                            }\n-                        ],\n                         \"sideEffectFree\": false,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"Counter was updated/retrieved\",\n+                                \"description\": \"Export Service Requests containing OTLP Telemetry\",\n                                 \"name\": \"success\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n                         \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"counter\",\n-                            \"debug\",\n-                            \"instrumentation\"\n+                            \"OTLP\",\n+                            \"OTel\",\n+                            \"OpenTelemetry\",\n+                            \"logs\",\n+                            \"metrics\",\n+                            \"telemetry\",\n+                            \"traces\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.standard.UpdateCounter\",\n-                        \"typeDescription\": \"This processor allows users to set specific counters and key points in their flow. It is useful for debugging and basic counting functions.\",\n-                        \"version\": \"1.27.0\"\n-                    },\n+                        \"type\": \"org.apache.nifi.processors.opentelemetry.ListenOTLP\",\n+                        \"typeDescription\": \"Collect OpenTelemetry messages over HTTP or gRPC. Supports standard Export Service Request messages for logs, metrics, and traces. Implements OpenTelemetry OTLP Specification 1.0.0 with OTLP/gRPC and OTLP/HTTP. Provides protocol detection using the HTTP Content-Type header.\",\n+                        \"version\": \"1.27.0\",\n+                        \"writesAttributes\": [\n+                            {\n+                                \"description\": \"Content-Type set to application/json\",\n+                                \"name\": \"mime.type\"\n+                            },\n+                            {\n+                                \"description\": \"OpenTelemetry Resource Type: LOGS, METRICS, or TRACES\",\n+                                \"name\": \"resource.type\"\n+                            },\n+                            {\n+                                \"description\": \"Count of resource elements included in messages\",\n+                                \"name\": \"resource.count\"\n+                            }\n+                        ]\n+                    }\n+                ],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"1.27.0\"\n+        },\n+        {\n+            \"artifact\": \"nifi-standard-services-api-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [],\n+                \"processors\": [],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"1.27.0\"\n+        },\n+        {\n+            \"artifact\": \"nifi-compress-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [],\n+                \"processors\": [\n                     {\n                         \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-standard-nar\",\n+                        \"artifact\": \"nifi-compress-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n                             \"TIMER_DRIVEN\": 1\n@@ -123557,1795 +124100,1277 @@\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n                         \"group\": \"org.apache.nifi\",\n                         \"inputRequirement\": \"INPUT_REQUIRED\",\n                         \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"db-type\": {\n+                            \"Input Compression Strategy\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Generates ANSI SQL\",\n-                                        \"displayName\": \"Generic\",\n-                                        \"value\": \"Generic\"\n+                                        \"description\": \"No Compression\",\n+                                        \"displayName\": \"no compression\",\n+                                        \"value\": \"no compression\"\n                                     },\n                                     {\n-                                        \"description\": \"Generates Oracle compliant SQL\",\n-                                        \"displayName\": \"Oracle\",\n-                                        \"value\": \"Oracle\"\n+                                        \"description\": \"Use the [mime.type] attribute from the input FlowFile to determine the format\",\n+                                        \"displayName\": \"use mime.type attribute\",\n+                                        \"value\": \"use mime.type attribute\"\n                                     },\n                                     {\n-                                        \"description\": \"Generates Oracle compliant SQL for version 12 or greater\",\n-                                        \"displayName\": \"Oracle 12+\",\n-                                        \"value\": \"Oracle 12+\"\n+                                        \"description\": \"GZIP\",\n+                                        \"displayName\": \"gzip\",\n+                                        \"value\": \"gzip\"\n                                     },\n                                     {\n-                                        \"description\": \"Generates MS SQL Compatible SQL, for version 2012 or greater\",\n-                                        \"displayName\": \"MS SQL 2012+\",\n-                                        \"value\": \"MS SQL 2012+\"\n+                                        \"description\": \"Deflate\",\n+                                        \"displayName\": \"deflate\",\n+                                        \"value\": \"deflate\"\n                                     },\n                                     {\n-                                        \"description\": \"Generates MS SQL Compatible SQL for version 2008\",\n-                                        \"displayName\": \"MS SQL 2008\",\n-                                        \"value\": \"MS SQL 2008\"\n+                                        \"description\": \"BZIP2\",\n+                                        \"displayName\": \"bzip2\",\n+                                        \"value\": \"bzip2\"\n                                     },\n                                     {\n-                                        \"description\": \"Generates MySQL compatible SQL\",\n-                                        \"displayName\": \"MySQL\",\n-                                        \"value\": \"MySQL\"\n+                                        \"description\": \"XZ-LZMA2\",\n+                                        \"displayName\": \"xz-lzma2\",\n+                                        \"value\": \"xz-lzma2\"\n                                     },\n                                     {\n-                                        \"description\": \"Generates PostgreSQL compatible SQL\",\n-                                        \"displayName\": \"PostgreSQL\",\n-                                        \"value\": \"PostgreSQL\"\n+                                        \"description\": \"LZMA\",\n+                                        \"displayName\": \"lzma\",\n+                                        \"value\": \"lzma\"\n                                     },\n                                     {\n-                                        \"description\": \"Generates Phoenix compliant SQL\",\n-                                        \"displayName\": \"Phoenix\",\n-                                        \"value\": \"Phoenix\"\n+                                        \"description\": \"Snappy\",\n+                                        \"displayName\": \"snappy\",\n+                                        \"value\": \"snappy\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Snappy-Framed\",\n+                                        \"displayName\": \"snappy-framed\",\n+                                        \"value\": \"snappy-framed\"\n+                                    },\n+                                    {\n+                                        \"description\": \"LZ4\",\n+                                        \"displayName\": \"lz4-framed\",\n+                                        \"value\": \"lz4-framed\"\n+                                    },\n+                                    {\n+                                        \"description\": \"ZSTD\",\n+                                        \"displayName\": \"zstd\",\n+                                        \"value\": \"zstd\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Brotli\",\n+                                        \"displayName\": \"brotli\",\n+                                        \"value\": \"brotli\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"Generic\",\n-                                \"description\": \"The type/flavor of database, used for generating database-specific code. In many cases the Generic type should suffice, but some databases (such as Oracle) require custom SQL clauses.\",\n-                                \"displayName\": \"Database Type\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"db-type\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"record-reader\": {\n-                                \"description\": \"The service for reading incoming flow files. The reader is only used to determine the schema of the records, the actual records will not be processed.\",\n-                                \"displayName\": \"Record Reader\",\n+                                \"defaultValue\": \"no compression\",\n+                                \"description\": \"The strategy to use for decompressing input FlowFiles\",\n+                                \"displayName\": \"Input Compression Strategy\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"record-reader\",\n+                                \"name\": \"Input Compression Strategy\",\n                                 \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            },\n-                            \"updatedatabasetable-catalog-name\": {\n-                                \"description\": \"The name of the catalog that the statement should update. This may not apply for the database that you are updating. In this case, leave the field empty. Note that if the property is set and the database is case-sensitive, the catalog name must match the database's catalog name exactly.\",\n-                                \"displayName\": \"Catalog Name\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"updatedatabasetable-catalog-name\",\n-                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"updatedatabasetable-create-table\": {\n+                            \"Output Compression Level\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Create a table with the given schema if it does not already exist\",\n-                                        \"displayName\": \"Create If Not Exists\",\n-                                        \"value\": \"Create If Not Exists\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"0\",\n+                                        \"value\": \"0\"\n                                     },\n                                     {\n-                                        \"description\": \"If the target does not already exist, log an error and route the flowfile to failure\",\n-                                        \"displayName\": \"Fail If Not Exists\",\n-                                        \"value\": \"Fail If Not Exists\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"Fail If Not Exists\",\n-                                \"description\": \"Specifies how to process the target table when it does not exist (create it, fail, e.g.).\",\n-                                \"displayName\": \"Create Table Strategy\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"updatedatabasetable-create-table\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"updatedatabasetable-dbcp-service\": {\n-                                \"description\": \"The Controller Service that is used to obtain connection(s) to the database\",\n-                                \"displayName\": \"Database Connection Pooling Service\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"updatedatabasetable-dbcp-service\",\n-                                \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.dbcp.DBCPService\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            },\n-                            \"updatedatabasetable-primary-keys\": {\n-                                \"dependencies\": [\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"1\",\n+                                        \"value\": \"1\"\n+                                    },\n                                     {\n-                                        \"dependentValues\": [\n-                                            \"Create If Not Exists\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Create Table Strategy\",\n-                                        \"propertyName\": \"updatedatabasetable-create-table\"\n-                                    }\n-                                ],\n-                                \"description\": \"A comma-separated list of record field names that uniquely identifies a row in the database. This property is only used if the specified table needs to be created, in which case the Primary Key Fields will be used to specify the primary keys of the newly-created table. IMPORTANT: Primary Key Fields must match the record field names exactly unless 'Quote Column Identifiers' is false and the database allows for case-insensitive column names. In practice it is best to specify Primary Key Fields that exactly match the record field names, and those will become the column names in the created table.\",\n-                                \"displayName\": \"Primary Key Fields\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"updatedatabasetable-primary-keys\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"updatedatabasetable-query-timeout\": {\n-                                \"defaultValue\": \"0\",\n-                                \"description\": \"Sets the number of seconds the driver will wait for a query to execute. A value of 0 means no timeout. NOTE: Non-zero values may not be supported by the driver.\",\n-                                \"displayName\": \"Query Timeout\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"updatedatabasetable-query-timeout\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"updatedatabasetable-quoted-column-identifiers\": {\n-                                \"allowableValues\": [\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"2\",\n+                                        \"value\": \"2\"\n+                                    },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"displayName\": \"3\",\n+                                        \"value\": \"3\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"Enabling this option will cause all column names to be quoted, allowing you to use reserved words as column names in your tables and/or forcing the record field names to match the column names exactly.\",\n-                                \"displayName\": \"Quote Column Identifiers\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"updatedatabasetable-quoted-column-identifiers\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"updatedatabasetable-quoted-table-identifiers\": {\n-                                \"allowableValues\": [\n+                                        \"displayName\": \"4\",\n+                                        \"value\": \"4\"\n+                                    },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"displayName\": \"5\",\n+                                        \"value\": \"5\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"displayName\": \"6\",\n+                                        \"value\": \"6\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"7\",\n+                                        \"value\": \"7\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"8\",\n+                                        \"value\": \"8\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"9\",\n+                                        \"value\": \"9\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"Enabling this option will cause the table name to be quoted to support the use of special characters in the table name and/or forcing the value of the Table Name property to match the target table name exactly.\",\n-                                \"displayName\": \"Quote Table Identifiers\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"updatedatabasetable-quoted-table-identifiers\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"updatedatabasetable-record-writer\": {\n+                                \"defaultValue\": \"1\",\n                                 \"dependencies\": [\n                                     {\n                                         \"dependentValues\": [\n-                                            \"true\"\n+                                            \"zstd\",\n+                                            \"use mime.type attribute\",\n+                                            \"deflate\",\n+                                            \"brotli\",\n+                                            \"gzip\",\n+                                            \"xz-lzma2\"\n                                         ],\n-                                        \"propertyDisplayName\": \"Update Field Names\",\n-                                        \"propertyName\": \"updatedatabasetable-update-field-names\"\n+                                        \"propertyDisplayName\": \"Output Compression Strategy\",\n+                                        \"propertyName\": \"Output Compression Strategy\"\n                                     }\n                                 ],\n-                                \"description\": \"Specifies the Controller Service to use for writing results to a FlowFile. The Record Writer should use Inherit Schema to emulate the inferred schema behavior, i.e. an explicit schema need not be defined in the writer, and will be supplied by the same logic used to infer the schema from the column types. If Create Table Strategy is set 'Create If Not Exists', the Record Writer's output format must match the Record Reader's format in order for the data to be placed in the created table location. Note that this property is only used if 'Update Field Names' is set to true and the field names do not all match the column names exactly. If no update is needed for any field names (or 'Update Field Names' is false), the Record Writer is not used and instead the input FlowFile is routed to success or failure without modification.\",\n-                                \"displayName\": \"Record Writer\",\n+                                \"description\": \"The compression level for output FlowFiles for supported formats. A lower value results in faster processing but less compression; a value of 0 indicates no (that is, simple archiving) for gzip or minimal for xz-lzma2 compression. Higher levels can mean much larger memory usage such as the case with levels 7-9 for xz-lzma/2 so be careful relative to heap size.\",\n+                                \"displayName\": \"Output Compression Level\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"updatedatabasetable-record-writer\",\n-                                \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            },\n-                            \"updatedatabasetable-schema-name\": {\n-                                \"description\": \"The name of the database schema that the table belongs to. This may not apply for the database that you are updating. In this case, leave the field empty. Note that if the property is set and the database is case-sensitive, the schema name must match the database's schema name exactly.\",\n-                                \"displayName\": \"Schema Name\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"updatedatabasetable-schema-name\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"updatedatabasetable-table-name\": {\n-                                \"description\": \"The name of the database table to update. If the table does not exist, then it will either be created or an error thrown, depending on the value of the Create Table property.\",\n-                                \"displayName\": \"Table Name\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"updatedatabasetable-table-name\",\n+                                \"name\": \"Output Compression Level\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"updatedatabasetable-translate-field-names\": {\n+                            \"Output Compression Strategy\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"description\": \"No Compression\",\n+                                        \"displayName\": \"no compression\",\n+                                        \"value\": \"no compression\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"description\": \"GZIP\",\n+                                        \"displayName\": \"gzip\",\n+                                        \"value\": \"gzip\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Deflate\",\n+                                        \"displayName\": \"deflate\",\n+                                        \"value\": \"deflate\"\n+                                    },\n+                                    {\n+                                        \"description\": \"BZIP2\",\n+                                        \"displayName\": \"bzip2\",\n+                                        \"value\": \"bzip2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"XZ-LZMA2\",\n+                                        \"displayName\": \"xz-lzma2\",\n+                                        \"value\": \"xz-lzma2\"\n+                                    },\n+                                    {\n+                                        \"description\": \"LZMA\",\n+                                        \"displayName\": \"lzma\",\n+                                        \"value\": \"lzma\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Snappy\",\n+                                        \"displayName\": \"snappy\",\n+                                        \"value\": \"snappy\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Snappy-Hadoop\",\n+                                        \"displayName\": \"snappy-hadoop\",\n+                                        \"value\": \"snappy-hadoop\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Snappy-Framed\",\n+                                        \"displayName\": \"snappy-framed\",\n+                                        \"value\": \"snappy-framed\"\n+                                    },\n+                                    {\n+                                        \"description\": \"LZ4\",\n+                                        \"displayName\": \"lz4-framed\",\n+                                        \"value\": \"lz4-framed\"\n+                                    },\n+                                    {\n+                                        \"description\": \"ZSTD\",\n+                                        \"displayName\": \"zstd\",\n+                                        \"value\": \"zstd\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Brotli\",\n+                                        \"displayName\": \"brotli\",\n+                                        \"value\": \"brotli\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"true\",\n-                                \"description\": \"If true, the Processor will attempt to translate field names into the corresponding column names for the table specified, for the purposes of determining whether the field name exists as a column in the target table. NOTE: If the target table does not exist and is to be created, this property is ignored and the field names will be used as-is. If false, the field names must match the column names exactly, or the column may not be found and instead an error my be reported that the column already exists.\",\n-                                \"displayName\": \"Translate Field Names\",\n+                                \"defaultValue\": \"no compression\",\n+                                \"description\": \"The strategy to use for compressing output FlowFiles\",\n+                                \"displayName\": \"Output Compression Strategy\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"updatedatabasetable-translate-field-names\",\n+                                \"name\": \"Output Compression Strategy\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"updatedatabasetable-update-field-names\": {\n+                            \"Output Filename Strategy\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"description\": \"Retain the filename attribute value from the input FlowFile\",\n+                                        \"displayName\": \"Original\",\n+                                        \"value\": \"ORIGINAL\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"description\": \"Remove the filename extension when decompressing and add a new extension for compressed output FlowFiles\",\n+                                        \"displayName\": \"Updated\",\n+                                        \"value\": \"UPDATED\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"This property indicates whether to update the output schema such that the field names are set to the exact column names from the specified table. This should be used if the incoming record field names may not match the table's column names in terms of upper- and lower-case. For example, this property should be set to true if the output FlowFile is destined for Oracle e.g., which expects the field names to match the column names exactly. NOTE: The value of the 'Translate Field Names' property is ignored when updating field names; instead they are updated to match the column name as returned by the database.\",\n-                                \"displayName\": \"Update Field Names\",\n+                                \"defaultValue\": \"UPDATED\",\n+                                \"description\": \"Processing strategy for filename attribute on output FlowFiles\",\n+                                \"displayName\": \"Output Filename Strategy\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"updatedatabasetable-update-field-names\",\n+                                \"name\": \"Output Filename Strategy\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             }\n                         },\n-                        \"sideEffectFree\": false,\n+                        \"readsAttributes\": [\n+                            {\n+                                \"description\": \"If the Decompression Format is set to 'use mime.type attribute', this attribute is used to determine the decompression type. Otherwise, this attribute is ignored.\",\n+                                \"name\": \"mime.type\"\n+                            }\n+                        ],\n+                        \"sideEffectFree\": true,\n                         \"supportedRelationships\": [\n                             {\n-                                \"description\": \"A FlowFile containing records routed to this relationship after the record has been successfully transmitted to the database.\",\n+                                \"description\": \"FlowFiles will be transferred to the success relationship on compression modification success\",\n                                 \"name\": \"success\"\n                             },\n                             {\n-                                \"description\": \"A FlowFile containing records routed to this relationship if the record could not be transmitted to the database.\",\n+                                \"description\": \"FlowFiles will be transferred to the failure relationship on compression modification errors\",\n                                 \"name\": \"failure\"\n                             }\n                         ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n-                        \"supportsBatching\": false,\n+                        \"supportsBatching\": true,\n                         \"supportsDynamicProperties\": false,\n                         \"supportsDynamicRelationships\": false,\n                         \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n+                        \"systemResourceConsiderations\": [\n+                            {\n+                                \"description\": \"An instance of this component can cause high usage of this system resource.  Multiple instances or high concurrency settings may result a degradation of performance.\",\n+                                \"resource\": \"CPU\"\n+                            },\n+                            {\n+                                \"description\": \"An instance of this component can cause high usage of this system resource.  Multiple instances or high concurrency settings may result a degradation of performance.\",\n+                                \"resource\": \"MEMORY\"\n+                            }\n+                        ],\n                         \"tags\": [\n-                            \"alter\",\n-                            \"database\",\n-                            \"jdbc\",\n-                            \"metadata\",\n-                            \"table\",\n-                            \"update\"\n+                            \"brotli\",\n+                            \"bzip2\",\n+                            \"compress\",\n+                            \"content\",\n+                            \"deflate\",\n+                            \"gzip\",\n+                            \"lz4-framed\",\n+                            \"lzma\",\n+                            \"recompress\",\n+                            \"snappy\",\n+                            \"snappy framed\",\n+                            \"snappy-hadoop\",\n+                            \"xz-lzma2\",\n+                            \"zstd\"\n                         ],\n                         \"triggerSerially\": false,\n                         \"triggerWhenAnyDestinationAvailable\": false,\n                         \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.standard.UpdateDatabaseTable\",\n-                        \"typeDescription\": \"This processor uses a JDBC connection and incoming records to generate any database table changes needed to support the incoming records. It expects a 'flat' record layout, meaning none of the top-level record fields has nested fields that are intended to become columns themselves.\",\n+                        \"type\": \"org.apache.nifi.processors.compress.ModifyCompression\",\n+                        \"typeDescription\": \"Changes the compression algorithm used to compress the contents of a FlowFile by decompressing the contents of FlowFiles using a user-specified compression algorithm and recompressing the contents using the specified compression format properties. This processor operates in a very memory efficient way so very large objects well beyond the heap size are generally fine to process\",\n                         \"version\": \"1.27.0\",\n                         \"writesAttributes\": [\n                             {\n-                                \"description\": \"This attribute is written on the flow files routed to the 'success' and 'failure' relationships, and contains the target table name.\",\n-                                \"name\": \"output.table\"\n-                            },\n-                            {\n-                                \"description\": \"This attribute is written on the flow files routed to the 'success' and 'failure' relationships, and contains the path on the file system to the table (or partition location if the table is partitioned).\",\n-                                \"name\": \"output.path\"\n-                            },\n-                            {\n-                                \"description\": \"Sets the mime.type attribute to the MIME Type specified by the Record Writer, only if a Record Writer is specified and Update Field Names is 'true'.\",\n+                                \"description\": \"The appropriate MIME Type is set based on the value of the Compression Format property. If the Compression Format is 'no compression' this attribute is removed as the MIME Type is no longer known.\",\n                                 \"name\": \"mime.type\"\n-                            },\n-                            {\n-                                \"description\": \"Sets the number of records in the FlowFile, only if a Record Writer is specified and Update Field Names is 'true'.\",\n-                                \"name\": \"record.count\"\n                             }\n                         ]\n-                    },\n+                    }\n+                ],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"1.27.0\"\n+        },\n+        {\n+            \"artifact\": \"nifi-flow-registry-client-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [],\n+                \"processors\": [],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"1.27.0\"\n+        },\n+        {\n+            \"artifact\": \"nifi-redis-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [\n                     {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-standard-nar\",\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-redis-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n-                        \"defaultBulletinLevel\": \"WARN\",\n-                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": 1,\n-                            \"EVENT_DRIVEN\": 0,\n-                            \"TIMER_DRIVEN\": 1\n-                        },\n-                        \"defaultPenaltyDuration\": \"30 sec\",\n-                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"0 sec\"\n-                        },\n-                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n-                        \"defaultYieldDuration\": \"1 sec\",\n-                        \"dynamicProperties\": [\n-                            {\n-                                \"description\": \"Allows users to specify values to use to replace fields in the record that match the RecordPath.\",\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"name\": \"A RecordPath.\",\n-                                \"value\": \"The value to use to replace fields in the record that match the RecordPath\"\n-                            }\n-                        ],\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_REQUIRED\",\n-                        \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"record-reader\": {\n-                                \"description\": \"Specifies the Controller Service to use for reading incoming data\",\n-                                \"displayName\": \"Record Reader\",\n+                            \"Cluster Max Redirects\": {\n+                                \"defaultValue\": \"5\",\n+                                \"description\": \"The maximum number of redirects that can be performed when clustered.\",\n+                                \"displayName\": \"Cluster Max Redirects\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"record-reader\",\n+                                \"name\": \"Cluster Max Redirects\",\n                                 \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n+                                \"sensitive\": false\n                             },\n-                            \"record-writer\": {\n-                                \"description\": \"Specifies the Controller Service to use for writing out the records\",\n-                                \"displayName\": \"Record Writer\",\n+                            \"Communication Timeout\": {\n+                                \"defaultValue\": \"10 seconds\",\n+                                \"description\": \"The timeout to use when attempting to communicate with Redis.\",\n+                                \"displayName\": \"Communication Timeout\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"record-writer\",\n+                                \"name\": \"Communication Timeout\",\n                                 \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n+                                \"sensitive\": false\n                             },\n-                            \"replacement-value-strategy\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"The value entered for a Property (after Expression Language has been evaluated) is the desired value to update the Record Fields with. Expression Language may reference variables 'field.name', 'field.type', and 'field.value' to access information about the field and the value of the field being evaluated.\",\n-                                        \"displayName\": \"Literal Value\",\n-                                        \"value\": \"literal-value\"\n-                                    },\n-                                    {\n-                                        \"description\": \"The value entered for a Property (after Expression Language has been evaluated) is not the literal value to use but rather is a Record Path that should be evaluated against the Record, and the result of the RecordPath will be used to update the Record. Note that if this option is selected, and the Record Path results in multiple values for a given Record, the input FlowFile will be routed to the 'failure' Relationship.\",\n-                                        \"displayName\": \"Record Path Value\",\n-                                        \"value\": \"record-path-value\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"literal-value\",\n-                                \"description\": \"Specifies how to interpret the configured replacement values\",\n-                                \"displayName\": \"Replacement Value Strategy\",\n+                            \"Connection String\": {\n+                                \"description\": \"The connection string for Redis. In a standalone instance this value will be of the form hostname:port. In a sentinel instance this value will be the comma-separated list of sentinels, such as host1:port1,host2:port2,host3:port3. In a clustered instance this value will be the comma-separated list of cluster masters, such as host1:port,host2:port,host3:port.\",\n+                                \"displayName\": \"Connection String\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"replacement-value-strategy\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Connection String\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n-                            }\n-                        },\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.processors.standard.ConvertRecord\"\n-                        ],\n-                        \"sideEffectFree\": true,\n-                        \"supportedRelationships\": [\n-                            {\n-                                \"description\": \"FlowFiles that are successfully transformed will be routed to this relationship\",\n-                                \"name\": \"success\"\n-                            },\n-                            {\n-                                \"description\": \"If a FlowFile cannot be transformed from the configured input format to the configured output format, the unchanged FlowFile will be routed to this relationship\",\n-                                \"name\": \"failure\"\n-                            }\n-                        ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\",\n-                            \"EVENT_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": true,\n-                        \"supportsDynamicProperties\": true,\n-                        \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": true,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"avro\",\n-                            \"csv\",\n-                            \"freeform\",\n-                            \"generic\",\n-                            \"json\",\n-                            \"log\",\n-                            \"logs\",\n-                            \"record\",\n-                            \"schema\",\n-                            \"text\",\n-                            \"update\"\n-                        ],\n-                        \"triggerSerially\": false,\n-                        \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.standard.UpdateRecord\",\n-                        \"typeDescription\": \"Updates the contents of a FlowFile that contains Record-oriented data (i.e., data that can be read via a RecordReader and written by a RecordWriter). This Processor requires that at least one user-defined Property be added. The name of the Property should indicate a RecordPath that determines the field that should be updated. The value of the Property is either a replacement value (optionally making use of the Expression Language) or is itself a RecordPath that extracts a value from the Record. Whether the Property value is determined to be a RecordPath or a literal value depends on the configuration of the <Replacement Value Strategy> Property.\",\n-                        \"version\": \"1.27.0\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"This attribute provides the current row index and is only available inside the literal value expression.\",\n-                                \"name\": \"record.index\"\n                             },\n-                            {\n-                                \"description\": \"This attribute provides on failure the error message encountered by the Reader or Writer.\",\n-                                \"name\": \"record.error.message\"\n-                            }\n-                        ]\n-                    },\n-                    {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-standard-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"e0c4461\"\n-                        },\n-                        \"defaultBulletinLevel\": \"WARN\",\n-                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": 1,\n-                            \"EVENT_DRIVEN\": 0,\n-                            \"TIMER_DRIVEN\": 1\n-                        },\n-                        \"defaultPenaltyDuration\": \"30 sec\",\n-                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"0 sec\"\n-                        },\n-                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n-                        \"defaultYieldDuration\": \"1 sec\",\n-                        \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_REQUIRED\",\n-                        \"primaryNodeOnly\": false,\n-                        \"propertyDescriptors\": {\n-                            \"validate-csv-delimiter\": {\n-                                \"defaultValue\": \",\",\n-                                \"description\": \"Character used as 'delimiter' in the incoming data. Example: ,\",\n-                                \"displayName\": \"Delimiter character\",\n+                            \"Database Index\": {\n+                                \"defaultValue\": \"0\",\n+                                \"description\": \"The database index to be used by connections created from this connection pool. See the databases property in redis.conf, by default databases 0-15 will be available.\",\n+                                \"displayName\": \"Database Index\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"validate-csv-delimiter\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Database Index\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"validate-csv-eol\": {\n-                                \"defaultValue\": \"\\\\n\",\n-                                \"description\": \"Symbols used as 'end of line' in the incoming data. Example: \\\\n\",\n-                                \"displayName\": \"End of line symbols\",\n+                            \"Password\": {\n+                                \"description\": \"The password used to authenticate to the Redis server. See the 'requirepass' property in redis.conf.\",\n+                                \"displayName\": \"Password\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"validate-csv-eol\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Password\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n                             },\n-                            \"validate-csv-header\": {\n+                            \"Pool - Block When Exhausted\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"true\",\n                                         \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"false\",\n                                         \"value\": \"false\"\n                                     }\n                                 ],\n                                 \"defaultValue\": \"true\",\n-                                \"description\": \"True if the incoming flow file contains a header to ignore, false otherwise.\",\n-                                \"displayName\": \"Header\",\n+                                \"description\": \"Whether or not clients should block and wait when trying to obtain a connection from the pool when the pool has no available connections. Setting this to false means an error will occur immediately when a client requests a connection and none are available.\",\n+                                \"displayName\": \"Pool - Block When Exhausted\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"validate-csv-header\",\n+                                \"name\": \"Pool - Block When Exhausted\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"validate-csv-quote\": {\n-                                \"defaultValue\": \"\\\"\",\n-                                \"description\": \"Character used as 'quote' in the incoming data. Example: \\\"\",\n-                                \"displayName\": \"Quote character\",\n+                            \"Pool - Max Idle\": {\n+                                \"defaultValue\": \"8\",\n+                                \"description\": \"The maximum number of idle connections that can be held in the pool, or a negative value if there is no limit.\",\n+                                \"displayName\": \"Pool - Max Idle\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"validate-csv-quote\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Pool - Max Idle\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"validate-csv-schema\": {\n-                                \"description\": \"The schema to be used for validation. Is expected a comma-delimited string representing the cell processors to apply. The following cell processors are allowed in the schema definition: [ParseBigDecimal, ParseBool, ParseChar, ParseDate, ParseDouble, ParseInt, ParseLong, Optional, DMinMax, Equals, ForbidSubStr, LMinMax, NotNull, Null, RequireHashCode, RequireSubStr, Strlen, StrMinMax, StrNotNullOrEmpty, StrRegEx, Unique, UniqueHashCode, IsIncludedIn]. Note: cell processors cannot be nested except with Optional.\",\n-                                \"displayName\": \"Schema\",\n+                            \"Pool - Max Total\": {\n+                                \"defaultValue\": \"8\",\n+                                \"description\": \"The maximum number of connections that can be allocated by the pool (checked out to clients, or idle awaiting checkout). A negative value indicates that there is no limit.\",\n+                                \"displayName\": \"Pool - Max Total\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"validate-csv-schema\",\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"Pool - Max Total\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"validate-csv-strategy\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"In case an error is found, the input CSV file will be split into two FlowFiles: one routed to the 'valid' relationship containing all the correct lines and one routed to the 'invalid' relationship containing all the incorrect lines. Take care if choosing this option while using Unique cell processors in schema definition:the first occurrence will be considered valid and the next ones as invalid.\",\n-                                        \"displayName\": \"Line by line validation\",\n-                                        \"value\": \"Line by line validation\"\n-                                    },\n-                                    {\n-                                        \"description\": \"As soon as an error is found in the CSV file, the validation will stop and the whole flow file will be routed to the 'invalid' relationship. This option offers best performances.\",\n-                                        \"displayName\": \"FlowFile validation\",\n-                                        \"value\": \"FlowFile validation\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"FlowFile validation\",\n-                                \"description\": \"Strategy to apply when routing input files to output relationships.\",\n-                                \"displayName\": \"Validation strategy\",\n+                            \"Pool - Max Wait Time\": {\n+                                \"defaultValue\": \"10 seconds\",\n+                                \"description\": \"The amount of time to wait for an available connection when Block When Exhausted is set to true.\",\n+                                \"displayName\": \"Pool - Max Wait Time\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"validate-csv-strategy\",\n+                                \"name\": \"Pool - Max Wait Time\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"validate-csv-violations\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"If true, the validation.error.message attribute would include the list of all the violations for the first invalid line. Note that setting this property to true would slightly decrease the performances as all columns would be validated. If false, a line is invalid as soon as a column is found violating the specified constraint and only this violation for the first invalid line will be included in the validation.error.message attribute.\",\n-                                \"displayName\": \"Include all violations\",\n+                            \"Pool - Min Evictable Idle Time\": {\n+                                \"defaultValue\": \"60 seconds\",\n+                                \"description\": \"The minimum amount of time an object may sit idle in the pool before it is eligible for eviction.\",\n+                                \"displayName\": \"Pool - Min Evictable Idle Time\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"validate-csv-violations\",\n+                                \"name\": \"Pool - Min Evictable Idle Time\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n-                            }\n-                        },\n-                        \"sideEffectFree\": true,\n-                        \"supportedRelationships\": [\n-                            {\n-                                \"description\": \"FlowFiles that are successfully validated against the schema are routed to this relationship\",\n-                                \"name\": \"valid\"\n-                            },\n-                            {\n-                                \"description\": \"FlowFiles that are not valid according to the specified schema are routed to this relationship\",\n-                                \"name\": \"invalid\"\n-                            }\n-                        ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\",\n-                            \"EVENT_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": true,\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": true,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"csv\",\n-                            \"schema\",\n-                            \"validation\"\n-                        ],\n-                        \"triggerSerially\": false,\n-                        \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.standard.ValidateCsv\",\n-                        \"typeDescription\": \"Validates the contents of FlowFiles against a user-specified CSV schema. Take a look at the additional documentation of this processor for some schema examples.\",\n-                        \"version\": \"1.27.0\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"If line by line validation, number of valid lines extracted from the source data\",\n-                                \"name\": \"count.valid.lines\"\n-                            },\n-                            {\n-                                \"description\": \"If line by line validation, number of invalid lines extracted from the source data\",\n-                                \"name\": \"count.invalid.lines\"\n-                            },\n-                            {\n-                                \"description\": \"If line by line validation, total number of lines in the source data\",\n-                                \"name\": \"count.total.lines\"\n                             },\n-                            {\n-                                \"description\": \"For flow files routed to invalid, message of the first validation error\",\n-                                \"name\": \"validation.error.message\"\n-                            }\n-                        ]\n-                    },\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-standard-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"e0c4461\"\n-                        },\n-                        \"defaultBulletinLevel\": \"WARN\",\n-                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": 1,\n-                            \"TIMER_DRIVEN\": 1\n-                        },\n-                        \"defaultPenaltyDuration\": \"30 sec\",\n-                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"0 sec\"\n-                        },\n-                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n-                        \"defaultYieldDuration\": \"1 sec\",\n-                        \"explicitRestrictions\": [\n-                            {\n-                                \"explanation\": \"Schema configuration can reference resources over HTTP\",\n-                                \"requiredPermission\": \"reference remote resources\"\n-                            }\n-                        ],\n-                        \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_REQUIRED\",\n-                        \"primaryNodeOnly\": false,\n-                        \"propertyDescriptors\": {\n-                            \"JSON Schema\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"SCHEMA_CONTENT_PROPERTY\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n-                                        \"propertyName\": \"Schema Access Strategy\"\n-                                    }\n-                                ],\n-                                \"description\": \"A URL or file path to the JSON schema or the actual JSON schema content\",\n-                                \"displayName\": \"JSON Schema\",\n+                            \"Pool - Min Idle\": {\n+                                \"defaultValue\": \"0\",\n+                                \"description\": \"The target for the minimum number of idle connections to maintain in the pool. If the configured value of Min Idle is greater than the configured value for Max Idle, then the value of Max Idle will be used instead.\",\n+                                \"displayName\": \"Pool - Min Idle\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"JSON Schema\",\n+                                \"name\": \"Pool - Min Idle\",\n                                 \"required\": true,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"SINGLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\",\n-                                        \"URL\",\n-                                        \"TEXT\"\n-                                    ]\n-                                },\n                                 \"sensitive\": false\n                             },\n-                            \"JSON Schema Registry\": {\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"SCHEMA_NAME_PROPERTY\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n-                                        \"propertyName\": \"Schema Access Strategy\"\n-                                    }\n-                                ],\n-                                \"description\": \"Specifies the Controller Service to use for the JSON Schema Registry\",\n-                                \"displayName\": \"JSON Schema Registry\",\n+                            \"Pool - Num Tests Per Eviction Run\": {\n+                                \"defaultValue\": \"-1\",\n+                                \"description\": \"The number of connections to tests per eviction attempt. A negative value indicates to test all connections.\",\n+                                \"displayName\": \"Pool - Num Tests Per Eviction Run\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"JSON Schema Registry\",\n+                                \"name\": \"Pool - Num Tests Per Eviction Run\",\n                                 \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.schemaregistry.services.JsonSchemaRegistry\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n+                                \"sensitive\": false\n                             },\n-                            \"JSON Schema Version\": {\n+                            \"Pool - Test On Borrow\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Draft Version 4\",\n-                                        \"displayName\": \"Draft 4\",\n-                                        \"value\": \"DRAFT_4\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Draft Version 6\",\n-                                        \"displayName\": \"Draft 6\",\n-                                        \"value\": \"DRAFT_6\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Draft Version 7\",\n-                                        \"displayName\": \"Draft 7\",\n-                                        \"value\": \"DRAFT_7\"\n-                                    },\n-                                    {\n-                                        \"description\": \"Draft Version 2019-09\",\n-                                        \"displayName\": \"Draft 2019-09\",\n-                                        \"value\": \"DRAFT_2019_09\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n-                                        \"description\": \"Draft Version 2020-12\",\n-                                        \"displayName\": \"Draft 2020-12\",\n-                                        \"value\": \"DRAFT_2020_12\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"DRAFT_2020_12\",\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"SCHEMA_CONTENT_PROPERTY\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n-                                        \"propertyName\": \"Schema Access Strategy\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"description\": \"The JSON schema specification\",\n-                                \"displayName\": \"JSON Schema Version\",\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"Whether or not connections should be tested upon borrowing from the pool.\",\n+                                \"displayName\": \"Pool - Test On Borrow\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"JSON Schema Version\",\n+                                \"name\": \"Pool - Test On Borrow\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Schema Access Strategy\": {\n+                            \"Pool - Test On Create\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"The name of the Schema to use is specified by the 'Schema Name' Property. The value of this property is used to lookup the Schema in the configured JSON Schema Registry Service.\",\n-                                        \"displayName\": \"Schema Name Property\",\n-                                        \"value\": \"SCHEMA_NAME_PROPERTY\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n-                                        \"description\": \"A URL or file path to the JSON schema or the actual JSON schema is specified by the 'JSON Schema' Property. No matter how the JSON schema is specified, it must be a valid JSON schema\",\n-                                        \"displayName\": \"JSON Schema Property\",\n-                                        \"value\": \"SCHEMA_CONTENT_PROPERTY\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"SCHEMA_CONTENT_PROPERTY\",\n-                                \"description\": \"Specifies how to obtain the schema that is to be used for interpreting the data.\",\n-                                \"displayName\": \"Schema Access Strategy\",\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"Whether or not connections should be tested upon creation.\",\n+                                \"displayName\": \"Pool - Test On Create\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Schema Access Strategy\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"Schema Name\": {\n-                                \"defaultValue\": \"${schema.name}\",\n-                                \"dependencies\": [\n-                                    {\n-                                        \"dependentValues\": [\n-                                            \"SCHEMA_NAME_PROPERTY\"\n-                                        ],\n-                                        \"propertyDisplayName\": \"Schema Access Strategy\",\n-                                        \"propertyName\": \"Schema Access Strategy\"\n-                                    }\n-                                ],\n-                                \"description\": \"Specifies the name of the schema to lookup in the Schema Registry property\",\n-                                \"displayName\": \"Schema Name\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"Schema Name\",\n+                                \"name\": \"Pool - Test On Create\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n-                            }\n-                        },\n-                        \"restricted\": true,\n-                        \"sideEffectFree\": true,\n-                        \"supportedRelationships\": [\n-                            {\n-                                \"description\": \"FlowFiles that are successfully validated against the schema are routed to this relationship\",\n-                                \"name\": \"valid\"\n-                            },\n-                            {\n-                                \"description\": \"FlowFiles that are not valid according to the specified schema are routed to this relationship\",\n-                                \"name\": \"invalid\"\n                             },\n-                            {\n-                                \"description\": \"FlowFiles that cannot be read as JSON are routed to this relationship\",\n-                                \"name\": \"failure\"\n-                            }\n-                        ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": true,\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": false,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"systemResourceConsiderations\": [\n-                            {\n-                                \"description\": \"Validating JSON requires reading FlowFile content into memory\",\n-                                \"resource\": \"MEMORY\"\n-                            }\n-                        ],\n-                        \"tags\": [\n-                            \"JSON\",\n-                            \"schema\",\n-                            \"validation\"\n-                        ],\n-                        \"triggerSerially\": false,\n-                        \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.standard.ValidateJson\",\n-                        \"typeDescription\": \"Validates the contents of FlowFiles against a configurable JSON Schema. See json-schema.org for specification standards. This Processor does not support input containing multiple JSON objects, such as newline-delimited JSON. If the input FlowFile contains newline-delimited JSON, only the first line will be validated.\",\n-                        \"version\": \"1.27.0\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"If the flow file is routed to the invalid relationship , this attribute will contain the error message resulting from the validation failure.\",\n-                                \"name\": \"json.validation.errors\"\n-                            }\n-                        ]\n-                    },\n-                    {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-standard-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"e0c4461\"\n-                        },\n-                        \"defaultBulletinLevel\": \"WARN\",\n-                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": 1,\n-                            \"EVENT_DRIVEN\": 0,\n-                            \"TIMER_DRIVEN\": 1\n-                        },\n-                        \"defaultPenaltyDuration\": \"30 sec\",\n-                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"0 sec\"\n-                        },\n-                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n-                        \"defaultYieldDuration\": \"1 sec\",\n-                        \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_REQUIRED\",\n-                        \"primaryNodeOnly\": false,\n-                        \"propertyDescriptors\": {\n-                            \"allow-extra-fields\": {\n+                            \"Pool - Test On Return\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"true\",\n                                         \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"false\",\n                                         \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"true\",\n-                                \"description\": \"If the incoming data has fields that are not present in the schema, this property determines whether or not the Record is valid. If true, the Record is still valid. If false, the Record will be invalid due to the extra fields.\",\n-                                \"displayName\": \"Allow Extra Fields\",\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"Whether or not connections should be tested upon returning to the pool.\",\n+                                \"displayName\": \"Pool - Test On Return\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"allow-extra-fields\",\n+                                \"name\": \"Pool - Test On Return\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"coerce-types\": {\n+                            \"Pool - Test While Idle\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"true\",\n                                         \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"false\",\n                                         \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"If enabled, the processor will coerce every field to the type specified in the Reader's schema. If the value of a field cannot be coerced to the type, the field will be skipped (will not be read from the input data), thus will not appear in the output. If not enabled, then every field will appear in the output but their types may differ from what is specified in the schema. For details please see the Additional Details page of the processor's Help. This property controls how the data is read by the specified Record Reader.\",\n-                                \"displayName\": \"Force Types From Reader's Schema\",\n+                                \"defaultValue\": \"true\",\n+                                \"description\": \"Whether or not connections should be tested while idle.\",\n+                                \"displayName\": \"Pool - Test While Idle\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"coerce-types\",\n+                                \"name\": \"Pool - Test While Idle\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"invalid-record-writer\": {\n-                                \"description\": \"If specified, this Controller Service will be used to write out any records that are invalid. If not specified, the writer specified by the \\\"Record Writer\\\" property will be used with the schema used to read the input records. This is useful, for example, when the configured Record Writer cannot write data that does not adhere to its schema (as is the case with Avro) or when it is desirable to keep invalid records in their original format while converting valid records to another format.\",\n-                                \"displayName\": \"Record Writer for Invalid Records\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"invalid-record-writer\",\n-                                \"required\": false,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            },\n-                            \"maximum-validation-details-length\": {\n-                                \"defaultValue\": \"1024\",\n-                                \"description\": \"Specifies the maximum number of characters that validation details value can have. Any characters beyond the max will be truncated. This property is only used if 'Validation Details Attribute Name' is set\",\n-                                \"displayName\": \"Maximum Validation Details Length\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"maximum-validation-details-length\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"record-reader\": {\n-                                \"description\": \"Specifies the Controller Service to use for reading incoming data\",\n-                                \"displayName\": \"Record Reader\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"record-reader\",\n-                                \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.serialization.RecordReaderFactory\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n-                            },\n-                            \"record-writer\": {\n-                                \"description\": \"Specifies the Controller Service to use for writing out the records. Regardless of the Controller Service schema access configuration, the schema that is used to validate record is used to write the valid results.\",\n-                                \"displayName\": \"Record Writer\",\n+                            \"Pool - Time Between Eviction Runs\": {\n+                                \"defaultValue\": \"30 seconds\",\n+                                \"description\": \"The amount of time between attempting to evict idle connections from the pool.\",\n+                                \"displayName\": \"Pool - Time Between Eviction Runs\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"record-writer\",\n+                                \"name\": \"Pool - Time Between Eviction Runs\",\n                                 \"required\": true,\n-                                \"sensitive\": false,\n-                                \"typeProvidedByValue\": {\n-                                    \"artifact\": \"nifi-standard-services-api-nar\",\n-                                    \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.serialization.RecordSetWriterFactory\",\n-                                    \"version\": \"1.27.0\"\n-                                }\n+                                \"sensitive\": false\n                             },\n-                            \"schema-access-strategy\": {\n+                            \"Redis Mode\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"The schema to validate the data against is determined by asking the configured Record Reader for its schema\",\n-                                        \"displayName\": \"Use Reader's Schema\",\n-                                        \"value\": \"reader-schema\"\n+                                        \"description\": \"A single standalone Redis instance.\",\n+                                        \"displayName\": \"Standalone\",\n+                                        \"value\": \"Standalone\"\n                                     },\n                                     {\n-                                        \"description\": \"The schema to validate the data against is determined by looking at the 'Schema Name' Property and looking up the schema in the configured Schema Registry\",\n-                                        \"displayName\": \"Use Schema Name Property\",\n-                                        \"value\": \"schema-name-property\"\n+                                        \"description\": \"Redis Sentinel which provides high-availability. Described further at https://redis.io/topics/sentinel\",\n+                                        \"displayName\": \"Sentinel\",\n+                                        \"value\": \"Sentinel\"\n                                     },\n                                     {\n-                                        \"description\": \"The schema to validate the data against is determined by looking at the 'Schema Text' Property and parsing the schema as an Avro schema\",\n-                                        \"displayName\": \"Use Schema Text Property\",\n-                                        \"value\": \"schema-text-property\"\n+                                        \"description\": \"Clustered Redis which provides sharding and replication. Described further at https://redis.io/topics/cluster-spec\",\n+                                        \"displayName\": \"Cluster\",\n+                                        \"value\": \"Cluster\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"reader-schema\",\n-                                \"description\": \"Specifies how to obtain the schema that should be used to validate records\",\n-                                \"displayName\": \"Schema Access Strategy\",\n+                                \"defaultValue\": \"Standalone\",\n+                                \"description\": \"The type of Redis being communicated with - standalone, sentinel, or clustered.\",\n+                                \"displayName\": \"Redis Mode\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"schema-access-strategy\",\n+                                \"name\": \"Redis Mode\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"schema-name\": {\n-                                \"defaultValue\": \"${schema.name}\",\n-                                \"description\": \"Specifies the name of the schema to lookup in the Schema Registry property\",\n-                                \"displayName\": \"Schema Name\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"schema-name\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            },\n-                            \"schema-registry\": {\n-                                \"description\": \"Specifies the Controller Service to use for the Schema Registry. This is necessary only if the Schema Access Strategy is set to \\\"Use 'Schema Name' Property\\\".\",\n-                                \"displayName\": \"Schema Registry\",\n+                            \"SSL Context Service\": {\n+                                \"description\": \"If specified, this service will be used to create an SSL Context that will be used to secure communications; if not specified, communications will not be secure\",\n+                                \"displayName\": \"SSL Context Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"schema-registry\",\n+                                \"name\": \"SSL Context Service\",\n                                 \"required\": false,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n                                     \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.schemaregistry.services.SchemaRegistry\",\n+                                    \"type\": \"org.apache.nifi.ssl.RestrictedSSLContextService\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             },\n-                            \"schema-text\": {\n-                                \"defaultValue\": \"${avro.schema}\",\n-                                \"description\": \"The text of an Avro-formatted Schema\",\n-                                \"displayName\": \"Schema Text\",\n+                            \"Sentinel Master\": {\n+                                \"description\": \"The name of the sentinel master, require when Mode is set to Sentinel\",\n+                                \"displayName\": \"Sentinel Master\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"schema-text\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Sentinel Master\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"strict-type-checking\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"true\",\n-                                \"description\": \"If the incoming data has a Record where a field is not of the correct type, this property determines how to handle the Record. If true, the Record will be considered invalid. If false, the Record will be considered valid and the field will be coerced into the correct type (if possible, according to the type coercion supported by the Record Writer). This property controls how the data is validated against the validation schema.\",\n-                                \"displayName\": \"Strict Type Checking\",\n+                            \"Sentinel Password\": {\n+                                \"description\": \"The password used to authenticate to the Redis Sentinel server. See the 'requirepass' and 'sentinel sentinel-pass' properties in sentinel.conf.\",\n+                                \"displayName\": \"Sentinel Password\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"strict-type-checking\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Sentinel Password\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n+                            },\n+                            \"Sentinel Username\": {\n+                                \"description\": \"The username used to authenticate to the Redis sentinel server.\",\n+                                \"displayName\": \"Sentinel Username\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Sentinel Username\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"validation-details-attribute-name\": {\n-                                \"description\": \"If specified, when a validation error occurs, this attribute name will be used to leave the details. The number of characters will be limited by the property 'Maximum Validation Details Length'.\",\n-                                \"displayName\": \"Validation Details Attribute Name\",\n+                            \"Username\": {\n+                                \"description\": \"The username used to authenticate to the Redis server.\",\n+                                \"displayName\": \"Username\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"validation-details-attribute-name\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"Username\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             }\n                         },\n-                        \"sideEffectFree\": true,\n-                        \"supportedRelationships\": [\n-                            {\n-                                \"description\": \"Records that are valid according to the schema will be routed to this relationship\",\n-                                \"name\": \"valid\"\n-                            },\n-                            {\n-                                \"description\": \"Records that are not valid according to the schema will be routed to this relationship\",\n-                                \"name\": \"invalid\"\n-                            },\n+                        \"providedApiImplementations\": [\n                             {\n-                                \"description\": \"If the records cannot be read, validated, or written, for any reason, the original FlowFile will be routed to this relationship\",\n-                                \"name\": \"failure\"\n+                                \"artifact\": \"nifi-redis-service-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.redis.RedisConnectionPool\",\n+                                \"version\": \"1.27.0\"\n                             }\n                         ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\",\n-                            \"EVENT_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": true,\n                         \"supportsDynamicProperties\": false,\n-                        \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": true,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"record\",\n-                            \"schema\",\n-                            \"validate\"\n+                            \"cache\",\n+                            \"redis\"\n                         ],\n-                        \"triggerSerially\": false,\n-                        \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.standard.ValidateRecord\",\n-                        \"typeDescription\": \"Validates the Records of an incoming FlowFile against a given schema. All records that adhere to the schema are routed to the \\\"valid\\\" relationship while records that do not adhere to the schema are routed to the \\\"invalid\\\" relationship. It is therefore possible for a single incoming FlowFile to be split into two individual FlowFiles if some records are valid according to the schema and others are not. Any FlowFile that is routed to the \\\"invalid\\\" relationship will emit a ROUTE Provenance Event with the Details field populated to explain why records were invalid. In addition, to gain further explanation of why records were invalid, DEBUG-level logging can be enabled for the \\\"org.apache.nifi.processors.standard.ValidateRecord\\\" logger.\",\n-                        \"version\": \"1.27.0\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"Sets the mime.type attribute to the MIME Type specified by the Record Writer\",\n-                                \"name\": \"mime.type\"\n-                            },\n-                            {\n-                                \"description\": \"The number of records in the FlowFile routed to a relationship\",\n-                                \"name\": \"record.count\"\n-                            }\n-                        ]\n+                        \"type\": \"org.apache.nifi.redis.service.RedisConnectionPoolService\",\n+                        \"typeDescription\": \"A service that provides connections to Redis.\",\n+                        \"version\": \"1.27.0\"\n                     },\n                     {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-standard-nar\",\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-redis-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n-                        \"defaultBulletinLevel\": \"WARN\",\n-                        \"defaultConcurrentTasksBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": 1,\n-                            \"EVENT_DRIVEN\": 0,\n-                            \"TIMER_DRIVEN\": 1\n-                        },\n-                        \"defaultPenaltyDuration\": \"30 sec\",\n-                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"0 sec\"\n-                        },\n-                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n-                        \"defaultYieldDuration\": \"1 sec\",\n-                        \"explicitRestrictions\": [\n-                            {\n-                                \"explanation\": \"Schema configuration can reference resources over HTTP\",\n-                                \"requiredPermission\": \"reference remote resources\"\n-                            }\n-                        ],\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_REQUIRED\",\n-                        \"primaryNodeOnly\": false,\n                         \"propertyDescriptors\": {\n-                            \"Schema File\": {\n-                                \"description\": \"The file path or URL to the XSD Schema file that is to be used for validation. If this property is blank, only XML syntax/structure will be validated.\",\n-                                \"displayName\": \"Schema File\",\n+                            \"redis-cache-ttl\": {\n+                                \"defaultValue\": \"0 secs\",\n+                                \"description\": \"Indicates how long the data should exist in Redis. Setting '0 secs' would mean the data would exist forever\",\n+                                \"displayName\": \"TTL\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"Schema File\",\n-                                \"required\": false,\n-                                \"resourceDefinition\": {\n-                                    \"cardinality\": \"SINGLE\",\n-                                    \"resourceTypes\": [\n-                                        \"FILE\",\n-                                        \"URL\"\n-                                    ]\n-                                },\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"redis-cache-ttl\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"XML Source Attribute\": {\n-                                \"description\": \"The name of the attribute containing XML to be validated. If this property is blank, the FlowFile content will be validated.\",\n-                                \"displayName\": \"XML Source Attribute\",\n+                            \"redis-connection-pool\": {\n+                                \"description\": \"\",\n+                                \"displayName\": \"Redis Connection Pool\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n-                                \"name\": \"XML Source Attribute\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"redis-connection-pool\",\n+                                \"required\": true,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-redis-service-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.redis.RedisConnectionPool\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n                             }\n                         },\n-                        \"restricted\": true,\n-                        \"sideEffectFree\": true,\n-                        \"supportedRelationships\": [\n+                        \"providedApiImplementations\": [\n                             {\n-                                \"description\": \"FlowFiles that are successfully validated against the schema, if provided, or verified to be well-formed XML are routed to this relationship\",\n-                                \"name\": \"valid\"\n+                                \"artifact\": \"nifi-standard-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.distributed.cache.client.AtomicDistributedMapCacheClient\",\n+                                \"version\": \"1.27.0\"\n                             },\n                             {\n-                                \"description\": \"FlowFiles that are not valid according to the specified schema or contain invalid XML are routed to this relationship\",\n-                                \"name\": \"invalid\"\n+                                \"artifact\": \"nifi-standard-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.distributed.cache.client.DistributedMapCacheClient\",\n+                                \"version\": \"1.27.0\"\n                             }\n                         ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\",\n-                            \"EVENT_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": true,\n                         \"supportsDynamicProperties\": false,\n-                        \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": true,\n                         \"supportsSensitiveDynamicProperties\": false,\n-                        \"systemResourceConsiderations\": [\n+                        \"tags\": [\n+                            \"cache\",\n+                            \"distributed\",\n+                            \"map\",\n+                            \"redis\"\n+                        ],\n+                        \"type\": \"org.apache.nifi.redis.service.RedisDistributedMapCacheClientService\",\n+                        \"typeDescription\": \"An implementation of DistributedMapCacheClient that uses Redis as the backing cache. This service relies on the WATCH, MULTI, and EXEC commands in Redis, which are not fully supported when Redis is clustered. As a result, this service can only be used with a Redis Connection Pool that is configured for standalone or sentinel mode. Sentinel mode can be used to provide high-availability configurations.\",\n+                        \"version\": \"1.27.0\"\n+                    },\n+                    {\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-redis-nar\",\n+                        \"buildInfo\": {\n+                            \"revision\": \"e0c4461\"\n+                        },\n+                        \"group\": \"org.apache.nifi\",\n+                        \"propertyDescriptors\": {\n+                            \"redis-cache-ttl\": {\n+                                \"defaultValue\": \"0 secs\",\n+                                \"description\": \"Indicates how long the data should exist in Redis. Setting '0 secs' would mean the data would exist forever\",\n+                                \"displayName\": \"TTL\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"redis-cache-ttl\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"redis-connection-pool\": {\n+                                \"description\": \"\",\n+                                \"displayName\": \"Redis Connection Pool\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"redis-connection-pool\",\n+                                \"required\": true,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-redis-service-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.redis.RedisConnectionPool\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n+                            }\n+                        },\n+                        \"providedApiImplementations\": [\n                             {\n-                                \"description\": \"While this processor supports processing XML within attributes, it is strongly discouraged to hold large amounts of data in attributes. In general, attribute values should be as small as possible and hold no more than a couple hundred characters.\",\n-                                \"resource\": \"MEMORY\"\n+                                \"artifact\": \"nifi-standard-services-api-nar\",\n+                                \"group\": \"org.apache.nifi\",\n+                                \"type\": \"org.apache.nifi.distributed.cache.client.DistributedMapCacheClient\",\n+                                \"version\": \"1.27.0\"\n                             }\n                         ],\n+                        \"supportsDynamicProperties\": false,\n+                        \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"schema\",\n-                            \"validation\",\n-                            \"xml\",\n-                            \"xsd\"\n+                            \"cache\",\n+                            \"distributed\",\n+                            \"map\",\n+                            \"redis\"\n                         ],\n-                        \"triggerSerially\": false,\n-                        \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.standard.ValidateXml\",\n-                        \"typeDescription\": \"Validates XML contained in a FlowFile. By default, the XML is contained in the FlowFile content. If the 'XML Source Attribute' property is set, the XML to be validated is contained in the specified attribute. It is not recommended to use attributes to hold large XML documents; doing so could adversely affect system performance. Full schema validation is performed if the processor is configured with the XSD schema details. Otherwise, the only validation performed is to ensure the XML syntax is correct and well-formed, e.g. all opening tags are properly closed.\",\n-                        \"version\": \"1.27.0\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"If the flow file is routed to the invalid relationship the attribute will contain the error message resulting from the validation failure.\",\n-                                \"name\": \"validatexml.invalid.error\"\n-                            }\n-                        ]\n-                    },\n+                        \"type\": \"org.apache.nifi.redis.service.SimpleRedisDistributedMapCacheClientService\",\n+                        \"typeDescription\": \"An implementation of DistributedMapCacheClient that uses Redis as the backing cache. This service is intended to be used when a non-atomic DistributedMapCacheClient is required.\",\n+                        \"version\": \"1.27.0\"\n+                    }\n+                ],\n+                \"processors\": [],\n+                \"reportingTasks\": []\n+            },\n+            \"group\": \"org.apache.nifi\",\n+            \"version\": \"1.27.0\"\n+        },\n+        {\n+            \"artifact\": \"nifi-cdc-mysql-nar\",\n+            \"componentManifest\": {\n+                \"controllerServices\": [],\n+                \"processors\": [\n                     {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-standard-nar\",\n+                        \"additionalDetails\": false,\n+                        \"artifact\": \"nifi-cdc-mysql-nar\",\n                         \"buildInfo\": {\n                             \"revision\": \"e0c4461\"\n                         },\n                         \"defaultBulletinLevel\": \"WARN\",\n                         \"defaultConcurrentTasksBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": 1,\n-                            \"EVENT_DRIVEN\": 0,\n                             \"TIMER_DRIVEN\": 1\n                         },\n                         \"defaultPenaltyDuration\": \"30 sec\",\n                         \"defaultSchedulingPeriodBySchedulingStrategy\": {\n                             \"CRON_DRIVEN\": \"* * * * * ?\",\n                             \"TIMER_DRIVEN\": \"0 sec\"\n                         },\n                         \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n                         \"defaultYieldDuration\": \"1 sec\",\n+                        \"explicitRestrictions\": [\n+                            {\n+                                \"explanation\": \"Database Driver Location can reference resources over HTTP\",\n+                                \"requiredPermission\": \"reference remote resources\"\n+                            }\n+                        ],\n                         \"group\": \"org.apache.nifi\",\n-                        \"inputRequirement\": \"INPUT_REQUIRED\",\n-                        \"primaryNodeOnly\": false,\n+                        \"inputRequirement\": \"INPUT_FORBIDDEN\",\n+                        \"primaryNodeOnly\": true,\n                         \"propertyDescriptors\": {\n-                            \"attribute-copy-mode\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"When cached attributes are copied onto released FlowFiles, they replace any matching attributes.\",\n-                                        \"displayName\": \"Replace if present\",\n-                                        \"value\": \"replace\"\n-                                    },\n+                            \"SSL Context Service\": {\n+                                \"dependencies\": [\n                                     {\n-                                        \"description\": \"Attributes on released FlowFiles are not overwritten by copied cached attributes.\",\n-                                        \"displayName\": \"Keep original\",\n-                                        \"value\": \"keeporiginal\"\n+                                        \"dependentValues\": [\n+                                            \"PREFERRED\",\n+                                            \"VERIFY_IDENTITY\",\n+                                            \"REQUIRED\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"SSL Mode\",\n+                                        \"propertyName\": \"SSL Mode\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"keeporiginal\",\n-                                \"description\": \"Specifies how to handle attributes copied from FlowFiles entering the Notify processor\",\n-                                \"displayName\": \"Attribute Copy Mode\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"attribute-copy-mode\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n-                            },\n-                            \"distributed-cache-service\": {\n-                                \"description\": \"The Controller Service that is used to check for release signals from a corresponding Notify processor\",\n-                                \"displayName\": \"Distributed Cache Service\",\n+                                \"description\": \"SSL Context Service supporting encrypted socket communication\",\n+                                \"displayName\": \"SSL Context Service\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"distributed-cache-service\",\n-                                \"required\": true,\n+                                \"name\": \"SSL Context Service\",\n+                                \"required\": false,\n                                 \"sensitive\": false,\n                                 \"typeProvidedByValue\": {\n                                     \"artifact\": \"nifi-standard-services-api-nar\",\n                                     \"group\": \"org.apache.nifi\",\n-                                    \"type\": \"org.apache.nifi.distributed.cache.client.AtomicDistributedMapCacheClient\",\n+                                    \"type\": \"org.apache.nifi.ssl.SSLContextService\",\n                                     \"version\": \"1.27.0\"\n                                 }\n                             },\n-                            \"expiration-duration\": {\n-                                \"defaultValue\": \"10 min\",\n-                                \"description\": \"Indicates the duration after which waiting FlowFiles will be routed to the 'expired' relationship\",\n-                                \"displayName\": \"Expiration Duration\",\n+                            \"SSL Mode\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"Connect without TLS\",\n+                                        \"displayName\": \"DISABLED\",\n+                                        \"value\": \"DISABLED\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Connect with TLS when server support enabled, otherwise connect without TLS\",\n+                                        \"displayName\": \"PREFERRED\",\n+                                        \"value\": \"PREFERRED\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Connect with TLS or fail when server support not enabled\",\n+                                        \"displayName\": \"REQUIRED\",\n+                                        \"value\": \"REQUIRED\"\n+                                    },\n+                                    {\n+                                        \"description\": \"Connect with TLS or fail when server support not enabled. Verify server hostname matches presented X.509 certificate names or fail when not matched\",\n+                                        \"displayName\": \"VERIFY_IDENTITY\",\n+                                        \"value\": \"VERIFY_IDENTITY\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"DISABLED\",\n+                                \"description\": \"SSL Mode used when SSL Context Service configured supporting certificate verification options\",\n+                                \"displayName\": \"SSL Mode\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"expiration-duration\",\n+                                \"name\": \"SSL Mode\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"releasable-flowfile-count\": {\n-                                \"defaultValue\": \"1\",\n-                                \"description\": \"A value, or the results of an Attribute Expression Language statement, which will be evaluated against a FlowFile in order to determine the releasable FlowFile count. This specifies how many FlowFiles can be released when a target count reaches target signal count. Zero (0) has a special meaning, any number of FlowFiles can be released as long as signal count matches target.\",\n-                                \"displayName\": \"Releasable FlowFile Count\",\n+                            \"capture-change-mysql-db-name-pattern\": {\n+                                \"description\": \"A regular expression (regex) for matching databases (or schemas, depending on your RDBMS' terminology) against the list of CDC events. The regex must match the database name as it is stored in the RDBMS. If the property is not set, the database name will not be used to filter the CDC events. NOTE: DDL events, even if they affect different databases, are associated with the database used by the session to execute the DDL. This means if a connection is made to one database, but the DDL is issued against another, then the connected database will be the one matched against the specified pattern.\",\n+                                \"displayName\": \"Database/Schema Name Pattern\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"releasable-flowfile-count\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"capture-change-mysql-db-name-pattern\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"release-signal-id\": {\n-                                \"description\": \"A value that specifies the key to a specific release signal cache. To decide whether the FlowFile that is being processed by the Wait processor should be sent to the 'success' or the 'wait' relationship, the processor checks the signals in the cache specified by this key.\",\n-                                \"displayName\": \"Release Signal Identifier\",\n+                            \"capture-change-mysql-dist-map-cache-client\": {\n+                                \"description\": \"This is a legacy property that is no longer used to store table information, the processor will handle the table information (column names, types, etc.)\",\n+                                \"displayName\": \"Distributed Map Cache Client - unused\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"release-signal-id\",\n-                                \"required\": true,\n-                                \"sensitive\": false\n+                                \"expressionLanguageScope\": \"NONE\",\n+                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n+                                \"name\": \"capture-change-mysql-dist-map-cache-client\",\n+                                \"required\": false,\n+                                \"sensitive\": false,\n+                                \"typeProvidedByValue\": {\n+                                    \"artifact\": \"nifi-standard-services-api-nar\",\n+                                    \"group\": \"org.apache.nifi\",\n+                                    \"type\": \"org.apache.nifi.distributed.cache.client.DistributedMapCacheClient\",\n+                                    \"version\": \"1.27.0\"\n+                                }\n                             },\n-                            \"signal-counter-name\": {\n-                                \"description\": \"Within the cache (specified by the Release Signal Identifier) the signals may belong to different counters. If this property is specified, the processor checks the number of signals in the cache that belong to this particular counter. If not specified, the processor checks the total number of signals in the cache.\",\n-                                \"displayName\": \"Signal Counter Name\",\n+                            \"capture-change-mysql-driver-class\": {\n+                                \"defaultValue\": \"com.mysql.jdbc.Driver\",\n+                                \"description\": \"The class name of the MySQL database driver class\",\n+                                \"displayName\": \"MySQL Driver Class Name\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"signal-counter-name\",\n-                                \"required\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"capture-change-mysql-driver-class\",\n+                                \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"target-signal-count\": {\n-                                \"defaultValue\": \"1\",\n-                                \"description\": \"The number of signals that need to be in the cache (specified by the Release Signal Identifier) in order for the FlowFile processed by the Wait processor to be sent to the \\u2018success\\u2019 relationship. If the number of signals in the cache has reached this number, the FlowFile is routed to the 'success' relationship and the number of signals in the cache is decreased by this value. If Signal Counter Name is specified, this processor checks a particular counter, otherwise checks against the total number of signals in the cache.\",\n-                                \"displayName\": \"Target Signal Count\",\n+                            \"capture-change-mysql-driver-locations\": {\n+                                \"description\": \"Comma-separated list of files/folders and/or URLs containing the MySQL driver JAR and its dependencies (if any). For example '/var/tmp/mysql-connector-java-5.1.38-bin.jar'\",\n+                                \"displayName\": \"MySQL Driver Location(s)\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"FLOWFILE_ATTRIBUTES\",\n-                                \"expressionLanguageScopeDescription\": \"Variable Registry and FlowFile Attributes\",\n-                                \"name\": \"target-signal-count\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"capture-change-mysql-driver-locations\",\n+                                \"required\": false,\n+                                \"resourceDefinition\": {\n+                                    \"cardinality\": \"MULTIPLE\",\n+                                    \"resourceTypes\": [\n+                                        \"DIRECTORY\",\n+                                        \"FILE\",\n+                                        \"URL\"\n+                                    ]\n+                                },\n                                 \"sensitive\": false\n                             },\n-                            \"wait-buffer-count\": {\n-                                \"defaultValue\": \"1\",\n-                                \"description\": \"Specify the maximum number of incoming FlowFiles that can be buffered to check whether it can move forward. The more buffer can provide the better performance, as it reduces the number of interactions with cache service by grouping FlowFiles by signal identifier. Only a signal identifier can be processed at a processor execution.\",\n-                                \"displayName\": \"Wait Buffer Count\",\n+                            \"capture-change-mysql-hosts\": {\n+                                \"description\": \"A list of hostname (and optional port) entries corresponding to nodes in a MySQL cluster. The entries should be comma separated using a colon (if the port is to be specified) such as host1:port,host2:port,....  For example mysql.myhost.com:3306. The port need not be specified, when omitted the default MySQL port value of 3306 will be used. This processor will attempt to connect to the hosts in the list in order. If one node goes down and failover is enabled for the cluster, then the processor will connect to the active node (assuming its node entry is specified in this property).\",\n+                                \"displayName\": \"MySQL Nodes\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"wait-buffer-count\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"capture-change-mysql-hosts\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"wait-mode\": {\n+                            \"capture-change-mysql-include-begin-commit\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"Transfer a FlowFile to the 'wait' relationship when whose release signal has not been notified yet. This mode allows other incoming FlowFiles to be enqueued by moving FlowFiles into the wait relationship. It is recommended to set a prioritizer (for instance First In First Out) on the 'wait' relationship.\",\n-                                        \"displayName\": \"Transfer to wait relationship\",\n-                                        \"value\": \"wait\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n-                                        \"description\": \"Transfer a FlowFile to the upstream connection where it comes from when whose release signal has not been notified yet. This mode helps keeping upstream connection being full so that the upstream source processor will not be scheduled while back-pressure is active and limit incoming FlowFiles. \",\n-                                        \"displayName\": \"Keep in the upstream connection\",\n-                                        \"value\": \"keep\"\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"wait\",\n-                                \"description\": \"Specifies how to handle a FlowFile waiting for a notify signal\",\n-                                \"displayName\": \"Wait Mode\",\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"Specifies whether to emit events corresponding to a BEGIN or COMMIT event in the binary log. Set to true if the BEGIN/COMMIT events are necessary in the downstream flow, otherwise set to false, which suppresses generation of these events and can increase flow performance.\",\n+                                \"displayName\": \"Include Begin/Commit Events\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"wait-mode\",\n+                                \"name\": \"capture-change-mysql-include-begin-commit\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"wait-penalty-duration\": {\n-                                \"description\": \"If configured, after a signal identifier got processed but did not meet the release criteria, the signal identifier is penalized and FlowFiles having the signal identifier will not be processed again for the specified period of time, so that the signal identifier will not block others to be processed. This can be useful for use cases where a Wait processor is expected to process multiple signal identifiers, and each signal identifier has multiple FlowFiles, and also the order of releasing FlowFiles is important within a signal identifier. The FlowFile order can be configured with Prioritizers. IMPORTANT: There is a limitation of number of queued signals can be processed, and Wait processor may not be able to check all queued signal ids. See additional details for the best practice.\",\n-                                \"displayName\": \"Wait Penalty Duration\",\n-                                \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"wait-penalty-duration\",\n-                                \"required\": false,\n-                                \"sensitive\": false\n-                            }\n-                        },\n-                        \"seeAlso\": [\n-                            \"org.apache.nifi.distributed.cache.client.DistributedMapCacheClientService\",\n-                            \"org.apache.nifi.distributed.cache.server.map.DistributedMapCacheServer\",\n-                            \"org.apache.nifi.processors.standard.Notify\"\n-                        ],\n-                        \"sideEffectFree\": false,\n-                        \"supportedRelationships\": [\n-                            {\n-                                \"description\": \"A FlowFile that has exceeded the configured Expiration Duration will be routed to this relationship\",\n-                                \"name\": \"expired\"\n-                            },\n-                            {\n-                                \"description\": \"A FlowFile with a matching release signal in the cache will be routed to this relationship\",\n-                                \"name\": \"success\"\n-                            },\n-                            {\n-                                \"description\": \"A FlowFile with no matching release signal in the cache will be routed to this relationship\",\n-                                \"name\": \"wait\"\n-                            },\n-                            {\n-                                \"description\": \"When the cache cannot be reached, or if the Release Signal Identifier evaluates to null or empty, FlowFiles will be routed to this relationship\",\n-                                \"name\": \"failure\"\n-                            }\n-                        ],\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\",\n-                            \"EVENT_DRIVEN\"\n-                        ],\n-                        \"supportsBatching\": true,\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsDynamicRelationships\": false,\n-                        \"supportsEventDriven\": true,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"cache\",\n-                            \"distributed\",\n-                            \"hold\",\n-                            \"map\",\n-                            \"release\",\n-                            \"signal\",\n-                            \"wait\"\n-                        ],\n-                        \"triggerSerially\": false,\n-                        \"triggerWhenAnyDestinationAvailable\": false,\n-                        \"triggerWhenEmpty\": false,\n-                        \"type\": \"org.apache.nifi.processors.standard.Wait\",\n-                        \"typeDescription\": \"Routes incoming FlowFiles to the 'wait' relationship until a matching release signal is stored in the distributed cache from a corresponding Notify processor. When a matching release signal is identified, a waiting FlowFile is routed to the 'success' relationship. The release signal entry is then removed from the cache. The attributes of the FlowFile that produced the release signal are copied to the waiting FlowFile if the Attribute Cache Regex property of the corresponding Notify processor is set properly. If there are multiple release signals in the cache identified by the Release Signal Identifier, and the Notify processor is configured to copy the FlowFile attributes to the cache, then the FlowFile passing the Wait processor receives the union of the attributes of the FlowFiles that produced the release signals in the cache (identified by Release Signal Identifier). Waiting FlowFiles will be routed to 'expired' if they exceed the Expiration Duration. If you need to wait for more than one signal, specify the desired number of signals via the 'Target Signal Count' property. This is particularly useful with processors that split a source FlowFile into multiple fragments, such as SplitText. In order to wait for all fragments to be processed, connect the 'original' relationship to a Wait processor, and the 'splits' relationship to a corresponding Notify processor. Configure the Notify and Wait processors to use the '${fragment.identifier}' as the value of 'Release Signal Identifier', and specify '${fragment.count}' as the value of 'Target Signal Count' in the Wait processor.It is recommended to use a prioritizer (for instance First In First Out) when using the 'wait' relationship as a loop.\",\n-                        \"version\": \"1.27.0\",\n-                        \"writesAttributes\": [\n-                            {\n-                                \"description\": \"All FlowFiles will have an attribute 'wait.start.timestamp', which sets the initial epoch timestamp when the file first entered this processor.  This is used to determine the expiration time of the FlowFile.  This attribute is not written when the FlowFile is transferred to failure, expired or success\",\n-                                \"name\": \"wait.start.timestamp\"\n-                            },\n-                            {\n-                                \"description\": \"The name of each counter for which at least one signal has been present in the cache since the last time the cache was empty gets copied to the current FlowFile as an attribute.\",\n-                                \"name\": \"wait.counter.<counterName>\"\n-                            }\n-                        ]\n-                    }\n-                ],\n-                \"reportingTasks\": [\n-                    {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-standard-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"e0c4461\"\n-                        },\n-                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"0 sec\"\n-                        },\n-                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n-                        \"group\": \"org.apache.nifi\",\n-                        \"propertyDescriptors\": {\n-                            \"Show Deltas\": {\n+                            \"capture-change-mysql-include-ddl-events\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"true\",\n                                         \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n                                         \"displayName\": \"false\",\n                                         \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"true\",\n-                                \"description\": \"Specifies whether or not to show the difference in values between the current status and the previous status\",\n-                                \"displayName\": \"Show Deltas\",\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"Specifies whether to emit events corresponding to Data Definition Language (DDL) events such as ALTER TABLE, TRUNCATE TABLE, e.g. in the binary log. Set to true if the DDL events are desired/necessary in the downstream flow, otherwise set to false, which suppresses generation of these events and can increase flow performance.\",\n+                                \"displayName\": \"Include DDL Events\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Show Deltas\",\n+                                \"name\": \"capture-change-mysql-include-ddl-events\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"reporting-granularity\": {\n-                                \"allowableValues\": [\n-                                    {\n-                                        \"description\": \"The stats that are reported will reflect up to the last 5 minutes' worth of processing, which will coincide with the stats that are shown in the UI.\",\n-                                        \"displayName\": \"Five Minutes\",\n-                                        \"value\": \"five-minutes\"\n-                                    },\n-                                    {\n-                                        \"description\": \"The stats that are reported will be an average of the value per second, gathered over the last 5 minutes. This is essentially obtained by dividing the stats that are shown in the UI by 300 (300 seconds in 5 minutes), with the exception of when NiFi has been running for less than 5 minutes. In that case, the stats will be divided by the amount of time NiFi has been running.\",\n-                                        \"displayName\": \"One Second\",\n-                                        \"value\": \"one-second\"\n-                                    }\n-                                ],\n-                                \"defaultValue\": \"five-minutes\",\n-                                \"description\": \"When reporting information, specifies the granularity of the metrics to report\",\n-                                \"displayName\": \"Reporting Granularity\",\n+                            \"capture-change-mysql-init-binlog-filename\": {\n+                                \"description\": \"Specifies an initial binlog filename to use if this processor's State does not have a current binlog filename. If a filename is present in the processor's State or \\\"Use GTID\\\" property is set to false, this property is ignored. This can be used along with Initial Binlog Position to \\\"skip ahead\\\" if previous events are not desired. Note that NiFi Expression Language is supported, but this property is evaluated when the processor is configured, so FlowFile attributes may not be used. Expression Language is supported to enable the use of the Variable Registry and/or environment properties.\",\n+                                \"displayName\": \"Initial Binlog Filename\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"reporting-granularity\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"capture-change-mysql-init-binlog-filename\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n-                            }\n-                        },\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n-                        ],\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"log\",\n-                            \"stats\"\n-                        ],\n-                        \"type\": \"org.apache.nifi.controller.ControllerStatusReportingTask\",\n-                        \"typeDescription\": \"Logs the 5-minute stats that are shown in the NiFi Summary Page for Processors and Connections, as well optionally logging the deltas between the previous iteration and the current iteration. Processors' stats are logged using the org.apache.nifi.controller.ControllerStatusReportingTask.Processors logger, while Connections' stats are logged using the org.apache.nifi.controller.ControllerStatusReportingTask.Connections logger. These can be configured in the NiFi logging configuration to log to different files, if desired.\",\n-                        \"version\": \"1.27.0\"\n-                    },\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-standard-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"e0c4461\"\n-                        },\n-                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"0 sec\"\n-                        },\n-                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n-                        \"group\": \"org.apache.nifi\",\n-                        \"propertyDescriptors\": {\n-                            \"Directory Display Name\": {\n-                                \"defaultValue\": \"Un-Named\",\n-                                \"description\": \"The name to display for the directory in alerts.\",\n-                                \"displayName\": \"Directory Display Name\",\n+                            },\n+                            \"capture-change-mysql-init-binlog-position\": {\n+                                \"description\": \"Specifies an initial offset into a binlog (specified by Initial Binlog Filename) to use if this processor's State does not have a current binlog filename. If a filename is present in the processor's State or \\\"Use GTID\\\" property is false, this property is ignored. This can be used along with Initial Binlog Filename to \\\"skip ahead\\\" if previous events are not desired. Note that NiFi Expression Language is supported, but this property is evaluated when the processor is configured, so FlowFile attributes may not be used. Expression Language is supported to enable the use of the Variable Registry and/or environment properties.\",\n+                                \"displayName\": \"Initial Binlog Position\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Directory Display Name\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"capture-change-mysql-init-binlog-position\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Directory Location\": {\n-                                \"description\": \"The directory path of the partition to be monitored.\",\n-                                \"displayName\": \"Directory Location\",\n+                            \"capture-change-mysql-init-gtid\": {\n+                                \"description\": \"Specifies an initial GTID to use if this processor's State does not have a current GTID. If a GTID is present in the processor's State or \\\"Use GTID\\\" property is set to false, this property is ignored. This can be used to \\\"skip ahead\\\" if previous events are not desired. Note that NiFi Expression Language is supported, but this property is evaluated when the processor is configured, so FlowFile attributes may not be used. Expression Language is supported to enable the use of the Variable Registry and/or environment properties.\",\n+                                \"displayName\": \"Initial Binlog GTID\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Directory Location\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"capture-change-mysql-init-gtid\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"capture-change-mysql-init-seq-id\": {\n+                                \"description\": \"Specifies an initial sequence identifier to use if this processor's State does not have a current sequence identifier. If a sequence identifier is present in the processor's State, this property is ignored. Sequence identifiers are monotonically increasing integers that record the order of flow files generated by the processor. They can be used with the EnforceOrder processor to guarantee ordered delivery of CDC events.\",\n+                                \"displayName\": \"Initial Sequence ID\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"capture-change-mysql-init-seq-id\",\n+                                \"required\": false,\n+                                \"sensitive\": false\n+                            },\n+                            \"capture-change-mysql-max-wait-time\": {\n+                                \"defaultValue\": \"30 seconds\",\n+                                \"description\": \"The maximum amount of time allowed for a connection to be established, zero means there is effectively no limit.\",\n+                                \"displayName\": \"Max Wait Time\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"capture-change-mysql-max-wait-time\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Threshold\": {\n-                                \"defaultValue\": \"80%\",\n-                                \"description\": \"The threshold at which a bulletin will be generated to indicate that the disk usage of the partition on which the directory found is of concern\",\n-                                \"displayName\": \"Threshold\",\n+                            \"capture-change-mysql-name-pattern\": {\n+                                \"description\": \"A regular expression (regex) for matching CDC events affecting matching tables. The regex must match the table name as it is stored in the database. If the property is not set, no events will be filtered based on table name.\",\n+                                \"displayName\": \"Table Name Pattern\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Threshold\",\n-                                \"required\": true,\n+                                \"name\": \"capture-change-mysql-name-pattern\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n-                            }\n-                        },\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n-                        ],\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"disk\",\n-                            \"monitoring\",\n-                            \"repo\",\n-                            \"storage\",\n-                            \"warning\"\n-                        ],\n-                        \"type\": \"org.apache.nifi.controller.MonitorDiskUsage\",\n-                        \"typeDescription\": \"Checks the amount of storage space available for the specified directory and warns (via a log message and a System-Level Bulletin) if the partition on which it lives exceeds some configurable threshold of storage space\",\n-                        \"version\": \"1.27.0\"\n-                    },\n-                    {\n-                        \"additionalDetails\": false,\n-                        \"artifact\": \"nifi-standard-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"e0c4461\"\n-                        },\n-                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"0 sec\"\n-                        },\n-                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n-                        \"group\": \"org.apache.nifi\",\n-                        \"propertyDescriptors\": {\n-                            \"Memory Pool\": {\n+                            },\n+                            \"capture-change-mysql-password\": {\n+                                \"description\": \"Password to access the MySQL cluster\",\n+                                \"displayName\": \"Password\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"capture-change-mysql-password\",\n+                                \"required\": false,\n+                                \"sensitive\": true\n+                            },\n+                            \"capture-change-mysql-retrieve-all-records\": {\n                                 \"allowableValues\": [\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"PS Eden Space\",\n-                                        \"value\": \"PS Eden Space\"\n-                                    },\n-                                    {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"PS Survivor Space\",\n-                                        \"value\": \"PS Survivor Space\"\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n                                     },\n                                     {\n                                         \"description\": \"\",\n-                                        \"displayName\": \"PS Old Gen\",\n-                                        \"value\": \"PS Old Gen\"\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"PS Old Gen\",\n-                                \"description\": \"The name of the JVM Memory Pool to monitor. The allowed values for Memory Pools are platform and JVM dependent and may vary for different versions of Java and from published documentation. This reporting task will become invalidated if configured to use a Memory Pool that is not available on the currently running host platform and JVM\",\n-                                \"displayName\": \"Memory Pool\",\n+                                \"defaultValue\": \"true\",\n+                                \"description\": \"Specifies whether to get all available CDC events, regardless of the current binlog filename and/or position. If binlog filename and position values are present in the processor's State, this property's value is ignored. This allows for 4 different configurations: 1) If binlog data is available in processor State, that is used to determine the start location and the value of Retrieve All Records is ignored. 2) If no binlog data is in processor State, then Retrieve All Records set to true means start at the beginning of the binlog history. 3) If no binlog data is in processor State and Initial Binlog Filename/Position are not set, then Retrieve All Records set to false means start at the end of the binlog history. 4) If no binlog data is in processor State and Initial Binlog Filename/Position are set, then Retrieve All Records set to false means start at the specified initial binlog file/position. To reset the behavior, clear the processor state (refer to the State Management section of the processor's documentation).\",\n+                                \"displayName\": \"Retrieve All Records\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Memory Pool\",\n+                                \"name\": \"capture-change-mysql-retrieve-all-records\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Reporting Interval\": {\n-                                \"description\": \"Indicates how often this reporting task should report bulletins while the memory utilization exceeds the configured threshold\",\n-                                \"displayName\": \"Reporting Interval\",\n+                            \"capture-change-mysql-server-id\": {\n+                                \"description\": \"The client connecting to the MySQL replication group is actually a simplified replica (server), and the Server ID value must be unique across the whole replication group (i.e. different from any other Server ID being used by any primary or replica). Thus, each instance of CaptureChangeMySQL must have a Server ID unique across the replication group. If the Server ID is not specified, it defaults to 65535.\",\n+                                \"displayName\": \"Server ID\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Reporting Interval\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"capture-change-mysql-server-id\",\n                                 \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Usage Threshold\": {\n-                                \"defaultValue\": \"65%\",\n-                                \"description\": \"Indicates the threshold at which warnings should be generated. This can be a percentage or a Data Size\",\n-                                \"displayName\": \"Usage Threshold\",\n+                            \"capture-change-mysql-state-update-interval\": {\n+                                \"defaultValue\": \"0 seconds\",\n+                                \"description\": \"DEPRECATED. This property is no longer used and exists solely for backward compatibility purposes. Indicates how often to update the processor's state with binlog file/position values. A value of zero means that state will only be updated when the processor is stopped or shutdown. If at some point the processor state does not contain the desired binlog values, the last flow file emitted will contain the last observed values, and the processor can be returned to that state by using the Initial Binlog File, Initial Binlog Position, and Initial Sequence ID properties.\",\n+                                \"displayName\": \"State Update Interval\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Usage Threshold\",\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"capture-change-mysql-state-update-interval\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n-                            }\n-                        },\n-                        \"supportedSchedulingStrategies\": [\n-                            \"TIMER_DRIVEN\",\n-                            \"CRON_DRIVEN\"\n-                        ],\n-                        \"supportsDynamicProperties\": false,\n-                        \"supportsSensitiveDynamicProperties\": false,\n-                        \"tags\": [\n-                            \"garbage collection\",\n-                            \"gc\",\n-                            \"heap\",\n-                            \"jvm\",\n-                            \"memory\",\n-                            \"monitor\",\n-                            \"warning\"\n-                        ],\n-                        \"type\": \"org.apache.nifi.controller.MonitorMemory\",\n-                        \"typeDescription\": \"Checks the amount of Java Heap available in the JVM for a particular JVM Memory Pool. If the amount of space used exceeds some configurable threshold, will warn (via a log message and System-Level Bulletin) that the memory pool is exceeding this threshold.\",\n-                        \"version\": \"1.27.0\"\n-                    },\n-                    {\n-                        \"additionalDetails\": true,\n-                        \"artifact\": \"nifi-standard-nar\",\n-                        \"buildInfo\": {\n-                            \"revision\": \"e0c4461\"\n-                        },\n-                        \"defaultSchedulingPeriodBySchedulingStrategy\": {\n-                            \"CRON_DRIVEN\": \"* * * * * ?\",\n-                            \"TIMER_DRIVEN\": \"0 sec\"\n-                        },\n-                        \"defaultSchedulingStrategy\": \"TIMER_DRIVEN\",\n-                        \"group\": \"org.apache.nifi\",\n-                        \"propertyDescriptors\": {\n-                            \"Hostname\": {\n-                                \"defaultValue\": \"localhost\",\n-                                \"description\": \"The fully-qualified name of the host on which Ganglia is running\",\n-                                \"displayName\": \"Hostname\",\n+                            },\n+                            \"capture-change-mysql-use-gtid\": {\n+                                \"allowableValues\": [\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"true\",\n+                                        \"value\": \"true\"\n+                                    },\n+                                    {\n+                                        \"description\": \"\",\n+                                        \"displayName\": \"false\",\n+                                        \"value\": \"false\"\n+                                    }\n+                                ],\n+                                \"defaultValue\": \"false\",\n+                                \"description\": \"Specifies whether to use Global Transaction ID (GTID) for binlog tracking. If set to true, processor's state of binlog file name and position is ignored. The main benefit of using GTID is to have much reliable failover than using binlog filename/position.\",\n+                                \"displayName\": \"Use Binlog GTID\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Hostname\",\n+                                \"name\": \"capture-change-mysql-use-gtid\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             },\n-                            \"Port\": {\n-                                \"defaultValue\": \"8649\",\n-                                \"description\": \"The Port on which Ganglia is listening for incoming connections\",\n-                                \"displayName\": \"Port\",\n+                            \"capture-change-mysql-username\": {\n+                                \"description\": \"Username to access the MySQL cluster\",\n+                                \"displayName\": \"Username\",\n                                 \"dynamic\": false,\n-                                \"expressionLanguageScope\": \"NONE\",\n-                                \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Port\",\n-                                \"required\": true,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"capture-change-mysql-username\",\n+                                \"required\": false,\n                                 \"sensitive\": false\n                             },\n-                            \"Send JVM Metrics\": {\n+                            \"events-per-flowfile-strategy\": {\n                                 \"allowableValues\": [\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"true\",\n-                                        \"value\": \"true\"\n+                                        \"description\": \"This strategy causes at most the number of events specified in the 'Number of Events Per FlowFile' property to be written per FlowFile. If the processor is stopped before the specified number of events has been written (or the event queue becomes empty), the fewer number of events will still be written as a FlowFile before stopping.\",\n+                                        \"displayName\": \"Max Events Per FlowFile\",\n+                                        \"value\": \"MAX_EVENTS_PER_FLOWFILE\"\n                                     },\n                                     {\n-                                        \"description\": \"\",\n-                                        \"displayName\": \"false\",\n-                                        \"value\": \"false\"\n+                                        \"description\": \"This strategy causes each event from a transaction (from BEGIN to COMMIT) to be written to a FlowFile\",\n+                                        \"displayName\": \"One Transaction Per FlowFile\",\n+                                        \"value\": \"ONE_TRANSACTION_PER_FLOWFILE\"\n                                     }\n                                 ],\n-                                \"defaultValue\": \"false\",\n-                                \"description\": \"Specifies whether or not JVM Metrics should be gathered and sent, in addition to NiFi-specific metrics\",\n-                                \"displayName\": \"Send JVM Metrics\",\n+                                \"defaultValue\": \"MAX_EVENTS_PER_FLOWFILE\",\n+                                \"description\": \"Specifies the strategy to use when writing events to FlowFile(s), such as 'Max Events Per FlowFile'\",\n+                                \"displayName\": \"Event Processing Strategy\",\n                                 \"dynamic\": false,\n                                 \"expressionLanguageScope\": \"NONE\",\n                                 \"expressionLanguageScopeDescription\": \"Not Supported\",\n-                                \"name\": \"Send JVM Metrics\",\n+                                \"name\": \"events-per-flowfile-strategy\",\n+                                \"required\": true,\n+                                \"sensitive\": false\n+                            },\n+                            \"number-of-events-per-flowfile\": {\n+                                \"defaultValue\": \"1\",\n+                                \"dependencies\": [\n+                                    {\n+                                        \"dependentValues\": [\n+                                            \"MAX_EVENTS_PER_FLOWFILE\"\n+                                        ],\n+                                        \"propertyDisplayName\": \"Event Processing Strategy\",\n+                                        \"propertyName\": \"events-per-flowfile-strategy\"\n+                                    }\n+                                ],\n+                                \"description\": \"Specifies how many events should be written to a single FlowFile. If the processor is stopped before the specified number of events has been written,the events will still be written as a FlowFile before stopping.\",\n+                                \"displayName\": \"Events Per FlowFile\",\n+                                \"dynamic\": false,\n+                                \"expressionLanguageScope\": \"VARIABLE_REGISTRY\",\n+                                \"expressionLanguageScopeDescription\": \"Variable Registry Only\",\n+                                \"name\": \"number-of-events-per-flowfile\",\n                                 \"required\": true,\n                                 \"sensitive\": false\n                             }\n                         },\n+                        \"restricted\": true,\n+                        \"sideEffectFree\": false,\n+                        \"stateful\": {\n+                            \"description\": \"Information such as a 'pointer' to the current CDC event in the database is stored by this processor, such that it can continue from the same location if restarted.\",\n+                            \"scopes\": [\n+                                \"CLUSTER\"\n+                            ]\n+                        },\n+                        \"supportedRelationships\": [\n+                            {\n+                                \"description\": \"Successfully created FlowFile from SQL query result set.\",\n+                                \"name\": \"success\"\n+                            }\n+                        ],\n                         \"supportedSchedulingStrategies\": [\n                             \"TIMER_DRIVEN\",\n                             \"CRON_DRIVEN\"\n                         ],\n+                        \"supportsBatching\": false,\n                         \"supportsDynamicProperties\": false,\n+                        \"supportsDynamicRelationships\": false,\n+                        \"supportsEventDriven\": false,\n                         \"supportsSensitiveDynamicProperties\": false,\n                         \"tags\": [\n-                            \"ganglia\",\n-                            \"stats\"\n+                            \"cdc\",\n+                            \"event\",\n+                            \"jdbc\",\n+                            \"mysql\",\n+                            \"sql\",\n+                            \"transaction\"\n                         ],\n-                        \"type\": \"org.apache.nifi.reporting.ganglia.StandardGangliaReporter\",\n-                        \"typeDescription\": \"Reports metrics to Ganglia so that Ganglia can be used for external monitoring of the application. Metrics reported include JVM Metrics (optional); the following 5-minute NiFi statistics: FlowFiles Received, Bytes Received, FlowFiles Sent, Bytes Sent, Bytes Read, Bytes Written, Total Task Duration; and the current values for FlowFiles Queued, Bytes Queued, and number of Active Threads.\",\n-                        \"version\": \"1.27.0\"\n+                        \"triggerSerially\": true,\n+                        \"triggerWhenAnyDestinationAvailable\": false,\n+                        \"triggerWhenEmpty\": false,\n+                        \"type\": \"org.apache.nifi.cdc.mysql.processors.CaptureChangeMySQL\",\n+                        \"typeDescription\": \"Retrieves Change Data Capture (CDC) events from a MySQL database. CDC Events include INSERT, UPDATE, DELETE operations. Events are output as either a group of a specified number of events (the default is 1 so each event becomes its own flow file) or grouped as a full transaction (BEGIN to COMMIT). All events are ordered by the time at which the operation occurred. NOTE: If the processor is stopped before the specified number of events have been written to a flow file, the partial flow file will be output in order to maintain the consistency of the event stream.\",\n+                        \"version\": \"1.27.0\",\n+                        \"writesAttributes\": [\n+                            {\n+                                \"description\": \"A sequence identifier (i.e. strictly increasing integer value) specifying the order of the CDC event flow file relative to the other event flow file(s).\",\n+                                \"name\": \"cdc.sequence.id\"\n+                            },\n+                            {\n+                                \"description\": \"A string indicating the type of CDC event that occurred, including (but not limited to) 'begin', 'insert', 'update', 'delete', 'ddl' and 'commit'.\",\n+                                \"name\": \"cdc.event.type\"\n+                            },\n+                            {\n+                                \"description\": \"The processor outputs flow file content in JSON format, and sets the mime.type attribute to application/json\",\n+                                \"name\": \"mime.type\"\n+                            }\n+                        ]\n                     }\n-                ]\n+                ],\n+                \"reportingTasks\": []\n             },\n             \"group\": \"org.apache.nifi\",\n             \"version\": \"1.27.0\"\n         }\n     ],\n     \"identifier\": \"apache-nifi\",\n     \"schedulingDefaults\": {\n"}]}]}
